From b8441947d28058eaa4d7634c8e3633253bc4e908 Mon Sep 17 00:00:00 2001 From: NLilley Date: Wed, 23 Jul 2025 13:24:53 +0300 Subject: [PATCH 01/16] Update .gitignore --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 2abc002..0ea9ef0 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ obj *.mdf *.ldf +/src/packages/* + +.idea .vs *.ssms_suo IBatisNet.Common.Logging.Log4Net.xml From 289b4c21d61db23e68f5a0af88d9d4a06cdf566a Mon Sep 17 00:00:00 2001 From: NLilley Date: Wed, 23 Jul 2025 13:26:30 +0300 Subject: [PATCH 02/16] Deleted everything non-essential. #12424 --- .../Apache.Avalon.DynamicProxy.dll | Bin 28672 -> 0 bytes .../External-bin/Castle.DynamicProxy.dll | Bin 65536 -> 0 bytes .../External-bin/IBatisNet.Common.dll | Bin 65536 -> 0 bytes .../IBatisNet.DataAccess.Extensions.dll | Bin 9728 -> 0 bytes .../External-bin/IBatisNet.DataAccess.dll | Bin 40960 -> 0 bytes .../External-bin/IBatisNet.DataMapper.dll | Bin 126976 -> 0 bytes Examples/npetshop/External-bin/log4net.dll | Bin 196608 -> 0 bytes .../NPetshop.Domain/Accounts/Account.cs | 63 - .../NPetshop.Domain/Accounts/Address.cs | 82 - .../NPetshop.Domain/Accounts/Profile.cs | 55 - .../npetshop/NPetshop.Domain/AssemblyInfo.cs | 58 - .../NPetshop.Domain/Billing/CreditCard.cs | 56 - .../NPetshop.Domain/Billing/LineItem.cs | 91 - .../npetshop/NPetshop.Domain/Billing/Order.cs | 115 - .../NPetshop.Domain/Catalog/Category.cs | 48 - .../npetshop/NPetshop.Domain/Catalog/Item.cs | 84 - .../NPetshop.Domain/Catalog/Product.cs | 46 - .../NPetshop.Domain/Catalog/Supplier.cs | 40 - .../NPetshop.Domain/NPetshop.Domain.csproj | 179 - .../NPetshop.Domain.csproj.user | 48 - Examples/npetshop/NPetshop.Domain/Sequence.cs | 42 - .../NPetshop.Domain/Shopping/ShoppingCart.cs | 127 - .../Shopping/ShoppingCartLine.cs | 90 - Examples/npetshop/NPetshop.Domain/ToDo.txt | 2 - .../NPetshop.Persistence/AssemblyInfo.cs | 58 - .../NPetshop.Persistence/Ddl/MSSQL/DBUser.sql | 16 - .../Ddl/MSSQL/DataLoad.sql | 86 - .../NPetshop.Persistence/Ddl/MSSQL/Schema.sql | 345 - .../NPetshop.Persistence/Ddl/MySql/DBUser.sql | 2 - .../Ddl/MySql/DataLoad.sql | 121 - .../NPetshop.Persistence/Ddl/MySql/Schema.sql | 156 - .../Interfaces/Accounts/IAccountDao.cs | 24 - .../Interfaces/Billing/IOrderDao.cs | 22 - .../Interfaces/Catalog/ICategoryDao.cs | 19 - .../Interfaces/Catalog/IItemDao.cs | 24 - .../Interfaces/Catalog/IProductDao.cs | 20 - .../Interfaces/ISequenceDao.cs | 14 - .../MapperDao/Accounts/AccountSqlMapDao.cs | 56 - .../MapperDao/BaseSqlMapDao.cs | 163 - .../MapperDao/Billing/MSSQL/OrderSqlMapDao.cs | 44 - .../Billing/MSSQL/SequenceSqlMapDao.cs | 35 - .../MapperDao/Billing/OrderSqlMapDao.cs | 44 - .../MapperDao/Catalog/CategorySqlMapDao.cs | 31 - .../MapperDao/Catalog/ItemSqlMapDao.cs | 58 - .../MapperDao/Catalog/ProductSqlMapDao.cs | 71 - .../MapperDao/SequenceSqlMapDao.cs | 41 - .../NPetshop.Persistence.csproj | 224 - .../NPetshop.Persistence.csproj.user | 48 - .../bin/Debug/log4net.dll | Bin 196608 -> 0 bytes .../npetshop/NPetshop.Persistence/dao.xml | 36 - .../NPetshop.Presentation/AssemblyInfo.cs | 58 - .../Controls/ExtendedRepeater.cs | 41 - .../Core/AbstractWebAction.cs | 64 - .../NPetshop.Presentation/Core/IWebAction.cs | 11 - .../Core/WebConstants.cs | 22 - .../Core/WebLocalSingleton.cs | 115 - .../Exceptions/LoginAlreadyExistsException.cs | 12 - .../NPetshop.Presentation/IController.cs | 22 - .../NPetshop.Presentation.csproj | 199 - .../NPetshop.Presentation.csproj.user | 48 - .../npetshop/NPetshop.Presentation/ReadMe.txt | 4 - .../UserActions/AccountAction.cs | 105 - .../UserActions/BillinAction.cs | 55 - .../UserActions/CatalogAction.cs | 75 - .../UserActions/DataViews.cs | 18 - .../UserActions/ShoppinAction.cs | 83 - .../UserActions/ShowStartPageAction.cs | 18 - .../UserActions/WebViews.cs | 40 - .../NPetshop.Presentation/UserControl.cs | 65 - .../bin/Debug/log4net.dll | Bin 196608 -> 0 bytes .../NPetshop.Service/AccountService.cs | 95 - .../npetshop/NPetshop.Service/AssemblyInfo.cs | 58 - .../NPetshop.Service/BillingService.cs | 103 - .../NPetshop.Service/CatalogService.cs | 117 - .../NPetshop.Service/NPetshop.Service.csproj | 140 - .../NPetshop.Service.csproj.user | 48 - .../NPetshop.Service/ServiceConfig.cs | 66 - .../NPetshop.Service/ShoppingService.cs | 30 - .../NPetshop.Service/bin/Debug/log4net.dll | Bin 196608 -> 0 bytes .../npetshop/NPetshop.Web/@css/styles.css | 211 - .../NPetshop.Web/@images/Pets/bird1.jpg | Bin 3391 -> 0 bytes .../NPetshop.Web/@images/Pets/bird2.jpg | Bin 3364 -> 0 bytes .../NPetshop.Web/@images/Pets/cat1.jpg | Bin 3721 -> 0 bytes .../NPetshop.Web/@images/Pets/cat2.jpg | Bin 3859 -> 0 bytes .../NPetshop.Web/@images/Pets/dog1.jpg | Bin 3319 -> 0 bytes .../NPetshop.Web/@images/Pets/dog2.jpg | Bin 3525 -> 0 bytes .../NPetshop.Web/@images/Pets/dog3.jpg | Bin 3583 -> 0 bytes .../NPetshop.Web/@images/Pets/dog4.jpg | Bin 3082 -> 0 bytes .../NPetshop.Web/@images/Pets/dog5.jpg | Bin 3729 -> 0 bytes .../NPetshop.Web/@images/Pets/dog6.jpg | Bin 3371 -> 0 bytes .../NPetshop.Web/@images/Pets/fish1.jpg | Bin 4048 -> 0 bytes .../NPetshop.Web/@images/Pets/fish2.jpg | Bin 3035 -> 0 bytes .../NPetshop.Web/@images/Pets/fish3.jpg | Bin 3910 -> 0 bytes .../NPetshop.Web/@images/Pets/fish4.jpg | Bin 2917 -> 0 bytes .../NPetshop.Web/@images/Pets/reptile1.jpg | Bin 4235 -> 0 bytes .../NPetshop.Web/@images/Pets/reptile2.jpg | Bin 4284 -> 0 bytes .../npetshop/NPetshop.Web/@images/cart.gif | Bin 96 -> 0 bytes .../NPetshop.Web/@images/iconCritical.gif | Bin 2680 -> 0 bytes .../npetshop/NPetshop.Web/@images/space.gif | Bin 85 -> 0 bytes .../npetshop/NPetshop.Web/@images/splash.jpg | Bin 46200 -> 0 bytes .../npetshop/NPetshop.Web/@images/title.gif | Bin 3035 -> 0 bytes .../NPetshop.Web/@images/top_stripe1.gif | Bin 840 -> 0 bytes .../NPetshop.Web/@images/top_stripe2.gif | Bin 814 -> 0 bytes .../NPetshop.Web/@images/top_stripe3.gif | Bin 819 -> 0 bytes .../npetshop/NPetshop.Web/AssemblyInfo.cs | 62 - .../npetshop/NPetshop.Web/DataBase.config | 9 - Examples/npetshop/NPetshop.Web/Default.aspx | 27 - .../npetshop/NPetshop.Web/Default.aspx.cs | 168 - .../npetshop/NPetshop.Web/Default.aspx.resx | 109 - Examples/npetshop/NPetshop.Web/Global.asax | 1 - Examples/npetshop/NPetshop.Web/Global.asax.cs | 77 - .../npetshop/NPetshop.Web/Global.asax.resx | 42 - .../NPetshop.Web/HttpModules/ErrorModule.cs | 52 - .../npetshop/NPetshop.Web/Maps/Account.xml | 120 - .../npetshop/NPetshop.Web/Maps/Category.xml | 27 - Examples/npetshop/NPetshop.Web/Maps/Item.xml | 62 - .../npetshop/NPetshop.Web/Maps/LineItem.xml | 18 - Examples/npetshop/NPetshop.Web/Maps/Order.xml | 30 - .../npetshop/NPetshop.Web/Maps/Product.xml | 60 - .../npetshop/NPetshop.Web/Maps/Sequence.xml | 23 - .../npetshop/NPetshop.Web/NPetshop.Web.csproj | 756 - .../NPetshop.Web/NPetshop.Web.csproj.webinfo | 4 - Examples/npetshop/NPetshop.Web/NPetshop.mdb | Bin 499712 -> 0 bytes Examples/npetshop/NPetshop.Web/SqlMap.config | 28 - .../UserControls/Accounts/AccountEdition.ascx | 19 - .../Accounts/AccountEdition.ascx.cs | 76 - .../Accounts/AccountEdition.ascx.resx | 109 - .../UserControls/Accounts/AccountUI.ascx | 84 - .../UserControls/Accounts/AccountUI.ascx.cs | 101 - .../UserControls/Accounts/AccountUI.ascx.resx | 109 - .../UserControls/Accounts/AddressStatic.ascx | 57 - .../Accounts/AddressStatic.ascx.cs | 69 - .../Accounts/AddressStatic.ascx.resx | 109 - .../UserControls/Accounts/AddressUI.ascx | 81 - .../UserControls/Accounts/AddressUI.ascx.cs | 100 - .../UserControls/Accounts/AddressUI.ascx.resx | 109 - .../UserControls/Accounts/NewAccount.ascx | 16 - .../UserControls/Accounts/NewAccount.ascx.cs | 76 - .../Accounts/NewAccount.ascx.resx | 109 - .../UserControls/Accounts/SignIn.ascx | 39 - .../UserControls/Accounts/SignIn.ascx.cs | 86 - .../UserControls/Accounts/SignIn.ascx.resx | 109 - .../UserControls/Accounts/SignOut.ascx | 13 - .../UserControls/Accounts/SignOut.ascx.cs | 55 - .../UserControls/Accounts/SignOut.ascx.resx | 109 - .../UserControls/AdviceBanner.ascx | 1 - .../UserControls/AdviceBanner.ascx.cs | 41 - .../UserControls/AdviceBanner.ascx.resx | 42 - .../NPetshop.Web/UserControls/Banner.ascx | 24 - .../NPetshop.Web/UserControls/Banner.ascx.cs | 92 - .../UserControls/Banner.ascx.resx | 109 - .../UserControls/Billing/Bill.ascx | 11 - .../UserControls/Billing/Bill.ascx.cs | 51 - .../UserControls/Billing/Bill.ascx.resx | 109 - .../UserControls/Billing/BillUI.ascx | 78 - .../UserControls/Billing/BillUI.ascx.cs | 71 - .../UserControls/Billing/BillUI.ascx.resx | 109 - .../UserControls/Billing/Confirmation.ascx | 19 - .../UserControls/Billing/Confirmation.ascx.cs | 62 - .../Billing/Confirmation.ascx.resx | 109 - .../UserControls/Billing/Payment.ascx | 91 - .../UserControls/Billing/Payment.ascx.cs | 99 - .../UserControls/Billing/Payment.ascx.resx | 109 - .../UserControls/Billing/Shipping.ascx | 20 - .../UserControls/Billing/Shipping.ascx.cs | 60 - .../UserControls/Billing/Shipping.ascx.resx | 109 - .../UserControls/Catalog/Category.ascx | 48 - .../UserControls/Catalog/Category.ascx.cs | 114 - .../UserControls/Catalog/Category.ascx.resx | 109 - .../UserControls/Catalog/Item.ascx | 38 - .../UserControls/Catalog/Item.ascx.cs | 76 - .../UserControls/Catalog/Item.ascx.resx | 109 - .../UserControls/Catalog/ItemList.ascx | 50 - .../UserControls/Catalog/ItemList.ascx.cs | 97 - .../UserControls/Catalog/ItemList.ascx.resx | 109 - .../UserControls/Catalog/MyList.ascx | 1 - .../UserControls/Catalog/MyList.ascx.cs | 41 - .../UserControls/Catalog/MyList.ascx.resx | 42 - .../UserControls/Catalog/Product.ascx | 50 - .../UserControls/Catalog/Product.ascx.cs | 96 - .../UserControls/Catalog/Product.ascx.resx | 109 - .../UserControls/Catalog/ProductList.ascx | 48 - .../UserControls/Catalog/ProductList.ascx.cs | 112 - .../Catalog/ProductList.ascx.resx | 109 - .../UserControls/Catalog/Search.ascx | 4 - .../UserControls/Catalog/Search.ascx.cs | 60 - .../UserControls/Catalog/Search.ascx.resx | 109 - .../UserControls/Catalog/SearchProduct.ascx | 56 - .../Catalog/SearchProduct.ascx.cs | 102 - .../Catalog/SearchProduct.ascx.resx | 109 - .../NPetshop.Web/UserControls/Error.ascx | 51 - .../NPetshop.Web/UserControls/Error.ascx.cs | 55 - .../NPetshop.Web/UserControls/Error.ascx.resx | 109 - .../NPetshop.Web/UserControls/Footer.ascx | 2 - .../NPetshop.Web/UserControls/Footer.ascx.cs | 41 - .../UserControls/Footer.ascx.resx | 42 - .../NPetshop.Web/UserControls/Header.ascx | 8 - .../NPetshop.Web/UserControls/Header.ascx.cs | 45 - .../UserControls/Header.ascx.resx | 109 - .../UserControls/Shopping/Cart.ascx | 67 - .../UserControls/Shopping/Cart.ascx.cs | 151 - .../UserControls/Shopping/Cart.ascx.resx | 109 - .../UserControls/Shopping/Checkout.ascx | 53 - .../UserControls/Shopping/Checkout.ascx.cs | 114 - .../UserControls/Shopping/Checkout.ascx.resx | 109 - .../NPetshop.Web/UserControls/SideBar.ascx | 40 - .../NPetshop.Web/UserControls/SideBar.ascx.cs | 57 - .../UserControls/SideBar.ascx.resx | 109 - .../NPetshop.Web/UserControls/StartUp.ascx | 26 - .../NPetshop.Web/UserControls/StartUp.ascx.cs | 66 - .../UserControls/StartUp.ascx.resx | 109 - .../NPetshop.Web/UserControls/TopBar.ascx | 21 - .../NPetshop.Web/UserControls/TopBar.ascx.cs | 57 - .../UserControls/TopBar.ascx.resx | 109 - .../NPetshop.Web/UserControls/UserControl.cs | 46 - Examples/npetshop/NPetshop.Web/Web.config | 108 - Examples/npetshop/NPetshop.Web/dao.config | 52 - .../npetshop/NPetshop.Web/providers.config | 159 - Examples/npetshop/NPetshop.sln | 69 - .../External-bin/Castle.DynamicProxy.dll | Bin 69632 -> 0 bytes .../Castle.Facilities.TypedFactory.dll | Bin 7680 -> 0 bytes .../npetshop2/External-bin/Castle.MVC.Xml | 694 - .../npetshop2/External-bin/Castle.MVC.dll | Bin 36864 -> 0 bytes .../External-bin/Castle.MicroKernel.dll | Bin 65536 -> 0 bytes .../npetshop2/External-bin/Castle.Model.dll | Bin 32768 -> 0 bytes .../npetshop2/External-bin/Castle.Windsor.dll | Bin 102400 -> 0 bytes .../npetshop2/External-bin/Castle.Windsor.xml | 1154 - .../npetshop2/External-bin/Castle.license.txt | 13 - .../External-bin/IBatisNet.Common.dll | Bin 61440 -> 0 bytes .../External-bin/IBatisNet.Common.xml | 2199 -- .../External-bin/IBatisNet.DataAccess.dll | Bin 49152 -> 0 bytes .../External-bin/IBatisNet.DataAccess.xml | 1369 - .../External-bin/IBatisNet.DataMapper.dll | Bin 184320 -> 0 bytes .../External-bin/IBatisNet.DataMapper.xml | 5425 --- .../External-bin/NUnitAsp.license.txt | 12 - Examples/npetshop2/External-bin/log4net.dll | Bin 196608 -> 0 bytes .../External-bin/log4net.license.txt | 48 - Examples/npetshop2/External-bin/log4net.xml | 14792 -------- .../NPetshop.Domain/Accounts/Account.cs | 63 - .../NPetshop.Domain/Accounts/Address.cs | 82 - .../NPetshop.Domain/Accounts/Profile.cs | 55 - .../npetshop2/NPetshop.Domain/AssemblyInfo.cs | 58 - .../NPetshop.Domain/Billing/CreditCard.cs | 56 - .../NPetshop.Domain/Billing/LineItem.cs | 91 - .../NPetshop.Domain/Billing/Order.cs | 115 - .../NPetshop.Domain/Catalog/Category.cs | 48 - .../npetshop2/NPetshop.Domain/Catalog/Item.cs | 84 - .../NPetshop.Domain/Catalog/Product.cs | 46 - .../NPetshop.Domain/Catalog/Supplier.cs | 40 - .../NPetshop.Domain/NPetshop.Domain.csproj | 160 - .../NPetshop.Domain.csproj.user | 48 - .../npetshop2/NPetshop.Domain/Sequence.cs | 42 - .../NPetshop.Domain/Shopping/ShoppingCart.cs | 127 - .../Shopping/ShoppingCartLine.cs | 90 - .../NPetshop.Persistence/AssemblyInfo.cs | 58 - .../NPetshop.Persistence/Ddl/MSSQL/DBUser.sql | 16 - .../Ddl/MSSQL/DataLoad.sql | 86 - .../NPetshop.Persistence/Ddl/MSSQL/Schema.sql | 345 - .../NPetshop.Persistence/Ddl/MySql/DBUser.sql | 2 - .../Ddl/MySql/DataLoad.sql | 121 - .../NPetshop.Persistence/Ddl/MySql/Schema.sql | 156 - .../Interfaces/Accounts/IAccountDao.cs | 24 - .../Interfaces/Billing/IOrderDao.cs | 22 - .../Interfaces/Catalog/ICategoryDao.cs | 19 - .../Interfaces/Catalog/IItemDao.cs | 24 - .../Interfaces/Catalog/IProductDao.cs | 20 - .../Interfaces/ISequenceDao.cs | 14 - .../MapperDao/Accounts/AccountSqlMapDao.cs | 56 - .../MapperDao/BaseSqlMapDao.cs | 162 - .../MapperDao/Billing/MSSQL/OrderSqlMapDao.cs | 44 - .../Billing/MSSQL/SequenceSqlMapDao.cs | 35 - .../MapperDao/Billing/OrderSqlMapDao.cs | 44 - .../MapperDao/Catalog/CategorySqlMapDao.cs | 31 - .../MapperDao/Catalog/ItemSqlMapDao.cs | 58 - .../MapperDao/Catalog/ProductSqlMapDao.cs | 71 - .../MapperDao/SequenceSqlMapDao.cs | 41 - .../NPetshop.Persistence/Maps/Account.xml | 120 - .../NPetshop.Persistence/Maps/Category.xml | 36 - .../NPetshop.Persistence/Maps/Item.xml | 62 - .../NPetshop.Persistence/Maps/LineItem.xml | 18 - .../NPetshop.Persistence/Maps/Order.xml | 30 - .../NPetshop.Persistence/Maps/Product.xml | 60 - .../NPetshop.Persistence/Maps/Sequence.xml | 23 - .../NPetshop.Persistence.csproj | 254 - .../NPetshop.Persistence.csproj.user | 48 - .../NPetshop.Persistence/SqlMap.config | 28 - .../npetshop2/NPetshop.Persistence/dao.config | 56 - .../NPetshop.Persistence/providers.config | 233 - .../AccountController.cs | 106 - .../NPetshop.Presentation/AssemblyInfo.cs | 58 - .../BillingController.cs | 56 - .../CatalogController.cs | 53 - .../NPetshop.Presentation.csproj | 180 - .../NPetshop.Presentation.csproj.user | 48 - .../NPetshopContainer.cs | 88 - .../NPetshopController.cs | 21 - .../NPetshop.Presentation/NPetshopState.cs | 53 - .../ShoppingController.cs | 76 - .../NPetshop.Service/AssemblyInfo.cs | 58 - .../NPetshop.Service/Impl/AccountService.cs | 88 - .../NPetshop.Service/Impl/BillingService.cs | 91 - .../NPetshop.Service/Impl/CatalogService.cs | 113 - .../NPetshop.Service/Impl/ShoppingService.cs | 26 - .../Interfaces/IAccountService.cs | 14 - .../Interfaces/IBillingService.cs | 12 - .../Interfaces/ICatalogService.cs | 18 - .../Interfaces/IShoppingService.cs | 9 - .../NPetshop.Service/NPetshop.Service.csproj | 155 - .../NPetshop.Service.csproj.user | 48 - .../npetshop2/NPetshop.Test/AssemblyInfo.cs | 58 - .../NPetshop.Test/NPetshop.Test.csproj | 184 - .../NPetshop.Test/NPetshop.Test.csproj.user | 48 - .../NPetshop.Test/Persistence/BaseTest.cs | 30 - .../NPetshop.Test/Persistence/DaoTest.cs | 37 - .../Presentation/ControllerTest.cs | 78 - .../NPetshop.Test/Web/WebFormTest.cs | 35 - .../bin/Debug/NPetshop.Test.dll.config | 145 - .../NPetshop.Test/bin/Debug/properties.config | 10 - Examples/npetshop2/NPetshop.Test/readme.txt | 2 - .../npetshop2/NPetshop.Web/@css/styles.css | 211 - .../NPetshop.Web/@images/Pets/bird1.jpg | Bin 3391 -> 0 bytes .../NPetshop.Web/@images/Pets/bird2.jpg | Bin 3364 -> 0 bytes .../NPetshop.Web/@images/Pets/cat1.jpg | Bin 3721 -> 0 bytes .../NPetshop.Web/@images/Pets/cat2.jpg | Bin 3859 -> 0 bytes .../NPetshop.Web/@images/Pets/dog1.jpg | Bin 3319 -> 0 bytes .../NPetshop.Web/@images/Pets/dog2.jpg | Bin 3525 -> 0 bytes .../NPetshop.Web/@images/Pets/dog3.jpg | Bin 3583 -> 0 bytes .../NPetshop.Web/@images/Pets/dog4.jpg | Bin 3082 -> 0 bytes .../NPetshop.Web/@images/Pets/dog5.jpg | Bin 3729 -> 0 bytes .../NPetshop.Web/@images/Pets/dog6.jpg | Bin 3371 -> 0 bytes .../NPetshop.Web/@images/Pets/fish1.jpg | Bin 4048 -> 0 bytes .../NPetshop.Web/@images/Pets/fish2.jpg | Bin 3035 -> 0 bytes .../NPetshop.Web/@images/Pets/fish3.jpg | Bin 3910 -> 0 bytes .../NPetshop.Web/@images/Pets/fish4.jpg | Bin 2917 -> 0 bytes .../NPetshop.Web/@images/Pets/reptile1.jpg | Bin 4235 -> 0 bytes .../NPetshop.Web/@images/Pets/reptile2.jpg | Bin 4284 -> 0 bytes .../npetshop2/NPetshop.Web/@images/cart.gif | Bin 96 -> 0 bytes .../NPetshop.Web/@images/iconCritical.gif | Bin 2680 -> 0 bytes .../npetshop2/NPetshop.Web/@images/space.gif | Bin 85 -> 0 bytes .../npetshop2/NPetshop.Web/@images/splash.jpg | Bin 46200 -> 0 bytes .../npetshop2/NPetshop.Web/@images/title.gif | Bin 3035 -> 0 bytes .../NPetshop.Web/@images/top_stripe1.gif | Bin 840 -> 0 bytes .../NPetshop.Web/@images/top_stripe2.gif | Bin 814 -> 0 bytes .../NPetshop.Web/@images/top_stripe3.gif | Bin 819 -> 0 bytes .../npetshop2/NPetshop.Web/AssemblyInfo.cs | 62 - Examples/npetshop2/NPetshop.Web/ChangeLog.txt | 5 - .../NPetshop.Web/Controls/ExtendedRepeater.cs | 40 - Examples/npetshop2/NPetshop.Web/Default.aspx | 27 - .../npetshop2/NPetshop.Web/Default.aspx.cs | 168 - .../npetshop2/NPetshop.Web/Default.aspx.resx | 109 - Examples/npetshop2/NPetshop.Web/Global.asax | 1 - .../npetshop2/NPetshop.Web/Global.asax.cs | 94 - .../npetshop2/NPetshop.Web/Global.asax.resx | 42 - .../NPetshop.Web/NPetshop.Web.csproj | 952 - .../NPetshop.Web/NPetshop.Web.csproj.webinfo | 4 - Examples/npetshop2/NPetshop.Web/NPetshop.mdb | Bin 499712 -> 0 bytes .../UserControls/Accounts/AccountEdition.ascx | 19 - .../Accounts/AccountEdition.ascx.cs | 73 - .../Accounts/AccountEdition.ascx.resx | 109 - .../UserControls/Accounts/AccountUI.ascx | 84 - .../UserControls/Accounts/AccountUI.ascx.cs | 101 - .../UserControls/Accounts/AccountUI.ascx.resx | 109 - .../UserControls/Accounts/AddressStatic.ascx | 57 - .../Accounts/AddressStatic.ascx.cs | 69 - .../Accounts/AddressStatic.ascx.resx | 109 - .../UserControls/Accounts/AddressUI.ascx | 81 - .../UserControls/Accounts/AddressUI.ascx.cs | 100 - .../UserControls/Accounts/AddressUI.ascx.resx | 109 - .../UserControls/Accounts/NewAccount.ascx | 16 - .../UserControls/Accounts/NewAccount.ascx.cs | 84 - .../Accounts/NewAccount.ascx.resx | 109 - .../UserControls/Accounts/SignIn.ascx | 39 - .../UserControls/Accounts/SignIn.ascx.cs | 76 - .../UserControls/Accounts/SignIn.ascx.resx | 109 - .../UserControls/Accounts/SignOut.ascx | 14 - .../UserControls/Accounts/SignOut.ascx.cs | 52 - .../UserControls/Accounts/SignOut.ascx.resx | 109 - .../UserControls/AdviceBanner.ascx | 1 - .../UserControls/AdviceBanner.ascx.cs | 41 - .../UserControls/AdviceBanner.ascx.resx | 42 - .../NPetshop.Web/UserControls/Banner.ascx | 23 - .../NPetshop.Web/UserControls/Banner.ascx.cs | 96 - .../UserControls/Banner.ascx.resx | 109 - .../UserControls/Billing/Bill.ascx | 11 - .../UserControls/Billing/Bill.ascx.cs | 47 - .../UserControls/Billing/Bill.ascx.resx | 109 - .../UserControls/Billing/BillUI.ascx | 79 - .../UserControls/Billing/BillUI.ascx.cs | 71 - .../UserControls/Billing/BillUI.ascx.resx | 109 - .../UserControls/Billing/Confirmation.ascx | 19 - .../UserControls/Billing/Confirmation.ascx.cs | 68 - .../Billing/Confirmation.ascx.resx | 109 - .../UserControls/Billing/Payment.ascx | 91 - .../UserControls/Billing/Payment.ascx.cs | 99 - .../UserControls/Billing/Payment.ascx.resx | 109 - .../UserControls/Billing/Shipping.ascx | 20 - .../UserControls/Billing/Shipping.ascx.cs | 68 - .../UserControls/Billing/Shipping.ascx.resx | 109 - .../UserControls/Catalog/Category.ascx | 48 - .../UserControls/Catalog/Category.ascx.cs | 106 - .../UserControls/Catalog/Category.ascx.resx | 109 - .../UserControls/Catalog/Item.ascx | 38 - .../UserControls/Catalog/Item.ascx.cs | 77 - .../UserControls/Catalog/Item.ascx.resx | 109 - .../UserControls/Catalog/MyList.ascx | 1 - .../UserControls/Catalog/MyList.ascx.cs | 41 - .../UserControls/Catalog/MyList.ascx.resx | 42 - .../UserControls/Catalog/Product.ascx | 50 - .../UserControls/Catalog/Product.ascx.cs | 105 - .../UserControls/Catalog/Product.ascx.resx | 109 - .../UserControls/Catalog/Search.ascx | 4 - .../UserControls/Catalog/Search.ascx.cs | 57 - .../UserControls/Catalog/Search.ascx.resx | 109 - .../UserControls/Catalog/SearchProduct.ascx | 49 - .../Catalog/SearchProduct.ascx.cs | 108 - .../Catalog/SearchProduct.ascx.resx | 109 - .../NPetshop.Web/UserControls/Error.ascx | 51 - .../NPetshop.Web/UserControls/Error.ascx.cs | 55 - .../NPetshop.Web/UserControls/Error.ascx.resx | 109 - .../NPetshop.Web/UserControls/Footer.ascx | 2 - .../NPetshop.Web/UserControls/Footer.ascx.cs | 41 - .../UserControls/Footer.ascx.resx | 42 - .../NPetshop.Web/UserControls/Header.ascx | 9 - .../NPetshop.Web/UserControls/Header.ascx.cs | 46 - .../UserControls/Header.ascx.resx | 109 - .../NPetshop.Web/UserControls/NPetshopUC.cs | 24 - .../UserControls/Shopping/Cart.ascx | 63 - .../UserControls/Shopping/Cart.ascx.cs | 163 - .../UserControls/Shopping/Cart.ascx.resx | 109 - .../UserControls/Shopping/Checkout.ascx | 50 - .../UserControls/Shopping/Checkout.ascx.cs | 114 - .../UserControls/Shopping/Checkout.ascx.resx | 109 - .../NPetshop.Web/UserControls/SideBar.ascx | 40 - .../NPetshop.Web/UserControls/SideBar.ascx.cs | 56 - .../UserControls/SideBar.ascx.resx | 109 - .../NPetshop.Web/UserControls/StartUp.ascx | 26 - .../NPetshop.Web/UserControls/StartUp.ascx.cs | 54 - .../UserControls/StartUp.ascx.resx | 109 - .../NPetshop.Web/UserControls/TopBar.ascx | 21 - .../NPetshop.Web/UserControls/TopBar.ascx.cs | 60 - .../UserControls/TopBar.ascx.resx | 109 - .../NPetshop.Web/UserControls/UserControl.cs | 46 - .../Views/Account/AccountEdition.aspx | 25 - .../Views/Account/AccountEdition.aspx.cs | 45 - .../Views/Account/AccountEdition.aspx.resx | 109 - .../NPetshop.Web/Views/Account/Register.aspx | 25 - .../Views/Account/Register.aspx.cs | 45 - .../Views/Account/Register.aspx.resx | 109 - .../NPetshop.Web/Views/Account/SignIn.aspx | 25 - .../NPetshop.Web/Views/Account/SignIn.aspx.cs | 45 - .../Views/Account/SignIn.aspx.resx | 109 - .../NPetshop.Web/Views/Account/SignOut.aspx | 25 - .../Views/Account/SignOut.aspx.cs | 45 - .../Views/Account/SignOut.aspx.resx | 109 - .../NPetshop.Web/Views/Billing/Billing.aspx | 25 - .../Views/Billing/Billing.aspx.cs | 45 - .../Views/Billing/Billing.aspx.resx | 109 - .../Views/Billing/Confirmation.aspx | 25 - .../Views/Billing/Confirmation.aspx.cs | 45 - .../Views/Billing/Confirmation.aspx.resx | 109 - .../NPetshop.Web/Views/Billing/Payment.aspx | 25 - .../Views/Billing/Payment.aspx.cs | 36 - .../Views/Billing/Payment.aspx.resx | 109 - .../NPetshop.Web/Views/Billing/Shipping.aspx | 25 - .../Views/Billing/Shipping.aspx.cs | 45 - .../Views/Billing/Shipping.aspx.resx | 109 - .../NPetshop.Web/Views/Catalog/Category.aspx | 25 - .../Views/Catalog/Category.aspx.cs | 47 - .../Views/Catalog/Category.aspx.resx | 109 - .../NPetshop.Web/Views/Catalog/Item.aspx | 25 - .../NPetshop.Web/Views/Catalog/Item.aspx.cs | 45 - .../NPetshop.Web/Views/Catalog/Item.aspx.resx | 109 - .../NPetshop.Web/Views/Catalog/Product.aspx | 25 - .../Views/Catalog/Product.aspx.cs | 45 - .../Views/Catalog/Product.aspx.resx | 109 - .../Views/Catalog/SearchProduct.aspx | 25 - .../Views/Catalog/SearchProduct.aspx.cs | 45 - .../Views/Catalog/SearchProduct.aspx.resx | 109 - .../NPetshop.Web/Views/NPetshopView.cs | 34 - .../NPetshop.Web/Views/Shopping/Cart.aspx | 25 - .../NPetshop.Web/Views/Shopping/Cart.aspx.cs | 36 - .../Views/Shopping/Cart.aspx.resx | 109 - .../NPetshop.Web/Views/Shopping/Checkout.aspx | 25 - .../Views/Shopping/Checkout.aspx.cs | 36 - .../Views/Shopping/Checkout.aspx.resx | 109 - .../npetshop2/NPetshop.Web/Views/default.aspx | 25 - .../NPetshop.Web/Views/default.aspx.cs | 36 - .../NPetshop.Web/Views/default.aspx.resx | 109 - Examples/npetshop2/NPetshop.Web/Web.config | 191 - .../npetshop2/NPetshop.Web/properties.config | 10 - Examples/npetshop2/NPetshop.Web/readme.txt | 3 - Examples/npetshop2/NPetshop.sln | 61 - Examples/tutorial/Build-chm.bat | 5 - Examples/tutorial/Model/Helper.cs | 16 - Examples/tutorial/Model/Helpers.cs | 23 - Examples/tutorial/Model/Model.csproj | 142 - Examples/tutorial/Model/Model.csproj.user | 48 - Examples/tutorial/Model/Person.cs | 64 - Examples/tutorial/Model/PersonHelper.cs | 39 - Examples/tutorial/Model/PersonTest.cs | 65 - .../tutorial/Model/Resources/PersonHelper.xml | 69 - .../Model/bin/Debug/properties.config | 8 - .../tutorial/Model/bin/Debug/providers.config | 38 - .../tutorial/Model/bin/Debug/sqlmap.config | 21 - Examples/tutorial/README.txt | 27 - Examples/tutorial/Tests/PersonTest.cs | 63 - .../tutorial/Tests/Resources/PersonHelper.xml | 69 - Examples/tutorial/Tests/Tests.csproj | 112 - .../Tests/bin/Debug/iBatisTutorial.mdb | Bin 118784 -> 0 bytes .../Tests/bin/Debug/properties.config | 8 - .../tutorial/Tests/bin/Debug/providers.config | 102 - .../tutorial/Tests/bin/Debug/sqlmap.config | 24 - Examples/tutorial/WebView/AssemblyInfo.cs | 60 - Examples/tutorial/WebView/Forms/Person.aspx | 35 - .../tutorial/WebView/Forms/Person.aspx.cs | 113 - .../tutorial/WebView/Forms/Person.aspx.resx | 42 - Examples/tutorial/WebView/Global.asax | 1 - Examples/tutorial/WebView/Global.asax.cs | 67 - Examples/tutorial/WebView/Global.asax.resx | 42 - Examples/tutorial/WebView/ReadMe.txt | 6 - .../WebView/Resources/PersonHelper.xml | 68 - .../WebView/Resources/iBatisTutorial.mdb | Bin 118784 -> 0 bytes Examples/tutorial/WebView/Web.config | 101 - Examples/tutorial/WebView/WebView.csproj | 174 - Examples/tutorial/WebView/default.htm | 9 - Examples/tutorial/WebView/iBatisTutorial.mdb | Bin 118784 -> 0 bytes Examples/tutorial/WebView/properties.config | 10 - Examples/tutorial/WebView/providers.config | 38 - Examples/tutorial/WebView/sqlmap.config | 21 - Examples/tutorial/default.css | 27 - Examples/tutorial/figure01.png | Bin 14289 -> 0 bytes Examples/tutorial/figure02.png | Bin 5966 -> 0 bytes Examples/tutorial/figure03.png | Bin 7891 -> 0 bytes Examples/tutorial/iBatisTutorial.chm | Bin 59571 -> 0 bytes Examples/tutorial/iBatisTutorial.sln | 29 - Examples/tutorial/iBatisTutorial.xml | 972 - Examples/tutorial/tutorial.xsl | 24 - Examples/tutorial2/DomainDiagram.png | Bin 25875 -> 0 bytes .../External-bin/Castle.DynamicProxy.dll | Bin 73728 -> 0 bytes .../External-bin/IBatisNet.Common.dll | Bin 98304 -> 0 bytes .../External-bin/IBatisNet.Common.xml | 4793 --- .../External-bin/IBatisNet.DataAccess.dll | Bin 53248 -> 0 bytes .../External-bin/IBatisNet.DataAccess.xml | 1586 - .../External-bin/IBatisNet.DataMapper.dll | Bin 241664 -> 0 bytes .../External-bin/IBatisNet.DataMapper.xml | 9476 ----- Examples/tutorial2/Files/Blogs.mdb | Bin 241664 -> 0 bytes .../tutorial2/Files/Maps/Access/Author.xml | 99 - Examples/tutorial2/Files/Maps/Access/Blog.xml | 64 - Examples/tutorial2/Files/Maps/Access/Post.xml | 71 - Examples/tutorial2/Files/dao.config | 33 - Examples/tutorial2/Files/properties.config | 5 - Examples/tutorial2/Files/providers.config | 277 - Examples/tutorial2/Files/sqlMap.config | 26 - .../Tutorial2.Application/BlogPresenter.cs | 72 - .../Tutorial2.Application/IBlogView.cs | 18 - .../Properties/AssemblyInfo.cs | 35 - .../Tutorial2.Application.csproj | 58 - Examples/tutorial2/Tutorial2.Domain/Author.cs | 43 - Examples/tutorial2/Tutorial2.Domain/Blog.cs | 37 - .../tutorial2/Tutorial2.Domain/Comment.cs | 13 - .../Tutorial2.Domain/DomainDiagram.cd | 56 - .../tutorial2/Tutorial2.Domain/EntityBase.cs | 12 - Examples/tutorial2/Tutorial2.Domain/Post.cs | 44 - .../Properties/AssemblyInfo.cs | 35 - .../Tutorial2.Domain/Tutorial2.Domain.csproj | 54 - .../Tutorial2.Service/BlogService.cs | 58 - .../Tutorial2.Service/IBlogService.cs | 28 - .../Properties/AssemblyInfo.cs | 35 - .../Tutorial2.Service.csproj | 58 - Examples/tutorial2/Tutorial2.Test/App.config | 27 - .../ManualMock/BlogServiceMock.cs | 55 - .../Tutorial2.Test/ManualMock/BlogViewMock.cs | 35 - .../ManualMock/DaoManagerMock.cs | 81 - .../Tutorial2.Test/Properties/AssemblyInfo.cs | 35 - .../Tutorial2.Test/TestBlogService.cs | 36 - .../Tutorial2.Test/TestDataMapper.cs | 81 - .../Tutorial2.Test/TestManualPresenterMock.cs | 47 - .../Tutorial2.Test/Tutorial2.Test.csproj | 73 - .../Tutorial2.WinUI/Login.Designer.cs | 118 - Examples/tutorial2/Tutorial2.WinUI/Login.cs | 76 - Examples/tutorial2/Tutorial2.WinUI/Login.resx | 126 - Examples/tutorial2/Tutorial2.WinUI/Program.cs | 20 - .../Properties/AssemblyInfo.cs | 33 - .../Tutorial2.Domain.User.datasource | 10 - .../Properties/Resources.Designer.cs | 71 - .../Tutorial2.WinUI/Properties/Resources.resx | 117 - .../Properties/Settings.Designer.cs | 30 - .../Properties/Settings.settings | 7 - .../Tutorial2.WinUI/Tutorial2.WinUI.csproj | 97 - Examples/tutorial2/Tutorial2.sln | 55 - .../AssemblyInfo.cs | 0 {src => ORBatis.Common}/AssemblyKey.snk | Bin .../ChangeLog.txt | 0 ORBatis.Common/DataSource.cs | 111 + ORBatis.Common/DataSourceDeSerializer.cs | 54 + ORBatis.Common/DbProvider.cs | 629 + .../Exceptions/ConfigurationException.cs | 110 + .../Exceptions/ForeignKeyException.cs | 109 + .../Exceptions/IBatisNetException.cs | 112 + ORBatis.Common/Exceptions/ProbeException.cs | 106 + .../IBatisNet.Common.2005.csproj | 0 .../IBatisNet.Common.2010.csproj | 680 +- .../IBatisNet.Common.Net35.2010.csproj | 686 +- .../IBatisNet.Common.Net45.2012.csproj | 296 +- .../IBatisNet.Common.csproj | 0 ORBatis.Common/IConnectionAdapter.cs | 9 + ORBatis.Common/IDalSession.cs | 181 + ORBatis.Common/IDataSource.cs | 86 + ORBatis.Common/IDbProvider.cs | 270 + ORBatis.Common/Logging/ILog.cs | 245 + .../Logging/ILoggerFactoryAdapter.cs | 80 + ORBatis.Common/Logging/Impl/AbstractLogger.cs | 200 + .../Logging/Impl/ConsoleOutLogger.cs | 119 + .../Logging/Impl/ConsoleOutLoggerFA.cs | 109 + ORBatis.Common/Logging/Impl/NoOpLogger.cs | 158 + ORBatis.Common/Logging/Impl/NoOpLoggerFA.cs | 81 + ORBatis.Common/Logging/Impl/TraceLogger.cs | 119 + ORBatis.Common/Logging/Impl/TraceLoggerFA.cs | 108 + ORBatis.Common/Logging/LogSetting.cs | 63 + ORBatis.Common/ORBatis.Common.csproj | 7 + ORBatis.Common/Pagination/IPaginatedList.cs | 113 + .../Pagination/PaginatedArrayList.cs | 361 + ORBatis.Common/ProviderDeSerializer.cs | 74 + .../Utilities/DBHelperParameterCache.cs | 242 + ORBatis.Common/Utilities/HashCodeProvider.cs | 62 + .../Utilities/Objects/AbstractFactory.cs | 67 + .../Utilities/Objects/ActivatorFactory.cs | 64 + .../Objects/ActivatorObjectFactory.cs | 49 + .../Utilities/Objects/BoxingOpCodes.cs | 34 +- ORBatis.Common/Utilities/Objects/IFactory.cs | 47 + .../Utilities/Objects/IObjectFactory.cs | 43 + .../Objects/Members/AccessorFactory.cs | 55 + .../Utilities/Objects/Members/BaseAccessor.cs | 155 + .../Utilities/Objects/Members/IAccessor.cs | 20 +- .../Utilities/Objects/Members/IGet.cs | 20 +- .../Utilities/Objects/Members/IGetAccessor.cs | 36 + .../Objects/Members/IGetAccessorFactory.cs | 18 +- .../Utilities/Objects/Members/ISet.cs | 20 +- .../Utilities/Objects/Members/ISetAccessor.cs | 36 + .../Objects/Members/ISetAccessorFactory.cs | 18 +- .../Members/ReflectionFieldGetAccessor.cs | 72 + .../Members/ReflectionFieldSetAccessor.cs | 72 + .../Members/ReflectionPropertyGetAccessor.cs | 85 + .../Members/ReflectionPropertySetAccessor.cs | 84 + .../Utilities/Objects/ObjectProbe.cs | 692 + .../Utilities/Objects/ReflectionInfo.cs | 296 + .../Utilities/Proxy/IProxyGenerator.cs | 23 +- ORBatis.Common/Utilities/ScriptRunner.cs | 187 + ORBatis.Common/Utilities/StringTokenizer.cs | 182 + ORBatis.Common/Utilities/TypeUtils.cs | 206 + .../TypesResolver/CachedTypeResolver.cs | 112 + .../Utilities/TypesResolver/ITypeResolver.cs | 65 + .../Utilities/TypesResolver/TypeRegistry.cs | 454 + .../Utilities/TypesResolver/TypeResolver.cs | 517 + ORBatis.Common/Xml/NodeUtils.cs | 151 + ORBatis.sln | 28 + ORBatisCore/Commands/DataReaderDecorator.cs | 489 + ORBatisCore/Commands/DataReaderTransformer.cs | 50 + ORBatisCore/Commands/DbCommandDecorator.cs | 231 + .../Commands/DefaultPreparedCommand.cs | 201 + .../Commands/IDbDataParameterCollection.cs | 0 ORBatisCore/Commands/IPreparedCommand.cs | 50 + ORBatisCore/Commands/InMemoryDataReader.cs | 579 + .../Commands/PreparedCommandFactory.cs | 51 + ORBatisCore/Configuration/Alias/TypeAlias.cs | 114 + .../Configuration/Alias/TypeHandler.cs | 105 + ORBatisCore/Configuration/Cache/CacheKey.cs | 149 + ORBatisCore/Configuration/Cache/CacheModel.cs | 368 + .../Cache/Fifo/FifoCacheController.cs | 110 + .../Configuration/Cache/FlushInterval.cs | 114 + .../Configuration/Cache/ICacheController.cs | 65 + .../Cache/Lru/LruCacheController.cs | 115 + .../Cache/Memory/MemoryCacheControler.cs | 142 + .../Cache/Memory/MemoryCacheLevel.cs | 105 + ORBatisCore/Configuration/DomSqlMapBuilder.cs | 1786 + .../InlineParameterMapParser.cs | 321 + .../ParameterMapping/ParameterMap.cs | 324 + .../ParameterMapping/ParameterProperty.cs | 375 + .../ParameterPropertyCollection.cs | 207 + .../ResultMapping/ArgumentProperty.cs | 202 + .../ResultMapping/AutoResultMap.cs | 192 + .../ResultMapping/Discriminator.cs | 213 + .../ResultMapping/DynamicResultMap.cs | 203 + .../Configuration/ResultMapping/IResultMap.cs | 116 + .../ResultMapping/NullResultMap.cs | 144 + .../Configuration/ResultMapping/ResultMap.cs | 460 + .../ResultMapping/ResultMapCollection.cs | 218 + .../ResultMapping/ResultProperty.cs | 540 + .../ResultMapping/ResultPropertyCollection.cs | 242 + .../Configuration/ResultMapping/SubMap.cs | 99 + .../ArgumentPropertyDeSerializer.cs | 63 + .../Serializers/CacheModelDeSerializer.cs | 74 + .../Serializers/DeSerializerFactory.cs | 71 + .../Serializers/DeleteDeSerializer.cs | 76 + .../Serializers/DiscriminatorDeSerializer.cs | 60 + .../Serializers/DynamicDeSerializer.cs | 68 + .../Serializers/IDeSerializer.cs | 43 + .../Serializers/InsertDeSerializer.cs | 97 + .../Serializers/IsEmptyDeSerializer.cs | 68 + .../Serializers/IsEqualDeSerializer.cs | 70 + .../Serializers/IsGreaterEqualDeSerializer.cs | 69 + .../Serializers/IsGreaterThanDeSerializer.cs | 69 + .../Serializers/IsLessEqualDeSerializer.cs | 69 + .../Serializers/IsLessThanDeSerializer.cs | 69 + .../Serializers/IsNotEmptyDeSerializer.cs | 67 + .../Serializers/IsNotEqualDeSerializer.cs | 70 + .../Serializers/IsNotNullDeSerializer.cs | 67 + .../IsNotParameterPresentDeSerializer.cs | 66 + .../IsNotPropertyAvailableDeSerializer.cs | 67 + .../Serializers/IsNullDeSerializer.cs | 67 + .../IsParameterPresentDeSerializer.cs | 66 + .../IsPropertyAvailableDeSerializer.cs | 68 + .../Serializers/IterateSerializer.cs | 71 + .../Serializers/ParameterMapDeSerializer.cs | 65 + .../ParameterPropertyDeSerializer.cs | 66 + .../Serializers/ProcedureDeSerializer.cs | 61 + .../Serializers/ResultMapDeSerializer.cs | 57 + .../Serializers/ResultPropertyDeSerializer.cs | 64 + .../Serializers/SelectDeSerializer.cs | 76 + .../Serializers/SqlDeSerializer.cs | 57 + .../Serializers/StatementDeSerializer.cs | 63 + .../Serializers/SubMapDeSerializer.cs | 55 + .../Serializers/TypeAliasDeSerializer.cs | 62 + .../Serializers/TypeHandlerDeSerializer.cs | 78 + .../Serializers/UpdateDeSerializer.cs | 75 + .../Configuration/Sql/Dynamic/DynamicSql.cs | 268 + .../Sql/Dynamic/Elements/BaseTag.cs | 63 + .../Sql/Dynamic/Elements/Conditional.cs | 65 + .../Sql/Dynamic/Elements/Dynamic.cs | 49 + .../Sql/Dynamic/Elements/IDynamicParent.cs | 37 + .../Sql/Dynamic/Elements/IsEmpty.cs | 47 + .../Sql/Dynamic/Elements/IsEqual.cs | 47 + .../Sql/Dynamic/Elements/IsGreaterEqual.cs | 47 + .../Sql/Dynamic/Elements/IsGreaterThan.cs | 47 + .../Sql/Dynamic/Elements/IsLessEqual.cs | 47 + .../Sql/Dynamic/Elements/IsLessThan.cs | 47 + .../Sql/Dynamic/Elements/IsNotEmpty.cs | 49 + .../Sql/Dynamic/Elements/IsNotEqual.cs | 49 + .../Sql/Dynamic/Elements/IsNotNull.cs | 47 + .../Dynamic/Elements/IsNotParameterPresent.cs | 47 + .../Elements/IsNotPropertyAvailable.cs | 47 + .../Sql/Dynamic/Elements/IsNull.cs | 45 + .../Dynamic/Elements/IsParameterPresent.cs | 47 + .../Dynamic/Elements/IsPropertyAvailable.cs | 47 + .../Sql/Dynamic/Elements/Iterate.cs | 88 + .../Sql/Dynamic/Elements/SqlTag.cs | 104 + .../Sql/Dynamic/Handlers/BaseTagHandler.cs | 127 + .../Dynamic/Handlers/ConditionalTagHandler.cs | 220 + .../Sql/Dynamic/Handlers/DynamicTagHandler.cs | 59 + .../Sql/Dynamic/Handlers/ISqlTagHandler.cs | 67 + .../Sql/Dynamic/Handlers/IsEmptyTagHandler.cs | 73 + .../Sql/Dynamic/Handlers/IsEqualTagHandler.cs | 58 + .../Handlers/IsGreaterEqualTagHandler.cs | 59 + .../Handlers/IsGreaterThanTagHandler.cs | 54 + .../Dynamic/Handlers/IsLessEqualTagHandler.cs | 54 + .../Dynamic/Handlers/IsLessThanTagHandler.cs | 54 + .../Dynamic/Handlers/IsNotEmptyTagHandler.cs | 53 + .../Dynamic/Handlers/IsNotEqualTagHandler.cs | 53 + .../Dynamic/Handlers/IsNotNullTagHandler.cs | 53 + .../IsNotParameterPresentTagHandler.cs | 53 + .../IsNotPropertyAvailableTagHandler.cs | 53 + .../Sql/Dynamic/Handlers/IsNullTagHandler.cs | 62 + .../Handlers/IsParameterPresentTagHandler.cs | 53 + .../Handlers/IsPropertyAvailableTagHandler.cs | 59 + .../Sql/Dynamic/Handlers/IterateContext.cs | 146 + .../Sql/Dynamic/Handlers/IterateTagHandler.cs | 163 + .../Sql/Dynamic/Handlers/SqlTagContext.cs | 126 + .../Configuration/Sql/Dynamic/ISqlChild.cs | 31 + .../Configuration/Sql/Dynamic/SqlText.cs | 62 + ORBatisCore/Configuration/Sql/ISql.cs | 50 + .../Sql/SimpleDynamic/SimpleDynamicSql.cs | 184 + .../Configuration/Sql/Static/ProcedureSql.cs | 103 + .../Configuration/Sql/Static/StaticSql.cs | 92 + .../Configuration/Statements/Delete.cs | 59 + .../Configuration/Statements/Generate.cs | 99 + .../Configuration/Statements/IStatement.cs | 118 + .../Configuration/Statements/Insert.cs | 83 + .../Statements/PreparedStatement.cs | 55 + .../Statements/PreparedStatementFactory.cs | 447 + .../Configuration/Statements/Procedure.cs | 78 + .../Configuration/Statements/Select.cs | 56 + .../Configuration/Statements/SelectKey.cs | 127 + .../Configuration/Statements/SqlGenerator.cs | 242 + .../Configuration/Statements/Statement.cs | 323 + .../Configuration/Statements/Update.cs | 56 + ORBatisCore/DataExchange/BaseDataExchange.cs | 75 + .../DataExchange/ComplexDataExchange.cs | 88 + .../DataExchange/DataExchangeFactory.cs | 101 + .../DataExchange/DictionaryDataExchange.cs | 81 + .../DataExchange/DotNetObjectDataExchange.cs | 110 + ORBatisCore/DataExchange/IDataExchange.cs | 59 + ORBatisCore/DataExchange/ListDataExchange.cs | 82 + .../DataExchange/PrimitiveDataExchange.cs | 85 + ORBatisCore/Delegates.cs | 62 + ORBatisCore/Enumeration.cs | 58 + ORBatisCore/Exceptions/DataMapperException.cs | 108 + ORBatisCore/ExecuteEventArgs.cs | 37 + ORBatisCore/ISqlMapSession.cs | 50 + ORBatisCore/ISqlMapper.cs | 603 + .../Logging/ConfigurationSectionHandler.cs | 196 + ORBatisCore/Logging/LogManager.cs | 202 + .../ArgumentStrategyFactory.cs | 78 + .../ArgumentStrategy/DefaultStrategy.cs | 74 + .../ArgumentStrategy/IArgumentStrategy.cs | 46 + .../ArgumentStrategy/ResultMapStrategy.cs | 83 + .../ArgumentStrategy/SelectArrayStrategy.cs | 64 + .../SelectGenericListStrategy.cs | 88 + .../ArgumentStrategy/SelectListStrategy.cs | 69 + .../ArgumentStrategy/SelectObjectStrategy.cs | 60 + .../ArgumentStrategy/SelectStrategy.cs | 127 + ORBatisCore/MappedStatements/BaseStrategy.cs | 109 + .../MappedStatements/CachingStatement.cs | 486 + .../MappedStatements/DeleteMappedStatement.cs | 140 + .../MappedStatements/IMappedStatement.cs | 289 + .../MappedStatements/InsertMappedStatement.cs | 156 + .../MappedStatements/MappedStatement.cs | 1100 + ORBatisCore/MappedStatements/PaginatedList.cs | 423 + ORBatisCore/MappedStatements/PostBindind.cs | 106 + .../PostSelectStrategy/ArrayStrategy.cs | 53 + .../PostSelectStrategy/GenericListStrategy.cs | 76 + .../PostSelectStrategy/IPostSelectStrategy.cs | 44 + .../PostSelectStrategy/ListStrategy.cs | 47 + .../PostSelectStrategy/ObjectStrategy.cs | 47 + .../PostSelectStrategyFactory.cs | 60 + .../StrongTypedListStrategy.cs | 51 + .../PropertStrategy/DefaultStrategy.cs | 89 + .../PropertStrategy/GroupByStrategy.cs | 146 + .../PropertStrategy/IPropertyStrategy.cs | 60 + .../PropertyStrategyFactory.cs | 92 + .../PropertStrategy/ResultMapStrategy.cs | 103 + .../PropertStrategy/SelectArrayStrategy.cs | 80 + .../SelectGenericListStrategy.cs | 88 + .../PropertStrategy/SelectListStrategy.cs | 91 + .../PropertStrategy/SelectObjectStrategy.cs | 89 + .../PropertStrategy/SelectStrategy.cs | 140 + .../MappedStatements/ReaderAutoMapper.cs | 129 + .../ResultStrategy/AutoMapStrategy.cs | 112 + .../ResultStrategy/BaseResultStrategy.cs | 26 + .../ResultStrategy/ClassDiagram.cd | 0 .../ResultStrategy/DictionaryStrategy.cs | 72 + .../ResultStrategy/DynamicMapStrategy.cs | 121 + .../ResultStrategy/GroupByStrategy.cs | 97 + .../ResultStrategy/IResultStrategy.cs | 43 + .../ResultStrategy/ListStrategy.cs | 69 + .../ResultStrategy/MapStrategy.cs | 65 + .../ResultStrategy/ObjectStrategy.cs | 78 + .../ResultStrategy/ResultClassStrategy.cs | 73 + .../ResultStrategy/ResultMapStrategy.cs | 78 + .../ResultStrategy/ResultStrategyFactory.cs | 68 + .../ResultStrategy/SimpleTypeStrategy.cs | 79 + .../MappedStatements/SelectMappedStatement.cs | 69 + .../MappedStatements/UpdateMappedStatement.cs | 157 + ORBatisCore/Mapper.cs | 82 + ORBatisCore/ORBatisCore.csproj | 30 + ORBatisCore/Proxy/ILazyFactory.cs | 46 + ORBatisCore/Proxy/LazyFactoryBuilder.cs | 82 + ORBatisCore/Proxy/LazyList.cs | 325 + ORBatisCore/Proxy/LazyListFactory.cs | 52 + ORBatisCore/Proxy/LazyListGeneric.cs | 513 + ORBatisCore/Proxy/LazyListGenericFactory.cs | 60 + ORBatisCore/Proxy/LazyLoadInterceptor.cs | 136 + ORBatisCore/Proxy/LazyLoadProxyFactory.cs | 76 + ORBatisCore/Scope/ConfigurationScope.cs | 254 + ORBatisCore/Scope/ErrorContext.cs | 117 + ORBatisCore/Scope/IScope.cs | 43 + ORBatisCore/Scope/RequestScope.cs | 214 + ORBatisCore/SqlMap.xsd | 853 + ORBatisCore/SqlMapConfig.xsd | 154 + ORBatisCore/SqlMapSession.cs | 473 + ORBatisCore/SqlMapper.cs | 1115 + .../TypeHandlers/AnsiStringTypeHandler.cs | 109 + ORBatisCore/TypeHandlers/BaseTypeHandler.cs | 112 + .../TypeHandlers/BooleanTypeHandler.cs | 100 + .../TypeHandlers/ByteArrayTypeHandler.cs | 123 + ORBatisCore/TypeHandlers/ByteTypeHandler.cs | 106 + ORBatisCore/TypeHandlers/CharTypeHandler.cs | 100 + ORBatisCore/TypeHandlers/CustomTypeHandler.cs | 135 + ORBatisCore/TypeHandlers/DBNullTypeHandler.cs | 105 + .../TypeHandlers/DateTimeTypeHandler.cs | 100 + .../TypeHandlers/DecimalTypeHandler.cs | 105 + ORBatisCore/TypeHandlers/DoubleTypeHandler.cs | 100 + ORBatisCore/TypeHandlers/EnumTypeHandler.cs | 116 + ORBatisCore/TypeHandlers/GuidTypeHandler.cs | 99 + ORBatisCore/TypeHandlers/IParameterSetter.cs | 52 + ORBatisCore/TypeHandlers/IResultGetter.cs | 54 + ORBatisCore/TypeHandlers/ITypeHandler.cs | 95 + .../TypeHandlers/ITypeHandlerCallback.cs | 78 + ORBatisCore/TypeHandlers/Int16TypeHandler.cs | 101 + ORBatisCore/TypeHandlers/Int32TypeHandler.cs | 103 + ORBatisCore/TypeHandlers/Int64TypeHandler.cs | 101 + .../Nullables/NullableBooleanTypeHandler.cs | 120 + .../Nullables/NullableByteTypeHandler.cs | 119 + .../Nullables/NullableCharTypeHandler.cs | 119 + .../Nullables/NullableDateTimeTypeHandler.cs | 117 + .../Nullables/NullableDecimalTypeHandler.cs | 125 + .../Nullables/NullableDoubleTypeHandler.cs | 119 + .../Nullables/NullableGuidTypeHandler.cs | 118 + .../Nullables/NullableInt16TypeHandler.cs | 127 + .../Nullables/NullableInt32TypeHandler.cs | 125 + .../Nullables/NullableInt64TypeHandler.cs | 126 + .../Nullables/NullableSByteTypeHandler.cs | 120 + .../Nullables/NullableSingleTypeHandler.cs | 118 + .../Nullables/NullableTimeSpanTypeHandler.cs | 119 + .../Nullables/NullableUInt16TypeHandler.cs | 126 + .../Nullables/NullableUInt32TypeHandler.cs | 126 + .../Nullables/NullableUInt64TypeHandler.cs | 126 + ORBatisCore/TypeHandlers/ObjectTypeHandler.cs | 99 + .../TypeHandlers/ParameterSetterImpl.cs | 62 + ORBatisCore/TypeHandlers/ResultGetterImpl.cs | 102 + ORBatisCore/TypeHandlers/SByteTypeHandler.cs | 102 + ORBatisCore/TypeHandlers/SingleTypeHandler.cs | 102 + ORBatisCore/TypeHandlers/StringTypeHandler.cs | 101 + .../TypeHandlers/TimeSpanTypeHandler.cs | 110 + .../TypeHandlers/TypeHandlerFactory.cs | 358 + ORBatisCore/TypeHandlers/UInt16TypeHandler.cs | 103 + ORBatisCore/TypeHandlers/UInt32TypeHandler.cs | 101 + ORBatisCore/TypeHandlers/UInt64TypeHandler.cs | 102 + .../TypeHandlers/UnknownTypeHandler.cs | 149 + ORBatisCore/Utilities/ConfigWatcherHandler.cs | 208 + .../Utilities/Objects/DelegateFactory.cs | 120 + .../Objects/DelegateObjectFactory.cs | 98 + .../Utilities/Objects/EmitObjectFactory.cs | 93 + .../Utilities/Objects/FactoryBuilder.cs | 151 + .../Utilities/Objects/FactoryLogAdapter.cs | 121 + .../Members/DelegateGetFieldAccessor.cs | 116 + .../Members/DelegatePropertyGetAccessor.cs | 124 + .../Members/DelegatePropertySetAccessor.cs | 149 + .../Members/DelegateSetFieldAccessor.cs | 123 + .../Objects/Members/EmitFieldGetAccessor.cs | 183 + .../Objects/Members/EmitFieldSetAccessor.cs | 202 + .../Members/EmitPropertyGetAccessor.cs | 191 + .../Members/EmitPropertySetAccessor.cs | 223 + .../Objects/Members/GetAccessorFactory.cs | 248 + .../Objects/Members/SetAccessorFactory.cs | 247 + .../Utilities/Objects/ObjectFactory.cs | 73 + ORBatisCore/Utilities/Resources.cs | 557 + .../Commands/DataReaderDecorator.cs | 491 + .../Commands/DataReaderTransformer.cs | 51 + .../Commands/DbCommandDecorator.cs | 233 + .../Commands/DefaultPreparedCommand.cs | 203 + .../Commands/IDbDataParameterCollection.cs | 0 ORBatisFramework/Commands/IPreparedCommand.cs | 51 + .../Commands/InMemoryDataReader.cs | 581 + .../Commands/PreparedCommandFactory.cs | 52 + .../Configuration/Alias/TypeAlias.cs | 116 + .../Configuration/Alias/TypeHandler.cs | 107 + .../Configuration/Cache/CacheKey.cs | 150 + .../Configuration/Cache/CacheModel.cs | 371 + .../Cache/Fifo/FifoCacheController.cs | 112 + .../Configuration/Cache/FlushInterval.cs | 116 + .../Configuration/Cache/ICacheController.cs | 66 + .../Cache/Lru/LruCacheController.cs | 117 + .../Cache/Memory/MemoryCacheControler.cs | 144 + .../Cache/Memory/MemoryCacheLevel.cs | 106 + .../Configuration/DomSqlMapBuilder.cs | 1790 + .../InlineParameterMapParser.cs | 323 + .../ParameterMapping/ParameterMap.cs | 326 + .../ParameterMapping/ParameterProperty.cs | 377 + .../ParameterPropertyCollection.cs | 210 + .../ResultMapping/ArgumentProperty.cs | 204 + .../ResultMapping/AutoResultMap.cs | 194 + .../ResultMapping/Discriminator.cs | 215 + .../ResultMapping/DynamicResultMap.cs | 203 + .../Configuration/ResultMapping/IResultMap.cs | 118 + .../ResultMapping/NullResultMap.cs | 146 + .../Configuration/ResultMapping/ResultMap.cs | 462 + .../ResultMapping/ResultMapCollection.cs | 220 + .../ResultMapping/ResultProperty.cs | 543 + .../ResultMapping/ResultPropertyCollection.cs | 245 + .../Configuration/ResultMapping/SubMap.cs | 101 + .../ArgumentPropertyDeSerializer.cs | 64 + .../Serializers/CacheModelDeSerializer.cs | 75 + .../Serializers/DeSerializerFactory.cs | 72 + .../Serializers/DeleteDeSerializer.cs | 77 + .../Serializers/DiscriminatorDeSerializer.cs | 61 + .../Serializers/DynamicDeSerializer.cs | 69 + .../Serializers/IDeSerializer.cs | 44 + .../Serializers/InsertDeSerializer.cs | 98 + .../Serializers/IsEmptyDeSerializer.cs | 69 + .../Serializers/IsEqualDeSerializer.cs | 71 + .../Serializers/IsGreaterEqualDeSerializer.cs | 70 + .../Serializers/IsGreaterThanDeSerializer.cs | 70 + .../Serializers/IsLessEqualDeSerializer.cs | 70 + .../Serializers/IsLessThanDeSerializer.cs | 70 + .../Serializers/IsNotEmptyDeSerializer.cs | 68 + .../Serializers/IsNotEqualDeSerializer.cs | 71 + .../Serializers/IsNotNullDeSerializer.cs | 68 + .../IsNotParameterPresentDeSerializer.cs | 67 + .../IsNotPropertyAvailableDeSerializer.cs | 68 + .../Serializers/IsNullDeSerializer.cs | 68 + .../IsParameterPresentDeSerializer.cs | 67 + .../IsPropertyAvailableDeSerializer.cs | 69 + .../Serializers/IterateSerializer.cs | 72 + .../Serializers/ParameterMapDeSerializer.cs | 66 + .../ParameterPropertyDeSerializer.cs | 67 + .../Serializers/ProcedureDeSerializer.cs | 62 + .../Serializers/ResultMapDeSerializer.cs | 58 + .../Serializers/ResultPropertyDeSerializer.cs | 65 + .../Serializers/SelectDeSerializer.cs | 77 + .../Serializers/SqlDeSerializer.cs | 58 + .../Serializers/StatementDeSerializer.cs | 64 + .../Serializers/SubMapDeSerializer.cs | 56 + .../Serializers/TypeAliasDeSerializer.cs | 63 + .../Serializers/TypeHandlerDeSerializer.cs | 80 + .../Serializers/UpdateDeSerializer.cs | 76 + .../Configuration/Sql/Dynamic/DynamicSql.cs | 269 + .../Sql/Dynamic/Elements/BaseTag.cs | 65 + .../Sql/Dynamic/Elements/Conditional.cs | 67 + .../Sql/Dynamic/Elements/Dynamic.cs | 51 + .../Sql/Dynamic/Elements/IDynamicParent.cs | 38 + .../Sql/Dynamic/Elements/IsEmpty.cs | 49 + .../Sql/Dynamic/Elements/IsEqual.cs | 49 + .../Sql/Dynamic/Elements/IsGreaterEqual.cs | 49 + .../Sql/Dynamic/Elements/IsGreaterThan.cs | 49 + .../Sql/Dynamic/Elements/IsLessEqual.cs | 49 + .../Sql/Dynamic/Elements/IsLessThan.cs | 49 + .../Sql/Dynamic/Elements/IsNotEmpty.cs | 51 + .../Sql/Dynamic/Elements/IsNotEqual.cs | 51 + .../Sql/Dynamic/Elements/IsNotNull.cs | 49 + .../Dynamic/Elements/IsNotParameterPresent.cs | 49 + .../Elements/IsNotPropertyAvailable.cs | 49 + .../Sql/Dynamic/Elements/IsNull.cs | 47 + .../Dynamic/Elements/IsParameterPresent.cs | 49 + .../Dynamic/Elements/IsPropertyAvailable.cs | 49 + .../Sql/Dynamic/Elements/Iterate.cs | 90 + .../Sql/Dynamic/Elements/SqlTag.cs | 106 + .../Sql/Dynamic/Handlers/BaseTagHandler.cs | 128 + .../Dynamic/Handlers/ConditionalTagHandler.cs | 222 + .../Sql/Dynamic/Handlers/DynamicTagHandler.cs | 60 + .../Sql/Dynamic/Handlers/ISqlTagHandler.cs | 68 + .../Sql/Dynamic/Handlers/IsEmptyTagHandler.cs | 75 + .../Sql/Dynamic/Handlers/IsEqualTagHandler.cs | 59 + .../Handlers/IsGreaterEqualTagHandler.cs | 60 + .../Handlers/IsGreaterThanTagHandler.cs | 55 + .../Dynamic/Handlers/IsLessEqualTagHandler.cs | 55 + .../Dynamic/Handlers/IsLessThanTagHandler.cs | 55 + .../Dynamic/Handlers/IsNotEmptyTagHandler.cs | 54 + .../Dynamic/Handlers/IsNotEqualTagHandler.cs | 54 + .../Dynamic/Handlers/IsNotNullTagHandler.cs | 54 + .../IsNotParameterPresentTagHandler.cs | 54 + .../IsNotPropertyAvailableTagHandler.cs | 54 + .../Sql/Dynamic/Handlers/IsNullTagHandler.cs | 63 + .../Handlers/IsParameterPresentTagHandler.cs | 54 + .../Handlers/IsPropertyAvailableTagHandler.cs | 60 + .../Sql/Dynamic/Handlers/IterateContext.cs | 148 + .../Sql/Dynamic/Handlers/IterateTagHandler.cs | 164 + .../Sql/Dynamic/Handlers/SqlTagContext.cs | 128 + .../Configuration/Sql/Dynamic/ISqlChild.cs | 32 + .../Configuration/Sql/Dynamic/SqlText.cs | 63 + ORBatisFramework/Configuration/Sql/ISql.cs | 51 + .../Sql/SimpleDynamic/SimpleDynamicSql.cs | 185 + .../Configuration/Sql/Static/ProcedureSql.cs | 104 + .../Configuration/Sql/Static/StaticSql.cs | 93 + .../Configuration/Statements/Delete.cs | 61 + .../Configuration/Statements/Generate.cs | 101 + .../Configuration/Statements/IStatement.cs | 121 + .../Configuration/Statements/Insert.cs | 85 + .../Statements/PreparedStatement.cs | 56 + .../Statements/PreparedStatementFactory.cs | 449 + .../Configuration/Statements/Procedure.cs | 80 + .../Configuration/Statements/Select.cs | 58 + .../Configuration/Statements/SelectKey.cs | 129 + .../Configuration/Statements/SqlGenerator.cs | 243 + .../Configuration/Statements/Statement.cs | 326 + .../Configuration/Statements/Update.cs | 58 + .../DataExchange/BaseDataExchange.cs | 76 + .../DataExchange/ComplexDataExchange.cs | 89 + .../DataExchange/DataExchangeFactory.cs | 103 + .../DataExchange/DictionaryDataExchange.cs | 82 + .../DataExchange/DotNetObjectDataExchange.cs | 112 + .../DataExchange/IDataExchange.cs | 60 + .../DataExchange/ListDataExchange.cs | 83 + .../DataExchange/PrimitiveDataExchange.cs | 86 + ORBatisFramework/Delegates.cs | 64 + ORBatisFramework/Enumeration.cs | 59 + .../Exceptions/DataMapperException.cs | 110 + ORBatisFramework/ExecuteEventArgs.cs | 40 + ORBatisFramework/ISqlMapSession.cs | 51 + ORBatisFramework/ISqlMapper.cs | 606 + .../Logging/ConfigurationSectionHandler.cs | 198 + ORBatisFramework/Logging/LogManager.cs | 204 + .../ArgumentStrategyFactory.cs | 79 + .../ArgumentStrategy/DefaultStrategy.cs | 75 + .../ArgumentStrategy/IArgumentStrategy.cs | 47 + .../ArgumentStrategy/ResultMapStrategy.cs | 84 + .../ArgumentStrategy/SelectArrayStrategy.cs | 66 + .../SelectGenericListStrategy.cs | 91 + .../ArgumentStrategy/SelectListStrategy.cs | 71 + .../ArgumentStrategy/SelectObjectStrategy.cs | 62 + .../ArgumentStrategy/SelectStrategy.cs | 130 + .../MappedStatements/BaseStrategy.cs | 110 + .../MappedStatements/CachingStatement.cs | 488 + .../MappedStatements/DeleteMappedStatement.cs | 141 + .../MappedStatements/IMappedStatement.cs | 291 + .../MappedStatements/InsertMappedStatement.cs | 157 + .../MappedStatements/MappedStatement.cs | 1103 + .../MappedStatements/PaginatedList.cs | 425 + .../MappedStatements/PostBindind.cs | 107 + .../PostSelectStrategy/ArrayStrategy.cs | 55 + .../PostSelectStrategy/GenericListStrategy.cs | 79 + .../PostSelectStrategy/IPostSelectStrategy.cs | 45 + .../PostSelectStrategy/ListStrategy.cs | 48 + .../PostSelectStrategy/ObjectStrategy.cs | 48 + .../PostSelectStrategyFactory.cs | 61 + .../StrongTypedListStrategy.cs | 53 + .../PropertStrategy/DefaultStrategy.cs | 90 + .../PropertStrategy/GroupByStrategy.cs | 147 + .../PropertStrategy/IPropertyStrategy.cs | 61 + .../PropertyStrategyFactory.cs | 94 + .../PropertStrategy/ResultMapStrategy.cs | 104 + .../PropertStrategy/SelectArrayStrategy.cs | 82 + .../SelectGenericListStrategy.cs | 91 + .../PropertStrategy/SelectListStrategy.cs | 93 + .../PropertStrategy/SelectObjectStrategy.cs | 91 + .../PropertStrategy/SelectStrategy.cs | 143 + .../MappedStatements/ReaderAutoMapper.cs | 131 + .../ResultStrategy/AutoMapStrategy.cs | 113 + .../ResultStrategy/BaseResultStrategy.cs | 26 + .../ResultStrategy/ClassDiagram.cd | 103 + .../ResultStrategy/DictionaryStrategy.cs | 73 + .../ResultStrategy/DynamicMapStrategy.cs | 121 + .../ResultStrategy/GroupByStrategy.cs | 98 + .../ResultStrategy/IResultStrategy.cs | 44 + .../ResultStrategy/ListStrategy.cs | 70 + .../ResultStrategy/MapStrategy.cs | 66 + .../ResultStrategy/ObjectStrategy.cs | 79 + .../ResultStrategy/ResultClassStrategy.cs | 74 + .../ResultStrategy/ResultMapStrategy.cs | 79 + .../ResultStrategy/ResultStrategyFactory.cs | 69 + .../ResultStrategy/SimpleTypeStrategy.cs | 80 + .../MappedStatements/SelectMappedStatement.cs | 70 + .../MappedStatements/UpdateMappedStatement.cs | 158 + ORBatisFramework/Mapper.cs | 83 + ORBatisFramework/ORBatisFramework.csproj | 359 + ORBatisFramework/Properties/AssemblyInfo.cs | 35 + ORBatisFramework/Proxy/ILazyFactory.cs | 47 + ORBatisFramework/Proxy/LazyFactoryBuilder.cs | 85 + ORBatisFramework/Proxy/LazyList.cs | 327 + ORBatisFramework/Proxy/LazyListFactory.cs | 53 + ORBatisFramework/Proxy/LazyListGeneric.cs | 516 + .../Proxy/LazyListGenericFactory.cs | 62 + ORBatisFramework/Proxy/LazyLoadInterceptor.cs | 138 + .../Proxy/LazyLoadProxyFactory.cs | 78 + ORBatisFramework/Scope/ConfigurationScope.cs | 256 + ORBatisFramework/Scope/ErrorContext.cs | 119 + ORBatisFramework/Scope/IScope.cs | 44 + ORBatisFramework/Scope/RequestScope.cs | 215 + ORBatisFramework/SqlMap.xsd | 853 + ORBatisFramework/SqlMapConfig.xsd | 154 + ORBatisFramework/SqlMapModule.xsd | 44 + ORBatisFramework/SqlMapSession.cs | 475 + ORBatisFramework/SqlMapper.cs | 1118 + .../TypeHandlers/AnsiStringTypeHandler.cs | 111 + .../TypeHandlers/BaseTypeHandler.cs | 114 + .../TypeHandlers/BooleanTypeHandler.cs | 102 + .../TypeHandlers/ByteArrayTypeHandler.cs | 125 + .../TypeHandlers/ByteTypeHandler.cs | 108 + .../TypeHandlers/CharTypeHandler.cs | 102 + .../TypeHandlers/CustomTypeHandler.cs | 137 + .../TypeHandlers/DBNullTypeHandler.cs | 107 + .../TypeHandlers/DateTimeTypeHandler.cs | 102 + .../TypeHandlers/DecimalTypeHandler.cs | 107 + .../TypeHandlers/DoubleTypeHandler.cs | 102 + .../TypeHandlers/EnumTypeHandler.cs | 118 + .../TypeHandlers/GuidTypeHandler.cs | 101 + .../TypeHandlers/IParameterSetter.cs | 53 + .../TypeHandlers/IResultGetter.cs | 55 + ORBatisFramework/TypeHandlers/ITypeHandler.cs | 97 + .../TypeHandlers/ITypeHandlerCallback.cs | 79 + .../TypeHandlers/Int16TypeHandler.cs | 103 + .../TypeHandlers/Int32TypeHandler.cs | 105 + .../TypeHandlers/Int64TypeHandler.cs | 103 + .../Nullables/NullableBooleanTypeHandler.cs | 122 + .../Nullables/NullableByteTypeHandler.cs | 121 + .../Nullables/NullableCharTypeHandler.cs | 121 + .../Nullables/NullableDateTimeTypeHandler.cs | 119 + .../Nullables/NullableDecimalTypeHandler.cs | 127 + .../Nullables/NullableDoubleTypeHandler.cs | 121 + .../Nullables/NullableGuidTypeHandler.cs | 120 + .../Nullables/NullableInt16TypeHandler.cs | 129 + .../Nullables/NullableInt32TypeHandler.cs | 127 + .../Nullables/NullableInt64TypeHandler.cs | 128 + .../Nullables/NullableSByteTypeHandler.cs | 122 + .../Nullables/NullableSingleTypeHandler.cs | 120 + .../Nullables/NullableTimeSpanTypeHandler.cs | 121 + .../Nullables/NullableUInt16TypeHandler.cs | 128 + .../Nullables/NullableUInt32TypeHandler.cs | 128 + .../Nullables/NullableUInt64TypeHandler.cs | 128 + .../TypeHandlers/ObjectTypeHandler.cs | 101 + .../TypeHandlers/ParameterSetterImpl.cs | 63 + .../TypeHandlers/ResultGetterImpl.cs | 103 + .../TypeHandlers/SByteTypeHandler.cs | 104 + .../TypeHandlers/SingleTypeHandler.cs | 104 + .../TypeHandlers/StringTypeHandler.cs | 103 + .../TypeHandlers/TimeSpanTypeHandler.cs | 112 + .../TypeHandlers/TypeHandlerFactory.cs | 360 + .../TypeHandlers/UInt16TypeHandler.cs | 105 + .../TypeHandlers/UInt32TypeHandler.cs | 103 + .../TypeHandlers/UInt64TypeHandler.cs | 104 + .../TypeHandlers/UnknownTypeHandler.cs | 151 + .../Utilities/ConfigWatcherHandler.cs | 211 + .../Utilities/Objects/DelegateFactory.cs | 122 + .../Objects/DelegateObjectFactory.cs | 100 + .../Utilities/Objects/EmitObjectFactory.cs | 95 + .../Utilities/Objects/FactoryBuilder.cs | 153 + .../Utilities/Objects/FactoryLogAdapter.cs | 123 + .../Members/DelegateGetFieldAccessor.cs | 118 + .../Members/DelegatePropertyGetAccessor.cs | 126 + .../Members/DelegatePropertySetAccessor.cs | 151 + .../Members/DelegateSetFieldAccessor.cs | 125 + .../Objects/Members/EmitFieldGetAccessor.cs | 185 + .../Objects/Members/EmitFieldSetAccessor.cs | 204 + .../Members/EmitPropertyGetAccessor.cs | 193 + .../Members/EmitPropertySetAccessor.cs | 225 + .../Objects/Members/GetAccessorFactory.cs | 248 + .../Objects/Members/SetAccessorFactory.cs | 248 + .../Utilities/Objects/ObjectFactory.cs | 75 + ORBatisFramework/Utilities/Resources.cs | 560 + ORBatisFramework/packages.config | 5 + README.txt | 9 - docs/README.html | 112 - docs/dataAccessGuide/resources/IBatisNet.vsd | Bin 951808 -> 0 bytes docs/dataAccessGuide/src/en/configuration.xml | 1275 - docs/dataAccessGuide/src/en/dao.xml | 151 - docs/dataAccessGuide/src/en/example.xml | 12 - docs/dataAccessGuide/src/en/handler.xml | 123 - .../src/en/images/DAODesign.gif | Bin 11218 -> 0 bytes .../src/en/images/DAODiagram.gif | Bin 33728 -> 0 bytes .../src/en/images/ibatisnet.gif | Bin 1728 -> 0 bytes docs/dataAccessGuide/src/en/index.xml | 52 - docs/dataAccessGuide/src/en/interface.xml | 447 - docs/dataAccessGuide/src/en/introduction.xml | 61 - docs/dataAccessGuide/src/en/programming.xml | 379 - docs/dataAccessGuide/src/en/xsd-template.xml | 4 - docs/dataAccessGuide/styles/fopdf.xsl | 541 - docs/dataAccessGuide/styles/html.css | 244 - docs/dataAccessGuide/styles/html.xsl | 76 - docs/dataMapperGuide/resources/DataMapper.ppt | Bin 64000 -> 0 bytes docs/dataMapperGuide/src/en/architecture.xml | 250 - docs/dataMapperGuide/src/en/dotnet.xml | 2631 -- .../src/en/images/DevGuide-1.gif | Bin 44214 -> 0 bytes .../src/en/images/ibatisnet.gif | Bin 1728 -> 0 bytes .../src/en/images/intellisense.GIF | Bin 5125 -> 0 bytes docs/dataMapperGuide/src/en/images/new.gif | Bin 136 -> 0 bytes docs/dataMapperGuide/src/en/index.xml | 53 - docs/dataMapperGuide/src/en/introduction.xml | 117 - docs/dataMapperGuide/src/en/working.xml | 4245 --- .../src/en/xsd-config-template.xml | 4 - .../src/en/xsd-sqlMap-template.xml | 4 - docs/dataMapperGuide/styles/fopdf.xsl | 578 - docs/dataMapperGuide/styles/html.css | 252 - docs/dataMapperGuide/styles/html.xsl | 75 - docs/doc.build | 249 - docs/doc.build.include.windows | 12 - docs/docbook/dtd/40chg.txt | 53 - docs/docbook/dtd/41chg.txt | 18 - docs/docbook/dtd/ChangeLog | 118 - docs/docbook/dtd/calstblx.dtd | 199 - docs/docbook/dtd/dbcentx.mod | 204 - docs/docbook/dtd/dbgenent.mod | 41 - docs/docbook/dtd/dbhierx.mod | 2074 -- docs/docbook/dtd/dbnotnx.mod | 97 - docs/docbook/dtd/dbpoolx.mod | 7516 ---- docs/docbook/dtd/docbook.cat | 59 - docs/docbook/dtd/docbookx.dtd | 125 - docs/docbook/dtd/ent/iso-amsa.ent | 63 - docs/docbook/dtd/ent/iso-amsb.ent | 49 - docs/docbook/dtd/ent/iso-amsc.ent | 15 - docs/docbook/dtd/ent/iso-amsn.ent | 66 - docs/docbook/dtd/ent/iso-amso.ent | 26 - docs/docbook/dtd/ent/iso-amsr.ent | 91 - docs/docbook/dtd/ent/iso-box.ent | 45 - docs/docbook/dtd/ent/iso-cyr1.ent | 72 - docs/docbook/dtd/ent/iso-cyr2.ent | 31 - docs/docbook/dtd/ent/iso-dia.ent | 19 - docs/docbook/dtd/ent/iso-grk1.ent | 54 - docs/docbook/dtd/ent/iso-grk2.ent | 25 - docs/docbook/dtd/ent/iso-grk3.ent | 48 - docs/docbook/dtd/ent/iso-grk4.ent | 48 - docs/docbook/dtd/ent/iso-lat1.ent | 67 - docs/docbook/dtd/ent/iso-lat2.ent | 126 - docs/docbook/dtd/ent/iso-num.ent | 81 - docs/docbook/dtd/ent/iso-pub.ent | 90 - docs/docbook/dtd/ent/iso-tech.ent | 69 - docs/docbook/dtd/readme.txt | 16 - docs/docbook/dtd/soextblx.dtd | 308 - docs/docbook/readme.txt | 3 - docs/docbook/styles/readme.txt | 1 - docs/favicon.ico | Bin 766 -> 0 bytes docs/fop/readme.txt | 14 - docs/skin/breadcrumbs-optimized.js | 67 - docs/skin/breadcrumbs.js | 267 - docs/skin/images/chapter.gif | Bin 55 -> 0 bytes docs/skin/images/chapter_open.gif | Bin 55 -> 0 bytes docs/skin/images/current.gif | Bin 60 -> 0 bytes docs/skin/images/doc.gif | Bin 393 -> 0 bytes docs/skin/images/favicon.ico | Bin 766 -> 0 bytes docs/skin/images/label.gif | Bin 54 -> 0 bytes docs/skin/images/menu-left.gif | Bin 176 -> 0 bytes docs/skin/images/menu-right.gif | Bin 176 -> 0 bytes docs/skin/images/page.gif | Bin 52 -> 0 bytes docs/skin/images/pdfdoc.gif | Bin 457 -> 0 bytes docs/skin/images/printer.gif | Bin 438 -> 0 bytes docs/skin/images/search-left.gif | Bin 112 -> 0 bytes docs/skin/images/search-right.gif | Bin 112 -> 0 bytes docs/skin/images/singlepage.gif | Bin 181 -> 0 bytes docs/skin/images/spacer.gif | Bin 43 -> 0 bytes docs/skin/images/tab-left.gif | Bin 70 -> 0 bytes docs/skin/images/tab-right.gif | Bin 70 -> 0 bytes docs/skin/images/tabSel-left.gif | Bin 70 -> 0 bytes docs/skin/images/tabSel-right.gif | Bin 70 -> 0 bytes docs/skin/images/valid-html401.png | Bin 2948 -> 0 bytes docs/skin/images/vcss.png | Bin 1134 -> 0 bytes docs/skin/images/xmldoc.gif | Bin 647 -> 0 bytes docs/skin/page.css | 71 - docs/tutorial/src/en/images/figure01.gif | Bin 15329 -> 0 bytes docs/tutorial/src/en/images/figure02.gif | Bin 5148 -> 0 bytes docs/tutorial/src/en/images/figure03.gif | Bin 8442 -> 0 bytes docs/tutorial/src/en/index.xml | 34 - docs/tutorial/src/en/tutorial.xml | 1054 - docs/tutorial/styles/fopdf.xsl | 547 - docs/tutorial/styles/html.css | 225 - docs/tutorial/styles/html.xsl | 76 - docs/xsltproc/readme.txt | 27 - src/Common.sln | 45 - src/CommonAssemblyInfo.cs | 48 - src/DataAccess-Release.sln | 45 - src/DataAccess.sln | 53 - src/DataMapper.2003.sln | 45 - src/DataMapper.2005.sln | 38 - src/DataMapper.2008.sln | 38 - .../Net/1.1/Castle.DynamicProxy.dll | Bin 69632 -> 0 bytes .../Net/1.1/Castle.DynamicProxy.license.txt | 13 - src/External-Bin/Net/1.1/License.txt | 13 - src/External-Bin/Net/1.1/log4net.dll | Bin 266240 -> 0 bytes src/External-Bin/Net/1.1/log4net.license.txt | 48 - src/External-Bin/Net/1.1/log4net.xml | 28655 --------------- src/External-Bin/Net/1.1/readme.txt | 8 - src/External-Bin/Net/2.0/Castle.Core.dll | Bin 296960 -> 0 bytes src/External-Bin/Net/2.0/License.txt | 13 - src/External-Bin/Net/2.0/log4net.dll | Bin 270336 -> 0 bytes src/External-Bin/Net/2.0/log4net.license.txt | 48 - src/External-Bin/Net/2.0/log4net.xml | 28655 --------------- src/External-Bin/Net/2.0/readme.txt | 8 - src/External-Bin/Net/4.0/Castle.Core.dll | Bin 299520 -> 0 bytes src/External-Bin/Net/4.0/Castle.Core.xml | 4820 --- .../Net/4.0/Castle.DynamicProxy.dll | Bin 69632 -> 0 bytes ...le.Services.Logging.Log4netIntegration.dll | Bin 24576 -> 0 bytes .../Net/4.0/castle_core_readme.txt | 9 - src/External-Bin/Net/4.0/log4net.dll | Bin 288768 -> 0 bytes src/External-Bin/Net/4.0/log4net.xml | 30205 ---------------- src/External-Bin/Net/4.0/log4net_README.txt | 16 - src/External-Bin/Net/4.0/log4net_license.txt | 201 - .../nunit/2.4.8/nunit.framework.dll | Bin 77824 -> 0 bytes .../nunit/2.5.5.10112/nunit.framework.dll | Bin 131072 -> 0 bytes src/HtmlHelpOverview.html | 29 - src/IBatisNet.2003.sln | 98 - src/IBatisNet.2005.sln | 85 - src/IBatisNet.2010.sln | 58 - .../AssemblyInfo.cs | 9 - ...atisNet.Common.Logging.Log4Net.2005.csproj | 118 - ...atisNet.Common.Logging.Log4Net.2010.csproj | 168 - ...t.Common.Logging.Log4Net.Net35.2010.csproj | 161 - ...atisNet.Common.Logging.Log4Net.Net40.build | 18 - ...t.Common.Logging.Log4Net.Net45.2012.csproj | 163 - .../IBatisNet.Common.Logging.Log4Net.build | 18 - .../IBatisNet.Common.Logging.Log4Net.csproj | 121 - ...BatisNet.Common.Logging.Log4Net_net4.build | 18 - .../Log4NetLogger.cs | 229 - .../Log4NetLoggerFA.cs | 129 - src/IBatisNet.Common.Test/AssemblyInfo.cs | 58 - .../DataBase-Template.config | 16 - src/IBatisNet.Common.Test/DataBase.config | 13 - src/IBatisNet.Common.Test/Domain/Account.cs | 110 - src/IBatisNet.Common.Test/Domain/Address.cs | 18 - .../Domain/BaseDomain.cs | 16 - src/IBatisNet.Common.Test/Domain/Book.cs | 12 - src/IBatisNet.Common.Test/Domain/Document.cs | 24 - .../Domain/DocumentCollection.cs | 61 - .../Domain/GenericDocumentCollection.cs | 10 - src/IBatisNet.Common.Test/Domain/IAddress.cs | 9 - .../Domain/IBaseDomain.cs | 11 - src/IBatisNet.Common.Test/Domain/IUser.cs | 9 - src/IBatisNet.Common.Test/Domain/Item.cs | 21 - src/IBatisNet.Common.Test/Domain/Order.cs | 14 - src/IBatisNet.Common.Test/Domain/Property.cs | 281 - src/IBatisNet.Common.Test/Domain/Simple.cs | 62 - src/IBatisNet.Common.Test/Domain/User.cs | 15 - .../IBatisNet.Common.Test.2005.csproj | 261 - .../IBatisNet.Common.Test.2010.csproj | 301 - .../IBatisNet.Common.Test.Net35.2010.csproj | 299 - .../IBatisNet.Common.Test.Net45.2012.csproj | 303 - .../IBatisNet.Common.Test.build | 90 - .../IBatisNet.Common.Test.csproj | 610 - .../Maps/Access/OleDb/Account.xml | 445 - .../Maps/MSSQL/Odbc/Account.xml | 438 - .../Maps/MSSQL/OleDb/Account.xml | 438 - .../Maps/MSSQL/SqlClient/Account.xml | 483 - .../Maps/MySql/ByteFx/Account.xml | 483 - .../Maps/Oracle/ODP/Account.xml | 561 - .../Maps/Oracle/OracleClient/Account.xml | 521 - .../ConfigWatcher/ConfigWatcherTest.cs | 103 - .../CommonTests/DynamicProxy/IMyInterface.cs | 28 - .../DynamicProxy/IMySecondInterface.cs | 16 - .../DynamicProxy/MyInterfaceImpl.cs | 55 - .../DynamicProxy/MySecondInterfaceImpl.cs | 69 - .../CommonTests/DynamicProxy/ProxyTest.cs | 83 - .../NUnit/CommonTests/Logging/LogTest.cs | 101 - .../Pagination/PaginatedArrayListTest.cs | 237 - .../NUnit/CommonTests/Transaction/BaseTest.cs | 173 - .../Transaction/TransactionTest.cs | 327 - .../CommonTests/Utilities/BaseMemberTest.cs | 977 - .../Utilities/FieldAccessorTest.cs | 211 - .../Utilities/ObjectFactoryTest.cs | 345 - .../Utilities/PropertyAccessorPerformance.cs | 239 - .../Utilities/PropertyAccessorTest.cs | 419 - .../Utilities/ProtectedFieldAccessorTest.cs | 1123 - .../Utilities/PublicFieldAccessorTest.cs | 1057 - .../Utilities/ReflectionInfoTest.cs | 51 - .../CommonTests/Utilities/ResourcesTest.cs | 139 - .../NUnit/CommonTests/Utilities/Timer.cs | 46 - .../CommonTests/Utilities/TypeResolverTest.cs | 128 - .../CommonTests/Utilities/TypeUtilsTest.cs | 88 - src/IBatisNet.Common.Test/ReadMe.txt | 12 - .../Scripts/Access/DataBase.sql | 80 - .../Scripts/Access/DataBaseNHibernate.sql | 16 - .../Scripts/Access/account-init.sql | 17 - .../Scripts/Access/account-procedure.sql | 1 - .../Scripts/Access/category-init.sql | 10 - .../Scripts/Access/category-procedure.sql | 1 - .../Scripts/Access/documents-init.sql | 19 - .../Scripts/Access/enumeration-init.sql | 16 - .../Scripts/Access/line-item-init.sql | 35 - .../Scripts/Access/more-account-records.sql | 6 - .../Scripts/Access/order-init.sql | 30 - .../Scripts/Access/other-init.sql | 10 - .../Scripts/Access/swap-procedure.sql | 1 - .../Scripts/Access/user-init.sql | 12 - .../Scripts/MSSQL/DBCreation.sql | 89 - .../Scripts/MSSQL/DataBase.sql | 179 - .../Scripts/MSSQL/account-init.sql | 45 - .../Scripts/MSSQL/account-procedure.sql | 11 - .../Scripts/MSSQL/category-init.sql | 17 - .../Scripts/MSSQL/category-procedure.sql | 10 - .../Scripts/MSSQL/enumeration-init.sql | 30 - .../Scripts/MSSQL/line-item-init.sql | 53 - .../Scripts/MSSQL/more-account-records.sql | 11 - .../Scripts/MSSQL/order-init.sql | 53 - .../Scripts/MSSQL/other-init.sql | 18 - .../Scripts/MSSQL/swap-procedure.sql | 34 - .../Scripts/MSSQL/user-init.sql | 17 - .../Scripts/MySql/DataBase.sql | 132 - .../Scripts/MySql/account-init.sql | 18 - .../Scripts/MySql/account-procedure.sql | 2 - .../Scripts/MySql/category-init.sql | 12 - .../Scripts/MySql/category-procedure.sql | 2 - .../Scripts/MySql/enumeration-init.sql | 18 - .../Scripts/MySql/line-item-init.sql | 37 - .../Scripts/MySql/more-account-records.sql | 7 - .../Scripts/MySql/order-init.sql | 29 - .../Scripts/MySql/other-init.sql | 13 - .../Scripts/MySql/swap-procedure.sql | 2 - .../Scripts/MySql/user-init.sql | 14 - .../Scripts/Oracle/DataBase.sql | 128 - .../Scripts/Oracle/DataBaseNHibernate.sql | 17 - .../Scripts/Oracle/account-init.sql | 18 - .../Scripts/Oracle/account-procedure.sql | 18 - .../Scripts/Oracle/category-init.sql | 20 - .../Scripts/Oracle/category-procedure.sql | 19 - .../Scripts/Oracle/enumeration-init.sql | 17 - .../Scripts/Oracle/line-item-init.sql | 35 - .../Scripts/Oracle/more-account-records.sql | 6 - .../Scripts/Oracle/order-init.sql | 30 - .../Scripts/Oracle/other-init.sql | 12 - .../Scripts/Oracle/swap-procedure.sql | 62 - .../Scripts/Oracle/user-init.sql | 13 - .../Debug/IBatisNet.Common.Test.dll.config | 94 - .../bin/Debug/OctopusService.dll | Bin 16384 -> 0 bytes .../bin/Debug/SqlMapConfig.xsd | 139 - .../bin/Debug/SqlMap_Access_OleDb.config | 25 - .../bin/Debug/SqlMap_MSSQL_Odbc.config | 26 - .../bin/Debug/SqlMap_MSSQL_OleDb.config | 25 - .../bin/Debug/SqlMap_MSSQL_SqlClient.config | 30 - .../bin/Debug/SqlMap_MySql_ByteFx.config | 27 - .../bin/Debug/SqlMap_Oracle_ODP.config | 30 - .../Debug/SqlMap_Oracle_OracleClient.config | 30 - .../bin/Debug/dao_Access_OleDb.config | 68 - .../bin/Debug/dao_MSSQL_Odbc.config | 59 - .../bin/Debug/dao_MSSQL_OleDb.config | 68 - .../bin/Debug/dao_MSSQL_SqlClient.config | 62 - .../bin/Debug/dao_MySql_ByteFx.config | 64 - .../bin/Debug/dao_Oracle_ODP.config | 61 - .../bin/Debug/dao_Oracle_OracleClient.config | 61 - .../bin/Debug/providers.config | 325 - src/IBatisNet.Common.Test/license.txt | 201 - src/IBatisNet.Common.Test/properties.xml | 9 - src/IBatisNet.Common/AssemblyInfo.cs | 16 - src/IBatisNet.Common/AssemblyKey.snk | Bin 596 -> 0 bytes src/IBatisNet.Common/DataSource.cs | 125 - .../DataSourceDeSerializer.cs | 56 - src/IBatisNet.Common/DbProvider.cs | 673 - .../Exceptions/ConfigurationException.cs | 111 - .../Exceptions/ForeignKeyException.cs | 104 - .../Exceptions/IBatisNetException.cs | 111 - .../Exceptions/ProbeException.cs | 101 - .../IBatisNet.Common.Net40.build | 24 - src/IBatisNet.Common/IBatisNet.Common.build | 24 - .../IBatisNet.Common_net4.build | 24 - src/IBatisNet.Common/IConnectionAdapter.cs | 13 - src/IBatisNet.Common/IDalSession.cs | 192 - src/IBatisNet.Common/IDataSource.cs | 99 - src/IBatisNet.Common/IDbProvider.cs | 273 - .../Logging/ConfigurationSectionHandler.cs | 224 - .../Logging/IDataReaderProxy.cs | 224 - .../Logging/IDbCommandProxy.cs | 80 - .../Logging/IDbConnectionProxy.cs | 133 - src/IBatisNet.Common/Logging/ILog.cs | 261 - .../Logging/ILoggerFactoryAdapter.cs | 66 - .../Logging/Impl/AbstractLogger.cs | 232 - .../Logging/Impl/ConsoleOutLogger.cs | 129 - .../Logging/Impl/ConsoleOutLoggerFA.cs | 108 - .../Logging/Impl/NoOpLogger.cs | 177 - .../Logging/Impl/NoOpLoggerFA.cs | 85 - .../Logging/Impl/TraceLogger.cs | 134 - .../Logging/Impl/TraceLoggerFA.cs | 107 - src/IBatisNet.Common/Logging/LogManager.cs | 204 - src/IBatisNet.Common/Logging/LogSetting.cs | 79 - .../Pagination/IPaginatedList.cs | 138 - .../Pagination/PaginatedArrayList.cs | 504 - src/IBatisNet.Common/ProviderDeSerializer.cs | 77 - .../Transaction/IsolationLevel.cs | 62 - .../Transaction/TransactionOptions.cs | 48 - .../Transaction/TransactionScope.cs | 359 - .../Transaction/TransactionScopeOptions.cs | 60 - .../Utilities/ConfigWatcherHandler.cs | 224 - .../Utilities/DBHelperParameterCache.cs | 262 - .../Utilities/HashCodeProvider.cs | 71 - .../Utilities/Objects/AbstractFactory.cs | 67 - .../Utilities/Objects/ActivatorFactory.cs | 67 - .../Objects/ActivatorObjectFactory.cs | 52 - .../Utilities/Objects/DelegateFactory.cs | 126 - .../Objects/DelegateObjectFactory.cs | 107 - .../Utilities/Objects/EmitObjectFactory.cs | 100 - .../Utilities/Objects/FactoryBuilder.cs | 165 - .../Utilities/Objects/FactoryLogAdapter.cs | 134 - .../Utilities/Objects/IFactory.cs | 48 - .../Utilities/Objects/IObjectFactory.cs | 44 - .../Objects/Members/AccessorFactory.cs | 64 - .../Utilities/Objects/Members/BaseAccessor.cs | 166 - .../Members/DelegateGetFieldAccessor.cs | 133 - .../Members/DelegatePropertyGetAccessor.cs | 150 - .../Members/DelegatePropertySetAccessor.cs | 166 - .../Members/DelegateSetFieldAccessor.cs | 144 - .../Objects/Members/EmitFieldGetAccessor.cs | 200 - .../Objects/Members/EmitFieldSetAccessor.cs | 217 - .../Members/EmitPropertyGetAccessor.cs | 219 - .../Members/EmitPropertySetAccessor.cs | 245 - .../Objects/Members/GetAccessorFactory.cs | 293 - .../Utilities/Objects/Members/IGetAccessor.cs | 39 - .../Utilities/Objects/Members/ISetAccessor.cs | 38 - .../Objects/Members/MemberAccessorFactory.cs | 233 - .../Members/ReflectionFieldGetAccessor.cs | 80 - .../Members/ReflectionFieldSetAccessor.cs | 80 - .../Members/ReflectionPropertyGetAccessor.cs | 100 - .../Members/ReflectionPropertySetAccessor.cs | 98 - .../Objects/Members/SetAccessorFactory.cs | 292 - .../Utilities/Objects/ObjectFactory.cs | 88 - .../Utilities/Objects/ObjectProbe.cs | 740 - .../Utilities/Objects/ReflectionInfo.cs | 342 - .../Utilities/Proxy/CachedProxyGenerator.cs | 144 - .../Utilities/Proxy/ProxyGeneratorFactory.cs | 55 - src/IBatisNet.Common/Utilities/Resources.cs | 643 - .../Utilities/ScriptRunner.cs | 192 - .../Utilities/StringTokenizer.cs | 212 - src/IBatisNet.Common/Utilities/TypeUtils.cs | 256 - .../TypesResolver/CachedTypeResolver.cs | 123 - .../Utilities/TypesResolver/ITypeResolver.cs | 65 - .../Utilities/TypesResolver/TypeRegistry.cs | 454 - .../Utilities/TypesResolver/TypeResolver.cs | 617 - src/IBatisNet.Common/Xml/NodeUtils.cs | 182 - src/IBatisNet.Common/licence.txt | 201 - src/IBatisNet.Common/notice.txt | 13 - src/IBatisNet.Common/provider.xsd | 53 - .../AssemblyInfo.cs | 58 - .../NHibernateDaoSession.cs | 357 - .../NHibernateDaoSessionHandler.cs | 134 - .../IBatisNet.DataAccess.Extensions.build | 28 - .../IBatisNet.DataAccess.Extensions.csproj | 133 - .../license.txt | 201 - .../notice.txt | 13 - src/IBatisNet.DataAccess.Test/AssemblyInfo.cs | 58 - src/IBatisNet.DataAccess.Test/ChangeLog.txt | 5 - .../Dao/Implementations/Ado/AccountDao.cs | 276 - .../Implementations/Ado/MySqlAccountDao.cs | 276 - .../Implementations/Ado/OracleAccountDao.cs | 292 - .../Dao/Implementations/BaseDao.cs | 24 - .../Implementations/DataMapper/AccountDao.cs | 112 - .../Dao/Implementations/NHibernate/UserDao.cs | 68 - .../Dao/Interfaces/IAccountDao.cs | 38 - .../Dao/Interfaces/IuserDao.cs | 24 - .../DataBase-Template.config | 17 - .../Domain/Account.cs | 76 - .../Domain/AccountBis.cs | 15 - .../Domain/AccountCollection.cs | 2362 -- .../Domain/Category.cs | 73 - .../Domain/Complex.cs | 26 - .../Domain/Enumeration.cs | 102 - .../Domain/LineItem.cs | 116 - .../Domain/LineItemCollection.cs | 2171 -- src/IBatisNet.DataAccess.Test/Domain/Order.cs | 204 - src/IBatisNet.DataAccess.Test/Domain/Other.cs | 37 - .../Domain/Search.cs | 63 - src/IBatisNet.DataAccess.Test/Domain/User.cs | 52 - .../IBatisNet.DataAccess.Test.2005.csproj | 327 - .../IBatisNet.DataAccess.Test.2010.csproj | 368 - ...BatisNet.DataAccess.Test.Net35.2010.csproj | 365 - ...BatisNet.DataAccess.Test.Net45.2012.csproj | 373 - .../IBatisNet.DataAccess.Test.build | 96 - .../IBatisNet.DataAccess.Test.csproj | 778 - .../IBatisNet.DataMapper.Test.build | 87 - .../Maps/Access/OleDb/Account.xml | 447 - .../Maps/Access/OleDb/Category.xml | 186 - .../Maps/Access/OleDb/Complex.xml | 16 - .../Maps/Access/OleDb/Document.xml | 61 - .../Maps/Access/OleDb/DynamicAccount.xml | 385 - .../Maps/Access/OleDb/Enumeration.xml | 61 - .../Maps/Access/OleDb/LineItem.xml | 204 - .../Maps/Access/OleDb/Order.xml | 328 - .../Maps/Access/OleDb/Other.xml | 39 - .../Maps/Access/OleDb/ResultClass.xml | 104 - .../Maps/MSSQL/Odbc/Account.xml | 440 - .../Maps/MSSQL/Odbc/Category.xml | 170 - .../Maps/MSSQL/Odbc/Complex.xml | 16 - .../Maps/MSSQL/Odbc/DynamicAccount.xml | 387 - .../Maps/MSSQL/Odbc/Enumeration.xml | 61 - .../Maps/MSSQL/Odbc/LineItem.xml | 191 - .../Maps/MSSQL/Odbc/Order.xml | 323 - .../Maps/MSSQL/Odbc/Other.xml | 39 - .../Maps/MSSQL/OleDb/Account.xml | 439 - .../Maps/MSSQL/OleDb/Category.xml | 217 - .../Maps/MSSQL/OleDb/Complex.xml | 16 - .../Maps/MSSQL/OleDb/DynamicAccount.xml | 385 - .../Maps/MSSQL/OleDb/Enumeration.xml | 61 - .../Maps/MSSQL/OleDb/LineItem.xml | 191 - .../Maps/MSSQL/OleDb/Order.xml | 323 - .../Maps/MSSQL/OleDb/Other.xml | 39 - .../Maps/MSSQL/SqlClient/Account.xml | 485 - .../Maps/MSSQL/SqlClient/Category.xml | 171 - .../Maps/MSSQL/SqlClient/Complex.xml | 16 - .../Maps/MSSQL/SqlClient/DynamicAccount.xml | 387 - .../Maps/MSSQL/SqlClient/Enumeration.xml | 61 - .../Maps/MSSQL/SqlClient/LineItem.xml | 191 - .../Maps/MSSQL/SqlClient/Order.xml | 323 - .../Maps/MSSQL/SqlClient/Other.xml | 39 - .../Maps/MySql/ByteFx/Account.xml | 485 - .../Maps/MySql/ByteFx/Category.xml | 162 - .../Maps/MySql/ByteFx/Complex.xml | 16 - .../Maps/MySql/ByteFx/DynamicAccount.xml | 387 - .../Maps/MySql/ByteFx/Enumeration.xml | 61 - .../Maps/MySql/ByteFx/LineItem.xml | 191 - .../Maps/MySql/ByteFx/Order.xml | 323 - .../Maps/MySql/ByteFx/Other.xml | 39 - .../Maps/Oracle/ODP/Account.xml | 563 - .../Maps/Oracle/ODP/Category.xml | 203 - .../Maps/Oracle/ODP/Complex.xml | 15 - .../Maps/Oracle/ODP/DynamicAccount.xml | 424 - .../Maps/Oracle/ODP/Enumeration.xml | 61 - .../Maps/Oracle/ODP/LineItem.xml | 215 - .../Maps/Oracle/ODP/Order.xml | 323 - .../Maps/Oracle/ODP/Other.xml | 39 - .../Maps/Oracle/OracleClient/Account.xml | 523 - .../Maps/Oracle/OracleClient/Category.xml | 220 - .../Maps/Oracle/OracleClient/Complex.xml | 16 - .../Oracle/OracleClient/DynamicAccount.xml | 432 - .../Maps/Oracle/OracleClient/Enumeration.xml | 61 - .../Maps/Oracle/OracleClient/LineItem.xml | 191 - .../Maps/Oracle/OracleClient/Order.xml | 323 - .../Maps/Oracle/OracleClient/Other.xml | 39 - .../NUnit/DaoTests/ADO/MSSQL/AdoDaoTest.cs | 41 - .../NUnit/DaoTests/ADO/MySql/AdoDaoTest.cs | 40 - .../NUnit/DaoTests/ADO/Oracle/AdoDaoTest.cs | 35 - .../NUnit/DaoTests/BaseDaoTest.cs | 392 - .../NUnit/DaoTests/MutipleDaoTest.cs | 219 - .../NUnit/DaoTests/NHibernateDaoTest.cs | 127 - .../NUnit/DaoTests/SqlMapDaoTest.cs | 39 - src/IBatisNet.DataAccess.Test/ReadMe.txt | 12 - .../Scripts/Access/DataBase.sql | 80 - .../Scripts/Access/DataBaseNHibernate.sql | 16 - .../Scripts/Access/account-init.sql | 17 - .../Scripts/Access/account-procedure.sql | 1 - .../Scripts/Access/category-init.sql | 10 - .../Scripts/Access/category-procedure.sql | 1 - .../Scripts/Access/documents-init.sql | 19 - .../Scripts/Access/enumeration-init.sql | 16 - .../Scripts/Access/line-item-init.sql | 35 - .../Scripts/Access/more-account-records.sql | 6 - .../Scripts/Access/order-init.sql | 30 - .../Scripts/Access/other-init.sql | 10 - .../Scripts/Access/swap-procedure.sql | 1 - .../Scripts/Access/user-init.sql | 12 - .../Scripts/MSSQL/DBCreation.sql | 89 - .../Scripts/MSSQL/DataBase.sql | 179 - .../Scripts/MSSQL/account-init.sql | 47 - .../Scripts/MSSQL/account-procedure.sql | 11 - .../Scripts/MSSQL/category-init.sql | 17 - .../Scripts/MSSQL/category-procedure.sql | 10 - .../Scripts/MSSQL/enumeration-init.sql | 30 - .../Scripts/MSSQL/line-item-init.sql | 53 - .../Scripts/MSSQL/more-account-records.sql | 11 - .../Scripts/MSSQL/order-init.sql | 53 - .../Scripts/MSSQL/other-init.sql | 18 - .../Scripts/MSSQL/swap-procedure.sql | 34 - .../Scripts/MSSQL/user-init.sql | 17 - .../Scripts/MySql/DataBase.sql | 132 - .../Scripts/MySql/account-init.sql | 18 - .../Scripts/MySql/account-procedure.sql | 2 - .../Scripts/MySql/category-init.sql | 12 - .../Scripts/MySql/category-procedure.sql | 2 - .../Scripts/MySql/enumeration-init.sql | 18 - .../Scripts/MySql/line-item-init.sql | 37 - .../Scripts/MySql/more-account-records.sql | 7 - .../Scripts/MySql/order-init.sql | 29 - .../Scripts/MySql/other-init.sql | 13 - .../Scripts/MySql/swap-procedure.sql | 2 - .../Scripts/MySql/user-init.sql | 14 - .../Scripts/Oracle/DataBase.sql | 128 - .../Scripts/Oracle/DataBaseNHibernate.sql | 17 - .../Scripts/Oracle/account-init.sql | 18 - .../Scripts/Oracle/account-procedure.sql | 18 - .../Scripts/Oracle/category-init.sql | 20 - .../Scripts/Oracle/category-procedure.sql | 19 - .../Scripts/Oracle/enumeration-init.sql | 17 - .../Scripts/Oracle/line-item-init.sql | 35 - .../Scripts/Oracle/more-account-records.sql | 6 - .../Scripts/Oracle/order-init.sql | 30 - .../Scripts/Oracle/other-init.sql | 12 - .../Scripts/Oracle/swap-procedure.sql | 62 - .../Scripts/Oracle/user-init.sql | 13 - src/IBatisNet.DataAccess.Test/User.hbm.xml | 13 - .../IBatisNet.DataAccess.Test.dll.config | 98 - .../bin/Debug/SqlMap_Access_OleDb.config | 33 - .../bin/Debug/SqlMap_MSSQL_Odbc.config | 35 - .../bin/Debug/SqlMap_MSSQL_OleDb.config | 33 - .../bin/Debug/SqlMap_MSSQL_SqlClient.config | 38 - .../bin/Debug/SqlMap_MySql_ByteFx.config | 38 - .../bin/Debug/SqlMap_Oracle_ODP.config | 38 - .../Debug/SqlMap_Oracle_OracleClient.config | 38 - .../bin/Debug/dao_Access_OleDb.config | 68 - .../bin/Debug/dao_MSSQL_Odbc.config | 61 - .../bin/Debug/dao_MSSQL_OleDb.config | 68 - .../bin/Debug/dao_MSSQL_SqlClient.config | 69 - .../bin/Debug/dao_Multiple_Context.config | 35 - .../bin/Debug/dao_MySql_ByteFx.config | 65 - .../bin/Debug/dao_Oracle_ODP.config | 60 - .../bin/Debug/dao_Oracle_OracleClient.config | 60 - .../bin/Debug/providers.config | 325 - src/IBatisNet.DataAccess/AssemblyInfo.cs | 35 - src/IBatisNet.DataAccess/ChangeLog.txt | 74 - src/IBatisNet.DataAccess/Configuration/Dao.cs | 184 - .../Configuration/DaoProxy.cs | 185 - .../Configuration/DaoSessionHandler.cs | 133 - .../Configuration/DomDaoManagerBuilder.cs | 854 - .../Serializers/DaoDeSerializer.cs | 59 - .../DaoSessionHandlerDeSerializer.cs | 60 - src/IBatisNet.DataAccess/DaoConfig.xsd | 115 - src/IBatisNet.DataAccess/DaoManager.cs | 630 - src/IBatisNet.DataAccess/DaoSession.cs | 247 - .../DaoSessionHandlers/SimpleDaoSession.cs | 537 - .../SimpleDaoSessionHandler.cs | 84 - .../DaoSessionHandlers/SqlMapDaoSession.cs | 309 - .../SqlMapDaoSessionHandler.cs | 137 - .../Exceptions/DataAccessException.cs | 109 - .../IBatisNet.DataAccess.2005.csproj | 182 - .../IBatisNet.DataAccess.2010.csproj | 220 - .../IBatisNet.DataAccess.Net35.2010.csproj | 220 - .../IBatisNet.DataAccess.Net45.2012.csproj | 221 - .../IBatisNet.DataAccess.build | 28 - .../IBatisNet.DataAccess.csproj | 271 - src/IBatisNet.DataAccess/IDaoManager.cs | 143 - src/IBatisNet.DataAccess/Interfaces/IDao.cs | 38 - .../Interfaces/IDaoSessionHandler.cs | 56 - src/IBatisNet.DataAccess/MessageManager.cs | 134 - .../Scope/ConfigurationScope.cs | 174 - .../Scope/ErrorContext.cs | 166 - src/IBatisNet.DataAccess/SessionHolder.cs | 109 - .../SessionStore/AbstractSessionStore.cs | 70 - .../SessionStore/CallContextSessionStore.cs | 72 - .../HybridWebThreadSessionStore.cs | 102 - .../SessionStore/ISessionStore.cs | 55 - .../SessionStore/SessionStoreFactory .cs | 58 - .../SessionStore/WebSessionStore.cs | 90 - src/IBatisNet.DataAccess/licence.txt | 201 - src/IBatisNet.DataAccess/notice.txt | 13 - src/IBatisNet.DataMapper.Test/AssemblyInfo.cs | 58 - .../DataBase-Template.config | 23 - src/IBatisNet.DataMapper.Test/Domain/A.cs | 46 - .../Domain/Account.cs | 150 - .../Domain/AccountBis.cs | 15 - .../Domain/AccountCollection.cs | 64 - .../Domain/Address.cs | 20 - .../Domain/Application.cs | 47 - src/IBatisNet.DataMapper.Test/Domain/B.cs | 40 - src/IBatisNet.DataMapper.Test/Domain/Book.cs | 18 - src/IBatisNet.DataMapper.Test/Domain/C.cs | 25 - .../Domain/Category.cs | 60 - src/IBatisNet.DataMapper.Test/Domain/Child.cs | 35 - .../Domain/Complex.cs | 26 - .../Domain/Coupon.cs | 45 - .../Domain/CustomInheritance.cs | 51 - src/IBatisNet.DataMapper.Test/Domain/D.cs | 25 - .../Domain/Document.cs | 32 - .../Domain/DocumentCollection.cs | 51 - src/IBatisNet.DataMapper.Test/Domain/E.cs | 25 - .../Domain/Enumeration.cs | 116 - src/IBatisNet.DataMapper.Test/Domain/F.cs | 25 - .../Domain/GuidStringTypeHandlerCallback.cs | 51 - .../Domain/HundredsTypeHandlerCallback.cs | 73 - .../Domain/ImmutableCategory.cs | 34 - .../ImmutableCategoryPropertyContainer.cs | 19 - src/IBatisNet.DataMapper.Test/Domain/Item.cs | 34 - .../Domain/LineItem.cs | 124 - .../Domain/LineItemCollection.cs | 73 - .../Domain/LineItemCollection2.cs | 22 - .../Domain/Newspaper.cs | 18 - .../Domain/Nullable.cs | 216 - .../Domain/OneZeroBoolTypeHandlerCallback.cs | 69 - src/IBatisNet.DataMapper.Test/Domain/Order.cs | 234 - src/IBatisNet.DataMapper.Test/Domain/Other.cs | 37 - .../Domain/OuiNonBoolTypeHandlerCallback.cs | 73 - .../Domain/Parent.cs | 37 - .../Domain/Petshop/Category.cs | 64 - .../Domain/Petshop/Item.cs | 81 - .../Domain/Petshop/Product.cs | 76 - .../Domain/Product.cs | 32 - src/IBatisNet.DataMapper.Test/Domain/Query.cs | 18 - src/IBatisNet.DataMapper.Test/Domain/Role.cs | 20 - .../Domain/Sample.cs | 167 - .../Domain/Search.cs | 63 - .../Domain/Simple.cs | 63 - src/IBatisNet.DataMapper.Test/Domain/User.cs | 54 - .../Domain/VarcharCallBack.cs | 9 - .../IBatisNet.DataMapper.Test.2005.csproj | 543 - .../IBatisNet.DataMapper.Test.2010.csproj | 583 - ...BatisNet.DataMapper.Test.Net35.2010.csproj | 576 - ...BatisNet.DataMapper.Test.Net45.2012.csproj | 676 - .../IBatisNet.DataMapper.Test.build | 103 - .../IBatisNet.DataMapper.Test.csproj | 1315 - .../IBatisNet.Test.build | 87 - .../Maps/Access/OleDb/Account.xml | 539 - .../Maps/Access/OleDb/Category.xml | 205 - .../Maps/Access/OleDb/Complex.xml | 24 - .../Maps/Access/OleDb/Document.xml | 70 - .../Maps/Access/OleDb/DynamicAccount.xml | 500 - .../Maps/Access/OleDb/Enumeration.xml | 60 - .../Maps/Access/OleDb/LineItem.xml | 203 - .../Maps/Access/OleDb/Nullable.xml | 55 - .../Maps/Access/OleDb/Order.xml | 461 - .../Maps/Access/OleDb/Other.xml | 170 - .../Maps/Access/OleDb/ParameterClass.xml | 14 - .../Maps/Access/OleDb/ResultClass.xml | 128 - .../Maps/MSSQL/Odbc/Account.xml | 610 - .../Maps/MSSQL/Odbc/Category.xml | 208 - .../Maps/MSSQL/Odbc/Complex.xml | 24 - .../Maps/MSSQL/Odbc/Document.xml | 70 - .../Maps/MSSQL/Odbc/DynamicAccount.xml | 501 - .../Maps/MSSQL/Odbc/Enumeration.xml | 60 - .../Maps/MSSQL/Odbc/LineItem.xml | 207 - .../Maps/MSSQL/Odbc/Nullable.xml | 79 - .../Maps/MSSQL/Odbc/Order.xml | 669 - .../Maps/MSSQL/Odbc/Other.xml | 167 - .../Maps/MSSQL/Odbc/ParameterClass.xml | 14 - .../Maps/MSSQL/Odbc/ResultClass.xml | 129 - .../Maps/MSSQL/Odbc/Simple.xml | 38 - .../Maps/MSSQL/OleDb/Account.xml | 606 - .../Maps/MSSQL/OleDb/Category.xml | 255 - .../Maps/MSSQL/OleDb/Complex.xml | 24 - .../Maps/MSSQL/OleDb/DynamicAccount.xml | 502 - .../Maps/MSSQL/OleDb/Enumeration.xml | 60 - .../Maps/MSSQL/OleDb/LineItem.xml | 207 - .../Maps/MSSQL/OleDb/Nullable.xml | 79 - .../Maps/MSSQL/OleDb/Order.xml | 668 - .../Maps/MSSQL/OleDb/Other.xml | 178 - .../Maps/MSSQL/OleDb/ParameterClass.xml | 14 - .../Maps/MSSQL/OleDb/ResultClass.xml | 130 - .../Maps/MSSQL/OleDb/Simple.xml | 38 - .../Maps/MSSQL/OleDb/document.xml | 70 - .../Maps/MSSQL/SqlClient/Account.xml | 872 - .../Maps/MSSQL/SqlClient/Category.xml | 230 - .../Maps/MSSQL/SqlClient/Complex.xml | 25 - .../MSSQL/SqlClient/ConstructorInjection.xml | 35 - .../Maps/MSSQL/SqlClient/Coupons.xml | 65 - .../Maps/MSSQL/SqlClient/Document.xml | 82 - .../Maps/MSSQL/SqlClient/DynamicAccount.xml | 531 - .../Maps/MSSQL/SqlClient/EmbedParameter.xml | 366 - .../Maps/MSSQL/SqlClient/Enumeration.xml | 61 - .../Maps/MSSQL/SqlClient/GroupByMapping.xml | 225 - .../Maps/MSSQL/SqlClient/LineItem.xml | 235 - .../Maps/MSSQL/SqlClient/MapModule.xml | 8 - .../Maps/MSSQL/SqlClient/Module/Order2.xml | 29 - .../Maps/MSSQL/SqlClient/NewsPaper.xml | 23 - .../Maps/MSSQL/SqlClient/Nullable.xml | 81 - .../Maps/MSSQL/SqlClient/Order.xml | 946 - .../Maps/MSSQL/SqlClient/Other.xml | 171 - .../Maps/MSSQL/SqlClient/ParameterClass.xml | 14 - .../Maps/MSSQL/SqlClient/ParentChild1.xml | 41 - .../Maps/MSSQL/SqlClient/ParentChild2.xml | 35 - .../Maps/MSSQL/SqlClient/ResultClass.xml | 130 - .../Maps/MSSQL/SqlClient/Simple.xml | 38 - .../Maps/MySql/ByteFx/Account.xml | 619 - .../Maps/MySql/ByteFx/Category.xml | 168 - .../Maps/MySql/ByteFx/Complex.xml | 24 - .../Maps/MySql/ByteFx/Document.xml | 70 - .../Maps/MySql/ByteFx/DynamicAccount.xml | 502 - .../Maps/MySql/ByteFx/Enumeration.xml | 60 - .../Maps/MySql/ByteFx/LineItem.xml | 198 - .../Maps/MySql/ByteFx/Nullable.xml | 55 - .../Maps/MySql/ByteFx/Order.xml | 473 - .../Maps/MySql/ByteFx/Other.xml | 170 - .../Maps/MySql/ByteFx/ParameterClass.xml | 14 - .../Maps/MySql/ByteFx/ResultClass.xml | 134 - .../Maps/MySql/MySql/Account.xml | 619 - .../Maps/MySql/MySql/Category.xml | 168 - .../Maps/MySql/MySql/Complex.xml | 24 - .../Maps/MySql/MySql/Document.xml | 70 - .../Maps/MySql/MySql/DynamicAccount.xml | 504 - .../Maps/MySql/MySql/Enumeration.xml | 60 - .../Maps/MySql/MySql/LineItem.xml | 198 - .../Maps/MySql/MySql/Nullable.xml | 55 - .../Maps/MySql/MySql/Order.xml | 472 - .../Maps/MySql/MySql/Other.xml | 169 - .../Maps/MySql/MySql/ParameterClass.xml | 29 - .../Maps/MySql/MySql/ResultClass.xml | 134 - .../Maps/MySql/MySql/Simple.xml | 38 - .../Maps/Oracle/ODP/Account.xml | 729 - .../Maps/Oracle/ODP/Category.xml | 238 - .../Maps/Oracle/ODP/Complex.xml | 23 - .../Maps/Oracle/ODP/Document.xml | 70 - .../Maps/Oracle/ODP/DynamicAccount.xml | 541 - .../Maps/Oracle/ODP/Enumeration.xml | 60 - .../Maps/Oracle/ODP/LineItem.xml | 214 - .../Maps/Oracle/ODP/Nullable.xml | 55 - .../Maps/Oracle/ODP/Order.xml | 475 - .../Maps/Oracle/ODP/Other.xml | 191 - .../Maps/Oracle/ODP/ParameterClass.xml | 14 - .../Maps/Oracle/ODP/ResultClass.xml | 157 - .../Maps/Oracle/ODP/Simple.xml | 38 - .../Maps/Oracle/OracleClient/Account.xml | 701 - .../Maps/Oracle/OracleClient/Category.xml | 238 - .../Maps/Oracle/OracleClient/Complex.xml | 23 - .../Maps/Oracle/OracleClient/Document.xml | 70 - .../Oracle/OracleClient/DynamicAccount.xml | 549 - .../Maps/Oracle/OracleClient/Enumeration.xml | 60 - .../Maps/Oracle/OracleClient/LineItem.xml | 205 - .../Maps/Oracle/OracleClient/Nullable.xml | 55 - .../Maps/Oracle/OracleClient/Order.xml | 457 - .../Maps/Oracle/OracleClient/Other.xml | 170 - .../Oracle/OracleClient/ParameterClass.xml | 14 - .../Maps/Oracle/OracleClient/ResultClass.xml | 128 - .../Maps/Oracle/OracleClient/Simple.xml | 38 - .../Maps/PostgreSQL/Npgsql/Account.xml | 651 - .../Maps/PostgreSQL/Npgsql/Category.xml | 196 - .../Maps/PostgreSQL/Npgsql/Complex.xml | 24 - .../Maps/PostgreSQL/Npgsql/Document.xml | 70 - .../Maps/PostgreSQL/Npgsql/DynamicAccount.xml | 501 - .../Maps/PostgreSQL/Npgsql/Enumeration.xml | 60 - .../Maps/PostgreSQL/Npgsql/LineItem.xml | 199 - .../Maps/PostgreSQL/Npgsql/Nullable.xml | 81 - .../Maps/PostgreSQL/Npgsql/Order.xml | 638 - .../Maps/PostgreSQL/Npgsql/Other.xml | 167 - .../Maps/PostgreSQL/Npgsql/ParameterClass.xml | 14 - .../Maps/PostgreSQL/Npgsql/ResultClass.xml | 128 - .../Maps/PostgreSQL/Npgsql/Simple.xml | 38 - .../Maps/SQLite3/Account.xml | 872 - .../Maps/SQLite3/Category.xml | 230 - .../Maps/SQLite3/Complex.xml | 25 - .../Maps/SQLite3/ConstructorInjection.xml | 35 - .../Maps/SQLite3/Coupons.xml | 65 - .../Maps/SQLite3/Document.xml | 82 - .../Maps/SQLite3/DynamicAccount.xml | 531 - .../Maps/SQLite3/EmbedParameter.xml | 366 - .../Maps/SQLite3/Enumeration.xml | 61 - .../Maps/SQLite3/GroupByMapping.xml | 225 - .../Maps/SQLite3/LineItem.xml | 235 - .../Maps/SQLite3/MapModule.xml | 8 - .../Maps/SQLite3/Module/Order2.xml | 29 - .../Maps/SQLite3/NewsPaper.xml | 23 - .../Maps/SQLite3/Nullable.xml | 81 - .../Maps/SQLite3/Order.xml | 946 - .../Maps/SQLite3/Other.xml | 171 - .../Maps/SQLite3/ParameterClass.xml | 14 - .../Maps/SQLite3/ParentChild1.xml | 41 - .../Maps/SQLite3/ParentChild2.xml | 35 - .../Maps/SQLite3/ResultClass.xml | 130 - .../Maps/SQLite3/Simple.xml | 38 - .../NUnit/SqlMapTests/BaseTest.cs | 287 - .../CacheController/CacheModelTest.cs | 106 - .../FifoCacheControllerTest.cs | 19 - .../CacheController/LruCacheControllerTest.cs | 89 - .../MemoryCacheControllerTest.cs | 25 - .../NUnit/SqlMapTests/CacheKeyTest.cs | 86 - .../NUnit/SqlMapTests/CacheTest.cs | 552 - .../NUnit/SqlMapTests/ComplexTypeTest.cs | 81 - .../NUnit/SqlMapTests/ConfigureTest.cs | 499 - .../NUnit/SqlMapTests/ConstructorTest.cs | 271 - .../NUnit/SqlMapTests/DynamicPrependTest.cs | 474 - .../NUnit/SqlMapTests/DynamicTest.cs | 456 - .../SqlMapTests/Generics/GenericListTests.txt | 88 - .../SqlMapTests/Generics/NullableTest.cs | 552 - .../SqlMapTests/Generics/ResultClassTest.cs | 177 - .../SqlMapTests/Generics/ResultMapTest.cs | 202 - .../SqlMapTests/Generics/StatementTest.cs | 619 - .../NUnit/SqlMapTests/GroupByTest.cs | 275 - .../NUnit/SqlMapTests/InheritanceTest.cs | 172 - .../SqlMapTests/MSSQL/EmbedParameterTest.cs | 250 - .../MSSQL/Generics/StatementTest.cs | 212 - .../NUnit/SqlMapTests/MSSQL/ProcedureTest.cs | 239 - .../SqlMapTests/MSSQL/StatementGenerate.cs | 148 - .../NUnit/SqlMapTests/MSSQL/StatementTest.cs | 221 - .../NUnit/SqlMapTests/ModuleTest.cs | 69 - .../NUnit/SqlMapTests/MultipleResultTest.cs | 136 - .../SqlMapTests/MySql/StatementGenerate.cs | 148 - .../NUnit/SqlMapTests/MySql/StatementTest.cs | 130 - .../NUnit/SqlMapTests/Oracle/ProcedureTest.cs | 162 - .../SqlMapTests/Oracle/StatementGenerate.cs | 154 - .../NUnit/SqlMapTests/Oracle/StatementTest.cs | 129 - .../NUnit/SqlMapTests/ParameterClass.cs | 28 - .../NUnit/SqlMapTests/ParameterMapTest.cs | 372 - .../NUnit/SqlMapTests/Perf/PerformanceTest.cs | 521 - .../PostgreSQL/StatementGenerate.cs | 148 - .../SqlMapTests/PostgreSQL/StatementTest.cs | 130 - .../NUnit/SqlMapTests/ResultClassTest.cs | 342 - .../NUnit/SqlMapTests/ResultMapTest.cs | 550 - .../SqlMapTests/StatementNamespaceTest.cs | 98 - .../NUnit/SqlMapTests/StatementTest.cs | 1513 - .../NUnit/SqlMapTests/ThreadTest.cs | 151 - .../NUnit/SqlMapTests/TransactionTest.cs | 216 - src/IBatisNet.DataMapper.Test/ReadMe.txt | 24 - .../Scripts/Access/DataBase.sql | 80 - .../Scripts/Access/DataBaseNHibernate.sql | 16 - .../Scripts/Access/account-init.sql | 17 - .../Scripts/Access/account-procedure.sql | 1 - .../Scripts/Access/category-init.sql | 10 - .../Scripts/Access/category-procedure.sql | 1 - .../Scripts/Access/documents-init.sql | 19 - .../Scripts/Access/enumeration-init.sql | 16 - .../Scripts/Access/line-item-init.sql | 35 - .../Scripts/Access/more-account-records.sql | 6 - .../Scripts/Access/order-init.sql | 30 - .../Scripts/Access/other-init.sql | 12 - .../Scripts/Access/swap-procedure.sql | 1 - .../Scripts/Access/teardown.sql | 0 .../Scripts/Access/user-init.sql | 12 - .../Scripts/MSSQL/DBCreation.sql | 89 - .../Scripts/MSSQL/DataBase.sql | 179 - .../Scripts/MSSQL/Nullable-init.sql | 26 - .../Scripts/MSSQL/README-embed-param.txt | 8 - .../Scripts/MSSQL/account-init.sql | 52 - .../Scripts/MSSQL/account-procedure.sql | 12 - .../Scripts/MSSQL/category-init.sql | 24 - .../Scripts/MSSQL/category-procedure.sql | 10 - .../MSSQL/category-procedureWithReturn.sql | 12 - .../Scripts/MSSQL/child-parent-init.sql | 33 - .../Scripts/MSSQL/coupons-init.sql | 42 - .../Scripts/MSSQL/documents-init.sql | 35 - .../Scripts/MSSQL/embed-param-setup-init.sql | 94 - .../Scripts/MSSQL/embed-param-test-init.sql | 32 - .../Scripts/MSSQL/enumeration-init.sql | 31 - .../Scripts/MSSQL/groupby-init.sql | 25 - .../Scripts/MSSQL/groupby-schema.sql | 174 - .../Scripts/MSSQL/line-item-init.sql | 56 - .../Scripts/MSSQL/more-account-records.sql | 11 - .../Scripts/MSSQL/order-init.sql | 54 - .../Scripts/MSSQL/other-init.sql | 145 - .../Scripts/MSSQL/petstore-drop.sql | 52 - .../Scripts/MSSQL/petstore-init.sql | 88 - .../Scripts/MSSQL/petstore-schema.sql | 159 - .../Scripts/MSSQL/ps_SelectAccount.sql | 10 - .../Scripts/MSSQL/ps_SelectAllAccount.sql | 8 - .../Scripts/MSSQL/ps_SelectByIdList.sql | 19 - .../Scripts/MSSQL/ps_SelectLineItem.sql | 9 - .../Scripts/MSSQL/simple-init.sql | 18 - .../Scripts/MSSQL/swap-procedure.sql | 34 - .../Scripts/MSSQL/teardown.sql | 0 .../Scripts/MSSQL/user-init.sql | 23 - .../Scripts/MySql/DataBase.sql | 214 - .../Scripts/MySql/account-init.sql | 20 - .../Scripts/MySql/account-procedure.sql | 2 - .../Scripts/MySql/category-init.sql | 12 - .../Scripts/MySql/category-procedure.sql | 2 - .../Scripts/MySql/documents-init.sql | 20 - .../Scripts/MySql/enumeration-init.sql | 18 - .../Scripts/MySql/line-item-init.sql | 37 - .../Scripts/MySql/more-account-records.sql | 7 - .../Scripts/MySql/order-init.sql | 30 - .../Scripts/MySql/other-init.sql | 91 - .../Scripts/MySql/simple-init.sql | 14 - .../Scripts/MySql/swap-procedure.sql | 2 - .../Scripts/MySql/teardown.sql | 0 .../Scripts/MySql/user-init.sql | 14 - .../Scripts/Oracle/DataBase.sql | 305 - .../Scripts/Oracle/DataBaseNHibernate.sql | 17 - .../Scripts/Oracle/Nullable-init.sql | 30 - .../Scripts/Oracle/account-init.sql | 20 - .../Scripts/Oracle/account-procedure.sql | 24 - .../Oracle/account-refcursor-package-body.sql | 48 - .../Oracle/account-refcursor-package-spec.sql | 8 - .../Scripts/Oracle/category-init.sql | 20 - .../Scripts/Oracle/category-procedure.sql | 19 - .../Scripts/Oracle/documents-init.sql | 20 - .../Scripts/Oracle/enumeration-init.sql | 17 - .../Scripts/Oracle/line-item-init.sql | 35 - .../Scripts/Oracle/more-account-records.sql | 6 - .../Scripts/Oracle/order-init.sql | 31 - .../Scripts/Oracle/other-init.sql | 111 - .../Scripts/Oracle/simple-init.sql | 14 - .../Scripts/Oracle/swap-procedure.sql | 62 - .../Scripts/Oracle/teardown.sql | 0 .../Scripts/Oracle/user-init.sql | 13 - .../Scripts/PostgreSQL/DataBase.sql | 195 - .../Scripts/PostgreSQL/account-init.sql | 19 - .../Scripts/PostgreSQL/account-procedure.sql | 1 - .../Scripts/PostgreSQL/category-init.sql | 11 - .../Scripts/PostgreSQL/category-procedure.sql | 1 - .../Scripts/PostgreSQL/documents-init.sql | 20 - .../Scripts/PostgreSQL/enumeration-init.sql | 17 - .../Scripts/PostgreSQL/line-item-init.sql | 36 - .../PostgreSQL/more-account-records.sql | 6 - .../Scripts/PostgreSQL/nullable-init.sql | 20 - .../Scripts/PostgreSQL/order-init.sql | 32 - .../Scripts/PostgreSQL/other-init.sql | 69 - .../Scripts/PostgreSQL/simple-init.sql | 13 - .../Scripts/PostgreSQL/swap-procedure.sql | 1 - .../Scripts/PostgreSQL/teardown.sql | 0 .../Scripts/PostgreSQL/user-init.sql | 13 - .../Scripts/SQLite3/DBCreation.sql | 89 - .../Scripts/SQLite3/DataBase.sql | 179 - .../Scripts/SQLite3/Nullable-init.sql | 26 - .../Scripts/SQLite3/README-embed-param.txt | 8 - .../Scripts/SQLite3/account-init.sql | 13 - .../Scripts/SQLite3/account-procedure.sql | 1 - .../Scripts/SQLite3/category-init.sql | 6 - .../Scripts/SQLite3/category-procedure.sql | 10 - .../SQLite3/category-procedureWithReturn.sql | 12 - .../Scripts/SQLite3/child-parent-init.sql | 33 - .../Scripts/SQLite3/coupons-init.sql | 42 - .../Scripts/SQLite3/documents-init.sql | 35 - .../SQLite3/embed-param-setup-init.sql | 94 - .../Scripts/SQLite3/embed-param-test-init.sql | 32 - .../Scripts/SQLite3/enumeration-init.sql | 31 - .../Scripts/SQLite3/groupby-init.sql | 25 - .../Scripts/SQLite3/groupby-schema.sql | 174 - .../Scripts/SQLite3/line-item-init.sql | 29 - .../Scripts/SQLite3/more-account-records.sql | 11 - .../Scripts/SQLite3/order-init.sql | 25 - .../Scripts/SQLite3/other-init.sql | 145 - .../Scripts/SQLite3/petstore-drop.sql | 52 - .../Scripts/SQLite3/petstore-init.sql | 88 - .../Scripts/SQLite3/petstore-schema.sql | 159 - .../Scripts/SQLite3/ps_SelectAccount.sql | 10 - .../Scripts/SQLite3/ps_SelectAllAccount.sql | 8 - .../Scripts/SQLite3/ps_SelectByIdList.sql | 19 - .../Scripts/SQLite3/ps_SelectLineItem.sql | 9 - .../Scripts/SQLite3/simple-init.sql | 9 - .../Scripts/SQLite3/swap-procedure.sql | 34 - .../Scripts/SQLite3/teardown.sql | 5 - .../Scripts/SQLite3/user-init.sql | 23 - .../IBatisNet.DataMapper.Test.dll.config | 126 - .../bin/Debug/SqlMap_Access_OleDb.config | 42 - .../bin/Debug/SqlMap_MSSQL_Odbc.config | 49 - .../bin/Debug/SqlMap_MSSQL_OleDb.config | 48 - .../bin/Debug/SqlMap_MSSQL_SqlClient.config | 69 - .../bin/Debug/SqlMap_MySql_ByteFx.config | 48 - .../bin/Debug/SqlMap_MySql_MySql.config | 49 - .../bin/Debug/SqlMap_Oracle_ODP.config | 51 - .../Debug/SqlMap_Oracle_OracleClient.config | 55 - .../bin/Debug/SqlMap_PostgreSQL_Npgsql.config | 55 - .../bin/Debug/SqlMap_SQLite3_SQLite3.config | 67 - .../bin/Debug/cool.jpg | Bin 1139 -> 0 bytes .../bin/Debug/providers.config | 326 - .../bin/Debug/test.config | 0 src/IBatisNet.DataMapper.Test/cool.jpg | Bin 1139 -> 0 bytes src/IBatisNet.DataMapper/AssemblyInfo.cs | 15 - src/IBatisNet.DataMapper/AssemblyKey.snk | Bin 596 -> 0 bytes src/IBatisNet.DataMapper/ChangeLog.txt | 414 - .../Commands/DataReaderDecorator.cs | 450 - .../Commands/DataReaderTransformer.cs | 56 - .../Commands/DbCommandDecorator.cs | 223 - .../Commands/DefaultPreparedCommand.cs | 242 - .../Commands/EmbedParamsPreparedCommand.cs | 227 - .../Commands/IPreparedCommand.cs | 54 - .../Commands/InMemoryDataReader.cs | 652 - .../Commands/PreparedCommandFactory.cs | 60 - .../Configuration/Alias/TypeAlias.cs | 132 - .../Configuration/Alias/TypeHandler.cs | 120 - .../Configuration/Cache/CacheKey.cs | 154 - .../Configuration/Cache/CacheModel.cs | 410 - .../Cache/Fifo/FifoCacheController.cs | 125 - .../Configuration/Cache/FlushInterval.cs | 167 - .../Configuration/Cache/ICacheController.cs | 75 - .../Cache/Lru/LruCacheController.cs | 126 - .../Cache/Memory/MemoryCacheControler.cs | 172 - .../Cache/Memory/MemoryCacheLevel.cs | 126 - .../Configuration/DomSqlMapBuilder.cs | 2009 - .../InlineParameterMapParser.cs | 379 - .../ParameterMapping/ParameterMap.cs | 364 - .../ParameterMapping/ParameterProperty.cs | 408 - .../ParameterPropertyCollection.cs | 252 - .../ResultMapping/ArgumentProperty.cs | 244 - .../ResultMapping/AutoResultMap.cs | 245 - .../ResultMapping/Discriminator.cs | 231 - .../ResultMapping/DynamicResultMap.cs | 203 - .../Configuration/ResultMapping/IColumn.cs | 55 - .../Configuration/ResultMapping/IResultMap.cs | 121 - .../ResultMapping/NullResultMap.cs | 173 - .../Configuration/ResultMapping/ResultMap.cs | 522 - .../ResultMapping/ResultMapCollection.cs | 263 - .../ResultMapping/ResultProperty.cs | 619 - .../ResultMapping/ResultPropertyCollection.cs | 286 - .../Configuration/ResultMapping/SubMap.cs | 116 - .../ArgumentPropertyDeSerializer.cs | 66 - .../Serializers/CacheModelDeSerializer.cs | 79 - .../Serializers/DeSerializerFactory.cs | 74 - .../Serializers/DeleteDeSerializer.cs | 81 - .../Serializers/DiscriminatorDeSerializer.cs | 63 - .../Serializers/DynamicDeSerializer.cs | 74 - .../Serializers/IDeSerializer.cs | 46 - .../Serializers/InsertDeSerializer.cs | 101 - .../Serializers/IsEmptyDeSerializer.cs | 76 - .../Serializers/IsEqualDeSerializer.cs | 79 - .../Serializers/IsGreaterEqualDeSerializer.cs | 76 - .../Serializers/IsGreaterThanDeSerializer.cs | 76 - .../Serializers/IsLessEqualDeSerializer.cs | 75 - .../Serializers/IsLessThanDeSerializer.cs | 77 - .../Serializers/IsNotEmptyDeSerializer.cs | 74 - .../Serializers/IsNotEqualDeSerializer.cs | 79 - .../Serializers/IsNotNullDeSerializer.cs | 74 - .../IsNotParameterPresentDeSerializer.cs | 74 - .../IsNotPropertyAvailableDeSerializer.cs | 74 - .../Serializers/IsNullDeSerializer.cs | 74 - .../IsParameterPresentDeSerializer.cs | 73 - .../IsPropertyAvailableDeSerializer.cs | 75 - .../Serializers/IterateSerializer.cs | 78 - .../Serializers/ParameterMapDeSerializer.cs | 68 - .../ParameterPropertyDeSerializer.cs | 69 - .../Serializers/ProcedureDeSerializer.cs | 65 - .../Serializers/ResultMapDeSerializer.cs | 60 - .../Serializers/ResultPropertyDeSerializer.cs | 67 - .../Serializers/SelectDeSerializer.cs | 81 - .../Serializers/SqlDeSerializer.cs | 69 - .../Serializers/StatementDeSerializer.cs | 67 - .../Serializers/SubMapDeSerializer.cs | 58 - .../Serializers/TypeAliasDeSerializer.cs | 65 - .../Serializers/TypeHandlerDeSerializer.cs | 93 - .../Serializers/UpdateDeSerializer.cs | 80 - .../Configuration/Sql/Dynamic/DynamicSql.cs | 310 - .../Sql/Dynamic/Elements/BaseTag.cs | 72 - .../Sql/Dynamic/Elements/Conditional.cs | 86 - .../Sql/Dynamic/Elements/Dynamic.cs | 54 - .../Sql/Dynamic/Elements/IDynamicParent.cs | 46 - .../Sql/Dynamic/Elements/IsEmpty.cs | 54 - .../Sql/Dynamic/Elements/IsEqual.cs | 51 - .../Sql/Dynamic/Elements/IsGreaterEqual.cs | 51 - .../Sql/Dynamic/Elements/IsGreaterThan.cs | 51 - .../Sql/Dynamic/Elements/IsLessEqual.cs | 51 - .../Sql/Dynamic/Elements/IsLessThan.cs | 51 - .../Sql/Dynamic/Elements/IsNotEmpty.cs | 52 - .../Sql/Dynamic/Elements/IsNotEqual.cs | 52 - .../Sql/Dynamic/Elements/IsNotNull.cs | 51 - .../Dynamic/Elements/IsNotParameterPresent.cs | 51 - .../Elements/IsNotPropertyAvailable.cs | 51 - .../Sql/Dynamic/Elements/IsNull.cs | 49 - .../Dynamic/Elements/IsParameterPresent.cs | 51 - .../Dynamic/Elements/IsPropertyAvailable.cs | 51 - .../Sql/Dynamic/Elements/Iterate.cs | 116 - .../Sql/Dynamic/Elements/SqlTag.cs | 145 - .../Sql/Dynamic/Handlers/BaseTagHandler.cs | 153 - .../Dynamic/Handlers/ConditionalTagHandler.cs | 281 - .../Sql/Dynamic/Handlers/DynamicTagHandler.cs | 70 - .../Sql/Dynamic/Handlers/ISqlTagHandler.cs | 79 - .../Sql/Dynamic/Handlers/IsEmptyTagHandler.cs | 97 - .../Sql/Dynamic/Handlers/IsEqualTagHandler.cs | 66 - .../Handlers/IsGreaterEqualTagHandler.cs | 68 - .../Handlers/IsGreaterThanTagHandler.cs | 61 - .../Dynamic/Handlers/IsLessEqualTagHandler.cs | 62 - .../Dynamic/Handlers/IsLessThanTagHandler.cs | 62 - .../Dynamic/Handlers/IsNotEmptyTagHandler.cs | 60 - .../Dynamic/Handlers/IsNotEqualTagHandler.cs | 60 - .../Dynamic/Handlers/IsNotNullTagHandler.cs | 61 - .../IsNotParameterPresentTagHandler.cs | 61 - .../IsNotPropertyAvailableTagHandler.cs | 61 - .../Sql/Dynamic/Handlers/IsNullTagHandler.cs | 77 - .../Handlers/IsParameterPresentTagHandler.cs | 61 - .../Handlers/IsPropertyAvailableTagHandler.cs | 71 - .../Sql/Dynamic/Handlers/IterateContext.cs | 199 - .../Sql/Dynamic/Handlers/IterateTagHandler.cs | 197 - .../Sql/Dynamic/Handlers/SqlTagContext.cs | 169 - .../Configuration/Sql/Dynamic/ISqlChild.cs | 40 - .../Configuration/Sql/Dynamic/SqlText.cs | 96 - .../Configuration/Sql/ISql.cs | 54 - .../Sql/SimpleDynamic/SimpleDynamicSql.cs | 212 - .../Configuration/Sql/Static/ProcedureSql.cs | 112 - .../Configuration/Sql/Static/StaticSql.cs | 101 - .../Configuration/Statements/Delete.cs | 67 - .../Configuration/Statements/Generate.cs | 104 - .../Configuration/Statements/IStatement.cs | 175 - .../Configuration/Statements/Insert.cs | 94 - .../Statements/PreparedStatement.cs | 81 - .../Statements/PreparedStatementFactory.cs | 540 - .../Configuration/Statements/Procedure.cs | 95 - .../Configuration/Statements/Select.cs | 62 - .../Configuration/Statements/SelectKey.cs | 144 - .../Configuration/Statements/SqlGenerator.cs | 290 - .../Configuration/Statements/Statement.cs | 369 - .../Configuration/Statements/Update.cs | 64 - .../DataExchange/BaseDataExchange.cs | 83 - .../DataExchange/ComplexDataExchange.cs | 102 - .../DataExchange/DataExchangeFactory.cs | 130 - .../DataExchange/DictionaryDataExchange.cs | 87 - .../DataExchange/DotNetObjectDataExchange.cs | 126 - .../DataExchange/IDataExchange.cs | 60 - .../DataExchange/ListDataExchange.cs | 88 - .../DataExchange/PrimitiveDataExchange.cs | 94 - src/IBatisNet.DataMapper/Delegates.cs | 72 - src/IBatisNet.DataMapper/Enumeration.cs | 66 - .../Exceptions/DataMapperException.cs | 110 - src/IBatisNet.DataMapper/ExecuteEventArgs.cs | 53 - .../IBatisNet.DataMapper.20005.csproj | 741 - .../IBatisNet.DataMapper.2010.csproj | 766 - .../IBatisNet.DataMapper.Net35.2010.csproj | 760 - .../IBatisNet.DataMapper.Net40.build | 35 - .../IBatisNet.DataMapper.Net45.2012.csproj | 165 - .../IBatisNet.DataMapper.build | 35 - .../IBatisNet.DataMapper.csproj | 1334 - .../IBatisNet.DataMapper_net4.build | 35 - src/IBatisNet.DataMapper/ISqlMapSession.cs | 52 - src/IBatisNet.DataMapper/ISqlMapper.cs | 612 - .../ArgumentStrategyFactory.cs | 85 - .../ArgumentStrategy/DefaultStrategy.cs | 84 - .../ArgumentStrategy/IArgumentStrategy.cs | 47 - .../ArgumentStrategy/ResultMapStrategy.cs | 89 - .../ArgumentStrategy/SelectArrayStrategy.cs | 72 - .../SelectGenericListStrategy.cs | 98 - .../ArgumentStrategy/SelectListStrategy.cs | 75 - .../ArgumentStrategy/SelectObjectStrategy.cs | 65 - .../ArgumentStrategy/SelectStrategy.cs | 152 - .../MappedStatements/BaseStrategy.cs | 119 - .../MappedStatements/CachingStatement.cs | 526 - .../MappedStatements/DeleteMappedStatement.cs | 159 - .../MappedStatements/IMappedStatement.cs | 323 - .../MappedStatements/InsertMappedStatement.cs | 176 - .../MappedStatements/MappedStatement.cs | 1296 - .../MappedStatements/PaginatedList.cs | 577 - .../MappedStatements/PostBindind.cs | 133 - .../PostSelectStrategy/ArrayStrategy.cs | 61 - .../PostSelectStrategy/GenericListStrategy.cs | 85 - .../PostSelectStrategy/IPostSelectStrategy.cs | 46 - .../PostSelectStrategy/ListStrategy.cs | 50 - .../PostSelectStrategy/ObjectStrategy.cs | 50 - .../PostSelectStrategyFactory.cs | 63 - .../StrongTypedListStrategy.cs | 56 - .../PropertStrategy/DefaultStrategy.cs | 99 - .../PropertStrategy/GroupByStrategy.cs | 157 - .../PropertStrategy/IPropertyStrategy.cs | 61 - .../PropertyStrategyFactory.cs | 115 - .../PropertStrategy/ResultMapStrategy.cs | 108 - .../PropertStrategy/SelectArrayStrategy.cs | 86 - .../SelectGenericListStrategy.cs | 97 - .../PropertStrategy/SelectListStrategy.cs | 99 - .../PropertStrategy/SelectObjectStrategy.cs | 93 - .../PropertStrategy/SelectStrategy.cs | 165 - .../MappedStatements/ReaderAutoMapper.cs | 143 - .../ResultStrategy/AutoMapStrategy.cs | 122 - .../ResultStrategy/BaseResultStrategy.cs | 29 - .../ResultStrategy/DictionaryStrategy.cs | 78 - .../ResultStrategy/DynamicMapStrategy.cs | 121 - .../ResultStrategy/GroupByStrategy.cs | 108 - .../ResultStrategy/IResultStrategy.cs | 45 - .../ResultStrategy/ListStrategy.cs | 75 - .../ResultStrategy/MapStrategy.cs | 74 - .../ResultStrategy/ObjectStrategy.cs | 84 - .../ResultStrategy/ResultClassStrategy.cs | 86 - .../ResultStrategy/ResultMapStrategy.cs | 82 - .../ResultStrategy/ResultStrategyFactory.cs | 75 - .../ResultStrategy/SimpleTypeStrategy.cs | 87 - .../MappedStatements/SelectMappedStatement.cs | 77 - .../MappedStatements/UpdateMappedStatement.cs | 177 - src/IBatisNet.DataMapper/Mapper.cs | 87 - .../Proxy/ILazyFactory.cs | 49 - .../Proxy/LazyFactoryBuilder.cs | 101 - src/IBatisNet.DataMapper/Proxy/LazyList.cs | 304 - .../Proxy/LazyListFactory.cs | 57 - .../Proxy/LazyListGeneric.cs | 470 - .../Proxy/LazyListGenericFactory.cs | 67 - .../Proxy/LazyLoadInterceptor.cs | 158 - .../Proxy/LazyLoadProxyFactory.cs | 84 - src/IBatisNet.DataMapper/ReadMe.txt | 45 - .../Scope/ConfigurationScope.cs | 388 - .../Scope/ErrorContext.cs | 153 - src/IBatisNet.DataMapper/Scope/IScope.cs | 49 - .../Scope/RequestScope.cs | 281 - .../SessionStore/AbstractSessionStore.cs | 71 - .../SessionStore/CallContextSessionStore.cs | 71 - .../HybridWebThreadSessionStore.cs | 101 - .../SessionStore/ISessionStore.cs | 53 - .../SessionStore/InstanceItems-net20.cs | 64 - .../SessionStore/InstanceItems.cs | 78 - .../SessionStore/SessionStoreFactory .cs | 54 - .../SessionStore/ThreadSessionStore.cs | 54 - .../WcfSessionItemsInstanceExtension.cs | 45 - .../SessionStore/WcfSessionStore.cs | 85 - .../SessionStore/WebSessionStore.cs | 91 - src/IBatisNet.DataMapper/SqlMap.xsd | 854 - src/IBatisNet.DataMapper/SqlMapConfig.xsd | 155 - src/IBatisNet.DataMapper/SqlMapModule.xsd | 45 - src/IBatisNet.DataMapper/SqlMapSession.cs | 571 - src/IBatisNet.DataMapper/SqlMapper.cs | 1233 - .../TypeHandlers/AnsiStringTypeHandler.cs | 131 - .../TypeHandlers/BaseTypeHandler.cs | 129 - .../TypeHandlers/BooleanTypeHandler.cs | 123 - .../TypeHandlers/ByteArrayTypeHandler.cs | 142 - .../TypeHandlers/ByteTypeHandler.cs | 127 - .../TypeHandlers/CharTypeHandler.cs | 121 - .../TypeHandlers/CustomTypeHandler.cs | 142 - .../TypeHandlers/DBNullTypeHandler.cs | 114 - .../TypeHandlers/DateTimeTypeHandler.cs | 121 - .../TypeHandlers/DecimalTypeHandler.cs | 125 - .../TypeHandlers/DoubleTypeHandler.cs | 122 - .../TypeHandlers/EnumTypeHandler.cs | 141 - .../TypeHandlers/GuidTypeHandler.cs | 120 - .../TypeHandlers/IParameterSetter.cs | 58 - .../TypeHandlers/IResultGetter.cs | 58 - .../TypeHandlers/ITypeHandler.cs | 102 - .../TypeHandlers/ITypeHandlerCallback.cs | 87 - .../TypeHandlers/Int16TypeHandler.cs | 121 - .../TypeHandlers/Int32TypeHandler.cs | 123 - .../TypeHandlers/Int64TypeHandler.cs | 123 - .../Nullables/NullableBooleanTypeHandler.cs | 150 - .../Nullables/NullableByteTypeHandler.cs | 149 - .../Nullables/NullableCharTypeHandler.cs | 149 - .../Nullables/NullableDateTimeTypeHandler.cs | 146 - .../Nullables/NullableDecimalTypeHandler.cs | 155 - .../Nullables/NullableDoubleTypeHandler.cs | 149 - .../Nullables/NullableGuidTypeHandler.cs | 148 - .../Nullables/NullableInt16TypeHandler.cs | 157 - .../Nullables/NullableInt32TypeHandler.cs | 156 - .../Nullables/NullableInt64TypeHandler.cs | 156 - .../Nullables/NullableSByteTypeHandler.cs | 150 - .../Nullables/NullableSingleTypeHandler.cs | 148 - .../Nullables/NullableTimeSpanTypeHandler.cs | 147 - .../Nullables/NullableUInt16TypeHandler.cs | 158 - .../Nullables/NullableUInt32TypeHandler.cs | 157 - .../Nullables/NullableUInt64TypeHandler.cs | 156 - .../TypeHandlers/ObjectTypeHandler.cs | 121 - .../TypeHandlers/ParameterSetterImpl.cs | 78 - .../TypeHandlers/ResultGetterImpl.cs | 119 - .../TypeHandlers/SByteTypeHandler.cs | 125 - .../TypeHandlers/SingleTypeHandler.cs | 123 - .../TypeHandlers/StringTypeHandler.cs | 123 - .../TypeHandlers/TimeSpanTypeHandler.cs | 131 - .../TypeHandlers/TypeHandlerFactory.cs | 399 - .../TypeHandlers/UInt16TypeHandler.cs | 122 - .../TypeHandlers/UInt32TypeHandler.cs | 121 - .../TypeHandlers/UInt64TypeHandler.cs | 122 - .../TypeHandlers/UnknownTypeHandler.cs | 172 - src/IBatisNet.DataMapper/licence.txt | 201 - src/IBatisNet.DataMapper/notice.txt | 13 - src/IBatisNet.Net35.2010.sln | 70 - src/IBatisNet.Net4.2012.sln | 58 - src/IBatisNet.Net4.2012.v11.suo | Bin 503808 -> 0 bytes src/IBatisNet.Net45.2012.sln | 58 - src/IBatisNet.Net45.2012.v11.suo | Bin 293376 -> 0 bytes src/IBatisNet.mdb | Bin 589824 -> 0 bytes src/MSBuild/README.txt | 4 - src/NHibernate.mdb | Bin 184320 -> 0 bytes src/README.txt | 11 - src/iBATIS.Net40.build | 156 - src/iBATIS.build | 156 - src/iBATIS_net4.build | 157 - src/iBATIS_old.build_ | 410 - src/providers.config | 344 - to-do.txt | 85 - 2481 files changed, 85151 insertions(+), 359062 deletions(-) delete mode 100644 Examples/npetshop/External-bin/Apache.Avalon.DynamicProxy.dll delete mode 100644 Examples/npetshop/External-bin/Castle.DynamicProxy.dll delete mode 100644 Examples/npetshop/External-bin/IBatisNet.Common.dll delete mode 100644 Examples/npetshop/External-bin/IBatisNet.DataAccess.Extensions.dll delete mode 100644 Examples/npetshop/External-bin/IBatisNet.DataAccess.dll delete mode 100644 Examples/npetshop/External-bin/IBatisNet.DataMapper.dll delete mode 100644 Examples/npetshop/External-bin/log4net.dll delete mode 100644 Examples/npetshop/NPetshop.Domain/Accounts/Account.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Accounts/Address.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Accounts/Profile.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/AssemblyInfo.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Billing/CreditCard.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Billing/LineItem.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Billing/Order.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Catalog/Category.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Catalog/Item.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Catalog/Product.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Catalog/Supplier.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj delete mode 100644 Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj.user delete mode 100644 Examples/npetshop/NPetshop.Domain/Sequence.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCart.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCartLine.cs delete mode 100644 Examples/npetshop/NPetshop.Domain/ToDo.txt delete mode 100644 Examples/npetshop/NPetshop.Persistence/AssemblyInfo.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql delete mode 100644 Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql delete mode 100644 Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/Schema.sql delete mode 100644 Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DBUser.sql delete mode 100644 Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DataLoad.sql delete mode 100644 Examples/npetshop/NPetshop.Persistence/Ddl/MySql/Schema.sql delete mode 100644 Examples/npetshop/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/Interfaces/ISequenceDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs delete mode 100644 Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj delete mode 100644 Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj.user delete mode 100644 Examples/npetshop/NPetshop.Persistence/bin/Debug/log4net.dll delete mode 100644 Examples/npetshop/NPetshop.Persistence/dao.xml delete mode 100644 Examples/npetshop/NPetshop.Presentation/AssemblyInfo.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/Controls/ExtendedRepeater.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/Core/AbstractWebAction.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/Core/IWebAction.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/Core/WebConstants.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/Core/WebLocalSingleton.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/Exceptions/LoginAlreadyExistsException.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/IController.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj delete mode 100644 Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj.user delete mode 100644 Examples/npetshop/NPetshop.Presentation/ReadMe.txt delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserActions/AccountAction.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserActions/BillinAction.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserActions/CatalogAction.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserActions/DataViews.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserActions/ShoppinAction.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserActions/ShowStartPageAction.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserActions/WebViews.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/UserControl.cs delete mode 100644 Examples/npetshop/NPetshop.Presentation/bin/Debug/log4net.dll delete mode 100644 Examples/npetshop/NPetshop.Service/AccountService.cs delete mode 100644 Examples/npetshop/NPetshop.Service/AssemblyInfo.cs delete mode 100644 Examples/npetshop/NPetshop.Service/BillingService.cs delete mode 100644 Examples/npetshop/NPetshop.Service/CatalogService.cs delete mode 100644 Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj delete mode 100644 Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj.user delete mode 100644 Examples/npetshop/NPetshop.Service/ServiceConfig.cs delete mode 100644 Examples/npetshop/NPetshop.Service/ShoppingService.cs delete mode 100644 Examples/npetshop/NPetshop.Service/bin/Debug/log4net.dll delete mode 100644 Examples/npetshop/NPetshop.Web/@css/styles.css delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/bird1.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/bird2.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/cat1.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/cat2.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/dog1.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/dog2.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/dog3.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/dog4.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/dog5.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/dog6.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/fish1.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/fish2.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/fish3.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/fish4.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/reptile1.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/Pets/reptile2.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/cart.gif delete mode 100644 Examples/npetshop/NPetshop.Web/@images/iconCritical.gif delete mode 100644 Examples/npetshop/NPetshop.Web/@images/space.gif delete mode 100644 Examples/npetshop/NPetshop.Web/@images/splash.jpg delete mode 100644 Examples/npetshop/NPetshop.Web/@images/title.gif delete mode 100644 Examples/npetshop/NPetshop.Web/@images/top_stripe1.gif delete mode 100644 Examples/npetshop/NPetshop.Web/@images/top_stripe2.gif delete mode 100644 Examples/npetshop/NPetshop.Web/@images/top_stripe3.gif delete mode 100644 Examples/npetshop/NPetshop.Web/AssemblyInfo.cs delete mode 100644 Examples/npetshop/NPetshop.Web/DataBase.config delete mode 100644 Examples/npetshop/NPetshop.Web/Default.aspx delete mode 100644 Examples/npetshop/NPetshop.Web/Default.aspx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/Default.aspx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/Global.asax delete mode 100644 Examples/npetshop/NPetshop.Web/Global.asax.cs delete mode 100644 Examples/npetshop/NPetshop.Web/Global.asax.resx delete mode 100644 Examples/npetshop/NPetshop.Web/HttpModules/ErrorModule.cs delete mode 100644 Examples/npetshop/NPetshop.Web/Maps/Account.xml delete mode 100644 Examples/npetshop/NPetshop.Web/Maps/Category.xml delete mode 100644 Examples/npetshop/NPetshop.Web/Maps/Item.xml delete mode 100644 Examples/npetshop/NPetshop.Web/Maps/LineItem.xml delete mode 100644 Examples/npetshop/NPetshop.Web/Maps/Order.xml delete mode 100644 Examples/npetshop/NPetshop.Web/Maps/Product.xml delete mode 100644 Examples/npetshop/NPetshop.Web/Maps/Sequence.xml delete mode 100644 Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj delete mode 100644 Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj.webinfo delete mode 100644 Examples/npetshop/NPetshop.Web/NPetshop.mdb delete mode 100644 Examples/npetshop/NPetshop.Web/SqlMap.config delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Error.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Header.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.cs delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.resx delete mode 100644 Examples/npetshop/NPetshop.Web/UserControls/UserControl.cs delete mode 100644 Examples/npetshop/NPetshop.Web/Web.config delete mode 100644 Examples/npetshop/NPetshop.Web/dao.config delete mode 100644 Examples/npetshop/NPetshop.Web/providers.config delete mode 100644 Examples/npetshop/NPetshop.sln delete mode 100644 Examples/npetshop2/External-bin/Castle.DynamicProxy.dll delete mode 100644 Examples/npetshop2/External-bin/Castle.Facilities.TypedFactory.dll delete mode 100644 Examples/npetshop2/External-bin/Castle.MVC.Xml delete mode 100644 Examples/npetshop2/External-bin/Castle.MVC.dll delete mode 100644 Examples/npetshop2/External-bin/Castle.MicroKernel.dll delete mode 100644 Examples/npetshop2/External-bin/Castle.Model.dll delete mode 100644 Examples/npetshop2/External-bin/Castle.Windsor.dll delete mode 100644 Examples/npetshop2/External-bin/Castle.Windsor.xml delete mode 100644 Examples/npetshop2/External-bin/Castle.license.txt delete mode 100644 Examples/npetshop2/External-bin/IBatisNet.Common.dll delete mode 100644 Examples/npetshop2/External-bin/IBatisNet.Common.xml delete mode 100644 Examples/npetshop2/External-bin/IBatisNet.DataAccess.dll delete mode 100644 Examples/npetshop2/External-bin/IBatisNet.DataAccess.xml delete mode 100644 Examples/npetshop2/External-bin/IBatisNet.DataMapper.dll delete mode 100644 Examples/npetshop2/External-bin/IBatisNet.DataMapper.xml delete mode 100644 Examples/npetshop2/External-bin/NUnitAsp.license.txt delete mode 100644 Examples/npetshop2/External-bin/log4net.dll delete mode 100644 Examples/npetshop2/External-bin/log4net.license.txt delete mode 100644 Examples/npetshop2/External-bin/log4net.xml delete mode 100644 Examples/npetshop2/NPetshop.Domain/Accounts/Account.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Accounts/Address.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Accounts/Profile.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/AssemblyInfo.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Billing/CreditCard.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Billing/LineItem.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Billing/Order.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Catalog/Category.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Catalog/Item.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Catalog/Product.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Catalog/Supplier.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj delete mode 100644 Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj.user delete mode 100644 Examples/npetshop2/NPetshop.Domain/Sequence.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCart.cs delete mode 100644 Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCartLine.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/AssemblyInfo.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/Schema.sql delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DBUser.sql delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DataLoad.sql delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/Schema.sql delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Interfaces/ISequenceDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Maps/Account.xml delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Maps/Category.xml delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Maps/Item.xml delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Maps/LineItem.xml delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Maps/Order.xml delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Maps/Product.xml delete mode 100644 Examples/npetshop2/NPetshop.Persistence/Maps/Sequence.xml delete mode 100644 Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj delete mode 100644 Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj.user delete mode 100644 Examples/npetshop2/NPetshop.Persistence/SqlMap.config delete mode 100644 Examples/npetshop2/NPetshop.Persistence/dao.config delete mode 100644 Examples/npetshop2/NPetshop.Persistence/providers.config delete mode 100644 Examples/npetshop2/NPetshop.Presentation/AccountController.cs delete mode 100644 Examples/npetshop2/NPetshop.Presentation/AssemblyInfo.cs delete mode 100644 Examples/npetshop2/NPetshop.Presentation/BillingController.cs delete mode 100644 Examples/npetshop2/NPetshop.Presentation/CatalogController.cs delete mode 100644 Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj delete mode 100644 Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj.user delete mode 100644 Examples/npetshop2/NPetshop.Presentation/NPetshopContainer.cs delete mode 100644 Examples/npetshop2/NPetshop.Presentation/NPetshopController.cs delete mode 100644 Examples/npetshop2/NPetshop.Presentation/NPetshopState.cs delete mode 100644 Examples/npetshop2/NPetshop.Presentation/ShoppingController.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/AssemblyInfo.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Impl/AccountService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Impl/BillingService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Impl/CatalogService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Impl/ShoppingService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Interfaces/IAccountService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Interfaces/IBillingService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Interfaces/ICatalogService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/Interfaces/IShoppingService.cs delete mode 100644 Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj delete mode 100644 Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj.user delete mode 100644 Examples/npetshop2/NPetshop.Test/AssemblyInfo.cs delete mode 100644 Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj delete mode 100644 Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj.user delete mode 100644 Examples/npetshop2/NPetshop.Test/Persistence/BaseTest.cs delete mode 100644 Examples/npetshop2/NPetshop.Test/Persistence/DaoTest.cs delete mode 100644 Examples/npetshop2/NPetshop.Test/Presentation/ControllerTest.cs delete mode 100644 Examples/npetshop2/NPetshop.Test/Web/WebFormTest.cs delete mode 100644 Examples/npetshop2/NPetshop.Test/bin/Debug/NPetshop.Test.dll.config delete mode 100644 Examples/npetshop2/NPetshop.Test/bin/Debug/properties.config delete mode 100644 Examples/npetshop2/NPetshop.Test/readme.txt delete mode 100644 Examples/npetshop2/NPetshop.Web/@css/styles.css delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/bird1.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/bird2.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/cat1.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/cat2.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/dog1.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/dog2.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/dog3.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/dog4.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/dog5.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/dog6.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/fish1.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/fish2.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/fish3.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/fish4.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/reptile1.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/Pets/reptile2.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/cart.gif delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/iconCritical.gif delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/space.gif delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/splash.jpg delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/title.gif delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/top_stripe1.gif delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/top_stripe2.gif delete mode 100644 Examples/npetshop2/NPetshop.Web/@images/top_stripe3.gif delete mode 100644 Examples/npetshop2/NPetshop.Web/AssemblyInfo.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/ChangeLog.txt delete mode 100644 Examples/npetshop2/NPetshop.Web/Controls/ExtendedRepeater.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Default.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Default.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Default.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Global.asax delete mode 100644 Examples/npetshop2/NPetshop.Web/Global.asax.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Global.asax.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj delete mode 100644 Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj.webinfo delete mode 100644 Examples/npetshop2/NPetshop.Web/NPetshop.mdb delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/NPetshopUC.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/UserControls/UserControl.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/NPetshopView.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/default.aspx delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/default.aspx.cs delete mode 100644 Examples/npetshop2/NPetshop.Web/Views/default.aspx.resx delete mode 100644 Examples/npetshop2/NPetshop.Web/Web.config delete mode 100644 Examples/npetshop2/NPetshop.Web/properties.config delete mode 100644 Examples/npetshop2/NPetshop.Web/readme.txt delete mode 100644 Examples/npetshop2/NPetshop.sln delete mode 100644 Examples/tutorial/Build-chm.bat delete mode 100644 Examples/tutorial/Model/Helper.cs delete mode 100644 Examples/tutorial/Model/Helpers.cs delete mode 100644 Examples/tutorial/Model/Model.csproj delete mode 100644 Examples/tutorial/Model/Model.csproj.user delete mode 100644 Examples/tutorial/Model/Person.cs delete mode 100644 Examples/tutorial/Model/PersonHelper.cs delete mode 100644 Examples/tutorial/Model/PersonTest.cs delete mode 100644 Examples/tutorial/Model/Resources/PersonHelper.xml delete mode 100644 Examples/tutorial/Model/bin/Debug/properties.config delete mode 100644 Examples/tutorial/Model/bin/Debug/providers.config delete mode 100644 Examples/tutorial/Model/bin/Debug/sqlmap.config delete mode 100644 Examples/tutorial/README.txt delete mode 100644 Examples/tutorial/Tests/PersonTest.cs delete mode 100644 Examples/tutorial/Tests/Resources/PersonHelper.xml delete mode 100644 Examples/tutorial/Tests/Tests.csproj delete mode 100644 Examples/tutorial/Tests/bin/Debug/iBatisTutorial.mdb delete mode 100644 Examples/tutorial/Tests/bin/Debug/properties.config delete mode 100644 Examples/tutorial/Tests/bin/Debug/providers.config delete mode 100644 Examples/tutorial/Tests/bin/Debug/sqlmap.config delete mode 100644 Examples/tutorial/WebView/AssemblyInfo.cs delete mode 100644 Examples/tutorial/WebView/Forms/Person.aspx delete mode 100644 Examples/tutorial/WebView/Forms/Person.aspx.cs delete mode 100644 Examples/tutorial/WebView/Forms/Person.aspx.resx delete mode 100644 Examples/tutorial/WebView/Global.asax delete mode 100644 Examples/tutorial/WebView/Global.asax.cs delete mode 100644 Examples/tutorial/WebView/Global.asax.resx delete mode 100644 Examples/tutorial/WebView/ReadMe.txt delete mode 100644 Examples/tutorial/WebView/Resources/PersonHelper.xml delete mode 100644 Examples/tutorial/WebView/Resources/iBatisTutorial.mdb delete mode 100644 Examples/tutorial/WebView/Web.config delete mode 100644 Examples/tutorial/WebView/WebView.csproj delete mode 100644 Examples/tutorial/WebView/default.htm delete mode 100644 Examples/tutorial/WebView/iBatisTutorial.mdb delete mode 100644 Examples/tutorial/WebView/properties.config delete mode 100644 Examples/tutorial/WebView/providers.config delete mode 100644 Examples/tutorial/WebView/sqlmap.config delete mode 100644 Examples/tutorial/default.css delete mode 100644 Examples/tutorial/figure01.png delete mode 100644 Examples/tutorial/figure02.png delete mode 100644 Examples/tutorial/figure03.png delete mode 100644 Examples/tutorial/iBatisTutorial.chm delete mode 100644 Examples/tutorial/iBatisTutorial.sln delete mode 100644 Examples/tutorial/iBatisTutorial.xml delete mode 100644 Examples/tutorial/tutorial.xsl delete mode 100644 Examples/tutorial2/DomainDiagram.png delete mode 100644 Examples/tutorial2/External-bin/Castle.DynamicProxy.dll delete mode 100644 Examples/tutorial2/External-bin/IBatisNet.Common.dll delete mode 100644 Examples/tutorial2/External-bin/IBatisNet.Common.xml delete mode 100644 Examples/tutorial2/External-bin/IBatisNet.DataAccess.dll delete mode 100644 Examples/tutorial2/External-bin/IBatisNet.DataAccess.xml delete mode 100644 Examples/tutorial2/External-bin/IBatisNet.DataMapper.dll delete mode 100644 Examples/tutorial2/External-bin/IBatisNet.DataMapper.xml delete mode 100644 Examples/tutorial2/Files/Blogs.mdb delete mode 100644 Examples/tutorial2/Files/Maps/Access/Author.xml delete mode 100644 Examples/tutorial2/Files/Maps/Access/Blog.xml delete mode 100644 Examples/tutorial2/Files/Maps/Access/Post.xml delete mode 100644 Examples/tutorial2/Files/dao.config delete mode 100644 Examples/tutorial2/Files/properties.config delete mode 100644 Examples/tutorial2/Files/providers.config delete mode 100644 Examples/tutorial2/Files/sqlMap.config delete mode 100644 Examples/tutorial2/Tutorial2.Application/BlogPresenter.cs delete mode 100644 Examples/tutorial2/Tutorial2.Application/IBlogView.cs delete mode 100644 Examples/tutorial2/Tutorial2.Application/Properties/AssemblyInfo.cs delete mode 100644 Examples/tutorial2/Tutorial2.Application/Tutorial2.Application.csproj delete mode 100644 Examples/tutorial2/Tutorial2.Domain/Author.cs delete mode 100644 Examples/tutorial2/Tutorial2.Domain/Blog.cs delete mode 100644 Examples/tutorial2/Tutorial2.Domain/Comment.cs delete mode 100644 Examples/tutorial2/Tutorial2.Domain/DomainDiagram.cd delete mode 100644 Examples/tutorial2/Tutorial2.Domain/EntityBase.cs delete mode 100644 Examples/tutorial2/Tutorial2.Domain/Post.cs delete mode 100644 Examples/tutorial2/Tutorial2.Domain/Properties/AssemblyInfo.cs delete mode 100644 Examples/tutorial2/Tutorial2.Domain/Tutorial2.Domain.csproj delete mode 100644 Examples/tutorial2/Tutorial2.Service/BlogService.cs delete mode 100644 Examples/tutorial2/Tutorial2.Service/IBlogService.cs delete mode 100644 Examples/tutorial2/Tutorial2.Service/Properties/AssemblyInfo.cs delete mode 100644 Examples/tutorial2/Tutorial2.Service/Tutorial2.Service.csproj delete mode 100644 Examples/tutorial2/Tutorial2.Test/App.config delete mode 100644 Examples/tutorial2/Tutorial2.Test/ManualMock/BlogServiceMock.cs delete mode 100644 Examples/tutorial2/Tutorial2.Test/ManualMock/BlogViewMock.cs delete mode 100644 Examples/tutorial2/Tutorial2.Test/ManualMock/DaoManagerMock.cs delete mode 100644 Examples/tutorial2/Tutorial2.Test/Properties/AssemblyInfo.cs delete mode 100644 Examples/tutorial2/Tutorial2.Test/TestBlogService.cs delete mode 100644 Examples/tutorial2/Tutorial2.Test/TestDataMapper.cs delete mode 100644 Examples/tutorial2/Tutorial2.Test/TestManualPresenterMock.cs delete mode 100644 Examples/tutorial2/Tutorial2.Test/Tutorial2.Test.csproj delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Login.Designer.cs delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Login.cs delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Login.resx delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Program.cs delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Properties/AssemblyInfo.cs delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Properties/DataSources/Tutorial2.Domain.User.datasource delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.Designer.cs delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.resx delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.Designer.cs delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.settings delete mode 100644 Examples/tutorial2/Tutorial2.WinUI/Tutorial2.WinUI.csproj delete mode 100644 Examples/tutorial2/Tutorial2.sln rename src/IBatisNet.Common.Test/bin/Debug/test.config => ORBatis.Common/AssemblyInfo.cs (100%) rename {src => ORBatis.Common}/AssemblyKey.snk (100%) rename {src/IBatisNet.Common => ORBatis.Common}/ChangeLog.txt (100%) create mode 100644 ORBatis.Common/DataSource.cs create mode 100644 ORBatis.Common/DataSourceDeSerializer.cs create mode 100644 ORBatis.Common/DbProvider.cs create mode 100644 ORBatis.Common/Exceptions/ConfigurationException.cs create mode 100644 ORBatis.Common/Exceptions/ForeignKeyException.cs create mode 100644 ORBatis.Common/Exceptions/IBatisNetException.cs create mode 100644 ORBatis.Common/Exceptions/ProbeException.cs rename {src/IBatisNet.Common => ORBatis.Common}/IBatisNet.Common.2005.csproj (100%) rename {src/IBatisNet.Common => ORBatis.Common}/IBatisNet.Common.2010.csproj (97%) rename {src/IBatisNet.Common => ORBatis.Common}/IBatisNet.Common.Net35.2010.csproj (97%) rename {src/IBatisNet.Common => ORBatis.Common}/IBatisNet.Common.Net45.2012.csproj (97%) rename {src/IBatisNet.Common => ORBatis.Common}/IBatisNet.Common.csproj (100%) create mode 100644 ORBatis.Common/IConnectionAdapter.cs create mode 100644 ORBatis.Common/IDalSession.cs create mode 100644 ORBatis.Common/IDataSource.cs create mode 100644 ORBatis.Common/IDbProvider.cs create mode 100644 ORBatis.Common/Logging/ILog.cs create mode 100644 ORBatis.Common/Logging/ILoggerFactoryAdapter.cs create mode 100644 ORBatis.Common/Logging/Impl/AbstractLogger.cs create mode 100644 ORBatis.Common/Logging/Impl/ConsoleOutLogger.cs create mode 100644 ORBatis.Common/Logging/Impl/ConsoleOutLoggerFA.cs create mode 100644 ORBatis.Common/Logging/Impl/NoOpLogger.cs create mode 100644 ORBatis.Common/Logging/Impl/NoOpLoggerFA.cs create mode 100644 ORBatis.Common/Logging/Impl/TraceLogger.cs create mode 100644 ORBatis.Common/Logging/Impl/TraceLoggerFA.cs create mode 100644 ORBatis.Common/Logging/LogSetting.cs create mode 100644 ORBatis.Common/ORBatis.Common.csproj create mode 100644 ORBatis.Common/Pagination/IPaginatedList.cs create mode 100644 ORBatis.Common/Pagination/PaginatedArrayList.cs create mode 100644 ORBatis.Common/ProviderDeSerializer.cs create mode 100644 ORBatis.Common/Utilities/DBHelperParameterCache.cs create mode 100644 ORBatis.Common/Utilities/HashCodeProvider.cs create mode 100644 ORBatis.Common/Utilities/Objects/AbstractFactory.cs create mode 100644 ORBatis.Common/Utilities/Objects/ActivatorFactory.cs create mode 100644 ORBatis.Common/Utilities/Objects/ActivatorObjectFactory.cs rename {src/IBatisNet.Common => ORBatis.Common}/Utilities/Objects/BoxingOpCodes.cs (82%) create mode 100644 ORBatis.Common/Utilities/Objects/IFactory.cs create mode 100644 ORBatis.Common/Utilities/Objects/IObjectFactory.cs create mode 100644 ORBatis.Common/Utilities/Objects/Members/AccessorFactory.cs create mode 100644 ORBatis.Common/Utilities/Objects/Members/BaseAccessor.cs rename {src/IBatisNet.Common => ORBatis.Common}/Utilities/Objects/Members/IAccessor.cs (85%) rename {src/IBatisNet.Common => ORBatis.Common}/Utilities/Objects/Members/IGet.cs (84%) create mode 100644 ORBatis.Common/Utilities/Objects/Members/IGetAccessor.cs rename {src/IBatisNet.Common => ORBatis.Common}/Utilities/Objects/Members/IGetAccessorFactory.cs (89%) rename {src/IBatisNet.Common => ORBatis.Common}/Utilities/Objects/Members/ISet.cs (84%) create mode 100644 ORBatis.Common/Utilities/Objects/Members/ISetAccessor.cs rename {src/IBatisNet.Common => ORBatis.Common}/Utilities/Objects/Members/ISetAccessorFactory.cs (89%) create mode 100644 ORBatis.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs create mode 100644 ORBatis.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs create mode 100644 ORBatis.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs create mode 100644 ORBatis.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs create mode 100644 ORBatis.Common/Utilities/Objects/ObjectProbe.cs create mode 100644 ORBatis.Common/Utilities/Objects/ReflectionInfo.cs rename {src/IBatisNet.Common => ORBatis.Common}/Utilities/Proxy/IProxyGenerator.cs (88%) create mode 100644 ORBatis.Common/Utilities/ScriptRunner.cs create mode 100644 ORBatis.Common/Utilities/StringTokenizer.cs create mode 100644 ORBatis.Common/Utilities/TypeUtils.cs create mode 100644 ORBatis.Common/Utilities/TypesResolver/CachedTypeResolver.cs create mode 100644 ORBatis.Common/Utilities/TypesResolver/ITypeResolver.cs create mode 100644 ORBatis.Common/Utilities/TypesResolver/TypeRegistry.cs create mode 100644 ORBatis.Common/Utilities/TypesResolver/TypeResolver.cs create mode 100644 ORBatis.Common/Xml/NodeUtils.cs create mode 100644 ORBatis.sln create mode 100644 ORBatisCore/Commands/DataReaderDecorator.cs create mode 100644 ORBatisCore/Commands/DataReaderTransformer.cs create mode 100644 ORBatisCore/Commands/DbCommandDecorator.cs create mode 100644 ORBatisCore/Commands/DefaultPreparedCommand.cs rename {src/IBatisNet.DataMapper => ORBatisCore}/Commands/IDbDataParameterCollection.cs (100%) create mode 100644 ORBatisCore/Commands/IPreparedCommand.cs create mode 100644 ORBatisCore/Commands/InMemoryDataReader.cs create mode 100644 ORBatisCore/Commands/PreparedCommandFactory.cs create mode 100644 ORBatisCore/Configuration/Alias/TypeAlias.cs create mode 100644 ORBatisCore/Configuration/Alias/TypeHandler.cs create mode 100644 ORBatisCore/Configuration/Cache/CacheKey.cs create mode 100644 ORBatisCore/Configuration/Cache/CacheModel.cs create mode 100644 ORBatisCore/Configuration/Cache/Fifo/FifoCacheController.cs create mode 100644 ORBatisCore/Configuration/Cache/FlushInterval.cs create mode 100644 ORBatisCore/Configuration/Cache/ICacheController.cs create mode 100644 ORBatisCore/Configuration/Cache/Lru/LruCacheController.cs create mode 100644 ORBatisCore/Configuration/Cache/Memory/MemoryCacheControler.cs create mode 100644 ORBatisCore/Configuration/Cache/Memory/MemoryCacheLevel.cs create mode 100644 ORBatisCore/Configuration/DomSqlMapBuilder.cs create mode 100644 ORBatisCore/Configuration/ParameterMapping/InlineParameterMapParser.cs create mode 100644 ORBatisCore/Configuration/ParameterMapping/ParameterMap.cs create mode 100644 ORBatisCore/Configuration/ParameterMapping/ParameterProperty.cs create mode 100644 ORBatisCore/Configuration/ParameterMapping/ParameterPropertyCollection.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/ArgumentProperty.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/AutoResultMap.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/Discriminator.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/DynamicResultMap.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/IResultMap.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/NullResultMap.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/ResultMap.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/ResultMapCollection.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/ResultProperty.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/ResultPropertyCollection.cs create mode 100644 ORBatisCore/Configuration/ResultMapping/SubMap.cs create mode 100644 ORBatisCore/Configuration/Serializers/ArgumentPropertyDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/CacheModelDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/DeSerializerFactory.cs create mode 100644 ORBatisCore/Configuration/Serializers/DeleteDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/DiscriminatorDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/DynamicDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/InsertDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsEmptyDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsEqualDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsGreaterEqualDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsGreaterThanDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsLessEqualDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsLessThanDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsNotEmptyDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsNotEqualDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsNotNullDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsNullDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsParameterPresentDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/IterateSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/ParameterMapDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/ParameterPropertyDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/ProcedureDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/ResultMapDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/ResultPropertyDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/SelectDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/SqlDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/StatementDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/SubMapDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/TypeAliasDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/TypeHandlerDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Serializers/UpdateDeSerializer.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/DynamicSql.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/BaseTag.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/Conditional.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/Dynamic.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsEmpty.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsEqual.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsLessThan.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsNotNull.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsNull.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/Iterate.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Elements/SqlTag.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IterateContext.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/ISqlChild.cs create mode 100644 ORBatisCore/Configuration/Sql/Dynamic/SqlText.cs create mode 100644 ORBatisCore/Configuration/Sql/ISql.cs create mode 100644 ORBatisCore/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs create mode 100644 ORBatisCore/Configuration/Sql/Static/ProcedureSql.cs create mode 100644 ORBatisCore/Configuration/Sql/Static/StaticSql.cs create mode 100644 ORBatisCore/Configuration/Statements/Delete.cs create mode 100644 ORBatisCore/Configuration/Statements/Generate.cs create mode 100644 ORBatisCore/Configuration/Statements/IStatement.cs create mode 100644 ORBatisCore/Configuration/Statements/Insert.cs create mode 100644 ORBatisCore/Configuration/Statements/PreparedStatement.cs create mode 100644 ORBatisCore/Configuration/Statements/PreparedStatementFactory.cs create mode 100644 ORBatisCore/Configuration/Statements/Procedure.cs create mode 100644 ORBatisCore/Configuration/Statements/Select.cs create mode 100644 ORBatisCore/Configuration/Statements/SelectKey.cs create mode 100644 ORBatisCore/Configuration/Statements/SqlGenerator.cs create mode 100644 ORBatisCore/Configuration/Statements/Statement.cs create mode 100644 ORBatisCore/Configuration/Statements/Update.cs create mode 100644 ORBatisCore/DataExchange/BaseDataExchange.cs create mode 100644 ORBatisCore/DataExchange/ComplexDataExchange.cs create mode 100644 ORBatisCore/DataExchange/DataExchangeFactory.cs create mode 100644 ORBatisCore/DataExchange/DictionaryDataExchange.cs create mode 100644 ORBatisCore/DataExchange/DotNetObjectDataExchange.cs create mode 100644 ORBatisCore/DataExchange/IDataExchange.cs create mode 100644 ORBatisCore/DataExchange/ListDataExchange.cs create mode 100644 ORBatisCore/DataExchange/PrimitiveDataExchange.cs create mode 100644 ORBatisCore/Delegates.cs create mode 100644 ORBatisCore/Enumeration.cs create mode 100644 ORBatisCore/Exceptions/DataMapperException.cs create mode 100644 ORBatisCore/ExecuteEventArgs.cs create mode 100644 ORBatisCore/ISqlMapSession.cs create mode 100644 ORBatisCore/ISqlMapper.cs create mode 100644 ORBatisCore/Logging/ConfigurationSectionHandler.cs create mode 100644 ORBatisCore/Logging/LogManager.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/DefaultStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/SelectListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ArgumentStrategy/SelectStrategy.cs create mode 100644 ORBatisCore/MappedStatements/BaseStrategy.cs create mode 100644 ORBatisCore/MappedStatements/CachingStatement.cs create mode 100644 ORBatisCore/MappedStatements/DeleteMappedStatement.cs create mode 100644 ORBatisCore/MappedStatements/IMappedStatement.cs create mode 100644 ORBatisCore/MappedStatements/InsertMappedStatement.cs create mode 100644 ORBatisCore/MappedStatements/MappedStatement.cs create mode 100644 ORBatisCore/MappedStatements/PaginatedList.cs create mode 100644 ORBatisCore/MappedStatements/PostBindind.cs create mode 100644 ORBatisCore/MappedStatements/PostSelectStrategy/ArrayStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PostSelectStrategy/GenericListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PostSelectStrategy/ListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PostSelectStrategy/ObjectStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs create mode 100644 ORBatisCore/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/DefaultStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/GroupByStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/IPropertyStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/ResultMapStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/SelectArrayStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/SelectListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/SelectObjectStrategy.cs create mode 100644 ORBatisCore/MappedStatements/PropertStrategy/SelectStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ReaderAutoMapper.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/AutoMapStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/BaseResultStrategy.cs rename {src/IBatisNet.DataMapper => ORBatisCore}/MappedStatements/ResultStrategy/ClassDiagram.cd (100%) create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/DictionaryStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/DynamicMapStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/GroupByStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/IResultStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/ListStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/MapStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/ObjectStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/ResultClassStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/ResultMapStrategy.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/ResultStrategyFactory.cs create mode 100644 ORBatisCore/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs create mode 100644 ORBatisCore/MappedStatements/SelectMappedStatement.cs create mode 100644 ORBatisCore/MappedStatements/UpdateMappedStatement.cs create mode 100644 ORBatisCore/Mapper.cs create mode 100644 ORBatisCore/ORBatisCore.csproj create mode 100644 ORBatisCore/Proxy/ILazyFactory.cs create mode 100644 ORBatisCore/Proxy/LazyFactoryBuilder.cs create mode 100644 ORBatisCore/Proxy/LazyList.cs create mode 100644 ORBatisCore/Proxy/LazyListFactory.cs create mode 100644 ORBatisCore/Proxy/LazyListGeneric.cs create mode 100644 ORBatisCore/Proxy/LazyListGenericFactory.cs create mode 100644 ORBatisCore/Proxy/LazyLoadInterceptor.cs create mode 100644 ORBatisCore/Proxy/LazyLoadProxyFactory.cs create mode 100644 ORBatisCore/Scope/ConfigurationScope.cs create mode 100644 ORBatisCore/Scope/ErrorContext.cs create mode 100644 ORBatisCore/Scope/IScope.cs create mode 100644 ORBatisCore/Scope/RequestScope.cs create mode 100644 ORBatisCore/SqlMap.xsd create mode 100644 ORBatisCore/SqlMapConfig.xsd create mode 100644 ORBatisCore/SqlMapSession.cs create mode 100644 ORBatisCore/SqlMapper.cs create mode 100644 ORBatisCore/TypeHandlers/AnsiStringTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/BaseTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/BooleanTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/ByteArrayTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/ByteTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/CharTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/CustomTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/DBNullTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/DateTimeTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/DecimalTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/DoubleTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/EnumTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/GuidTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/IParameterSetter.cs create mode 100644 ORBatisCore/TypeHandlers/IResultGetter.cs create mode 100644 ORBatisCore/TypeHandlers/ITypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/ITypeHandlerCallback.cs create mode 100644 ORBatisCore/TypeHandlers/Int16TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Int32TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Int64TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableByteTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableCharTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableGuidTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableInt16TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableInt32TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableInt64TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableSByteTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableSingleTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/ObjectTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/ParameterSetterImpl.cs create mode 100644 ORBatisCore/TypeHandlers/ResultGetterImpl.cs create mode 100644 ORBatisCore/TypeHandlers/SByteTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/SingleTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/StringTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/TimeSpanTypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/TypeHandlerFactory.cs create mode 100644 ORBatisCore/TypeHandlers/UInt16TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/UInt32TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/UInt64TypeHandler.cs create mode 100644 ORBatisCore/TypeHandlers/UnknownTypeHandler.cs create mode 100644 ORBatisCore/Utilities/ConfigWatcherHandler.cs create mode 100644 ORBatisCore/Utilities/Objects/DelegateFactory.cs create mode 100644 ORBatisCore/Utilities/Objects/DelegateObjectFactory.cs create mode 100644 ORBatisCore/Utilities/Objects/EmitObjectFactory.cs create mode 100644 ORBatisCore/Utilities/Objects/FactoryBuilder.cs create mode 100644 ORBatisCore/Utilities/Objects/FactoryLogAdapter.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/DelegateGetFieldAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/DelegatePropertySetAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/DelegateSetFieldAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/EmitFieldGetAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/EmitFieldSetAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/EmitPropertyGetAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/EmitPropertySetAccessor.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/GetAccessorFactory.cs create mode 100644 ORBatisCore/Utilities/Objects/Members/SetAccessorFactory.cs create mode 100644 ORBatisCore/Utilities/Objects/ObjectFactory.cs create mode 100644 ORBatisCore/Utilities/Resources.cs create mode 100644 ORBatisFramework/Commands/DataReaderDecorator.cs create mode 100644 ORBatisFramework/Commands/DataReaderTransformer.cs create mode 100644 ORBatisFramework/Commands/DbCommandDecorator.cs create mode 100644 ORBatisFramework/Commands/DefaultPreparedCommand.cs rename src/IBatisNet.DataAccess.Test/bin/Debug/test.config => ORBatisFramework/Commands/IDbDataParameterCollection.cs (100%) create mode 100644 ORBatisFramework/Commands/IPreparedCommand.cs create mode 100644 ORBatisFramework/Commands/InMemoryDataReader.cs create mode 100644 ORBatisFramework/Commands/PreparedCommandFactory.cs create mode 100644 ORBatisFramework/Configuration/Alias/TypeAlias.cs create mode 100644 ORBatisFramework/Configuration/Alias/TypeHandler.cs create mode 100644 ORBatisFramework/Configuration/Cache/CacheKey.cs create mode 100644 ORBatisFramework/Configuration/Cache/CacheModel.cs create mode 100644 ORBatisFramework/Configuration/Cache/Fifo/FifoCacheController.cs create mode 100644 ORBatisFramework/Configuration/Cache/FlushInterval.cs create mode 100644 ORBatisFramework/Configuration/Cache/ICacheController.cs create mode 100644 ORBatisFramework/Configuration/Cache/Lru/LruCacheController.cs create mode 100644 ORBatisFramework/Configuration/Cache/Memory/MemoryCacheControler.cs create mode 100644 ORBatisFramework/Configuration/Cache/Memory/MemoryCacheLevel.cs create mode 100644 ORBatisFramework/Configuration/DomSqlMapBuilder.cs create mode 100644 ORBatisFramework/Configuration/ParameterMapping/InlineParameterMapParser.cs create mode 100644 ORBatisFramework/Configuration/ParameterMapping/ParameterMap.cs create mode 100644 ORBatisFramework/Configuration/ParameterMapping/ParameterProperty.cs create mode 100644 ORBatisFramework/Configuration/ParameterMapping/ParameterPropertyCollection.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/ArgumentProperty.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/AutoResultMap.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/Discriminator.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/DynamicResultMap.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/IResultMap.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/NullResultMap.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/ResultMap.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/ResultMapCollection.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/ResultProperty.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/ResultPropertyCollection.cs create mode 100644 ORBatisFramework/Configuration/ResultMapping/SubMap.cs create mode 100644 ORBatisFramework/Configuration/Serializers/ArgumentPropertyDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/CacheModelDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/DeSerializerFactory.cs create mode 100644 ORBatisFramework/Configuration/Serializers/DeleteDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/DiscriminatorDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/DynamicDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/InsertDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsEmptyDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsEqualDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsGreaterEqualDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsGreaterThanDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsLessEqualDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsLessThanDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsNotEmptyDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsNotEqualDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsNotNullDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsNullDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsParameterPresentDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/IterateSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/ParameterMapDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/ParameterPropertyDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/ProcedureDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/ResultMapDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/ResultPropertyDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/SelectDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/SqlDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/StatementDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/SubMapDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/TypeAliasDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/TypeHandlerDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Serializers/UpdateDeSerializer.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/DynamicSql.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/BaseTag.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/Conditional.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/Dynamic.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsEmpty.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsEqual.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsLessThan.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsNotNull.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsNull.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/Iterate.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Elements/SqlTag.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IterateContext.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/ISqlChild.cs create mode 100644 ORBatisFramework/Configuration/Sql/Dynamic/SqlText.cs create mode 100644 ORBatisFramework/Configuration/Sql/ISql.cs create mode 100644 ORBatisFramework/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs create mode 100644 ORBatisFramework/Configuration/Sql/Static/ProcedureSql.cs create mode 100644 ORBatisFramework/Configuration/Sql/Static/StaticSql.cs create mode 100644 ORBatisFramework/Configuration/Statements/Delete.cs create mode 100644 ORBatisFramework/Configuration/Statements/Generate.cs create mode 100644 ORBatisFramework/Configuration/Statements/IStatement.cs create mode 100644 ORBatisFramework/Configuration/Statements/Insert.cs create mode 100644 ORBatisFramework/Configuration/Statements/PreparedStatement.cs create mode 100644 ORBatisFramework/Configuration/Statements/PreparedStatementFactory.cs create mode 100644 ORBatisFramework/Configuration/Statements/Procedure.cs create mode 100644 ORBatisFramework/Configuration/Statements/Select.cs create mode 100644 ORBatisFramework/Configuration/Statements/SelectKey.cs create mode 100644 ORBatisFramework/Configuration/Statements/SqlGenerator.cs create mode 100644 ORBatisFramework/Configuration/Statements/Statement.cs create mode 100644 ORBatisFramework/Configuration/Statements/Update.cs create mode 100644 ORBatisFramework/DataExchange/BaseDataExchange.cs create mode 100644 ORBatisFramework/DataExchange/ComplexDataExchange.cs create mode 100644 ORBatisFramework/DataExchange/DataExchangeFactory.cs create mode 100644 ORBatisFramework/DataExchange/DictionaryDataExchange.cs create mode 100644 ORBatisFramework/DataExchange/DotNetObjectDataExchange.cs create mode 100644 ORBatisFramework/DataExchange/IDataExchange.cs create mode 100644 ORBatisFramework/DataExchange/ListDataExchange.cs create mode 100644 ORBatisFramework/DataExchange/PrimitiveDataExchange.cs create mode 100644 ORBatisFramework/Delegates.cs create mode 100644 ORBatisFramework/Enumeration.cs create mode 100644 ORBatisFramework/Exceptions/DataMapperException.cs create mode 100644 ORBatisFramework/ExecuteEventArgs.cs create mode 100644 ORBatisFramework/ISqlMapSession.cs create mode 100644 ORBatisFramework/ISqlMapper.cs create mode 100644 ORBatisFramework/Logging/ConfigurationSectionHandler.cs create mode 100644 ORBatisFramework/Logging/LogManager.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/DefaultStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/SelectListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ArgumentStrategy/SelectStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/BaseStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/CachingStatement.cs create mode 100644 ORBatisFramework/MappedStatements/DeleteMappedStatement.cs create mode 100644 ORBatisFramework/MappedStatements/IMappedStatement.cs create mode 100644 ORBatisFramework/MappedStatements/InsertMappedStatement.cs create mode 100644 ORBatisFramework/MappedStatements/MappedStatement.cs create mode 100644 ORBatisFramework/MappedStatements/PaginatedList.cs create mode 100644 ORBatisFramework/MappedStatements/PostBindind.cs create mode 100644 ORBatisFramework/MappedStatements/PostSelectStrategy/ArrayStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PostSelectStrategy/GenericListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PostSelectStrategy/ListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PostSelectStrategy/ObjectStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs create mode 100644 ORBatisFramework/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/DefaultStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/GroupByStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/IPropertyStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/ResultMapStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/SelectArrayStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/SelectListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/SelectObjectStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/PropertStrategy/SelectStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ReaderAutoMapper.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/AutoMapStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/BaseResultStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/ClassDiagram.cd create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/DictionaryStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/GroupByStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/IResultStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/ListStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/MapStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/ObjectStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/ResultClassStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/ResultMapStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/ResultStrategyFactory.cs create mode 100644 ORBatisFramework/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs create mode 100644 ORBatisFramework/MappedStatements/SelectMappedStatement.cs create mode 100644 ORBatisFramework/MappedStatements/UpdateMappedStatement.cs create mode 100644 ORBatisFramework/Mapper.cs create mode 100644 ORBatisFramework/ORBatisFramework.csproj create mode 100644 ORBatisFramework/Properties/AssemblyInfo.cs create mode 100644 ORBatisFramework/Proxy/ILazyFactory.cs create mode 100644 ORBatisFramework/Proxy/LazyFactoryBuilder.cs create mode 100644 ORBatisFramework/Proxy/LazyList.cs create mode 100644 ORBatisFramework/Proxy/LazyListFactory.cs create mode 100644 ORBatisFramework/Proxy/LazyListGeneric.cs create mode 100644 ORBatisFramework/Proxy/LazyListGenericFactory.cs create mode 100644 ORBatisFramework/Proxy/LazyLoadInterceptor.cs create mode 100644 ORBatisFramework/Proxy/LazyLoadProxyFactory.cs create mode 100644 ORBatisFramework/Scope/ConfigurationScope.cs create mode 100644 ORBatisFramework/Scope/ErrorContext.cs create mode 100644 ORBatisFramework/Scope/IScope.cs create mode 100644 ORBatisFramework/Scope/RequestScope.cs create mode 100644 ORBatisFramework/SqlMap.xsd create mode 100644 ORBatisFramework/SqlMapConfig.xsd create mode 100644 ORBatisFramework/SqlMapModule.xsd create mode 100644 ORBatisFramework/SqlMapSession.cs create mode 100644 ORBatisFramework/SqlMapper.cs create mode 100644 ORBatisFramework/TypeHandlers/AnsiStringTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/BaseTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/BooleanTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/ByteArrayTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/ByteTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/CharTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/CustomTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/DBNullTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/DateTimeTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/DecimalTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/DoubleTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/EnumTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/GuidTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/IParameterSetter.cs create mode 100644 ORBatisFramework/TypeHandlers/IResultGetter.cs create mode 100644 ORBatisFramework/TypeHandlers/ITypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/ITypeHandlerCallback.cs create mode 100644 ORBatisFramework/TypeHandlers/Int16TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Int32TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Int64TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableByteTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableCharTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableGuidTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableInt16TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableInt32TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableInt64TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableSByteTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableSingleTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/ObjectTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/ParameterSetterImpl.cs create mode 100644 ORBatisFramework/TypeHandlers/ResultGetterImpl.cs create mode 100644 ORBatisFramework/TypeHandlers/SByteTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/SingleTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/StringTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/TimeSpanTypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/TypeHandlerFactory.cs create mode 100644 ORBatisFramework/TypeHandlers/UInt16TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/UInt32TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/UInt64TypeHandler.cs create mode 100644 ORBatisFramework/TypeHandlers/UnknownTypeHandler.cs create mode 100644 ORBatisFramework/Utilities/ConfigWatcherHandler.cs create mode 100644 ORBatisFramework/Utilities/Objects/DelegateFactory.cs create mode 100644 ORBatisFramework/Utilities/Objects/DelegateObjectFactory.cs create mode 100644 ORBatisFramework/Utilities/Objects/EmitObjectFactory.cs create mode 100644 ORBatisFramework/Utilities/Objects/FactoryBuilder.cs create mode 100644 ORBatisFramework/Utilities/Objects/FactoryLogAdapter.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/DelegateGetFieldAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/DelegatePropertySetAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/DelegateSetFieldAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/EmitFieldGetAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/EmitFieldSetAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/EmitPropertyGetAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/EmitPropertySetAccessor.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/GetAccessorFactory.cs create mode 100644 ORBatisFramework/Utilities/Objects/Members/SetAccessorFactory.cs create mode 100644 ORBatisFramework/Utilities/Objects/ObjectFactory.cs create mode 100644 ORBatisFramework/Utilities/Resources.cs create mode 100644 ORBatisFramework/packages.config delete mode 100644 README.txt delete mode 100644 docs/README.html delete mode 100644 docs/dataAccessGuide/resources/IBatisNet.vsd delete mode 100644 docs/dataAccessGuide/src/en/configuration.xml delete mode 100644 docs/dataAccessGuide/src/en/dao.xml delete mode 100644 docs/dataAccessGuide/src/en/example.xml delete mode 100644 docs/dataAccessGuide/src/en/handler.xml delete mode 100644 docs/dataAccessGuide/src/en/images/DAODesign.gif delete mode 100644 docs/dataAccessGuide/src/en/images/DAODiagram.gif delete mode 100644 docs/dataAccessGuide/src/en/images/ibatisnet.gif delete mode 100644 docs/dataAccessGuide/src/en/index.xml delete mode 100644 docs/dataAccessGuide/src/en/interface.xml delete mode 100644 docs/dataAccessGuide/src/en/introduction.xml delete mode 100644 docs/dataAccessGuide/src/en/programming.xml delete mode 100644 docs/dataAccessGuide/src/en/xsd-template.xml delete mode 100644 docs/dataAccessGuide/styles/fopdf.xsl delete mode 100644 docs/dataAccessGuide/styles/html.css delete mode 100644 docs/dataAccessGuide/styles/html.xsl delete mode 100644 docs/dataMapperGuide/resources/DataMapper.ppt delete mode 100644 docs/dataMapperGuide/src/en/architecture.xml delete mode 100644 docs/dataMapperGuide/src/en/dotnet.xml delete mode 100644 docs/dataMapperGuide/src/en/images/DevGuide-1.gif delete mode 100644 docs/dataMapperGuide/src/en/images/ibatisnet.gif delete mode 100644 docs/dataMapperGuide/src/en/images/intellisense.GIF delete mode 100644 docs/dataMapperGuide/src/en/images/new.gif delete mode 100644 docs/dataMapperGuide/src/en/index.xml delete mode 100644 docs/dataMapperGuide/src/en/introduction.xml delete mode 100644 docs/dataMapperGuide/src/en/working.xml delete mode 100644 docs/dataMapperGuide/src/en/xsd-config-template.xml delete mode 100644 docs/dataMapperGuide/src/en/xsd-sqlMap-template.xml delete mode 100644 docs/dataMapperGuide/styles/fopdf.xsl delete mode 100644 docs/dataMapperGuide/styles/html.css delete mode 100644 docs/dataMapperGuide/styles/html.xsl delete mode 100644 docs/doc.build delete mode 100644 docs/doc.build.include.windows delete mode 100644 docs/docbook/dtd/40chg.txt delete mode 100644 docs/docbook/dtd/41chg.txt delete mode 100644 docs/docbook/dtd/ChangeLog delete mode 100644 docs/docbook/dtd/calstblx.dtd delete mode 100644 docs/docbook/dtd/dbcentx.mod delete mode 100644 docs/docbook/dtd/dbgenent.mod delete mode 100644 docs/docbook/dtd/dbhierx.mod delete mode 100644 docs/docbook/dtd/dbnotnx.mod delete mode 100644 docs/docbook/dtd/dbpoolx.mod delete mode 100644 docs/docbook/dtd/docbook.cat delete mode 100644 docs/docbook/dtd/docbookx.dtd delete mode 100644 docs/docbook/dtd/ent/iso-amsa.ent delete mode 100644 docs/docbook/dtd/ent/iso-amsb.ent delete mode 100644 docs/docbook/dtd/ent/iso-amsc.ent delete mode 100644 docs/docbook/dtd/ent/iso-amsn.ent delete mode 100644 docs/docbook/dtd/ent/iso-amso.ent delete mode 100644 docs/docbook/dtd/ent/iso-amsr.ent delete mode 100644 docs/docbook/dtd/ent/iso-box.ent delete mode 100644 docs/docbook/dtd/ent/iso-cyr1.ent delete mode 100644 docs/docbook/dtd/ent/iso-cyr2.ent delete mode 100644 docs/docbook/dtd/ent/iso-dia.ent delete mode 100644 docs/docbook/dtd/ent/iso-grk1.ent delete mode 100644 docs/docbook/dtd/ent/iso-grk2.ent delete mode 100644 docs/docbook/dtd/ent/iso-grk3.ent delete mode 100644 docs/docbook/dtd/ent/iso-grk4.ent delete mode 100644 docs/docbook/dtd/ent/iso-lat1.ent delete mode 100644 docs/docbook/dtd/ent/iso-lat2.ent delete mode 100644 docs/docbook/dtd/ent/iso-num.ent delete mode 100644 docs/docbook/dtd/ent/iso-pub.ent delete mode 100644 docs/docbook/dtd/ent/iso-tech.ent delete mode 100644 docs/docbook/dtd/readme.txt delete mode 100644 docs/docbook/dtd/soextblx.dtd delete mode 100644 docs/docbook/readme.txt delete mode 100644 docs/docbook/styles/readme.txt delete mode 100644 docs/favicon.ico delete mode 100644 docs/fop/readme.txt delete mode 100644 docs/skin/breadcrumbs-optimized.js delete mode 100644 docs/skin/breadcrumbs.js delete mode 100644 docs/skin/images/chapter.gif delete mode 100644 docs/skin/images/chapter_open.gif delete mode 100644 docs/skin/images/current.gif delete mode 100644 docs/skin/images/doc.gif delete mode 100644 docs/skin/images/favicon.ico delete mode 100644 docs/skin/images/label.gif delete mode 100644 docs/skin/images/menu-left.gif delete mode 100644 docs/skin/images/menu-right.gif delete mode 100644 docs/skin/images/page.gif delete mode 100644 docs/skin/images/pdfdoc.gif delete mode 100644 docs/skin/images/printer.gif delete mode 100644 docs/skin/images/search-left.gif delete mode 100644 docs/skin/images/search-right.gif delete mode 100644 docs/skin/images/singlepage.gif delete mode 100644 docs/skin/images/spacer.gif delete mode 100644 docs/skin/images/tab-left.gif delete mode 100644 docs/skin/images/tab-right.gif delete mode 100644 docs/skin/images/tabSel-left.gif delete mode 100644 docs/skin/images/tabSel-right.gif delete mode 100644 docs/skin/images/valid-html401.png delete mode 100644 docs/skin/images/vcss.png delete mode 100644 docs/skin/images/xmldoc.gif delete mode 100644 docs/skin/page.css delete mode 100644 docs/tutorial/src/en/images/figure01.gif delete mode 100644 docs/tutorial/src/en/images/figure02.gif delete mode 100644 docs/tutorial/src/en/images/figure03.gif delete mode 100644 docs/tutorial/src/en/index.xml delete mode 100644 docs/tutorial/src/en/tutorial.xml delete mode 100644 docs/tutorial/styles/fopdf.xsl delete mode 100644 docs/tutorial/styles/html.css delete mode 100644 docs/tutorial/styles/html.xsl delete mode 100644 docs/xsltproc/readme.txt delete mode 100644 src/Common.sln delete mode 100644 src/CommonAssemblyInfo.cs delete mode 100644 src/DataAccess-Release.sln delete mode 100644 src/DataAccess.sln delete mode 100644 src/DataMapper.2003.sln delete mode 100644 src/DataMapper.2005.sln delete mode 100644 src/DataMapper.2008.sln delete mode 100644 src/External-Bin/Net/1.1/Castle.DynamicProxy.dll delete mode 100644 src/External-Bin/Net/1.1/Castle.DynamicProxy.license.txt delete mode 100644 src/External-Bin/Net/1.1/License.txt delete mode 100644 src/External-Bin/Net/1.1/log4net.dll delete mode 100644 src/External-Bin/Net/1.1/log4net.license.txt delete mode 100644 src/External-Bin/Net/1.1/log4net.xml delete mode 100644 src/External-Bin/Net/1.1/readme.txt delete mode 100644 src/External-Bin/Net/2.0/Castle.Core.dll delete mode 100644 src/External-Bin/Net/2.0/License.txt delete mode 100644 src/External-Bin/Net/2.0/log4net.dll delete mode 100644 src/External-Bin/Net/2.0/log4net.license.txt delete mode 100644 src/External-Bin/Net/2.0/log4net.xml delete mode 100644 src/External-Bin/Net/2.0/readme.txt delete mode 100644 src/External-Bin/Net/4.0/Castle.Core.dll delete mode 100644 src/External-Bin/Net/4.0/Castle.Core.xml delete mode 100644 src/External-Bin/Net/4.0/Castle.DynamicProxy.dll delete mode 100644 src/External-Bin/Net/4.0/Castle.Services.Logging.Log4netIntegration.dll delete mode 100644 src/External-Bin/Net/4.0/castle_core_readme.txt delete mode 100644 src/External-Bin/Net/4.0/log4net.dll delete mode 100644 src/External-Bin/Net/4.0/log4net.xml delete mode 100644 src/External-Bin/Net/4.0/log4net_README.txt delete mode 100644 src/External-Bin/Net/4.0/log4net_license.txt delete mode 100644 src/External-Bin/nunit/2.4.8/nunit.framework.dll delete mode 100644 src/External-Bin/nunit/2.5.5.10112/nunit.framework.dll delete mode 100644 src/HtmlHelpOverview.html delete mode 100644 src/IBatisNet.2003.sln delete mode 100644 src/IBatisNet.2005.sln delete mode 100644 src/IBatisNet.2010.sln delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/AssemblyInfo.cs delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2005.csproj delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2010.csproj delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net35.2010.csproj delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net40.build delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net45.2012.csproj delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.build delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.csproj delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net_net4.build delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/Log4NetLogger.cs delete mode 100644 src/IBatisNet.Common.Logging.Log4Net/Log4NetLoggerFA.cs delete mode 100644 src/IBatisNet.Common.Test/AssemblyInfo.cs delete mode 100644 src/IBatisNet.Common.Test/DataBase-Template.config delete mode 100644 src/IBatisNet.Common.Test/DataBase.config delete mode 100644 src/IBatisNet.Common.Test/Domain/Account.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/Address.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/BaseDomain.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/Book.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/Document.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/DocumentCollection.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/GenericDocumentCollection.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/IAddress.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/IBaseDomain.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/IUser.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/Item.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/Order.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/Property.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/Simple.cs delete mode 100644 src/IBatisNet.Common.Test/Domain/User.cs delete mode 100644 src/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj delete mode 100644 src/IBatisNet.Common.Test/IBatisNet.Common.Test.2010.csproj delete mode 100644 src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net35.2010.csproj delete mode 100644 src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net45.2012.csproj delete mode 100644 src/IBatisNet.Common.Test/IBatisNet.Common.Test.build delete mode 100644 src/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj delete mode 100644 src/IBatisNet.Common.Test/Maps/Access/OleDb/Account.xml delete mode 100644 src/IBatisNet.Common.Test/Maps/MSSQL/Odbc/Account.xml delete mode 100644 src/IBatisNet.Common.Test/Maps/MSSQL/OleDb/Account.xml delete mode 100644 src/IBatisNet.Common.Test/Maps/MSSQL/SqlClient/Account.xml delete mode 100644 src/IBatisNet.Common.Test/Maps/MySql/ByteFx/Account.xml delete mode 100644 src/IBatisNet.Common.Test/Maps/Oracle/ODP/Account.xml delete mode 100644 src/IBatisNet.Common.Test/Maps/Oracle/OracleClient/Account.xml delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/ConfigWatcher/ConfigWatcherTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMyInterface.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMySecondInterface.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MyInterfaceImpl.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MySecondInterfaceImpl.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/ProxyTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Logging/LogTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Pagination/PaginatedArrayListTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/BaseTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/TransactionTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/BaseMemberTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ProtectedFieldAccessorTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PublicFieldAccessorTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ReflectionInfoTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ResourcesTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeResolverTest.cs delete mode 100644 src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeUtilsTest.cs delete mode 100644 src/IBatisNet.Common.Test/ReadMe.txt delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/DataBase.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/DataBaseNHibernate.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/account-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/account-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/category-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/category-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/documents-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/enumeration-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/line-item-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/more-account-records.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/order-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/other-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/swap-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Access/user-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/DBCreation.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/DataBase.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/account-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/account-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/category-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/category-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/enumeration-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/line-item-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/more-account-records.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/order-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/other-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/swap-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MSSQL/user-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/DataBase.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/account-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/account-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/category-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/category-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/enumeration-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/line-item-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/more-account-records.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/order-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/other-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/swap-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/MySql/user-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/DataBase.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/DataBaseNHibernate.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/account-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/account-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/category-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/category-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/enumeration-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/line-item-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/more-account-records.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/order-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/other-init.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/swap-procedure.sql delete mode 100644 src/IBatisNet.Common.Test/Scripts/Oracle/user-init.sql delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/IBatisNet.Common.Test.dll.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/OctopusService.dll delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMapConfig.xsd delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMap_Access_OleDb.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_Odbc.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_OleDb.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMap_MySql_ByteFx.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_ODP.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_OracleClient.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/dao_Access_OleDb.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_Odbc.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_OleDb.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_SqlClient.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/dao_MySql_ByteFx.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_ODP.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_OracleClient.config delete mode 100644 src/IBatisNet.Common.Test/bin/Debug/providers.config delete mode 100644 src/IBatisNet.Common.Test/license.txt delete mode 100644 src/IBatisNet.Common.Test/properties.xml delete mode 100644 src/IBatisNet.Common/AssemblyInfo.cs delete mode 100644 src/IBatisNet.Common/AssemblyKey.snk delete mode 100644 src/IBatisNet.Common/DataSource.cs delete mode 100644 src/IBatisNet.Common/DataSourceDeSerializer.cs delete mode 100644 src/IBatisNet.Common/DbProvider.cs delete mode 100644 src/IBatisNet.Common/Exceptions/ConfigurationException.cs delete mode 100644 src/IBatisNet.Common/Exceptions/ForeignKeyException.cs delete mode 100644 src/IBatisNet.Common/Exceptions/IBatisNetException.cs delete mode 100644 src/IBatisNet.Common/Exceptions/ProbeException.cs delete mode 100644 src/IBatisNet.Common/IBatisNet.Common.Net40.build delete mode 100644 src/IBatisNet.Common/IBatisNet.Common.build delete mode 100644 src/IBatisNet.Common/IBatisNet.Common_net4.build delete mode 100644 src/IBatisNet.Common/IConnectionAdapter.cs delete mode 100644 src/IBatisNet.Common/IDalSession.cs delete mode 100644 src/IBatisNet.Common/IDataSource.cs delete mode 100644 src/IBatisNet.Common/IDbProvider.cs delete mode 100644 src/IBatisNet.Common/Logging/ConfigurationSectionHandler.cs delete mode 100644 src/IBatisNet.Common/Logging/IDataReaderProxy.cs delete mode 100644 src/IBatisNet.Common/Logging/IDbCommandProxy.cs delete mode 100644 src/IBatisNet.Common/Logging/IDbConnectionProxy.cs delete mode 100644 src/IBatisNet.Common/Logging/ILog.cs delete mode 100644 src/IBatisNet.Common/Logging/ILoggerFactoryAdapter.cs delete mode 100644 src/IBatisNet.Common/Logging/Impl/AbstractLogger.cs delete mode 100644 src/IBatisNet.Common/Logging/Impl/ConsoleOutLogger.cs delete mode 100644 src/IBatisNet.Common/Logging/Impl/ConsoleOutLoggerFA.cs delete mode 100644 src/IBatisNet.Common/Logging/Impl/NoOpLogger.cs delete mode 100644 src/IBatisNet.Common/Logging/Impl/NoOpLoggerFA.cs delete mode 100644 src/IBatisNet.Common/Logging/Impl/TraceLogger.cs delete mode 100644 src/IBatisNet.Common/Logging/Impl/TraceLoggerFA.cs delete mode 100644 src/IBatisNet.Common/Logging/LogManager.cs delete mode 100644 src/IBatisNet.Common/Logging/LogSetting.cs delete mode 100644 src/IBatisNet.Common/Pagination/IPaginatedList.cs delete mode 100644 src/IBatisNet.Common/Pagination/PaginatedArrayList.cs delete mode 100644 src/IBatisNet.Common/ProviderDeSerializer.cs delete mode 100644 src/IBatisNet.Common/Transaction/IsolationLevel.cs delete mode 100644 src/IBatisNet.Common/Transaction/TransactionOptions.cs delete mode 100644 src/IBatisNet.Common/Transaction/TransactionScope.cs delete mode 100644 src/IBatisNet.Common/Transaction/TransactionScopeOptions.cs delete mode 100644 src/IBatisNet.Common/Utilities/ConfigWatcherHandler.cs delete mode 100644 src/IBatisNet.Common/Utilities/DBHelperParameterCache.cs delete mode 100644 src/IBatisNet.Common/Utilities/HashCodeProvider.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/AbstractFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/DelegateFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/DelegateObjectFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/EmitObjectFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/FactoryBuilder.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/FactoryLogAdapter.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/IFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/AccessorFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/BaseAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/DelegateGetFieldAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertySetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/DelegateSetFieldAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldGetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldSetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyGetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertySetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/GetAccessorFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/IGetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/ISetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/Members/SetAccessorFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs delete mode 100644 src/IBatisNet.Common/Utilities/Objects/ReflectionInfo.cs delete mode 100644 src/IBatisNet.Common/Utilities/Proxy/CachedProxyGenerator.cs delete mode 100644 src/IBatisNet.Common/Utilities/Proxy/ProxyGeneratorFactory.cs delete mode 100644 src/IBatisNet.Common/Utilities/Resources.cs delete mode 100644 src/IBatisNet.Common/Utilities/ScriptRunner.cs delete mode 100644 src/IBatisNet.Common/Utilities/StringTokenizer.cs delete mode 100644 src/IBatisNet.Common/Utilities/TypeUtils.cs delete mode 100644 src/IBatisNet.Common/Utilities/TypesResolver/CachedTypeResolver.cs delete mode 100644 src/IBatisNet.Common/Utilities/TypesResolver/ITypeResolver.cs delete mode 100644 src/IBatisNet.Common/Utilities/TypesResolver/TypeRegistry.cs delete mode 100644 src/IBatisNet.Common/Utilities/TypesResolver/TypeResolver.cs delete mode 100644 src/IBatisNet.Common/Xml/NodeUtils.cs delete mode 100644 src/IBatisNet.Common/licence.txt delete mode 100644 src/IBatisNet.Common/notice.txt delete mode 100644 src/IBatisNet.Common/provider.xsd delete mode 100644 src/IBatisNet.DataAccess.Extensions/AssemblyInfo.cs delete mode 100644 src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSession.cs delete mode 100644 src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSessionHandler.cs delete mode 100644 src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.build delete mode 100644 src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.csproj delete mode 100644 src/IBatisNet.DataAccess.Extensions/license.txt delete mode 100644 src/IBatisNet.DataAccess.Extensions/notice.txt delete mode 100644 src/IBatisNet.DataAccess.Test/AssemblyInfo.cs delete mode 100644 src/IBatisNet.DataAccess.Test/ChangeLog.txt delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/AccountDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/MySqlAccountDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/OracleAccountDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Implementations/BaseDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Implementations/DataMapper/AccountDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Implementations/NHibernate/UserDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Interfaces/IAccountDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Dao/Interfaces/IuserDao.cs delete mode 100644 src/IBatisNet.DataAccess.Test/DataBase-Template.config delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/Account.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/AccountBis.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/AccountCollection.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/Category.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/Complex.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/Enumeration.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/LineItem.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/LineItemCollection.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/Order.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/Other.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/Search.cs delete mode 100644 src/IBatisNet.DataAccess.Test/Domain/User.cs delete mode 100644 src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2005.csproj delete mode 100644 src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2010.csproj delete mode 100644 src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net35.2010.csproj delete mode 100644 src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net45.2012.csproj delete mode 100644 src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.build delete mode 100644 src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.csproj delete mode 100644 src/IBatisNet.DataAccess.Test/IBatisNet.DataMapper.Test.build delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Account.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Category.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Complex.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Document.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Enumeration.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/LineItem.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Order.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Other.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/ResultClass.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Account.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Category.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Complex.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Enumeration.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/LineItem.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Order.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Other.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Account.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Category.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Complex.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Enumeration.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/LineItem.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Order.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Other.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Account.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Category.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Complex.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Enumeration.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/LineItem.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Order.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Other.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Account.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Category.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Complex.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Enumeration.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/LineItem.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Order.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Other.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Account.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Category.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Complex.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Enumeration.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/LineItem.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Order.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Other.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Account.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Category.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Complex.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Enumeration.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/LineItem.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Order.xml delete mode 100644 src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Other.xml delete mode 100644 src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MSSQL/AdoDaoTest.cs delete mode 100644 src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MySql/AdoDaoTest.cs delete mode 100644 src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/Oracle/AdoDaoTest.cs delete mode 100644 src/IBatisNet.DataAccess.Test/NUnit/DaoTests/BaseDaoTest.cs delete mode 100644 src/IBatisNet.DataAccess.Test/NUnit/DaoTests/MutipleDaoTest.cs delete mode 100644 src/IBatisNet.DataAccess.Test/NUnit/DaoTests/NHibernateDaoTest.cs delete mode 100644 src/IBatisNet.DataAccess.Test/NUnit/DaoTests/SqlMapDaoTest.cs delete mode 100644 src/IBatisNet.DataAccess.Test/ReadMe.txt delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/DataBase.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/DataBaseNHibernate.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/account-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/account-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/category-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/category-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/documents-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/enumeration-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/line-item-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/more-account-records.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/order-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/other-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/swap-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Access/user-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DBCreation.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DataBase.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/enumeration-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/line-item-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/more-account-records.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/order-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/other-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/swap-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MSSQL/user-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/DataBase.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/account-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/account-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/category-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/category-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/enumeration-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/line-item-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/more-account-records.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/order-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/other-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/swap-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/MySql/user-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBase.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBaseNHibernate.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/enumeration-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/line-item-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/more-account-records.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/order-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/other-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/swap-procedure.sql delete mode 100644 src/IBatisNet.DataAccess.Test/Scripts/Oracle/user-init.sql delete mode 100644 src/IBatisNet.DataAccess.Test/User.hbm.xml delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/IBatisNet.DataAccess.Test.dll.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Access_OleDb.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_Odbc.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_OleDb.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MySql_ByteFx.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_ODP.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_OracleClient.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_Access_OleDb.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_Odbc.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_OleDb.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_SqlClient.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_Multiple_Context.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_MySql_ByteFx.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_ODP.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_OracleClient.config delete mode 100644 src/IBatisNet.DataAccess.Test/bin/Debug/providers.config delete mode 100644 src/IBatisNet.DataAccess/AssemblyInfo.cs delete mode 100644 src/IBatisNet.DataAccess/ChangeLog.txt delete mode 100644 src/IBatisNet.DataAccess/Configuration/Dao.cs delete mode 100644 src/IBatisNet.DataAccess/Configuration/DaoProxy.cs delete mode 100644 src/IBatisNet.DataAccess/Configuration/DaoSessionHandler.cs delete mode 100644 src/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs delete mode 100644 src/IBatisNet.DataAccess/Configuration/Serializers/DaoDeSerializer.cs delete mode 100644 src/IBatisNet.DataAccess/Configuration/Serializers/DaoSessionHandlerDeSerializer.cs delete mode 100644 src/IBatisNet.DataAccess/DaoConfig.xsd delete mode 100644 src/IBatisNet.DataAccess/DaoManager.cs delete mode 100644 src/IBatisNet.DataAccess/DaoSession.cs delete mode 100644 src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSession.cs delete mode 100644 src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSessionHandler.cs delete mode 100644 src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSession.cs delete mode 100644 src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSessionHandler.cs delete mode 100644 src/IBatisNet.DataAccess/Exceptions/DataAccessException.cs delete mode 100644 src/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj delete mode 100644 src/IBatisNet.DataAccess/IBatisNet.DataAccess.2010.csproj delete mode 100644 src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net35.2010.csproj delete mode 100644 src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net45.2012.csproj delete mode 100644 src/IBatisNet.DataAccess/IBatisNet.DataAccess.build delete mode 100644 src/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj delete mode 100644 src/IBatisNet.DataAccess/IDaoManager.cs delete mode 100644 src/IBatisNet.DataAccess/Interfaces/IDao.cs delete mode 100644 src/IBatisNet.DataAccess/Interfaces/IDaoSessionHandler.cs delete mode 100644 src/IBatisNet.DataAccess/MessageManager.cs delete mode 100644 src/IBatisNet.DataAccess/Scope/ConfigurationScope.cs delete mode 100644 src/IBatisNet.DataAccess/Scope/ErrorContext.cs delete mode 100644 src/IBatisNet.DataAccess/SessionHolder.cs delete mode 100644 src/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs delete mode 100644 src/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs delete mode 100644 src/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs delete mode 100644 src/IBatisNet.DataAccess/SessionStore/ISessionStore.cs delete mode 100644 src/IBatisNet.DataAccess/SessionStore/SessionStoreFactory .cs delete mode 100644 src/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs delete mode 100644 src/IBatisNet.DataAccess/licence.txt delete mode 100644 src/IBatisNet.DataAccess/notice.txt delete mode 100644 src/IBatisNet.DataMapper.Test/AssemblyInfo.cs delete mode 100644 src/IBatisNet.DataMapper.Test/DataBase-Template.config delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/A.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Account.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/AccountBis.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/AccountCollection.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Address.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Application.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/B.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Book.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/C.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Category.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Child.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Complex.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Coupon.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/CustomInheritance.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/D.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Document.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/DocumentCollection.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/E.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Enumeration.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/F.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/GuidStringTypeHandlerCallback.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/HundredsTypeHandlerCallback.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/ImmutableCategory.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/ImmutableCategoryPropertyContainer.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Item.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/LineItem.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/LineItemCollection.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/LineItemCollection2.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Newspaper.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Nullable.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/OneZeroBoolTypeHandlerCallback.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Order.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Other.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/OuiNonBoolTypeHandlerCallback.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Parent.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Petshop/Category.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Petshop/Item.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Petshop/Product.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Product.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Query.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Role.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Sample.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Search.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/Simple.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/User.cs delete mode 100644 src/IBatisNet.DataMapper.Test/Domain/VarcharCallBack.cs delete mode 100644 src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj delete mode 100644 src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2010.csproj delete mode 100644 src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net35.2010.csproj delete mode 100644 src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net45.2012.csproj delete mode 100644 src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.build delete mode 100644 src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj delete mode 100644 src/IBatisNet.DataMapper.Test/IBatisNet.Test.build delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ConstructorInjection.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Coupons.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/EmbedParameter.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/GroupByMapping.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/MapModule.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Module/Order2.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/NewsPaper.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild1.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild2.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Account.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Category.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Complex.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/ConstructorInjection.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Coupons.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Document.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/DynamicAccount.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/EmbedParameter.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Enumeration.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/GroupByMapping.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/LineItem.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/MapModule.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Module/Order2.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/NewsPaper.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Nullable.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Order.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Other.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParameterClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild1.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild2.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/ResultClass.xml delete mode 100644 src/IBatisNet.DataMapper.Test/Maps/SQLite3/Simple.xml delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/BaseTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/FifoCacheControllerTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/LruCacheControllerTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/MemoryCacheControllerTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ComplexTypeTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicPrependTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/GenericListTests.txt delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/NullableTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultClassTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultMapTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/StatementTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/EmbedParameterTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/Generics/StatementTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/ProcedureTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementGenerate.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ModuleTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MultipleResultTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementGenerate.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/ProcedureTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementGenerate.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterClass.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterMapTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementGenerate.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultClassTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultMapTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementNamespaceTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ThreadTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/TransactionTest.cs delete mode 100644 src/IBatisNet.DataMapper.Test/ReadMe.txt delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/DataBase.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/DataBaseNHibernate.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/account-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/account-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/category-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/category-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/documents-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/enumeration-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/line-item-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/more-account-records.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/order-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/other-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/swap-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/teardown.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Access/user-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DBCreation.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DataBase.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/Nullable-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/README-embed-param.txt delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedureWithReturn.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/child-parent-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/coupons-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-setup-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-test-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/enumeration-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-schema.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/line-item-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/more-account-records.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/order-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/other-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-drop.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-schema.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAccount.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAllAccount.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectByIdList.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectLineItem.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/simple-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/swap-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/teardown.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/DataBase.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/account-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/account-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/category-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/category-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/documents-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/enumeration-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/line-item-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/more-account-records.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/order-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/other-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/simple-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/swap-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/teardown.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/MySql/user-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBase.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBaseNHibernate.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/Nullable-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-body.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-spec.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/documents-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/enumeration-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/line-item-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/more-account-records.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/order-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/other-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/simple-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/swap-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/teardown.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/Oracle/user-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/DataBase.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/documents-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/enumeration-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/line-item-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/more-account-records.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/nullable-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/order-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/other-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/simple-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/swap-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/teardown.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/user-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DBCreation.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DataBase.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/Nullable-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/README-embed-param.txt delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedureWithReturn.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/child-parent-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/coupons-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/documents-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-setup-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-test-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/enumeration-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-schema.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/line-item-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/more-account-records.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/order-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/other-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-drop.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-schema.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAccount.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAllAccount.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectByIdList.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectLineItem.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/simple-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/swap-procedure.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/teardown.sql delete mode 100644 src/IBatisNet.DataMapper.Test/Scripts/SQLite3/user-init.sql delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/IBatisNet.DataMapper.Test.dll.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Access_OleDb.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_Odbc.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_OleDb.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_ByteFx.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_MySql.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_ODP.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_OracleClient.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_PostgreSQL_Npgsql.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_SQLite3_SQLite3.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/cool.jpg delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/providers.config delete mode 100644 src/IBatisNet.DataMapper.Test/bin/Debug/test.config delete mode 100644 src/IBatisNet.DataMapper.Test/cool.jpg delete mode 100644 src/IBatisNet.DataMapper/AssemblyInfo.cs delete mode 100644 src/IBatisNet.DataMapper/AssemblyKey.snk delete mode 100644 src/IBatisNet.DataMapper/ChangeLog.txt delete mode 100644 src/IBatisNet.DataMapper/Commands/DataReaderDecorator.cs delete mode 100644 src/IBatisNet.DataMapper/Commands/DataReaderTransformer.cs delete mode 100644 src/IBatisNet.DataMapper/Commands/DbCommandDecorator.cs delete mode 100644 src/IBatisNet.DataMapper/Commands/DefaultPreparedCommand.cs delete mode 100644 src/IBatisNet.DataMapper/Commands/EmbedParamsPreparedCommand.cs delete mode 100644 src/IBatisNet.DataMapper/Commands/IPreparedCommand.cs delete mode 100644 src/IBatisNet.DataMapper/Commands/InMemoryDataReader.cs delete mode 100644 src/IBatisNet.DataMapper/Commands/PreparedCommandFactory.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Alias/TypeAlias.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Alias/TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/CacheKey.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/CacheModel.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/Fifo/FifoCacheController.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/FlushInterval.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/ICacheController.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/Lru/LruCacheController.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/Memory/MemoryCacheControler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Cache/Memory/MemoryCacheLevel.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/DomSqlMapBuilder.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ParameterMapping/InlineParameterMapParser.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterMap.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterProperty.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterPropertyCollection.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/ArgumentProperty.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/AutoResultMap.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/Discriminator.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/DynamicResultMap.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/IColumn.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/IResultMap.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/NullResultMap.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMapCollection.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultProperty.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultPropertyCollection.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/ResultMapping/SubMap.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/ArgumentPropertyDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/DeSerializerFactory.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/DeleteDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/DiscriminatorDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/DynamicDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/InsertDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsEmptyDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsEqualDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterEqualDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterThanDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsLessEqualDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsLessThanDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEmptyDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEqualDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsNotNullDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsNullDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsParameterPresentDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/IterateSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/ParameterMapDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/ParameterPropertyDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/ResultMapDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/ResultPropertyDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/SelectDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/SqlDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/StatementDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/SubMapDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/TypeAliasDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/TypeHandlerDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Serializers/UpdateDeSerializer.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/DynamicSql.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/BaseTag.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Conditional.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Dynamic.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEmpty.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEqual.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessThan.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotNull.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNull.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Iterate.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/SqlTag.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateContext.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/ISqlChild.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/SqlText.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/ISql.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Static/ProcedureSql.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Sql/Static/StaticSql.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/Delete.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/Generate.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/IStatement.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/Insert.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatement.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatementFactory.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/Procedure.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/Select.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/SqlGenerator.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/Statement.cs delete mode 100644 src/IBatisNet.DataMapper/Configuration/Statements/Update.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/BaseDataExchange.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/ComplexDataExchange.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/DataExchangeFactory.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/DictionaryDataExchange.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/DotNetObjectDataExchange.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/IDataExchange.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/ListDataExchange.cs delete mode 100644 src/IBatisNet.DataMapper/DataExchange/PrimitiveDataExchange.cs delete mode 100644 src/IBatisNet.DataMapper/Delegates.cs delete mode 100644 src/IBatisNet.DataMapper/Enumeration.cs delete mode 100644 src/IBatisNet.DataMapper/Exceptions/DataMapperException.cs delete mode 100644 src/IBatisNet.DataMapper/ExecuteEventArgs.cs delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper.20005.csproj delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper.2010.csproj delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper.Net35.2010.csproj delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper.Net40.build delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper.Net45.2012.csproj delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper.build delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper.csproj delete mode 100644 src/IBatisNet.DataMapper/IBatisNet.DataMapper_net4.build delete mode 100644 src/IBatisNet.DataMapper/ISqlMapSession.cs delete mode 100644 src/IBatisNet.DataMapper/ISqlMapper.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/DefaultStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/SelectListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ArgumentStrategy/SelectStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/BaseStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/CachingStatement.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/DeleteMappedStatement.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/IMappedStatement.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/InsertMappedStatement.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/MappedStatement.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PaginatedList.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostBindind.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostSelectStrategy/ArrayStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostSelectStrategy/GenericListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostSelectStrategy/ListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostSelectStrategy/ObjectStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/DefaultStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/GroupByStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/IPropertyStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/SelectArrayStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/SelectListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/SelectObjectStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/PropertStrategy/SelectStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ReaderAutoMapper.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/AutoMapStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/BaseResultStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/DictionaryStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/DynamicMapStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/GroupByStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/IResultStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/ListStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/MapStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/ObjectStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/ResultMapStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/ResultStrategyFactory.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/SelectMappedStatement.cs delete mode 100644 src/IBatisNet.DataMapper/MappedStatements/UpdateMappedStatement.cs delete mode 100644 src/IBatisNet.DataMapper/Mapper.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/ILazyFactory.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/LazyFactoryBuilder.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/LazyList.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/LazyListFactory.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/LazyListGeneric.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/LazyListGenericFactory.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/LazyLoadInterceptor.cs delete mode 100644 src/IBatisNet.DataMapper/Proxy/LazyLoadProxyFactory.cs delete mode 100644 src/IBatisNet.DataMapper/ReadMe.txt delete mode 100644 src/IBatisNet.DataMapper/Scope/ConfigurationScope.cs delete mode 100644 src/IBatisNet.DataMapper/Scope/ErrorContext.cs delete mode 100644 src/IBatisNet.DataMapper/Scope/IScope.cs delete mode 100644 src/IBatisNet.DataMapper/Scope/RequestScope.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/AbstractSessionStore.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/CallContextSessionStore.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/HybridWebThreadSessionStore.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/ISessionStore.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/InstanceItems-net20.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/InstanceItems.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/SessionStoreFactory .cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/ThreadSessionStore.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/WcfSessionItemsInstanceExtension.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/WcfSessionStore.cs delete mode 100644 src/IBatisNet.DataMapper/SessionStore/WebSessionStore.cs delete mode 100644 src/IBatisNet.DataMapper/SqlMap.xsd delete mode 100644 src/IBatisNet.DataMapper/SqlMapConfig.xsd delete mode 100644 src/IBatisNet.DataMapper/SqlMapModule.xsd delete mode 100644 src/IBatisNet.DataMapper/SqlMapSession.cs delete mode 100644 src/IBatisNet.DataMapper/SqlMapper.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/AnsiStringTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/BaseTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/BooleanTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/ByteArrayTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/ByteTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/CharTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/CustomTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/DBNullTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/DateTimeTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/DecimalTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/DoubleTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/EnumTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/GuidTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/IParameterSetter.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/IResultGetter.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/ITypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/ITypeHandlerCallback.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Int16TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Int32TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Int64TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableByteTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableCharTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableGuidTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableInt16TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableInt32TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableInt64TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableSByteTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableSingleTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/ObjectTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/ParameterSetterImpl.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/ResultGetterImpl.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/SByteTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/SingleTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/StringTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/TimeSpanTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/TypeHandlerFactory.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/UInt16TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/UInt32TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/UInt64TypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/TypeHandlers/UnknownTypeHandler.cs delete mode 100644 src/IBatisNet.DataMapper/licence.txt delete mode 100644 src/IBatisNet.DataMapper/notice.txt delete mode 100644 src/IBatisNet.Net35.2010.sln delete mode 100644 src/IBatisNet.Net4.2012.sln delete mode 100644 src/IBatisNet.Net4.2012.v11.suo delete mode 100644 src/IBatisNet.Net45.2012.sln delete mode 100644 src/IBatisNet.Net45.2012.v11.suo delete mode 100644 src/IBatisNet.mdb delete mode 100644 src/MSBuild/README.txt delete mode 100644 src/NHibernate.mdb delete mode 100644 src/README.txt delete mode 100644 src/iBATIS.Net40.build delete mode 100644 src/iBATIS.build delete mode 100644 src/iBATIS_net4.build delete mode 100644 src/iBATIS_old.build_ delete mode 100644 src/providers.config delete mode 100644 to-do.txt diff --git a/Examples/npetshop/External-bin/Apache.Avalon.DynamicProxy.dll b/Examples/npetshop/External-bin/Apache.Avalon.DynamicProxy.dll deleted file mode 100644 index c486b055522afa314d7569f45571e97538b49a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28672 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 NMZh9p5%|v#_zSozSL6Ty diff --git a/Examples/npetshop/External-bin/IBatisNet.Common.dll b/Examples/npetshop/External-bin/IBatisNet.Common.dll deleted file mode 100644 index b23fa1a7cd3fcf1bd10085456090cd1d8a15fe44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 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 diff --git a/Examples/npetshop/External-bin/log4net.dll b/Examples/npetshop/External-bin/log4net.dll deleted file mode 100644 index bfc63d794555231ab445b1bd1e8d1f21bd543f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196608 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

pVp7 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

9h`Pcx8W0ZsP-J(gjnA; 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 diff --git a/Examples/npetshop/NPetshop.Domain/Accounts/Account.cs b/Examples/npetshop/NPetshop.Domain/Accounts/Account.cs deleted file mode 100644 index b13ef01..0000000 --- a/Examples/npetshop/NPetshop.Domain/Accounts/Account.cs +++ /dev/null @@ -1,63 +0,0 @@ - -using System; - -namespace NPetshop.Domain.Accounts -{ - ///

- /// Business entity used to model user account - /// - [Serializable] - public class Account - { - - #region Private Fields - private string _login = string.Empty; - private string _password = string.Empty; - private string _email = string.Empty; - private string _status = string.Empty; - private Address _address = new Address(); - private Profile _profile = new Profile(); - #endregion - - #region Properties - public string Login - { - get{return _login;} - set{_login = value;} - } - - public string Password - { - get{return _password;} - set{_password = value;} - } - - public string Email - { - get{return _email;} - set{_email = value;} - } - - public string Status - { - get{return _status;} - set{_status = value;} - } - - public Address Address - { - get{return _address;} - set{_address = value;} - } - - - public Profile Profile - { - get{return _profile;} - set{_profile = value;} - } - - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Domain/Accounts/Address.cs b/Examples/npetshop/NPetshop.Domain/Accounts/Address.cs deleted file mode 100644 index f94f929..0000000 --- a/Examples/npetshop/NPetshop.Domain/Accounts/Address.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; - - -namespace NPetshop.Domain.Accounts -{ - /// - /// Business entity used to model an address - /// - [Serializable] - public class Address - { - - #region Private Fields - private string _firstName; - private string _lastName; - private string _address1; - private string _address2; - private string _city; - private string _state; - private string _zip; - private string _country; - private string _phone; - #endregion - - #region Properties - - public string FirstName - { - get { return _firstName; } - set { _firstName = value; } - } - - public string LastName - { - get { return _lastName; } - set { _lastName = value; } - } - - public string Address1 - { - get { return _address1; } - set { _address1 = value; } - } - - public string Address2 - { - get { return _address2; } - set { _address2 = value; } - } - - public string City - { - get { return _city; } - set { _city = value; } - } - - public string State - { - get { return _state; } - set { _state = value; } - } - - public string Zip - { - get { return _zip; } - set { _zip = value; } - } - - public string Country - { - get { return _country; } - set { _country = value; } - } - - public string Phone - { - get { return _phone; } - set { _phone = value; } - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Domain/Accounts/Profile.cs b/Examples/npetshop/NPetshop.Domain/Accounts/Profile.cs deleted file mode 100644 index b72f432..0000000 --- a/Examples/npetshop/NPetshop.Domain/Accounts/Profile.cs +++ /dev/null @@ -1,55 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Accounts -{ - /// - /// Business entity used to model user profile - /// - public class Profile - { - - #region Private Fields - private Category _favouriteCategory = null; - private string _favoriteLanguage = string.Empty; - private bool _isShowFavorites = false; - private bool _isShowBanners = false; - private string _bannerName = string.Empty; - #endregion - - #region Properties - - public Category FavouriteCategory - { - get{return _favouriteCategory;} - set{_favouriteCategory = value;} - } - - public string FavoriteLanguage - { - get{return _favoriteLanguage;} - set{_favoriteLanguage = value;} - } - - public bool IsShowFavorites - { - get{return _isShowFavorites;} - set{_isShowFavorites = value;} - } - - public bool IsShowBanners - { - get{return _isShowBanners;} - set{_isShowBanners = value;} - } - - public string BannerName - { - get{return _bannerName;} - set{_bannerName = value;} - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Domain/AssemblyInfo.cs b/Examples/npetshop/NPetshop.Domain/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop/NPetshop.Domain/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop/NPetshop.Domain/Billing/CreditCard.cs b/Examples/npetshop/NPetshop.Domain/Billing/CreditCard.cs deleted file mode 100644 index 8f4d1ed..0000000 --- a/Examples/npetshop/NPetshop.Domain/Billing/CreditCard.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; - - -namespace NPetshop.Domain.Billing -{ - - /// - /// Business entity used to model credit card information. - /// - [Serializable] - public class CreditCard{ - - #region Private Fields - private string _cardType; - private string _cardNumber; - private string _cardExpiration; - #endregion - - #region Properties - /// - /// Default constructor - /// - public CreditCard() - { - } - - /// - /// Constructor with specified initial values - /// - /// Card type, e.g. Visa, Master Card, American Express - /// Number on the card - /// Expiry Date, form MM/YY - public CreditCard(string cardType, string cardNumber, string cardExpiration){ - this._cardType = cardType; - this._cardNumber = cardNumber; - this._cardExpiration = cardExpiration; - } - - // Properties - public string CardType { - get { return _cardType; } - set { _cardType = value; } - } - - public string CardNumber { - get { return _cardNumber; } - set { _cardNumber = value; } - } - - public string CardExpiration { - get { return _cardExpiration; } - set { _cardExpiration = value; } - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Domain/Billing/LineItem.cs b/Examples/npetshop/NPetshop.Domain/Billing/LineItem.cs deleted file mode 100644 index 516780d..0000000 --- a/Examples/npetshop/NPetshop.Domain/Billing/LineItem.cs +++ /dev/null @@ -1,91 +0,0 @@ - -using System; - -using NPetshop.Domain.Shopping; -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Billing -{ - /// - /// Business entity used to model an order line item - /// - public class LineItem - { - - #region Private Fields - private Order _order = null; - private Item _item = null; - private int _lineNumber = 0; - private int _quantity = 0; - private decimal _total = 0.0m; - #endregion - - #region Constructors - public LineItem() { } - - public LineItem(int lineNumber, ShoppingCartLine cartItem) - { - _lineNumber = lineNumber; - this.Quantity = cartItem.Quantity; - this.Item = cartItem.Item; - } - #endregion - - #region Properties - - public Order Order - { - get{return _order;} - set{_order = value;} - } - - public int LineNumber - { - get{return _lineNumber;} - set{_lineNumber = value;} - } - - public decimal Total - { - get{return _total;} - } - - public Item Item - { - get{return _item;} - set - { - _item = value; - CalculateTotal(); - } - } - - - public int Quantity - { - get{return _quantity;} - set - { - _quantity = value; - CalculateTotal(); - } - } - #endregion - - #region Private methods - - private void CalculateTotal() - { - if (_item != null) - { - _total = this.Item.ListPrice * this.Quantity; - } - else - { - _total = 0.0m; - } - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Domain/Billing/Order.cs b/Examples/npetshop/NPetshop.Domain/Billing/Order.cs deleted file mode 100644 index 94a0390..0000000 --- a/Examples/npetshop/NPetshop.Domain/Billing/Order.cs +++ /dev/null @@ -1,115 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Accounts; -using NPetshop.Domain.Shopping; - -namespace NPetshop.Domain.Billing -{ - - /// - /// Business entity used to model an order - /// - [Serializable] - public class Order - { - - #region Private Fields - private int _id; - private Account _account; - private DateTime _orderDate; - private CreditCard _creditCard = new CreditCard(); - private Address _billingAddress = new Address(); - private Address _shippingAddress = new Address(); - private decimal _totalPrice; - private IList _lineItems = new ArrayList(); - #endregion - - #region Properties - - - public int Id - { - get{return _id;} - set{_id = value;} - } - - public Account Account - { - get{return _account;} - set{_account = value;} - } - - - public DateTime OrderDate - { - get{return _orderDate;} - set{_orderDate = value;} - } - - public CreditCard CreditCard - { - get{return _creditCard;} - set{_creditCard = value;} - } - - - public Address BillingAddress - { - get{return _billingAddress;} - set{_billingAddress = value;} - } - - public Address ShippingAddress - { - get{return _shippingAddress;} - set{_shippingAddress = value;} - } - - public decimal TotalPrice - { - get{return _totalPrice;} - set{_totalPrice = value;} - } - - public IList LineItems - { - get{return _lineItems;} - set{_lineItems = value;} - } - #endregion - - #region Public Methods - - public void InitOrder(Account account, ShoppingCart cart, Address address) - { - _account = account; - _orderDate = DateTime.Now; - - _shippingAddress = address; - _billingAddress = address; - - _totalPrice = cart.Total; - - IEnumerator enumerator = cart.GetAllLines(); - while( enumerator.MoveNext() ) - { - ShoppingCartLine cartLine = (ShoppingCartLine) enumerator.Current; - AddLineItem( cartLine ); - } - } - - public void AddLineItem(ShoppingCartLine cartItem) - { - LineItem lineItem = new LineItem(_lineItems.Count + 1, cartItem); - AddLineItem(lineItem); - } - - public void AddLineItem(LineItem lineItem) - { - _lineItems.Add(lineItem); - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Domain/Catalog/Category.cs b/Examples/npetshop/NPetshop.Domain/Catalog/Category.cs deleted file mode 100644 index d2f6564..0000000 --- a/Examples/npetshop/NPetshop.Domain/Catalog/Category.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections; - -namespace NPetshop.Domain.Catalog -{ - - /// - /// Business entity used to model category - /// - [Serializable] - public class Category - { - - #region Private Fields - private string _Id; - private string _name; - private string _description; - private IList _products = new ArrayList(); - #endregion - - #region Properties - public string Id - { - get{return _Id;} - set{_Id = value;} - } - - public string Name - { - get{return _name;} - set{_name = value;} - } - - - public string Description - { - get{return _description;} - set{_description = value;} - } - - public IList Products - { - get{return _products;} - set{_products = value;} - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Domain/Catalog/Item.cs b/Examples/npetshop/NPetshop.Domain/Catalog/Item.cs deleted file mode 100644 index 98febe8..0000000 --- a/Examples/npetshop/NPetshop.Domain/Catalog/Item.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; - -namespace NPetshop.Domain.Catalog -{ - /// - /// Summary description for Item. - /// - public class Item - { - #region Private Fields - private string _id; - private decimal _listPrice; - private decimal _unitCost; - private string _currency; - private string _photo; - private int _quantity; - private string _attribute1; - private Product _product; - private Supplier _supplier; - #endregion - - #region Properties - public string Attribute1 - { - get{return _attribute1;} - set{_attribute1 = value;} - } - - public int Quantity - { - get{return _quantity;} - set{_quantity = value;} - } - - public string Id - { - get{return _id;} - set{_id = value;} - } - - public decimal ListPrice - { - get{return _listPrice;} - set{_listPrice = value;} - } - - public decimal UnitCost - { - get{return _unitCost;} - set{_unitCost = value;} - } - - public string Currency - { - get{return _currency;} - set{_currency = value;} - } - - public Product Product - { - get{return _product;} - set{_product = value;} - } - - public Supplier Supplier - { - get{return _supplier;} - set{_supplier = value;} - } - - public string Photo - { - set {_photo = value;} - get {return _photo;} - } - - - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Domain/Catalog/Product.cs b/Examples/npetshop/NPetshop.Domain/Catalog/Product.cs deleted file mode 100644 index eafd852..0000000 --- a/Examples/npetshop/NPetshop.Domain/Catalog/Product.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; - -namespace NPetshop.Domain.Catalog -{ - - /// - /// Business entity used to model a product - /// - [Serializable] - public class Product { - - #region Private Fields - private string _id; - private string _name; - private string _description; - private Category _category; - #endregion - - #region Properties - public string Id - { - set{_id = value;} - get { return _id; } - } - - public string Name - { - set{_name = value;} - get { return _name; } - } - - public string Description - { - set{_description = value;} - get { return _description; } - } - - public Category Category - { - set{_category = value;} - get{return _category;} - } - #endregion - - } -} \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Domain/Catalog/Supplier.cs b/Examples/npetshop/NPetshop.Domain/Catalog/Supplier.cs deleted file mode 100644 index e6629bd..0000000 --- a/Examples/npetshop/NPetshop.Domain/Catalog/Supplier.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; - -using NPetshop.Domain.Accounts; - -namespace NPetshop.Domain.Catalog -{ - /// - /// Summary description for Supplier. - /// - public class Supplier - { - #region Private Fields - private int _id; - private string _name; - private Address _address = new Address(); - #endregion - - #region Properties - - public int Id - { - get{return _id;} - set{_id = value;} - } - - public string Name - { - get{return _name;} - set{_name = value;} - } - - public Address Address - { - get{return _address;} - set{_address = value;} - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj b/Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj deleted file mode 100644 index 5e2f242..0000000 --- a/Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj +++ /dev/null @@ -1,179 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj.user b/Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj.user deleted file mode 100644 index 417fa04..0000000 --- a/Examples/npetshop/NPetshop.Domain/NPetshop.Domain.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Domain/Sequence.cs b/Examples/npetshop/NPetshop.Domain/Sequence.cs deleted file mode 100644 index a26d2c0..0000000 --- a/Examples/npetshop/NPetshop.Domain/Sequence.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; - -namespace NPetshop.Domain -{ - - [Serializable] - public class Sequence - { - - #region Private Fields - private String _name; - private int _nextId; - #endregion - - /* Constructors */ - - public Sequence() { } - - public Sequence(String name, int nextId) - { - this._name = name; - this._nextId = nextId; - } - - #region Properties - - public string Name - { - set{_name = value;} - get { return _name; } - } - - - public int NextId - { - set{_nextId = value;} - get { return _nextId; } - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCart.cs b/Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCart.cs deleted file mode 100644 index 60f3d89..0000000 --- a/Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCart.cs +++ /dev/null @@ -1,127 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Shopping -{ - - [Serializable] - public class ShoppingCart : IEnumerable - { - #region Private Fields - private IPaginatedList _cartLines = new PaginatedArrayList(4); - #endregion - - #region Properties - - public IPaginatedList Lines - { - get{ return _cartLines; } - } - - public bool IsEmpty - { - get{ return _cartLines.Count == 0; } - } - - public decimal Total - { - get - { - decimal total = 0; - IEnumerator lines = GetAllLines(); - while (lines.MoveNext()) - { - ShoppingCartLine line = (ShoppingCartLine) lines.Current; - total += line.Total; - } - return total; - } - } - #endregion - - #region Pulbic methods - public IEnumerator GetEnumerator() - { - return _cartLines.GetEnumerator(); - } - - public IEnumerator GetAllLines() - { - ArrayList allItems = new ArrayList(); - int index = _cartLines.PageIndex; - _cartLines.GotoPage(0); - - foreach(ShoppingCartLine line in _cartLines) - { - allItems.Add(line); - } - while (_cartLines.NextPage()) - { - foreach(ShoppingCartLine line in _cartLines) - { - allItems.Add(line); - } - } - - _cartLines.GotoPage(index); - return allItems.GetEnumerator(); - } - - public void Add(ShoppingCartLine newLine){ - ShoppingCartLine existingLine = FindLine(newLine); - if (existingLine != null) - { - existingLine.Quantity += newLine.Quantity; - } - else - { - _cartLines.Add(newLine); - } - } - - public void Add(Item item){ - ShoppingCartLine existingLine = FindLine(item); - if (existingLine != null) - { - existingLine.Quantity += 1; - } - else - { - _cartLines.Add(new ShoppingCartLine(item)); - } - } - - public void RemoveLine(ShoppingCartLine otherLine){ - RemoveLine(otherLine.Item); - } - - public void RemoveLine(Item item){ - foreach (ShoppingCartLine line in _cartLines) - { - if (line.Item.Product.Name == item.Product.Name) - { - _cartLines.Remove(line); - break; - } - } - } - - public ShoppingCartLine FindLine(ShoppingCartLine otherLine){ - return FindLine(otherLine.Item); - } - - public ShoppingCartLine FindLine(Item item){ - foreach (ShoppingCartLine line in _cartLines){ - if (line.Item.Product.Name == item.Product.Name){ - return line; - } - } - return null; - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCartLine.cs b/Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCartLine.cs deleted file mode 100644 index fcce360..0000000 --- a/Examples/npetshop/NPetshop.Domain/Shopping/ShoppingCartLine.cs +++ /dev/null @@ -1,90 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Shopping -{ - - [Serializable] - public class ShoppingCartLine - { - #region Private Fields - private Item _item = null; - private bool _isInStock = false; - private int _quantity = -1; - private decimal _total = 0; - #endregion - - #region Constructors - public ShoppingCartLine(Item item) - { - this.Item = item; - this.Quantity = 1; - } - - public ShoppingCartLine(Item item, int quantity) - { - this.Item = item; - this.Quantity = quantity; - } - #endregion - - #region Properties - public Item Item - { - get { return _item; } - set - { - _item = value; - CalculateTotal(); - } - } - - public int Quantity - { - get { return _quantity; } - set - { - _quantity = value; - CalculateTotal(); - } - } - - public bool IsInStock - { - get { return _isInStock; } - set { _isInStock = value; } - } - - public decimal Total - { - get { return _total; } - } - - #endregion - - #region Public methods - public void IncrementQuantity() - { - _quantity++; - CalculateTotal(); - } - #endregion - - #region Private methods - private void CalculateTotal() - { - if (_item != null) - { - _total = _quantity * _item.ListPrice; - } - else - { - _total = 0; - } - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Domain/ToDo.txt b/Examples/npetshop/NPetshop.Domain/ToDo.txt deleted file mode 100644 index f85d96e..0000000 --- a/Examples/npetshop/NPetshop.Domain/ToDo.txt +++ /dev/null @@ -1,2 +0,0 @@ - -* finir le domaine comme Ibatis V2 \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Persistence/AssemblyInfo.cs b/Examples/npetshop/NPetshop.Persistence/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop/NPetshop.Persistence/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql b/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql deleted file mode 100644 index 9287403..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql +++ /dev/null @@ -1,16 +0,0 @@ -USE [NPetshop] - -if not exists (select * from master.dbo.syslogins where loginname = N'NPetshop') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'NPetshop', @loginpass=N'ibatisnet', @loginlang = N'us_english' - exec sp_addlogin N'NPetshop', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'NPetshop' and uid < 16382) - EXEC sp_grantdbaccess N'NPetshop', N'NPetshop' -GO - -exec sp_addrolemember N'db_owner', N'NPetshop' -GO \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql b/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql deleted file mode 100644 index c3c0499..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql +++ /dev/null @@ -1,86 +0,0 @@ - -INSERT INTO [Suppliers] VALUES (1, 'XYZ Pets', 'AC', '600 Avon Way', '', 'Los Angeles', 'CA', '94024', '212-947-0797') -INSERT INTO [Suppliers] VALUES (2, 'ABC Pets', 'AC', '700 Abalone Way', '', 'San Francisco', 'CA', '94024', '415-947-0797') - -INSERT INTO [Categories] VALUES ('FISH', 'Fish', NULL) -INSERT INTO [Categories] VALUES ('DOGS', 'Dogs', NULL) -INSERT INTO [Categories] VALUES ('REPTILES', 'Reptiles', NULL) -INSERT INTO [Categories] VALUES ('CATS', 'Cats', NULL) -INSERT INTO [Categories] VALUES ('BIRDS', 'Birds', NULL) - -INSERT INTO [Products] VALUES ('FI-SW-01', 'FISH', 'Angelfish', 'Saltwater fish from Australia') -INSERT INTO [Products] VALUES ('FI-SW-02', 'FISH', 'Tiger Shark', 'Saltwater fish from Australia') -INSERT INTO [Products] VALUES ('FI-FW-01', 'FISH', 'Koi', 'Freshwater fish from Japan') -INSERT INTO [Products] VALUES ('FI-FW-02', 'FISH', 'Goldfish', 'Freshwater fish from China') -INSERT INTO [Products] VALUES ('K9-BD-01', 'DOGS', 'Bulldog', 'Friendly dog from England') -INSERT INTO [Products] VALUES ('K9-PO-02', 'DOGS', 'Poodle', 'Cute dog from France') -INSERT INTO [Products] VALUES ('K9-DL-01', 'DOGS', 'Dalmation', 'Great dog for a fire station') -INSERT INTO [Products] VALUES ('K9-RT-01', 'DOGS', 'Golden Retriever', 'Great family dog') -INSERT INTO [Products] VALUES ('K9-RT-02', 'DOGS', 'Labrador Retriever', 'Great hunting dog') -INSERT INTO [Products] VALUES ('K9-CW-01', 'DOGS', 'Chihuahua', 'Great companion dog') -INSERT INTO [Products] VALUES ('RP-SN-01', 'REPTILES', 'Rattlesnake', 'Doubles as a watch dog') -INSERT INTO [Products] VALUES ('RP-LI-02', 'REPTILES', 'Iguana', 'Friendly green friend') -INSERT INTO [Products] VALUES ('FL-DSH-01', 'CATS', 'Manx', 'Great for reducing mouse populations') -INSERT INTO [Products] VALUES ('FL-DLH-02', 'CATS', 'Persian', 'Friendly house cat, doubles as a princess') -INSERT INTO [Products] VALUES ('AV-CB-01', 'BIRDS', 'Amazon Parrot', 'Great companion for up to 75 years') -INSERT INTO [Products] VALUES ('AV-SB-02', 'BIRDS', 'Finch', 'Great stress reliever') - -INSERT INTO [Items] VALUES ('EST-1', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Large', NULL, NULL, NULL, NULL,'fish1.jpg') -INSERT INTO [Items] VALUES ('EST-2', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Small', NULL, NULL, NULL, NULL,'fish1.jpg') -INSERT INTO [Items] VALUES ('EST-3', 'FI-SW-02', 18.50, 12.00, 1, 'P', 'Toothless', NULL, NULL, NULL, NULL,'fish2.jpg') -INSERT INTO [Items] VALUES ('EST-4', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotted', NULL, NULL, NULL, NULL,'fish3.jpg') -INSERT INTO [Items] VALUES ('EST-5', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotless', NULL, NULL, NULL, NULL,'fish3.jpg') -INSERT INTO [Items] VALUES ('EST-6', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Male Adult', NULL, NULL, NULL, NULL,'dog1.jpg') -INSERT INTO [Items] VALUES ('EST-7', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Female Puppy', NULL, NULL, NULL, NULL,'dog1.jpg') -INSERT INTO [Items] VALUES ('EST-8', 'K9-PO-02', 18.50, 12.00, 1, 'P', 'Male Puppy', NULL, NULL, NULL, NULL,'dog2.jpg') -INSERT INTO [Items] VALUES ('EST-9', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotless Male Puppy', NULL, NULL, NULL, NULL,'dog3.jpg') -INSERT INTO [Items] VALUES ('EST-10', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotted Adult Female', NULL, NULL, NULL, NULL,'dog3.jpg') -INSERT INTO [Items] VALUES ('EST-11', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Venomless', NULL, NULL, NULL, NULL,'reptile1.jpg') -INSERT INTO [Items] VALUES ('EST-12', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Rattleless', NULL, NULL, NULL, NULL,'reptile1.jpg') -INSERT INTO [Items] VALUES ('EST-13', 'RP-LI-02', 18.50, 12.00, 1, 'P', 'Green Adult', NULL, NULL, NULL, NULL,'reptile2.jpg') -INSERT INTO [Items] VALUES ('EST-14', 'FL-DSH-01', 58.50, 12.00, 1, 'P', 'Tailless', NULL, NULL, NULL, NULL,'cat1.jpg') -INSERT INTO [Items] VALUES ('EST-15', 'FL-DSH-01', 23.50, 12.00, 1, 'P', 'Tailed', NULL, NULL, NULL, NULL,'cat1.jpg') -INSERT INTO [Items] VALUES ('EST-16', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'cat2.jpg') -INSERT INTO [Items] VALUES ('EST-17', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'cat2.jpg') -INSERT INTO [Items] VALUES ('EST-18', 'AV-CB-01', 193.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird1.jpg') -INSERT INTO [Items] VALUES ('EST-19', 'AV-SB-02', 15.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird2.jpg') -INSERT INTO [Items] VALUES ('EST-20', 'FI-FW-02', 5.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'fish4.jpg') -INSERT INTO [Items] VALUES ('EST-21', 'FI-FW-02', 5.29, 1.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'fish4.jpg') -INSERT INTO [Items] VALUES ('EST-22', 'K9-RT-02', 135.50, 100.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-23', 'K9-RT-02', 145.49, 100.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-24', 'K9-RT-02', 255.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-25', 'K9-RT-02', 325.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-26', 'K9-CW-01', 125.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog6.jpg') -INSERT INTO [Items] VALUES ('EST-27', 'K9-CW-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog6.jpg') -INSERT INTO [Items] VALUES ('EST-28', 'K9-RT-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog4.jpg') - -INSERT INTO [Inventories] VALUES ('EST-1', 10000) -INSERT INTO [Inventories] VALUES ('EST-2', 10000) -INSERT INTO [Inventories] VALUES ('EST-3', 10000) -INSERT INTO [Inventories] VALUES ('EST-4', 10000) -INSERT INTO [Inventories] VALUES ('EST-5', 10000) -INSERT INTO [Inventories] VALUES ('EST-6', 10000) -INSERT INTO [Inventories] VALUES ('EST-7', 10000) -INSERT INTO [Inventories] VALUES ('EST-8', 10000) -INSERT INTO [Inventories] VALUES ('EST-9', 10000) -INSERT INTO [Inventories] VALUES ('EST-10', 10000) -INSERT INTO [Inventories] VALUES ('EST-11', 10000) -INSERT INTO [Inventories] VALUES ('EST-12', 10000) -INSERT INTO [Inventories] VALUES ('EST-13', 10000) -INSERT INTO [Inventories] VALUES ('EST-14', 10000) -INSERT INTO [Inventories] VALUES ('EST-15', 10000) -INSERT INTO [Inventories] VALUES ('EST-16', 10000) -INSERT INTO [Inventories] VALUES ('EST-17', 10000) -INSERT INTO [Inventories] VALUES ('EST-18', 10000) -INSERT INTO [Inventories] VALUES ('EST-19', 10000) -INSERT INTO [Inventories] VALUES ('EST-20', 10000) -INSERT INTO [Inventories] VALUES ('EST-21', 10000) -INSERT INTO [Inventories] VALUES ('EST-22', 10000) -INSERT INTO [Inventories] VALUES ('EST-23', 10000) -INSERT INTO [Inventories] VALUES ('EST-24', 10000) -INSERT INTO [Inventories] VALUES ('EST-25', 10000) -INSERT INTO [Inventories] VALUES ('EST-26', 10000) -INSERT INTO [Inventories] VALUES ('EST-27', 10000) -INSERT INTO [Inventories] VALUES ('EST-28', 10000) - -INSERT INTO [Sequences] (Sequence_Name, Sequence_NextId) VALUES ('OrderNum', 0) \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/Schema.sql b/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/Schema.sql deleted file mode 100644 index 44d01ac..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Ddl/MSSQL/Schema.sql +++ /dev/null @@ -1,345 +0,0 @@ -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'NPetshop') - DROP DATABASE [NPetshop] -GO - -CREATE DATABASE [NPetshop] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'NPetshop', N'autoclose', N'true' -GO - -exec sp_dboption N'NPetshop', N'bulkcopy', N'false' -GO - -exec sp_dboption N'NPetshop', N'trunc. log', N'true' -GO - -exec sp_dboption N'NPetshop', N'torn page detection', N'true' -GO - -exec sp_dboption N'NPetshop', N'read only', N'false' -GO - -exec sp_dboption N'NPetshop', N'dbo use', N'false' -GO - -exec sp_dboption N'NPetshop', N'single', N'false' -GO - -exec sp_dboption N'NPetshop', N'autoshrink', N'true' -GO - -exec sp_dboption N'NPetshop', N'ANSI null default', N'false' -GO - -exec sp_dboption N'NPetshop', N'recursive triggers', N'false' -GO - -exec sp_dboption N'NPetshop', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'NPetshop', N'concat null yields null', N'false' -GO - -exec sp_dboption N'NPetshop', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'NPetshop', N'default to local cursor', N'false' -GO - -exec sp_dboption N'NPetshop', N'quoted identifier', N'false' -GO - -exec sp_dboption N'NPetshop', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'NPetshop', N'auto create statistics', N'true' -GO - -exec sp_dboption N'NPetshop', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'NPetshop', N'db chaining', N'false' -GO - -use [NPetshop] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Products_Categories]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Products] DROP CONSTRAINT FK_Products_Categories -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Inventories_Items]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Inventories] DROP CONSTRAINT FK_Inventories_Items -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Items_Products]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Items] DROP CONSTRAINT FK_Items_Products -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Items_Suppliers]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Items] DROP CONSTRAINT FK_Items_Suppliers -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Categories] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Inventories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Inventories] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Items]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Items] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Products]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Products] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Suppliers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Suppliers] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Sequences]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Sequences] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Categories] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [dbo].[Categories] ( - [Category_Id] [varchar] (10) NOT NULL , - [Category_Name] [varchar] (80) NULL , - [Category_Description] [varchar] (255) NULL -) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Categories] WITH NOCHECK ADD - CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED - ( - [Category_Id] - ) ON [PRIMARY] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Products] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [dbo].[Products] ( - [Product_Id] [varchar] (10) NOT NULL , - [Category_Id] [varchar] (10) NOT NULL , - [Product_Name] [varchar] (80) NULL , - [Product_Description] [varchar] (255) NULL -) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Products] WITH NOCHECK ADD - CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED - ( - [Product_Id] - ) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Products] ADD - CONSTRAINT [FK_Products_Categories] FOREIGN KEY - ( - [Category_Id] - ) REFERENCES [dbo].[Categories] ( - [Category_Id] - ) -GO - --- -------------------------------------------------------------------------------------------------- --- CREATE TABLE [Suppliers] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Suppliers] ( - [Supplier_Id] int PRIMARY KEY, - [Supplier_Name] varchar(80) NULL, - [Supplier_Status] varchar(2) NOT NULL, - [Supplier_Addr1] varchar(80) NULL, - [Supplier_Addr2] varchar(80) NULL, - [Supplier_City] varchar(80) NULL, - [Supplier_State] varchar(80) NULL, - [Supplier_Zip] varchar(5) NULL, - [Supplier_Phone] varchar(40) NULL -) -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Items] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Items] ( - [Item_Id] varchar(10) PRIMARY KEY, - [Product_Id] varchar(10) NOT NULL REFERENCES [Products]([Product_Id]), - [Item_ListPrice] decimal(10, 2) NULL, - [Item_UnitCost] decimal(10, 2) NULL, - [Supplier_Id] int NULL REFERENCES [Suppliers]([Supplier_Id]), - [Item_Status] varchar(2) NULL, - [Item_Attr1] varchar(80) NULL, - [Item_Attr2] varchar(80) NULL, - [Item_Attr3] varchar(80) NULL, - [Item_Attr4] varchar(80) NULL, - [Item_Attr5] varchar(80) NULL, - [Item_Photo] varchar(80) NULL -) -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Inventories] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Inventories] ( - [Item_Id] [varchar] (10) NOT NULL REFERENCES Items([Item_Id]), - [Inventory_Quantity] [int] NOT NULL -) ON [PRIMARY] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Accounts] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Accounts] ( - [Account_Id] varchar(20) PRIMARY KEY, - [Account_Email] varchar(80) NOT NULL, - [Account_FirstName] varchar(80) NOT NULL, - [Account_LastName] varchar(80) NOT NULL, - [Account_Status] varchar(2) NULL, - [Account_Addr1] varchar(80) NOT NULL, - [Account_Addr2] varchar(80) NULL, - [Account_City] varchar(80) NOT NULL, - [Account_State] varchar(80) NOT NULL, - [Account_Zip] varchar(20) NOT NULL, - [Account_Country] varchar(20) NOT NULL, - [Account_Phone] varchar(20) NOT NULL -) - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Profiles] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Profiles] ( - [Account_Id] varchar(20) PRIMARY KEY, - [Profile_LangPref] varchar(80) NOT NULL, - [Profile_FavCategory] varchar(10) NULL, - [Profile_MyListOpt] bit NULL, - [Profile_BannerOpt] bit NULL -) - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [SignsOn] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [SignsOn] ( - [Account_Id] varchar(20) PRIMARY KEY, - [SignOn_Password] varchar(20) NOT NULL -) - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Orders] --- -------------------------------------------------------------------------------------------------*/ -CREATE TABLE [Orders] ( - [Order_Id] [int] NOT NULL , - [Account_ID] varchar(20) NOT NULL , - [Order_Date] datetime NOT NULL , - [Order_ShipToFirstName] varchar(80) NOT NULL , - [Order_ShipToLastName] varchar(80) NOT NULL , - [Order_ShipAddr1] varchar(80) NOT NULL , - [Order_ShipAddr2] varchar(80) NULL , - [Order_ShipCity] varchar(80) NOT NULL , - [Order_ShipState] varchar(80) NOT NULL , - [Order_ShipZip] varchar(20) NOT NULL , - [Order_ShipCountry] varchar(20) NOT NULL , - [Order_BillToFirstName] varchar(80) NOT NULL , - [Order_BillToLastName] varchar(80) NOT NULL , - [Order_BillAddr1] varchar(80) NOT NULL , - [Order_BillAddr2] varchar(80) NULL , - [Order_BillCity] varchar(80) NOT NULL , - [Order_BillState] varchar(80) NOT NULL , - [Order_BillZip] varchar(20) NOT NULL , - [Order_BillCountry] varchar(20) NOT NULL , - [Order_TotalPrice] decimal(10, 2) NOT NULL , - [Order_CreditCard] varchar(20) NOT NULL , - [Order_ExprDate] varchar(7) NOT NULL , - [Order_CardType] varchar(40) NOT NULL -) ON [PRIMARY] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [LinesItem] --- ------------------------------------------------------------------------------------------------- -CREATE TABLE [LinesItem] ( - [Order_Id] int NOT NULL , - [LineItem_LineNum] int NOT NULL , - [Item_Id] varchar(10) NOT NULL , - [LineItem_Quantity] int NOT NULL , - [LineItem_UnitPrice] decimal(10, 2) NOT NULL -) ON [PRIMARY] -GO - -ALTER TABLE [LinesItem] WITH NOCHECK ADD - CONSTRAINT [PkLineItem] PRIMARY KEY CLUSTERED - ( - [Order_Id], - [LineItem_LineNum] - ) ON [PRIMARY] -GO - -ALTER TABLE [Orders] WITH NOCHECK ADD - PRIMARY KEY CLUSTERED - ( - [Order_Id] - ) ON [PRIMARY] -GO - -ALTER TABLE [LinesItem] ADD - FOREIGN KEY - ( - [Order_Id] - ) REFERENCES [Orders] ( - [Order_Id] - ), - CONSTRAINT [FK_LinesItem_Items] FOREIGN KEY - ( - [Item_Id] - ) REFERENCES [Items] ( - [Item_Id] - ) -GO - -ALTER TABLE [Orders] ADD - CONSTRAINT [FK_Orders_Accounts] FOREIGN KEY - ( - [Account_ID] - ) REFERENCES [Accounts] ( - [Account_Id] - ) -GO - -CREATE INDEX [IxItem] ON [Items]([Product_Id], [Item_Id], [Item_ListPrice], [Item_Attr1]) -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Sequences] --- ------------------------------------------------------------------------------------------------- -CREATE TABLE [dbo].[Sequences] ( - [Sequence_Name] [varchar] (30) NOT NULL , - [Sequence_NextId] [int] NOT NULL -) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Sequences] WITH NOCHECK ADD - CONSTRAINT [PK_Sequences] PRIMARY KEY CLUSTERED - ( - [Sequence_Name] - ) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Sequences] ADD - CONSTRAINT [DF_Sequences_Sequence_NextId] DEFAULT (0) FOR [Sequence_NextId] -GO diff --git a/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DBUser.sql b/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DBUser.sql deleted file mode 100644 index 80bacf1..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DBUser.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Create a new user, grant her rights, and set her password. -grant select, insert, update, delete ON npetshop.* TO npetshop@'localhost' IDENTIFIED BY 'ibatis' ; \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DataLoad.sql b/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DataLoad.sql deleted file mode 100644 index 2af9428..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/DataLoad.sql +++ /dev/null @@ -1,121 +0,0 @@ - -USE `npetshop`; - -# -# Dumping data for table `accounts` -# -INSERT INTO `accounts` (Account_Id, Account_Email, Account_FirstName, Account_LastName, Account_Status, Account_Addr1, Account_Addr2, Account_City, Account_State, Account_Zip, Account_Country, Account_Phone) VALUES ('w', 'w', 'w', 'w', '', 'w', 'w', 'w', 'New York', 'w', 'Canada', 'w'); - -# -# Dumping data for table `categories` -# -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('BIRDS', 'Birds', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('CATS', 'Cats', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('DOGS', 'Dogs', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('FISH', 'Fish', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('REPTILES', 'Reptiles', NULL); - -# -# Dumping data for table `inventories` -# -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-1', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-2', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-3', 555); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-4', 9999); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-5', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-6', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-7', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-8', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-9', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-10', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-11', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-12', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-13', 9999); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-14', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-15', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-16', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-17', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-18', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-19', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-20', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-21', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-22', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-23', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-24', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-25', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-26', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-27', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-28', 10000); - -# -# Dumping data for table `items` -# -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-1', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Large', NULL, NULL, NULL, NULL,'fish1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-2', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Small', NULL, NULL, NULL, NULL,'fish1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-3', 'FI-SW-02', 18.50, 12.00, 1, 'P', 'Toothless', NULL, NULL, NULL, NULL,'fish2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-4', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotted', NULL, NULL, NULL, NULL,'fish3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-5', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotless', NULL, NULL, NULL, NULL,'fish3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-6', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Male Adult', NULL, NULL, NULL, NULL,'dog1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-7', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Female Puppy', NULL, NULL, NULL, NULL,'dog1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-8', 'K9-PO-02', 18.50, 12.00, 1, 'P', 'Male Puppy', NULL, NULL, NULL, NULL,'dog2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-9', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotless Male Puppy', NULL, NULL, NULL, NULL,'dog3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-10', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotted Adult Female', NULL, NULL, NULL, NULL,'dog3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-11', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Venomless', NULL, NULL, NULL, NULL,'reptile1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-12', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Rattleless', NULL, NULL, NULL, NULL,'reptile1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-13', 'RP-LI-02', 18.50, 12.00, 1, 'P', 'Green Adult', NULL, NULL, NULL, NULL,'reptile2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-14', 'FL-DSH-01', 58.50, 12.00, 1, 'P', 'Tailless', NULL, NULL, NULL, NULL,'cat1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-15', 'FL-DSH-01', 23.50, 12.00, 1, 'P', 'Tailed', NULL, NULL, NULL, NULL,'cat1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-16', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'cat2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-17', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'cat2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-18', 'AV-CB-01', 193.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-19', 'AV-SB-02', 15.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-20', 'FI-FW-02', 5.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'fish4.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-21', 'FI-FW-02', 5.29, 1.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'fish4.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-22', 'K9-RT-02', 135.50, 100.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-23', 'K9-RT-02', 145.49, 100.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-24', 'K9-RT-02', 255.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-25', 'K9-RT-02', 325.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-26', 'K9-CW-01', 125.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog6.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-27', 'K9-CW-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog6.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-28', 'K9-RT-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog4.jpg'); - -# -# Dumping data for table `products` -# -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('AV-CB-01', 'BIRDS', 'Amazon Parrot', 'Great companion for up to 75 years'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('AV-SB-02', 'BIRDS', 'Finch', 'Great stress reliever'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-FW-01', 'FISH', 'Koi', 'Freshwater fish from Japan'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-FW-02', 'FISH', 'Goldfish', 'Freshwater fish from China'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-SW-01', 'FISH', 'Angelfish', 'Saltwater fish from Australia'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-SW-02', 'FISH', 'Tiger Shark', 'Saltwater fish from Australia'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FL-DLH-02', 'CATS', 'Persian', 'Friendly house cat, doubles as a princess'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FL-DSH-01', 'CATS', 'Manx', 'Great for reducing mouse populations'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-BD-01', 'DOGS', 'Bulldog', 'Friendly dog from England'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-CW-01', 'DOGS', 'Chihuahua', 'Great companion dog'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-DL-01', 'DOGS', 'Dalmation', 'Great dog for a fire station'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-PO-02', 'DOGS', 'Poodle', 'Cute dog from France'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-RT-01', 'DOGS', 'Golden Retriever', 'Great family dog'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-RT-02', 'DOGS', 'Labrador Retriever', 'Great hunting dog'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('RP-LI-02', 'REPTILES', 'Iguana', 'Friendly green friend'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('RP-SN-01', 'REPTILES', 'Rattlesnake', 'Doubles as a watch dog'); - -# -# Dumping data for table `profiles` -# -INSERT INTO `profiles` (Account_Id, Profile_LangPref, Profile_FavCategory, Profile_MyListOpt, Profile_BannerOpt) VALUES ('w', 'Japanese', 'DOGS', 1, 1); - -# -# Dumping data for table `sequences` -# -INSERT INTO `sequences` (Sequence_Name, Sequence_NextId) VALUES ('OrderNum', 0); - -# -# Dumping data for table `signson` -# -INSERT INTO `signson` (Account_Id, SignOn_Password) VALUES ('ibatis', 'ibatis'); - -# -# Dumping data for table `suppliers` -# -INSERT INTO `suppliers` (Supplier_Id, Supplier_Name, Supplier_Status, Supplier_Addr1, Supplier_Addr2, Supplier_City, Supplier_State, Supplier_Zip, Supplier_Phone) VALUES (1, 'XYZ Pets', 'AC', '600 Avon Way', '', 'Los Angeles', 'CA', '94024', '212-947-0797'); -INSERT INTO `suppliers` (Supplier_Id, Supplier_Name, Supplier_Status, Supplier_Addr1, Supplier_Addr2, Supplier_City, Supplier_State, Supplier_Zip, Supplier_Phone) VALUES (2, 'ABC Pets', 'AC', '700 Abalone Way', '', 'San Francisco', 'CA', '94024', '415-947-0797'); diff --git a/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/Schema.sql b/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/Schema.sql deleted file mode 100644 index ae45401..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Ddl/MySql/Schema.sql +++ /dev/null @@ -1,156 +0,0 @@ -# MySQL dump -# -# Host: localhost Database: npetshop -# ------------------------------------------------------ - -#CREATE DATABASE `npetshop`; -USE `npetshop`; - -# -# Table structure for table `accounts` -# -CREATE TABLE `accounts` ( - `Account_Id` varchar(20) default NULL, - `Account_Email` varchar(80) default NULL, - `Account_FirstName` varchar(80) default NULL, - `Account_LastName` varchar(80) default NULL, - `Account_Status` char(2) default NULL, - `Account_Addr1` varchar(80) default NULL, - `Account_Addr2` varchar(80) default NULL, - `Account_City` varchar(80) default NULL, - `Account_State` varchar(80) default NULL, - `Account_Zip` varchar(20) default NULL, - `Account_Country` varchar(20) default NULL, - `Account_Phone` varchar(20) default NULL -) ; - -# -# Table structure for table `categories` -# -CREATE TABLE `categories` ( - `Category_Id` varchar(10) default NULL, - `Category_Name` varchar(80) default NULL, - `Category_Description` varchar(255) default NULL -) ; - -# -# Table structure for table `inventories` -# -CREATE TABLE `inventories` ( - `Item_Id` varchar(10) default NULL, - `Inventory_Quantity` int default NULL -) ; - -# -# Table structure for table `items` -# -CREATE TABLE `items` ( - `Item_Id` varchar(10) default NULL, - `Product_Id` varchar(10) default NULL, - `Item_ListPrice` decimal(10,2) default NULL, - `Item_UnitCost` decimal(10,2) default NULL, - `Supplier_Id` int default NULL, - `Item_Status` char(2) default NULL, - `Item_Attr1` varchar(80) default NULL, - `Item_Attr2` varchar(80) default NULL, - `Item_Attr3` varchar(80) default NULL, - `Item_Attr4` varchar(80) default NULL, - `Item_Attr5` varchar(80) default NULL, - `Item_Photo` varchar(80) default NULL -) ; - - -# -# Table structure for table `linesitem` -# -CREATE TABLE `linesitem` ( - `Order_Id` int default NULL, - `LineItem_LineNum` int default NULL, - `Item_Id` varchar(10) default NULL, - `LineItem_Quantity` int default NULL, - `LineItem_UnitPrice` decimal(10,2) default NULL -) ; - -# -# Table structure for table `orders` -# -CREATE TABLE `orders` ( - `Order_Id` int NOT NULL default '0', - `Account_ID` varchar(20) default NULL, - `Order_Date` date default NULL, - `Order_ShipToFirstName` varchar(80) default NULL, - `Order_ShipToLastName` varchar(80) default NULL, - `Order_ShipAddr1` varchar(80) default NULL, - `Order_ShipAddr2` varchar(80) default NULL, - `Order_ShipCity` varchar(80) default NULL, - `Order_ShipState` varchar(80) default NULL, - `Order_ShipZip` varchar(20) default NULL, - `Order_ShipCountry` varchar(20) default NULL, - `Order_BillToFirstName` varchar(80) default NULL, - `Order_BillToLastName` varchar(80) default NULL, - `Order_BillAddr1` varchar(80) default NULL, - `Order_BillAddr2` varchar(80) default NULL, - `Order_BillCity` varchar(80) default NULL, - `Order_BillState` varchar(80) default NULL, - `Order_BillZip` varchar(20) default NULL, - `Order_BillCountry` varchar(20) default NULL, - `Order_TotalPrice` decimal(10,2) default NULL, - `Order_CreditCard` varchar(20) default NULL, - `Order_ExprDate` varchar(7) default NULL, - `Order_CardType` varchar(40) default NULL, - PRIMARY KEY (`Order_Id`) -) ; - -# -# Table structure for table `products` -# -CREATE TABLE `products` ( - `Product_Id` varchar(10) default NULL, - `Category_Id` varchar(10) default NULL, - `Product_Name` varchar(80) default NULL, - `Product_Description` varchar(255) default NULL -) ; - -# -# Table structure for table `profiles` -# -CREATE TABLE `profiles` ( - `Account_Id` varchar(20) default NULL, - `Profile_LangPref` varchar(80) default NULL, - `Profile_FavCategory` varchar(10) default NULL, - `Profile_MyListOpt` bool default NULL, - `Profile_BannerOpt` bool default NULL -) ; - -# -# Table structure for table `sequences` -# -CREATE TABLE `sequences` ( - `Sequence_Name` varchar(30) default NULL, - `Sequence_NextId` int default NULL -) ; - - -# -# Table structure for table `signson` -# -CREATE TABLE `signson` ( - `Account_Id` varchar(20) default NULL, - `SignOn_Password` varchar(20) default NULL -) ; - -# -# Table structure for table `suppliers` -# -CREATE TABLE `suppliers` ( - `Supplier_Id` int default NULL, - `Supplier_Name` varchar(80) default NULL, - `Supplier_Status` char(2) default NULL, - `Supplier_Addr1` varchar(80) default NULL, - `Supplier_Addr2` varchar(80) default NULL, - `Supplier_City` varchar(80) default NULL, - `Supplier_State` varchar(80) default NULL, - `Supplier_Zip` varchar(5) default NULL, - `Supplier_Phone` varchar(40) default NULL -) ; - diff --git a/Examples/npetshop/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs b/Examples/npetshop/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs deleted file mode 100644 index e90396e..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs +++ /dev/null @@ -1,24 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Accounts; - -namespace NPetshop.Persistence.Interfaces.Accounts -{ - /// - /// Summary description for IAccountDao. - /// - public interface IAccountDao - { - Account GetAccount(string login); - - IList GetUsernameList(); - - Account GetAccount(string login, string password); - - void InsertAccount(Account account); - - void UpdateAccount(Account account); - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs b/Examples/npetshop/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs deleted file mode 100644 index 4fe881f..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs +++ /dev/null @@ -1,22 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Catalog; -using NPetshop.Domain.Billing; -using IBatisNet.Common.Pagination; - -namespace NPetshop.Persistence.Interfaces.Billing -{ - /// - /// Summary description for IOrderDao. - /// - public interface IOrderDao - { - IPaginatedList GetOrdersByUsername(string userName); - - Order GetOrder(int orderId); - - void InsertOrder(Order order); - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs b/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs deleted file mode 100644 index 8b579d6..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs +++ /dev/null @@ -1,19 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Catalog; - -namespace NPetshop.Persistence.Interfaces.Catalog -{ - /// - /// Summary description for ICategoryDao. - /// - public interface ICategoryDao - { - IList GetCategoryList(); - - Category GetCategory(string categoryId); - - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs b/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs deleted file mode 100644 index 85a43c6..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs +++ /dev/null @@ -1,24 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; -using NPetshop.Domain.Billing; -using IBatisNet.Common.Pagination; - -namespace NPetshop.Persistence.Interfaces.Catalog -{ - /// - /// Summary description for IItemDao. - /// - public interface IItemDao - { - void UpdateQuantity(Order order); - - bool IsItemInStock(string itemId); - - IPaginatedList GetItemListByProduct(string productId); - - Item GetItem(string itemId); - - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs b/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs deleted file mode 100644 index 67f5081..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs +++ /dev/null @@ -1,20 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; -using IBatisNet.Common.Pagination; - -namespace NPetshop.Persistence.Interfaces.Catalog -{ - /// - /// Summary description for IProductDao. - /// - public interface IProductDao - { - IPaginatedList GetProductListByCategory(string categoryId); - - Product GetProduct(string productId); - - IPaginatedList SearchProductList(string keywords); - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/Interfaces/ISequenceDao.cs b/Examples/npetshop/NPetshop.Persistence/Interfaces/ISequenceDao.cs deleted file mode 100644 index 06685bd..0000000 --- a/Examples/npetshop/NPetshop.Persistence/Interfaces/ISequenceDao.cs +++ /dev/null @@ -1,14 +0,0 @@ - -using System; - - -namespace NPetshop.Persistence.Interfaces -{ - /// - /// Summary description for ISequenceDao. - /// - public interface ISequenceDao - { - int GetNextId(string name); - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs deleted file mode 100644 index 26d18f9..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs +++ /dev/null @@ -1,56 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Accounts; -using NPetshop.Persistence.Interfaces.Accounts; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Accounts -{ - /// - /// Summary description for AccountSqlMapDao - /// - public class AccountSqlMapDao : BaseSqlMapDao, IAccountDao - { - #region IAccountDao Members - - public Account GetAccount(string login) - { - return (ExecuteQueryForObject("GetAccountByUsername", login) as Account); - } - - public IList GetUsernameList() - { - return ExecuteQueryForList("GetUsernameList", null); - } - - public Account GetAccount(string login, string password) - { - Account account = new Account(); - account.Login = login; - account.Password = password; - return (ExecuteQueryForObject("GetAccountByLoginAndPassword", account) as Account); - } - - public void InsertAccount(Account account) - { - ExecuteInsert("InsertAccount", account); - ExecuteInsert("InsertProfile", account); - ExecuteInsert("InsertSignon", account); - } - - public void UpdateAccount(Account account) - { - ExecuteUpdate("UpdateAccount", account); - ExecuteUpdate("UpdateProfile", account); - - if (account.Password.Length > 0) - { - ExecuteUpdate("UpdateSignon", account); - } - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs deleted file mode 100644 index 33ac299..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs +++ /dev/null @@ -1,163 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common; -using IBatisNet.Common.Pagination; -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.DaoSessionHandlers; -using IBatisNet.DataAccess.Interfaces; -using IBatisNet.DataMapper; - -namespace NPetshop.Persistence.MapperDao -{ - /// - /// Summary description for BaseSqlMapDao. - /// - public class BaseSqlMapDao : IDao - { - protected const int PAGE_SIZE = 4; - - /// - /// Looks up the parent DaoManager, gets the local transaction - /// (which should be a SqlMapDaoTransaction) and returns the - /// SqlMap associated with this DAO. - /// - /// The SqlMap instance for this DAO. - protected SqlMapper GetLocalSqlMap() - { - DaoManager daoManager = DaoManager.GetInstance(this); - SqlMapDaoSession sqlMapDaoSession = (SqlMapDaoSession)daoManager.LocalDaoSession; - - return sqlMapDaoSession.SqlMap; - } - - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected IList ExecuteQueryForList(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - try - { - return sqlMap.QueryForList(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for list. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - /// - /// - protected IList ExecuteQueryForList(string statementName, object parameterObject, int skipResults, int maxResults) - { - SqlMapper sqlMap = GetLocalSqlMap(); - try - { - return sqlMap.QueryForList(statementName, parameterObject, skipResults, maxResults); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for list. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - /// - protected IPaginatedList ExecuteQueryForPaginatedList(string statementName, object parameterObject, int pageSize) - { - SqlMapper sqlMap = GetLocalSqlMap(); - try - { - return sqlMap.QueryForPaginatedList(statementName, parameterObject, pageSize); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for paginated list. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected object ExecuteQueryForObject(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - - try - { - return sqlMap.QueryForObject(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for object. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected int ExecuteUpdate(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - - try - { - return sqlMap.Update(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for update. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected object ExecuteInsert(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - - try - { - return sqlMap.Insert(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for insert. Cause: " + e.Message, e); - } - } - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs deleted file mode 100644 index 8137351..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs +++ /dev/null @@ -1,44 +0,0 @@ - -using System; - -using IBatisNet.Common.Pagination; - -using NPetshop.Domain.Billing; -using NPetshop.Persistence.MapperDao; -using NPetshop.Persistence.Interfaces.Billing; - -namespace NPetshop.Persistence.MapperDao.Billing.MSSQL -{ - /// - /// Summary description for OrderSqlMapDao. - /// - public class OrderSqlMapDao : BaseSqlMapDao, IOrderDao - { - #region IOrderDao Members - - public IPaginatedList GetOrdersByUsername(string userName) - { - return ExecuteQueryForPaginatedList("GetOrdersByUsername", userName, 10); - } - - public Order GetOrder(int orderId) - { - Order order = null; - order = ExecuteQueryForObject("GetOrder", orderId) as Order; - order.LineItems = ExecuteQueryForList("GetLineItemsByOrderId", order.Id); - return order; - } - - public void InsertOrder(Order order) - { - ExecuteInsert("InsertOrder", order); - foreach(LineItem lineItem in order.LineItems) - { - lineItem.Order = order; - ExecuteInsert("InsertLineItem", lineItem); - } - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs deleted file mode 100644 index fd7d87c..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs +++ /dev/null @@ -1,35 +0,0 @@ - -using System; - -using NPetshop.Domain; -using NPetshop.Persistence.Interfaces; -using IBatisNet.DataMapper.Exceptions; - -namespace NPetshop.Persistence.MapperDao.Billing.MSSQL -{ - /// - /// Summary description for SequenceSqlMapDao. - /// - public class SequenceSqlMapDao : BaseSqlMapDao, ISequenceDao - { - - #region ISequenceDao Members - - /// - /// This is a generic sequence ID generator that is based on a database - /// table called 'SEQUENCE', which contains two columns (NAME, NEXTID). - /// - /// name The name of the sequence. - /// The Next ID - /// - /// Dummy version for SQL Server. Actual orderId - /// won't be known until we acutlaly insert! - /// - public int GetNextId(string name) - { - return -1; - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs deleted file mode 100644 index 0ce6467..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs +++ /dev/null @@ -1,44 +0,0 @@ - -using System; - -using IBatisNet.Common.Pagination; - -using NPetshop.Domain.Billing; -using NPetshop.Persistence.MapperDao; -using NPetshop.Persistence.Interfaces.Billing; - -namespace NPetshop.Persistence.MapperDao.Billing -{ - /// - /// Summary description for OrderSqlMapDao. - /// - public class OrderSqlMapDao : BaseSqlMapDao, IOrderDao - { - #region IOrderDao Members - - public IPaginatedList GetOrdersByUsername(string userName) - { - return ExecuteQueryForPaginatedList("GetOrdersByUsername", userName, 10); - } - - public Order GetOrder(int orderId) - { - Order order = null; - order = ExecuteQueryForObject("GetOrder", orderId) as Order; - order.LineItems = ExecuteQueryForList("GetLineItemsByOrderId", order.Id); - return order; - } - - public void InsertOrder(Order order) - { - ExecuteInsert("InsertOrder", order); - foreach(LineItem lineItem in order.LineItems) - { - lineItem.Order = order; - ExecuteInsert("InsertLineItem", lineItem); - } - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs deleted file mode 100644 index c979b5a..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs +++ /dev/null @@ -1,31 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Catalog; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Catalog -{ - /// - /// Summary description for CategorySqlMapDao. - /// - public class CategorySqlMapDao : BaseSqlMapDao, ICategoryDao - { - - #region ICategoryDao Members - - public IList GetCategoryList() - { - return ExecuteQueryForList("GetCategoryList", null); - } - - public Category GetCategory(string categoryId) - { - return (Category) ExecuteQueryForObject("GetCategory", categoryId); - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs deleted file mode 100644 index 6284e13..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs +++ /dev/null @@ -1,58 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; - -using NPetshop.Domain.Catalog; -using NPetshop.Domain.Billing; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Catalog -{ - /// - /// Summary description for ItemSqlMapDao. - /// - public class ItemSqlMapDao : BaseSqlMapDao, IItemDao - { - #region IItemDao Members - - public void UpdateQuantity(Order order) - { - foreach(LineItem lineItem in order.LineItems) - { - string itemId = lineItem.Item.Id; - int increment = lineItem.Quantity; - - Hashtable param = new Hashtable(); - param.Add("ItemId", itemId); - param.Add("Increment", increment); - - ExecuteUpdate("UpdateInventoryQuantity", param); - } - } - - public bool IsItemInStock(string itemId) - { - int i = (int)ExecuteQueryForObject("GetInventoryQuantity", itemId); - return (i > 0); - } - - public IPaginatedList GetItemListByProduct(string productId) - { - return ExecuteQueryForPaginatedList("GetItemListByProduct", productId, PAGE_SIZE); - } - - public Item GetItem(string itemId) - { - int inventoryQuantity = (int) ExecuteQueryForObject("GetInventoryQuantity", itemId); - Item item = (Item) ExecuteQueryForObject("GetItem", itemId); - item.Quantity = inventoryQuantity; - return item; - } - - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs deleted file mode 100644 index fff5911..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs +++ /dev/null @@ -1,71 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; -using IBatisNet.Common.Utilities; - -using NPetshop.Domain.Catalog; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Catalog -{ - /// - /// Summary description for ProductSqlMapDao. - /// - public class ProductSqlMapDao : BaseSqlMapDao, IProductDao - { - - #region IProductDao Members - - public IPaginatedList GetProductListByCategory(string categoryId) - { - return ExecuteQueryForPaginatedList("GetProductListByCategory", categoryId, PAGE_SIZE); - } - - public Product GetProduct(string productId) - { - return (ExecuteQueryForObject("GetProduct", productId) as Product); - } - - public IPaginatedList SearchProductList(string keywords) - { - object parameterObject = new ProductSearch(keywords); - return ExecuteQueryForPaginatedList("SearchProductList", parameterObject, PAGE_SIZE); - } - - #endregion - - #region Inner Classes - - public class ProductSearch - { - private IList keywordList = new ArrayList(); - - public ProductSearch(String keywords) - { - StringTokenizer splitter = new StringTokenizer(keywords, " ", false); - string token = null; - - IEnumerator enumerator = splitter.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - keywordList.Add("%" + token + "%"); - } - } - - public IList KeywordList - { - get - { - return keywordList; - } - } - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs b/Examples/npetshop/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs deleted file mode 100644 index 690e51b..0000000 --- a/Examples/npetshop/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs +++ /dev/null @@ -1,41 +0,0 @@ - -using System; - -using NPetshop.Domain; -using NPetshop.Persistence.Interfaces; -using IBatisNet.DataMapper.Exceptions; - -namespace NPetshop.Persistence.MapperDao -{ - /// - /// Summary description for SequenceSqlMapDao. - /// - public class SequenceSqlMapDao : BaseSqlMapDao, ISequenceDao - { - - #region ISequenceDao Members - - /// - /// This is a generic sequence ID generator that is based on a database - /// table called 'SEQUENCE', which contains two columns (NAME, NEXTID). - /// - /// name The name of the sequence. - /// The Next ID - public int GetNextId(string name) - { - Sequence sequence = new Sequence(name, -1); - - sequence = ExecuteQueryForObject("GetSequence", sequence) as Sequence; - if (sequence == null) - { - throw new DataMapperException("Error: A null sequence was returned from the database (could not get next " + name + " sequence)."); - } - object parameterObject = new Sequence(name, sequence.NextId + 1); - ExecuteUpdate("UpdateSequence", parameterObject); - - return sequence.NextId; - } - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj b/Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj deleted file mode 100644 index 09f3e67..0000000 --- a/Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj +++ /dev/null @@ -1,224 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj.user b/Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj.user deleted file mode 100644 index 9d2caa3..0000000 --- a/Examples/npetshop/NPetshop.Persistence/NPetshop.Persistence.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Persistence/bin/Debug/log4net.dll b/Examples/npetshop/NPetshop.Persistence/bin/Debug/log4net.dll deleted file mode 100644 index bfc63d794555231ab445b1bd1e8d1f21bd543f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196608 zcmeFad4OD1l|TOay;rZc?j)7&u1a?&>CV#Ok*dlH(jhEiNA>_>f*|`61RlIjL@6so za0jA{3L5tyqPT(E;4*^yf{t++$8oS-XB@{FM@Jp~>WJUZ=bZbNs(Ky3?|i?%KYkRX z-+lL=_Ul}m)|C&BmVcV zamW{<@q+)8r+HOq>(L+B*69*j@6%feZs*B%PORR3wS><^}cHRWzXA= z_k%uV_#&@DX99#Q7p@AY!%GmQv?*^EXion&K_IKb%dQRpD71oR!S%}?xTDkgo(exD zfu|(!lmwoVz*7=Y}( zQ@=ANENfTleYW5WHy$zf@~>U;r$_$dw2QvA_^MC7{|&D^{G+uW&pdeEX)FK!(ht32 z^Zh5ExBI&bbIVsv-BNqzBjNCd+T3q_=X0+=cl-+BZ9;)drV=r2Yl{}N=f{rQ&V&E#!=98r(1w5&eN-6_A7 zD=lR1{0*+@v&x79x{BSx+}thIEpMeYxW3>_?f)tFA=Jgrh>I#Vs@I41Lfr6a-#APgLqJ!O)C>(TH&by zEX9<`7ZU(0{EJ{9F38)q4(Q^?R=E$@!7!w2*QE9mc8rV*R&BhOpRqNr^$74m_>fP( z$Vc%tChedEeBt*qYBP8tMEAYdBBR}+k~DJPdl_G9sxnSs=Pb`3LiVOTbG;qFz2cSX zP0tCw+-G?M#o?{Tp+==A4wdRfFL(qXlt^=*9gHAj1633(KwxI5Y-l>X z&$=!j>;e%p)=a@@>Z3FHf~i8QkCkp6ZC!M?HM9yMv=P4HqpCL4o{xW~R~F2X^`pKm zMFJ>AeNo+p{EJ=CH^=tb*esSxA^7+Ux6&3pnQQYxK_pBvF)Lb9Mlb_9~#q1Rckiv0Ik<+EH`p{ z3ySV;nNpY4Qr%7HcdToG2e!=UGKj9&AbOb+P1M16ApFK*PB4U;E_sb*Ua%ag)wQFl z{!Z{M0C@hV@K+2#xxP4^Qm)VKe6{k*0~j_ufF?Hg&h}pOVS+r!!cOef1Qn?bWu?s; z;A7&?fBy5__FM*iprZ(3Xkf3RcB*wr*vz)agt(moG2}q>nXpWVVPUTT3w6(iWkMJ1 zoY`QRAbi4Rs_q3)YH#9ni2t#^lx$#_<>xd8Y)K6c1YEtWQjnLpOb`J2D40xMm;hKe z_PN?VG|sbI6iCBY&YBZOn>IoxY#({Na5I8Z&7w`VifeimD!&bpD9&k62|OsDQH`tg z89WU@)wSoDGETHxWV~^NNnMN7a<#wi=L>sEn&t&t(cT*K?b_|{fDIWaR=vH&0Il3B z)VA~&^1HXK`$oMVG_aVUiFnq#YyAVt2X0fBwKY+Z4P~n_N1u+MZ&nQ<2kBE|8!PM< z6{*qh*isw8JgC1Rq`y#g_7;SY`gBLSP~yzDg4N{4qacOJiA;uo$1`~H&4Q5&$f5Ey z(7gCGgf7_XY_Lp-VWE7Wfh1<)WkL+AZJu0Z!ZIO-MI{3- zbUz!G34pb&4Uw#UNZ7N3qxrW*5*v&3Y0TnWNOBO-c5o~}FzTqvtJaHcZH)2M1q0f= z3k`4a8KA>2*+XrHl_sW;1gaoYgd7=*T@E~WGqg9(H*hcrrP}(_?G~AA965xRB>7Q% zsbr&D-h@)U0A-hE#>-yNV8B^1W0{uz2`A}q>jisAGaz@L7@xzf!f}>^76{YSu;v|R zjceF2)%Bp!E+UkjKO6|c5s(5rZr94yOS^{b8S)*-FmY2*tXgd8e_4A{lsC=@g3hOTQ} zS8>C`@JI&2g^C-jNB%<4Tf!%2N`;1J=%9X3#=hytuv$nh%Fcr=mH9MYyKg? zUQW>O6ZA~#M*rBTj3+pj=Wp)ZZ2ZrLt|2>k)CR#yH4ROh8=JCJm1>0AnqZ1d9uqM+ zKSw4B*-eFJYSfH6u_0@-($iovm1Z_#dI62|!uvCr zElQ!Y;zLFEUCLUxz#6#Pav*a2Z&?Q)Y#pO@{uXP_d$oRS>s8h%kE)(q)^DtVzCHtg zi*?fbcp*u%9Kb=Q4nX3$?I5X2=a^4 zCtIxl+7?v!-;QSIKgeh&I3M%1?W&y9=FC}*$TiEvUNC(9^+ zS@JO*C{^j`gimXrQ906*v(VvNXkmty>1U!~G*XeCr;n5f!8S{iA`vEs!k<^Jb5V$mQF&HC?GJM&Q{S^0pzGv9EO&$FO&%CA%NcZk%8 zdN!HDkHh5E7_yT^yvn1tMdO{VqA4cUrO*j(gxpyL(zYB6<5>>Spclavl$}>yT@KGo z6tS}!yx=MTAuD9%S(o8CA$e7&Olez1zTKpfMnf}cGNjg|0isk*R5ohLMMu$EW|q$- zE6x^wEQ+hx(=R4l#vj|qdA;&0#O&UtDcUyAH2g%QV@gX>=k*ym@7}iRV5hovxth0F z%|JWBlxR;(Lw&$bYb=PTywLDW*&+ckdPXW3un(H%<7m9JAxEg}5RN8C5=tRbyWJr) zCCs#~oOMZO`Mb9zh0lu$N2HeAS?KO<9VG&4|Ha9;{2G)80!`a=H~=gqMJD`8yq3zL zTdBW3RFE+xW_;UibUfVn=B+5`K=CItm4b{D2Z{}^7|ntx2yIp9Hen<=tC-j5vW(X ze^Knd6I>K2JLBg>c^y~9c(F1{8B~x4S)<)25>DEJrb|C#(l3t?BVSg2F&^p$6`Fd= zzA`C0mcPM`v6rza>GcvdHBlc6TaEc4G%9Y(N+VgUirM#{fy7<#?Q)1BG(xuWGh<+< zjS6t>;kM6*qvjtD2Lta|7~5(e*%H7O;S!0etWN|?L3ElqZGjX_tIA=c5WAiyB{K}K zlqD|;D~)@dQ;odvlqK-V&yXg%f+>|Hb?Uz)#k0dWg{}I}LITY8g?O|vL;_1~a1L&` z_5yin{uYzWf|A`LfD@dLEIsQk1J<0e-n9n$IUv(nak(Kbvpx9OO2A zdQaNbQ5tE0oVf;@rSob@Q=*P!GaEm|HA}q(*Rs$jfos3EiJkG2kn?`q&UIacJ%P5f zUwoWfrWt)4e5|{~$M1YuIR}#rDNd)UU66biCTWh02V{O|Xo&|BLXVE85wybhu#TX_Z?aN3ELjV5s^IO0Z1h4R6R&Dh-95z zuF7#XdG*Hk#YS0|hp9KN%)2N9x`s-P^W_n2Mwo8bQsWfe)v)treVCMR#lNvQ0dWGC z3xSRg=aH;1lykLzji`f;t{6jgD28^~)2ZCjZ!*$kSU1w#C7mNYnig;1=pOAsH!09Hma4*AX zG4_!~lnJ(G*`6Ln?luu=0Zyre<6QD&a8j4(H{}mbq%~mBp2n=9)LzS= zY`{=`@0`7t2J)W@@3L9ce6Wx}>Ve_3QRAFhKk)^p)WcqDT!SK1EY zoB&hEQc2Rinh&2=$=`xM%_7!ji9%Lo86f@~$7k}hTjT@lV<^rEzAb;hgTJE}Z@CQ) z*1ljXkbn{9fw960s8!i{E{jsi8Us7wo^<_hAWx}Y-nlM*S%j9WxVc{{z|5o6UuYBx z&nMcG%U<5!hde8cSsADfx?Zs;3(E6dDZ&3b)1~Ze+Z*+hdh^xnF| z5vLMkU7{aRzMVD`(Elkc)D5yeVm4SNbiu+>WaDLmz$Ug1Jt&08@=?)Rezkox;9>>h z+`Aa1IaU9A;62hG^s&8p5~U#?>BkeDVbuSj&Jcy@jGzbY4%@2I(PCU<(7zCDMco2A z{}MK)XeZ%cOop@jfRqe$`%<-i3^~v~ql^+tQWuPj>di^UM3XHhV3w?zNEhl(er7wA ze+f`<(o$+42T(h_9Brn3tOR#5cszoUY~%Xy{|OQ|LQT=4ZIGEGS~_%y39()%EX&M< zWkMG$DT!dwDhwY=n`<3|h*gw@*{4JV{$=26!(Rc?Zt>l25r=;{V(DWhJwC=irN(uO zZa)zy%lT?}Gnn3+$2u)D?9DF-zbz3X-roFZ_)7_oY1X~@g|gbZH}78wB)YFPT@Ge6 zX!u&NNK}iz3eokm#^MsaQdfyrO2kN1%IK`6bRkVpzMvcB2O^YRVjxr8kdWqqv9dyDqO8MvWc~YrsyYfDWmF;SHSQ!jea;QTJ2%!bxjT!}+O0`yUhV4pD>JDqwnb zM0-~*whn)bbvkq_QaPh}$z!&*>jMP6NX6Ot(s-!I&6UHBjvcvowBatmj>}O|><*h( zYeSG}o98C>&~c})1^fQ5)$lQ2Z1>XnV!Ido7a=42T@af=^ig~2Xs1kA$vqdKoqI=; zv1agRps}%|jUu033X!!>Adx{II-TCJ%!J=N?%?=30A8WNhZXjkF4lA|vRlN|jP|F# z5fx^36rLaL9FO*=9;~pzB+8FBv=;i~45uNOY(WI_XhSRQ-wIQ0iX$?}2LP4bBI6uG zlajzk6pRbUpIGD0kV7xOg?U;0>YT);9DT}7Wlp?@b>ZcH^z9^G_M?x1I9PblMS3{Q z~Y9u)nMQr8-39LPfB%{;%Mu!S7m zZ^GuB+RVeTENggRxOcBjhmHq-B7Z}oL?D1^8<5ju`LY+OvBq$ZjgnF;tn=oWCI)|x z7wkATlJNr8BKdf-c)q$vR4HLrusP1xx|MxypA@@TQ#q`l6M;bk!E&qEd=EtOB&Sc_yQ`4DHy5q@Hu zfI%U~bYv(KmI-1LUWwcoImZ1gscK*Ytx#u6VP)IP3uiM&8`D2_J8WkkjC#0Y0JgbU z!#>>w;h_>9$=`;KvTtv3G(18g{Ocgv!f0?4YGuZ%FAvW{bhj;#CK7%UDH4L+7M)v& zogdcG-L|?z=X|kYT8&0l`A8lqCBXBvMnkjG$zGM&bnWht1;X6UG9xvFPfCe`>u3)T%cWwmpc`}5@2 zYn^p0jXKkIg}M3zpjY>^_@9Q5F*xPJ=6YO-%Y@kRP_#`z^|RMcLi;rdoCl|6)H;RQ z01L`zw-*AHj5=aZGrTB^2V2&M$b{y{CU(K&sP_SN#WFErkTPfUIk4o|=fIZ;$zR}e zc$)AQ`5Xju%I6?F{zX2ALwfM0d=5nW7y2AB>H4u!u^7pE>Pu8f#srOS)Sf-BUb=83!EJnqli0yYC&y<=?v7y0YG|(q<-eMeZ@p%ir#P+pc$|PwC{**0dg7hJ98_ExZEEcNA3WU~V zZ#4S_;FF*75j-E%OIfikGv1cYKIDwq%4b4MtM)gWXM<%z7wqY?!7@SkqTKm2^D}=E z%r)nQABQOlzeam>BRIH`w#u_!12~KWxR;7v)ROHV0BBqC*#0tvu|<73;CHt0=Ul&m z7|cp8$@^DB%}t-PSSDELa|*$=h()IpZkWr?XMv*ITO0|`mxxitytgYK2>Y;aOO@Mh5ypQ3q_v%q?X#E#vUV)=+dL~)@jnkCm7MC5pW4z##fG*ay3=|94S@Si!MTAc9G-Z(e?X*yWvWD7cBh3yU0H*dc7#wP2 z(&*YdG0`iv;e5j>Ez5eVbyfRZhO2FOzxX(hkKs0k|E@jKel{Pq_67R5P#+iZ;oB(H zo<0wMr6}^1mK)2=Y;#PA^|&PMlSOC3G9iZDD6ph96P5{pwPkOK)ZGgh9*#wR*|5IjCkM40&l>uxBLvEzG`fi3B6_>&S^l`jf0 zlU63gd|^HUyGThVun-dGDQJsY1)A*Dl5?B1l1uTgz6O<+s-OBqRA1Hhg}_;#7roc? zUDh3NxPWgnRUIy1&OD=DlKm@N7XTW%dLe2|pJ2D?S|3(lqBFqNXZ`MXdD zjd9y+Z^4_5T}piVTc|*yj{ez{W{X7QoL4}hH*jW=h0wcU2Mv^|)wK?0>6wIf{NGEP z9fSRP7&II~8sc-bB)@q*2L90e(&W58Z2>JIaS}te7YHRSYNY={s>#j#b4v#>tE#%T zVLRiiZo_c058DmdL~2_m2c)eOWn+}=iHb_7UR81%RULhzMZXC68u@(iVm#rCbbU@g zQha$q6O1K?XQT1j{SRi1*BlE&MUKZRrm^xckuZvVedG-8^cHoo1lMSbO}^yGI2fjS zSw46PImBUk*lPuowBV(PF8G@fAASiI!xkQO%a@#-;Z#$`)TV7_wBEH@FQ{G%q%F)tgHsFKQkB5Hx6ot9Tb9r+P=FVTBtik6W+0j}+Xa13Q^Y z>Ys+csB-a5UIb|!4LPF6q3oNvsWTCSH`3V1O&!a(knZc?cEps1z4f`N)gt1HkkVM} z%ILw{T81|T0QoH%u_`xJ6ewwz$8-B{Y&-_$<1M3oDg~qA17OMx|A@cI;jXEVgJ2gs znuFaaMeYA{5b8$*VbeY0g=DbBzNKl`55hVogX@cSK^k;@sol~>AIHo?PQt9o8yKCC zQaP*PGv-4vDsBxfPj^9hm%hQ}$)cnMAwKeZx-!d_TA5j}BK#_VQ)iYmUhK2ZtM9Sy zKCy4XDp(y*9RKJq!oY%i#L+lTbHwW#z(Y_f>CwCX`eNN^Do$bg1riYd4AiLEa{Aqj zEvKk#wLevB<)*BCrjGSFlzptUCsxdc58yRCa}YHExt9D_k&gM0Z)dGxZF@@O?iKv4 zAYm{!Ki3U2ut*#hY~I!I1;Dr$`^yVPhTekkL5&*8BYrgeioT5%@n)6;DqbSre4|oq z%*hwE1?38Z=m}*hee8(m;dJ^i-XT8fHf_X*@#Iep1N$$M-&l)=7we+ww|r>5*WQZc z-af1jhnZ;cggLGC0}$EmMA0MK3U`R<=T>XWZ61Kbe(d(;u**-!(eS?Yd;!E zO)^PxG?IOS;?%yds{XSBqUDY7i{M5vgx^I_Yz$hnagv#~V&TN>;Yar!kkwBA8QdPv zcAD;B8e^e1Y+Ywg4aQxo7uZLoG4BR{g;?!}=*qheIWenp=*qiK!Xqxdc(R^U zOnR7^!(%TX22bJzeDLwJ7OIg0a9vX5f6bEb*eXfUBI!Gi<*~uqxZOHDOCDg>!ho)# zT$&EIak#P`J{Jg`uHI{ABD!?slbxygh*avo+RM4tqJ}lmTdrr#v*oTJ_)n>M;bTCR z8iC2k^0w=MrfXypo>?OxZGYBaD13(`$Ckc3_a7vgok>=1#k=7+Hbw1m4x<@Toi?2k z43IR$Xz-bkA|p=!9B>njNVn?TO*$Sd4Vs+NA$wB3Wa+?%PBKZ6c7rKK$*ZmYbcA$^ zA~nrOXbF#BV1|5>V~XRwG|}r0QR1s>SEZx3*0z*8xyh%>7Di+o+c;!DWyf-eWv+6d zMKFUT(}?3!x~G6zZQkL z>(#zstuGbY7zLgrDqZp$q~wKvY00Lr*)e|_4E{yJ>A}1RF>h4Hgy{NJ|1)@j_Dw*G z$D8r+-=g8Srb~hwjR*BOCoh2?>YM*I0K|HhUI!RMg8EwWfaNdRrx?xYp@r}#1khGR zK%YoKK`rNnB>?L>uggD~KBnzJuZ(-7YE!WIW+u z?)Xq@nKNC&^xIJmhx}e}4?@8^@TY=x4$3IF*St`;!8^?hB@(;~FLsLzH!vySQzk#v zwHV^?&A(5e{deOrgNd#gs_lZQ!d(IJ{)l;6fj{|)RqgKISnrV>vwforGyIzH6lT{W z6T0eg`)sgG=z`rb8!QvLV4vFoJ3rP@U0dA&w%PUmYDxGn((h23I*5Ls)N}Zs5>3H%L}LdhdMV1NBbrx)1e(*R zok1hhY=&q0F$v6LE6o9Td31ISf)C^%*b2xPdTd>dfAb*Eek1efL0<{~RS~fY{a3bb z*>c`nY{y@;u9@0jS8Lw@o>O}a)qhKR;I~ZD%<4T<0sXG}nQ1rd7C|!Y921~#;-?}y z%YQ#41O&8)qY{HM%o@S{NK#yloc}-sm({Lp^f&r5yAj%*^eb(r2yM@sjW#C4ZJ{Kv z&riYXUU-a^D>#E$aB!O%cEW7d0XYs8heJ@7y)40Nx zrxeGCp5hjc{?BNI?UPgGY5IfEEdS+v4|d}(b%pyB(W~*k1nlXKSEsbA9ZtnapDdlN z-I7+KjV<^Pa0Va7A1pDx1V}w^_cq(dxehP*2x3>vY&KIqb+gg?dNz40)ReT~uK`83 z>-!{jL`jv&1bwYEje85?3Ch=!sk)gX9$>9`rnQ;2O>!#+%6) z)C@~3|8L0CR;*q6uO)ig*ou)|l4kpugNUp+w_+c|pB=6lLzDVfbg0vhLdp>kVHyfz z**jhaKwJ^Holhso^TyBN@Iqv?!yEBer-9;yAYTcsWSZmU4td-}c?`98#bQw#nA*=d z)b4?Sxnx{yM^tW%%9L9N?3rS7SY9S96P}EW-$pU={O>y7H1 z%N2iecrIT*1L1Z%Rt8ptA7L7A2F6WT;mSpL`6R@(eGbfm&~ltb{T{S`OEb8%l&jD89)s8@_kM__B5PUX#wT=vPtJ z*^qm(#f}vKzns~EJ!sBl_vfGB>v|BJ!9o-TPMra)em`% zdA8@1Y-~OXK996V>!aab!SWKkg+D-0>Pm>BEVX{lv-+>Jn!E67TW__B?~0ofAbNk4 z$JY@3j4nNFEJS6jOzJa?IOoxVv|5q<>k zYBoqxeZF0+2H>N#BUb-tf8#o9*)yzpSvEGy#=R@0CzvW&=frx#9gLzUIO!m5mD?Ca zPx8|oru96FOv7BRRrc^Yvdv^s9l@TsJ>GyQHnR?I9eg{4XAgw&=i)UxHptqm0@ z2KrR1^h|4UFa53s<8D0@^s%5_K&1s;YvXn9isk^kD($_llJf{}yL&?F{ z@kh)@+1~MTW3lwTbQ3uuY&wLrUYapLS|Jf^<^VD2Q~ zOAxZCZ{klB@lr;7ixK0SgTIr6$GrDIM$_MB%HQ|Ie5WVoA56@9nd`gE^^c6H1?ZA+ z{rY3x`n4-tzFqIqMrB-OyY3x0|2d1JNN&poYWkrC6yrLitY)&>3u#g2Bn#O z8WXzuO7NQv%Y+!VKpkkIO0!{^09eODeajvMcgHKBVNDz&f^gmNVf+={(n$`tN01cm zYvohCFHIbLV3~~MQzHw~O_u6MYh*R}Aw)mEYE{*iahS$Rf7WIu*}m)ekHC1OlEe#8 zs#kP#uN0|K%2H!c$<;j>K5a!E7etZ+6D8dc`>2KBk3S4lNH`uW6$@LGfbG8yS!W$H zc*uuQS|z7d(>?xqnPA}12!k5FsD7pEm9d%iD&Sl*y$ofXEA92;Af;CGzY0l|_FWH( zWpAe!{0Id!$HL7%2e$+YuR&0Hoaq_ZgB!h_|A}IPA5+dlL)F`%@Op?T_z9x66ID6i zU$+WMpCj{j@Ky;QNpQv%DaGqGpzT?Jo7*SeYS@L+>Y_WoCio}dT>%%~Kg)CcP>lfC z>kv`ScY@`6!Cnin{z4~MLBS##??Bn-Y1uyoG;s4VvFpy)Sy!FEwY2j#unzw5cc)&Fxc^h{`%W&L>?Q=R0x+coAqJ`ZS7WEH@T9D~SmhIhj=@ zdI@5iokJnv7x!VWOk^~U`16%6yTy3jFoB*RVm@kbXa#~r&fiO&l=1E&uibhT0ufw? zU!MuH+Jn5oXZv3_a>4^~&j!xnRJ)1kueG7+urdlB(@+o^n3PEa6Jk3K9zgG%v%xY! z>^OY7xS5t?kaGAtH0$Ww3N7lN*E`OJ_nsZPt6C`7&tbjmjd?UFCY3$zc;z7sj5y8&w7@y(P~NFQUm zo?jnyWUHe83&6>7J`AAuZHsa`egPxP8`!w9c?av1QE-}DGJ4oi# z{?!tpQ~P@*JZ7ivFSstjqGOlTyi33OrPsK;6Ji(MZSD<_-*gd$@46QWiJ0~s6^*?8 zIY`|%9?5Utu^kB!Z&hHr7`)jn7U0PBC)+mxR8>y+kL{4cxXE2BPIC6KF&7_&*hymG zne9i>D*pi`m1}GjMEV1gqH=8_4YI8al{8;aMqj5{eLdg3#P#%)Bo5I9ivI z?tKX9RHGLB8nT4VUWugyTxIK3_v~OI*6$a<_pksct2O^Cc=Q*9n1Q-GG*GvSDvKQV z=y5(%u^Wf)+Z187WdhTv+sP~iMJ)6(rYbv_2}XR#T-Hh(^LTCGK$Mwk19MCp_zgLM z`p4CmQh)HD)^+4Ix*pflQ2Sl12l4eAof$?s{9yu_q+#C27v(>-9@+`xe+eRs0Hc22 z6P;o1Oxq-Av*@J1`bD7Qa^&wG^V|n)uulE;EA1A;a*^LaeN~aJEhq-YL3qwAE{6}H z9eII+x5NpW7bob9Rity&YkqlVsHmS@;OT*QZQNi!4LnNf8UGzdlk>K{+ZK|F_VLhU=AQ#tSNw?`Q1wHp;5|y=&Iw zVeyhp%r?u$EZn*>DLY+5{q?3P*bDkh1s%9@_6jn@Jd#0-VFwMHCuYeSL}dKYi>$(A zR7XSBhEsd#j0r}7ZEt~zkh8NQGIW7_I>9!SAbmmHW?-NeL(lyQ{6V42KV|a6+wxvk zq?lt?_^sehCnz}Y9KJq&LwkA;0bQRLMa2C$v=;XD-AGB=3hgd`MEAio0)k2T>HQ5X zKFX`{U;sE-TBIMY+<`F2cz*?om#be(GZUB_5oh=iN^z2JLBgqd6QJbYm3d0boH<$h zW?k7snBe7oCb;-5Li=N&^%nHt8W^yKSE1?@v;L(_fk%GW*P${cslo4z4b!_C3BWo2 zQY6{ctJ?2Vk;wj^rz1^haeQ7mfnB0ZRgQz-1C0~>FZ{h~i{v8r{xZPrhkFod_{SP* z&%WWv-fa|lv#h8dI_BL%BJILy!W}yg+GVGo<2%e?^kqtZ zlt}Ge!PM5pfn=M7!BJS0=nku1(m;RFlANpFVZ|Y8xT9?ex zR}Gl8iV0#WMezy-%@3Re!+rIC0M<-R>EJTr@!cQH;?cGK4m@5XJP!C1)YdAr^@Fo& zD`v)IX?^Z{m{3`&vn3O`4*DR9(kB;K9_!&fk;b0A>9=%U4Z5Q4+(Ie1sf?^Gz3+0} zgE%NEXiTffs~Tvt$vZf%rMin#j(JhynS9Y-0#^80+qjND_th-^9r@ndwZgyNGl7jw z#fTr?LOGG9+QIGqteo@rbSQTuEiT`>z?Swjbm}I=*=90~#<+A!ug5$%HOg;>v_&LJUh8*ew>A3Cje) zrsg!W(F=yzZ^I`qYqvU)=i2SR!w_QaR*BbrWmvl%X)qRRx1`3zj)rxKMGwGo^(vz1 zIAUr=H0 znJ*<^N6KTM-j*HAHm`u9V}*4Sr(c+zj>)h5gsw(Sip0GoS2wwmcnk9Q7lC6ftJwiN zsj!Q?VVwq!9YfcnoJz-nC@)Dz0lSg{E@lCwbwvlv;%=A(vE<0c`{pNrw+ki{@35go zn;Hg@p9J05Bk_<(UhA|B7}P7;2os|=l3v>-bQG`S?(KxP{cFJU^fvr4)r-2y%Y6eo zkUl|6QJSzYrzubH_WpkPg5|(`_p#ygpFHJM6c7@v}NU@TN+kHeSMC-n~^CsM~PN;9t?4;3rR>jIEywJaUjZ{1~KJ zlf`1V-E99Vpw{-7=dC0d_df?QxLlUI=j-#ruZZv&r>aB!$vQ917Ds#IAwmPC`jj`m z9id{WzRDZF9HIVFeYv-Iy}KBf>wDu%5wo;ZpYM$yfY1S@dVxrt@$*UrPgmND`E|Dz z)<}1M zM%;%0_fEmR%GT?~z0?H|GmFZC-V0BP&_}LAM|Vgl{*pCkK{oz}f&V6vb-@{Qr!erw zy)@@Q(0aoHE)*%1YFCxL@I@#f0CZ`xe|XjW2`=6v8ntW7Bhud&WEEG|+W3n)E*?w~ufc)+lEXT)aFct}CCTzjB=-fqo*OD~_a`R_tu zyCR(e64hTjS;Lu$t5CJhG{WvCc&s{y{2w$k=r354+BFU%)6fDfJ_cIS%QnkU0XIeq3hdvhk1rIR;U@^N4C~_-xE}#Z*1*Obp#n4y z;0%Nm&P@hpxt8q@eWP_V^GgdZ!3C?C?f&`&ni(t%Vh66F+%}XSot&^gVl{@A+&tV5 z&bfK`1rjmh1dBjNY6tO^cn$X=ae4rdH_E;!>OFi7)-9lc7UmO7UP>;(#~gsk8XIIm zQB8V|{~8KzW~>~35s+Tu7u2?ZB;9YNI}Ug+;lH^t zVQ=0VWsjU4Dq(Pj+c$-?of4t92yi2=+dp%}{`ZCTvmM`wY<4&8GnSif$DVcV_ALF* zS*Rfk+H1}dV*UTCWFhY?6KSjGid zEOl+o@l0^5+zF&os-KKV$$qHaB1Mf6=xzir>V+t@lH(oM+5{R) zps_yW?EE57j_px|*w?moo{hh&e~L@T7rHfXeEfooFKEnBFwcO=?F-e_KLEeF&cw0B zLb+0r^U{mgLQ%Y0c)2_mgjdURBz&$sN5hxNb1b}1p1VkZ(B;Ve&J?IUJ|P2wHW~oF z5^^RhQxZ3_99zY}f{n56pm$442?Vlie>VCZ2Ey*<5V$5Ve z{KgCvbf96km_2nj!oLF(ZicjQEWyI14;Ebc))b~3K*MZyi>0o|1*$*7(+ni0o{n^H zd~(zK$buFp&{D=gaeQ)BzBqpEs&QN>lg5TjT#}`g ztdlifmv!tqi68OgZaujv3sXsg>LCbr2u20#Cv-|Kn<1K-m?4r=pJSvFq3KYxBai&k zpZ~0QAE(y;33U+dEp%l~^yO>^DWzR~evfL7x7MGik>hOzmHvR|7O0qO>**Y|Ehc(v zO^rNm?lP*2!G1E%VSj%%6y+5x-+wE3ELF>1K)-&ZC{FM|vT7!c_vLzxKV;^{MZ{NwYKL6@i)~zUesN}HU89!sq!T5X3#vgzt z1diW$50npqQ??$LL)0U9!(hzXglzl=m9wTcA^?zQs_K6ZQALfpXzOt9dlwGC%!A24%vmri~Kzu8oDR>-Xh)VfcHjd{e5Z}ng zfr~@q%42(&es2#mYh#d!ec4Db9*qe3dNu^RE+deSW^2(S3B-fh5bsJLzL{OhOJfMt zq3L&bGgH69m{z$c@1TQdFTI*$Oej3n&($cns%d46wZ%E3J2gIKTDy9g{)e9!of-cF5!4RI9yyHt6UhpUsqg)^Nf`61i z)eF8WfdMc02MKiS8|Ye42>g}(y5W~Qlg4K~tOkyqUXo1{Czu;|W2KByu9AutU$ zY}N3F2L`_-*{GTiMi6X%hyGiK-`ce9AU**PMv2wby(ZlDyoha_JG`DE@a z`E;MGazQ#%-=o*`c#kZ{N>?E7UnONOLJ{Tq;rReEDLsEJ?CSOWL!uWWNgPPQI6|0; zB5nd9ao$AfOAwI{)*y59<1>}KY;wdG3vr<z$8CPg1it!Ui_>02gcE8<2KI#3C^9rMr}4v z^H(By7sE5oiWy5{u`8GndR%j^Uw<5kQn>D5>pH<9`II@`_nEi)2Q929&)qijl z1`!!Q(nmiZ+C^pOZ%E&z{33#W!*3TOW^kRtX(&yOMT1<%fm}Y6+^YXswpfqfO(@RlgJ<=jyxd};J{ z?v`@iTLUVC^&nyDW*}26!NZU!?!{Tnuk#&*wE8xz@SKb*?FvQXpJZ%79XTUg*AHoE zz!o9|9X9rbx1uC@fp>90Q5Pfk=b8tKnu*@EqWaBffV@Tu)n2>yLzBurG8UF zp_$`#?aiV-C+nlOqb^lC`G?or^#ROkadTb~%oW!C2sc4vMIwg|hV?%Ty!>Gc@b4g3 zJburIS(#P&(|%B&!#hB|R=?Cs)X&&0W{vcs!jOd5*?x$|c6R*u@%+bCbS@kxuZfSmQNsKZS*#9o|c& z;T<}lS-&SI@e{Of>hgOG7;K+Bpo~BB#dh!oBz&=#d4qpPLhu&+X(Nl4pB^(ZLnJ51 z8kbU0ZiLBh5ugVN>y)y-i*lHLGq6WE#DEDFRK3(+B*SEXlb+>$U5^ay7I_J9Az*2O zD{E`#+g*I(Gp_;@`RT|~sXhb;3v)Wb8$gK{ypHsE&7T>3_dtzP=QpT}1(dz-Vz%iU zkm$(Dj&h*#=a_-ewl^bHUX(g z@wBfsl+9n7cXVi`jydLeVluu7IC}NeZV}gPGG-cO%x5HHhRsX}4&hSx0JZ9F5gX@0 z5={GEwEzk|(uq`Ct@>~^Qbyr+ta^Gil?Fh53#3`V9RfeY44qX_OtGk?a_jwa@9NL8<%iN^*! zY^-_OxZo+TLWCm>W5JC~5L7blN!CL3e6h$)Zpdk4fQjz`Jp!KE7-1s#_Y6)*@TUx7 zaEaLeU=Slg1b@fiG70t_f*^)~h^;Y*5g&qe23IiX|ADooZQ?mB6hFOD>i=%Jj;cwQ z{U@uLb5|kdTdc^&V(3tQz@Tzxzi1bYCS#hig(!^dC z$BIl%Y!Jtacunl{<5&@|iM=C^75SUkH^s3ce-rz`IF?mmz9Vc~)*kAm-6FZcVNeq% z{2CzLfU~gRaEbVyM2Lgq2t=6JUrDTd^p`FT6ZQNZyF9NSCv%hA=fBPf9SsH_)L!nOVX27!%>UGWxR&Dw5JMU9M3fQ+z+ zO&@}x=PZq(m&C+eq%ri8n3(5i3>_#MBa|v_(fs$Ez6(Cw7Y!v*k^18}E$MgFU~znc zenNimf0;f9HG>%TiQx_ur=|opM#ppnb|k^S0yWbphiw2&pNKHNq{lf|&U%SsS#Lmo zm2UDqx5hdX^IK%m8#56S@6^>Un7^s#0Ov|u$}2x)Q5~|(sl!*aXE9XYp~I{`2^6fd#>DO zA-n)@rTPYU$0$aZxJSfsw=)#X$LOt8U*hgq6~{9a3`%?v?G7c1wc#A@R?zcCu_4DH zy0*%s57cjP)lta3Vc|6>OU5PB$1^j!cRc80Il^-=ygUJKK@IqIDWKM0U+Rh5Mn~q@ zrqKmqj$eJ(3#VBp9KXxRQcug%r-3be)|)_=c-%`~ctZqd$f9RR^6iA*PnRIVS4J?9 zMKBbRlK`x6gA?jNrvsaC==a79nar%?~Qo5`Q^J( z8;(&K$2rzT!1-p#+A&&HuAdE$&q4^nAAuAR#ws~Z{vA;Y{~nxZl5DL@mV|W&ZFs`Q z&h&TTT^x30Ec~&*TDWR8H%*7pSv|}0R)N9yu2F!t z3G5Uo*Rj`ueC73?iEA;k#yXIV-7a~56gN7kcKWunE%FO%LO zl|)oOCDAX6Eo#H*^{{Ht1YXuZZQ=R|Z;S8_>@BFMZE?4*Er+fbjSB4+MP23B=LshJ z_qE>VA;0=52oaow+@>uhz8}pUoSaS@LOxhGo;x@OwxZX!_w zA;)p|s$9f3DNz+k+`Vo69L#(fQQP7l7Z;&Xa-uwqa8e*A%P4?Z@-ZFDB04$= zNNb>}64H{Bg?Y@y3@y_uP%zvZB0WzZDG`EgmL^3aOoD_zvwBCHMO}j|cn%Z0=7`7J z;{>oGy15(MCbn=h7SXK#zPW)b%14=G?yN5<$h55- z?@!XY*7A36OA4PC6^=-0y-sJLxJTgW$ZQk}Up>-x+gV2{2bCz-vadmT=vPeJbi`4T z6q)c#Lu^V7P&YWqF{Ga(E!m!2=^Cs<9j-7RA^l0_T`&|xyzU7jXyF&-LcMXDsCO1t+gdkv0Cyp*a~*H(SlE}3Z}0dBf~ng(Fb1%# z17i8BHZ|bW)zE@->rfcnT7(_AQ!xC}ek!K)rS3Oc{Ot=r-}D%Fg&XD33o* zC)j@nYn4&b!gV6@V>^k2leVDg($ARmgCoSqmz7_PM?CJxDEpA4>;V#mUsU##CJEle zx1y$oZJvD|`UR{D9|p+nm}^CA8nzXWLv*C#w6P+~&(UKE7TeO*#A7X#!xoWM6;J60 zTLRc3Tp~4vfn&z>vCL@;q+nWA4jTpZ(IBRDBXpmcVO*swc~MwtkL#Rjy-!!BD6g0= zB~A2!V>_ug|Lj=0tT)8T&#w9_k$`GljYk`+S751)B~=;g+j7^A)^t*4%|zxOD#jX7p(HLRUFO zmxv~P^F)Lzi>|c2PuBQ!Oq|df*&AK=xi`C9(=s})nlW?y+4y)onXoZEahXg)+Ox>S z5%ZQ73Sc9-%qC-w*Ap3Z)P1nNgR%tIz-V@Tk+v1H$xRymlaZS(>uHvM)_8n(h~TC`W^ zo!NCK)-tVDkxtFV59(|-9Ssg=p{Z(nJY4&g4LjT?C>!#)-?qbvVwy1U5YaYU+u1KZ z&L5uyKGt2l|1z@IZLGPbu3_#8TiM$dz?6|X3c?lJp!Dq@MMK+{r4IbEw zn{6d-yV1B48!lK;kxvMEhW5!wQ6*_d@fgr)3pDYh;;=u1dks)F=;jaTVtnrrd<4nF zXY%U(63lCdzlG%ems3t0Q^q5na?^_K*%*i`QoFvBy$~{1mBw z7Lj11pOoO=P7c+6C3SK(K)@Jw0Ho_gWyr`(z66?e!g<<(;LB+&lN;)4`NAG}n=xA> zh!^}2Me3>trtP@XG8(7S?k4wSWvv0JZFnznPk$0v5;|fYYi+C|#qFOTOfR*uS0T*@ z^V=<~foAi;1k|~XlhqCrWl~m3=a?XUN*z4Ek9bS<#a;`$7NU;@6!ooKpW|tfUi16r z9@wai_X|B(h0QL52{Ap;ZO~5qne;G0?yNf!^oX2b>qd)-t&1i(SnY-L+@2oAs&Shy zc8h`gpa(B@ zPvTMqe6~5FcJY(N+c0uTtQhIVo%6zeFb;fZ8jMSX5ZUX6%d=^Pu8XWAoN@=QpoPlw z=>!vHKlY(NgAp=)sM&@n+4Goie}WkZ&vC4_A*!(xEXFnxd|d>~S-30Xoq+N$ zL`+1BwmG#kNqe9#Y!Hh70q8^L-d=p61mEq;o4ZW&BJ9RoPXkUc1_^B`r2`oVM?3*JYbu7MQ#>%-AK(>pLcw>f@54dC3% zOYyh);|w2SJlK$LPV&Ucl7rQM$X@*gb_T5H|_V+V*`z5-xT=+_uUkAsyi`w3s&%c}Km@n@C zqw&gl$Y2JX&oX)0r+>}1tPfF78}NP;rkR_<&K!Jh@|mbcEZ)mUKd(StH|B=JN22n1 zNPG(0qb>h@gbuv}+&ST`NC~zeM>)I;!F+P>iYQgyEWD59!|xG?;G2`LCASvVOW{wM zLS4c(m`w&-XIpi4uEG zcB8!KGvcIynUNLYG022Zvmb_g;gTcqGgf#n;)}OQ#%EIRw}RC!9*ed0=shUH;18&U zu>l`Tf6F598_{AxrYkK4U45VD5) zy#~HFpzK`X1m{yTC_wq*sMdO}zRK(el`0=7N*&9bPD=2!CW;#0UoS>`J-;-|Ue7{v zG@Jo_Ug#ei@y&KQgk24b?1KMk$Oc5>auK0CuZJDY@lE3|InCPm^4PqjWRSDaQCqmu z2r}TTQ)S@DZVd^SwYM2WrB}mKQ2yRZspjF&g77u^Hj>Ai`D$gQq&GLQVdu>iP|4>q zGQN}{67I(paV{*klWIHVso#OjN;zpe_@1k_oEapj@YvY3;k=WQVcXd7*UW}H0;38Y z%oVhgxUjIDoyDM+=IGOgqe@O#8a+-J#P<^%&?9`EFBg!c__AS0J_V5va_3#K;z7MX z3g9}fbUKkuTqJe8BC5@f_Y(?{+;oM{JXG9*w!5;nyFWc9?XIjl{rW5YXm|bE?g~3V zq1`AKw(}X}KtXuW@l=w;oUs-PgTNljchD@JoOfl~mK;pT1D$`$)qrF}1vOxCku>hfkC!T%)xOR3K_p z%0eLdpl-ep+>4TMB(3Uy4uSNg;X1C~XkD?lcWgkOIFEb~Jegi#kOM_8nrAp(%^=Ko zuF(ux-Pe>82%i8 zlg_h#h#`ZUbfrBu=bM<^(@hL62h8Je9;nuF-fm(Rk{l z*3+Q%E4O!#H|vS^;A5hDHBb=Qw}Yc_WZz&(s^MnDQjO5^p+R@)8(T(7dE!yDx9?gg zsJK3c{8vMHxAVQf(5!_IA!k~(X{~W}la3dD4aOteSO^y3ZDwR3Ty|2&Kq|VSQTMQ0 z*3H(~n|klx;l5C8QMEA4fO>GOS;{rMkYfRCpyt-yv<=4z(Qq2Y>@9%7!h-N#34^_Y zspmpc&EeNbkM>jxa*h7*$9UJzLFe6};61Fo^ITU(xxsJAQSfz+aGBr+@5W#At;R!C z-B|XuCrjBVZ$bDW2}hdNMF7R6*Kgxm0wuW!k}<#8$81GpV+p~fD3P}zJ|?kaCiXJK z>Ln+|h1%qcNsH%sn7nltZ009KCsKW$wx4;YfKQHCo47;?{Sv$SCXQOk09m)RmWTR> z2GIHDz477T*%$%f_ya~t7a-Iq7K01%?5}Sg8pwwWflTL9fV>FtGCEz4y1JOaD-pN^ zf#wnfE@d(r~E%AXrgh8PyuipuCWK)kOPup zoxJxtR{o#)Qk(%s8!=?Q9;GVUr1G&aUIrG))End!l6)FgK z$l_qWX~vl6RKqoAur6Sc^#;@mY~!^WHIj>>M#K9wDrw84>C2Ep>S|QlmgdsX-3*oJ z+VdT=aTl^w+>CMfU@kr4DAo_?n6+|#Dg%!7b1^}b@doa2Pt6dU`(~LQ;_#Y`Q(@7P zZoAmPYtFv|0>QQJxTiF_++FYDSZ9?Fx5hbkglD7gpi_JMb)yRMp#NiziNICwXewA6 zfDP{TsWUS2u8zAW+JwN!@Mfr> z_-nLWiH>o7QgD&-s4kSAcS}6E=!}0z;>nW6)349D#lwsbegoD69Ix|aKSa4ckPptl z8wSW+P|OFL@wfT&jLUIsKL^2J0IB20iZ!w_dp{w^nEcr-(i|)VLc2wBf_;>%%C{Q) ziSfRtI3pPsgm%_L#8ZcinILr>>)GTJ(8UO5f4Vr?dVF1sV0v^>>*G^GJC!Y=y#hs0 zSx^8wUx+`!w$j+O)-f!u8e^J-_i@V-m()Iq*uJ@O9y}!Kc{S{sBn2L7LcU#x{ z?OpG?yWY`FbmV_k*Sj<-@=qOMzZB^T*8ys0M(Yne2eLkXQ$4~_B98o#f%)R~L8<-* z+8Rxez4Ka_n_zvUQ)xI>FX8w!aEBytDSZNp$R^!Fo5c5Sol_XmgIQtVV2|*;n0WZ! zjYnYwPZ}m|+ujJK{kf!+d=IEP!KXeg3G-62jMKy(I(|BhYXkhj$e}dsn-p_NId4wn z?6xs(GG1^!NQKS;!lG78uR=*}SbVH3%HQBV)<$Q$CF(@?(U#>0GslD&mg|^`B!boU z^J$4E2~oUlaepd*)Q^sDJrd050@v$4gS>=E?E`6%cxU=R(5<^F=p9ka7z@EBP9xuE zrA$J~eP+|B5Z;F-5ob`BN*E9i)G-#ME1{eh7Yk-N`JjpS73%G6{xJK4sa|ST;&}k4 z>uyX>W2p^YYArji_j{?V=ZS2du-}7>`x9VFSRo(K9P4xB!>3Cn_$ckFaA4Na?BI8Z zk|SMJ9_iXHf>6NpajqX51osm`R-STRJS`o0;x#zi|6f!H(4xF8ur9bE%WtFiYJ5JX zSF}rJ!Kpsi&~LWN2E?os@k1PAg<`~m&a3e~PCBJKK*b*N(V}kDQqWD-e0cBI&s2_FjIg#atVlg zRQ#)2uWPM4zYuR7q6p;I*-y~a(*E;l?Eg2wjMR~v>@jcAv~&LepRlrD15EH00i^Hf z+ra!K%2Itt>g_03`*BNT-rN#7F!g2tdDWs^(8f82*r36j$_r~3&jR`M7&J$m=_dFb z#69}7IF%gc^jncwKMQBo*-9IgTEBz&1H-{RprU>XQbdgN5Y2$2mZ&}vwo#jycF3I4cY* z)8I+>pB-}*g%Lby7(3Y~Vb*|ka}n4@y$2yEZ-abvGEpC=AIquA?06wY?ON$@co-{2MsDkJRx)?DO=FY`jYQ3Y!n_Lpgz zxGZHo8vyhnYC3u;`d!c$(BGHfoGpH-!57(_O86<-gji|n*!|%vdKq`cbvW6&fn4Yu z@HJqi&G+u{jlziRJ7J*E@-s{B)5vRr+mql92BmUny4Ic*8N+=qL3ybQ#qg1u^N|S0 z9R8+G8DZe@T%ZV#JsY++cXNf51`Q=7|r4zj|L=yq%A!S zR6k;1c~eic=d|A#OfrJ|dZ9c!NThr~=ZnDUgx|$qar^7%NIJeY8}*r0YxQwi{Zmf9 z{Y)Bhb}4)em}>qB5m^|^xYp^Y^sn^rfV&iw37lt3j5;OULF1u$y>N%1&R=`{2pv)z1WxGXD zagDx;|1zEt<=kihuP z|E_{gJ*y*SCuG_Ba>h9|9>SE~}hq2tA&Y?@G>wDU$L1gcjFi)8Zw!1qX;9D@G zCX=IWY6QFmvtB4MQl4d^`!G^@J6!olrz}$Cw9AsC#G{$r%ow~}%OGt+WZ}K|qDHzOM@HHh7g=~8ao_MEPeNq!KHw7? zm)5+vSpiP1vvu*6xGANgT=|%cXO(mvz{j|-Z|E8z+~2G{c%pV%Z98Cfns#j+LDyaJ zblpWJ4I*(e=FeCz_loON4CejjCj9&Mf6NE3bWY3XJkDo~T%``;t5m$ZtsCI-W^__n z_*cxW@Fv{+s8w|FyIj?1Y!7ZR9ypy(uy`*{cR2S&a-qou(5f?^8esv=kM?ssvxIm4 zV|hb$$~%tBJ6g)ykIPF&c%!~>1s2r~jlyn8Wu?(n!p>gSo#C=JoLsl8be`g#d&v%P z_H!@Crp~!nJ#+u%xI1A3I_J53o>5AH;q%AvwJz?Bbid$FvG0Gkb?e@`KLNIy0%S-R?f5`iOIL%}B0+Bnr?_>s_}PC-&omG& zP{eH$x&*s&03RhhZz>IWH=y*KWAoT+!Ff3L(k}(CDi;_36K&?7kI~9$!aJpEuY%%3 zZWv8^r)>KRhW+4%-9TY$@km^(E_CA3dFYvUsw;M*2;VENrrm%R38%7i2DFZ7pY@8c*3x#Daz_1J4uv^`**>2c! z3QNH&g5oRPu-n|QGB@mY3ZsvZ6yNNI-QkAa?S|pNVW*%E%ZoR?);MC_XlLjoAI4!k+%4&Sw41Rwx|B@nU*m}N?MkWraRCSJ24Y=zjU#SKR+{yA zC;-{K9J-c@u2M?&39$C`!F+9C_`%J`9sz?de`;;{JEGhUeK`jBIJ*h zfL(~yrrfxP<2Gf$^*iGlN0bh&aa4fG@&|04wTdX2v#fDcJDz8aBZ+s0HI8m!uaSw= zpsr7Gf{xU*#u2xl`9tdmQMkLt5i5C(BMQb=&k+&Hl3Kyf1 z^krG&2;v_M z$-9K_Q`zRka8nUaq#!(75|DyPK5`*QUpQ&?Uh1;iVjoTsGAEn=& zw#E@EKffo(DAX>8b?=QkxhHoUT28ic(qiB zjt7mf{@fSjypBCAdx;!#NiXN7eBM`B>LiTe^~LAGLr#^sOtEN3KU!aj^DYbL?fT#3 zeVwQ{UCfhzcnZKn4ej4_%xg>isPKBU{10m!;Y0Pb#t~jH|?ad73lI3=;=9sA5{9FaL*hszj6&*ACNJ+61D zJ>5BurlBHKpeq*OpR)U@Fjg7P0bp(DUN8EDY;pf0mHX;G8Q?t&j8bP_CA`KF?GZV+ zO5H-3!Pn~epzayd!bzH1iOGCccx|8(xD->Fi~p|Sa#33N-zirEGaXLlV%KKZM72=jNt!&K0h=^jf-pZ-@Ert3O{$+St7pjQe$p87IQ^m5BP+3rm%yZdN}KCA;fEZ=Od>sj|18i>M4x%G7VrqnP6TXg<^ zPK!pbv!pc>TVMvRa5)2y$}|>)&+B$LjMrrk@EA=x_gGg-VKOW`$0GL_DLNTuQR(yt zK0dQfhD|!WIyyN%QJRG%RAR4A#s${Vfy3xzjU&Z~WqAjF;+L%ZSQSUpPfM zJ={HaFm*oTxr5QyK6jAgVtwhJt$cOu>pyll*AL#~3GI9DyMB?~#_LZ{JMeDc=+0K2 zGx@8&@MtPL{xm-l8hQ=ejN93rlabrr?vp?p@dYL4zI54I?rMCjr1D7nQlK0cslSBJ zsl=MXXxyMaMEALW3OVV?QV+V6;)fS+;P<4cfcV3ydYozxEkrT@8Wd&g(A3o0 ztaNRz!r#;?B_m$%TbGiNEd7o9wyfLqfhmXQc|GS%K#pnFZKBi2T6?DK=Vw~CNuDRA zw8QI{Q05lD-6RXA*GbZh9rdr>L4N2XZs2Fb!sV6E_2HujTXC|^D*gne+`+{OL0kIAa+aCmb= zcynWTa}#bhn}03ljbA=YYmc{fN^u+4F<69u3d=~)-D68$q{ELLMmD35I2K-qf!*G6 zBjBser$?BLe#iCjYez6Kb6!T@o4lIX8sERE9b2k^!HY4QGOh$dIYJX(W1oDq8kZ9Z zlyRk;==8Ew8P}~9&ik4t5_BoK1D{4{mfYF>qPQ+4GYm{j4mp9%btz?pfi05zIDtvJ zl(N9UmdPERKz?eXj66s0l?_6doA=5(0o})@UqAexgJr<|laD_SP;s#D-hknF@6Ty3 zODgJVrkc#PKxl!Y^1 z$vqAUC!f?8PHw3$oE%$UIJqkv?%dngp>MF!WL`BqMuv`4AYF$=VfpBX*RY{)*;1|# zz2V=v;dR%vqW!JABmtpMaOa{H%bD)BSm@sv#;v#K79LqKt@%SRto#uyuX7I&pY(`y zzENuu!#~uX8BW@5v2Vux7V!&4oxcRP3-PW>fLETu(4XDV8!)sJ$JNjZ|MI;(9RI`5 zE`@$VV_n!6rMQdF3%s`BXQGU4pW3$cZW-=hd|x7*ZtbT{J-Jwg``t&=I4^Jfa9;Js zr=07=r}NGa>*VjrvG7ATLplz6?Zf$b>UNsFw|sx7ejmBn{de`N72krMXY_CQ3n8A` z;wMe0KZFyZe(g;oTxareoixP9b<&XMB|kzxhknFXz-M05VtFCB!UI@ccm20xvTr40 zndwLOs=_|=l#*lBwGEfe+a8odUEBK8Jy@@8{pmWk@;%lw?Hh50{oD>uzNCGyt}Xep z!9~vTTuN_wV#+w;jT=yMDp`7yjeWP32YxxJlWZfSsctu3dDLl%g8QlN8e(0C0iKU^s8byVQJrZ?!1oZ(nyuM))i%3h{4&+Xm&i}mM2Nuiw$g?J37U%lnw9IfK} z$c;Cn^E`Ru^RF1{dBOJ<)bmWNr%YDy3vSfExFxlUU!kbzA;nKS6>?Ox?rnV8L5=g2475SBgRiP{#8q;gMsLVLKOPkBPmqXehb zPLQzd8IRHBZq%neq1U*f+cA{J7c4FM9nYm2UAGH^Jo^z{FJiMal6sU<8?%<;kdERQ z9kq8Y9iP{5yOmN$F*>;p`ZyeqJdn{;649m9>*l|Qo!#S^QZkW3(Q#}P=IcqDS~DX< z;)hD`wUx4P`>negv&)8Aj3or&7pL|U80mWO;mRuleq}m zU7WI7P*%IF)O|9h>ryhxXzVQ(Y0`#^WG={yIh}d>@B>G2ySZ zv56RzlC@Jtx(>Sy%W_k=e$;6*io`aA&vXO|Z=+rt?#rdLiH{vh6B5Wf?>Q#U-|->4 z2Kf2G>u_%mJwdxX*?iQpeetc>!}w%REXDDx1W#&C+34B}R}6yW>Co~4?ry~LqjDGF z=HYO;Y2V105V{=;i;pF?h$y@Rx6+$P!a`+agAe?0$t8CRp`u+htDd5<(kU7N-(Hh) z#X$Cu`pdN(%jM~Zv@>NChE`B%dh?$`e2OKIo)O+I#0QxI=}A(q(}K$=e(f?-2$gxz z#r2e#l}?!n*qu(9$4{$UW~YyP%1pz8+s9wQ_ACnz6s5H3w2>1R51P*YP6Le-m*2ef z3_Yc!49Au0oM?($`i85aG(FcM&2SgvYmsDg9FWo8bQl^z3R|Q5WVAP-G#;5y8s1GP z?er#;hIbQ6yQ~SN@!W*cPGUl7JU5}-*(Em`&rK+eaD{hr8E8B=p)@#|6lef9q11~^ zC=K8yltyq9N&~nFC1;sX8nI0%x!;7+h;2ftr8!j23+W!;r{vd^G3d2Wkl)&)BdT#e zo%i&r-A~C6PP^4Ru9@fWX%OO6D2@EuX;3{f`s&i%_&2?+6it_U1|(9*fJCOXyLI?5 zR!W;D56`>5^e|mRu1l@+2MZUj3s*C(fv#nTYki;xj-W5_nFi`)GpuQNP2Zn-Q$(|A zxZp=9fxOd>mCdH}$xcMVG+ZV&M4xbNU^EFv)0{Q*0s3g8X)*C{#KxJrh9B z{?Sht{z}nHNy~4}T5*LB@D&fmKbxKXpY8CZ&;BFnvE3g?Z`mJAkL~_IdU&z$hswux ze;_@a9Qi}(v7I+PS$7u4Y|AP&A;y>9??f#Pu zmH0Fp8`8N4VISfzrIzhM8}}mTEdt%{x5&ZRo#%I>^Uk+1h~FPxjPX9B@dVfEj!wHO z{7MX^U===y)t0GsJn>Wb##={DAD@*9>m&HJRQgf%G$cmPt(c0X-|3c!trXA=Zm`Ksipt2uHNFcF~e!|OjgLvpl+Ry z)lH*T9$(ef*EetA8MmnoLKCn`ay=MsuWvA^)5DItVGXcs^y4-RO{ypUx2|nC&F|bW zx}UtoZKo-YORLgY>t?z5ai8lFTKRe+lsDF9F ze+Y-;PJs3YsJt{6Xa+qx&e51h?RVWfxQpq+0ho8mM%-<~|rb9VK8zngXVC>)P_il0x%yD=tCB^3aNU*}xgv%UuUJkxEX>)xfF#g#OENyqvf zchbSPGb#6`U7JME%W#2`$I$tO*I=m{r1|+0m@7#0Y&jSY@9{|f_!V0dGt-JoYY}hvj9@ zO8?__h`@fe7RwZ1McsZy`y~BB+&`#UsDIe*{V(_A;(b)v=`FO)Wlm1v`1<+cJA6at9v)PF9hJjXUzakZo=nPaRO-8 zBe*>sw?$=fmb_fq_S zF53K#|5I_B^z~y@cK9EUe9WXNfb&r9!nNKb@I7dfAFw>a;cXOY(-egdvd+VJ zzgeGK5%7eM!k0%-_^T{O_&fO{AUQzcue1D_<(>v)^FR!Rr^lX$>k)q4=;KDQFt{8*dhY@uxyiP+z!A$P&S5_+mTkar*t;AU)??c zeM3p12sjd=e2<5yF1jPh8`7!#ZM&Wajp0;RigibCvZ-YG#t7Q}ZUots=RVRl0`6wH zo#pE+zhoIPlC-T^_F*}JWiiV;SZ)|esr_r@&XMQ=4)Kqoy7wGKaR-kg?buQCu?$7L zy_Dq(C}ZKRQRKIYqiOrv(d65ESw4y~0`_A#mUA?v6O~8X<5@0cxt!&bD4W9Gynp01 zg@Y&~p#M3m+eg6cbIAS*me-y`WvgQO4$Gfd#-B?zsVuY4r4shT?EqYKE|vcY4*%d> zYKy=avdkDm+dWyH&vHJ8KQM;Uj~+|;b{R{SJy`Y`OZFw>sDv+%dvaV;*oP8ZA&J^F zFrIR0H=gYKp$x!+@t<1(xC>>m(D{5Sf8X<|{3BUD zf-(ZC&nNqh7u<0{1nfZB7&;bE_}T)>>syqKA$cl=yfBq4Z@%y;l#j4{k>xuqPh3b| z{hejOG_p+WLGl*f-ZYI`>UoxZr?;LS0h3r>g_1@X9D-OXSciX`LW+mF!ayb;EWvv! zGg0S5`v|5Iq#!<>k%S>ZxE(1DuYI~O-N%;AVHl{CARf^vUJ6Wv2Qf8Up}^7Ydfw`Q zl!$aAj(OjDTBVJ+uSqA2$a{OZFxOl_GOh%y7$o~N=@ zqAm{U1*RQHL0rXu7idfYXK66MEPQK|^24JR=GPC2;{C>!1M!O*M6sIU4S|oDl9`6$ zj3((anMPpEh=w2)z(`D=Xe{gUpb^tdrgNYt|kMqAUZ)^Hu%p%h;57b5v!G5kp_!5B+ew;2A+mVY*M zH(PFG%O&uDvM?Tg%?Zo01U9qf9@K5ZcHYYQwXiA8W$=tzhjr+0 zmUVM&e2x`vh8H;AN+cgr71L&<-PjYWnOCf;1>&7tM10OR@VR`_*Vw%bH5d6rw zFYsND2l$P6^r!x^4#|gvO`8&gSCBd)+0@YRnbAcd1>xUJk3eJWXhCQYalNlKer+?J zb!{Sg;#BdY(41)m(`IPHG#M#LJqDea3R$-mI%{g%MNHeFC(|0Hr(ghEZen^G##6_J zXPEv97qISmrsv^OF3UltDm<^IlKq?MMYu*&Yx*MxqI?M!bG)XJRL+;+dbUhss)n01 z^`*W{yI?h2<}tkv_iG>O&c{pivFdYpn5l^A3)sZ8jOk0*%v8yA4EG?4_Y~7tu$Adm zrf=YJeIx2VVLA>^vhLqVMe194nyHCjXb1b{JU^BCTX>dBeHqhtP{p)>=?8d=YrEKg z6UO`r_fe|RY9t@hKeo|6GaWLuzY1h^ah?X#jLlV=Wtdh>Yc3)C7yh9vREK8hRcrcd0Cu z&$@S*vegxw-!V?Jr>d~XXFoFaRyVWG7dXd0too`I7LC{4@Pf8C^i!+3WVwOK$o&Jo8;e9fXh ze*ks;U^)@Tvl~nf3_^O7bxBD5V1{~2{MjHMFOp`ccexIiBl(a%XI%yBE>n>+!*Kb947NOqbV?Pg&Nh|odrYMt>bfx{LTl# z8a0k1;aINDx2aG3$h1mbYEz$xpbH#WqgLCPjOi0=)ZKQtPuyduHCj&B_o@3?*MsQ+ zwViW6Cx&uZt6s&D1)+dxoqCh=yO`-A^&V3(Qb%}1eaLlK%(_R^A)ETrZA_1>>cO+_~Ju&ZMY2H-$EiO#uL)0zTZ>o+y^3tbB{a}yk z!@5%(Z;$Gax*$ZxzKb`*-cduC8Z+%xGntw)y{j(A(LM;xW9ex4o?6J%i)o)K#WXK& zI0w%vu4p(9<${JqD3>%`fO18{Yf;|E^3jHiar;S>inZJdy?31eLCBMBGjN#$D;=3%VoP%1c@K&6dL+^D-k|HS7|jz#ID zydd#qw7-^RIm-%`x3FBvat+J-P%7A*NWOiNw_o7!x_R|%P9^+TbIScwmOr7iVS5W4 z4dK}qRGzDoNG?qxo0UmpF`P=S;IB#KH}brK*ID}>%L6PcT9W?smT4?=QgAea(J54hNi1iuT#zykZ{~>4pN@Oe znpFN3T23ne4y6-*D&-XniE2$Uo@Fx24lFZS_CcxO@2#n9ud;lL<-b_g4R6tgEX6Zz z+cw30xqDkG^T4((aC;nYPi>om+u|$f=OVvoJJlXno|j7YQ&KC@=91KPC~ryKfO1MI zrCidEOkp4hDZ(yrD3eGye;;1we^QLf@vMgG45p@ zH)202?MSJ8(2@2C+0z?zdJwg;kGJbY?LM#5^B7Xxi9B;H%OxzAqwES#bb8B2@;kKY zkVZBcEW4-C_%JSQ9?E={Gf_5zk1@Ove2Y@Se+A6e?o6cWv{Da#a= zy;zQCc{$4)Sl-L>NtV?t_pzBkS#Ifa zH*Wu}3wi$Mb`!Bd9=$8wE3zF?TKV#a`Wha)sSPo%1hUFBN zGg;0rHtfP^(1dUh?e8Zx3hea73mk1VZTWEsmcfn^(( z87#9|4rDo!2dtpHaTlZ$OOnZSo|g^G-jq{JP&z z4DZ!{BuYuy8bJHnLj$Nh9R}{j@ct|(vz#|@D*F7!f%{^d5`H!C!6(?TTwQGeM7o6Yz;7UXhWRw9g0V7Ji9JJ*)*268^`XAiGV9{1df0>)+P^q3Fk^L zjv0ye9XX^M%f2i}v;3~l&(V(m#}EAsN1jP6uS}=yINrWEhPFHM_Gp&fSRM&c`1!m& zjpa<1mt)G4$``S`4P{sO+b|j%|1s=WEdQQiv>#1RAA|k#lVLj8+8n#(%(KA=^27KM zGMh6uv9C19lD?B#h{a{x(G~zQO6%5TKOFAB5f5?q%q+ovT{d7TrzZzd&taCqv zXnbreTFI{_=7QLGzK6n=F|%S5!{jT*coytQAzekn^-O+rI(=rpH)C_~d_LHQ(yWR4D0VPX$k6Apxkx!oN1~{l zIR9^m${7K3#8Oc?BVnQF6xB8ob{V4DM#8bSl*3Xu5jzH-WJ*fq{8XS}0B2&;4K;2! z38}z=;ubK@XB=8dP~(+Smv zIyc^cw2!I6KelnCY5~U$O=}#D#J5|qwp8~d$m>Mql)5LuDyC}K9efvcIdroUd)5_= z8>^O(&qSU`P_1As-N;72+|qakq`*N#_cRXRK0hl%bUPcjQLUlc(A%s#(S>y4v(}J= zcjn1UuQ!Rucv*%HG)Y9tHFUDcAk_w@8?xetBb6A6jmuMQVY#8CxUooU4Ru0YD(oByGV6_N<;Z^b5scS zGOdOqajR7)yw6DSR>Sv5X^_gdpQX0xFwv#0_#8lmOY2kyRJpWKb%v8JJ*K)q7Qd`Y zd)#)F2?b0wQKzsDU7)+gQfLPsRHiM-8RKzofFj&Z2VG;MW#w zkWvk0$M04>V62cD5dV(q30n*ei4WjY6Z;K~#8i4gdJj%Tjfwv!(kw&y7_T=}8k&x2 z_JO2qv78-$K;=Nbp)2CI;>^izp{T2|oc-aTp_`aa7|Yf1pQ`>4O^^Ozsn^GEM$3?) z$1#=uuuMojAOD3K0DgMF184f5k3X&k!a|pRQiCAaTXe5rjRr$H(-L?aQyC0HUHVlG zfn|mcqHY-MWICjNh`01`I4Bg=qG>?q!bwB@nl{uUA&!?LIHaaEjn|_g%g~~x&2=73 zG;}}e&Vdp`FJQcLVTGXsO_TLl*kb7Srd#nF)K!LBH%ryyVIR}Vgmas9M3P@k%+t+s z!sL6Y*;H_KzSo)skWO;E8?Y~}Q{y4jmtr1?qIeS^Pe@U`39!}>#hU=znGQw$*6bxU z0d_MlboCpKyksTaSBI2LLClHnk`Kh-~hJA*pM^1)ghNwqQ1{+_`!gzk_ zk&|JfA?lI&uvQ4DN1hMI4N;H00CM_Ee$)pqfaQj$4;H|FL(~VSLTG?kQXiZKC5EUE zPKPQXKlQ;Gu-_2%!5MJUSW+LH0Ye9JDt_vNGhl@w>Vp_h2&fNU1nGm=66v^_35%G- zXR~09(UH$ChV3prt1f{(LhQ3SaLf?-Y!3JbOYY>eIgo0Id^QJ$8X})v3I#&!v&*5x z5czB_EH^|xn+sbEkvm_GDJSR65@tPS;%L_5HdtQD~22)AfFXO zzR{7-ilM|1`K%c5OR@N?VV}*1^)4M(C9so8#?J+?he?ji3-I)q;#K?UtmG=%#9xhX za>4=SQq0VR@%m~}q3+6r$sQ_82;eGf@~iQ!z<6Ft#5L3MIS0x8TA0fuN6KrVN^<8T z<+X59bc%8>h3Ug6)tV^EeG%*sQk4552o7hRqTI`1mLbZ$40gDbi1${bN06oDz8JDx z%7w*{=hEG}9Lkw$qFzae$9w3T485I@h;&da;lqS=`UZ&0r8LEZ6|h2xJ$NH2pd41F zBqVOedtnY`CO)oja%o25^Lja~=Xf&q+y+%lOZ~4Uw!ydd_8EFNF@$u?(1FBn^zC4e zq=c6Gze+rTlwjx=)ZGD@hN7CEKpHBzY7YO#MgJhLLq-z^UZJ;ptc_5>R1wGvj05;C8ASwJlX-vnIyj*uvW%TOTX zFUFF+3?+t2v1Bg;e&7UuQnG5;$s|``)ug~*jqkpe@50|9?gAnyOAV|N@^8d6Yha6^ zXE4ngs510Q%gy*z!+nN6YPl8Zn4uq9USsV7yMWX5`&yMDB^Zit6^~!g%Q4ikRU*=K zrW!x(Ij_P(L$v3-3TupIzgC;!HP~ioY^$wE)rMxay58Ci`wf+}T81=ms^orStEuoh zm!smXU)d*ReYV%aD8Uh6$rI8$hB@`Khs z$eTqZEw&GW7ZX*$OiX1TtiMF42vgYy+h+@1lbndp=BCdPszA$s!K}-K?n&Nc{R=8w zdfeJi3jEc?3~T*~^%3l)hnMjzUFaB-^n#B7mv_XULvcd>ajoOwBfu#$()sgSCn60r zG!1nJAm7j&)E$7ihOR{2L8vfPhPs2W#?Z~EI|SPdtw!A;s5bOa>#6uu+&)9wTW>%* z$|ODc6NoOPvdE}^7*d#|)Q2HUh)aDK@(fX_55sgrRO(M*p&=^ur?A`*mHG&*H$Kw<-{uFTYD1T` z*^F^F2xo2^J==S%L(Q1=bYF|-p1vJC|-sC#Wts`Zz09d z?l#)~7P6R@_&;tFWq${GhJI+%5NSG->;d1yq6L(S)bD#3%ctMc(kEaRlX&6;tP-8_ z}x1@qJH-8aLlDkY*5kHI=XrITuP2hSKF2< zaOpaHnr4wp6}C?;FLmPGZbzz$MM51@uf}Ix*1J?;2h`9q(yfHPsq^e;wTFqWOgG!H zYWa1fTLK$WpTZ^fPZ;_j^>21#Rj^oezosVZIJJmrslRc%c!*c447F~Th_uO2ChD51 zDnq%bYpV7dn%-_IG*ib6UDj>`5*|YFSA%{z$4*cOnWR;kEB_MGIh4e7M7`GT?{;%V z8fx3O+r448RGF@2BD7Q!h5QGwEUnaBLr1YJtyDSF5k>Km)d{8=_!cdll^tq)4cqTU zUDEZGL$#XPKFZfxtzoKBq-(2s-9S3IB5J4dnWUWU)ZALMoT(Zpm3GRmpm<{0K_xJW zu7g_T>Jp)&+QxK*^XsH27S;CS_APzs4#j-lJ_ny1HoBPa+D}5-&+%&bK0;?l$MHI= zW0GbR#p|MMzUVs=Me(|*1SZ)#GF3X0lrvKeWU2wmJyT8e=(?&RA%C9^Q}MawWrp%P zY(T0sbYX`!xcGor%oCj z&E5A?DK|?hQO4eV^GDIcouNE4jk_}KR3{lAjsP#;e`#_a*3+KSO z4^sI|;+H|HTy*T0L28X5%6*X9Vu*4dtf~!B?t|4nLzMdvb=(l;K1A8KQht*AP`9_f z7RvMubLoRnwr{wqWJ}!pQ8z;EG(@^wb&^S1bEJx19I-G)4ySspAt&vcHd218?ITaOQH7Z>*YSC_DZ_-#Asyv>KXp zob8*S*1A;WJ5TL2l+tmbZ?Zbcv=TCq@>SmLl;%npfiy*}Ws=&Suc{1DZ7)zKnWVM_ zD*BFaZ3|S$r9>!Dc`i-1r>YVm|I&`}aG_dmsIp@s(puLt0MpcVA-uZ?=lQlX9q0zhfO{t65A-!PhAObJR9NbO&{g z+9SmI%~8iC9#Fi?)T~vM%2J$ty~es+Ei%-iQyJ0b=Bi^tc&BiKZ=R~Yi{nAJ zPLKNvRsL$BoK91$LY4Dpp&^~N;>vM3YnZUVJmV`;YYmO+v>C2chYd|a%PZAMLl>d0 zSmoSJ@#K7>SdC>`?SHt_YrbMNhv^932eNdrS|}7nbH*iVxgnZ^FHvg^(F}5l+HT^l zj!)GkYB!Vg>k@UCN%AXECz&X}{k{?vyobsn`IV>?A1x$w& z-Nm>{m52`SG=1#5N-Z-)a{>!hrJ*tL&GkaH&Cu%jqrPj@E<>~9ll3)fzYyO)x>g-G zMDx(sD*Ik8XH-q6uYA|4Btvg9Wf{td&qiIYp=>Nmsmf;(Pn4-5CfUczRHcyr2)0U@ z+HUA;Y_T%6%g~RgyG|W6^c(7~Qzr~Xq)mmzD!P(Nw$vY&wgD+c2x!)*T;&>SlSZ_i zN!p=Y?P8LWm8+rmQ7Wtbg=ym>%2k1(8`CBs6&bo0bxYJTLyw?tiK=8;3D2YzS=Xzb zhF(UxLG2eycnhgQ`S0f(kS>V0Q4KZpKI(2#b6mP0VwtKm^dahQQB^Ko5OJ$I!9-*0 z?1cl_9dMGIUKk z(OyG$rZ2}dk1|O+tdUpc+}z{V0sbiWhtM*e$;o}7kjZ_bA<2Cflba?bf@gW}r)|en z7?}F{@cn%LkuDMLQ;RsB^w0a%dY2O6ezl9~h@w>R1^EXlB2i!8gQ}NHiLhQ3F^LBs zRuxRE;Y9kY5f7_Mm)?oksQeF6DytzPW3=^%+F_`9#{P&$Ror^frDl8_u|<^_>XdOb z;xSe5u;_YZd>ye(#cdE8ma)+HgvvEEDdUHTC)F}Tvon5;cuGZY6w3t}cH}dv+|czI z4I=-layE(XZq)5m>5mYtgoiSkL_V)_ndB_?MOETbi^vyMHPcf6=k41>zNGdW`mTKl ziPFGxecxX)X28qpIO}TEQyE<%tJSJUNw*YU&gd6eqYg4ji|ta_ok@qiJQ3e*DG`Fs zUD`zcLoIrYbQO@*1?Se(DMN$1Y(`qRRdiFjtU}A>PYN~Z7>ayVRWU7r%e#akUsI=; z=se{9$lWSoJ6To(mGcd?hiN6e(q%*Bo9ZMJSti0;D()$=tO2US+bWYu;_X$rOk}w& z@?AB{qkCUfcy#;JT957nwa3-{E%IOLm`C@an)o#3C*}M|6){PE2h~20?vU&26J2J& zC+dX9@~|p+CY;Krs)VT;$nrC_!lOH?HhFYks46DeAHGxvnW$e6@qMW>cTk#3A&~h> zdLgp z(78;NhUPNuFtjxDAjaEc=pNP;Jxe*P_HSegJ;wwuXC6k&5<~kkzl{7|tu^#D>Q1P= zhM?==$RE^kLyfwA8~LLO?vzv-b^RssXO-!a<^NSpHx%j`>sNXqlk{YzS1?I!m0oWw zBf4dv<)Xh)nkylxTMs|JgvGxa-&5EJeGbK>cf)7eT*|3MBWlt3Zd1{6FQ+McsvD1= z(hC#i5TQ@9Wla?25UGRDQ}#7cltZKr8Cu^h5h=$I<>%KE4Q)l8-z^#C9;N57PWnrf zUL=wMIu};k6$qcdUC~e?aeYQ^|z}`mk8ysL|ISt?d`6oRUL~PI4&` zV)QH_f1rCjzGJ+|P)heiq)klKD!Y4yzoD*Tk}I&F-Xp{%3+ls0MhW1r7oE3Gk{rEZDFwwlJOTKMA>_B(N()Ub{0A%UioC-Zr*C>#sPZ;_hsfSK_i_608 zkgfAv+6vivkxR`3J@pQkS_gXR<1Rg>dh7JJDHZCU9Rq#zL?(HnuCJaegjZ6n1ATRc zOPPTjU2QDsx~jiEXo#+C`s-7MGU9s&`s<{3D2JM;?D&C!0XkO*uXAz(gY?>%kl7ux-o&ly1-CA#v7tn8Jdo14%Kn*iskJ1NrB;dtRZ?bXN0a6;wz$D zz0VL`5#{P*#&UK1)IhGb-;;9ElR3FM#SlH2ldH>x@EN+9fsvX%#e_9Nx-2kC7rFG4 z8m;~NL`P55<>^!=d7>^)=eYE%I!Biqq9^Lc=L%;ChUkg9e7(#NJyCbQUT=t=sJlS#Fhtj)1x_EtXXxIr zUE*ix!bE531$r;XqjQ_)fdXxRKqaHI`#0>VIwZtr_fz#ELlkeSUcn^K&`s5wm?V{{ zdJhvlHPVp^Q zMMC&ISZ-jJ-ff8b;Ke%OL&=YN-Nky2A?kIP=pBZr*Ui@UM`B66?ovJ05cRstbfpkK zLwC8}VTgL&<$ABNq+WNqPB|bYqh5Epo@Gznk?A zLzLew`XH0k{T6+SslrdW->Tz|aE<(w`>i^}bVSjU7Rz-3Qw_|@eo5V?$qsvn@4D>m zf!lNu>!=R~;C5YM;*sul$C8hDcR1u*mHk}6OR;dLt6P&j239!~^KkYqy59y_-E1{;d6@Hty5 zn(eLBb6vvO3SA|{z2|Gi|<@Z9r_G%aXgf2QE6xF+3 z^pm>EP?O$S(c5*xkD|*&-81^6q5i1bq0>)_Ze;HP(a-5)zX9hy2hoadtV#IY5)BBac z?pkR&L}@OGe#1@W(ca6V_qar9(mF)+lXtJ)b%{oXFum3LuITq%-J#z1dgz

pVp7 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

9h`Pcx8W0ZsP-J(gjnA; zKndc=0uC0UT&kY*T)<*TV=jhWDW)5TlhRk@(GC(a>SuC<`V@A#u6KNJZyNd#C-6-p zfmZjE?9)#syIaPFRNTXU15`*{fC^W$wh-A>L#}xdA#I0dpM_HU5Hv)u!xD}aqeSL% zA~Ni7kUrs>7qkX4^qk+i>Ntn-W7H;*&8A0pjm(J1g&}isgmi>9B=2vw5!3JwV+4^` z#pg0kx_HLbGNMr!>J$lE2b9}%gY4~DWRz-Yr>Ki8@bfsvsmaT)~Pm!*^(n3 z3GYL{@iZjupWm_jKp-T6D1qFv!30e)5Ts8Vr(riS39y&Aogq3rv9WicFWJ#D(46RN z8EEb5=}7b$Nn@u|nB(8W$SEDRwly=gCzOpW;^EmTPJ7>Y-<~w?os7eU3b9s1+D68A zg=fs9igmPA5z5di<{)>=DEx8q_69BjkrT2_=1fUK0L&vyrD<;I+-^Es`ulnk?IzLG z)Y9Dt2BijhzoKhQ?rz{&_FsMD`p5@%*1qz_o6uMxNnSci=1ku%WyMwi|{8bkPOX5cQi%;r<9@8r;zf zH@e==98|JY;b8%a2gH#EmAOm>%W)TC3o*JyY9EI?Gp1?Alo?dh&M3l z?+)dU(JiYVB9Txgi)r^7NF8KAb>qwwJm+q716=_x1u0yWf*fQSv1O}}JaPJ1)uxGW zPmc}Dt}mSeUAr@rs15Ok62KqaucWmh#iM?GTi370CL%0Fd{wy{;8*}6ppJ+HowG)s z{j|{LuNS*i(1#3>f0f4FQ;Ctxuw7O5sd;*If~3hZ1c4+xZ8O;z8)y$O-90U>$!!KP zpaDO*HPO>)(>fB!5>7ki$|KJWg$%}daCs&fR3`l$uWY2`x>XxO zElk)9RlxR1W|eipINd87zcE{ajmqrcpxNH~lGu%Orzy?Xv@bR^0B96i2q$$=+wIAY zf!@AE4@{Gv?&=PbKo7LHbOz5|-SUVPgsW2U7vR$|9v%cJdM98jQX_B#uzvc+{i}CK zfl+|snNZaIC1~{#nZiXItjvfiA|BqipXEQ{uzLue47_nH02N{!bzvJi6Wq!&l6g4^ z!BI#y%}}dt#kbO?7v~-=y`~o@1K2+enU-E0g|rMbZA$c*_GDiRY#Dje*TPWg?pcQqyYl3kqxK|7|SrEgPLbFrMJ_C#-Qv5fX) zXG<}BYZ3w7B3<;fw4>L{Th!MGyYAc6(~@Y8(9+&=c}sib8Fv#RPaQ42y@@uk#qz-P z_qOzOCg9nGs3aVKKAa&%P>JqtT)jyoqobCoKyY9RcekhX0)u@Dj;MUJz0eQ}1?)=S zxaeY9TTD0P7~5wY6l}dz7${8M1^}A(0Psg08%8mF_s1_TE_8E-*Xj{HgTo#; z;Un1S;=Up34(%pjw-8qb;%2r?!@1g>Ne_v&0ajEd{_0IH_*>N0do*&^ncgq@WfQq}SF-?EQvD zW+X4aHDQfK=8n-~d-q_MnNyjBS~hT%(!A^XHf__HA>3NuFMs7;DhnXEHn7K%mt{CJ zhbYUg2+_H$Ix?F?-&sln7Ui=iU`?cl915D?t0x9pI-8BA`a4BGBsOBT^>uBATExa7 z>ISsn0Cplh1gt-B39g79qN}LJ6=Xwmin^2e^h45|c#UTZHi?@<@DoF~D_YI3;ukL{ zsyAT7bnKQ0xtK@460M+LF*yE}b=^z#)Sc*qj_WjieN9#aXWE?O{zW6G!?q0sPZ*MeXFU<6Yc$a&j>1$Mw~46 zlL+dMjLNnjEJD&c3-Zu8H0Wb(!q-qJ7~VM6BBA6-)nFCbE=3V;xZu1qWZEy+ITuQ7 z+Wu`GN3?)jWBnrzgP#sN(Y)X}BzqJ`iFCl^g%d4>rhNPFHw=Y~;{#re6@P3uthpcX z&#Tsri_+L~;NZ&GJDWm2oN(Rls|!6rJ$9xa0MN(_jy|cLBL%r&5p2h;!!Qga<1auK zAXt^h6aAAJsbSNwYSGh-jGSSxP#9Zl&+JY!%EQBv47Nudsl7P6-mhH*-aH<0c6 zZT&s!f%PTYOb?WLOAnkmKEO?p$J_^OLIlyB=t*=)3LacbTUXC^MfW7Tdg$)31=SCd z<60siUjer$I-Y>}(qd>GHXNP*gx_vU5`lhSk!nE6l${AeYzG zF;ZU|7E_nBXl@lg&5`>Vf^FJ^fEeVeYq#dxc&KFR!o@7ldslW_Fx2NUG2UcppC+_hvt7KUuE=x~5o6`x$k&pA~&qs&t7M zj$EC)VR=!A>_`mZ3M^i9%Z$l13&M&6R>fpGmr2A}4i+Oz#X#L1jjh}1DUwq#snJ&@ zY`vV`aterEMl1uWwbQ>to}Od~!-hy0=qQ>gGH);FDPgVtD~Z(QxtJ0EJ?GGhtUKBZ z7`P4R3z)rDk65TZ%UE~hw=*L3l384n*XTEK~&a6&I)%SPGnd$qO%5 zK|v&a_reYt9?y{&CE5ZuKW9Q!{J@s{j6jf!Ns6wJFP-wlrP<%I@LIC#K~ZY=G%A?IDIQH*#wn&aSVPhomzlyj>APsQ#m1BRv}?X-`lhO95i zGy76S3ATefUTa)=DmMp zx>{RJOGisjTT5rtcGHS&8@65T*vXkDI4sE~Jodt;>Se7*MIC`!yJHIp1SRC@+M%axi*K;lJd{GQQh1WOwt#MOec} zOR)4}ha(R@Guq^(mf+J26pE=?5+!AHg8xLk20FDZoJG*2*%D z>@!DVyK=gAO|WSZ;l^s3!s`rpzcct+K*&-X7>RN$ms`0#`n>SDl+Pg%%T|PqN0cF1 zIgIi*@;-`XaxrxAaxrqSl#7y9EeZ}*^hhh2jW(LhMjJ#Nfu~eq&76ifhmoB+b&Cj7 zfMbDR)yQ^3^eJK%{>zg-C%VS0Uk!E#D~}bR*QAPHK77y5ZX_%wryG`5;f9s6Nrs&F z>x;6O74A6cuQ16sHu#s*IYJ@pMZ727JA#||kP-gjK$>xx0ih!VkoM~9Dw<4=?SWO4 z<6PW6$K7Q#jL@Z)?&eiD^rA%-$F|5JyD(HK+ox!b|9U8xu$x8a;GSe^rWePug;`D5B=fdR_yrc<8EMwQnK&j3U$YFUc%J(I*s77_{0=n#K1Xjz0TrkgLk*3r7fbjpD1s z8H1?S_QEo_6=FW}FZDLNL#zHs9&hOOycX4BNvgf;D$ zzClJf0?RK5-xgV`FqYmQ#01AM8^%WJjQ`%Y#OQM09pW2zc-cxckgNkv1LYX^i^it> z3^R(B7{2J&5dwC@FTWx^Ic}QaPvR!>WMn~a#to44$XRE~H`uU8mA8!4KA7oDFe#Yh zsY!kJz?)BmOYrI9l14`Y`LGfT^LQ}f`lYJ?FH`UP^g%98<@dnt1%PhY#XCA!BD9Nw^Yt}3?awW8`9x;; zn7(m6X!5_m;$MjLNk{NQUVSiQ>8aF2#+MhFLUqwcv-;lCZZs%_tJ2i_`2KYq^y&L9 zu=T1hbi1VNEfi_NK!DFZ+mHbGr}mz1P}ZN@oXh?8L57~gQeg@j;Z#A5WO+waWUL+c z!erjW>$eRU+?8OTG9VU7B6Q1FY(*6@CyP5e?c@6)6C5}(W@=pis9edblGvuAAx6@m zUiD3j@YM*?r&lNRN-8$@kw-n1^KYvnOH&eJ#XT?>1}&gzMq>F2f#T$40$}h8LDm3t z?Ur{4gdaIi+xafBkO7^whehGs!l?SJ;VTHCrd!v+Yas;I`QpxTdF8!MT{CjALltA+I44(yuPyCg`3qD*Ki_%^o_H9k-@fZh@x4YpN`Pj^ zVzh1(!oGGJYEt&XIuuHHMFid^FSKZ7$-t_KjBQ;Qt!53kk8=K}_% z4VisSsyngK_MXH@)Q!5eKhB&2F5*=P3h~ zm4u1qi|1ln&S(6e9 z^#ik-h5|+yRMNTv`SSf3)PC;QlTrww`gnin^h0}6a9(}y6Du40{>k7hEGs4hKQG`9 zLVG25b-9Jl)K&Og6D+2627$ns;OjvJz?q?>LEgka$oem_O))6Ruf$}r?;tJI%#=zP z8teha)$zp)L{MfUJRH!g-{j!~_y~c(?LXD1va0*=MvXGmzu|>O61#RyruXsw-;gYH znMn;`fL*wcZNHSG_s-k!!jc~A^-inIDmO&7GH`xzN!xxFFoVrD$0(!Yon3rohyJz7 zp)gTZKgvKmaO#7Ul;Ifh1(e8DXIZDgtDoeQ(3_5a#0G4la_4t9}FELGfdBuL+oqsD+zTLpSgyOJ(@D(B+=n+^y!NJEdV}1-# zjUH~5(QTv0IkaCVYGlH9G=}#3Y6XRc@O8Pd;c4hPJd8~EuGW|kY2Dkbks-@L!h~LA z8Ns)AaUd``tUMjkU8p|vjf;!y--4AF=HSeV+B8$p!^2p7h*f}Iqd`Y8s$il%`AA+N z^J_(>(6{3gI0ej_Fp8R;hEJ{`pfuW*3Xo?62AbH6N*EQEbOmRKSF|Tm{5B_i?Lk9J zftmCNv)f>l{)a*AMnPnWwZjhqz`#T<*h7iI8T029=5iYD=gd017dgrpI$t8N$PgD8 zl^~D%DL;~jZz|aKu`Fq0mAsa*eHnb;Lo`2G=^toEd{VM5@Y+Jp6;fkY6H^>aG;)Xq z9$G5e2FkUJDll;D&W6#L>vyd#GUTTjqXgPUKbdAjvTE`;6O1@q!J{)d9qAh}7Nuua zB*0=|ZW%J%r{4^dxL?B-$PSn9_@_@Q@kqW3xo~n^zg+)veYK%#o^)<10Pr8RY2UG z$2Yen;DJp#ROVz5xfCKa{M|e=h8J80L+KAMB9U|n8j3i!!5CSWPFNs51AU0B^*v;a ztVOImV23LlB{|IK+7A;H_(?X`&J|-yuu#5}#&3n#G@?f~i9#lm)yp{kH&CrQ%sCps z8$Ti|(yz@4C`@L%@n&ykP;#L-N!haQ;-#iIP)`bO(2_aM+|7i;TP7FI24>@ ziB(PN6(PD+@}WyAf2<8goW%kJLZ{92_(HGW)n%v(vtZA}A*v#aiZv5sW=OwcZT)q9 zjJWbbuRnqyZmpl-(6S;%NjQqUaemuWxH$6wJBejN*1iP9gsb4R|WNLzwhL;BMwi{~5NQsd= z^=4QS8a#4NsFNgPLO1r@vA{XTV1ffWI=yP1?D-w$52_n))9css*=bj=AE;$C1D>az zIS0Hn`n(y=rU}Q|E|aT6)hQLi(t%e9uQWw7p!0Pr%uaI*nAJ$uPOs|*SMWs* z9Pw;Lx8wV>!Lb+G@vGv^@Ss$r#SobcD(%Kbej{FF8Xu=iBHyzdlx;)ad5I20EU6eM zEHU|;Kpc@T^YB5>JLGr+4yT?kM9v)~saX8(!HxuegLeX32uM31cEH41}QU&nnTFlVN84{eq-2NJD(o5qpxYy+Jjd2 zp@jzdHHVDf7Aa|fPf42CFMFB>H6uuoW*qV3-&(27agciczOl12ff`eI8U?NVOUksh zDD@UMh?@9jfnP3Kg6$QIZ&fR3$w+T(mwah3&1fMyVsp`MDZ}2`#sunMj|hr%6mWkf z1toyLyHF||ow+9366+V6olfD-2--xz4}4)emRGxhVXsr*4O^abOluM-mD|=R+Egl) zI&Irj=hG&0e*I3=$AxIXcJz%+9;o8DlrGLM^Kc6Tumy8XshS4ltZ>d6@cYq9E9>mW zf6BN0!bQ&b7%-F(jw_^S3@tR`M{S?&MTaDplfDkq!KPD4b;(3Eqe?X0gl@;A$w8FM z$kXX)xOgkfxm>!=`eiS{4;8M%&m^wHj})GTzf7HhA1!IXPYzN^HrQ#T@Q7DoRiopO(+1%I$C}3Y8t`9-5Jr-$x+X8y;vddg zK{lJ$;aYiMw^W6yh=~nVGBwF-kxz+dZ*~xr)k1j;19gVQAQ#)_D zBeH#Pc6DU7cU8z4ky5LiNjq3|eK8h>JmVw}VJvoKUj!OSg;K+wEZgnc&c$){P|~d6 za7H*;)S2YG8Kq%R)1r`$Ko9bCZFiyOh_q0gPCFMAEb`y>qjQ)~y{X}B?k~`ariQKK zOk8G%bae@Z=Jw|RHB+OeQZ;?Z2jgK>xV1=G;cTh4%{Qym!%Y~u&J+cm&X<}% zonz8MD??i#x~Govu^SlNMMR2gm35#$s+kjNMIW1*9}Qf}O8s0k^yX7kscr%JZmBWn z%%|6amNsZhTuY<}J7mm-YRIU2XM4ezmxlc$Vd+d;KX^#{$5m;$q1sc`O_aB+L8pzp zq{`yYj8RI_?j^DbYO;5=|<)wxp# zlRc_y#<~9s-M$u;;^Mv7*5-5`S8+_%#pAl7T+>=}+@wwH{q=oF9l$uYVkD~cCkxgY zrT%|tQ?P+6HQ(C^X{1IA>5`eQ?2@@3lZ_CiW;MK@(~YTLBcr1~N5>Rruow^XWt^#2 z|EbuDwt1=xL(OQlQvOU9@*Wa6d#i1xSQiNqlm>_^hnp*GN2;g07+p}RR@ErwD!2UJ zE;VM$ky_+LTJ~8{-|aId6jaM{Tf(ZU=&)rf%D7NzzDy-mKRt*E{8I&LGBgof2wWo9 zVAL5&(d8;!!l#Jw$Zg>il(Z%@oQiy31v|?V8z2PTpoK;ZU&0o5xfi|i_Xi0tF{X~& zfI=#fQ^_2bw!3cNyfwx&s)9Hhc)EQT;nY%BJk*y43 zUhLdjbwVYe$~(-_<-;C{lOEU3zc(s-s-S(Kd7akYI{(^9^r+hwF^T!pXyugd7}pWo0&VAzHoI$}G$;?bs@3HgL{IenDV6HZ zpw{e-^Y6F?mBU83VAXrzP`NX7?U=MY|DoQvj9Z6B6AS=<1%A`F5*MHMoM77KA3LflM?h%}WV!zInKkny&){8e$| zGE;A15`RM#(hJ7ow+y9M`aaf1sX8FPLXPBHEAXMW13h!kWBGLCzQeZdvbU7j1+dzz z;SQjjW{9CYsucEb7BqI7ST8tV zjj7_~ev#rC$`815!Tfvbz*wnv{CL7*E{V0~Re;z5UeW@2J6i0=a?nzlLq*5@sb~Vv z7$4J^jIC$+EV2lXoXR%WQy)SN?i)iH3Dv!6v+XE#wzYh>g04fzZ{carLs!nm*T{QXjehVEFAHJj?8bo-%9iPNM`gR9xAm(q1C;Ak;3Fk_ z6Q!B8ILC{UA zsK*%T(-;~{n_fooJC2x7+162pb?qFG<3*{wfK*1K6zg)@h*~$!aL7BeV{U3x-{(ig za;c2=pt1_xmHofpHaA{Ty}?nBVLL?2w;#|f&E1-rHI#DljXb5Jtx`s7tv1KTU=d=T zo7`f@7V74Ztw&-B%`QWOBw{bpy3?nC9(kISiTi~}Do)*v*;CtX5TJItTC?|E40(&r zD0Qs5=$Duiuy#0VyHPy>4cSwa!rXN^GP%x=bDoV&Ej^@S@~o#>y*d4F61`~;cM*Ll zW3TJs5t-Qs{wFz{1S2>+U5FRUgxdv}OJY{svtp)#i&u=xDftUZIbI+%Vm6}-FUN72 zy?O2d=kry?NIhWnrFf*uVR2@uK`9QW%CIcxvCkR2m#<_>xGl4t9${KW=cXj;c14{mE^Eg9tYIiNLDuLfvrPZoy}g1~XCIln*|~`; zW?@xYxJTn4^*YJLdHRgItXwTVm&7FCMXJsArDY!WZ$9+rQcFdIH8Fc5#d>a{H44^+ zVd}vc1)egeHb7MY&6|>Z^d(U+!1G80W2Ja~087P6jE(Mv`ic&X9(dDHHnVrkJ+p-i zB>~d$6JbGjG>QLLb=h<=O~pY){m4RNoVysJx+`Rjdj5rs;Y_~ul`z9@VL}0#n-#g@ zd<4xg`;Py=$SLM=9)YNN__g`+Vui5>qFvOl?V#|^-}^o~SIjy2{o_i0p1kIIFX9Ts zWi4OASezar&>NzxFt-?gc=w1CJ&jT9`Goaq^u&k5AxrjKp`$B^q@t}{t& zSvhdqE+<%-#Sk9@Vdk`Gi3DIgM3l)H4yqL4S{#A0I# z+mUwH7b~+{q$w-TZ&;r956uO|7i4a*j=|-E#hB(S9c>kM%KB=Ma39B}feZ}|*egR; zvKc<+PL7Ho8XP(jeYEWRgJ5D&`c7*_pZF~T@Sm$gm1Gi9Ow&XO85Nvxty~Wnbku@@ z`^#3jPI*$5K#CyidYBAcyhaIc1plytlCqnNQK>RrToYE0~& zi9$j#rMT)LAJ50e@gH}K>eKL^t&vF4+;vsFb85ynn~k8kLtq=BSm$DG*-dyZJ)x_~ zrKET1B9twTp2wI)y1ePhnM=7Kqed!M-RlD683KFY0%LSXTNZv@a&!fsd!r|6D5bXC zma%4oCe@x8<(PxIXe(V2V`~;!E?|D!=AK_h5J^Ah(Mm$TK{IRSZYO~@AS+F(?84Z2 zzT`0E!TF$y$iHpHQ&zMgW{v8chT4{aEbW||3d(S?sIOjIpz2|ZbP?#>@It%B=(##h z!n!fTq@O!{dq$<@G*YXP>0O{por`rSOPc7OP!fjm9Ol~V5uvAP;|S=@!%Bpw2UtcZ zsdAgLe@&xJ9qF%094TkMc(av~udhQ)VhrIr(DmPf(H{9E#_9nZ$&QS0E6@KHVr1N% zk()f})6){pf^v%?1-e^PVnm4LOsSS`K#ra-YRp9=?564H^mc<<#wV#KEH$~Z4erY( zl_kay*`fnS$&1btwIC%|jg=Z*oEeE%eq>&$J+dacpjWx0Xf-H%qz)maG^f;?`Td!t zNto^~=<#!*(Q%emo`4=CrX8mh_&o$jPcwACq^>_YU;dJn(JM5m^KH-PTQL`*lb|{< zj1+>WiKF+=xOh|oRBPtU>`JaZ%3|(ZaPuL0LHI`=aZM7dwkn+G38}3cfH7L1%+YB& zx@<=SVA1}f(yO`zJssbPS?L312{?cWIN11tDdwu3b2R%%^tF*B2&b{2an(36g9Tgy z+&7U$M?1jh?ggKVLK{>zY9_3K2oFgqwz`p}XerCMuh4@n2Fux(4ct?WMOl$V+Z0nS zBnfez)`l81R4S$kEF2ojQDE%VYP+{E=Wr1W%0$@Z*Nw6i9WJP+0B>q1*9SNRKEOVC+~z7nCMI~&LKJdoEtE-ALINA9}N zmU9nOMFtzgc37M3P|7%3e`Muh3Eis}-powq^CxJPE%EMVKWL;>b=p>I!d7!6CUEnw zMy)*A2{sMP!%w*3*uv!CIuutOZ99;lfF{;1DsL;J^;8}h5w^~lSryG^x~SaMP=ip$ zIbQzjKnswz#jAnU7zu8-!VQAsed*3{WlALxsY*OW)w=4_b7)TK6h#_Lz%1&emn#)o2L1@Kirme9SF>d4Zw_hR>YyO4>2gucTJ-=oO`m-ZLQq^YhU*Go!T&b={0w|PAv$xC7s`!ZX22~3cYTno* zx(TNCq>Z7ACMz>hycg|Dudt-idU%P<@`EMjZh_|>QP0L|R=Wk7yM<v}@<+JwT>v)LGUug65F={c}^_hc!znKS9=(y-g9eaRTxvTlu5Xpb#meHRGmA z9dq$shv)8BZ8H67+kZI9Blj8ItYX}YqbHhX9+x1JkOqxf>x-4q`o+f?#<*oBx6eJY zCRv3#7x{;hx&2W?a@5lDJm%_XEpra6RiI{6y&Ir{$Z{^T6wOhonUu9&z!)%>_EZhXMfCJo(x5eikQ*omgZW-xd z!IYgy+Sv1v%pj(;ZSLM^9-=~_<|cI2q%S!Dv*V$%MgMjABC%E`akp`{&fRMQ{Nx76 zI{I|!^4lvI@o60Kkq*SvgsA%o>gHiEdN3nA#^G|I$yCQuRh&{r$6t-GI+$}(xStfN z>&lT8JI|ia(JHU2W#A$t5y!|qmW%Su%HRCvxk+Zns%FMYa$A-;ou^W>5@!u+?zb3< zwk&bwB5pcfD`E(Qb3vDk8-ATbu3Q`YqzdC*IBtXFz4zJs=N2(GskVx{>u`D*!s3$+ zOLIBfT`ju^uTZWF$fD0m!J}5RmnE%NsruEPk6SE6u$s$?K~@SEDc}M!=gducuTUO} zq+RUA+OrD+Wwy-Sa>A#`ih8~XX-?%tP6LTKrloA<@~&?7UNk35>sn!7!k3GPV)8o&>JjK)T;xZly$rn048 zA*8aBBco@hGfAG!>tbdPI@A-0Fg!-Wqt`cd<5$=LHA*q(Io#yv(LMxi9>PH%gU*?< zPbWP}69y>@MPua!j9N=ZMax_NL@gPwtZ0afx3o?92@tc;3&F)0oGH?SVHvYP7qFR^ z07N+zPJK7p;^_z{gbGOnYE8J%Ep_<;7OG8*boP65%L?_E#{E?1y|TzUvJ zuX6&)=Fl*cRg^4i4E4G|3vkwWgo41SqiCpu#i*0EZ{yr~|Ss!PX;YPdioRuHjTxwR<1H_lB=7q^=}5^+Qa3RL-M0oECd! zNo_aTW`_@Nbm{Kg=MD70RP(B)QF9kgKuQu<#R(#dd^@HgFyBEIV|(iVaPfuS3zv#BpA_8MXPO@?WeTh0U51t_4oe z{MjI8tUh`?nSU^C%5y{35EY47sIIXm_Sz$joEqo+ON;!JN^~TA4g=xNwXbZP;a=F9 z*Gcq}zsN)Fpc*lH=#J5Ber0{<^GP^a@a3uKD5b=DE;H*46{j{whavJ4<=gxvAmpy} z+pqod2L$wHki96ud8B)nm2FYf{Lh0rxt6Pvz@-#zTjx8J2>pC3k2Q$Xqo1f}t9t;p zkYCdvn(<0_kN`z=DD|L<&R4-~$j4Ar5m8xkB%!NTeEg6Y1jAnmJyh9x6iP=}dnMPD z#v;^R62?@*_?9a2;nC8H2U#hbZN)zLZ#dokprFZmbE6;ucN;gNv+>F1F zS_JqRNC|bEy7ja^3_IzF?MqIg8Q}dDi*NGamyvL4tK7A#u}f~&>N3fY*2>Kl(SU|vI>j3dW0)MQ>5ihb}hb7~|UFe&3`RuL6HgjNZ}QIgK4eJ!CabRF5hJ)(vb2 z|G6A+w`)Nc-uG!mM63mOarja}8(=3kj@uFBX$9r@m2`UgiwK$D2k*KGf0IZhQBHCf z_ag6d$;b7^Md8Z{rp&&IU>2);#X2ZcmP9YDIGHnxn(@35cSYKOZAF`%%wN=pJ`!3M zbSSn5djsudBWkiwex^n9dP&&=e_wJ|an9PHR#AUhRL9Zy8*(i?1d7V2-Kwhbr_$mD zdhBOBeD`qnC2B3|M7yUfwjn3W(U7sI6TU#J+icotj26} z>&=KQ<4SsD6V;p~i88$x_bSL=bv^mXuISAy*3Z8Y%R%w(5}BcF>4h%m)`)tIAMQ}y zPSa%>7rGL5<5NhHWs{9U^QIA{O!u|xFtNG4@B?L}mMr2;q+FSyc<98@sp3Y7=G@+% zvAJ}1IbKE|>3Zp=tdKU1aH=~@I+G|Hl~i|GVMk&Kj3EhpQj7rNa5khL_Kr&=_JC7w}gpVDc7)R>xda+!#~291ulLGr6a@ z(}Q=0xXh0n!=mNU?{VdRQJ*19zK)<1L5a(GIrb}w@}Hhvlj(Zb_fP)RX}@}Aw<&%2 zwO3wVclHl%#d}yzNrU55+;A6?OJYba@m8B9xRhLR!rQqhlpDX*k_3;wpm(7+aeiheedmPXPbFiryF!V;mW z;@~@_)l@0lOOdxFKKT}bW3ScT~WG(c?}$C?K1Un_^Kwo z4Ev)1$K|6#Wy9f7WH{K0c5q@e4tc08D>HGoc1hW>WwmZeSMnw((eq3U(R97ls0&zXNl_* zh6Q3Ou9H%LuCv4iF-w+!(Cb+Kx{?M%=_y$)e@acfbP4`fib7acB^3uSZ41fWg%se~ zSrOpb**GS?1xpU?E#bT@sc4b>n@U0G>_Pm0QG=_A^4Xg}-Rvz8?b(9_H@PJX`F9r6 zw2%@$I~#i$|C0s|3gRHr6|*<9GyIWgY_u|N|$7hs}U0*xL#W&zd|AHe}AS}gLb_+J);RcD7LFO87z02Zd3Ec$OcSeosN=+10qk@DbTeV%Rl**~< zYPXVAEP+ZYtU^=&;i#y%k|noERU)emt+sJL-`}~HeSj1HQMHORyK~Q+Ip@qdzw>*a z-<-KOU^KgHN-C1+Oo7CyN}NZnp6KSIDZ*9^K*JKsLOkX!JSN|(4tq<1vao)XAon24 zq;i$|>r#V0YtSd!bV-zJ(I}ERx7SJzRc&$6+~PL&?p$2iUhT#nvL;c;)n-!l2XhgP^;IPZ;zVq-&X4wRv9ftu^@88qc1$${`gGS@BQ>QB=p(^x>jj zRnC_S`R9bRc${e@ z%LTZD##39}#nujx33q_>Lb)D_1GowV+g6E3vNgZbD}DqDivO(SUzGen$q$uWLM;_9 zEBQMm-&6AUN~V{P%qaOwB@A3ppMy3)G8iBs6({wr64}w_1%oCTBnM^dGTAk!J5X6< z8B!mKDd;+eura+3uc)bqdFWHHbHz%U$0!2T)#i6)f`*}5$R{YfHxY|E8S^&Z4GpE} zCxj3tT#3K25?^FsB@UKWC@XPmcaX}lo zrJY4hTCbUkfx(yW9I3$TADVVoi^S^XG8YnTp$^} zz+t7y1ymVsMsiM<)#Q?HwPx1wxj_6Fxa!sk6=;n)*=QGONtHUn^Po=3?wmPd$vNy* za!Jr?IEu~ND~*46$oz^_AD-F@2##Jgw!r#(Cyer!4^f5ro3*q z+|Y$05mR2EMBN7Mr{!gh_msCxi^|12Q(?Nr+whm`!H>dF+6 zsBv5h2Fj*^*`6Np2%4h1D=tRO%gRN~_r#ef&&%9N<%Z5y-3C<|HP2dl)rfhN#!+$| zm4i2xTz8~h?M^ZqQF7Esde+jbMp##JR75|k(MB=W+UjDDI;O7CLMI#lw4DHol2J3@Yiq~U{y3O9gzvK-tO8Q0+qC1UgDvF@)=-QCg&R;_M~g8QiBLbsv?sFTmK z8_UW4f>m8p;LI0%gRt*$ZA=TKd-CgfwH<-yuPktSu=6@GY0Q$CBLr;D6ky<`q^?t9 zXNm&XCK|4^8_DjA1FgzvqN)~RSvrV3ay`-^Yp0WOs-QJTgc9SP>y#u)(k5mYn>M7R zsRZwPY4I`aT)dFLH~((UO$`=@ziw)cS#(Y@9X~N6-V_ectg<^Dv2kwWN2Dv8pxe%UXkj`=bJBkD;zOj zgq~$BFuC5geZwj_E;;^x_m23k*LU9k)*pYo{cnH&wez2J7vibEiF-eM;rn-d``I`9 z*XP#zhko443U)XhKV&k`eJn@g;|MBn#?`-*A--_S<>ZNyo?S(I${DZq! z|KK;Gi+}hZC-42E)33i%_6m}Tk`Fd^D`nZhq-sU7-MS{8qS6-%elG0t(ZK%zy`ydx zG?e6vKE5xRz&iLcDS?rYX6Xr#dP1^#qT&}w^UB_y^SXB)YQztX{8rrhDRF{cj72nr zQFfMKuH*r+!!F;?N4v~4!y>y>w0F7RK_5}g0wJOGAJwBRkOGI>V4Xq8Os#PaL`y|H2}C|vm&~J@?U4^CM#Ljk@Jd=Og7k`Er?l^b(vK20`FSSyrD7y8Ln={AtC+8i9_VElF=37L>a+ z#&gO&XFb+B{31ZnvL@M0&alQ|h&=HOfZtO$RP1x}u~QK3lRyqvleYk#Ro8G)Q!Wdc zm=t=$_gh^Lmyn~t&;bc5Hm$e0#UKW#W>faZEpi}*v=N{+zk^V+I7?ols|rj1=x7l5 z1?F}AsvUE~o=_&v{mi7HYpa%5HEri$*hLsB6Mu%Uhmo%}OXpI@51@8ZcpOeay;@gq$(od=%*>ZSva^&D>BWKh)7PxvR zd&6*TEmQ}|zlI_9Bl%G^`S)t_pVj2Q;Ri192y#XMlvmY;NN;zi&vA-UI9zyoBQT9r ziqbA%p;)>_z{w?RzQK`~MY5a-kplX0*Uw6wqVx;y)Zc*%5v8kYl6*3Ei#+KANDTBr z3gGWJ2mLhm8WzD}T&z{oby2#ZUPDsFNyDsCI1H{cLYx8sB@x}+pXQkw98dv=XAI9u zQMDierus-o53A`W-IhKg)WBLFX*NkvN29mW^vADaREb% zA4AMcM&P2AoipQ`T&$T%!0KGJ%mp&m%F?t4e*7K+W*-HbH2IV@_<5~ABVZxc;2gg} zsU`+bL@CjI9frlTO4Fl8P6%)j{D?kBc__2Na@Q=qj?4@&$p+y8M<~eKW5VRT?y@ehaUEOLGif9h{6PvJuB4TxO&-L8N_?Um+2nI zt8TfO+A@GBtX1u+nFsJ4OW!iVOmW!W7BecKbks6?$QaemyGYNl&FdY!!Sn9G8ImYR zDf&TDaa{y(^9kJ2qQ~H|wN#3G4L@F%)T0FyT`(j0KA}ZD(BTRxcPr$kyp(>mPk0`} zT~`e3E3Buu_`sO|L+7Qj0KqRwztt_3@FH>`-Jz2l|1kwQbevX)V+PD-OHW&R%0YPw zmmeaW(lYuKx(MXH&oT{d^}gY2%)vrvf?fzsfTiXY`~jV!Ey5M&<`ul|Wdj4d-O<*L zhYs+qU8S5ke>u-@74yBrIq!=b#}7_TjO>4UGVa~@h4|jV!Bzbv_r;Gk#*d6oJaZ`C zJTf*i+1NJ_C&womje&im?BwO|la*dPWVtNKFpyy&!$5|C3m#CEKW zTZ0waGr?PJ?#oyXSwOlSc6L3yS-i-G)f_O*y)AZgPp7So3(qUPpHMzHAUqv$uU;w8 z8+`6PCLWF2>zs4n;I2@3`(@B07VIX5!G5~xjeE7L?*Nz z&UxcJ&Ny=qFjVh;8)5*Q40!jE{xT(^y1P#lae;m9DIJ|R%Y|?au<=jtWP0AK-g?H{ z%s6`0Xw)!#5d3In`U?=B$Sy`QRQHncDq-!#QNMd#r^!ZM76e+dR|W<-3?i z=4dgjt>^km0fY8#kZze&IX& z%P^2(Aj3e0feZr~1~Lp}7|1Y?Vc;`h;A$Sv-SY(fKZqD>@&Et; diff --git a/Examples/npetshop/NPetshop.Persistence/dao.xml b/Examples/npetshop/NPetshop.Persistence/dao.xml deleted file mode 100644 index 4fbd034..0000000 --- a/Examples/npetshop/NPetshop.Persistence/dao.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Presentation/AssemblyInfo.cs b/Examples/npetshop/NPetshop.Presentation/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop/NPetshop.Presentation/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop/NPetshop.Presentation/Controls/ExtendedRepeater.cs b/Examples/npetshop/NPetshop.Presentation/Controls/ExtendedRepeater.cs deleted file mode 100644 index 6c7edfe..0000000 --- a/Examples/npetshop/NPetshop.Presentation/Controls/ExtendedRepeater.cs +++ /dev/null @@ -1,41 +0,0 @@ - -using System; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; - -namespace NPetshop.Presentation.Controls -{ - ///

- /// Summary description for ExtendedRepeater. - /// - public class ExtendedRepeater : Repeater - { - - private ITemplate _noDataTemplate = null; - - public ITemplate NoDataTemplate - { - get - { - return _noDataTemplate; - } - set - { - _noDataTemplate = value; - } - } - - - protected override void OnPreRender(System.EventArgs e) - { - base.OnDataBinding (e); - - if(this.Items.Count == 0) - { - NoDataTemplate.InstantiateIn(this); - } - - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/Core/AbstractWebAction.cs b/Examples/npetshop/NPetshop.Presentation/Core/AbstractWebAction.cs deleted file mode 100644 index 11ec88c..0000000 --- a/Examples/npetshop/NPetshop.Presentation/Core/AbstractWebAction.cs +++ /dev/null @@ -1,64 +0,0 @@ - -using System; -using System.Collections; -using System.Web; - -namespace NPetshop.Presentation.Core -{ - - /// - /// AbstractWebCommand is the base class for every WebAction - /// in the web site. CodeBehind of all UserControls that appear dynamically - /// inside the web site (Body, Category, Product, Item, ShoppingCart, - /// Account and EditAccount) share the same need : they must launch a - /// command on the Service layer, and decide which is the next user control to - /// display in the central portal. - /// - public abstract class AbstractWebAction: IWebAction - { - protected HttpContext context; - protected WebLocalSingleton singleton; - protected string nextViewToDisplay; - protected Hashtable data = new Hashtable(); -// // Creates a synchronized wrapper around the Hashtable. -// protected Hashtable data = null; - - - /// - /// Each command will execute its action in the constructor. - /// After execution, the command must reference itself in the - /// Web request context (so that the web site, and the user controls - /// can know which command just executed, and what data it holds). - /// - /// - public AbstractWebAction(HttpContext ctx) - { - context = ctx; - singleton = WebLocalSingleton.GetInstance(context); - singleton.CurrentAction = this; -// data = Hashtable.Synchronized( _data ); - } - - /// - /// The NextViewToDisplay is the next user control to load in - /// the central part of the web site. It will replace the one - /// that is currently displayed. - /// - public string NextViewToDisplay - { - get { return nextViewToDisplay; } - } - - /// - /// Some commands, such as search commands, will gather information - /// that will be displayed by user controls. A command simply - /// references the data (which may be a collection or a simple object) : - /// it will be the responsibility of the next user control (the NextViewToDisplay) - /// to bind those data to the right controls (in the DataBind() method). - /// - public Hashtable Data - { - get { return data; } - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/Core/IWebAction.cs b/Examples/npetshop/NPetshop.Presentation/Core/IWebAction.cs deleted file mode 100644 index 04cd3f3..0000000 --- a/Examples/npetshop/NPetshop.Presentation/Core/IWebAction.cs +++ /dev/null @@ -1,11 +0,0 @@ - -using System.Collections; - -namespace NPetshop.Presentation.Core -{ - public interface IWebAction - { - Hashtable Data {get;} - string NextViewToDisplay{get;} - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/Core/WebConstants.cs b/Examples/npetshop/NPetshop.Presentation/Core/WebConstants.cs deleted file mode 100644 index 0023d3f..0000000 --- a/Examples/npetshop/NPetshop.Presentation/Core/WebConstants.cs +++ /dev/null @@ -1,22 +0,0 @@ - - -namespace NPetshop.Presentation.Core -{ - /// - /// Many components or classes may access session or request - /// variables. To avoid typing mistakes, we preferred to - /// centralize those const strings, and to rely on the compiler - /// to check coherence. - /// - public class WebConstants - { - public const string SINGLETON_KEY = "singleton"; - - public const string ACTION_SESSION_KEY = "action"; - public const string ACCOUNT_SESSION_KEY = "user"; - public const string CART_SESSION_KEY = "shoppingCart"; - public const string LIST_SESSION_KEY = "paginatedList"; - public const string ORDER_SESSION_KEY = "order"; - - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/Core/WebLocalSingleton.cs b/Examples/npetshop/NPetshop.Presentation/Core/WebLocalSingleton.cs deleted file mode 100644 index 3d72a59..0000000 --- a/Examples/npetshop/NPetshop.Presentation/Core/WebLocalSingleton.cs +++ /dev/null @@ -1,115 +0,0 @@ - -using System; -using System.Web; - -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Accounts; -using NPetshop.Domain.Shopping; -using NPetshop.Domain.Billing; - -namespace NPetshop.Presentation.Core -{ - /// - /// Many components may be traversed - /// by each Web request, in our architecture : - /// aspx, ascx, codebehind, commands, controllers - /// business objects... - /// We have decided, to centralize all information - /// that is global for one Web request : this may - /// contain the current web command, the current user, - /// the current account of the user... - /// Since everything is centralized and strongly typed, - /// no mistake can be done while accessing a session variable - /// or a request variable using its string name. - /// - public class WebLocalSingleton - { - private HttpContext _context; - static readonly private object _synRoot = new Object(); - - /// - /// - /// - /// - /// Call it with HttpContext.Current.ApplicationInstance.Context. - /// - public static WebLocalSingleton GetInstance(HttpContext ctx) - { - WebLocalSingleton singleton = ctx.Items[WebConstants.SINGLETON_KEY] as WebLocalSingleton; - if (singleton==null) - { - lock(_synRoot) - { - if (singleton == null) - { - singleton = new WebLocalSingleton(ctx); - ctx.Items[WebConstants.SINGLETON_KEY] = singleton; - } - } - } - - return singleton; - } - - private WebLocalSingleton(HttpContext ctx) - { - _context = ctx; - } - - /// - /// Get current action. - /// - public IWebAction CurrentAction - { - get{ return (IWebAction) _context.Items[WebConstants.ACTION_SESSION_KEY]; } - set{ _context.Items[WebConstants.ACTION_SESSION_KEY] = value;} - } - - public Account CurrentUser - { - get - { - return (Account)_context.Session[WebConstants.ACCOUNT_SESSION_KEY]; - } - set - { - _context.Session[WebConstants.ACCOUNT_SESSION_KEY] = value; } - } - - public ShoppingCart CurrentShoppingCart - { - get - { - return (ShoppingCart) _context.Session[WebConstants.CART_SESSION_KEY]; - } - set - { - _context.Session[WebConstants.CART_SESSION_KEY] = value; - } - } - - public Order CurrentOrder - { - get - { - return (Order) _context.Session[WebConstants.ORDER_SESSION_KEY]; - } - set - { - _context.Session[WebConstants.ORDER_SESSION_KEY] = value; - } - } - - public IPaginatedList CurrentList - { - get - { - return (IPaginatedList) _context.Session[WebConstants.LIST_SESSION_KEY]; - } - set - { - _context.Session[WebConstants.LIST_SESSION_KEY] = value; - } - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/Exceptions/LoginAlreadyExistsException.cs b/Examples/npetshop/NPetshop.Presentation/Exceptions/LoginAlreadyExistsException.cs deleted file mode 100644 index 7d0337f..0000000 --- a/Examples/npetshop/NPetshop.Presentation/Exceptions/LoginAlreadyExistsException.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace NPetshop.Presentation.Exceptions -{ - /// - /// Description rsume de LoginAlreadyExistsException. - /// - public class LoginAlreadyExistsException : System.ApplicationException - { - - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/IController.cs b/Examples/npetshop/NPetshop.Presentation/IController.cs deleted file mode 100644 index 3caea73..0000000 --- a/Examples/npetshop/NPetshop.Presentation/IController.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for IController. - /// - public interface IController - { - string CurrentView - { - get; - set; - } - - string NextView - { - get; - set; - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj b/Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj deleted file mode 100644 index 6d2554f..0000000 --- a/Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj.user b/Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj.user deleted file mode 100644 index 275c52e..0000000 --- a/Examples/npetshop/NPetshop.Presentation/NPetshop.Presentation.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Presentation/ReadMe.txt b/Examples/npetshop/NPetshop.Presentation/ReadMe.txt deleted file mode 100644 index 7a68565..0000000 --- a/Examples/npetshop/NPetshop.Presentation/ReadMe.txt +++ /dev/null @@ -1,4 +0,0 @@ - -* index.aspx == template.aspx ds DotNetPetShop -* comparer les mthode du domaine de DotNetPetShop avec mes mthodes, je penses que le code y est meilleur -* voir ds Harmonie, la distinction entre les diffrents type de service, essayer de faire pareil \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Presentation/UserActions/AccountAction.cs b/Examples/npetshop/NPetshop.Presentation/UserActions/AccountAction.cs deleted file mode 100644 index f7f2384..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserActions/AccountAction.cs +++ /dev/null @@ -1,105 +0,0 @@ - -using System; -using System.Web; - -using NPetshop.Service; - -using NPetshop.Domain.Accounts; -using NPetshop.Presentation.Core; -using NPetshop.Presentation.Exceptions; - -namespace NPetshop.Presentation.UserActions -{ - /// - /// Summary description for AccountAction. - /// - public class AccountAction : AbstractWebAction - { - private Account _account =null; - - private static readonly AccountService _accountService = AccountService.GetInstance(); - private static readonly CatalogService _catalogService = CatalogService.GetInstance(); - - public AccountAction(HttpContext context) : base(context) - { - _account = new Account(); - } - - private void CreateUserEnvironment() - { - singleton.CurrentUser = _account; - singleton.CurrentShoppingCart = ShoppinAction.CreateNewShoppingCart(); - singleton.CurrentOrder = null; - this.nextViewToDisplay = WebViews.STARTUP; - } - - public Account Account - { - get - { - return _account; - } - set - { - _account = value; - } - } - - public void EditAccount() - { - if (singleton.CurrentUser != null) - { - this.nextViewToDisplay = WebViews.EDIT_ACCOUNT; - } - else - { - this.nextViewToDisplay = WebViews.REGISTER_USER; - } - } - -// public void ExistingUserSignIn() -// { -// this.nextViewToDisplay = WebViews.EXISTING_USER_SIGNIN; -// } - - public void SignIn() - { - this.nextViewToDisplay = WebViews.SIGNIN; - } - - public void RegisterUser() - { - this.nextViewToDisplay = WebViews.REGISTER_USER; - } - - public void SignOut() - { - this.singleton.CurrentUser = null; - this.singleton.CurrentShoppingCart = null; - this.nextViewToDisplay = WebViews.SIGNOUT; - } - - public void TryToAuthenticate() - { - _account = _accountService.GetAccount(this.Account.Login, this.Account.Password); - - if (this.Account!=null) - { - //myList = catalogService.getProductListByCategory(account.getFavouriteCategoryId()); - CreateUserEnvironment(); - } - } - - public void CreateNewAccount() - { - _accountService.InsertAccount(this.Account); - CreateUserEnvironment(); - } - - public void UpdateAccount() - { - _accountService.UpdateAccount(this.Account); - this.nextViewToDisplay = WebViews.STARTUP; - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/UserActions/BillinAction.cs b/Examples/npetshop/NPetshop.Presentation/UserActions/BillinAction.cs deleted file mode 100644 index a1f649c..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserActions/BillinAction.cs +++ /dev/null @@ -1,55 +0,0 @@ - -using System; -using System.Web; - -using NPetshop.Domain.Accounts; -using NPetshop.Domain.Billing; -using NPetshop.Presentation.Core; - -using NPetshop.Service; - - -namespace NPetshop.Presentation.UserActions -{ - /// - /// Summary description for BillinAction. - /// - public class BillinAction : AbstractWebAction - { - - private static readonly BillingService _billingService = BillingService.GetInstance(); - - public BillinAction(HttpContext context) : base(context) - { - } - - - public void NewOrder(Order order, bool shipToBillinAddress) - { - if (shipToBillinAddress) - { - order.ShippingAddress = order.BillingAddress; - singleton.CurrentOrder = order; - this.nextViewToDisplay = WebViews.CONFIRMATION; - } - else - { - this.nextViewToDisplay = WebViews.SHIPPING; - } - } - - public void SubmitShippingAddress(Address address) - { - singleton.CurrentOrder.ShippingAddress = address; - this.nextViewToDisplay = WebViews.CONFIRMATION; - } - - public void ConfirmOrder(Order order) - { - // save the order - _billingService.InsertOrder(order); - singleton.CurrentShoppingCart = ShoppinAction.CreateNewShoppingCart(); - this.nextViewToDisplay = WebViews.BILLING; - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/UserActions/CatalogAction.cs b/Examples/npetshop/NPetshop.Presentation/UserActions/CatalogAction.cs deleted file mode 100644 index e4c1046..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserActions/CatalogAction.cs +++ /dev/null @@ -1,75 +0,0 @@ - -using System; -using System.Collections; -using System.Web; - -using IBatisNet.Common.Pagination; -using NPetshop.Service; - -using NPetshop.Domain.Catalog; -using NPetshop.Presentation.Core; - -namespace NPetshop.Presentation.UserActions -{ - /// - /// Summary description for CatalogAction. - /// - public class CatalogAction : AbstractWebAction - { - private Category _category =null; - private static readonly CatalogService _catalogService = CatalogService.GetInstance(); - - public CatalogAction(HttpContext context) : base(context) - { - _category = new Category(); - } - - public void ShowProductsByCategory(string categoryId) - { - IPaginatedList productList = null; - - productList = _catalogService.GetProductListByCategory(categoryId); - - this.singleton.CurrentList = productList; - this.nextViewToDisplay = WebViews.PRODUCTS_BY_CATEGORY; - } - - public void ShowItemsByProduct(string productId) - { - Product product = null; - IPaginatedList itemList = null; - - product = _catalogService.GetProduct(productId); - data.Add(DataViews.PRODUCT, product); - itemList = _catalogService.GetItemListByProduct(productId); - foreach(Item item in itemList) - { - item.Product = product; - } - this.singleton.CurrentList = itemList; - - this.nextViewToDisplay = WebViews.ITEMS_BY_PRODUCT; - } - - public void ShowItem(string itemId) - { - Item item = null; - - item = _catalogService.GetItem(itemId); - data.Add(DataViews.ITEM, item); - - this.nextViewToDisplay = WebViews.ITEM; - } - - public void SearchProducts(string keywords) - { - IPaginatedList productList = null; - - productList = _catalogService.SearchProductList(keywords.ToLower()); - this.singleton.CurrentList = productList; - data.Add(DataViews.SEARCH_KEYWORDS, keywords); - - nextViewToDisplay = WebViews.SEARCH_PRODUCTS; - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/UserActions/DataViews.cs b/Examples/npetshop/NPetshop.Presentation/UserActions/DataViews.cs deleted file mode 100644 index ce935fc..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserActions/DataViews.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; - -namespace NPetshop.Presentation.UserActions -{ - /// - /// Summary description for DataViews. - /// - public class DataViews - { - public const string CATEGORY = "Category"; - public const string PRODUCT_LIST = "ProductsByCategory"; - public const string PRODUCT = "Product"; - public const string ITEM_LIST = "ItemsByProduct"; - public const string ITEM = "Item"; - public const string SEARCH_KEYWORDS = "keywords"; - - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/UserActions/ShoppinAction.cs b/Examples/npetshop/NPetshop.Presentation/UserActions/ShoppinAction.cs deleted file mode 100644 index 39adaf5..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserActions/ShoppinAction.cs +++ /dev/null @@ -1,83 +0,0 @@ - -using System; -using System.Web; - -using NPetshop.Domain.Shopping; -using NPetshop.Service; -using NPetshop.Presentation.Core; - -namespace NPetshop.Presentation.UserActions -{ - /// - /// Summary description for ShoppinAction. - /// - public class ShoppinAction : AbstractWebAction - { - private ShoppingCart _cart = null; - private static readonly CatalogService _catalogService = CatalogService.GetInstance(); - - public ShoppinAction(HttpContext context) : base(context) - { - _cart = singleton.CurrentShoppingCart; - } - - public static ShoppingCart CreateNewShoppingCart() - { - return new ShoppingCart(); - } - - public void AddItemToCart(string itemId) - { - if (_cart != null) - { - _cart.Add(_catalogService.GetItem(itemId)); - this.nextViewToDisplay = WebViews.CART; - } - else - { - this.nextViewToDisplay = WebViews.SIGNIN; - } - } - - public void RemoveItemFromCart(string itemId) - { - if (_cart != null) - { - _cart.RemoveLine(_catalogService.GetItem(itemId)); - this.nextViewToDisplay = WebViews.CART; - } - else - { - this.nextViewToDisplay = WebViews.SIGNIN; - } - } - - public void ShowShoppingCart() - { - if (_cart != null) - { - this.nextViewToDisplay = WebViews.CART; - } - else - { - this.nextViewToDisplay = WebViews.SIGNIN; - } - } - - public void UpdateQuantityByItemId(string itemId, int quantity) - { - ShoppingCartLine cartLine = _cart.FindLine(_catalogService.GetItem(itemId)); - cartLine.Quantity = quantity; - } - - public void ProceedCheckout() - { - this.nextViewToDisplay = WebViews.CHECKOUT; - } - - public void ContinueCheckout() - { - this.nextViewToDisplay = WebViews.PAYMENT; - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/UserActions/ShowStartPageAction.cs b/Examples/npetshop/NPetshop.Presentation/UserActions/ShowStartPageAction.cs deleted file mode 100644 index f6e101e..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserActions/ShowStartPageAction.cs +++ /dev/null @@ -1,18 +0,0 @@ - -using System; - -using NPetshop.Presentation.Core; - -namespace NPetshop.Presentation.UserActions -{ - /// - /// Summary description for ShowStartPageAction. - /// - public class ShowStartPageAction : AbstractWebAction - { - public ShowStartPageAction(System.Web.HttpContext context) : base(context) - { - nextViewToDisplay = WebViews.STARTUP; - } - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/UserActions/WebViews.cs b/Examples/npetshop/NPetshop.Presentation/UserActions/WebViews.cs deleted file mode 100644 index 8ef51d8..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserActions/WebViews.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; - -namespace NPetshop.Presentation.UserActions -{ - ///
- /// - /// WebViews class simply references the names of - /// each control that can appear inside the dynamic - /// part of the site web (the central content). - /// Those names are const strings, and will avoid - /// mistakes in copying names across the numerous files - /// of the project : every control name is verified by - /// the compiler. - /// - public class WebViews - { - public const string ERROR = "Error"; - public const string HOME = "Home"; - public const string STARTUP = "StartUp"; - - public const string PRODUCTS_BY_CATEGORY = "Catalog/ProductList"; - public const string ITEMS_BY_PRODUCT = "Catalog/ItemList"; - public const string ITEM = "Catalog/Item"; - public const string SEARCH_PRODUCTS = "Catalog/SearchProduct"; - - public const string SIGNIN = "Accounts/SignIn"; - public const string REGISTER_USER = "Accounts/NewAccount"; - public const string EDIT_ACCOUNT = "Accounts/AccountEdition"; - public const string SIGNOUT = "Accounts/SignOut"; - - public const string CART = "Shopping/Cart"; - public const string CHECKOUT = "Shopping/Checkout"; - - public const string PAYMENT = "Billing/Payment"; - public const string CONFIRMATION = "Billing/Confirmation"; - public const string SHIPPING = "Billing/Shipping"; - public const string BILLING = "Billing/Bill"; - - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/UserControl.cs b/Examples/npetshop/NPetshop.Presentation/UserControl.cs deleted file mode 100644 index 188779c..0000000 --- a/Examples/npetshop/NPetshop.Presentation/UserControl.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; -using System.Configuration; - -using NPetshop.Presentation.Core; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for UserControl. - /// - public class UserControl : System.Web.UI.UserControl - { - private IController _currentController; - - public UserControl() - { - //this.Error += new System.EventHandler(Error_Handler); - } - - /// - /// currentRouter - /// - public IController CurrentController - { - get - { - return _currentController; - } - set - { - for(int i=0; i< this.Controls.Count; i++) - { - if (this.Controls[i] is NPetshop.Presentation.UserControl) - { - ((NPetshop.Presentation.UserControl) this.Controls[i]).CurrentController = value; - } - } - this._currentController = value; - } - } - - public bool IsRequestCurrentView - { - get - { - return (_currentController != null); - } - } - - - public WebLocalSingleton WebLocalSingleton - { - get - { - return WebLocalSingleton.GetInstance(this.Context); - } - } - - } -} diff --git a/Examples/npetshop/NPetshop.Presentation/bin/Debug/log4net.dll b/Examples/npetshop/NPetshop.Presentation/bin/Debug/log4net.dll deleted file mode 100644 index bfc63d794555231ab445b1bd1e8d1f21bd543f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196608 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

pVp7 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

9h`Pcx8W0ZsP-J(gjnA; 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 diff --git a/Examples/npetshop/NPetshop.Service/AccountService.cs b/Examples/npetshop/NPetshop.Service/AccountService.cs deleted file mode 100644 index ba20239..0000000 --- a/Examples/npetshop/NPetshop.Service/AccountService.cs +++ /dev/null @@ -1,95 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.DataAccess; - -using NPetshop.Domain.Accounts; -using NPetshop.Service; -using NPetshop.Persistence.Interfaces.Accounts; - -namespace NPetshop.Service -{ - ///

- /// Summary description for AccountService. - /// - public class AccountService - { - #region Private Fields - private static AccountService _instance = new AccountService(); - private DaoManager _daoManager = null; - private IAccountDao _accountDao = null; - #endregion - - #region Constructor - private AccountService() - { - _daoManager = ServiceConfig.GetInstance().DaoManager; - _accountDao = _daoManager.GetDao( typeof(IAccountDao) ) as IAccountDao; - } - #endregion - - #region Public methods - - public static AccountService GetInstance() - { - return _instance; - } - - - public Account GetAccount(string username) - { - Account account = null; - - account = _accountDao.GetAccount(username); - - return account; - } - - public Account GetAccount(string login, string password) - { - Account account = null; - - account = _accountDao.GetAccount(login, password); - - return account; - } - - public void InsertAccount(Account account) - { - _daoManager.BeginTransaction(); - try - { - _accountDao.InsertAccount(account); - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - } - - public void UpdateAccount(Account account) - { - _daoManager.BeginTransaction(); - try - { - _accountDao.UpdateAccount(account); - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - } - - public IList GetUsernameList() - { - return _accountDao.GetUsernameList(); - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Service/AssemblyInfo.cs b/Examples/npetshop/NPetshop.Service/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop/NPetshop.Service/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop/NPetshop.Service/BillingService.cs b/Examples/npetshop/NPetshop.Service/BillingService.cs deleted file mode 100644 index 56f96ea..0000000 --- a/Examples/npetshop/NPetshop.Service/BillingService.cs +++ /dev/null @@ -1,103 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; -using IBatisNet.DataAccess; - -using NPetshop.Domain; -using NPetshop.Domain.Billing; -using NPetshop.Domain.Catalog; - -using NPetshop.Service; - -using NPetshop.Persistence.Interfaces; -using NPetshop.Persistence.Interfaces.Billing; -using NPetshop.Persistence.Interfaces.Catalog; - -namespace NPetshop.Service -{ - /// - /// Summary description for OrderService. - /// - public class BillingService - { - #region Private Fields - private static BillingService _instance = new BillingService(); - private DaoManager _daoManager = ServiceConfig.GetInstance().DaoManager; - private IOrderDao _orderDao = null; - private IItemDao _itemDao = null; - private ISequenceDao _sequenceDao = null; - #endregion - - #region Constructor - public BillingService() - { - _itemDao = _daoManager[typeof(IItemDao)] as IItemDao; - _orderDao = _daoManager[typeof(IOrderDao)] as IOrderDao; - _sequenceDao = _daoManager[typeof(ISequenceDao)] as ISequenceDao; - - } - #endregion - - #region Public methods - - public static BillingService GetInstance() - { - return _instance; - } - - - #region Order - - public void InsertOrder(Order order) - { - // Get the next id within a separate transaction - order.Id = GetNextId("OrderNum"); - - _daoManager.BeginTransaction(); - try - { - _itemDao.UpdateQuantity(order); - _orderDao.InsertOrder(order); - - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - } - - public IPaginatedList GetOrdersByUsername(string userName) - { - return _orderDao.GetOrdersByUsername(userName); - } - - #endregion - - #region Sequence - public int GetNextId(string key) - { - int id = -1; - - _daoManager.BeginTransaction(); - try - { - id = _sequenceDao.GetNextId(key); - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - - return id; - } - #endregion - - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Service/CatalogService.cs b/Examples/npetshop/NPetshop.Service/CatalogService.cs deleted file mode 100644 index e91c04a..0000000 --- a/Examples/npetshop/NPetshop.Service/CatalogService.cs +++ /dev/null @@ -1,117 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.DataAccess; -using IBatisNet.Common.Pagination; - -using NPetshop.Domain.Catalog; -using NPetshop.Service; -using NPetshop.Persistence.Interfaces.Catalog; - -namespace NPetshop.Service -{ - /// - /// Summary description for CatalogService. - /// - public class CatalogService - { - #region Private Fields - private static CatalogService _instance = new CatalogService(); - private DaoManager _daoManager = null; - private IItemDao _itemDao = null; - private IProductDao _productDao = null; - private ICategoryDao _categoryDao = null; - #endregion - - #region Constructor - private CatalogService() - { - _daoManager = ServiceConfig.GetInstance().DaoManager; - _categoryDao = _daoManager[typeof(ICategoryDao)] as ICategoryDao; - _productDao = _daoManager[typeof(IProductDao)] as IProductDao; - _itemDao = _daoManager[typeof(IItemDao)] as IItemDao; - } - #endregion - - #region Public methods - - public static CatalogService GetInstance() - { - return _instance; - } - - #region Item - public IPaginatedList GetItemListByProduct(string productId) - { - IPaginatedList itemList = null; - - itemList = _itemDao.GetItemListByProduct(productId); - - return itemList; - } - - public Item GetItem(string itemId) - { - Item item = null; - - item = _itemDao.GetItem(itemId); - - return item; - } - - public bool IsItemInStock(string itemId) - { - return _itemDao.IsItemInStock(itemId); - } - #endregion - - #region Product - public Product GetProduct(string productId) - { - Product product = null; - - product = _productDao.GetProduct(productId); - - return product; - } - - public IPaginatedList GetProductListByCategory(string categoryId) - { - IPaginatedList productList = null; - - productList = _productDao.GetProductListByCategory(categoryId); - - return productList; - } - - public IPaginatedList SearchProductList(string keywords) - { - IPaginatedList productList = null; - - productList = _productDao.SearchProductList(keywords); - - return productList; - } - #endregion - - #region Category - public IList GetCategoryList() - { - return _categoryDao.GetCategoryList(); - } - - public Category GetCategory(string categoryId) - { - Category category = null; - - category = _categoryDao.GetCategory(categoryId); - - return category; - } - #endregion - - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj b/Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj deleted file mode 100644 index c38d867..0000000 --- a/Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj +++ /dev/null @@ -1,140 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj.user b/Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj.user deleted file mode 100644 index 10af82d..0000000 --- a/Examples/npetshop/NPetshop.Service/NPetshop.Service.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Service/ServiceConfig.cs b/Examples/npetshop/NPetshop.Service/ServiceConfig.cs deleted file mode 100644 index 53c6d62..0000000 --- a/Examples/npetshop/NPetshop.Service/ServiceConfig.cs +++ /dev/null @@ -1,66 +0,0 @@ - -using System; - -using IBatisNet.Common.Utilities; -using IBatisNet.DataAccess; - -namespace NPetshop.Service -{ - /// - /// Summary description for ServiceConfig. - /// - public class ServiceConfig - { - static private object _synRoot = new Object(); - static private ServiceConfig _instance; - - private DaoManager _daoManager = null; - - /// - /// Remove public constructor. prevent instantiation. - /// - private ServiceConfig(){} - - static public ServiceConfig GetInstance() - { - if (_instance==null) - { - lock(_synRoot) - { - if (_instance==null) - { - ConfigureHandler handler = new ConfigureHandler( ServiceConfig.Reset ); - DaoManager.ConfigureAndWatch( handler ); - - _instance = new ServiceConfig(); - _instance._daoManager = DaoManager.GetInstance("SqlMapDao"); - } - } - } - return _instance; - } - - - /// - /// Reset the singleton - /// - /// - /// Must verify ConfigureHandler signature. - /// - /// - /// - static public void Reset(object obj) - { - _instance =null; - } - - public DaoManager DaoManager - { - get - { - return _daoManager; - } - } - - } -} diff --git a/Examples/npetshop/NPetshop.Service/ShoppingService.cs b/Examples/npetshop/NPetshop.Service/ShoppingService.cs deleted file mode 100644 index f84c231..0000000 --- a/Examples/npetshop/NPetshop.Service/ShoppingService.cs +++ /dev/null @@ -1,30 +0,0 @@ - -using System; - -using NPetshop.Domain.Shopping; - -namespace NPetshop.Service -{ - /// - /// Summary description for ShoppingService. - /// - public class ShoppingService - { - #region Private Fields - private static ShoppingService _instance = new ShoppingService(); - #endregion - - #region Public methods - - public static ShoppingService GetInstance() - { - return _instance; - } - - public ShoppingCart CreateNewShoppingCart() - { - return new ShoppingCart(); - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Service/bin/Debug/log4net.dll b/Examples/npetshop/NPetshop.Service/bin/Debug/log4net.dll deleted file mode 100644 index bfc63d794555231ab445b1bd1e8d1f21bd543f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196608 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

pVp7 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

9h`Pcx8W0ZsP-J(gjnA; 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 diff --git a/Examples/npetshop/NPetshop.Web/@css/styles.css b/Examples/npetshop/NPetshop.Web/@css/styles.css deleted file mode 100644 index a421f32..0000000 --- a/Examples/npetshop/NPetshop.Web/@css/styles.css +++ /dev/null @@ -1,211 +0,0 @@ -b, #categoryMenu a, #splashMenu a, .gridHead td, .label, .title -{ - color: #023030; - font-weight: bold; -} - -body -{ - background-color: #ffffff; - color: #000000; - margin: 0px; -} - -.pageHeader -{ - font-family: Verdana; - color: #003300; - font-size: 16pt; -} - -.header -{ - font-family: Verdana, Arial; - color: #003300; - font-size: 9pt; - font-weight: bold; -} - -.fieldHeader -{ - font-family: Verdana, Arial; - color: #003300; - font-size: 9pt; - font-weight: bold; -} - -.errText -{ - font-family: Verdana, Arial; - color: #990000; - font-size: 9pt; -} - -.text -{ - font-family: Verdana, Arial; - color: #000000; - font-size: 9pt; -} -A.text -{ - font-family: Verdana, Arial; - color: #000000; - font-size: 9pt; - text-decoration: none; -} -A.text:hover -{ - color: #003399; - text-decoration: underline; -} - -.tableHeader -{ - font-weight: bold; - font-size: 10pt; - color: #003300; - font-style: italic; - font-family: Arial; -} - -.menuOrange -{ - font-weight: bold; - font-size: 8pt; - color: #fe9901; - font-family: Arial; - text-decoration: none; -} -A.menuOrange -{ - font-weight: bold; - font-size: 8pt; - color: #fe9901; - font-family: Arial; - text-decoration: none; -} -A.webServiceTestLabel -{ - font-weight: bold; - font-size: 12pt; - color: #fe9901; - font-family: Arial; - text-decoration: none; -} -A.webServiceTestLabel:hover -{ - text-decoration: underline; -} -A.menuOrange:hover -{ - text-decoration: underline; -} - -.menuBlack -{ - font-weight: bold; - font-size: 9pt; - color: #333333; - font-family: Arial; - text-decoration: none; -} -A.menuBlack -{ - font-weight: bold; - font-size: 9pt; - color: #333333; - font-family: Arial; - text-decoration: none; -} -A.menuBlack:hover -{ - text-decoration: underline; -} - -A.catLink -{ - font-family: Arial; - font-size: 14pt; - color: #003300; - font-style: italic; - text-decoration: none; -} -A.catLink:hover -{ - text-decoration: underline; -} -.gridHead td -{ - border-bottom: solid 2px black; -} - -.gridItem td, .gridFoot td -{ - border-bottom: 1px solid black; - height: 25px; -} - -.gridHead td, .gridItem td, .gridFoot td -{ - padding-left: 10px; - padding-right: 10px; -} - -.gridFoot -{ - background: gainsboro; -} - -.gridNav -{ - padding-top: 10px; -} - -.label -{ - padding-right: 5px; - text-align: right; -} - -.num -{ - text-align: right; -} - -.numFooter -{ - background: gainsboro; - text-align: right; -} - -.textBox{ - background-color: transparent; - padding: 3px; - line-height: normal !important; - border-style: none; - border-bottom: 1px solid #8E959E; - color: #023030 -} - -.textBox-on { - background-color: transparent; - padding: 3px; - line-height: normal !important; - border-style: none; - border-bottom: 1px solid #f30; - color: #333 -} -.select { - background-color: #EDF7FF; - border: 1px inset; - font-family: tahoma,arial,geneva,verdana,lucida,helvetica,sans-serif; - font-size: 12px; - font-weight: normal; - padding: 2px; - color: #023030 -} -.btnImage {cursor: pointer; cursor: hand;margin:1px 2px} - - - diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/bird1.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/bird1.jpg deleted file mode 100644 index c181bb054e99632045ca986a1191d0c1edd9df45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3391 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 O)Zqe5bhtqDZ~p;3+fO$D diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/cat1.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/cat1.jpg deleted file mode 100644 index 190d83daa59b65860030b7795944eae71eb20055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3721 zcmbW)XHe5kw*c^e2)&4*NC`!XfKr4Int+H12#EAvr9*&7FL~%v9zd!D1u;mkL3$VI zT?FZ&2%$IW9l1R3d*|Mn`{~|$cFum;GduH}GrO~UJ$d~LxUH(Bq6C0I1OUs;0IqR> z0zgVkOhQaVNIVK|#qxLrYD^%FNEj%FM!Yms^PUE~fw&3k#pbeF0$+ zI2_K-DL`FtNNkPd-Ma2l?VBvuMpX2%)03ihefB-Ov6Ci+qz!1=N z2fz*hAR^Ge0{G7W5r7Gah)GDv$SH0Ls&4}XATXGK5KKfwNO)5naI+2&LWpQMMC6HS zwO)~My3xTx5JF$LtA@CXIFPmZ{Ntz(XsJ~$*JjuMf}q8%Iezs#@_zH;nDHQ>Dl=|E)W3z zH|u8pH|&47AU7@oLP9Vh$v-X-fzM5XA%sL6BE&TES|qRBXgOgaq;yXcKbNyQ)kONN6`Eu;Y$+&?>$xkTK zR+|*@X4LHv+JZU0RFu~Pavq5Qs9Eg57#l1?q=0-~5d zQu!K$1oF=q$rvM}GIDC=1bpm^u7Tzaeq3f{IEHVNM5CjoSLsL0-zxfZ=foLhsnEVK&*-&plvOK4&29Wx5xI0!-zB%YY$Ax25t? z8Eo7cr!~IXU>Kg21bT}T#ONHA8Pz1H({R@;34fzR$QcfAuZ9fHHuT8Wc^z_uyD7<3 z9>;ilqa>%hsqC}4P3|!;J*{VPr_NRLkU{4lqsq6##?dRohZjAcrq_mSmarqjdo`k= z(pQSgeo)hfcf8~(y=x>#`8_#DwEB}F$T=0&91|6}4utk}ms*~tt**YS$_A0uH$tDy z<^%RGt5ThUE5-2h_c8A+E#5tR+Tk@QXNUgwVYW5T@k=Io(H0Ds{*k(5uH4i zzCKLI%-HaDc@%Fr7J27~_40Z7=Ba`5uOM2rg;FCp)l<6w@n6?KmO95Zps%r;_BvP+ zw-W!5wOcH`aNV)csNc0&=Y5W>!mWq~4lQl}t%0H+9tLr1C)|IHW=>G-u67_x*VxpD zyvD9jtq zuTR<&{2@Ma`%bI%WUMYbJ=SJa#-nHe>fbFD3mO84m|`=0xo||^q(NuUi@bUf-H#Z! zd8^{iyv|S0L5CSb6NZ1tpuu@st1Tqw`}3>Y z5f+itr*d--&`({emZLP-oDxH-n5I(K{OJ2klvz^mw_wt9ZN=ZEi{@k`mLu#cENr`o zVWQL3NH#|fk&Ze(Nj!LO&`v!_Fseh*r_T+&ZFVPYA$`zkS*BD`YRyP(g1m7o<9IEK z>wvaxVdd2-|8n#p{j@~n2#Od@#Lv2oUS~Dnex4n+rJ=f#`g|gH7%wu@F(eRAH}1kV zi+vNCExQZ4L}ZQ8Idv-gVZJEC~45y-Ed0_Q-Fc5AfbsoLCvmH3Zp_p!6HiwV(X2Qf9F;s7L@B-NSRb$7T;>VlFsCXE{38v8_d2?2JvnDS!RbP}qMGRd{z?iq;~>$r z#+9P^BzU%%@VXwpuv>La^s&e3(dQ=SQRXVkH}$dn?8m9`%h7w2OH+3zyA{>tg*9u7M`$K(T#m<8;(XC~|g-mpe}BzQ#g5WW+SDYEPhMuik7+_{n$v ztO`^yqZPV$nlo^hQj)i&+GF?y7boYpNX@>vtOi+_)E${Kn2c{P?&h5Jk2(18cr~zY zf35U;nBgIY&OCi6!`Ly&NR(1RcEU1_jA#BeuGuyOkyLLtSRq}gao7QVIBON77Ywx4Oy2rW9dt9sMB;}TuGmPJE=F8q2*D zE2Ns<+xgULxEjeil{eFAm1ln}+meg&B&cJLn1-&OOIyqoG8l9ZNNq5DDU%OJ49EIe zWxdWHn89c-c}cEoc0G8d3#*DTr`SU+9QQ{|Y;hv*eRri1>BDGkA?9bDQU)8;X*)Sd zlnG&p35xI+*&g_QM0~}=_cFzjQMhnuMttL^AP$pr+Y?NDW!Lw~vos~ip(AYZB6XWx z&4(j(HXii6^e3W=-oqpMzIFE)UA;(RP4O?ULL-NjkFZXo+ePqv?LV6{8;ABuZN77h z%V+~B!(ouK|3#qK4=3#zv$+^lkG{!$W#N<_uKBrg_~|pjq@WRKs@s_FDh9c#?^2qJ z)*dDX4#8ha&JEXM%Hhmjaq){LNFgI3&t(fSLEELStBBu=S~#&W)7Bg(<~Iz21n}07 zE@A#hRF769!+P|-h(<8wMEil0%8MWeG(^v`8lXJq8Na6!64_>0yk&`${Q&e#d{cgz zSh{n+CuhpbUftKq`?;fD{ZyPCg9WBJcW=>QKE!9TZu<7W@6(UV2bCJ0>6qGfyt?)B z(vrH=-dCr6a52ElbvfQH#pw*pzL|c>{|bJk&|TZ+mxW@5n1suy$Xx@*%}|Xmpa9qGPBh2v*vZlz(_%-+=zEWmfgUumg z_y;s&|F!&^-3Jw?ZLO&;pE80x?gK6m%RsMn-WOGZ$q2H?UkwYjr>q&D>9GY{U6T^+I=pPp?yk9MHOXhk|Yr{5%h4mz%>G z%n$csikZgVzMrcIXbTT7UFZ#FB|Bu2x3N3NPuOGkfEK)3`@Qh-2|R3I>zit3^|?BX1tf`VE2 zZm3gVHnN5A`>@JHrWMk_Z`XZfGalR$khSxTqNTgS&cVqgD0E#|L{v`xrot^ngodV; zwvH}J&&1RWZGPXv(%!+*$=Su#&Cfp|Fen&*^76{+_Rj9_z5Rp3qvL;E z6aeVotc(5Mu>awLUbrZ!s6bSZe_RxlK^F;vQi1tyP_w8TL2P|4^UFliu-;B9touj{ zmo?sEv-2IKyCNVrC%F9&?O(G09W3hqCHpVff4e3C1`x%?<$<7pDsXTtT;fDWD*zxe z)aY}`r|Jt5>>aL2YjxyvfB|~?HG*lR?=ZE;yrryAC~oeqTw>tVBi?4-lh(32la4@y z)UkC3Vfy4}J_a{`kKkihN7~wajtM*mWc5s)&F2P#q#m4VY$IQH`CAJq2{WTMzFMs% z7VXbmZ#~*$zA~kK6>lXuc;s_0)hx=TGk)sw5jqo(S*}+wXm7>7eT;kOd%&K4(To%e zVsw9$b9@e@4csgG#0&34G^DOx zhYB1l-@fTyOq)GcvFEYaWizMm(zqwzFq;4qtuvfRi9sZTsycSs7FFBdwJ{x@0~*_$ zP<3yccgv5-M~{#*g!b{}vBxagB+-nK!zzV*n!481(Bw5=MT_F2`@ELFa6U9h%a@Vq zAI%8!XS<`(CXuy5gQvEYhk82_Qk^wpR~UCXD(nTra*2BM@#F--gpmbrP74Edwzc6( zt~8VA7H6dvPYH{nF4k|ZBQ~r?S^%H?QoiCg&uCR;MEmu^ezZ0xvFTx2?SbE#wRwuN zc0R|}m(jwfPV{fsRHlBP16~8gswPzYvfIrOWU;{86&BcuMYVf(s(|&zj>FF%6|hFJ@dw+hN-rCqI)gdFoy${ zZInxjLcx}_8Nxlos=j_SjOeN$k`Mmg6KLh|NSt_5Vt#~9VIdznn0-X{jK2QSmdkd7 zl3EE?Fs2inEIk`??lrEWn7j5IU7+zZ99ryUF~@>k)+O>yXSo4*5HXFV}eW zLHev-l1{^}yvu|G@}WZXbccsIN$D!T9aRWqM4O^u+W=GD}^eOA7BryZtw!s+>Jbd>1`?iKec26$p~pdoR}t+y!O zlQRsA5B|ory(;}SPAYjz;&Ts43T)CjLJM+AhT)~?R)fyyNBF+&MMczm4jcRzj1LFNbf;9&%*hRI3G%+NpoHjyd78YeqMFq_xhI^*XL! zp|;YTU)AKw)(e)!re7f0iL>*)g?Yb>JdbYQOzXj}*w@8B^0HV6J8Jh_4Ab(id-*1~ zdt#+r{PCIj$6f~&ouQUL1|drBBP}=$itFIw&HT9S>gfh&O|QVT2t(abm1+ujA=S2- zM0r-{Q2}L7tZ^`WrnqT@MNXzMckS$3FWZ1yOHSUVu?1?u>t1()k{i7>J=d2!hDnK^ zjP!M3F^d)5KKZ9(jBF>g6a7DZxIZ))OmX8ft5o)e^tqp=PM4`029s;RHtyk$v*TRj zsHWK4YCPQ`A*SlBr3TaVC_e$&OKJ=;l;FS_)=~IydDb=d&l$Y87GLkz%D!t&=^qft zfAG0eFA~MM(&f5hnRlmJOThP~B**?!^^Rv;PUGW0~yuSbAn&ce^<$n<@!3)3{NWZ6}*FA|JcZ%~bgw%?DJ7v7gX2R!_1 zJyNR3Dd<1w6MbTmZ=aWM`K^_VM`~8RJZzCak`p)D`})({3i}#zr7Fuwx^6~R&qCwy zng^D-@2_ctaucWX{R893O_p9=mpBe}%!Q@Bz-c zzJV$8esG%HTHsrAk1MNx;lc@Vm}(W$6Ak3>L0)8H)<{YKv3G&^4uu?8+DHhIk`EV9 zqgSB%^8-8I+$TSIl`~fE zQn_(=tBlAElOhZSSmdtG>@dslHWchiEUI>-Syosgau5mqy+2O%=i=%|qy%CEr0c15 zQJ*Bkh@xSjyNN02mcQ?-9M&%Xw0sh;NPckfNqd=DVJI>TVyXJ#Vh7N*#_Bsh4$7+6XJIPv1u@cw227kNfw;DU|uq`2P2|ZT5*Ptr*oZW?eYwdK6^vY0&i~qMFP&cohWj;jY`PV*JLWUlW6|2-HNDzXb|7=S2^ot~FE1uqX;PgUb!b*I= zdwx267n;&DIocX?7(F*|sCz2q$tjAKl$F$fB?9J$+UvFe-iY)?ry`EY&s+w;{CMjAFC44O!%5SC{~?F-iitXW!N! zd0)G;xbSSJ(M*2GZ6Z9?cJ7ccz&zQ<^lGW&4&~`oo@mtxv;4&E?r(}&y+t?Dx5|Dc*RZ*jxJxEUY&NQU z@Ir+rca)AJzx&rD%~PjHX2aVC9jQ^)b~o__P4?ZUxV99*wrH}#XuA7lfngMl0u&!r zg)>8KXxWRL2)Cp!yE-b}7Sf5aZE2Fg&#>pZXGwkzVc6%XBBsxeiusB4CgNqINyf1a z1S1B~c;JI6fPPrFf0YrrVEFE%*+ce|p4YYMoufFJH%s@dQ;qX@=sXAPg}$z;vWBX^ z#?4B&mKEkqa(k`+5gWB(`xvS?$kn5lVbqlB_~ir>V}I5Bb*XdK2} zwu&NU{c7ehK$zZ0%tp_P=@RB2v78F}l{{)okn{gD^>TZcp#|p72@h|q$D}iKkioXv)0ebaQ04nZ{JU~L9S5=FMF-5|08LW zX{xob@Zv#zo+H^#-5yB4x*|-xa-y#^|g2>QfB7qfJ*xn$Di{2nt+#O<2v4 zn9P!X2@bPJ`Xp;;+1YYG$mpb+Smk=GMVNO}U}w?CuuC&b&smMJ#Y}Ymoc$cCy0tLe zR2|ghx(SN<0`uv^A1{@HD`VdI*T@nRIi(${ zxV`ud!P~ilFC0yiF`H*>8oFEi#S66XtZmpZN+S;j^ExA7TVL9OQ>p_;2gSX+rSTBG zmEx!vw-5`dkn*&oTE&ixUuTX@a5?}4cmuC!vI-Ir&0O>E5(L$aP1MQ_LAn*zvS^VQ zLolt~fZKxnCa}^{y|gh!d~#r<(#DBgAO_Xs;5XR`l&&fRkg-s<`86kJZR^{}7sa=H zRl4ja-4u@f^Y#BcnbLb7QFWc|w?@ahp-PjDhA{kFVs|js1nq);t{v<@b8XmCT)1g= z*-k$DVEEx{UGa@2#UJ7h=0qNuZ*TRh1&)vGO7A!(+d@sT6p4K{73HLguhoIhIM*|- zZFCX7(j^NTF@PHQtV*}mpc=;&5VIB(z8(>%I4v~|`EKsZw_lmgwfy9k#vEF(#u=lO zIUgf@@h@5iKfsA%wbs!r%4W}?WugJBqVxG+K)5JT7`RA^5))2Y;~}UTTP`BGYu%iN zb*Shs5e}D~F#OUWs=*L!%S=$Qt87p7ru++TT1h!vcSnr|EWv6>p~Y$lIUoNI4^u2{ diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/dog1.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/dog1.jpg deleted file mode 100644 index 8671bae4f77ba1b22e5419383185dbfab1e1934e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3319 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 YnNTpSS;q`BfGkXT09#WY(9zW20WHcSk^lez diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/dog2.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/dog2.jpg deleted file mode 100644 index d288963e18995342c59aabb7b8ec86389a5d91d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3525 zcmbW&c{J2t{{ZmM7`su4v4ydfoopGhBr&p7jGZi5vQ)@kSyQrP3?XZl!4NaHu?+gk z(%2#~#u7r`rfgBRu{4jK=Q+=F&hM|^@AtmvegC=dbI*C*d+z(vC+VMoQzk}NjQ|jc z0T4PK0DT5909cusS(uqvSy))u*jU*iJe&{?4v4^M?vp&if-n(bK_MYgNku79ad`bLL9n?HYTZSU;v z(f0qiKmhn(tmFA#u>axWI(9KIGJ+Xd{qaBl)l$G&mK!-zJ%K zPIpev~bicw@#^i z(EN8qQ;)(u7cw?f^R-foW?}*1KkQAk^|<7j z|2XCLbd9}twgX{+oVT17 zFA{WFyGp{kC@VVG>R zWzXGhFd?@y{BpUPk#uNICA3&d-fqbeny*n=;c0Ir9SS= z!u&JLM6goBY`W5_V_&{Vd$9V9gjZXt)jH19P_(S*cJd>K@o75HGaZ$bpzJ91N}3LM zZyhPqCO9iY(YB0VwqD!5+Em@#eRdCXF+M0lIx>L{RMjY?`?D17tT=nAlr7)i(W!1$kCHCT>hAXq7zqYa-jaC44F_E>f<7 z^Q_?2df(oGQsX<*>7rl0R_YcBq$;P9v(?^l9J7tT9S{SR$#W7bsrta2FA+S4z> zd}nQ1I+76g8X^j-$U=y_ol!K=i3{0yhh;Qh(~FBrbIvQ

ka)I_T{^xrgPrlvbyk z2{}`k@c!e2q{1%CMhK&=(=r3v1xu(Jo*ljRp|lU7Uu*&$b9Li{?=MUL{_yhiLNROy{M3tQ9`)hGnPr}nE!`GV?_%32OU_( z2R5f^$${SrK*yfGQkR_SwbUkfWaH;tkk_$k<0Z|KG>U1?yVjZ<;DrAf?Sov(!&fh5 zj^xDm`5HEdJMMtMYs`isq(6;gl67n-s1Gl}2b*hXV5bAY=;?5OWR~fdX6xalF6tQS zBXMTWy+6x{|C`+NkN7P*!0|0`Ih!=tLLBZ*i+PJE+QsTEs5Oyw!xeeWE7oPc-?W2c zyMDUaYnmE3|K|5VG1;dDT;9z6^@=x~-tK-)+>Sdb_|G}{b55JEL-9_n)L4+XEE@ol44xEu#TCgou?ZP5r%#^ zq!;t~mc`aUwKDhtG1~;=E;STRN=lBtje9`rLr~P$h)C`V2P*zW&f${?f0UYBp7E;X zrJ`A9*^<<~mDoMXYlos#HN$U3AO|-$>9NMP{B2B`HDOB7BKKu*)#mt8S@5ZF3aXk8 z)VD|8t~%~zh`*BigC^mhqfLg1G@LC*CzYXtk2D9<72O!$=+XOFe6+>#=J?%AH{`PBPG=S%<;VXadyi;6dW zgZb4jA^vOxTxwgomyBrHJdx???UAHzE8UZ-DPS2bqWZ%*y2i(R!4F^0+oJKEfN^Fx zXB7D3oo2}s?*UnzYq>89Xhh+iyc(F&pih+kJJZ`D`Q(?|N9mdO1t1+E5dLJc zU{a#+BBju0)HyTgest)MH|itT9ah%-ZG6N|YuN3)i45vBtCI01@y}S@@flXAg9~{u z?}y=XeJo9_BPSW}j`&imN27*24?9zie774KEwrz!8|+4RHI}Wv*2&4=4%1Q)u-D3m znNiG8nK*=bhAY3GQkl0e@la4CIS}h~;k0_6%MT4#J;CLq-D~z8j+&7VkhnvOu~qJ` zk4;b`FLq8mh&EX-g7$=SU(0uJ^3&)%YO_omqAl~);+CP69!Q6q+lmNeY9{1XIZv{j zG2x3YeB*FVggn#Z5Nx>m72f^?F{?KRUA;#z`8sHX?5-jo4uFH z*Ojgx{kJI>B9><3mOeMRQw2Ny2nHR!>-A2l(fJKy*7}0MXLr&44S3b=Z;|nKuBrkT z{X|^j+Dv(U{{VQrCd65I^F;RIv+|^KwrQwBO?dF3&g#A*|+lb+2 zLFc;gUPTMh=Z@?50Pt~dso|6}ecGedkaLzZAFuC>T0}8iuNc%Bm-lLX)WR`n6iEtP z*Q}0|Gm_I@lU=0 z=WX{@xu)#)>L6=ht-OHu!X0g<67g61z1(A%f_Q&Nqe2?dj};%^qFGCbJlsE$g~SyPR)!`>A;F@sn5~uu=qsx2q*jRyA2H+K(YY-rj}>%ojkj% z+dq3vvIhCP#Iajoo{ksnI|LV(&Y!Q%HF}Bpc{Qu0W9||n9#najk3=2V!ggj&U;Fsi z42$*^qCfFuEpF0a4JoN!VxlE+p|#-4x^2>_A^-pvLGQyWzw;67j5qc51#eYYT*k?K zzQK?rT@u57oPvhR8R`mRJRtj0?2t1#Al6(~ngRV3B{hw^%adma*qk~*PRQmLzIl7kL_i7|T&ZfXBiRh^9~d18pIf6aWAK diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/dog3.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/dog3.jpg deleted file mode 100644 index 4541ff411120ee4cbc7ea37a0e573ea672b0e0ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3583 zcmbW(c{J2-`v>sP7~5E~OVnnj@Es-%MMno7(DOn^b5_$AI&v~A6et-RbzxREv`=9$d_c^a~{c|0R9!vxLmIw<300OZ9 z;)e$~7za!MPIh(yH9RW&r>e?9?0AP^pI9uZz%5jad72LC_jpbZe<1aJTj43Yv^ z1VCT`&;bRI1ON~l=$`@p9S{qcm5rT)6T-!P*ig$4uzubO*w9OjtxzOjhosyn>>p)@f}WT|E<1 zGlcnh3rqV;4woIBoL#)GdHY=VMfu$f4!IQ?c02rT+`aqp4-yjb=^2@ipFDk*m0wU; z^s>05wCr_tP3@bydU8X12c?rr>+0_59~c}O9vK~D%*@WsFMMV$E-kNbeE+ezwY~Fm z_m2w%fd9ohy#EFJA1;AI7Yi#Zn3dy?3&aw7SYQEGHkdlQpwUH+D_9{Zcq}K>I4!U0 zEks(wZtdvRpgyi+GMY28>wjqfl>P5ucm7|p|G@t1VgNi~(BbgF0)Qc~y(?en!v&E6 z^wQ69XEB@1=B)WT)YD5m-k5i|%Lb#rcfDJ@DO-=<902FfSqE1u{Z@2+g_jtCSl z(y>Y(q8o0{>!PmtKkrY!IFU)$_LVq7TyM2+zMcOucyW#sq5_+e(>Fc)6xHi>gzIg`mYvw5 z?3t9i;m2m%KPjOzVKFxBQJJM1)`Y*bJIweoj$|8%^?vVyLB`D=fsEGse(WhNRRXB?O8-9W&)yC>6S-?wS} z?lbJVY6kV`O4yaeaV8!~Q7JuEwXm3pF zW8{`={T?dPyufwBxL1jD>}MkKTm6y?!f|k+6j?U0l@U3ZJHorRNIZmCN(@7jI=6VG^*x-FfGZ;w3pF5Q6WqQGb0U=1~`dh zY@$I+E}!JdzoID;euzn!kjNtiT2E6@#1Vxw2DOj02_Ca(J4*L(%uGpE#(j#KZ%`0q ztX?%RrAg>7FH9_5hq}WzfZWisV>ZW7G3|(4d5+l5%PRYMM2kSk2Ii9Kv(07XaHZeZ z~NjEwuwC(2gW@MU^e%h4{-@Zs$F<1%1*$kK}YlX#5T{Q0Lapsf>Ql`DPfY5{lh zi)PeD_nEwM3rR!9j=keRh_45?&k^%=%!x_7AjZVnMJhDbjwWvBKf@|0@-Hn1!JR?M%9aiw+NES$QQ!Ogl&vy(W zyUn2MvbG?>!!=#FF}5cq2f&xaHG;rS+K>Gp>$7(o6i&Shv*ok2kIU&`THW-d2dsoK zPAghWr{s=YzQNmBZW2_so>o&jT}nEGe0F2i>uF$Kka->{zuz1ENc@He!4jsVp(|B< zSFP~lZ&;GE>=f^=zshpQOWcj3LE~YU6hc}1U)zr7xxGZ_5igoz`<#w*c9CkU z-l8q?ce8M&_luy=NJ?4%PO6gzk5JG;471rxVw~C-{sf%7cANOnQV2DtA2r~kaq}~u zU2*aEieC?|2*cRH_n49!^k~Y6iuY=DG0y>T>&cb%a~|4J6_Uxp73C1wY^(Gh*66}6 zr`_qfxVwh#d!Nte=YeX0wTq#}I-i7!o)J-HB_`YsImv&KS!@4*3&}CFb zgv$QcH*dyY8~_pO{z@s)dQ9fJ@~tgFnSO+7H_fxYpt7U|=7|jOWxi+3E$}qQ&Nl6S z!YGR3xs&h%mT-xbuLPoZFLA6awC{MfcSX@knN5W@i#FR_XzOrOFLhWU&AsjKh@`Cl;bhzscF1ZaLC_TRbFxHTSv0rp(&rtZRd@%_(iN zVJ?Yg+LVHRGx;2je`=8VdCN+fM&EM4HLWR?t(Dm@2G57Gz4bt!k(JT)csIFzw<+uF z4bjSz=Rm9U2)PW((lGhUf?PDr!({G+geKiUh;Vu#>>Jjj)9;Q>pKyK*TgVR`$#u~p z(b9O!R}waQwi*-zxzU#FIV)>xIIK0d}m7-*d)fp0FQF4#YYB9wYnMsanj_LUopkz=C4`K_lnCEFDMlW>*DN2{;VA z%E5sOEWG`lNzB_JDg833oEb=vzQOrpmYfQ8b@OnlSySxdX9tV!DG>%pH`Ia)uKRt~ zJv*g78HU?wbK7+^b*=3VM0&kmcNla$R(KvxI>oUrxq`CNNc_=qYa^0RGzdXoqV zv39C-Ur{iWw{Co>%Y1@tyjbcSwRghXHWzBYkNPe+C!0%GTWNUML-EEdIrLgdC1ZbU zY0X*SZcAo_wlhy$C+SRY=@0|p=*9dLsDPQ&^OU%pAxloS%$Zsa*=%K`gH}3z5yiTj zt>>L&b|xXHhq)?gIa*0}Qr%Wy3&otQzv6rV_zNHcLH>_8$R(4m7ZTph@6M4=_E$|l zp3EE@S}b8~QiO^D z0#p~ema+YL$(P#iB=)O>(I`l+-aSzbM<;n##8^%=N<{TYwZFPBJ|e%~Agemxyn zM)DnbA;;05yHwwoc)8@CiTnC&ejl)`wzwQ!8+M!UtnAJlaLY&UY}=2SFRN}o!@zndh2*C(Tq%;Ni+@Kt!6KH&EuZx)W+at zZFzlMLMh4C-9)5Yi$6R0Qd^d?p4(X<`RA)DGY{eiU{@Sxh2Dn{PwScK!zS+)3v%e63af^{a- zQ||~IM+;w_)NuHu=EvF}kt0+Vrqt#r)(P~#5@~XjoiE9886SHWC|*?fKC*zU%%H$UGbrd_>>tuauBQM1 diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/dog4.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/dog4.jpg deleted file mode 100644 index 4d9a06bdcb915762cbb26a6a8dd9b00d4b7b4e3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3082 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�`~GCjZPI)bz4(+ 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 S+WVx(r(Y diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/dog6.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/dog6.jpg deleted file mode 100644 index aec020c5436b315dfbdb11b3107f4b32bc4055de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3371 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 aOdxiw4s$^~8c-E+Ee(eXmxilcF8m*;awW+C diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/fish1.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/fish1.jpg deleted file mode 100644 index 1734fb7c6ae56531329d222cb28d82fbac98e0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4048 zcmbW)cQD-Fy9e;kTC5hLMcaI})q5|odI=(W%PI+i*eqcQn-DETj~*pR5G_iy=mgP) zRX0jjCy4shS+4Kzcjw-j``5kqedam;oM+C=Yo0&OoU5N#^T16#ZCz~u1R?^U*9*9s z0W<(IQc?&h2^j4UHY0-@Ceddi(lE$HpfnaX+V~7Z#V6S60`4uW#(_|9xN!7ZEWrm>BYp3q<65U0_;b5>5$HIyGa+BTsrR$zU=D^@NX=?d052 zCcBIdULzE@VA2abd;ie>CHvpOLjGT}|APIuYZ{;egRX}MrUg`h<1_wzX9{u{pqQje znX%TawPZlkDUnoU$DavR&5_FKtXr}Xi+v^Fuy6slKLl`X)1uQ*>|B;V2gO5 zRw}Yw^+Wjb9^PZnH~ub1c3!A%AD^?1)CFE4qIoinF5dHeMz_DKHLE<{Q=P|#x&vbB+HhI=_N!qZxc z6a6(XqL}mKobGD(X6u(Cr50}8WcCDa1jhLa@Y~m-6r1J%t4Qv{2}Ln0)ie&Ng@FYZ zPbO>D^P(+l!}rLDYXZ5KPAv;hkc+oM7a!71uk|&+QLCqj-NTAxkDUj|f)qb?ADu4+ zIzCEh*k_^76&#@Kes6msCUN!-{7iiwcXn z4nBUfq!y;}S|ApiN-b$t9}*GFUDsM__HK;X3>-zSEt(zpuNBW97AH5DpCyhZt=LPJ4W(dm zk&o?c=Rq)3aOBOiD?qHH(bhvhK}2{P){u}Fc579hyd!89`gVuPr`*MMPxK>iuEql$ z)RE7*O8k}`7ofmtVbC6>m^ zZLu$7qfWV9=ZD^nXZAOgjQlkg^66XMw`fvCU*u@mj>Y29)Fo8BbAc)8FZ9aqg23Me+u)Om zGyOi*c{KL;_5OZ2J|5OvaPZ3cZES9$$}PLzi?V@8Y+RVNwu-3Ef*GoO(2$j;=|a2q zP+g{lh^_KRSE~6NH2W2Rs93WhRAFMrQIJ*Xr?HR9V>TCF4|qr_;8|tCzVLb(^tV@k zwM{4)Qa#r=<}{p!c~cdo&ByxeeAr*>M zccss&#BQ3gLu{AU1o#F!y}d2+6>kI1!8v@eGq}Tmjop98z1k*o%^y6PUNwxGe1n+>fXOJb0jY6<2%nSv(Jq7(-=m{v{X^?E_2Yh zzszXxD6=^gZuX1+FD*0uP6j=XJITt=kn zdU?xUtA3)EU}7)o;?w9K(S*i-+4kly+osT8Q$IJPYMp(>Qoe*pIjCUUJaX~s;pxc$ z4%Q%tC1-g{x|I{0l+PyRg0q#|nz+a6e}zU3`JhA*w0dGGP@l;9Q5QckF2C>53H3K` z2WY>D+7_O###I)ortWo0BOG4y|7G0MuY+C6CTvI)t!ML$<=2dV!iWz@V?5qN{|-Ok z<{$)oPHJkt?A;?nJeFMtQ)!c*LO$>%9hUxDb9QU;k;@IggP)2U0VDpFNx{)#mOy4#A$HZ;yQM)6>0+ zI4153iJvrLNOuADU&!0KYX~-u^dyCgRVT7^92A8 zQDOUIAscL{DxpRk0*A=l-0l*$rrEqX^hav?eBWBtP2kEsOuTId(QyMeQCg zlhWs6H3@_cn%EE)(W9+3qiI=+IJkfQ@UqZKCJgc8!4O`4?B%@=DCl8DNtuxjE7yS$ zP>2oNtJae;rB1O^eD9s_>IdnzrE^uXbSY8e2ouF>??dNld*qM0ykuo9+sh9|+ZPkX zbY1y#;9&VyR_Z(KvW~^Y2BBs%12bt{15x* z1F3Z&XBLM;#ST@(;gg(vX-;uEDuOG|W&)&U0|Z<1Je?yV+(k^p!5Fnr5=R_Eo^hSC zX=}{t!RGtlquexj_4BwXDT3uyVKohhukbPA7kf{p5R=`)Uw1J~)idt~BV*ruk%uteiiTP22=sD|%2eSyxOzjSC>_BX9=OMkG0 zP%HKi`T(KYoVz_-hU!EUKIe9^PX*uLjHiMo#k{f&R2-<@9ZtkM=d)0H(L;kTdF!;! z5bKGAEDI7<0Gt}AYIsl*L+?L0l>etRIva!y>xtXyeJ%JvEQ?nWJlz@+WSMgzg|)vo za^tW+!S{uK_pnh**bAtTW*ydhtai?1*++ies9W%niK|5dvb|Nzk7P0HLajjixy0b_ zyzROQEUry)LMYQagD*;xI*#lyH%HWyB>vfxY(!+})8{@ySh_&HU)Y_4ftPAW$!~_K zy0XpicmDuemon>iiYJdnLiGdl5z(1kzVJ#GR|0Ojxxj!+F8);V=|fE1{k*;WB~O7l zU3XX6x`#t|xmlKu)ysdTCLJHmtFf`SuGh$6eM>Adh-KZAW}U4YONHejbGY>fXw2r{ zTh_dArS1+fT*Dbfep6&?SE?~T*UM;3N*qNqW_aB~q~=_T_BEn&xuI_=G5-n>cT2u` zhiX_n;R;w!MA_pqrp7)9Jd318@TG9`T><3+zxjAa9Pf{NZ;?*gs+iR!EIlXmxgHZ0 z77c&0kS#QP-uA^*BwJG1BZIx7WU}?MC(@I7^dbzyeVX;F)l4~b-JHn)yCss}gj{mp zqodu*+)0@5#3$!&Iq}GE_tgp^vP?DW+9aSw4m0A6I>#+;b-@=Rd=a%g%?&2f11`P9 zfn^@MWwzX!;}>?l*DoNP#qgJs(iK2(JA^BDP_kKVmE~G3#5^*iPJUW9Zfx^QTBM!X z2w(;Wk+^Es5*ttS;uv|Civ;yt88(0?jFbg#UE)!|M`7zN8=Xky+pcGS!WSIRc~-r6 zUpw;6T7GDB{@iRgZr9;yGLj80@mJoHO&*&3o$=b`1bcA>q@YbTFi*Qgy*DG?2fmUD zKD8Y4ps7_oS_r24@K#;0A%>9k)#V4t#5>Xrvn#*}k+WCEhFnk1e=f^}uIHxy?G-30 zG)JB8ir}533-GTr`Bc>{9#H}Zx?tE@=d(*lgw=^$mttFbE9fz_NAz#@%pA9^3zgk5 z{n2GabO)}E`+eUr=!g+d7Et08{)WSBbk3yNDD3)AcN_Se&}DeHrKCeAN;{aGPMAUo9CvJg75hY b0e&JGy?Bv33^hQI$%q!fV5|iMUQPW6?jfAs diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/fish2.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/fish2.jpg deleted file mode 100644 index 8bcc3175781b61519c91945aac1160cb032d71c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3035 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 diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/fish4.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/fish4.jpg deleted file mode 100644 index 7b669b3a770424158bd4b969c1ceed9940198586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2917 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 diff --git a/Examples/npetshop/NPetshop.Web/@images/Pets/reptile1.jpg b/Examples/npetshop/NPetshop.Web/@images/Pets/reptile1.jpg deleted file mode 100644 index 15e6458d5ae89a9775bf78e5ea8a1dde4494776f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4235 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 E0c)Vz{?cE&L_lu4JQ z-l4K+t079q+x`q=MGC83E9)I9m25jC=NxbE^B+8)&+~+Y1^cZ?3IG9M$^tAF%V_{^ zL#Pf6<_rL%Xt)Z3N+2i?fLaJbx?es*p&m5p3he0}O#8VliN|wtw(Qt3L8Z>BOD3MR zn=+0W52l;k+&>f-o8Aw<@9F7)pt*+)rqc!8XmrcQIHNM_c|`ahG+HYLGcz+|Op=Z< znR6CP4~Y~PA3tuk4E)tUZLt_l#=gd1CY_vKP0h>|pEJhAngfL+qoWp!x$k9UrGAPtXxxqvs9 zx^vRQW5|kN+_&c$4Bi?|eR!+iDCFdjkk_{4>Wt%`nzZFyb}a^T5=QNhk2N|v-EwCA z%67Pf!B$Wx!|4Z16B9@A=ueLxS&YViS5%lf+P}*D-QNClRK%aYKDY3A9}ee(;Y;qW z)L$X!H5xWuy;5{W6$7JYe!A8%GFAkm@BAz6LiHU54t+d1sWAPJ^Zfan{8zrJ(IhV7 zn$8uqohh70r_)$04TW;!PEG68(u|Gk5m%Q$k?0wbU>fK*j~TAuarFT!tK8jcPUX!} zX`PGRx+S8xtx`OR5*igb_Osd~@M>Ef(4)CC>h5Mt*;#+S&@eT--+_{qd92!hf`ALCS<$57Gc`Fxxq3s(cTyt zw;?u0@^*N*{PLxi6Gy+s&zXTC04%@*eC7X70Q}b}tXQEMbz>Hu=9bv1DQn6l^VXJz z)|Bh=nag(fhYG@Lcf1Uasg{cP3v31}(~cK&D7i7VLk&j_LaeI9_v42l{YYn9b}rS_ zosJGIC9sR!>V>pc@@n7eZ)Xxzo1c6ieqmIG<|;Scp(U?p&q#9%c*{y2*QgXDzgRzP zE&D5}tSLL3Ha7B?530KDNic@aK z5+BJ&kLahD4A`uldwxA(`RB8~`|=!GrmMAQIsQZOpoHf~~ zCg^SzW7~JV--$lP6fs=eHC0CCl*7`tKnqyP``g-cT|_I#=Q20f-nW}DKk(qwQyg(c z{GUHSmVyP5=PveR;0hdm5r}@X*1wJgWk)U@H9)*w9%4P+E7Z`WTpcRSgij=ri8;RH zN*!inu`t(hc_qDzvvj&lN1>Px7c6`$iOq-SnWK?Hp?O;DnSs#4cyR$~jdYh#C>LFA z;Kgtcbe8LWc>3p1f$h7*L2Gsd?7*i*6nEhqH|^D~@vM7n$h2BDp%1Mv2w%M2+O1dv zd!lA%GWTOmSxl!UX*IZ&SPIr=**-Ss)R34sJ3cxHj>^g;Dx3Gs@e=koT-7?@rK41hp_)=tCQIMAZoUrB}#j~CxMNVXoiAZ2LWy| zJ8Sc2Oe>&Na$ zVOyX?s!ezf&a1zioE`lV6q-usMI=^>Q%DV zA>}{eayB;&6TzeaB=N?$tYJy$xo8z3IvD-wL2K@bB&S)mLR@zyFV64m`O_+$hhQ*l z@X}z8R|K*sxhrQysW-j0RRS0vqM{^_^Z7~_ajja(LdG+C*}-loY_tMZufT?85eY|5 zdc$0R7XluIjNxlC%gG$wB5Ne{A(qX^PgTB~)FXFJ_fR-$;j(c}9@@3>O86>-fk^XG zJG(jjY2_CClX5mbi5!I2LUm6QHWJij7gk|;&5GV;YS}GXWVFOvjYE_5n%#EI^I@o+ zWofXzh(-Q}=ng=H532fc0f3_Nv)8R3s~=Zn!Bs zX~47$YZGZ*N*hN*LOu5Wjqr?X;&0k|l(l7K+qa9U{j-96Jz$Dt3*)**p4SD|T^WA) zDHa`#5483rND-amarTBhm6So!XUW4~Z6jPeZ)-Pi|6#iV{F{y0FhUMyG9PRsdTnUP zk&3}N!+_w>VW&Osaik?dDErv`cLfAV c{E{&1Q(s&Qi5!W&Jlj(lRbL(AOa}h{1I~Dj3jhEB diff --git a/Examples/npetshop/NPetshop.Web/@images/space.gif b/Examples/npetshop/NPetshop.Web/@images/space.gif deleted file mode 100644 index 2a68106d151063a2c2eeb50d016254d1e5aca6b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmZ?wbhEHbWMp7u*vtR|4Pe{=rW$~}hK2(N4m310{0EBvXZR1MfHaT=1d2ad7#SG& S8FYY>Kofv$7N!rb4AuZGMj2!P diff --git a/Examples/npetshop/NPetshop.Web/@images/splash.jpg b/Examples/npetshop/NPetshop.Web/@images/splash.jpg deleted file mode 100644 index ad3def0556cfc7bf8d5b703e526ca009146c7a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46200 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 PwceRb&V^zD066~#4h)b~ diff --git a/Examples/npetshop/NPetshop.Web/@images/top_stripe1.gif b/Examples/npetshop/NPetshop.Web/@images/top_stripe1.gif deleted file mode 100644 index 41b3212c41921d64a104416e18d301ce095dda3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 840 zcmZ?wbhEHbWMnX8_|Cw#Ass9 zVr0Z*YQbz~X_%63oStfwnqiuey(*evT@=%fP=;^wIDX7#`Za^$-%KE4{6CZ7|15_8 za~OWj&z`&u)An4)Hpy0&J&M#n6u_57LGaHATMTS7*1BXTy YUZs!|7ZhDOMT9jP3>G*zFfdpH0B6@L$N&HU diff --git a/Examples/npetshop/NPetshop.Web/@images/top_stripe2.gif b/Examples/npetshop/NPetshop.Web/@images/top_stripe2.gif deleted file mode 100644 index 382878172bece09ffab01173d0d9d1a64c29b3a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 814 zcmZ?wbhEHbWMoid_|Cw#Ass9 zVr0Z*YQbz~X_%63oStfwnqiuey(*evT@=%fP=;^wIDX7#`Za^$-%KE4{6CZ7|15_8 wa~OWj&z`!BQz-+*fuwcQ#W)5L3n~DY?U|_HY05|g_+5i9m diff --git a/Examples/npetshop/NPetshop.Web/@images/top_stripe3.gif b/Examples/npetshop/NPetshop.Web/@images/top_stripe3.gif deleted file mode 100644 index 9032783f67c3bb7bbd7b488091e51cfb24b0ec04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmZ?wbhEHbWMoig_|Cw#Ass9 zVr0Z*YQbz~X_%63oStfwnqiuey(*evT@=%fP=;^wIDX7#`Za^$-%KE4{6CZ7|15_8 za~OWj&z`!BFpj&d_L1S}UGl#HNOhtin8@IGZ$P57i25SHX CASS~A diff --git a/Examples/npetshop/NPetshop.Web/AssemblyInfo.cs b/Examples/npetshop/NPetshop.Web/AssemblyInfo.cs deleted file mode 100644 index 7c317a7..0000000 --- a/Examples/npetshop/NPetshop.Web/AssemblyInfo.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("NPetShop")] -[assembly: AssemblyDescription("Fully functional web application based on iBATIS.NET")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Gilles Bayon")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the "project output directory". The location of the project output -// directory is dependent on whether you are working with a local or web project. -// For local projects, the project output directory is defined as -// \obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// For web projects, the project output directory is defined as -// %HOMEPATH%\VSWebCache\\\obj\. -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop/NPetshop.Web/DataBase.config b/Examples/npetshop/NPetshop.Web/DataBase.config deleted file mode 100644 index 84af9ba..0000000 --- a/Examples/npetshop/NPetshop.Web/DataBase.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/Default.aspx b/Examples/npetshop/NPetshop.Web/Default.aspx deleted file mode 100644 index 99023a5..0000000 --- a/Examples/npetshop/NPetshop.Web/Default.aspx +++ /dev/null @@ -1,27 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Header" Src="UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="UserControls/Footer.ascx" %> -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Presentation.Controls" Assembly="NPetshop.Presentation" %> -<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Default" %> -<%@ Register TagPrefix="uc1" TagName="SideBar" Src="UserControls/SideBar.ascx" %> - - - - NPetShop - - - - - - - -

- -
- - -
- - - - - diff --git a/Examples/npetshop/NPetshop.Web/Default.aspx.cs b/Examples/npetshop/NPetshop.Web/Default.aspx.cs deleted file mode 100644 index 8c15f70..0000000 --- a/Examples/npetshop/NPetshop.Web/Default.aspx.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -using NPetshop.Presentation; -using NPetshop.Presentation.UserActions; - -using NUserControls = NPetshop.Presentation; - - -namespace NPetshop.Web -{ - /// - /// Act as a router for incoming request - /// - public class Default : System.Web.UI.Page, IController - { - protected System.Web.UI.WebControls.PlaceHolder placeholder; - protected string currentView = string.Empty; - protected System.Web.UI.WebControls.Label LabelStatus; - protected System.Web.UI.WebControls.ValidationSummary ValidationSummary1; - protected string nextView = string.Empty; - - #region IController - public string CurrentView - { - get - { - return this.currentView; - } - set - { - this.currentView=value; - } - } - - public string NextView - { - get - { - return this.nextView; - } - set - { - this.nextView=value; - } - } - - #endregion - - private void Page_Load(object sender, System.EventArgs e) - { - if ( ViewState["CurrentView"]!=null ) - { - currentView = (string)ViewState["CurrentView"]; - Context.Items.Add("currentView",currentView); - nextView = (string)ViewState["NextView"]; - Context.Items.Add("nextView",nextView); - } - else - { - // Go to Home) - currentView = WebViews.STARTUP; - nextView=null; - } - - if (Request.QueryString["action"] != null) - { - currentView = Request.QueryString["action"]; - nextView=null; - } - - // Make the right control visible - NUserControls.UserControl userControl = (NUserControls.UserControl) LoadControl("UserControls/"+currentView+".ascx"); - userControl.ID = "ID_" + currentView; -// -// if (currentView == "Error") -// { -// LabelStatus.Controls.Add(userControl); -// } -// else -// { - placeholder.Controls.Add(userControl); -// } - - userControl.CurrentController = this; - } - - protected override void OnError(EventArgs e) - { - System.Exception oops = Server.GetLastError(); - - Context.Items.Add("stackTrace",Server.GetLastError().StackTrace); - Context.Items.Add("messageError",Server.GetLastError().Message); - if (Server.GetLastError().InnerException!=null) - { - Context.Items.Add("innerMessageError",Server.GetLastError().InnerException.Message); - } - else - { - Context.Items.Add("innerMessageError", string.Empty); - } - Context.Items.Add("sourceError",Server.GetLastError().Source); - Context.Items.Add("errorView",this.currentView.ToString()); - Server.ClearError(); - Server.Transfer("default.aspx?action=Error"); - } - - protected override void OnPreRender(System.EventArgs e) - { - if ( nextView==null ) - { - return; - } - if ( currentView!=nextView ) - { - // Show the next view - NUserControls.UserControl nextControl = (NUserControls.UserControl) LoadControl("UserControls/"+nextView+".ascx"); - nextControl.ID = "ID_" + nextView; - placeholder.Controls.Add(nextControl); - nextControl.CurrentController = this; - nextControl.DataBind(); - - // Delete last view - NUserControls.UserControl lastControl = (NUserControls.UserControl) placeholder.FindControl("ID_"+currentView); - placeholder.Controls.Remove(lastControl); - currentView = nextView; - } - else - { - Control currentControl = placeholder.FindControl("ID_"+currentView); - currentControl.DataBind(); - } - ViewState["CurrentView"]= currentView; - ViewState["NextView"] = nextView; - } - - - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/Default.aspx.resx b/Examples/npetshop/NPetshop.Web/Default.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop/NPetshop.Web/Default.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/Global.asax b/Examples/npetshop/NPetshop.Web/Global.asax deleted file mode 100644 index fb79924..0000000 --- a/Examples/npetshop/NPetshop.Web/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="NPetshop.Web.Global" %> diff --git a/Examples/npetshop/NPetshop.Web/Global.asax.cs b/Examples/npetshop/NPetshop.Web/Global.asax.cs deleted file mode 100644 index cf0f530..0000000 --- a/Examples/npetshop/NPetshop.Web/Global.asax.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Web; -using System.Web.SessionState; - -using NPetshop.Presentation; - -namespace NPetshop.Web -{ - /// - /// Summary description for Global. - /// - public class Global : System.Web.HttpApplication - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - public Global() - { - InitializeComponent(); - } - - protected void Application_Start(Object sender, EventArgs e) - { - - } - - protected void Session_Start(Object sender, EventArgs e) - { - - } - - protected void Application_BeginRequest(Object sender, EventArgs e) - { - } - - protected void Application_EndRequest(Object sender, EventArgs e) - { - - } - - protected void Application_AuthenticateRequest(Object sender, EventArgs e) - { - - } - - protected void Application_Error(Object sender, EventArgs e) - { - - } - - protected void Session_End(Object sender, EventArgs e) - { - - } - - protected void Application_End(Object sender, EventArgs e) - { - - } - - #region Web Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - } - #endregion - } -} - diff --git a/Examples/npetshop/NPetshop.Web/Global.asax.resx b/Examples/npetshop/NPetshop.Web/Global.asax.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop/NPetshop.Web/Global.asax.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop/NPetshop.Web/HttpModules/ErrorModule.cs b/Examples/npetshop/NPetshop.Web/HttpModules/ErrorModule.cs deleted file mode 100644 index af92a87..0000000 --- a/Examples/npetshop/NPetshop.Web/HttpModules/ErrorModule.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Web; - -namespace NPetshop.Web.HttpModules -{ - /// - /// Description rsume de ErrorModule. - /// - public class ErrorModule : IHttpModule - { - private HttpApplication _application = null; - - #region IHttpModule Members - - public void Init(HttpApplication context) - { - _application = context; - - _application.Error += new System.EventHandler(OnError); - } - - public void Dispose() - { - } - - #endregion - - public void OnError(object obj, EventArgs args) - { - // At this point we have information about the error - Exception exception = _application.Server.GetLastError(); - HttpContext context = _application.Context; - string currentView = context.Items["currentView"] as string; - string nextView = context.Items["nextView"] as string; - - context.Items.Add("stackTrace",exception.StackTrace); - context.Items.Add("messageError",exception.Message); - if (exception.InnerException!=null) - { - context.Items.Add("innerMessageError",exception.InnerException.Message); - } - else - { - context.Items.Add("innerMessageError", string.Empty); - } - context.Items.Add("sourceError",exception.Source); - context.Items.Add("errorView",currentView); - context.ClearError(); - _application.Response.Redirect("default.aspx?action=Error",false); - } - } -} diff --git a/Examples/npetshop/NPetshop.Web/Maps/Account.xml b/Examples/npetshop/NPetshop.Web/Maps/Account.xml deleted file mode 100644 index 22d900c..0000000 --- a/Examples/npetshop/NPetshop.Web/Maps/Account.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - ( Account_Email, Account_FirstName, Account_LastName, - Account_Status, Account_Addr1, Account_Addr2, Account_City, Account_State, Account_Zip, - Account_Country, Account_Phone, Account_Id) - values - ( #Email#, #Address.FirstName#, #Address.LastName#, - #Status#, #Address.Address1#, #Address.Address2#, #Address.City#, #Address.State#, - #Address.Zip#, #Address.Country#, #Address.Phone#, #Login#) - - - update Accounts - set Account_Email = #Email#, - Account_FirstName = #Address.FirstName#, - Account_LastName = #Address.LastName#, - Account_Status = #Status#, - Account_Addr1 = #Address.Address1#, - Account_Addr2 = #Address.Address2#, - Account_City = #Address.City#, - Account_State = #Address.State#, - Account_Zip = #Address.Zip#, - Account_Country = #Address.Country#, - Account_Phone = #Address.Phone# - where Account_Id = #Login# - - - - - insert into Profiles - (Profile_LangPref, Profile_FavCategory, Profile_MyListOpt, Profile_BannerOpt, Account_Id) - values - (#Profile.FavoriteLanguage#, #Profile.FavouriteCategory.Id#, #Profile.IsShowFavorites:bit#, #Profile.IsShowBanners:bit#, #Login#) - - - update Profiles - set Profile_LangPref = #Profile.FavoriteLanguage#, - Profile_FavCategory = #Profile.FavouriteCategory.Id#, - Profile_MyListOpt = #Profile.IsShowFavorites#, - Profile_BannerOpt = #Profile.IsShowBanners# - where Account_Id = #Login# - - - insert into SignsOn - (SignOn_Password, Account_Id) - values - (#Password#, #Login#) - - - update SignsOn set SignOn_Password = #Password# where Account_Id = #Login# - - - - diff --git a/Examples/npetshop/NPetshop.Web/Maps/Category.xml b/Examples/npetshop/NPetshop.Web/Maps/Category.xml deleted file mode 100644 index de8db99..0000000 --- a/Examples/npetshop/NPetshop.Web/Maps/Category.xml +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Web/Maps/Item.xml b/Examples/npetshop/NPetshop.Web/Maps/Item.xml deleted file mode 100644 index 052bbd4..0000000 --- a/Examples/npetshop/NPetshop.Web/Maps/Item.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - update Inventories - set Inventory_Quantity = Inventory_Quantity - #Increment# - where Item_ID = #ItemId# - - - diff --git a/Examples/npetshop/NPetshop.Web/Maps/LineItem.xml b/Examples/npetshop/NPetshop.Web/Maps/LineItem.xml deleted file mode 100644 index a19d3ac..0000000 --- a/Examples/npetshop/NPetshop.Web/Maps/LineItem.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - Insert Into LinesItem - (Order_Id, LineItem_LineNum, Item_Id, LineItem_Quantity, LineItem_UnitPrice) - Values - (#Order.Id#, #LineNumber#, #Item.Id#, #Quantity#, #Item.ListPrice#) - - - diff --git a/Examples/npetshop/NPetshop.Web/Maps/Order.xml b/Examples/npetshop/NPetshop.Web/Maps/Order.xml deleted file mode 100644 index 20f92b3..0000000 --- a/Examples/npetshop/NPetshop.Web/Maps/Order.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - Insert Into Orders - (Order_ID,Account_ID, Order_Date, - Order_ShipToFirstName, Order_ShipToLastName, Order_ShipAddr1, Order_ShipAddr2, - Order_ShipCity, Order_ShipState, Order_ShipZip, Order_ShipCountry, - Order_BillToFirstName, Order_BillToLastName, Order_BillAddr1, Order_BillAddr2, - Order_BillCity, Order_BillState, Order_BillZip, Order_BillCountry, - Order_TotalPrice, - Order_CreditCard, Order_ExprDate, Order_CardType) - Values - (#Id#,#Account.Login#, #OrderDate#, - #ShippingAddress.FirstName#, #ShippingAddress.LastName#, #ShippingAddress.Address1#, #ShippingAddress.Address2#, - #ShippingAddress.City#, #ShippingAddress.State#, #ShippingAddress.Zip#, #ShippingAddress.Country#, - #BillingAddress.FirstName#, #BillingAddress.LastName#, #BillingAddress.Address1#, #BillingAddress.Address2#, - #BillingAddress.City#, #BillingAddress.State#, #BillingAddress.Zip#, #BillingAddress.Country#, - #TotalPrice#, - #CreditCard.CardNumber#, #CreditCard.CardExpiration#, #CreditCard.CardType#) - - - diff --git a/Examples/npetshop/NPetshop.Web/Maps/Product.xml b/Examples/npetshop/NPetshop.Web/Maps/Product.xml deleted file mode 100644 index e5c276c..0000000 --- a/Examples/npetshop/NPetshop.Web/Maps/Product.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Web/Maps/Sequence.xml b/Examples/npetshop/NPetshop.Web/Maps/Sequence.xml deleted file mode 100644 index d4454e7..0000000 --- a/Examples/npetshop/NPetshop.Web/Maps/Sequence.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - update Sequences - set Sequence_NextId = #NextId# where Sequence_Name = #Name# - - - diff --git a/Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj b/Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj deleted file mode 100644 index 3d0b99e..0000000 --- a/Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj +++ /dev/null @@ -1,756 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj.webinfo b/Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj.webinfo deleted file mode 100644 index 6f1cbc5..0000000 --- a/Examples/npetshop/NPetshop.Web/NPetshop.Web.csproj.webinfo +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Examples/npetshop/NPetshop.Web/NPetshop.mdb b/Examples/npetshop/NPetshop.Web/NPetshop.mdb deleted file mode 100644 index 97f061c43f2837f2206f4c4c161b89f8c4e96745..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499712 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 T{)Z#L5#R`L1ULdu6@mW)pd(~Q diff --git a/Examples/npetshop/NPetshop.Web/SqlMap.config b/Examples/npetshop/NPetshop.Web/SqlMap.config deleted file mode 100644 index fceaf4b..0000000 --- a/Examples/npetshop/NPetshop.Web/SqlMap.config +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx deleted file mode 100644 index ab6b184..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx +++ /dev/null @@ -1,19 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="AccountUI" Src="AccountUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AccountEdition.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AccountEdition" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- My account. -
- - - - - -
-   - -
-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs deleted file mode 100644 index 1ce4424..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de AccountEdition. - /// - public class AccountEdition : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Button ButtonCancel; - protected System.Web.UI.WebControls.Button ButtonUpdateAccount; - protected NPetshop.Web.UserControls.Accounts.AccountUI ucAccount; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public override void DataBind() - { - ucAccount.Account = this.WebLocalSingleton.CurrentUser; - } - - private void ButtonUpdateAccount_Click(object sender, System.EventArgs e) - { - if (Page.IsValid) - { - AccountAction action = new AccountAction(Context); - action.Account = ucAccount.Account; - - action.UpdateAccount(); - this.CurrentController.NextView = action.NextViewToDisplay; - - this.WebLocalSingleton.CurrentUser = ucAccount.Account; - } - } - - private void ButtonCancel_Click(object sender, System.EventArgs e) - { - AbstractWebAction action = new ShowStartPageAction(Context); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.ButtonUpdateAccount.Click += new System.EventHandler(this.ButtonUpdateAccount_Click); - this.ButtonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx deleted file mode 100644 index 9a2cf66..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx +++ /dev/null @@ -1,84 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AccountUI.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AccountUI" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="AddressUI.ascx" %> -
- - Account - - - - - - - - - - - - - -
Login: - - -
Password: - - -
E-mail Address: - - -
-
-
- - Address - -
-
- - Preferences - - - - - - - - - - - - - - - -
- - - - - -
Show the .NET Pet Shop in  - - English - Japanese - -
-
- - - - - -
My favorite category is  - - Fish - Dogs - Reptiles - Cats - Birds - -
-
Make items in my favorite category more prominent as I shop.
Show pet tips based on my favorite category.
-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs deleted file mode 100644 index a191ba0..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Accounts; - using NPetshop.Domain.Catalog; - - /// - /// Description rsume de Account. - /// - public class AccountUI : System.Web.UI.UserControl - { - protected System.Web.UI.WebControls.TextBox textboxLogin; - protected System.Web.UI.WebControls.TextBox textboxPassword; - protected System.Web.UI.WebControls.TextBox textboxEmail; - - protected System.Web.UI.WebControls.RequiredFieldValidator valUserId; - protected System.Web.UI.WebControls.RequiredFieldValidator valPassword; - protected System.Web.UI.WebControls.RequiredFieldValidator valEmail; - protected System.Web.UI.WebControls.DropDownList listLanguage; - protected System.Web.UI.WebControls.DropDownList listCategory; - protected System.Web.UI.WebControls.CheckBox chkShowFavorites; - protected System.Web.UI.WebControls.CheckBox chkShowBanners; - protected AddressUI ucAddress; - - public NPetshop.Domain.Accounts.Account Account - { - get - { - NPetshop.Domain.Accounts.Account account = new NPetshop.Domain.Accounts.Account(); - - account.Login = textboxLogin.Text; - account.Password = textboxPassword.Text; - account.Email = textboxEmail.Text; - - account.Address = ucAddress.Address ; - - account.Profile.FavoriteLanguage = listLanguage.SelectedItem.Value ; - account.Profile.FavouriteCategory = new Category(); - account.Profile.FavouriteCategory.Id = listCategory.SelectedItem.Value; - account.Profile.IsShowFavorites = chkShowFavorites.Checked; - account.Profile.IsShowBanners = chkShowBanners.Checked; - - return account; - } - set - { - textboxLogin.Text = value.Login; - textboxPassword.Text = value.Password; - textboxEmail.Text = value.Email; - - ucAddress.Address = value.Address; - - SetSelectedItem(listLanguage, value.Profile.FavoriteLanguage); - SetSelectedItem(listCategory, value.Profile.FavouriteCategory.Id); - chkShowFavorites.Checked = value.Profile.IsShowFavorites; - chkShowBanners.Checked = value.Profile.IsShowBanners; - } - } - - private void SetSelectedItem(DropDownList list, string value) - { - ListItem item = list.Items.FindByValue(value); - if (item != null) - { - item.Selected = true; - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx deleted file mode 100644 index f225977..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx +++ /dev/null @@ -1,57 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AddressStatic.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AddressStatic" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
First Name: - -
Last Name: - -
Street Address: - -
- -
City: - -
State / Province: - -
Postal Code: - -
Country: - -
Telephone Number: - -
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs deleted file mode 100644 index 7caa7c1..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Accounts; - - /// - /// Description rsume de AddressStatic. - /// - public class AddressStatic : System.Web.UI.UserControl - { - protected System.Web.UI.WebControls.Literal LiteralFirstName; - protected System.Web.UI.WebControls.Literal LiteralLastName; - protected System.Web.UI.WebControls.Literal LiteralAddress1; - protected System.Web.UI.WebControls.Literal LiteralAddress2; - protected System.Web.UI.WebControls.Literal LiteralCity; - protected System.Web.UI.WebControls.Literal LiteralState; - protected System.Web.UI.WebControls.Literal LiteralZip; - protected System.Web.UI.WebControls.Literal LiteralCountry; - protected System.Web.UI.WebControls.Literal LiteralPhone; - - public Address Address - { - set - { - LiteralFirstName.Text = value.FirstName; - LiteralLastName.Text = value.LastName; - LiteralAddress1.Text = value.Address1; - LiteralAddress2.Text = value.Address2; - LiteralCity.Text = value.City; - LiteralZip.Text = value.Zip; - LiteralState.Text = value.State; - LiteralCountry.Text = value.Country; - LiteralPhone.Text = value.Phone; - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx deleted file mode 100644 index c6b4a27..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx +++ /dev/null @@ -1,81 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AddressUI.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AddressUI" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
First Name: - - -
Last Name: - - -
Street Address: - - -
- -
City: - - -
State / Province: - - - - - - -
- - California - New York - Texas - - Postal Code: - - -
-
Country: - - USA - Canada - Japan - -
Telephone Number: - - -
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs deleted file mode 100644 index ea5a075..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs +++ /dev/null @@ -1,100 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Accounts; - - /// - /// Summary description for AddressUI. - /// - public class AddressUI : System.Web.UI.UserControl - { - protected System.Web.UI.WebControls.TextBox txtFirstName; - protected System.Web.UI.WebControls.RequiredFieldValidator valFirstName; - protected System.Web.UI.WebControls.TextBox txtLastName; - protected System.Web.UI.WebControls.RequiredFieldValidator valLastName; - protected System.Web.UI.WebControls.TextBox txtAddress1; - protected System.Web.UI.WebControls.RequiredFieldValidator valAddress1; - protected System.Web.UI.WebControls.TextBox txtAddress2; - protected System.Web.UI.WebControls.TextBox txtCity; - protected System.Web.UI.WebControls.RequiredFieldValidator valCity; - protected System.Web.UI.WebControls.DropDownList listState; - protected System.Web.UI.WebControls.TextBox txtZip; - protected System.Web.UI.WebControls.RequiredFieldValidator valZip; - protected System.Web.UI.WebControls.DropDownList listCountry; - protected System.Web.UI.WebControls.TextBox txtPhone; - protected System.Web.UI.WebControls.RequiredFieldValidator valPhone; - - public Address Address - { - get - { - Address address = new Address(); - - address.FirstName = txtFirstName.Text ; - address.LastName = txtLastName.Text; - address.Address1 = txtAddress1.Text; - address.Address2 = txtAddress2.Text; - address.City = txtCity.Text; - address.Zip = txtZip.Text; - address.State = listState.SelectedItem.Value; - address.Country = listCountry.SelectedItem.Value; - address.Phone = txtPhone.Text; - - return address; - } - set - { - txtFirstName.Text = value.FirstName; - txtLastName.Text = value.LastName; - txtAddress1.Text = value.Address1; - txtAddress2.Text = value.Address2; - txtCity.Text = value.City; - txtZip.Text = value.Zip; - SetSelectedItem(listState, value.State); - SetSelectedItem(listCountry, value.Country); - txtPhone.Text = value.Phone; - } - } - - private void SetSelectedItem(DropDownList list, string value) - { - ListItem item = list.Items.FindByValue(value); - if (item != null) - { - item.Selected = true; - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx deleted file mode 100644 index a14ca3f..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx +++ /dev/null @@ -1,16 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Account" Src="AccountUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="NewAccount.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.NewAccount" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -
You are a new customer : sign up for - an account. -
- - - - - -
  -
-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs deleted file mode 100644 index ce5b363..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de NewAccount. - /// - public class NewAccount : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Literal LiteralMessage; - protected System.Web.UI.WebControls.Button ButtonCreateNewAccount; - protected System.Web.UI.WebControls.Button ButtonCancel; - protected NPetshop.Web.UserControls.Accounts.AccountUI ucAccount; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - private void ButtonCreateNewAccount_Click(object sender, System.EventArgs e) - { - if (Page.IsValid) - { - AccountAction action = new AccountAction(Context); - action.Account = ucAccount.Account; - - try - { - action.CreateNewAccount(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - catch(NPetshop.Presentation.Exceptions.LoginAlreadyExistsException) - { - LiteralMessage.Text = "Login already exist."; - } - } - } - - private void ButtonCancel_Click(object sender, System.EventArgs e) - { - AbstractWebAction action = new ShowStartPageAction(Context); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - this.ButtonCreateNewAccount.Click += new System.EventHandler(this.ButtonCreateNewAccount_Click); - this.ButtonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx deleted file mode 100644 index 6eb46f8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx +++ /dev/null @@ -1,39 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SignIn.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.SignIn" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Are you a new user? - Register -

- Or a registered user? -

- - - - - - - - - - - - -
Login : - - -
Password : - - -
- -
- -

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs deleted file mode 100644 index 7ba30a8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs +++ /dev/null @@ -1,86 +0,0 @@ - -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de SigneOn. - /// - public class SignIn : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.RequiredFieldValidator valUserId; - protected System.Web.UI.WebControls.TextBox TextBoxLogin; - protected System.Web.UI.WebControls.TextBox TextBoxPassword; - protected System.Web.UI.WebControls.Literal LiteralMessage; - protected System.Web.UI.WebControls.Button ButtonLogIn; - protected System.Web.UI.WebControls.Button ButtonRegister; - protected System.Web.UI.WebControls.LinkButton LinkbuttonRegister; - protected System.Web.UI.WebControls.RequiredFieldValidator valPassword; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - private void LinkbuttonRegister_Click(object sender, System.EventArgs e) - { - AccountAction action = new AccountAction(Context); - action.RegisterUser(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - private void ButtonLogIn_Click(object sender, System.EventArgs e) - { - if (Page.IsValid) - { - AccountAction action = new AccountAction(Context); - action.Account.Login = TextBoxLogin.Text; - action.Account.Password = TextBoxPassword.Text; - - action.TryToAuthenticate(); - - if (action.Account != null) - { - this.CurrentController.NextView = action.NextViewToDisplay; - } - else - { - LiteralMessage.Text = "Invalid login or password. SignIn failed."; - } - } - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.ButtonLogIn.Click += new System.EventHandler(this.ButtonLogIn_Click); - this.LinkbuttonRegister.Click += new System.EventHandler(this.LinkbuttonRegister_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx deleted file mode 100644 index 604cad1..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx +++ /dev/null @@ -1,13 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SignOut.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.SignOut" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
-

You are signed out.

-

Thank you for shopping.

-

- You may - SIGN IN again. -

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs deleted file mode 100644 index d96e4e2..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de SigneOut. - /// - public class SignOut : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton LinkButtonSignIn; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - private void LinkButtonSignIn_Click(object sender, System.EventArgs e) - { - AccountAction action = new AccountAction(Context); - action.SignIn(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonSignIn.Click += new System.EventHandler(this.LinkButtonSignIn_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx b/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx deleted file mode 100644 index 7dc2521..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx +++ /dev/null @@ -1 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AdviceBanner.ascx.cs" Inherits="NPetshop.Web.UserControls.AdviceBanner" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> diff --git a/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.cs deleted file mode 100644 index 7a4f209..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de AdviceBanner. - /// - public class AdviceBanner : System.Web.UI.UserControl - { - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/AdviceBanner.ascx.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx deleted file mode 100644 index 1c3a855..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx +++ /dev/null @@ -1,24 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Search" Src="Catalog/Search.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Banner.ascx.cs" Inherits="NPetshop.Web.UserControls.Banner" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - -
- - SIGN OUT | - SIGN IN -   | - MY ACCOUNT -   | - - - |  - - -
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.cs deleted file mode 100644 index 4714509..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.cs +++ /dev/null @@ -1,92 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de Banner. - /// - public class Banner : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton LinkbuttonCart; - protected System.Web.UI.HtmlControls.HtmlImage Img2; - protected System.Web.UI.WebControls.LinkButton LinkbuttonSignOut; - protected System.Web.UI.WebControls.LinkButton LinkbuttonSignIn; - protected System.Web.UI.WebControls.LinkButton LinkbuttonAccount; - protected System.Web.UI.HtmlControls.HtmlImage Img1; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - private void LinkbuttonSignIn_Click(object sender, System.EventArgs e) - { - AccountAction action = new AccountAction(Context); - action.SignIn(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - private void LinkbuttonSignOut_Click(object sender, System.EventArgs e) - { - AccountAction action = new AccountAction(Context); - action.SignOut(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - private void LinkbuttonAccount_Click(object sender, System.EventArgs e) - { - AccountAction action = new AccountAction(Context); - action.EditAccount(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - private void LinkbuttonCart_Click(object sender, System.EventArgs e) - { - ShoppinAction action = new ShoppinAction(Context); - action.ShowShoppingCart(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - protected override void OnPreRender(System.EventArgs e) - { - bool userLoggedIn = (this.WebLocalSingleton.CurrentUser!= null); - - LinkbuttonSignIn.Visible = ! userLoggedIn; - LinkbuttonSignOut.Visible = userLoggedIn; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkbuttonSignOut.Click += new System.EventHandler(this.LinkbuttonSignOut_Click); - this.LinkbuttonSignIn.Click += new System.EventHandler(this.LinkbuttonSignIn_Click); - this.LinkbuttonAccount.Click += new System.EventHandler(this.LinkbuttonAccount_Click); - this.LinkbuttonCart.Click += new System.EventHandler(this.LinkbuttonCart_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Banner.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx deleted file mode 100644 index 182fc62..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx +++ /dev/null @@ -1,11 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Bill.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Bill" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="BillUI" Src="BillUI.ascx" %> - - -
- Order Complete! -

- -

diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.cs deleted file mode 100644 index b784be5..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.cs +++ /dev/null @@ -1,51 +0,0 @@ -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for Bill. - /// - public class Bill : NPetshop.Presentation.UserControl - { - protected NPetshop.Web.UserControls.Billing.BillUI ucBill; - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - public override void DataBind() - { - ucBill.Order = this.WebLocalSingleton.CurrentOrder; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Bill.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx deleted file mode 100644 index eabb520..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx +++ /dev/null @@ -1,78 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="../Accounts/AddressUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="BillUI.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.BillUI" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="AddressStatic" Src="../Accounts/AddressStatic.ascx" %> -
- - Payment Information - - - - - - - - - - - - - -
Card Type::
Card Number:
Card Expiration:
-
-
- - Billing Address - -
-
- - Shipping Address - -
-
- - Status - - - - - - - - - - - - - -
Date:
Items: - - - - - - - - - - - - - - - - - - - - - - - -
LineItemProductPriceQuantitySubtotal
<%# DataBinder.Eval(Container.DataItem, "LineNumber") %><%# DataBinder.Eval(Container.DataItem, "Item.Id") %><%# DataBinder.Eval(Container.DataItem, "Item.Product.Id") %><%# DataBinder.Eval(Container.DataItem, "Item.ListPrice", "{0:c}") %><%# DataBinder.Eval(Container.DataItem, "Quantity") %><%# DataBinder.Eval(Container.DataItem, "Total", "{0:c}") %>
-
Total: - - - -
-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs deleted file mode 100644 index 3544fb3..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Billing; - - /// - /// Summary description for BillUI. - /// - public class BillUI : System.Web.UI.UserControl - { - protected System.Web.UI.WebControls.Literal LiteralCardNumber; - protected System.Web.UI.WebControls.Literal LiteralCardExpiration; - protected System.Web.UI.WebControls.Literal LiteralCardType; - protected System.Web.UI.WebControls.Literal LiteralOrderDate; - protected NPetshop.Web.UserControls.Accounts.AddressStatic billingAddress; - protected System.Web.UI.WebControls.Literal LiteralTotal; - protected System.Web.UI.WebControls.Repeater RepeaterItems; - protected NPetshop.Web.UserControls.Accounts.AddressStatic shippingAddress; - - public Order Order - { - set - { - LiteralCardNumber.Text = value.CreditCard.CardNumber; - LiteralCardExpiration.Text = value.CreditCard.CardExpiration; - LiteralCardType.Text = value.CreditCard.CardType; - - LiteralOrderDate.Text = value.OrderDate.ToShortDateString(); - - billingAddress.Address = value.BillingAddress; - shippingAddress.Address = value.ShippingAddress; - - RepeaterItems.DataSource = value.LineItems; - RepeaterItems.DataBind(); - LiteralTotal.Text = value.TotalPrice.ToString("c"); - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx deleted file mode 100644 index ffa0c81..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx +++ /dev/null @@ -1,19 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="BillUI" Src="BillUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Confirmation.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Confirmation" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Please confirm the information below and then press continue... -

- - - - - -
- -
-

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs deleted file mode 100644 index 6be1503..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs +++ /dev/null @@ -1,62 +0,0 @@ -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for Confirmation. - /// - public class Confirmation : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Button ButtonContinue; - protected NPetshop.Web.UserControls.Billing.BillUI ucBill; - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - public override void DataBind() - { - ucBill.Order = this.WebLocalSingleton.CurrentOrder; - } - - - private void ButtonContinue_Click(object sender, System.EventArgs e) - { - BillinAction action = new BillinAction(this.Context); - action.ConfirmOrder(this.WebLocalSingleton.CurrentOrder); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.ButtonContinue.Click += new System.EventHandler(this.ButtonContinue_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx deleted file mode 100644 index 90b4629..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx +++ /dev/null @@ -1,91 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Payment.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Payment" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="../Accounts/AddressUI.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Payment Information -

-

- - Credit Card - - - - - - - - - - - - - -
Credit Card Type: - - Visa - MasterCard - American Express -
Card Number: - -
Expiration Date: - - - - - - - -
Month: - - 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 - Year: - - 2004 - 2005 - 2006 - 2007 - 2008 - -
-
-
-
- - Billing Address - -
-
- - Shipping Address - - - - - -
- Ship to billing address
-
- - - - - - - -
 
-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.cs deleted file mode 100644 index 05bff37..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.cs +++ /dev/null @@ -1,99 +0,0 @@ -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Billing; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for Order. - /// - public class Payment : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.RequiredFieldValidator valCardNumber; - protected System.Web.UI.WebControls.DropDownList dropdownlistCardType; - protected System.Web.UI.WebControls.TextBox textboxCardNumber; - protected System.Web.UI.WebControls.DropDownList dropdownlistMonth; - protected System.Web.UI.WebControls.DropDownList dropdownlistYear; - protected System.Web.UI.WebControls.CheckBox checkboxShipBilling; - protected System.Web.UI.WebControls.Button ButtonSubmit; - protected NPetshop.Web.UserControls.Accounts.AddressUI ucBillingAddress; - - public NPetshop.Domain.Billing.Order Order - { - get - { - NPetshop.Domain.Billing.Order order = new NPetshop.Domain.Billing.Order(); - - order.InitOrder(this.WebLocalSingleton.CurrentUser, - this.WebLocalSingleton.CurrentShoppingCart, - ucBillingAddress.Address); - - CreditCard creditCard = new CreditCard(); - creditCard.CardExpiration = dropdownlistMonth.SelectedValue +"/"+ dropdownlistYear.SelectedValue; - creditCard.CardNumber = textboxCardNumber.Text; - creditCard.CardType = dropdownlistCardType.SelectedValue; - order.CreditCard = creditCard; - - return order; - } - set - { - - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - public override void DataBind() - { - if (this.WebLocalSingleton.CurrentOrder == null) - { - ucBillingAddress.Address = this.WebLocalSingleton.CurrentUser.Address; - } - else - { - ucBillingAddress.Address = this.WebLocalSingleton.CurrentOrder.BillingAddress; - } - } - - private void ButtonSubmit_Click(object sender, System.EventArgs e) - { - BillinAction action = new BillinAction(this.Context); - action.NewOrder(this.Order, checkboxShipBilling.Checked); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.ButtonSubmit.Click += new System.EventHandler(this.ButtonSubmit_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Payment.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx deleted file mode 100644 index 873cc75..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx +++ /dev/null @@ -1,20 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Shipping.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Shipping" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="../Accounts/AddressUI.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
-

-

- - Shipping Address - -
- - - - - -
-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs deleted file mode 100644 index f291df6..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for Shipping. - /// - public class Shipping : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Button ButtonBack; - protected System.Web.UI.WebControls.Button ButtonSubmit; - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - private void ButtonBack_Click(object sender, System.EventArgs e) - { - this.CurrentController.NextView = WebViews.PAYMENT; - } - - private void ButtonSubmit_Click(object sender, System.EventArgs e) - { - - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.ButtonBack.Click += new System.EventHandler(this.ButtonBack_Click); - this.ButtonSubmit.Click += new System.EventHandler(this.ButtonSubmit_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx deleted file mode 100644 index 578a0c7..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx +++ /dev/null @@ -1,48 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Category.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Category" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> - - -
- Category -

- - - - - - - - - - - - - - - - - -
Product IDNameDescription
- <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Id %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Name %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Description %> -
- -
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.cs deleted file mode 100644 index aceda71..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.cs +++ /dev/null @@ -1,114 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Collections; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using IBatisNet.Common.Pagination; - using NPetshop.Domain.Catalog; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for ProductsByCategory. - /// - public class Category : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Repeater RepeaterProduct; - protected System.Web.UI.WebControls.LinkButton LinkbuttonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.Label Label1; - - private void Page_Load(object sender, System.EventArgs e) - { -// if (this.IsRequestCurrentView) -// { -// string categoryName = (string)WebLocalSingleton.GetInstance(Context).CurrentAction.Data[DataViews.CATEGORY_NAME]; -// -// Label1.Text = categoryName; -// } - } - - public override void DataBind() - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - NPetshop.Domain.Catalog.Category category = ((NPetshop.Domain.Catalog.Product) productList[0]).Category; - - RepeaterProduct.DataSource = productList; - RepeaterProduct.DataBind(); - - if (productList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - LinkbuttonNext.CommandArgument = category.Id; - } - else - { - LinkbuttonNext.Visible = false; - } - if (productList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - LinkbuttonPrev.CommandArgument = category.Id; - } - else - { - LinkbuttonPrev.Visible = false; - } - - Label1.Text = category.Name; - } - - private void RepeaterProduct_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - CatalogAction action = new CatalogAction(Context); - action.ShowItemsByProduct(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - private void LinkbuttonPrev_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - productList.PreviousPage(); - this.CurrentController.NextView = WebViews.PRODUCTS_BY_CATEGORY; - } - - private void LinkbuttonNext_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - productList.NextPage(); - this.CurrentController.NextView = WebViews.PRODUCTS_BY_CATEGORY; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.RepeaterProduct.ItemCommand += new System.Web.UI.WebControls.RepeaterCommandEventHandler(this.RepeaterProduct_ItemCommand); - this.LinkbuttonNext.Command += new System.Web.UI.WebControls.CommandEventHandler(this.LinkbuttonNext_Command); - this.LinkbuttonPrev.Command += new System.Web.UI.WebControls.CommandEventHandler(this.LinkbuttonPrev_Command); - - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Category.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx deleted file mode 100644 index 211a672..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx +++ /dev/null @@ -1,38 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Item.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Item" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Product -

- - - - - -
- - - - - - - - - - - - - - - - - - - -
Name :
Description :
Price :
Quantity :
-

Add to cart

-
-

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.cs deleted file mode 100644 index 4579a4c..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.cs +++ /dev/null @@ -1,76 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Catalog; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - /// - /// Description rsume de Item. - /// - public class Item : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Label LabelDescription; - protected System.Web.UI.WebControls.Label LabelName; - protected System.Web.UI.WebControls.Label LabelPrice; - protected System.Web.UI.WebControls.LinkButton LinkButtonAddToCart; - protected System.Web.UI.WebControls.Label LabelProduct; - protected System.Web.UI.WebControls.Image ImagePhoto; - protected System.Web.UI.WebControls.Label LabelQty; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public override void DataBind() - { - NPetshop.Domain.Catalog.Item item = this.WebLocalSingleton.CurrentAction.Data[DataViews.ITEM] as NPetshop.Domain.Catalog.Item; - if (item != null) - { - LabelProduct.Text = item.Product.Name; - LabelDescription.Text = item.Attribute1; - LabelPrice.Text = item.ListPrice.ToString(); - LabelQty.Text = item.Quantity.ToString(); - LabelName.Text = item.Id; - ImagePhoto.ImageUrl = "~/@images/pets/"+item.Photo; - LinkButtonAddToCart.CommandArgument = item.Id; - } - } - - private void LinkButtonAddToCart_Click(object sender, CommandEventArgs e) - { - ShoppinAction action = new ShoppinAction(Context); - action.AddItemToCart(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonAddToCart.Command += new System.Web.UI.WebControls.CommandEventHandler(this.LinkButtonAddToCart_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Item.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx deleted file mode 100644 index dd48ea0..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx +++ /dev/null @@ -1,50 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="ItemList.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.ItemList" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -
Product -

- - - - - - - - - - - - - - - - - - - -
Item IDDescriptionList Price 
- - <%# ((NPetshop.Domain.Catalog.Item)Container.DataItem).Id %> - - <%# ((NPetshop.Domain.Catalog.Item)Container.DataItem).Product.Description %> - <%# DataBinder.Eval(Container.DataItem, "ListPrice", "{0:c}") %> - - - Add to cart - -
- -
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.cs deleted file mode 100644 index 2aa2501..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.cs +++ /dev/null @@ -1,97 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Collections; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using IBatisNet.Common.Pagination; - using NPetshop.Domain.Catalog; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de Product. - /// - public class ItemList : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton LinkbuttonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.Repeater RepeaterItems; - protected System.Web.UI.WebControls.Label LabelProduct; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public override void DataBind() - { - NPetshop.Domain.Catalog.Product product = this.WebLocalSingleton.CurrentAction.Data[DataViews.PRODUCT] as NPetshop.Domain.Catalog.Product; - IPaginatedList itemList = this.WebLocalSingleton.CurrentList as IPaginatedList; - - LabelProduct.Text = product.Name; - RepeaterItems.DataSource = itemList; - RepeaterItems.DataBind(); - - if (itemList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - LinkbuttonNext.CommandArgument = product.Id; - } - else - { - LinkbuttonNext.Visible = false; - } - if (itemList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - LinkbuttonPrev.CommandArgument = product.Id; - } - else - { - LinkbuttonPrev.Visible = false; - } - } - - protected void RepeaterItems_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - if (e.CommandName == "ShowItem") - { - CatalogAction action = new CatalogAction(Context); - action.ShowItem(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - else if (e.CommandName == "AddToCart") - { - ShoppinAction action = new ShoppinAction(Context); - action.AddItemToCart(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ItemList.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx deleted file mode 100644 index 0eb0949..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx +++ /dev/null @@ -1 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="MyList.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.MyList" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs deleted file mode 100644 index 0ec923c..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de MyList. - /// - public class MyList : System.Web.UI.UserControl - { - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx deleted file mode 100644 index da3b92a..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx +++ /dev/null @@ -1,50 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Product.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Product" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -
Product -

- - - - - - - - - - - - - - - - - - - -
Item IDDescriptionList Price 
- - <%# ((NPetshop.Domain.Catalog.Item)Container.DataItem).Id %> - - <%# ((NPetshop.Domain.Catalog.Item)Container.DataItem).Product.Description %> - <%# DataBinder.Eval(Container.DataItem, "ListPrice", "{0:c}") %> - - - Add to cart - -
- -
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.cs deleted file mode 100644 index 902cd7e..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.cs +++ /dev/null @@ -1,96 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Collections; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using IBatisNet.Common.Pagination; - using NPetshop.Domain.Catalog; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de Product. - /// - public class Product : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Repeater RepeaterItem; - protected System.Web.UI.WebControls.LinkButton LinkbuttonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.Label LabelProduct; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public override void DataBind() - { - NPetshop.Domain.Catalog.Product product = this.WebLocalSingleton.CurrentAction.Data[DataViews.PRODUCT] as NPetshop.Domain.Catalog.Product; - IPaginatedList paginatedList = this.WebLocalSingleton.CurrentList as IPaginatedList; - - LabelProduct.Text = product.Name; - RepeaterItem.DataSource = paginatedList; - RepeaterItem.DataBind(); - - if (paginatedList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - LinkbuttonNext.CommandArgument = product.Id; - } - else - { - LinkbuttonNext.Visible = false; - } - if (paginatedList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - LinkbuttonPrev.CommandArgument = product.Id; - } - else - { - LinkbuttonPrev.Visible = false; - } - } - - protected void RepeaterItem_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - if (e.CommandName == "ShowItem") - { - CatalogAction action = new CatalogAction(Context); - action.ShowItem(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - else if (e.CommandName == "AddToCart") - { - ShoppinAction action = new ShoppinAction(Context); - action.AddItemToCart(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Product.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx deleted file mode 100644 index e69b5a9..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx +++ /dev/null @@ -1,48 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="ProductList.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.ProductList" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Category -

- - - - - - - - - - - - - - - - - -
Product IDNameDescription
- <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Id %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Name %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Description %> -
- -
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.cs deleted file mode 100644 index 37bd4dd..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.cs +++ /dev/null @@ -1,112 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Collections; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using IBatisNet.Common.Pagination; - using NPetshop.Domain.Catalog; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for ProductsByCategory. - /// - public class ProductList : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton LinkbuttonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.Label LabelCategory; - protected System.Web.UI.WebControls.Repeater RepeaterProducts; - - private void Page_Load(object sender, System.EventArgs e) - { -// if (this.IsRequestCurrentView) -// { -// string categoryName = (string)WebLocalSingleton.GetInstance(Context).CurrentAction.Data[DataViews.CATEGORY_NAME]; -// -// Label1.Text = categoryName; -// } - } - - public override void DataBind() - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - NPetshop.Domain.Catalog.Category category = ((NPetshop.Domain.Catalog.Product) productList[0]).Category; - - RepeaterProducts.DataSource = productList; - RepeaterProducts.DataBind(); - - if (productList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - LinkbuttonNext.CommandArgument = category.Id; - } - else - { - LinkbuttonNext.Visible = false; - } - if (productList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - LinkbuttonPrev.CommandArgument = category.Id; - } - else - { - LinkbuttonPrev.Visible = false; - } - - LabelCategory.Text = category.Name; - } - - protected void RepeaterProducts_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - CatalogAction action = new CatalogAction(Context); - action.ShowItemsByProduct(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - private void LinkbuttonPrev_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - productList.PreviousPage(); - this.CurrentController.NextView = WebViews.PRODUCTS_BY_CATEGORY; - } - - private void LinkbuttonNext_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - productList.NextPage(); - this.CurrentController.NextView = WebViews.PRODUCTS_BY_CATEGORY; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.LinkbuttonPrev.Command += new System.Web.UI.WebControls.CommandEventHandler(this.LinkbuttonPrev_Command); - this.LinkbuttonNext.Command += new System.Web.UI.WebControls.CommandEventHandler(this.LinkbuttonNext_Command); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/ProductList.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx deleted file mode 100644 index 49e3464..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx +++ /dev/null @@ -1,4 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Search.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Search" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -SEARCH diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.cs deleted file mode 100644 index 39a3220..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.cs +++ /dev/null @@ -1,60 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Catalog; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de Search. - /// - public class Search : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton LinkButtonSearch; - protected System.Web.UI.WebControls.RequiredFieldValidator RequiredFieldValidatorKeyword; - protected System.Web.UI.WebControls.TextBox TextBoxSearch; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - private void LinkButtonSearch_Click(object sender, System.EventArgs e) - { - string keywords = TextBoxSearch.Text; - - CatalogAction action = new CatalogAction(Context); - action.SearchProducts(keywords); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonSearch.Click += new System.EventHandler(this.LinkButtonSearch_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/Search.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx deleted file mode 100644 index e173594..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx +++ /dev/null @@ -1,56 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SearchProduct.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.SearchProduct" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Presentation.Controls" Assembly="NPetshop.Presentation" %> - - -
- Search result for keywords : - - -

- - - - - - - - - - - - - - - - - -
Product IDNameDescription
- <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Id %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Name %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Description %> -
- - -
No product found ! -
-
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs deleted file mode 100644 index 40538f6..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs +++ /dev/null @@ -1,102 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using IBatisNet.Common.Pagination; - using NPetshop.Domain.Catalog; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de SearchProduct. - /// - public class SearchProduct : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton LinkbuttonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.Literal LiteralKeywords; - protected NPetshop.Presentation.Controls.ExtendedRepeater RepeaterProduct; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public override void DataBind() - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - //string keywords = this.WebLocalSingleton.CurrentAction.Data[DataViews.SEARCH_KEYWORDS] as string; - - //LiteralKeywords.Text = keywords; - RepeaterProduct.DataSource = productList; - RepeaterProduct.DataBind(); - - if (productList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - //LinkbuttonNext.CommandArgument = keywords; - } - else - { - LinkbuttonNext.Visible = false; - } - if (productList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - //LinkbuttonPrev.CommandArgument = keywords; - } - else - { - LinkbuttonPrev.Visible = false; - } - - } - - protected void RepeaterProduct_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - CatalogAction action = new CatalogAction(Context); - action.ShowItemsByProduct(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - protected void LinkbuttonPrev_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - productList.PreviousPage(); - this.CurrentController.NextView = WebViews.SEARCH_PRODUCTS; - } - - protected void LinkbuttonNext_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.WebLocalSingleton.CurrentList; - productList.NextPage(); - this.CurrentController.NextView = WebViews.SEARCH_PRODUCTS; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx deleted file mode 100644 index 98f408f..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx +++ /dev/null @@ -1,51 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Error.ascx.cs" Inherits="NPetshop.Web.UserControls.Error" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - Error on page -
- Exception : - - -
- Error message : - - Label -
- Inner Error message : - - Label -
- Source : - - Label -
- View : - - Label -
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.cs deleted file mode 100644 index 9ca01ca..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de Error. - /// - public class Error : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Label LabelException; - protected System.Web.UI.WebControls.Label LabelErrorMessage; - protected System.Web.UI.WebControls.Label LabelSourceError; - protected System.Web.UI.WebControls.Label LabelInnerErrorMessage; - protected System.Web.UI.WebControls.Label LabelViewOnError; - - private void Page_Load(object sender, System.EventArgs e) - { - LabelException.Text = HttpContext.Current.Items["stackTrace"].ToString(); - LabelErrorMessage.Text = HttpContext.Current.Items["messageError"].ToString(); - LabelSourceError.Text = HttpContext.Current.Items["sourceError"].ToString(); - LabelViewOnError.Text = HttpContext.Current.Items["errorView"].ToString(); - LabelInnerErrorMessage.Text = HttpContext.Current.Items["innerMessageError"].ToString(); - - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Error.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx deleted file mode 100644 index e01be00..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx +++ /dev/null @@ -1,2 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Footer.ascx.cs" Inherits="NPetshop.Web.UserControls.Footer" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -
2004 Gilles Bayon. All rights reserved.
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.cs deleted file mode 100644 index ab3646c..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de Footer. - /// - public class Footer : System.Web.UI.UserControl - { - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Footer.ascx.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx deleted file mode 100644 index 581eb06..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx +++ /dev/null @@ -1,8 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Header.ascx.cs" Inherits="NPetshop.Web.UserControls.Header" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - -

-
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.cs deleted file mode 100644 index 5fcc6da..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.cs +++ /dev/null @@ -1,45 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de Header. - /// - public class Header : System.Web.UI.UserControl - { - protected System.Web.UI.HtmlControls.HtmlImage space0; - protected System.Web.UI.HtmlControls.HtmlImage space1; - protected System.Web.UI.HtmlControls.HtmlImage title; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Header.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx deleted file mode 100644 index 889fa14..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx +++ /dev/null @@ -1,67 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Presentation.Controls" Assembly="NPetshop.Presentation" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Cart.ascx.cs" Inherits="NPetshop.Web.UserControls.Shopping.Cart" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -
- Shopping Cart -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 ItemProductIn StockPriceQuantitySubtotal
- - Remove - - - - <%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Id %> - - <%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Product.Name %><%# DataBinder.Eval(Container.DataItem, "IsInStock") %><%# DataBinder.Eval(Container.DataItem, "Item.ListPrice", "{0:c}") %> - - - <%# DataBinder.Eval(Container.DataItem, "Total", "{0:c}") %>
- - Total:<%= Total.ToString("c") %>
- - -

No item in cart ! - - - - - - - - - - -
<< PrevNext >>
Proceed to Checkout >>
-

diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs deleted file mode 100644 index 49b778e..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs +++ /dev/null @@ -1,151 +0,0 @@ -namespace NPetshop.Web.UserControls.Shopping -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Shopping; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de Cart. - /// - public class Cart : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Literal LiteralTotal; - protected NPetshop.Presentation.Controls.ExtendedRepeater RepeaterCart; - protected System.Web.UI.WebControls.LinkButton LinkButtonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.LinkButton LinkbuttonProceedCheckout; - private ShoppingCart _cart = null; - - //Property to show total - protected decimal Total - { - get { return _cart.Total; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - _cart = this.WebLocalSingleton.CurrentShoppingCart; - } - - public override void DataBind() - { - bool empty = ((_cart == null) || _cart.IsEmpty); - if (! empty) - { - RepeaterCart.DataSource = _cart; - RepeaterCart.DataBind(); - - if (_cart.Lines.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - } - else - { - LinkbuttonNext.Visible = false; - } - if (_cart.Lines.IsPreviousPageAvailable) - { - LinkButtonPrev.Visible = true; - } - else - { - LinkButtonPrev.Visible = false; - } - } - else - { - LinkbuttonNext.Visible = false; - LinkButtonPrev.Visible = false; - LinkbuttonProceedCheckout.Visible = false; - } - } - - protected void QuantityChanged(object o, System.EventArgs e) - { - Page.Validate(); - if (Page.IsValid) - { - TextBox textboxQuantity = o as System.Web.UI.WebControls.TextBox; - LinkButton linkButtonRemove = textboxQuantity.Parent.FindControl("LinkButtonRemove") as LinkButton; - - int quantity = int.Parse(textboxQuantity.Text); - string itemId = linkButtonRemove.CommandArgument.ToString(); - - ShoppinAction action = new ShoppinAction(this.Context); - action.UpdateQuantityByItemId(itemId, quantity); - } - } - - protected void RepeaterCart_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - if (e.CommandName == "RemoveItem") - { - ShoppinAction action = new ShoppinAction(this.Context); - action.RemoveItemFromCart(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - else if (e.CommandName == "Update") - { - this.CurrentController.NextView = WebViews.CART; - } - else if (e.CommandName == "ShowItem") - { - CatalogAction action = new CatalogAction(this.Context); - action.ShowItem(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - } - - private void LinkButtonPrev_Click(object sender, System.EventArgs e) - { - _cart.Lines.PreviousPage(); - this.CurrentController.NextView = WebViews.CART; - } - - private void LinkbuttonNext_Click(object sender, System.EventArgs e) - { - _cart.Lines.NextPage(); - this.CurrentController.NextView = WebViews.CART; - } - - private void LinkbuttonProceedCheckout_Click(object sender, System.EventArgs e) - { - ShoppinAction action = new ShoppinAction(this.Context); - action.ProceedCheckout(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonPrev.Click += new System.EventHandler(this.LinkButtonPrev_Click); - this.LinkbuttonNext.Click += new System.EventHandler(this.LinkbuttonNext_Click); - this.LinkbuttonProceedCheckout.Click += new System.EventHandler(this.LinkbuttonProceedCheckout_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx b/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx deleted file mode 100644 index 45176bd..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx +++ /dev/null @@ -1,53 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Checkout.ascx.cs" Inherits="NPetshop.Web.UserControls.Shopping.Checkout" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Presentation.Controls" Assembly="NPetshop.Presentation" %> - - -
- Checkout Summary -

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Item IDProductIn StockPriceQuantitySubtotal
<%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Id %><%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Product.Name %><%# DataBinder.Eval(Container.DataItem, "IsInStock") %><%# DataBinder.Eval(Container.DataItem, "Item.ListPrice", "{0:c}") %> - <%# DataBinder.Eval(Container.DataItem, "Quantity") %> - <%# DataBinder.Eval(Container.DataItem, "Total", "{0:c}") %>
Total:<%= Total.ToString("c") %>
- - -

No item in cart ! - - - - - - - - - - -
<< PrevNext >>
Continue Checkout >>
-

diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs deleted file mode 100644 index bd548e2..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs +++ /dev/null @@ -1,114 +0,0 @@ -namespace NPetshop.Web.UserControls.Shopping -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Shopping; - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for Checkout. - /// - public class Checkout : NPetshop.Presentation.UserControl - { - protected NPetshop.Presentation.Controls.ExtendedRepeater RepeaterCart; - protected System.Web.UI.WebControls.LinkButton LinkButtonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.LinkButton LinkbuttonContinueCheckout; - private ShoppingCart _cart = null; - - //Property to show total - protected decimal Total - { - get { return _cart.Total; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - _cart = this.WebLocalSingleton.CurrentShoppingCart; - } - - public override void DataBind() - { - bool empty = ((_cart == null) || _cart.IsEmpty); - if (! empty) - { - RepeaterCart.DataSource = _cart; - RepeaterCart.DataBind(); - - if (_cart.Lines.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - } - else - { - LinkbuttonNext.Visible = false; - } - if (_cart.Lines.IsPreviousPageAvailable) - { - LinkButtonPrev.Visible = true; - } - else - { - LinkButtonPrev.Visible = false; - } - } - else - { - LinkbuttonNext.Visible = false; - LinkButtonPrev.Visible = false; - LinkbuttonContinueCheckout.Visible = false; - } - } - private void LinkbuttonContinueCheckout_Click(object sender, System.EventArgs e) - { - ShoppinAction action = new ShoppinAction(this.Context); - action.ContinueCheckout(); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - private void LinkButtonPrev_Click(object sender, System.EventArgs e) - { - _cart.Lines.PreviousPage(); - this.CurrentController.NextView = WebViews.CART; - } - - private void LinkbuttonNext_Click(object sender, System.EventArgs e) - { - _cart.Lines.NextPage(); - this.CurrentController.NextView = WebViews.CART; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.LinkButtonPrev.Click += new System.EventHandler(this.LinkButtonPrev_Click); - this.LinkbuttonNext.Click += new System.EventHandler(this.LinkbuttonNext_Click); - this.LinkbuttonContinueCheckout.Click += new System.EventHandler(this.LinkbuttonContinueCheckout_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx b/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx deleted file mode 100644 index 7229f0b..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx +++ /dev/null @@ -1,40 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SideBar.ascx.cs" Inherits="NPetshop.Web.UserControls.SideBar" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - -
- Fish
-   Saltwater
-   Freshwater

-
- Dogs
-   Poodle
-   Greyhounds

-
- Reptiles
-   Iguanas
-   Snakes
-   Turtles

-
- Cats
-   Manx
-   Persian

-
- Birds
-   Eclectus
-   African Greys
-   Macaws
-

-
-
- -
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.cs deleted file mode 100644 index dc6d73d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.cs +++ /dev/null @@ -1,57 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de SideBar. - /// - public class SideBar : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton Linkbutton1; - protected System.Web.UI.WebControls.LinkButton Linkbutton2; - protected System.Web.UI.WebControls.LinkButton Linkbutton3; - protected System.Web.UI.WebControls.LinkButton Linkbutton4; - protected System.Web.UI.WebControls.LinkButton LinkbuttonFish; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public void LinkButton_Command(object sender, CommandEventArgs e) - { - CatalogAction action = new CatalogAction(Context); - action.ShowProductsByCategory(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/SideBar.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx b/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx deleted file mode 100644 index d7a2057..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx +++ /dev/null @@ -1,26 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="SideBar" Src="SideBar.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="StartUp.ascx.cs" Inherits="NPetshop.Web.UserControls.StartUp" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> - - - - - -
- - - - Birds - Fish - Dogs - Reptiles - Cats - Birds - Pet Selection Map -
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.cs deleted file mode 100644 index ea5daf3..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.cs +++ /dev/null @@ -1,66 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; // def AbstractWebAction - using NPetshop.Presentation.UserActions; - - /// - /// Summary description for Initial. - /// - public class StartUp : NPetshop.Presentation.UserControl - { - protected System.Web.UI.HtmlControls.HtmlImage Img1; - protected System.Web.UI.WebControls.HyperLink HyperLink1; - protected System.Web.UI.WebControls.LinkButton LinkButton1; - - private void Page_Load(object sender, System.EventArgs e) - { - if (IsPostBack && (Request.Form["__EVENTTARGET"] == "BODY_CONTROL")) - { - CatalogAction action = new CatalogAction(this.Context); - try - { - action.ShowProductsByCategory(Request.Form["__EVENTARGUMENT"]); - this.CurrentController.NextView = action.NextViewToDisplay; - } - catch - { - this.CurrentController.NextView = WebViews.ERROR; - } - } - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - -// private void Button1_Click(object sender, System.EventArgs e) -// { -// AbstractWebAction action = new TestAction(Context); -// this.CurrentRouter.NextView = action.NextViewToDisplay; -// } - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/StartUp.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx b/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx deleted file mode 100644 index e47ab17..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx +++ /dev/null @@ -1,21 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="TopBar.ascx.cs" Inherits="NPetshop.Web.UserControls.TopBar" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - -
- - Fish  |  - Dogs  |  - Reptiles  |  - Cats  |  - Birds - -
diff --git a/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.cs b/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.cs deleted file mode 100644 index 49a474a..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.cs +++ /dev/null @@ -1,57 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de TopBar. - /// - public class TopBar : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.LinkButton LinkbuttonFish; - protected System.Web.UI.WebControls.LinkButton LinkbuttonDogs; - protected System.Web.UI.WebControls.LinkButton LinkbuttonReptiles; - protected System.Web.UI.WebControls.LinkButton LinkbuttonCats; - protected System.Web.UI.WebControls.LinkButton LinkbuttonBirds; - protected System.Web.UI.HtmlControls.HtmlImage Img1; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public void LinkButton_Command(object sender, CommandEventArgs e) - { - CatalogAction action = new CatalogAction(Context); - action.ShowProductsByCategory(e.CommandArgument.ToString()); - this.CurrentController.NextView = action.NextViewToDisplay; - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.resx b/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/TopBar.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop/NPetshop.Web/UserControls/UserControl.cs b/Examples/npetshop/NPetshop.Web/UserControls/UserControl.cs deleted file mode 100644 index 85a4777..0000000 --- a/Examples/npetshop/NPetshop.Web/UserControls/UserControl.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; -using System.Configuration; - -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls -{ - /// - /// Summary description for UserControl. - /// - public class UserControl : System.Web.UI.UserControl - { - protected NPetshop.Web.Index currentRouter; - - public UserControl() - { - } - - /// - /// currentRouter - /// - public NPetshop.Web.Index CurrentRouter - { - get - { - return currentRouter; - } - set - { - this.currentRouter=value; - } - } - - public string GetNetxtView(string forwardName) - { - ControllerConfiguration config = (ControllerConfiguration) Context.Items["ControllerConfig"]; - return config.GetForwardAction( this.CurrentRouter.CurrentView, forwardName); - } - - } -} diff --git a/Examples/npetshop/NPetshop.Web/Web.config b/Examples/npetshop/NPetshop.Web/Web.config deleted file mode 100644 index 9430c8d..0000000 --- a/Examples/npetshop/NPetshop.Web/Web.config +++ /dev/null @@ -1,108 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Web/dao.config b/Examples/npetshop/NPetshop.Web/dao.config deleted file mode 100644 index 8154e80..0000000 --- a/Examples/npetshop/NPetshop.Web/dao.config +++ /dev/null @@ -1,52 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.Web/providers.config b/Examples/npetshop/NPetshop.Web/providers.config deleted file mode 100644 index 74c51b8..0000000 --- a/Examples/npetshop/NPetshop.Web/providers.config +++ /dev/null @@ -1,159 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/Examples/npetshop/NPetshop.sln b/Examples/npetshop/NPetshop.sln deleted file mode 100644 index 7eabfa7..0000000 --- a/Examples/npetshop/NPetshop.sln +++ /dev/null @@ -1,69 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Domain", "NPetshop.Domain\NPetshop.Domain.csproj", "{7D1DA776-6341-43C8-B9C7-8FA344996665}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Persistence", "NPetshop.Persistence\NPetshop.Persistence.csproj", "{CD60B882-160E-4BC9-A580-3A8079A60499}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Service", "NPetshop.Service\NPetshop.Service.csproj", "{AFD8E8A6-C647-4107-B069-DE24C617CFA7}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Presentation", "NPetshop.Presentation\NPetshop.Presentation.csproj", "{182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Web", "http://localhost/NPetshop.Web/NPetshop.Web.csproj", "{C0EE0335-5733-409B-B4E3-59C3B9799731}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Debug.ActiveCfg = Debug|.NET - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Debug.Build.0 = Debug|.NET - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Release.ActiveCfg = Release|.NET - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Release.Build.0 = Release|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Debug.ActiveCfg = Debug|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Debug.Build.0 = Debug|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Release.ActiveCfg = Release|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Release.Build.0 = Release|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Debug.ActiveCfg = Debug|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Debug.Build.0 = Debug|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Release.ActiveCfg = Release|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Release.Build.0 = Release|.NET - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Debug.ActiveCfg = Debug|.NET - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Debug.Build.0 = Debug|.NET - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Release.ActiveCfg = Release|.NET - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Release.Build.0 = Release|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Debug.ActiveCfg = Debug|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Debug.Build.0 = Debug|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Release.ActiveCfg = Release|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(SolutionItems) = postSolution - External-bin\Apache.Avalon.DynamicProxy.dll = External-bin\Apache.Avalon.DynamicProxy.dll - External-bin\ByteFX.MySqlClient.dll = External-bin\ByteFX.MySqlClient.dll - External-bin\Castle.DynamicProxy.dll = External-bin\Castle.DynamicProxy.dll - External-bin\IBatisNet.Common.dll = External-bin\IBatisNet.Common.dll - External-bin\IBatisNet.DataAccess.dll = External-bin\IBatisNet.DataAccess.dll - External-bin\IBatisNet.DataMapper.dll = External-bin\IBatisNet.DataMapper.dll - External-bin\ICSharpCode.SharpZipLib.dll = External-bin\ICSharpCode.SharpZipLib.dll - External-bin\log4net.dll = External-bin\log4net.dll - External-bin\Mono.Security.Protocol.Tls.dll = External-bin\Mono.Security.Protocol.Tls.dll - External-bin\MySql.Data.dll = External-bin\MySql.Data.dll - External-bin\Npgsql.dll = External-bin\Npgsql.dll - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection - GlobalSection(DPCodeReviewSolutionGUID) = preSolution - DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} - EndGlobalSection -EndGlobal diff --git a/Examples/npetshop2/External-bin/Castle.DynamicProxy.dll b/Examples/npetshop2/External-bin/Castle.DynamicProxy.dll deleted file mode 100644 index ef7235fdedcd5c080c7c0d652f073b5655a10187..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69632 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 EC$thG=>Px# diff --git a/Examples/npetshop2/External-bin/Castle.Facilities.TypedFactory.dll b/Examples/npetshop2/External-bin/Castle.Facilities.TypedFactory.dll deleted file mode 100644 index bffd2ee6d83644732380ee9993f32157f7555dbe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7680 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 Le_!zbECc@wBL=!* diff --git a/Examples/npetshop2/External-bin/Castle.MVC.Xml b/Examples/npetshop2/External-bin/Castle.MVC.Xml deleted file mode 100644 index 4e009ed..0000000 --- a/Examples/npetshop2/External-bin/Castle.MVC.Xml +++ /dev/null @@ -1,694 +0,0 @@ - - - - Castle.MVC - - - - - Represents a commands configuration file. - - - - - Key used to retrieve command configuation element. - - - - - Key used to retrieve id view attribute. - - - - - Key used to retrieve id command attribute. - - - - - Initializes an instance of the NodeSettings class using the specified configNode. - - The XmlNode from the configuration file. - - - - Gets the specifed view id to navigate. - - - - - Gets the view name. - - - - - The configuration section handler for the Castle.MVC section of the configuration file. - - - Usage - MVCConfigSettings ctx = ConfigurationSettings.GetConfig("castle/mvc") as MVCConfigSettings; - - - - - Default constructor. - - - - - Factory method that creates a configuration handler for a specific section of - XML in the app.config. - - - The configuration settings in a corresponding parent - configuration section. - - - The configuration context when called from the ASP.NET - configuration system. Otherwise, this parameter is reserved and - is a null reference. - - - The for the section. - - MVCConfigSettings for the section. - - - - Factory method that creates a configuration handler for a specific section of XML in the app.config. - - - The configuration settings in a corresponding parent - configuration section. - - - The configuration context when called from the ASP.NET - configuration system. Otherwise, this parameter is reserved and - is a null reference. - - - The for the section. - - The format provider. - - MVCConfigSettings for the section. - - - - Utility to access the configuration elements. - - - - - Access the configuration element - - - - - MVCConfigSettings. - - - - - Token to retrieve configuration node - - - - - Creates MVCConfigSettings from an XmlNode read of the web.config and an IFormatProvider. - - The XmlNode from the configuration file. - The provider. - - - - Load the global commands - - The XmlNode from the configuration file. - - - - Load the command mapping - - The XmlNode from the configuration file. - - - - Load the views - - The XmlNode from the configuration file. - The provider. - - - - Load the windows views - - The XmlNode from the configuration file. - The provider. - - - - Looks up a url view based on view name. - - The name of the view to retrieve the settings for. - - - - Looks up a web view based on his url. - - The URL. - - - - Looks up a windows view based on his type. - - The view type. - - - - Looks up a next view based on current command id and and current view id. - - The id of the current command. - The id of the current view. - The next web view to go. - - - - Abstract base class to control the navigation between views. - You must inherit from this class when developing yours controllers. - - - - - Interface controller. - - - - - Provides access to the next view to display. - - - - - Provides access to the state associated with this controller. - - - - - Access the navigator which coordinates the interactions of views and controllers. - - - - - Default constructor - - - - - Calls the Navigate method on the appropriate navigator - and navigate to the next view according to the config file. - - - - - Calls the Navigate method on the appropriate navigator - - the Next View To Display - - - - The next view to display. - - - - - Get the user process state. - - - - - The navigator coordinates the interactions of views and controllers - - - - - Description résumée de WebNavigator. - - - - - Manages transitions between views. - - - - - Natvigate to the next view. - - - - - The current state. - - - - - Constructor - - A view manager - A state persister - - - - Natvigate to the next view. - - - - - The current state. - - - - - This interface defines how State maintains. - - - - - Save the state on the persistence medium. - - - - - Loads the saved state. - - The saved state - - - - Release a state - - The state to release. - - - - State factory - - - - - This class provides simple memory-based state persister for Windows Forms applications. - It is a singleton build by Castle IOC framework. - - - - - Constructor - - - - - Saves the State object in memory. - - A valid State object. - - - - Loads the saved state. - - The saved state - - - - Release a state - - The state to release. - - - - State factory - - - - - This class provides simple session-based state persister for Web applications. - - - - - Constructor - - - - - Saves state to the Session object. - - The state to save. - - - - Loads the saved state. - - The saved state - - - - Release a state - - The state to release. - - - - State factory - - - - - Represent the base State. - You could inherit from this class when developing your state. - - - - - Maintains user process state. - - - - - Reset volatile items and command. - - - - - Save the state - - - - - A state persister provider. - - - - - Gets or sets an element saved on the state with the specified key. - - - - - Gets or sets the command id value. This value determines - which view is the next view in the mapping graph. - - - - - Gets or sets the current view. - - - - - Gets or sets the previous view. - - - - - Provides access to a dictionary of volative items. - - - - - Key used to retrieve the session. - - - - - Constructor - - - - - Reset state. - - - - - Save the state - - - - - A state persister provider. - - - - - Gets or sets the command id value. This value determines - which view is the next view in the navigation graph. - - - - - Gets or sets the current view name. - - - - - Gets or sets the previous view. - - - - - Provides access to a dictionary of volative items. - - - - - Gets or sets an element saved on the state with the specified key. - - - - - Summary description for IStateFactory. - - - - - Create an IState - - - - - - Release an IState - - The IState to release - - - - Represents a view used in Web or Windows applications. - - - - - Gets the view id. - - - - - Provides access to the associated state . - - - - - Represents a view manager. - - - - - Activates the specified view. - - The current navigator - - - - Represent a mock View Manager to use in unit test. - - - - - Activates the specified view. - - A navigator - - - - Base class for user interaction in Web application. You can inherit from - this class when developing your Web forms. - - - - - Binding token - - - - - Default cosntructor - - - - - Set the focus on a control - - The client id of the control. - - - - Set the focus on a control - - The control - - - - ToString Override - - - - - - Gets the current view name. - - - - - Gets access to the user process state. - - - - - Represent a Web UserControl, give you access to the current state and page controller. - - - - - Binding token - - - - - Default cosntructor - - - - - Set the focus on a control - - The client id of the control. - - - - Set the focus on a control - - The control - - - - Gets the user process state. - - - - - Base class for user interaction in windows application. You can inherit from - this class when developing your windows forms. - - - - - Binding token - - - - - Constructor - - - - - Gets the current view name. - - - - - Gets access to the user process state. - - - - - Represent a web ViewManager to use in conjuntion with an application section configuration. - - - - - Default constructor - - - - - Activates the specified view. - - A navigator to access the next view id. - - - - Uses the HttpContext and the - to access the container instance. - - - - - Obtains the conatainer form the application instance - - Retunr a IWindsorContainer - - - - Access to resource data. - - - - - Constructor. - - - - - Gets a resource stream. - - The resource key. - A resource stream. - - - - Formats a message stored in the assembly resource file. - - The resource key. - The format arguments. - A formatted string. - - - - Gets a resource manager for the assembly resource file. - - - - - Gets the message with the specified key from the assembly resource file. - - Key of the item to retrieve from the resource file. - Value from the resource file identified by the key. - - - - Class used to expose constants that represent keys in the resource file. - - - - diff --git a/Examples/npetshop2/External-bin/Castle.MVC.dll b/Examples/npetshop2/External-bin/Castle.MVC.dll deleted file mode 100644 index 2deabcb3b1b66520356c7ce19dd43a2ffc287598..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmeHv3wT_`mFBsReyF8xsU_hDmP1PzTgFmb@&k-5W66?ix3MJKk_`rfXtl28hE`wE zx8(=MiTs7|!4AxX{X!<}mj`k3F~dw=Y?2KyNd^|;giOegWM(#*WLVfR3`u6fFq;P% zUi+U@_x3}QiOD20yWjTJ*Qe{8I(6#QsZ*!wR#j`@>i3dCL?%9OzDe{DzWM1E_|{+s z*^vt#iO}b&o@#zb+x1lQ$l$E|oc z99rgz-rY~MOEc)rdmrBF)%Gk!nyWQG(eogcId zWFUfj--T@9`R)|aFsEjSrq~d(pZkbvK>J!ZQPb?ax58sY!IJzS@Es+1JZ~M#17EiX z0D00@(GzL+iGdo=Ik^;Y(QO6^=7G+oPdBbAb&V21UV$@=^VS4{zXxT}u=Sts?)$pf_}A#Nt#wUe8UHvjpY73OZiFqxw7X z@)|nHnYsgEp_42}Z>>ktup0n#C_ZI3A{Fx6=i$ppLL373_XxH?}w0PF0-mYXzI%7cm_)+8^>)uc82iEa~vkpMeL&Xk)0cy0ONvFMt>) z#-N!&3qZ(!zI`FSTd}?1&w)H;=a8xnILkn-@!J>SD=7Spt;>? zw@IS8G!$!HgS=@tnl6Urd@w3`;&~UtcMY2GXv#5B-1AX5Dw1ot1~{shMBjNyROj)+ z9bA7#pSDI|0sh7~!FMaRaQG{XuZz)l1|3D6kRCO1@8V7=_;Pqve^t?wF%nQ&C|B;u z)h@N%lWX)7tU@3to?N9I`LoY7Rw+L=qbB^=EcfFm?HLo3xfW1gtltQdXfpKsbeVoN zt1b$b>gQl^`>XX6Y>0r3XoEgp2bF`W{_i{!4NCptsy2U>Te%uTQR>_(VP#g`KKe2! zkcYZ|SXOsHeX5G+$gy57&opE2>nq%9LQhR zhxK&lhv$ofrSk>bdG>r!n$Nv5H=pAl{2TKPH^#6pMPsHB(KHnzF>ZZy8a$XDqB6CF zl>3{~zintX4+hhnr;azeE^3HX+8UL^x?B*9Ny#DI$|G|ThH*(sv~^mM1ix>y(~MYLDtlkiD0iBekAj==QN*2r7!ru!mXoM&T5Bn1fWk zjVG~sDJtvPMCr;|^XkeOkfYWjEU5J|jxrkoau2}s4SN%k;@bx8L_X{poyB8!@wmmb zr(@JK>nB*Iv?nx+(J#XM_ExmPTjQ|Z;necXVrTcnh-Y!C-D>>k1nuN;7hYHrc~f
%^m6V59wpQ6c7}SK%Ry*+?sX+ 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 diff --git a/Examples/npetshop2/External-bin/Castle.MicroKernel.dll b/Examples/npetshop2/External-bin/Castle.MicroKernel.dll deleted file mode 100644 index b1f18aa4eaf26d463ec18f4444627cf72698aaa3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65536 zcmeFa3wV{qwKqQVzWbgF**iB#f&>V#$xRSYP^sJ@+##qaDr}MsL_*%M_l^=`Z19G* zVDZvct+tBVYSpUs?okgahkBtldbCxGikDJ*jy=_$>ao?@|8K3C_p+0Kp7a0C^F7b^ z_$sq!&04c&tu<@bT;AC`i%#DqOd*61|Nik0As)sjJ<~Wna?%5I{;)^$#r@%54u4oK z{N?Z!8(Pwp?I~-0DzT}uDbdzuWh&PuD^ne9l`U4jnd_}~51 zprRJngYOc~ORq2zls2faiJO`b=_52Jm0@BLR+eWjT@8Po)rR z>Qm`d6JRBq(oG!H1o~qd3{sy;wpt)$Ss^p){9!*j$Hv*1uc5Ck@U;cLw!qgG_}T(r zTi|O8d~JcRE%3DkzP7;E7WjYN0=?M((nEVw1OLw0gw5nPg$Prj=UG}QM2`nPT=w|h z;|`3uVA=lg+M7?Wp7-J#<%{pwG$qmeP5quy`) zJ#<|6?_af^`N_K7(?%|Myz|mOw%+?+FBV+2^p-1H*WB^2(Xy;{V`ts3^JaXq@aAhb zpYY7PWmko!4xV4K;fqJE{Pe^(F8tyL&yT$P%oCEIKJne)+Ar#V@V&xuhOo~TjQAiS zB8J%w#e9aZ8@pnk;qS&S-)H3ex^Xt(t1cWTMNlhabP+|h$S$MGeanbN-!f*0x~3=x zKX8f~7ES;H5u=M+>>@@1>oq9?0jg_?GP_;Vg1G}m7qKvy&Sbi30XoAuM=;DdP6#59 z*>w8HFn#eT6@pjcIKOjNfpUMoFOHT2pf^ORBNM10Q@|QRO$Mw&e6T#;cB~?AJqQk6 zN_4%!_{=eaR*Xo{rccbVdB^=IBSeJQMrtdKI8+K)H$Z2VHJHS-ev0BqO-zB*TEvVO zBaMKiV;cw`)f8wvVnK%pBsVQk9*GVT_M;mE86iv5%qhvODGP?K%b-ys0L5U#+HSFXrMM24Ok;l zd>~MllY#}>(-0)E)gx!XsscVxE#ZxZXcHap3K%o{Asa%K4JX#y~cE`Br3mDh0jEkB=*)J+qwGL#z!;NKAU@-8byQCJar52#0 ztUBa){D8Nnp?0V*Fev#kQfGqFjMsxyMH9mNI6e@8k-C}i*3pFb5FI||c;m*G#iuW) z9j8=ane90!JH~nAHJqtm9ELY>nIRA+_`wW7gqQ&cXHeIXJD?3iYrKoL~#_lzhtaGxG`v)C z`~;L*m!lwJAjD4x)Qv$5)n_8xXUjUS_n7_jg5sZWCRwS^L$?BmRF zT@ldLAZ#}Q1{bldy>vO6ZUWH}V02N+bUslA$A-jF3Y@IvM3B|ydw|jjIq8d` zW@Pfaklce93`7?rp36oI0b)BN?#)J&Pbk;*C!v)%B10sDU|~ciUz$x=Heu`eh>5v)hE zrUktN@dhMOA7&E-xG*M@UmEdgD6$}V#5xfP=B9cCHlDS>Ut)@i&(Z9NGGsx%Y<7M% z^*sA#anwJ++@r*>zJY3WQ+0DtBvLodD2byq;459Ov^GY45uAa7^g+10wVnn+k#d_N z_A>a5inHs*3A>$;fbLUIIee6Q9WDl2u}8V{yu=*NMbprbQrJ!Jq7&InF3%yOaW>b9q=|+fok?#?=L9~)Rbf54qTTTQjCL` z^NC?JfL=fv^`jf!fNEN|DskMZf#wjO_$Q^NFqLG>)n_kWc^T{v6QH9iQw}iHP-azS z*41QG#|dB#@+OUgK#|ck(@`C+6Hy)RR;M!Ss=n1>NK_}>`EZbkH5Z9d$~`(zcdkQy ziY=zVdXgVQg*cNXi=+DC@YJ+}Hw1P9{Frq{36>a$8iA58q~iTIU=ZEV|I<)xv7aHL zkgCc9WpxR{jRWtb(S#981;G*vAvh8&43-pzYL1Tvqam!&)Oh?6L<(Q^5A5D>um1BMI5CrWc^lYmC}c0;xd~ zi;smsjMi3KgnVAjQF^GbxdN#KsDiw(uoe@o9v!bAZgfnuJEQjGKq~ENf)VgwiaTXl zaYr>0Qv87#0iwD$+!&KJ{sPugprN3|=rcr(s6JVZAwzsejCrtstbhrer_bDvsX^_t z>OcW~;Y*01fzk^HD zNuLY}dK8l^zF3TYCB7X9G16K_qEUT^?`gzWG0EbKAaNwVvxgWv)KK? z5whAiliE-Wsc#mks=`RG0BszaMY^%+@u~Gp{1k$V3AWd8Sfta66K&F&1LhQvo=Q~M z6@h9U*sHN+2+Z5+yr7G4#nwuYVSUp@{4MAjsV&pM=>Q^ux>2bu2KHrVg9rSGcw3m! z(ergVsV6)b5-4D;LZ#7f<{Hf1Is?!Fd+(MnmY(Gt8E6e@yc?p&*4HDG(M1eR3#N&n zr2^BHK_Sip!XviPMcN-d-0VQCm$f}TG^uTf= zs?t@5sBSg^emOOTL0*eM7UCOVzCjfXe)ncH$m@;VP%VNpmTQp%)DLQnkSm7O2smu^ zL;EAl>x78%@)aA>nrOhF`xZRWM@9#+BE5Z??Pb+`Q60NrAAaWxn)lG+7d zizkuu_Ep*F{(VK~Hi(m5g|Yavo{}15@F-5MD8iTJUvOGIx^0 zCx+WJI7_rp)xaW)$-0Otem;u2k8=AWxKx{3?Fn z8DqNR`uoa2G(P8i4UzK-n9oNGhKTh7d%zC#zM) z!g!3N-bc4tDdaFjWOaZGdFzA4)+zR43#$z}nnd?Ua)TBu6v+$M)dUqWdNERalmbdD z_#%!kebzbn457($@mZ6n;jpy@puJGL$z7;r9Yne|9VeQua$Fi(sE6k5zIqN^W{T5M z1^tit0&7EGU5R0yKOGtCdKfTsJp8Yl%6)t!9SIC8vN|DPPLQ|CLusp=>!XwN2sUKj zAwzE^`8|7MnoJ7E1qFPU&gr5iA7n-XILd^pN;-X>9SB{Q7q+@k6N`J619mw8ZnZ_h zP-)mYk9n4)yYacZCKe2p^eN-{1T2qvzzn7_JoVZIlJhfcP!D|FSKd>FH1!2Kv}Y9M zs(i?eMvi41$Y!4T!)IL$i43206+YB?_}$=+867%lzfl?GH_O5NaDH<}AHN}o$qmI% zh0W^~~O;nawua&>flBuvUkK+$jDwA>ZTK*)X-JKzFaBM!{sn~5%lsc4 z)_c@=94A_?9mscl0zOD%33_2vL}+iU&PqzH3jt#kC`74s5kP%xGLw%@f*nL$J5GJl z$^6A2Q4+_$2MM*js@x;9$73EuO!7OM_Y%{(gjsAys$76$mc0gmImiwu8>s&VDl-LK zn4jKRwr0w|txLfPr|I-+CsGo}vNK>^hHUTbBhsDW(3wY|D~+$P>1h1YT!i%#KX9ra z09O}8<_2U4PjLzJtH9XO{#BdM?)5E*lp5rRdwmV1AAn zv~~jG?R}(dLJ%*^t_S}&i*r*WQD1Gq^1`9?<)GSHT3u4jv07jT9KT!?8(^X&R4JW1 zU|m3Gm|7-_WqHYw#Vg^T?a~}<_f0xZR)>FqI08jv#|dC=?Lsc-U};bW`(Tx=d;;!G z>jT>-VN2U5uK*8&W?c=d)P*}UVC@*APiyXyM;$_FvSZT<*4&{i@98L3TMgRrpi_~HK zT5yg??TC^-G^Pa>kx)1d-;7v4M3Qyvb}^4ftdEpV_I@u;DyYNlv6Qub%*v48FScpZ zaGyZ@HY7$GeC;fJ*3SOO%|bJ~6fSOOVFZ;$C(yafY2b~OVwCm_s2qvp`)Wghe4lkA z0HcdU;e~f@&5)2fpvBZ+&|ZZE4p0cdP6abZr0%UZqaofJ<%Mf;bO}1zD1yI=pTotd zInEH)8mV!euOZc(sn*7*NV;Rv!AI}6X`O7k?{c~bWBPcw^^=2fd?Jq=*MpJhd=P5_g{uSe3XzamP;p~%8h68Jg_0~_2)P(~&8ieQt+r3J$Y(B6G zuPva4Zb#Wn;=D{f2%)fHUwmKK6l7z1ob!O7;1KKib}5ISjz0=|B6AwDZ1e^JDz zj>2;wto1bMQWK`^URJAajZYoLujF%Oye}?-=(V}(lMfwpQvVD$E8|zSd11`6ZJ^j4 zE)DJu5BBkq^zQHwA0Lx5{q8W0RIF3dzd#dP(d%SS%mw^tX;_3O$#f*kQq65zG<2wdAB34*Q!ID4Tkz$5|Qk(!!*G9XeALAD@tfQ|hD z?m+~sV_0d@c@EmlmZ^5KQW@`+x~Nwbq_ug2D%$0DKrCJUCY2XyJ<*MPo~m9NfaDwy z2CO@gavZJ%o*q-JCZnm=plJ8;YEt!^$!p21HPn~iqcJF^@}vDVjd368MqogU=WIRM z1QgkEhX}lJ#~YKVMm7%XTGd7u*W=gs9T;+WEx~+UJlE}q$J|VJoe;OEKEJovN!1be zx!^7`m3m{qF^gn%>k!YZI$Y4dPT#TI7xu*KuA{+|#)4@Lc9+#|`eevU#^f?r4Kp28L*px#ynqd~mM z3#wTXhd*kLtQIp`2iju{tf%c`W^WYI@awqxe6x4H4dDG$sq(Rb^f$#w1ZBi`eUN2Z z--3*(F(JKB&gq?EGeQ_-+;KK8&&3t`g0(p5a_kWFyelSCWb(l!H;mZf(u4=1p`Ds* z>Tu23QT_UdO^wShN`?it4D=oor^t`yuEp^m7lPqZkzm(91SH zltWA0KReMs`X*B(ir28wh_i}O{qtRMZmulWuH<}V`=;xMZvP+(x&2dM14r&3pV*BS zu$0ti#<~ygv-S7(&sXUJuXTMjH86wY$ay$Vb8Hu8D=GWYOXJ9Bkg|F9!#qCazFBvX zC^#tlG>XaJ9>{-v0_+7=j5rS?`xwIp@k>yIm)_HDbL?m#ydF*yYh(<9(4@vpMeI-$&4KeP`%G}V_ywv4=DEOL(k~ZoGKYl+-jaF9+ zb2^rAoUao@`^rw`_H$%C29AdzUHNeHGkPOJ@(}N^L+ic&YB*=2_PmYNNu+x`y3w%y zK~^LiPPXf&KSEI)S7opt`_#?;(arwB&Hm2Lf`{8_N}j&3d+u%;)^AbK=pq^1tml5YEPe6=HRfNqjBz=$LbjT>cCr>)T{6^Js_~qz<^M0XpaX2ulH&v_utq2 z59Fcs+d^j7NpRx&nPhYHoHa z4C!CN!BzCf(HN(-KO!jZJhI;QhNBqN7=!98A4Ac_*DhkyBG_6)q-MXGvVetKgV1d# z(nuCgVd~xt4rqRR4}y7&ABcT!z-0l1>vZou5r)|0Ep5>esH4PY8kyEa;i<5+D_7^SyT>7z*Me7HwI z=a3@^`1xU0XTiEWTkhkN|M8_3Z#@C>;`%YTY=1h8nG-A-cKi)N>z}C&11I6k*$9+g zr`SPNR)L$+Es&3tXq|~a38}mv{*E4kS}en_L4yFvGF;%$nCuhm4LB8KK$*6*`$Vd1 zDy{aAR)dYyHK?fZ=_gTUjUrQO>1pp%GOYFnY%E!UQYOg>s9S`K)Gfl$u&GMv2|20j zNQ|ezW@||4uQ*J#Ip9F+xMu|OA(S5CPIZ>ey|O1?W-x25Ty1#?5uQ8vMINU5et z)x)%kP|@%jzO455yn_@n&mmq9xR~@@iWzJ`DkhbG*DkuNmqgfH{FPRfYAuiyf|W{+Ubu|^^oelM*n(VTrO*g?qu1mlc?H}{6cZZDlpPPD?W~` zSnKg)uQw_++$Tn{`lgysbX}9*|6rozSmnkuy~4B_U>KZ%)f^QHUq^2V9a~Qb;pWvW zNHIE$L#}Y>@|I%`9AOP=inAcom$x&rZ#(K0bN|MEbGXK6f4v%QVN%B$maJvn1u@yM zbc4dc-8*kNLN8vr6zRJV{rRc4k4&sQC7K@%V*^)e7|}TRW9kB6F;f(!QPKJ(pxQhmHI0B50MM0wIw+;}1J)z_ z82mnddkIW31X}+}?UPNNc0ARrmkCQc90vc&VeuHo2xf<`ukeSjk7e8u>nr@> z>(BX;`U-#e`j`xl*uKIazW%%~sju*duix+`^%dSzA1f1qc^mPGyPfQ7Va*uHETi}o z!25T^idT4OaewxqCwqP=Jr)5rf3lyVU+&>g-y_%lLi|1SWUnLAj|M%~S~h>OkD{-D zn?nBFfN}nBppW&c>vO|V2mWu@A)BZ=jY_58jQW z)WQqNaL~jTQr$OI&$fuk*9Lh87fC+Ryi`D z%8_YQj+9n8QbnzEay3sQeJ9o%@mok88jqLTCcV!`-tK{J~9_yw#WF!S&_!d=JG zslWwbp;xu>`_Y2w^A%aUAqM@30De;eP2PtzKwrAS3vDwP?*$0995YWnEZ^@reEkEq z;{Qsmkk1U<263g!tnT^70Gjx}iYC;?`T_OGCj(_S@}+9wZq8S*9{Jrkv3l<*`Pw;Z-5fATXgs;k}5X z384tz1R*WBhhQO`2_u}+StPS~3m9ju{k9Q^zkphF1<|mcMh*)a{xq#i0nv_6?PpMz zpFaCbk1n-zOQa8v%MQ!K?FC!U@znYNJovJSBS$@?uzk^u4=~}+P`xf_ria3YTWym< zy%$LYrGvMwyGH@--Ma2kx-MB5QN>%A#sED={Ba=pMgZALLwBR1t$eO+K-}=@duBy} zlw!PR-Pc6{wQm^(b~P7-RI_jrj`o-bJoi^QvRhB0oeu0%=rsV(dDwmMqawe_QQg~* z1K3aZ;{;MXP*>cyAFtx_fp~cAsCi5}3=efz$L8V4sB0aIT8G0;c5q(1Ezvge(frO& zwr^5MeAJ0nn9Hn(z{jLzdw_o01Mk9Urt~@21le|#;Dq@Q>kC4v?Op`7#nOQaoNFvJ zzQ?O(#gW^!p5?Y^Dt5PSPFutxyS~xIq-uYStuF1&4Z1_c57F*-w8C4x8=;iZMbp3Y zRxjJX5aHODd^A7v17D&-ql;5~Z+#1Rq+dp2ozC3s@=mAx3@W$ILyAty=8x$X{L9A$ zczuEuP@j3C2=|~5BIwjrnFf7Hek(D3mG}YZvVn9ytQ4tPs%X{ixZF^QxjR&9><$gi zs<=BeB&+W35dUUR#-M(BGcPCg9t;#r!(@D2j`!EJYMl8^kp~*7&A=ZtSIkEa>owdd zpvY_;gJdT{fut?IDmo5DxgquIH$(VmU+kZE;h>uR8!vC!HnR7gM*NqkZ^WPFbU&xh zar!(`vYkO|T7i|K?RNn29krPHj#`Et5O2nykp7<9p#i?9=6px-sOtXjQ^{Xxt%@}$ z^!x?d#Vq|cwSsSg)YI<}(JX<0MkWZWZ}89zg`c$0&|QEEea>$a?Wg$Uqx}azI%14d zpVU3BQ>{Wxx7>BAGf@tAVt;bhyj?V|`MONCZ5PN5yO4|P@9x=l0V(!5O#DB$i*(L2 zP5O!j-%G)FM6+s-|^9zxU-)ACh_pDr!h6XLtUrV)xlm`Nvq}3yC_DyaGjjmoY6Rc zhSY9Pc0Ol({rLKc6OKXac>Mgm-&?Q|8+ksyCkf9hs6oCllWJ+hw_Wj6V$nGf0ej@h zjbcTHze_1b&ONySV@5OsJ^=q5Iir=nXUY$Blcx@QFb5tb#NXrudQnY-&cZ)zxcJ@5 zyD0c~{KMI+fYAIdJBCm4QIPYQR}nt37vME7)rXqQhd!aF)+iuWieKvl^W=?ZXKpc}h zEH@w;Ih~eA9D?~&GMLka`6uKD#8307eDt8AK@o9a5b+5XP}&*2Ih-%n6iqJ*h}%k* zL8B)I-!>Rhms2Z+L#b9Jr?Z9@4GM@eIX#EdD>(frr%!YGCZ~VpG(^A5{^}FRF?L<%^tApHxM}h*4B>+$fUsIpp)jfl*}1($OT_n9tUBl^*IsN-s@}*x@KT;hL?^fT;?oWP8UMs~-_#95}T^QO{S%CB9tr&gu z_W>lJp8^U4&ShvHpj<%tz!!*v8Y*Ml-@t_^hcZ+w6;#R4L=BDL_GSU15k3mPH&!4{ zmm8%Y&={t?3{V(%TWeU%GH4UfL1VMF%-i{Cfvmg6^b*s z-VcpiP_Ia=Vcb4I^ewfujC+Z3Wrz?|?=8lai46?>8BiGKuxB%+Fv${Sh;`dQ88d54 zKOl=K&j+*xCqCyebPYpCiSrn`m!aX}0*0PvXoR?gdH&AK@zG85OBq+=o9pufx{RTe zhQ7_vRT|nUdPISE#5W1OFjDMd+$)S5Bd%oV-!ya$Lx!JtjuF=}RHmUHaqB1fNuxM! zcarX>_;WxR7q>Dl&A4j#6ydh{uk-tHl6?o`?$fxt826O_4aVKW(BA;<#V?RNz)(ei za5dr~t~W72?bV3K7&kAF2oUZGhRz2R7IoqmOnEI+)`@2sxHXy?q)(Kei}Z!^^N`MF`45y+ zyYH8`!B6Pf=ih-@Qv-mm!mKJqZzbU_8T@v*npR%J84CSAJOy)Hk%s;pJ_%4#OiP2lqSB8q9F}9jF@L z(R+`f_XM>tNQ6dEi+csNFi2D=NL~zFftaSDDJX9)|X^oE73_ z4UwD`;ys6Q6~?y@8#+~QJHEdccc3+RYdOt3g5fwaiE=;=dW>~ zHFW2npMCzzbFOy2`G$VaxdD;;9!1GLT_g5t=&qbwfm6?3)FaAQ8Fxq$mm2Z8hKNg@ z7|f0AlY1D7GjtJplW-?8M0QyPXsHA3#F}G+1FhlnWonV+yqj)a@w3nW8>|c`IM7?L zwFBk-KIcK+BN2LE-lsVy0qSvh_5!+vp?#40ZeDdUCG(^`hk}UbvEnaGc_>Ugj}xId z;SPm~=W(KfA*J7OSW^=2BDUFaVxEG;MY+EQG?bh7F`!#&iE^7L%lix`1bZDw%BkW#4b|oa zBu;kfi1H#aKQ9;aO^A*ND}2jv6P`J2LCBmhPZH%R zqKMshpCrmt#A6zw(Q&G%V)xx9&dn!CJ!IVr%@hKMrBSMbo&EHxm0_W4Qb zb)sS-fy(FCiE$e0$-i2z6SEY=Qm+#$8QLdQyDa&sVk1?byu|XVgpdZT(>bL-0NQbkO)cEqd_moZb4^21dT3uMV>DnW=QGY zBlc%O2N_Z=^oR{~c&XdFKwQeuUOB1Y4SA8M;KTWCVnso(xL91x&|bL?&?RCrA4sbf zwu^;X&>DtR3){uj4DFTYq26WG7#_?P1@FplDFD#51%Hy4JJ4-_z9S~m@e#+myRq9^ z!_Z#&Ou-G}3h@|2nAO1L3NdXOQ67@S<-6hx4H1{`5dsg5)KBF1#g=IV(b)V%UMF@j zq;$A}5P0_a-zt!X3;nJjWc)~>2nWx)QQR_(3RJzD#4`+G{Gr}W;ys2ANvd}9Pec_%-~!xF#6%5I3%83|HV!TP zRIJbtdHEg00uRl_d4>y#Xt8mZXl6=k;cjuaxL(&I%6mjDPalUQQT|-4U}&$*0d&8( zUqfR6Jt$t*(ClcQ@vxXTi`v^O&jR$QxL!k-Mu!@YiN`c_cXYJzgm|AJYJHX1BR+Sa zHR4HPfk&+;o>l-LTCwbPpr@m?h6^14w9mnP5}jZ?<3NLA6O3maXl!hX@tgx4$57F1 zDp0n5PE2Fykfau#6K80MTG%hPXoy;PL0qFDYT;MnVGU6Wz2XB6Q477Iat^gXYp}cV zCmP3Th%|bU5P0_Gof$jHaG{piY!~u(#6IKSPGw5}g|UUkzj7_I(uJ``;}tPY@eC7} z--s0&A}+siD2dCf4n$mD^FWQpZ^Z_#ry|iC;yi|wUEUD87}_U@%Nybr4H1_&#lsHN zXdD#HbBV30_m0@YkgE5NxJ5%$?_Ke*12r1I6TSww-tWa=hE%=Zi&+|?dhd&s4%BG; zo2Z)a*84ydEFehL!wH0jsNNsNE(dBf{v_`7P<|wyac~QbKZ}(M6&JGZUqpr>rO_wi zQU_WkJ`vYD&`$AR;(iBOgHsFj?DO9h+h}}dLwWbcQpV?Eze9NgPBcDbXs>)NM$p7X zM6CSfb1_RpOtr|1P#Di2MBuu|q@D?_Y=;H6``fKSaS|#gi-{qHfShNxE;`q3KE5dI{`hWp^Cz*4Zqy4p}S%~Faq+L zrPRVDVr1bhMo2!aq58r*jj*g-Mz{;b@r4f<5qYVGrWHP6%NS>&nD+><-TB@NR7XA)Uvxa_B`0s$WXy_i`3giwAJqlcbyir4Yfs4xfHS{uY zQTdF5#Cw2Z($}bT_!A^6l)Vb#2v#INb)bk@EUQ+qMxh-=Z;MhnnIY0)4WJzi?Ug?$ zS|x_a4>WWWpfXu-GS%BFe+H;r{>6a`%nDg_Dz_ebqNq>~m2nL{$IyuyI#^U<4wV}i z+9&={6f%yIw`u6Zq6>{-a=(T?N4;V4Lxv7Xe=&BglK4|ZnOa} zZqztXbMZ;01LbWko@>_HI6zfqy{ueG4JzLqCs!~;tLD4KIN7Wr8b{-0Mnk0Sc)4Fg zq|pTVz5{(GCQ9FF#B-k{OH7iL4zyhyD^FBVn6y1kuFyEr_Bh$2A<}lT+~wdVn^WXt z4(=rLcv*G2YJv1SLGIE}J;vCHa_}m~g-P2JCLSzKnA7A% ziV|Z}%IWeJ4UrBrDgVSwg4xZ?pWaG(`{ z7CO-8l1_7x1AQCNVh4Jlq{m$1K>GnLb)Z8fmzc{O=rcge9jLJM60^~PssXKVpjo9m z&66GIbU>%b(3xa2)eoo2xC5=h`EWZ!hr(3vG`UMdRPS_okA_J1Rg!+)08u|ox}PCG z)DY=@rYty1;Yjzhi)*UO+1})H>uEvt90BXdg$S&GLSRlxL;c))bd69P&fc3*BmVIJjLyerDn= zJwN;WyM{bu;&O_H?m&BZ3$LLkhCF5Vc%Wy@3moWQhe&y`1HB9A5)bs5*lt642a9@5 z+_6(U0li{gW<&lDhvbWIIgl*-t@&*m$}1~-$K2sS6U*NBKy%Cf=z-2E`%f3*__@=r z2WYZ+xdTze{Eh=r4B2Hvc^zecGp}%n-C0v>2=EYEk9P3ga}tk479RaWl% zu8qrkv}}a$dk*w`S=<91D4Qa_@8Eu4cDD=p{|x9F2bWWRwC`FON{|WF$hlTlI#3+A z#~f&lxK8@k66HQgUU0oU!+~x!e<=58h`it?S=FQ{$qR0g*Jy~m;5PX(Lx&`J!R>Nk zGf@)sjCqHopZuT}$P0cZuTLt7yx?wm(1AV^_sFVsj0=+&+$+~O&@1N8<@E}Z!hh+$dE~F9p#3Qnbp+jNviAUvRjUz93R9>VZ@`A_YJsKh}cuan% zA@YJJWJQbONxk{ca-o94)bD%b8Vymu?~!*hbSO+-_oUpT>(O|4Qf@h$xEuS`+P)3mJM_-d~X~o?+iL*;}vj zJ*%O8B6nz&`MeFu`k~kQe(6BR553j*VphGEY#i!MlDM~r$3#o@L+|kY+JUIv>sj@F zYvWL_SG-|EsP~ZXO$VZSZ)eqe$Ht-FAH{n%gnCc;u*27_A3yY0zJCKG#ra23dIM5J z+>F!|KSk;j4{*7{s`P0tc^;`DdO3gOTCeuwaPBawtGJzBN$sA+=~t1Vd^pk9bLy3$ zzf`J(QbWw_M}ISyFXwV^{>y85Z6(=Oc1eP{oz3abkQ(Aa&bNSF(AvR+j(N;b4d(=aq%0kEC`NAvMLxNbMF?`GZ`pwCG>bUk2i! ze8%R}zeKf5`bu$J6d0G^i|6T zs!O`yFMoKvNadB}hr|AN%ZaCLy%(V!{)PdMf~VO&Ua$6A>~*$-vYwk)_Oz|)mK(y& z+cb*X2h8WsoKoHp|HXMD?&iM=&5=3$-@+;zQaVtq`w4WkBbCa36-`y|xT)p4#TmCL<8;9{jvSe2^y*)f**cL?WvCb=-;zRM)jsP#BPgMlAO9+c^pbto6M`>!yrdO>i&Wf8`GLRP$r9Iy%KFVUM zysux`t-Qg$r&>AWgK;nEqk3z{LRDi zCwc4@pqtO;PwPYcrbCU1dsI2N37Uf&yZN{WlaJ4+n1(w{OL22)DefyR#Wx=E@as%# z@GlR)?!N(dk@9c@DT9A`xO-HLTSYr?muLrm)pZ9r?ZDlk9k@Tb16Ngc;G)SrxTE1It1x&e8V|EmecW^ zPT_PqrwyDgiuv?L?McN>)ANG*{GD&YWw#mK2I&eSp*GMmuUkrQPe}&AgjEIC7T=}#= zA;wl-Xe7kM%4bo2Qsw3TA$&(-o19nq0PhLRh>^TrWB4tyjz6+aoV zHxM=0&c+KPo&%Qb6E$8L@gn5;V%TfI(z}G=Ms(y2VytmAr&Ew#%UWD3HjMl$YHh$@ zF}j^gZWkRRpY>nM5?(8|kHj|_Sd!btw^8dR*6}9RV!UxX^SO6qKDbf4+hDzd;1rhU zCh-ce(~WmVRsW`4bKl)?lyi;6j z3>zH?T_&~`qu0Q#Aas*){OE54ZZ{I6uY@;l9lc%LYy5EZg~q+c&yj8xPmLZOdPMe) zzTE$ad;>Jw43c@X_z#q97GEH}7b9z2=ytR|CDZ`PZ#5glgfRu?BW%?tS)*mfhLLMS z&l)$5iHK*7@8bI&mvLWo%G<_V?kC?qKlCD7??txci{i;Kw~7R`xDnF6JthgyFNk06 zCvG>0&A6p^rT-5Yr+0?_AZy|eAl(uFG<2NmayrhJY4JZelEd!ez6OUR$^ z01a94H9bP9VD=!^O?Ow&{^<&@1O9*>OpL82C#d7%UD>2+j5+MnWsx%?Ya<&YU6EapA4V2oE?H5qkaI z5TVz*D>zl<&*c0RB{{kOg!G;;(RlNU=39BC(BQ^A{Mf1ZB#+*geUf)7r%9xW=KJ~A zBLCgkD#K2njNwmx>JpW2DEtLVmJ~jZ^zVg#Mj9yk6ls3Z-;ow_Iz;7*sjZ`m%T4@F zJg1Y3harDqF>#n&yaf5l#itBdl3hN@N0i4SEi0dfbX@ryq$iaxK)Sqq8PYZ7ry^}B zKNIOWV( zQUiVLN6Bg#K*?E14cvPVBEJUXt3V`>((i4BQL(D@o-y${et(~#RA4F=1zr$Y*Vahs`_>ki7Fvz2kM&x*;IsBE-A~^~9 zVtE|W5;+BwrJN3tC!l07Qta+=&l$g($Y~|+H5<4cFdgX_ITLAI&PI9+R+3Uo!CWlG z@%Ua0PAw#j>G@biO0huVyJ(^j_jI9)JQ?Y?aog4qJLG9dzav*6-6hXNdWBpK$}5o? zc;l2ndJXQ$;*?1yQT{`uhWL@hH_gP2NDZ+YGqr&?IUAAQD>os%Pg+Rt$80FYgEEc$ z1Drl2J5cg4QbRm0&qew)?qy26$LvJ@Ut|~3U*P_wA$}#liE;j8(-euo%y4zY*F!rE zdT`+e=>dFmOqE<(NTrmYr$6Zf!wJt|adVhHsfJ6(*I=j^gM5+I+|io+hM1X1XIhi> zi&~me)`DcJE!kS%+}bJ{W?Gxtt+r%aW_nYm<(xzYe^9SKso0cmvQn)rYei#cI+NTa zmaIKH*_08}*QPV6L{sJ~F{vMbYW9|k=KU1GO@HO9r|mS{vHZ znM7Mt(xZf}*J3L($LeTncG)>iEl;j*Aq7YP7p<)0!VPm0O)af0nNHC#t0moTr4wsg zlaA^RvcJ{pHLfL@7B-oO?Yu-=b89l?aI)b67->{mXiM0n4LSqv=(x^4XuDJsxlPY* z>)0f8X=5glNs5MrE$fm^olULDnHJ2LLVxu4m%cO*N7&2WFCE60}J=P{=vJi(+ zm}#`z*DvpA%d~7t);A_ou9|R*WZGLWGtt_*Hqo?EEKR0XY)B;&&HWl9DanocAsX>b z{MKZ~YU_ttkxI0sTQE@jVK9c<@D={G9T`|wk7f+}By|hiy8{E823Y?NWuh4!Ev?Nk z42ajYtnW~xfiW0V?HJ_)Mud8A-Fk;Ioy}%xB9+*b#1Kt86hxqevQo2>?a8+0WLpzP zNS_vIU<1{>G-b6XQyCC&y+m6kEgIUuk>ZAxa@mqq*n#^na;-%cap_&gN07pej$U=` zVU}%d+l~$3yrt82M?@d({;Z3O7@#}2qG(v2Y)vN8$)#3nOH-$q-imJ2otn-@4ZuPZ zq|(B%NAuyTFSg)PO&j5G*=*s?x?4JzC(~BzIdBd=&@`sWMGPo|szlL>8M)-1f!Wxx zR?j8mzOLsrqF0l4djntwXwYGm#uVdWB^p+Awo|Zy2Jo1HMnHB|(4}dp*wb2e_35cp zqSNIztA)o^BIPMti0QD(a&jKqs4^18j#}B80G~;2$#|@! zCAZ0Ew6sC46{(~f5UABJu>eTm41%gH#$XW*PMD(!&v7H>)S!qR``NPeEmkn%Kql?d zIyopp^ESrx^5nW?3Xvc=drNyNnI_#&&a@0TIdFM{o~6%0Kun88iBx(+qICxRa-Ck9 zc<_1v3SGw*RZ)mVSXs0*Avn&$xLZ$?p`+=nL?+R{6fuO?8vQXGB%ESB!8-6v%mm<$ z$s&`&-*{fVkyl|(pHO&mn`TyG^(HP|ZMAV_@=fHKgO2L;9G}-GGpn^alvR}}x5TZe zKyO`+qgXs?!EDeL(6$eY;9;~RO9015Xp(7YTW5*J3=}0#vfWe}3=0FYEgQi$p_ty@ z-iq5AXoj;=GqId%X{I(B(UDD=*{v<>Tj01J64>63 zY|2Ea(}<-?dR?cB(IR@PO;4@w*u;L;n9Q8q?#>*7hI3X2_6=i9^z9b8haO>8-3o96Haq?VOF2~ea zY)Rs53~^KL;?CiE5$6zgs_tt^HjCM9>5f#=!O)5!(KaLL5=?JycCejT{-#gCO4Xem zMT08HS{Kiz_=5gVizRKSpKP9ntR%b5c zwT^2{hmLJQ8lRJB?MSX(Em$~lY625T+j@r#>j4@uVs(oSLfrMvaH?R+<%?r!1kWHpeO|@Vy zU1$-%R!%WU`|cpg(RsC=<%a`o&fFq!OtezKNKaes?-OFP2QEZSlv!L z2wQCA;A6>mDv4vpO znirwBI@!p6)P1S+Fr1UJHmPy07vqqR$0s4CXY@)xYZ>g!o_fHz{-U(^te72AchC#C zv4?^?+8J{FrNPpi_WY!r6OKGv9IC)^5nf2!2T!=H^3%%os}YwwwKq`g|vL-F6K-I^C+gC=4Q9GlCMNOIZ{*nsDBe(X8y8_6XjfQiM)xpCesuZ*j9}aY_qX6?0nJ znt3felUX`Ucyi^1@M^pA>V?U5XnT3f`VIJ4480n${Gh#8@?49o#~CV7 z9H>a;sLacbFkTpDvs)r@XCUCSYw==|+qB!`CKOXIgVl(sJhfx)h8YvBo*~EY#^%yhJ4t%g*OECqN-sD_QB{K9_XQE3Am zNY38ek-#iFmpU`OVJ6nBVugj3DA^x{YEwYdi}3KbdH3hbJk{|aHjXDFh|ozPveckw z2$6Sz{dBBe*SFEk>UaqC5_9Q8jb(qQ6P|3#y9HP~ljKe%?!T;|%JU8>o`)RxQ!PcS07j&z3B ze%c6G)SflHS}NH@h<9!cy&-f9l%5XkuD7!S8S7ymU=l{FfmH-{)}1=)dA73Zl#XIt z|JcOT*++`RQZJV9zQbM6P~JHVqCn~bR0Y;?4@{}CtOBM;(4JQ?PG!lAo*f!*&v*tW zatESifY;S*-TUZ0fO6T2IZ9 z`;*+B9$AX<6p#oOX{G^eT`RZu%raE11TdM%A0}+8{|Qb|tcwPt!Uk zqSJdm@=BA>wzTnTn@)xK^-mI=rYiPrg*`#dNN&g4qg6{Hv_dqG-?h{q?p;fL z|Gi<~h8x<>u{PrTVtTr>tqHB-+)r@cd0#UFlN`>lm~3_%_C%b+}Ud?2nphwRfgy-Ps=n zzih_wSbqfBJJHrT5W+Lg`=b#e;WYftwm))33*Iri#aLyt+hAd*-k5oh)Z=O*mo6YG~n~T{mL3PwYMhe7?0mg3O5ou zZ%P_7$#&1Km^f$Q?0u0wtR!+Sn&mmCRE1b70)^<&?*O3>e-8<5ND|FU+UPvgK8~A_ z!0`;pL5q6#5Q0kPB+pHzoRdix*FZ0Kv4}_9rhw{!sFpq?WS-6rm%;-fms%}!n9jje zWfx&nPCErI%a)-z*-pJ-E65By+K5HT%m%BO6+mpkxWVd~4_6?RQ;@b-<2YT!&eT@h zTbeCur-Nc%EVbHjbm|uEHo#Dczzk;hdz~oSAQPQc(+*({HmC{GQtg9??VOI*RvPZ` zyS8M?eL1r(`+&C1KH0=fsjp8sM<=}fC0_kY)J*S`<9s7C;TWN(1%Xk6SGj=JV_~Y} zATd)Rle(243fsDb4{fn+P@j0A=2()NN8rMSS$hJ#%5i$WQ!QY!$s5v3cz7pTJ%o-f zZe6En1xBM1Nx&=A8(p<#aEWP0GJ8`yE>UbmE=@!!{2Coat`!z718hA@N1*u7edali_V{{}J-dqr=jccsd^!h7c)iv4UV_jQ05<-!Dg5KJMbYz# zsC_c(Fn41}Bc_xMDXR?!kdUuwb4N=m={YG~YPDl@^IYyJ#hYGwW6g4@Y*H-kz~44S zLwu&V*lM#QCr+O2lRq&Nj8Z}!%!)bmwhn&UJd4gw>A-Xm#GuhXn_iQXvk-<3$u?xT zDU1v*nY{)2;q@{OUNe1IXsuZY@*o}v6c;eUJ?}FJm0gkr^>IU9mSJJU0}{vE9njW} z3v&&uqpxozt4YNjx<21R5Q>Y)0&q&ThghY?f&5c=pT_u7ww2!q?%dA&q0E zmNs-NwaW{1hfcNa;Q)7m&DGTe9TD{^ll-5|rH>p~Ob;=(>fX8-u4(s7fd;z!KA&b7 zu1=l8X6$2Uk9aU4CJ^d4C)99N*aC-fco$_scmy5?>(pgoonp}^ULA%^MWYlq!QR5= za=FlvvDcBwAbNN@N99!JJt>FPv4+uiK$J}rZ9Iq=(6~-+lliHcA7NU}oDJ!jt%-D6 zV4S7XOog~Y;m32egqIb3fd<2d1Rr3!pv8)J!gHox<-{C$U9;fYhqK;Ddajbpc6%~a!$rS#Z|;$#KT2b_pLP&lKLUM#8< zW0s~HtAl2p1{i(Il668&Y}_V9;7q1_bS%Xl79vY>BXXqUDEkMF66zTBxoE z6Xp%t@7s`GqOjHMrHG)NoVu3@wcQ=Fnjv9T9dtN!+7k**1|!dN@|z3 z+c8xw3HuyQxN{%bNYCClg7-k`UI$5UqlIUis>X8miHFP7zUD()gnBp@HVJUT6;`{| zYOO~%v^L^K;q=z^mT16M3a=9c6$qFfubc!{n^=4bkg1D!*iqAN4^P8P{MKs+{x(Fj zsKl?uTDaX@iC?L0L7qzBbI7m9zqQCEQPKpOHr#~Hh!pBI;nPB{9)I3~>QH$CpG}|@ zvlj!WYHY%<#!@{vvTlKDRf>%$>BMIjzEjtY&vQ{bjn8$U?f`AG5F5XoOB%H8+(HW6 zNsjg4k-@k7Na8fo6nB(R;feI){aVKH>J~AH>Ky7@m4k>t8}sTvu#P`BnL@Hy0$~xCcxB(O(?NzcPn{% zE}qF9GzJx@YiQA#K;G`!Z041~Q3J%j5)CM*8PwDabq}S~9A;HekTX=mRg~F@Zwtyv zlq6{Dfm5cCvl~$F9PlIeB1h}%JeAy+ayOdrR>T>snB$Ucz8FuE~S1XE~|wNISA+y~Al8 zV0&9f>1#K__>D=(%g45UIl8Iovq)IQ6CSdhY-vuP1-W;J*}DuSMf( zta(jfhX*x!`uga?ej=@aXw(XY=QeQM#OKp3ZG)P8+ihF8b0^K431_}mPGzwv$nPmQl2KfTB_8hVIFL!iAT^8F zjwcFT_jSsGibkyN??>%ufh4foCKp%KuCZ--D157+PMt<(CW|Rgqr3>)#ual1>ioU~ za~-!$L&V#i$||Z$WzY8iGmI+XW0hhNgznUHpe?GJFZwRC)I3R@ua-J;z{S{qU!i&- z&vX|}vr1YJt$G(`-$Wq#ag%){s>|Q#6779;MLv+#L zRo15APwgIViX!?q>^>q2>Sqek_R!M3HAHz3t-{C#)bBJSqt}Ld zeT(LM8gjH2AZv-Cs*h~j(PXd|SUt@BRnT3S(5-GBWVO8pSJwuRcea)dTaH20>zjCd z@T#D&3Hs8S2e0X%FZqEe&GsCpJZBRmqyUA`A5|-y7UXF~g1}JP1RE3Fj6WDgw$_ux zqM4}GckGc?WC@a-<^-C=$S0aWsVqbxLrq=Y^(D4Uyc4BB+cW=+mS)Uy+1F=z5GB3ZC0YF15(2R(UM~M-e6sSZ212Q&+(D|`& zi0Yu7sSrt`{i#Gh)d$W~K~5+XL>HnUy3h>Jzu0vAn~i@NaD|kVf&kT~Q!*RXVwqTo zg_&4jFwrCyU<#x(@;N(^ny-j8pw)b8Y&s=ebz*Fk5eWHc%juIyh%h#)0`09pVQdAy z0WI-OV`Kucl~l5lpp}5mAm|K&&H%Is|CZt3$@m9hOc@HrLZM1Cwnk;ZHKdIiqQ*m@ zI}QKV_|ae}gl37-2vpb>qMqq_pR^kvJJSf{Q*Kf$!FncQNmgrAPNgq4DnB*_|B*H_ z*0Up0X;zShN2xBUh)pCjRG?l3x_A;k4f;egu@*3dJ&pW)aHsB>3a+uKFqs%id31U% zbEOZX0_`xDsj(^S1-axqNQP4HQrquS6{JwF=Y2vBhP^|~4IKcN*ak15PS#37wjdgu z$OUq!&X9u)j!h2%gU@XhW*j`?kZ2;Yq@J0`qOq%~>|n)qFpE_|=AFpd!64pb1mG0V zjyyreX2Tl!`QQmZKt|~eE)auEj8@pv6G>MViFAhl#wG^hBq~%VQWB*I^bjcDC*WpC zh#P4)OMNWl_BJbEp88k{fjYRHJrWj$i@@;cKsz%#g2AY}l;uX(F$wgQ6{JK3+Z*o0 zqqFB88V1wY^ar_>o`VeR;j~w27zZ#k7AIZuV?75zhZM}vQxB_34>Lt4tb#_6s7?lV zSaTY8=|N8SaN5i1!$^n5I-%4w7zDIPdMVjM32}^Vt7M5)e;|)xIGDV)J0HgE*;c{E z=;jg(J1T(#$GYL7$mSAZ45OL=k{!8jm_ZsnH{u78gs(@4t7*_0NB}QyoIYOoXqJ}Z z+>hUHANTr!{fBndp8fhmw{L&E<@uFEt}Pz_@tQ4X-TC=t4}Si}C;wC}GRJSe`n?r< z#!Q_1dD{oa&RuZZ?{2f2NMi7iNP^VeDZDQ-Vf7!fZX~4+G7t1Ipz>ZF1I)v^}W1Z_8wEpHIX7%YV={HS2Jyz{@m;CL8e3}Y&yKa|Vq4o?2H0jj( zb|P;t=F_S#tHHtVLJ>3f&IRt7K&mPw7Z>Zc`Oe-P`Owbysb;l@C4WDl@gPsIvR9>Q z%+wo(R0OV+kp*^8uVkR2d+9=+5&G|(|H1j4Qd$pQp|)u^cx3}O75vAS*oPU!C^8%t z^B_dq{5e<*Nd78cEMD>l^ygFqKvM~;AX-)O>a4ABnx=4Qcpl2pyPOEiLoQH$pS3v5 zrGOTvD3)?Y&7R!C^+V-d&gUox5Y;vID?m_{R`@_;F?MRQ)WGn;KigZ)!bK*1MzSy%39g`;y;S9YTy&u*KrQnG?DE6N&V zZx$sRwTo^6+zQl#T2o7rAa|fvUszjtAy^rSY|lH@-2++i%uY8^0yDm4v6I^Qh8BGt zznH~;=r(*K&$0{LKVac1<$zpI2hxE1C3<{8z;L1~g)3{Rtyq)_3YJ`0Gvy$bk@`}b zX??0AhOTs$B;2ORfD%nY;WpG!XVbbBW5JQ+Qm1o+Z+ObU1Gvt~v8@jN>pLX~pVvBG z9-d4Dzm26!5}wdK-#9wj+B-ZBD`gxU*y0+>^l>#=zBiFOo<;;B0s#TN^Iq%NB!kZp z(Y+R{KK(f4 zAo(TRr!dwhV&Xj_X#Otgo~2pG?(o-zH~<6QC!CU36Z@w|BWV&3ZDifk%GfnAs>hH6 zXGGO7%{5CiDsO|SKfj1DJAB3d&Wcb|XI5?-wJ;(}l;$R+$og=*#ktlQoia26 z!6q8zXiS6gM?4+q!V$AQPFi$~goEbbvu3((Qto4uB&&bICZYBi%0tg_m)U|%=jj6a zqDw^iKZm#xLLu#srsKn*43QzyafC-8ehx_cUv&-G2Qq9QDn(50B=%jy^Yb*5s7_*f z$MQ5-AZkeTQFtctZ~4sNxQhrx1R??vfrvmvAR-VEhzLXkA_5l$fj3Dqk1ij+x+n@o jJt6`TfrvmvAR-VEhzLXkA_5VCh(JUjA`lVyzY+KZ=%B5) diff --git a/Examples/npetshop2/External-bin/Castle.Model.dll b/Examples/npetshop2/External-bin/Castle.Model.dll deleted file mode 100644 index e7389379faa2aa9abbca6ca85a93dec429855edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 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 diff --git a/Examples/npetshop2/External-bin/Castle.Windsor.dll b/Examples/npetshop2/External-bin/Castle.Windsor.dll deleted file mode 100644 index 03489d6dc7b4d49a717abfd630c4176bdb4beede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 102400 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 - - - Castle.Windsor - - - - - Minimal AST node interface used by ANTLR AST generation and tree-walker. - - - - - Add a (rightmost) child to this node - - - - - - Get the first child of this node; null if no children - - - - - Get the next sibling in line after this one - - - - - Get the token text for this node - - - - - - Get number of children of this node; if leaf, returns 0 - - Number of children - - - - Set the first child of a node. - - - - - - Set the next sibling after this one. - - - - - - Set the token text for this node - - - - - - Set the token type for this node - - - - - - Get the token type for this node - - - - - AST Support code shared by TreeParser and Parser. - - - - We use delegation to share code (and have only one - bit of code to maintain) rather than subclassing - or superclassing (forces AST support code to be - loaded even when you don't want to do AST stuff). - - - Typically, is used to specify the - homogeneous type of node to create, but you can override - to make heterogeneous nodes etc... - - - - - - Constructs an ASTFactory with the default AST node type of - . - - - - - Constructs an ASTFactory and use the specified AST node type - as the default. - - - Name of default AST node type for this factory. - - - - - Stores the Type of the default AST node class to be used during tree construction. - - - - - Stores the mapping between custom AST NodeTypes and their NodeTypeName/NodeTypeClass - and ASTNodeCreator. - - - - - Stores the mapping between AST node typenames and their token ID. - - - - - Specify an "override" for the type created for - the specified Token type. - - - This method is useful for situations that ANTLR cannot oridinarily deal - with (i.e., when you create a token based upon a nonliteral token symbol - like #[LT(1)]. This is a runtime value and ANTLR cannot determine the token - type (and hence the AST) statically. - - Token type to override. - - Fully qualified AST typename (or null to specify - the factory's default AST type). - - - - - Register an AST Node Type for a given Token type ID. - - The Token type ID. - The AST Node Type to register. - - - - Register an ASTNodeCreator for a given Token type ID. - - The Token type ID. - The creater to register. - - - - Register an ASTNodeCreator to be used for creating node by default. - - The ASTNodeCreator. - - - - Pre-expands the internal list of TokenTypeID-to-ASTNodeType mappings - to the specified size. - This is primarily a convenience method that can be used to prevent - unnecessary and costly re-org of the mappings list. - - Maximum Token Type ID. - - - - Add a child to the current AST - - The AST to add a child to - The child AST to be added - - - - Creates a new uninitialized AST node. Since a specific AST Node Type - wasn't indicated, the new AST node is created using the current default - AST Node type - - - An uninitialized AST node object. - - - - Creates and initializes a new AST node using the specified Token Type ID. - The used for creating this new AST node is - determined by the following: - - the current TokenTypeID-to-ASTNodeType mapping (if any) or, - the otherwise - - - Token type ID to be used to create new AST Node. - An initialized AST node object. - - - - Creates and initializes a new AST node using the specified Token Type ID. - The used for creating this new AST node is - determined by the following: - - the current TokenTypeID-to-ASTNodeType mapping (if any) or, - the otherwise - - - Token type ID to be used to create new AST Node. - Text for initializing the new AST Node. - An initialized AST node object. - - - - Creates a new AST node using the specified AST Node Type name. Once created, - the new AST node is initialized with the specified Token type ID and string. - The used for creating this new AST node is - determined solely by ASTNodeTypeName. - The AST Node type must have a default/parameterless constructor. - - Token type ID to be used to create new AST Node. - Text for initializing the new AST Node. - Fully qualified name of the Type to be used for creating the new AST Node. - An initialized AST node object. - - - - Creates a new AST node using the specified AST Node Type name. - - Token instance to be used to initialize the new AST Node. - - Fully qualified name of the Type to be used for creating the new AST Node. - - A newly created and initialized AST node object. - - Once created, the new AST node is initialized with the specified Token - instance. The used for creating this new AST - node is determined solely by ASTNodeTypeName. - The AST Node type must have a default/parameterless constructor. - - - - - Creates and initializes a new AST node using the specified AST Node instance. - the new AST node is initialized with the specified Token type ID and string. - The used for creating this new AST node is - determined solely by aNode. - The AST Node type must have a default/parameterless constructor. - - AST Node instance to be used for creating the new AST Node. - An initialized AST node object. - - - - Creates and initializes a new AST node using the specified Token instance. - The used for creating this new AST node is - determined by the following: - - the current TokenTypeID-to-ASTNodeType mapping (if any) or, - the otherwise - - - Token instance to be used to create new AST Node. - An initialized AST node object. - - - - Returns a copy of the specified AST Node instance. The copy is obtained by - using the method Clone(). - - AST Node to copy. - An AST Node (or null if t is null). - - - - Duplicate AST Node tree rooted at specified AST node and all of it's siblings. - - Root of AST Node tree. - Root node of new AST Node tree (or null if t is null). - - - - Duplicate AST Node tree rooted at specified AST node. Ignore it's siblings. - - Root of AST Node tree. - Root node of new AST Node tree (or null if t is null). - - - - Make a tree from a list of nodes. The first element in the - array is the root. If the root is null, then the tree is - a simple list not a tree. Handles null children nodes correctly. - For example, build(a, b, null, c) yields tree (a b c). build(null,a,b) - yields tree (nil a b). - - List of Nodes. - AST Node tree. - - - - Make a tree from a list of nodes, where the nodes are contained - in an ASTArray object. - - List of Nodes. - AST Node tree. - - - - Make an AST the root of current AST. - - - - - - - Sets the global default AST Node Type for this ASTFactory instance. - This method also attempts to load the instance - for the specified typename. - - Fully qualified AST Node Type name. - - - - To change where error messages go, can subclass/override this method - and then setASTFactory in Parser and TreeParser. This method removes - a prior dependency on class antlr.Tool. - - - - - - A creator of AST node instances. - - - - This class and it's sub-classes exists primarily as an optimization - of the reflection-based mechanism(s) previously used exclusively to - create instances of AST node objects. - - - Parsers and TreeParsers already use the ASTFactory class in ANTLR whenever - they need to create an AST node objeect. What this class does is to support - performant extensibility of the basic ASTFactory. The ASTFactory can now be - extnded as run-time to support more new AST node types without using needing - to use reflection. - - - - - - Constructs an instance. - - - - - Returns the fully qualified name of the AST type that this - class creates. - - - - - Summary description for ASTVisitor. - - - - - Get number of children of this node; if leaf, returns 0 - - Number of children - - - - Represents a stream of characters fed to the lexer from that can be rewound - via mark()/rewind() methods. - - - - A dynamic array is used to buffer up all the input characters. Normally, - "k" characters are stored in the buffer. More characters may be stored - during guess mode (testing syntactic predicate), or when LT(i>k) is referenced. - Consumption of characters is deferred. In other words, reading the next - character is not done by conume(), but deferred until needed by LA or LT. - - - - - - Small buffer used to avoid reading individual chars - - - - - Small buffer used to avoid reading individual chars - - - - Used for creating Token instances. - - - Used for caching lookahead characters. - - - - This method is executed by ANTLR internally when it detected an illegal - state that cannot be recovered from. - The previous implementation of this method called - and writes directly to , which is usually not - appropriate when a translator is embedded into a larger application. - - Error message. - - - - A creator of Token object instances. - - - - This class and it's sub-classes exists primarily as an optimization - of the reflection-based mechanism(s) previously used exclusively to - create instances of Token objects. - - - Since Lexers in ANTLR use a single Token type, each TokenCreator can - create one class of Token objects (that's why it's not called TokenFactory). - - - - - - Constructs a instance. - - - - - Returns the fully qualified name of the Token type that this - class creates. - - - - - The fully qualified name of the Token type to create. - - - - - Type object used as a template for creating tokens by reflection. - - - - - Returns the fully qualified name of the Token type that this - class creates. - - - - - Constructs a instance. - - - - - Returns the fully qualified name of the Token type that this - class creates. - - - - - Constructs a instance. - - - - - Returns the fully qualified name of the AST type that this - class creates. - - - - - Constructs a instance. - - - - - Returns the fully qualified name of the AST type that this - class creates. - - - - - A token is minimally a token type. Subclasses can add the text matched - for the token and line info. - - - - - Constructs a instance. - - - - - Returns the fully qualified name of the Token type that this - class creates. - - - - - Constructs a instance. - - - - - Returns the fully qualified name of the Token type that this - class creates. - - - - - Summary description for DumpASTVisitor. - - Simple class to dump the contents of an AST to the output - - - - - - - - - @deprecated as of 2.7.2. This method calls System.exit() and writes - directly to stderr, which is usually not appropriate when - a parser is embedded into a larger application. Since the method is - static, it cannot be overridden to avoid these problems. - ANTLR no longer uses this method internally or in generated code. - - - - - - Specify an object with support code (shared by Parser and TreeParser. - Normally, the programmer does not play with this, using - instead. - - - - - - Specify the type of node to create during tree building. - - Fully qualified AST Node type name. - - - - Specify the type of node to create during tree building. - use now to be consistent with - Token Object Type accessor. - - Fully qualified AST Node type name. - - - - Append a char to the msg buffer. If special, then show escaped version - - Message buffer - Char to append - - - - Walk parse tree and return requested number of derivation steps. - If steps less-than 0, return node text. If steps equals 1, return derivation - string at step. - - derivation steps - - - - - Get derivation and return how many you did (less than requested for - subtree roots. - - string buffer - derivation steps - - - - - Do a step-first walk, building up a buffer of tokens until - you've reached a particular step and print out any rule subroots - insteads of descending. - - derivation buffer - derivation steps - - - - - This token stream tracks the *entire* token stream coming from - a lexer, but does not pass on the whitespace (or whatever else - you want to discard) to the parser. - - - - This class can then be asked for the ith token in the input stream. - Useful for dumping out the input stream exactly after doing some - augmentation or other manipulations. Tokens are index from 0..n-1 - - - You can insert stuff, replace, and delete chunks. Note that the - operations are done lazily--only if you convert the buffer to a - string. This is very efficient because you are not moving data around - all the time. As the buffer of tokens is converted to strings, the - toString() method(s) check to see if there is an operation at the - current index. If so, the operation is done and then normal string - rendering continues on the buffer. This is like having multiple Turing - machine instruction streams (programs) operating on a single input tape. :) - - - Since the operations are done lazily at toString-time, operations do not - screw up the token index values. That is, an insert operation at token - index i does not change the index values for tokens i+1..n-1. - - - Because operations never actually alter the buffer, you may always get - the original token stream back without undoing anything. Since - the instructions are queued up, you can easily simulate transactions and - roll back any changes if there is an error just by removing instructions. - For example, - - For example: - - TokenStreamRewriteEngine rewriteEngine = new TokenStreamRewriteEngine(lexer); - JavaRecognizer parser = new JavaRecognizer(rewriteEngine); - ... - rewriteEngine.insertAfter("pass1", t, "foobar");} - rewriteEngine.insertAfter("pass2", u, "start");} - System.Console.Out.WriteLine(rewriteEngine.ToString("pass1")); - System.Console.Out.WriteLine(rewriteEngine.ToString("pass2")); - - - - You can also have multiple "instruction streams" and get multiple - rewrites from a single pass over the input. Just name the instruction - streams and use that name again when printing the buffer. This could be - useful for generating a C file and also its header file--all from the - same buffer. - - - If you don't use named rewrite streams, a "default" stream is used. - - - Terence Parr, parrt@cs.usfca.edu - University of San Francisco - February 2004 - - - - - - Track the incoming list of tokens - - - - - You may have multiple, named streams of rewrite operations. - I'm calling these things "programs." - Maps string (name) -> rewrite (List) - - - - - Map string (program name) -> Integer index - - - - - track index of tokens - - - - - Who do we suck tokens from? - - - - - Which (whitespace) token(s) to throw out - - - - - Rollback the instruction stream for a program so that - the indicated instruction (via instructionIndex) is no - longer in the stream. - - - UNTESTED! - - - - - - - Reset the program so that no instructions exist - - - - - - If op.index > lastRewriteTokenIndexes, just add to the end. - Otherwise, do linear - - - - - - Execute the rewrite operation by possibly adding to the buffer. - - rewrite buffer - The index of the next token to operate on. - - - - This token tracks it's own index 0..n-1 relative to the beginning - of the stream. It is designed to work with - in TokenStreamRewriteEngine.cs - - - - - Index into token array indicating position in input stream - - - - - @deprecated as of 2.7.2. This method calls System.exit() and writes - directly to stderr, which is usually not appropriate when - a parser is embedded into a larger application. Since the method is - static, it cannot be overridden to avoid these problems. - ANTLR no longer uses this method internally or in generated code. - - - - - - Implementation of . - Do not support configuration inheritance. - - - - - Summary description for NodeBase. - - - - - Summary description for ImportDirective. - - - - - Summary description for ImportNodeCollection. - - - - - Summary description for NodeCollectionBase. - - - - The stack of indent levels (column numbers) - - - stack pointer - - - Return the index on stack of previous indent level == i else -1 - - - - Summary description for LexicalInfo. - - - - Grab everything before a real symbol. Then if newline, kill it - as this is a blank line. If whitespace followed by comment, kill it - as it's a comment on a line by itself. - - Ignore leading whitespace when nested in [..], (..), {..}. - - - - - - - - - Interpreter of a specific language to describe - configuration nodes in a hierachical manner. - - - - - Implementors should make sure that the - Interpreter instance already has a reference - to a configuration source. - - - - - - - - - - - - - - - - - - - - - - - Reads the configuration from a XmlFile. Example structure: - - <configuration> - <facilities> - <facility id="myfacility"> - - </facility> - </facilities> - - <components> - <component id="component1"> - - </component> - </components> - </configuration> - - - - - - Abstract a configuration source that might - be a file, a config node (CDATA) or a hardcode content. - - - - - - - - - - - - - - - Ensures the resource exists in the manifest. - - The type to scope the resource. - - - - Extracts the representing the resource. - - The resource . - - - - Enables a hierarchical configuration store. - - - - - - - - - - Bad name. It also install facilities. - TODO: Better name! - - - - - This implementation of - holds an array of interceptors. When the Proceed method is invoked, - it just increment the Current index and invoke the next interceptor. - - - Although we have multithread test cases to ensure the correct - behavior, we might have threading synchronization issues. - - - - - Constructs a DefaultMethodInvocation. This is invoked - by the DynamicProxy generated code. - - - - - - - - This implementation of relies - on DynamicProxy to expose proxy capabilies. - - - Note that only virtual methods can be intercepted in a - concrete class. However, if the component - was registered with a service interface, we proxy - the interface and the methods don't need to be virtual, - - - - - Constructs a DefaultProxyFactory - - - - - - - - - - - - - - Represents an ordered chain of - implementations. - - - - - - - - - - - Executes the method Intercept on the chain. - - - - - - - - This method will rarely be used, however, depending on which - v-table (ie interface) is being exposed, it might be called, so we handle. - - - - - - - - This interface should be implemented by classes - that are available in a bigger context, exposing - the container to different areas in the same application. -

- For example, in Web application, the (global) HttpApplication - subclasses should implement this interface to expose - the configured container -

-
-
- - - The IWindsorContainer interface exposes all the - functionality the Windsor implements. - - - - - Registers a facility within the kernel. - - - - - - - Adds a component to be managed by the container - - - - - - - Adds a component to be managed by the container - - - - - - - - Returns a component instance by the key - - - - - - - Returns a component instance by the service - - - - - - - Releases a component instance - - - - - - Registers a subcontainer. The components exposed - by this container will be accessible from subcontainers. - - - - - - Shortcut to the method - - - - - Shortcut to the method - - - - - Returns the inner instance of the MicroKernel - - - - - Gets or sets the parent container if this instance - is a sub container. - - - - - Implementation of - which delegates to implementation. - - - - - Constructs a container without any external - configuration reference - - - - - Constructs a container using the specified - implementation. - - - - - - Constructs a container using the specified - implementation. - - - - - - Constructs a container using the specified - implementation. Rarely used. - - - - - - Registers a facility within the kernel. - - - - - - - Adds a component to be managed by the container - - - - - - - Adds a component to be managed by the container - - - - - - - - Returns a component instance by the key - - - - - - - Returns a component instance by the service - - - - - - - Releases a component instance - - - - - - Registers a subcontainer. The components exposed - by this container will be accessible from subcontainers. - - - - - - Executes Dispose on underlying - - - - - Returns the inner instance of the MicroKernel - - - - - Gets or sets the parent container if this instance - is a sub container. - - - - - Shortcut to the method - - - - - Shortcut to the method - - -
-
diff --git a/Examples/npetshop2/External-bin/Castle.license.txt b/Examples/npetshop2/External-bin/Castle.license.txt deleted file mode 100644 index d3bdda2..0000000 --- a/Examples/npetshop2/External-bin/Castle.license.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2004 DigitalCraftsmen - http://www.digitalcraftsmen.com.br/ - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/Examples/npetshop2/External-bin/IBatisNet.Common.dll b/Examples/npetshop2/External-bin/IBatisNet.Common.dll deleted file mode 100644 index 69fa59f813e61ea4e9deb4658293908445c96a80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 61440 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 diff --git a/Examples/npetshop2/External-bin/IBatisNet.Common.xml b/Examples/npetshop2/External-bin/IBatisNet.Common.xml deleted file mode 100644 index 268f52c..0000000 --- a/Examples/npetshop2/External-bin/IBatisNet.Common.xml +++ /dev/null @@ -1,2199 +0,0 @@ - - - - IBatisNet.Common - - - - - A ConfigurationException is thrown when an error has occured in the configuration process. - - - When this exception occurs check the .xml or .config file. - - - - - The DalException is thrown when an error in the Dal occurs. - - - This is the base exception for all exceptions thrown in the framework. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance - using the message parameter. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance to - the Message property of the passed in exception. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception - that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous - exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference - (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the - class with serialized data. - - - This constructor is called during deserialization to reconstitute the - exception object transmitted over a stream. - - - The that holds the serialized - object data about the exception being thrown. - - - The that contains contextual - information about the source or destination. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance to a system-supplied message - that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance to the Message property - of the passed in exception. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance using - the message parameter. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the Exception class with serialized data. - - - This constructor is called during deserialization to reconstitute the exception - object transmitted over a stream. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - - - A DALForeignKeyException is thrown when foreign key error occured in a sql statement. - - - This exception is not used by the framework. - - - - - Initializes a new instance of the DalException class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance to the Message property - of the passed in exception. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance using - the message parameter. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the Exception class with serialized data. - - - This constructor is called during deserialization to reconstitute the exception - object transmitted over a stream. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - - - Summary description for ProbeException. - - - - - Initializes a new instance of the ProbeException class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance to the Message property - of the passed in exception. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance using - the message parameter. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the Exception class with serialized data. - - - This constructor is called during deserialization to reconstitute the exception - object transmitted over a stream. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - - - Summary description for IDbConnectionProxy. - - Not used. - - - - Constructor for a connection proxy - - The connection which been proxified. - The provider used - - - - Static constructor - - The connection which been proxified. - The provider used - A proxy - - - - - - - - - - - - Summary description for IPaginatedList. - - - - - Moves to the next page after the current page. If the current - page is the last page, wrap to the first page. - - - - - - Moves to the page before the current page. If the current - page is the first page, wrap to the last page. - - - - - - Moves to a specified page. If the specified - page is beyond the last page, wrap to the first page. - If the specified page is before the first page, wrap - to the last page. - - The index of the specified page. - - - - The maximum number of items per page. - - - - - Is the current page the first page ? - True if the current page is the first page or if only - a single page exists. - - - - - Is the current page a middle page (i.e. not first or last) ? - Return True if the current page is not the first or last page, - and more than one page exists (always returns false if only a - single page exists). - - - - - Is the current page the last page ? - Return True if the current page is the last page or if only - a single page exists. - - - - - Is a page available after the current page ? - Return True if the next page is available - - - - - Is a page available before the current page ? - Return True if the previous page is available - - - - - Returns the current page index, which is a zero based integer. - All paginated list implementations should know what index they are - on, even if they don't know the ultimate boundaries (min/max) - - - - - Summary description for PaginatedArrayList. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Provides a view of the IList pramaeter - from the specified position - to the specified position . - - The IList elements. - Starting position for the view of elements. - Ending position for the view of elements. - A view of list. - - - The list that is returned is just a view, it is still backed - by the orignal list. Any changes you make to it will be - reflected in the orignal list. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sets the enumerator to its initial position, - which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the current element in the page. - - - - - Specifies the isolation level of a transaction. - - - - - Volatile data can be read but not modified, - and no new data can be added during the transaction. - - - - - Volatile data can be read but not modified during the transaction. - New data may be added during the transaction. - - - - - Volatile data cannot be read during the transaction, but can be modified. - - - - - Volatile data can be read and modified during the transaction. - - - - - Volatile data can be read but not modified, - and no new data can be added during the transaction. - - - - - Contains parameters that specify Transaction behaviors. - - - - - Length of time that the transaction waits before automatically - closing itself - - - - - The isolation level of the transaction. - - - - - Simple interface to COM+ transactions through Enterprise Service. - Makes a code block transactional à la Indigo (evolution will be easier, it's the same API) - It's important to make sure that each instance - of this class gets Close()'d. - Easiest way to do that is with the using statement in C#. - - - Don't support nested transaction scope with different transaction options. - - System.EnterpriseServices.ServiceDomain is available only on - - XP SP2 (or higher) - - Windows Server 2003 - - XP SP1 + Hotfix 828741 - and only in .Net 1.1. - It CAN'T be used on Windows 2000. - - http://support.microsoft.com/default.aspx/kb/319177/EN-US/ - - - using (TransactionScope tx = new TransactionScope()) - { - - // Open connection to database 1 - // Transaction will be automatically enlist into it - // Execute update in database 1 - // Open connection to database 2 - // Transaction will be automatically enlist into it - // Execute update in database 2 - - // the following code will be executed only if no exception - // occured in the above code; since we got here ok, let's vote for commit; - tx.Completed(); - } - when “using” call Dispose on the transaction scope at the end - of the “using” code block, the "ambient" transaction will be commited only and only if - the Completed method have been called. - - - - - Creates a new instance with a TransactionScopeOptions.Required - and TransactionOptions.IsolationLevel.ReadCommitted. - - - - - Creates a new instance with the specified TransactionScopeOptions - and TransactionOptions.IsolationLevel.ReadCommitted. - - The specified TransactionScopeOptions - - - - Creates a new instance. - - The specified TransactionScopeOptions. - The specified TransactionOptions. - - - - - - - - - Give the correpondance of a TransactionScopeOptions (à la Indigo) object in a TransactionOption (COM+) object - - The TransactionScopeOptions to macth. - The TransactionOption correspondance - - - - Give the correpondance of a TransactionIsolationLevel (à la Indigo) object in a IsolationLevel (COM+) object - - The IsolationLevel to macth. - The TransactionIsolationLevel correspondance - - - - Close the TransactionScope - - - - - Complete (commit) a transsaction - - - - - Implementation of IDisposable so that this class - can be used with C#'s using statement. - - - - - Changes the vote to commit (true) or to abort (false). - If all the TransactionScope instances involved in a - transaction have voted to commit, then the entire thing is committed. - If any TransactionScope instances involved in a - transaction vote to abort, then the entire thing is aborted. - - - - - Count of the TransactionScope that have been open. - - - - - Returns whether or not the current thread is in a transaction context. - - - - - Gets the current value of the vote. - - - - - Describes how a transaction scope is associated with a transaction. - - - - - The transaction scope must be associated with a transaction. - If we are in a transaction scope join it. If we aren't, create a new one. - - - - - Always creates a new transaction scope. - - - - - Don't need a transaction scope, but if we are in a transaction scope then join it. - - - - - Means that cannot cannot be associated with a transaction scope. - - - - - The transaction scope must be associated with an existing transaction scope. - - - - - Description résumée de ObjectProbe. - - - - - Returns an array of the readable properties names exposed by an object - - The object - The properties name - - - - Returns an array of the writeable properties name exposed by a object - - The object - The properties name - - - - Returns the type that the set expects to receive as a parameter when - setting a property value. - - The object to check - The name of the property - The type of the property - - - - Returns the type that the set expects to receive as a parameter when - setting a property value. - - The type to check - The name of the property - The type of the property - - - - Returns the type that the get expects to receive as a parameter when - setting a property value. - - The object to check - The name of the property - The type of the property - - - - Returns the type that the get expects to receive as a parameter when - setting a property value. - - The type to check - The name of the property - The type of the property - - - - - - - - - - - - - - - - - - - - Return the specified property on an object. - - The Object on which to invoke the specified property. - The name of the property. - An Object representing the return value of the invoked property. - - - - Set the specified property on an object - - The Object on which to invoke the specified property. - The name of the property to set. - The new value to set. - - - - Checks to see if a Object has a writable property/field be a given name - - The object to check - The property to check for - True if the property exists and is writable - - - - Checks to see if the Object have a property/field be a given name. - - The Object on which to invoke the specified property. - The name of the property to check for. - - True or false if the property exists and is readable. - - - - - - - - - - - - Calculates a hash code for all readable properties of a object. - - The object to calculate the hash code for. - The hash code. - - - - Calculates a hash code for a subset of the readable properties of a object. - - The object to calculate the hash code for. - A list of the properties to hash. - The hash code. - - - - This class represents a cached set of class definition information that - allows for easy mapping between property names and get/set methods. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets an instance of ReflectionInfo for the specified type. - summary> - The type for which to lookup the method cache. - The properties cache for the type - - - - - - - - - Summary description for CachedTypeResolver. - - - - - Resolves a by name. - - -

- The rationale behind the creation of this class is to centralise the - resolution of type names to instances beyond that - offered by the plain vanilla method call. -

-
- $Id: TypeResolver.cs,v 1.5 2004/09/28 07:51:47 springboy Exp $ -
- - - Creates a new instance of the TypeResolver class. - - - - - Resolves the supplied type name into a - instance. - - - The (possibly partially assembly qualified) name of a . - - - A resolved instance. - - - If the type could not be resolved. - - - - - Holds data about a and it's - attendant . - - - - - The string that separates names - from their attendant - names in an assembly qualified type name. - - - - - Creates a new instance of the TypeAssemblyInfo class. - - - The unresolved name of a . - - - - - The (unresolved) type name portion of the original type name. - - - - - The (unresolved, possibly partial) name of the attandant assembly. - - - - - Is the type name being resolved assembly qualified? - - - - - The (possibly assembly qualified) name. - - - - - Creates a new instance of the CachedTypeResolver class. - - - - - Resolves the supplied type name into a - instance. - - - The (possibly partially assembly qualified) name of a . - - - A resolved instance. - - - If the type could not be resolved. - - - - - The cache, mapping type names against a - instance. - - - - - Provides (and resolves) alias' for the common types. - - -

- It's really just syntactic sugar so that a type definition - (in, say, a config file) can use 'int' instead of 'System.Int32'. -

-
-
- - - The alias around the 'list' type. - - - - - An other alias around the 'list' type. - - - - - The alias around the 'bool' type. - - - - - An other alias around the 'bool' type. - - - - - The alias around the 'byte' type. - - - - - The alias around the 'char' type. - - - - - The alias around the 'DateTime' type. - - - - - An other alias around the 'DateTime' type. - - - - - The alias around the 'decimal' type. - - - - - The alias around the 'double' type. - - - - - The alias around the 'float' type. - - - - - An other alias around the 'float' type. - - - - - The alias around the 'guid' type. - - - - - The alias around the 'Hashtable' type. - - - - - An other alias around the 'Hashtable' type. - - - - - An other alias around the 'Hashtable' type. - - - - - The alias around the 'short' type. - - - - - An other alias around the 'short' type. - - - - - The alias around the 'int' type. - - - - - An other alias around the 'int' type. - - - - - An other alias around the 'int' type. - - - - - The alias around the 'long' type. - - - - - An other alias around the 'long' type. - - - - - The alias around the 'unsigned short' type. - - - - - An other alias around the 'unsigned short' type. - - - - - The alias around the 'unsigned int' type. - - - - - An other alias around the 'unsigned int' type. - - - - - The alias around the 'unsigned long' type. - - - - - An other alias around the 'unsigned long' type. - - - - - The alias around the 'SByte' type. - - - - - The alias around the 'string' type. - - - - - The alias around the 'TimeSpan' type. - - - - - Creates a new instance of the TypeAliasFactory class. - - -

- This is a utility class, and as such has no publicly visible - constructors. -

-
-
- - - Initialises the static properties of the TypeAliasResolver class. - - - - - Resolves the supplied type name. - - -

- If the supplied type name is an alias, the fully resolved - type name is returned. If no alias could be found that matches - the supplied type name, then the type name will be returned as is. -

-
- The supplied type name. - - If the supplied type name is an alias, the fully resolved - type name is returned. If no alias could be found that matches - the supplied type name, then the type name will be returned as is. - -
- - - Instantiate a 'Primitive' Type. - - a typeCode. - An object. - - - - Represents the method that handles calls from Configure. - - - obj is a null object in a DaoManager context. - obj is the reconfigured sqlMap in a SqlMap context. - - - - - - - - - - Master Config File name. - - - - - Delegate called when a file is changed, use it to rebuild. - - - - - Class used to watch config files. - - - Uses the to monitor - changes to a specified file. Because multiple change notifications - may be raised when the file is modified, a timer is used to - compress the notifications into a single event. The timer - waits for time before delivering - the event notification. If any further - change notifications arrive while the timer is waiting it - is reset and waits again for to - elaps. - - - - - The default amount of time to wait after receiving notification - before reloading the config file. - - - - - The timer used to compress the notification events. - - - - - A list of configuration files to watch. - - - - - The list of FileSystemWatcher. - - - - - - - - - Represent the call context of the SqlMap or DaoManager ConfigureAndWatch method call. - - - - - - Add a file to be monitored. - - - - - - Reset the list of files being monitored. - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - This handler reloads the configuration from the file when the event is fired. - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - This handler reloads the configuration from the file when the event is fired. - - - - - DBHelperParameterCache provides functions to leverage a - static cache of procedure parameters, and the - ability to discover parameters for stored procedures at run-time. - - - - - Resolve at run time the appropriate set of Parameters for a stored procedure - - a valid session - the name of the stored procedure - whether or not to include their return value parameter - - - - - resolve at run time the appropriate set of Parameters for a stored procedure - - - a valid open IDbConnection - the name of the stored procedure - whether or not to include their return value parameter - - - - - Deep copy of cached IDataParameter array. - - - - - - - Add parameter array to the cache - - a valid connection string for an IDbConnection - the stored procedure name or SQL command - an array of IDataParameters to be cached - - - - Clear the parameter cache. - - - - - retrieve a parameter array from the cache - - a valid connection string for an IDbConnection - the stored procedure name or SQL command - an array of IDataParameters - - - - Retrieves the set of IDataParameters appropriate for the stored procedure - - - This method will query the database for this information, and then store it in a cache for future requests. - - a valid session - the name of the stored procedure - an array of IDataParameters - - - - Retrieves the set of IDataParameters appropriate for the stored procedure - - - This method will query the database for this information, and then store it in a cache for future requests. - - a valid csession - the name of the stored procedure - a bool value indicating whether the return value parameter should be included in the results - an array of IDataParameters - - - - Summary description for HashCodeProvider. - - - - - Supplies a hash code for an object. - - The object. - A hash code - - Buggy in .NET V1.0 - .NET Fx v1.1 Update: - As of v1.1 of the framework, there is a method System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(object) that does this as well. - I will not use to Keep compatiblity with .NET V1.0 - - - - - A class to simplify access to resources. - - The file can be loaded from the application root directory - (use the resource attribute) - or from any valid URL (use the url attribute). - For example,to load a fixed path file, use: - <properties url=”file:///c:/config/my.properties” /> - - - - - Protocole separator - - - - - Strips protocol name from the resource name - - Name of the resource - Name of the resource without protocol name - - - - Get config file - - - A config resource path. - - An XmlDocument representation of the config file - - - - Determines whether the specified file exists. - - The file to check. - - true if the caller has the required permissions and path contains the name of an existing file - false if the caller has the required permissions and path doesn't contain the name of an existing file - else exception - - - - - Load an XML resource from a location specify by the node. - - An location node - the global properties - Return the Xml document load. - - - - Get the path resource of an url or resource location. - - The specification from where to load. - the global properties - - - - - Get XmlDocument from a stream resource - - - - - - - Get XmlDocument from a FileInfo resource - - - - - - - Get XmlDocument from a Uri resource - - - - - - - Get XmlDocument from relative (from root directory of the application) path resource - - - - - - - Get XmlDocument from absolute path resource - - - - - - - - - - - - - - Load a file from a given resource path - - - The resource path - - return a FileInfo - - - - Replace properties by their values in the given string - - - - - - - - Find a type by his class name - - The className ot the type to find. - - - - The name of the directory containing the application - - - - - The name of the directory used to probe the assemblies. - - - - - Holds data about a and it's - attendant . - - - - - The string that separates file name - from their attendant - names in an assembly qualified type name. - - - - - Creates a new instance of the FileAssemblyInfo class. - - - The unresolved name of a . - - - - - - - - - - - The resource file name . - - - - - The original name. - - - - - The file name portion. - - - - - The (unresolved, possibly partial) name of the attandant assembly. - - - - - Is the type name being resolved assembly qualified? - - - - - Description résumée de ScriptRunner. - - - - - Constructor - - - - - Run an sql script - - The dataSouce that will be used to run the script. - a path to an sql script file. - - - - Run an sql script - - The dataSouce that will be used to run the script. - a path to an sql script file. - parse out the statements in the sql script file. - - - - Execute the given sql statements - - The dataSouce that will be used. - An ArrayList of sql statements to execute. - - - - Parse and tokenize the sql script into multiple statements - - the script to parse - - - - A StringTokenizer java like object - - - - - Constructs a StringTokenizer on the specified String, using the - default delimiter set (which is " \t\n\r\f"). - - The input String - - - - Constructs a StringTokenizer on the specified String, - using the specified delimiter set. - - The input String - The delimiter String - - - - Constructs a StringTokenizer on the specified String, - using the specified delimiter set. - - The input String - The delimiter String - Returns delimiters as tokens or skip them - - - - - - - - - - Returns the number of tokens in the String using - the current deliminter set. This is the number of times - nextToken() can return before it will generate an exception. - Use of this routine to count the number of tokens is faster - than repeatedly calling nextToken() because the substrings - are not constructed and returned for each token. - - - - - Information about a data source. - - - - - Do not use direclty, only for deserialization. - - - - - ToString implementation. - - A string that describes the data source - - - - The connection string. - - - - - Name used to identify the provider amongst the others. - - - - - The provider to use for this data source. - - - - - A template for a session in the iBATIS.NET framwork. - Holds the connection, the transaction ... - - - - - Complete (commit) a transsaction - - - - - Open a connection. - - - - - close a connection - - - - - Open a connection and begin a transaction - - - - - Begins a database transaction - - Open a connection. - - - - Open a connection and begin a transaction at the data source - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Commit a transaction and close the associated connection - - - - - Commits the database transaction. - - Close the connection - - - - Rollbak a transaction and close the associated connection - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - Create a command - - The type of the command - An IDbCommand. - - - - Create an IDataParameter - - An IDataParameter. - - - - Create a DataAdapter - - The statement or stored procedure - used to select records in the data source. - An IDbDataAdapter. - - - - Create a DataAdapter - - An IDbDataAdapter. - - - - The data source use by the session. - - - - - The Connection use by the session. - - - - - The Transaction use by the session. - - - - - Information about a data provider. - - - - - Do not use direclty, only for serialization. - - - - - Init the provider. - - - - - Get a connection object for this provider. - - An 'IDbConnection' object. - - - - Get a command object for this provider. - - An 'IDbCommand' object. - - - - Get a dataAdapter object for this provider. - - An 'IDbDataAdapter' object. - - - - Get a IDataParameter object for this provider. - - An 'IDataParameter' object. - - - - Get the CommandBuilder Type for this provider. - - An object. - - - - Equals implemantation. - - The test object. - A boolean. - - - - A hashcode for the provider. - - An integer. - - - - ToString implementation. - - A string that describes the provider. - - - - The name of the assembly which conatins the definition of the provider. - - Examples : "System.Data", "Microsoft.Data.Odbc" - - - - Tell us if it is the default data source. - Default false. - - - - - Tell us if this provider is enabled. - Default true. - - - - - The connection class name to use. - - - "System.Data.OleDb.OleDbConnection", - "System.Data.SqlClient.SqlConnection", - "Microsoft.Data.Odbc.OdbcConnection" - - - - - Does this ConnectionProvider require the use of a Named Prefix in the SQL - statement. - - - The OLE DB/ODBC .NET Provider does not support named parameters for - passing parameters to an SQL Statement or a stored procedure called - by an IDbCommand when CommandType is set to Text. - - For example, SqlClient requires select * from simple where simple_id = @simple_id - If this is false, like with the OleDb or Obdc provider, then it is assumed that - the ? can be a placeholder for the parameter in the SQL statement when CommandType - is set to Text. - - - - - Does this ConnectionProvider require the use of the Named Prefix when trying - to reference the Parameter in the Command's Parameter collection. - - - This is really only useful when the UseParameterPrefixInSql = true. - When this is true the code will look like IDbParameter param = cmd.Parameters["@paramName"], - if this is false the code will be IDbParameter param = cmd.Parameters["paramName"] - ie - Oracle. - - - - - The OLE DB/OBDC .NET Provider uses positional parameters that are marked with a - question mark (?) instead of named parameters. - - - - - Used to indicate whether or not the provider - supports parameter size. - - - See JIRA-49 about SQLite.Net provider not supporting parameter size. - - - - - Used to indicate whether or not the provider - supports parameter precision. - - - See JIRA-49 about SQLite.Net provider not supporting parameter precision. - - - - - Used to indicate whether or not the provider - supports a parameter scale. - - - See JIRA-49 about SQLite.Net provider not supporting parameter scale. - - - - - Used to indicate whether or not the provider - supports DeriveParameters method for procedure. - - - - - The command class name to use. - - - "System.Data.SqlClient.SqlCommand" - - - - - The parameter class name to use. - - - "System.Data.SqlClient.SqlParameter" - - - - - The ParameterDbType class name to use. - - - "System.Data.SqlDbType" - - - - - The ParameterDbTypeProperty class name to use. - - - SqlDbType in SqlParamater.SqlDbType, - OracleType in OracleParameter.OracleType. - - - - - The dataAdapter class name to use. - - - "System.Data.SqlDbType" - - - - - The commandBuilder class name to use. - - - "System.Data.OleDb.OleDbCommandBuilder", - "System.Data.SqlClient.SqlCommandBuilder", - "Microsoft.Data.Odbc.OdbcCommandBuilder" - - - - - Name used to identify the provider amongst the others. - - - - - Description. - - - - - Parameter prefix use in store procedure. - - @ for Sql Server. - - - - Check if this provider is Odbc ? - - - - - Get the ParameterDb Type for this provider. - - An object. - -
-
diff --git a/Examples/npetshop2/External-bin/IBatisNet.DataAccess.dll b/Examples/npetshop2/External-bin/IBatisNet.DataAccess.dll deleted file mode 100644 index 28be3034b355bbe401df530013efb5e3fcfba81e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 49152 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 W7}vnK2F5iou7Pn4jBCKv!2bb_habZL diff --git a/Examples/npetshop2/External-bin/IBatisNet.DataAccess.xml b/Examples/npetshop2/External-bin/IBatisNet.DataAccess.xml deleted file mode 100644 index f2fb8ab..0000000 --- a/Examples/npetshop2/External-bin/IBatisNet.DataAccess.xml +++ /dev/null @@ -1,1369 +0,0 @@ - - - - IBatisNet.DataAccess - - - - - Summary description for - - - - - Do not use direclty, only for serialization. - - - - - Initialize dao object. - - - - - The implementation class of the dao. - - IBatisNet.DataAccess.Test.Implementations.MSSQL.SqlAccountDao - - - - The Interface class that the dao must implement. - - - - - The dao interface type. - - - - - The dao implementation type. - - - - - The concrete dao. - - - - - The proxy dao. - - - - - The DaoManager who manage this dao. - - - - - Summary description for DaoProxy. - - - - - Constructor for a DaoProxy - - - - - Create a new proxy for the Dao - - The dao object to proxy - - - - - - - - - - - - - - - - - - - Description résumée de DaoSessionHandler. - - - - - An empty object array. - - - - - Do not use direclty, only for serialization. - - - - - Constructor - - - - - - - Build an implementation of the IDaoSessionHandler - - An implementation - - - - - - - - - - - - Examples of Type: "IBatisNet.DataAccess.DaoSessionHandlers.SimpleDaoSessionHandler" - - - - - - - - - - Summary description for DomDaoManagerBuilder. - - - - - Key for default config name - - - - - Key for default provider name - - - - - Key for default dao session handler name - - - - - Token for providers config file name. - - - - - Token for xml path to DaoConfig providers element. - - - - - Constructor. - - - - - Configure DaoManagers from via the default file config. - (accesd as relative ressource path from your Application root) - - - - - Configure DaoManagers from a file path. - - - A relative ressource path from your Application root - or a absolue file path file:\\c:\dir\a.config - - - - - Configure DaoManagers from a stream. - - A stream resource - - - - Configure DaoManagers from a FileInfo. - - A FileInfo resource - An SqlMap - - - - Configure DaoManagers from an Uri. - - A Uri resource - - - - - Configure and monitor the configuration file for modifications and - automatically reconfigure - - - Delegate called when a file is changed to rebuild the - - - - - Configure and monitor the configuration file for modifications and - automatically reconfigure - - - A relative ressource path from your Application root - or an absolue file path file://c:\dir\a.config - - - Delegate called when the file has changed, to rebuild the dal. - - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A FileInfo to your config file. - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - Called when the configuration has been updated. - - The state config. - - - - Build DaoManagers from config document. - - - - - Load and build the dao managers. - - The scope of the configuration - - - - Load and initialize providers from specified file. - - The scope of the configuration - - - - Load and initialize custom DaoSession Handlers. - - The scope of the configuration - - - - Build dao contexts - - The scope of the configuration - - - - Initialize the list of variables defined in the - properties file. - - The scope of the configuration - - - - Initialize the provider - - The scope of the configuration - A provider - - - - Build the data source object - - The scope of the configuration - A DataSource - - - - Parse dao factory tag - - The scope of the configuration - - - - - Summary description for DaoSessionHandlerFactory. - - - - - Static constructor - - - - - - - - - - - - - - - - - An ADO.NET implementation of the DataAccess Session . - - - - - Abstract definition of a DataAccess Session - - - - - - - - - - The DaoManager that manages this Dao instance will be passed - in as the parameter to this constructor automatically upon - instantiation. - - - - - - Complete (commit) a transsaction - - - - - Opens a database connection. - - - - - Closes the connection - - - - - Begins a transaction. - - - - - Begins a database transaction - - Open a connection. - - - - Begins a transaction at the data source with the specified IsolationLevel value. - - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - - - - - - - - Create an IDataParameter - - An IDataParameter. - - - - - - - - - - - - - - - - - Releasing, or resetting resources. - - - - - - - - - - - - - - - - - - - - Holds value of connection - - - - - Holds value of transaction - - - - - - - - - - - - Complete (commit) a transaction - - - Use in 'using' syntax. - - - - - Opens a database connection. - - - - - Closes the connection - - - - - Begins a transaction. - - - Oepn a connection. - - - - - Begins a database transaction - - Open a connection. - - - - Begins a transaction at the data source with the specified IsolationLevel value. - - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - - - - - - - - Create an IDataParameter - - An IDataParameter. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Changes the vote for transaction to commit (true) or to abort (false). - - - - - Summary description for SimpleDaoSessionHandler. - - - - - Description résumée de IDaoSessionHandler. - - - - - - - - - - - - - - The properties scope - A collection of object useful to init - - - - - - - - - - - - - - - - - - - - - - - An SqlMappper implementation of the DataAccess Session. - - - - - - - - - - - - Complete (commit) a transaction - - - Use in 'using' syntax. - - - - - Opens a database connection. - - - - - Closes the connection - - - - - Begins a transaction. - - - - - Begins a database transaction - - Open a connection. - - - - Begins a transaction at the data source with the specified IsolationLevel value. - - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Releasing, or resetting resources. - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for SqlMapDaoSessionHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The DataAccessException is thrown when an error in the Dao occurs. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance - using the message parameter. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance to - the Message property of the passed in exception. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception - that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous - exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference - (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the - class with serialized data. - - - This constructor is called during deserialization to reconstitute the - exception object transmitted over a stream. - - - The that holds the serialized - object data about the exception being thrown. - - - The that contains contextual - information about the source or destination. - - - - - Mark a class as a Dao object. - - - - - Description résumée de ConfigurationScope. - - - - - Default constructor - - - - - The current context node we are analizing - - - - - The XML dao config file - - - - - Tell us if we use Configuration File Watcher - - - - - Get the request's error context - - - - - List of providers - - - - - List of global properties - - - - - List of Dao Section Handlers - - - - - An error context to help us create meaningful error messages. - - - - - Clear the error context - - - - - ToString method for ErrorContext - - - - - - The resource causing the problem - - - - - The activity that was happening when the error happened - - - - - The object ID where the problem happened - - - - - More information about the error - - - - - The cause of the error - - - - - Definition for session container. - - - - - Store the local session on the container. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session from the container. - - - - - Get the local session - - - - - Build a session container for a Windows or Web context. - When running in the context of a web application the session object is - stored in HttpContext items and has 'per request' lifetime. - When running in the context of a windows application the session object is - stored in a with a TLS (ThreadLocalStorage). - - - - - Get a session container for a Windows or Web context. - - The DaoManager name. - - - - - Session container for web application. - - - - - Token for SqlMapConfig xml root. - - - - - Constructor - - The DaoManager name. - - - - Store the local session on the container. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session from the container. - - - - - Get the local session - - - - - Session container for windows/console application. - - - - - Store the local session on the container. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session from the container. - - - - - Get the local session - - - - - DaoManager is a facade class that provides convenient access to the rest - of the DAO framework. It's primary responsibilities include: - - Reading configuration information and initializing the framework - - Managing different contexts for different configurations - - Providing access to Dao implementation - - Providing access to the DaoSession pool for connections, transactions - - -
-             Exemple 1:
-             DaoManager daoManager = DaoManager.GetInstance("PetStore"); 
-             ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category");
-             DaoSession daoSession = daoManager.GetDaoSession();
-             daoSession.OpenConnection();
-             ArrayList categoryList = categoryGetCategoryList(5,daoSession);
-             daoSession.CloseConnection(daoSession);
-             

- Exemple 2: - DaoManager daoManager = DaoManager.GetInstance("PetStore"); - ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category"); - daoManager.OpenConnection(); - ArrayList categoryList = categoryGetCategoryList(5); - daoManager.CloseConnection(); - - Exemple 3: - Product p1 = new Product(); - Product p2 = new Product(); - Category c 1= new Category() - c1.Add(p1); - c2.Add(p2); -

- DaoManager daoManager = DaoManager.GetInstance("PetStore"); - ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category"); - IProductDao productDao = (IProductDao) daoManager.GetDao("Product"); - daoManager.BeginTransaction(); - try - { - productInsert(p1); - productInsert(p2); - categoryInsert(c1); - daoManager.CommitTransaction(); - } - catch - { - daoManager.RollBackTransaction(); - }

-            
-        
-        
-            
-            Key for default context name
-            
-        
-        
-             
-             
-             
-            
-            (contextName, daoManager)
-            
-        
-        
-            
-            Container session unique for each thread. 
-            
-        
-        
-            
-            Make the default constructor private to prevent
-            instances from being created.
-            
-        
-        
-            
-            Configure an DaoManager from via the default file config.
-            (accesd as relative ressource path from your Application root)
-            
-        
-        
-            
-            Configure an DaoManager from via a file.
-            
-            
-            A relative ressource path from your Application root.
-            
-        
-        
-            
-            Configure and monitor the configuration file for modifications and 
-            automatically reconfigure  
-            
-            
-            Delegate called when a file is changed to rebuild the 
-            
-        
-        
-             
-             Configure and monitor the configuration file for modifications and 
-             automatically reconfigure  
-             
-             
-             A relative ressource path from your Application root.
-             
-            
-             Delegate called when the file has changed, to rebuild the dal.
-             
-        
-        
-            
-            Cleared all reference to 
-            
-        
-        
-            
-            Create anew instance of a DaoManager
-            
-            A DaoManager.
-        
-        
-            
-            Gets the default DaoManager.
-            
-            A DaoManager.
-        
-        
-            
-            Gets a DaoManager registered with the specified id.
-            
-            The name of the DaoManger.
-            A DaoManager.
-        
-        
-            
-            Get the DaoManager associated with this a Dao instance
-            
-            A Dao instance.
-            A DaoManager
-        
-        
-            
-            Register a DaoManager
-            
-            
-            
-        
-        
-            
-            Get a new DaoSession
-            
-            
-        
-        
-            
-            Check if a DaoSession is started.
-            
-            True or False
-        
-        
-            
-            Open a connection.
-            
-            A IDalSession.
-        
-        
-            
-            Close a connection
-            
-        
-        
-            
-            Begins a database transaction.
-            
-            A IDalSession
-        
-        
-            
-            Begins a database transaction with the specified isolation level.
-            
-            
-            The isolation level under which the transaction should run.
-            
-            A IDalSession.
-        
-        
-            
-            Commits the database transaction.
-            
-            
-            Close the connection.
-            
-        
-        
-            
-            Rolls back a transaction from a pending state.
-            
-            
-            Close the connection.
-            
-        
-        
-            
-            Gets a Dao instance for the requested interface type.
-            
-            The requested interface type.
-            A Dao instance
-        
-        
-            
-            Register a dao
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            DaoManger name
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Gets a Dao instance for the requested interface type.
-            
-        
-        
-            
-            Summary description for MessageManager.
-            
-        
-        
-            
-            Constructor.
-            
-        
-        
-            
-            Gets a resource stream.
-            
-            The resource key.
-            A resource stream.
-        
-        
-            
-            Formats a message stored in the assembly resource file.
-            
-            The resource key.
-            The format arguments.
-            A formatted string.
-        
-        
-            
-            Gets a message manager for the assembly resource file.
-            
-        
-        
-            
-            Gets the message with the specified key from the assembly resource file.
-            
-            Key of the item to retrieve from the resource file.
-            Value from the resource file identified by the key.
-        
-        
-            
-            Class used to expose constants that represent keys in the resource file.
-            
-        
-    
-
diff --git a/Examples/npetshop2/External-bin/IBatisNet.DataMapper.dll b/Examples/npetshop2/External-bin/IBatisNet.DataMapper.dll
deleted file mode 100644
index 4cd22a925824a2051f2fde8261c03784834b6b84..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 184320
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
-
-    
-        IBatisNet.DataMapper
-    
-    
-        
-            
-            Summary description for DefaultPreparedCommand.
-            
-        
-        
-            
-            Summary description for IPreparedCommand.
-            
-        
-        
-            
-            Create an IDbCommand for the IDalSession and the current SQL Statement
-            and fill IDbCommand IDataParameter's with the parameterObject.
-            
-            
-            The IDalSession
-            The IStatement
-            
-            The parameter object that will fill the sql parameter
-            
-            An IDbCommand with all the IDataParameter filled.
-        
-        
-            
-            Create an IDbCommand for the IDalSession and the current SQL Statement
-            and fill IDbCommand IDataParameter's with the parameterObject.
-            
-            
-            The IDalSession
-            The IStatement
-            
-            The parameter object that will fill the sql parameter
-            
-            An IDbCommand with all the IDataParameter filled.
-        
-        
-            
-            
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            Summary description for EmbedParamsPreparedCommand.
-            
-        
-        
-            
-            
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            Summary description for IPreparedCommandProxy.
-            
-        
-        
-            
-            Constructor for a connection proxy
-            
-            The connection which been proxified.
-        
-        
-            
-            Static constructor
-            
-            The connection which been proxified.
-            A proxy
-        
-        
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            Summary description for PreparedCommandFactory.
-            
-        
-        
-            
-            Get an IPreparedCommand.
-            
-            
-        
-        
-            
-            TypeAlias.
-            
-        
-        
-            
-            Do not use direclty, only for serialization.
-            
-        
-        
-            
-            Constructor
-            
-            a type.
-        
-        
-            
-            Initialize the object, 
-            try to idenfify the .Net type class from the corresponding name.
-            
-        
-        
-            
-            Name used to identify the typeAlias amongst the others.
-            
-             Account
-        
-        
-            
-            The type class for the typeAlias
-            
-        
-        
-            
-            The class name to identify the typeAlias.
-            
-            Com.Site.Domain.Product
-        
-        
-            
-            Summary description for TypeHandler.
-            
-        
-        
-            
-            Do not use direclty, only for serialization.
-            
-        
-        
-            
-            Initialize the object, 
-            try to idenfify the .Net type class from the corresponding name.
-            
-        
-        
-            
-            CLR type
-            
-        
-        
-            
-            The type class for the TypeName
-            
-        
-        
-            
-            dbType name
-            
-        
-        
-            
-            callback alias name
-            
-        
-        
-            
-            Summary description for FifoCacheController.
-            
-        
-        
-            
-            Summary description for ICacheController.
-            
-        
-        
-            
-            Clears all elements from the cache.
-            
-        
-        
-            
-            Configures the CacheController
-            
-            
-        
-        
-            
-            Adds an item with the specified key and value into cached data.
-            Gets a cached object with the specified key.
-            
-            The cached object or null
-        
-        
-            
-            
-            
-        
-        
-            
-            Clears all elements from the cache.
-            
-        
-        
-            
-            Configures the cache
-            
-        
-        
-            
-            Adds an item with the specified key and value into cached data.
-            Gets a cached object with the specified key.
-            
-            The cached object or null
-        
-        
-            
-            Summary description for LruCacheController.
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Clears all elements from the cache.
-            
-        
-        
-            
-            Configures the cache
-            
-        
-        
-            
-            Adds an item with the specified key and value into cached data.
-            Gets a cached object with the specified key.
-            
-            The cached object or null
-        
-        
-            
-            Summary description for MemoryCacheControler.
-            
-        
-        
-            
-            Constructor
-            
-        
-        
-            
-            Clears all elements from the cache.
-            
-        
-        
-            
-            Configures the cache
-            
-        
-        
-            
-            Adds an item with the specified key and value into cached data.
-            Gets a cached object with the specified key.
-            
-            The cached object or null
-        
-        
-            
-            Class to implement a strong (permanent) reference.
-            
-        
-        
-            
-            Gets the object (the target) referenced by this instance.
-            
-        
-        
-            
-            Summary description for MemoryCacheLevel.
-            
-        
-        
-            
-            Constant for weak caching
-            This cache model is probably the best choice in most cases. It will increase
-            performance for popular results, but it will absolutely release the memory to
-            be used in allocating other objects, assuming that the results are not currently
-            in use.
-            References an object while still allowing it to be garbage collected.
-            
-        
-        
-            
-            Constant for strong caching.
-            This cache model will guarantee that the results stay in memory until the cache 
-            is explicitly flushed. This is ideal for results that are:
-            
-            very small
-            absolutely static
-            used very often
-            
-            The advantage is that performance will be very good for this particular query.
-            The disadvantage is that if the memory used by these results is needed, then it
-            will not be released to make room for other objects (possibly more important
-            objects).
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Creates a new instance of CacheLevel
-            
-            The type of the CacheLevel.
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Summary description for CacheModel.
-            
-        
-        
-            
-            Constant to turn off periodic cache flushes
-            
-        
-        
-            
-            Constructor
-            
-        
-        
-            
-            Constructor
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Event listener
-            
-            A MappedStatement on which we listen ExecuteEventArgs event.
-        
-        
-            
-            FlushHandler which clear the cache 
-            
-            
-            
-        
-        
-            
-            Clears all elements from the cache.
-            
-        
-        
-            
-            Add a property
-            
-            The name of the property
-            The value of the property
-        
-        
-            
-            Identifier used to identify the CacheModel amongst the others.
-            
-        
-        
-            
-            Cache controller implementation name.
-            
-        
-        
-            
-            Set or get the flushInterval (in Ticks)
-            
-        
-        
-            
-            Adds an item with the specified key and value into cached data.
-            Gets a cached object with the specified key.
-            
-            The cached object or null
-            
-            A side effect of this method is that is may clear the cache
-            if it has not been cleared in the flushInterval.
-             
-        
-        
-            
-            
-            
-        
-        
-            
-            Summary description for FlushInterval.
-            
-        
-        
-            
-            Calcul the flush interval value in ticks
-            
-        
-        
-            
-            Flush interval in hours
-            
-        
-        
-            
-            Flush interval in minutes
-            
-        
-        
-            
-            Flush interval in seconds
-            
-        
-        
-            
-            Flush interval in milliseconds
-            
-        
-        
-            
-            Get the flush interval value
-            
-        
-        
-            
-            Summary description for InlineParameterMapParser.
-            
-        
-        
-            
-            Constructor
-            
-            
-        
-        
-            
-            Parse Inline ParameterMap
-            
-            
-            
-            A new sql command text.
-            
-        
-        
-            
-            Parse inline parameter with syntax as
-            #propertyName,type=string,dbype=Varchar,direction=Input,nullValue=N/A,handler=string#
-            
-            
-            
-            
-            
-        
-        
-            
-            Parse inline parameter with syntax as
-            #propertyName:dbType:nullValue#
-            
-            
-            
-            
-            
-        
-        
-            
-            Resolve TypeHandler
-            
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            Summary description for ParameterMap.
-            
-        
-        
-            
-            Do not use direclty, only for serialization.
-            
-        
-        
-            
-            Default constructor
-            
-            
-        
-        
-            
-            Get the ParameterProperty at index.
-            
-            Index
-            A ParameterProperty
-        
-        
-            
-            Get a ParameterProperty by his name.
-            
-            The name of the ParameterProperty
-            A ParameterProperty
-        
-        
-            
-            Add a ParameterProperty to the ParameterProperty list.
-            
-            
-        
-        
-            
-            Insert a ParameterProperty ine the ParameterProperty list at the specified index..
-            
-            
-            The zero-based index at which ParameterProperty should be inserted. 
-            
-            The ParameterProperty to insert. 
-        
-        
-            
-            Retrieve the index for array property
-            
-            
-            
-        
-        
-            
-            Get all Parameter Property Name 
-            
-            A string array
-        
-        
-            
-            Set parameter value, replace the null value if any.
-            
-            
-            
-            
-        
-        
-            
-            Initialize the parameter properties child.
-            
-            
-        
-        
-            
-             Get the parameter properties child for the xmlNode parameter.
-            
-            
-        
-        
-            
-            Identifier used to identify the ParameterMap amongst the others.
-            
-        
-        
-            
-            The collection of ParameterProperty
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Extend Parametermap attribute
-            
-            The id of a ParameterMap
-        
-        
-            
-            Summary description for ParameterProperty.
-            
-        
-        
-            
-            Constructor
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            Specify the custom type handlers to used.
-            
-            Will be an alias to a class wchic implement ITypeHandlerCallback
-        
-        
-            
-            Specify the CLR type of the parameter.
-            
-            
-            The type attribute is used to explicitly specify the property type to be read.
-            Normally this can be derived from a property through reflection, but certain mappings such as
-            HashTable cannot provide the type to the framework.
-            
-        
-        
-            
-            The typeHandler used to work with the parameter.
-            
-        
-        
-            
-            Column Name for output parameter 
-            in store proccedure.
-            
-        
-        
-            
-            Column size.
-            
-        
-        
-            
-            Column Scale.
-            
-        
-        
-            
-            Column Precision.
-            
-        
-        
-            
-            Give an entry in the 'DbType' enumeration
-            
-            
-            For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money...
-            
- For Oracle, give an OracleType Enumeration : Byte, Int16, Number... -
-
- - - The direction attribute of the XML parameter. - - Input, Output, InputOutput - - - - Indicate the direction of the parameter. - - Input, Output, InputOutput - - - - Property name used to identify the property amongst the others. - - EmailAddress - - - - Tell if a nullValue is defined. - - - - - Null value replacement. - - "no_email@provided.com" - - - - Summary description for Discriminator. - - - - - (discriminatorValue (string), ResultMap) - - - - - The subMaps name who used this discriminator - - - - - Constructor - - - - - Initilaize the underlying mapping - - - - - - - Initialize the Discriminator - - - - - - Add a subMap that the discrimator must treat - - A subMap - - - - Find the SubMap to use. - - the discriminator value - The find ResultMap - - - - Specify the custom type handlers to used. - - Will be an alias to a class wchic implement ITypeHandlerCallback - - - - Give an entry in the 'DbType' enumeration - - - For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... -
- For Oracle, give an OracleType Enumeration : Byte, Int16, Number... -
-
- - - Specify the CLR type of the result. - - - The type attribute is used to explicitly specify the property type of the property to be set. - Normally this can be derived from a property through reflection, but certain mappings such as - HashTable cannot provide the type to the framework. - - - - - Column Index - - - - - Column Name - - - - - Null value replacement. - - "no_email@provided.com" - - - - Th underlying ResultProperty - - - - - Summary description for ResultMap. - - - - - Do not use direclty, only for serialization. - - - - - Initialize the resultMap from an xmlNode.. - - - - - - Get the result properties and the subMap properties. - - - - - - Create an instance Of result. - - An object. - - - - Add a ResultProperty to the list of ResultProperty. - - The property to add. - - - - Set the value of an object property. - - The object to set the property. - The result property to use. - The database value to set. - - - - - - - - - - - The sqlMap namespace - - - - - The discriminator used to choose the good SubMap - - - - - The collection of result properties. - - - - - Identifier used to identify the resultMap amongst the others. - - GetProduct - - - - Extend ResultMap attribute - - - - - The output type class of the resultMap. - - - - - The output class name of the resultMap. - - Com.Site.Domain.Product - - - - Summary description for ResultProperty. - - - - - - - - - - Do not use direclty, only for serialization. - - - - - Initialize the PropertyInfo of the result property. - - - - - - - Initialize the PropertyInfo of the result property - for AutoMapper - - A PropertyInfoot. - - - - - - - - - - - - Specify the custom type handlers to used. - - Will be an alias to a class wchic implement ITypeHandlerCallback - - - - Tell us if we must lazy load this property.. - - - - - The typeHandler used to work with the result property. - - - - - Give an entry in the 'DbType' enumeration - - - For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... -
- For Oracle, give an OracleType Enumeration : Byte, Int16, Number... -
-
- - - Specify the CLR type of the result. - - - The type attribute is used to explicitly specify the property type of the property to be set. - Normally this can be derived from a property through reflection, but certain mappings such as - HashTable cannot provide the type to the framework. - - - - - Column Index - - - - - The name of the statement to retrieve the property - - - - - The name of a nested ResultMap to set the property - - - - - Column Name - - - - - The property name used to identify the property amongst the others. - - - - - - - - - - Tell if a nullValue is defined. - - - - - Null value replacement. - - "no_email@provided.com" - - - - A nested ResultMap use to set a property - - - - - Summary description for SubMap. - - - - - Constructor - - - - - Discriminator value - - - - - The name of the ResultMap used if the column value is = to the Discriminator Value - - - - - The resultMap used if the column value is = to the Discriminator Value - - - - - Summary description for BaseTag. - - - - - SqlTag is a children element of dynamic Sql element. - SqlTag represent any binary unary/conditional element (like isEmpty, isNull, iEquall...) - or other element as isParameterPresent, isNotParameterPresent, iterate. - - - - - Summary description for ISqlChild. - - - - - Summary description for DynamicParent. - - - - - - - - - - - - - - - - - - - - - - - Parent tag element - - - - - Prepend attribute - - - - - Handler for this sql tag - - - - - - - - - - Property attribute - - - - - Summary description for Conditional. - - - - - CompareProperty attribute - - - - - CompareValue attribute - - - - - Summary description for DynamicTag. - - - - - - - - - - Represent an isEmpty sql tag element. - - - - - - - - - - Represent an isEqual sql tag element. - - - - - - - - - - Represent an isGreaterEqual sql tag element. - - - - - - - - - - Represent an isGreaterThan sql tag element. - - - - - - - - - - Represent an isLessEqual sql tag element. - - - - - - - - - - Represent an isLessThan sql tag element. - - - - - - - - - - Represent an isNotEmpty sql tag element. - - - - - - - - - - Represent an isNotEqual sql tag element. - - - - - - - - - - Represent an isNotNull sql tag element. - - - - - - - - - - Represent an isNotParameterPresent sql tag element. - - - - - - - - - - Represent an isEmpty sql tag element. - - - - - - - - - - Represent an isNull sql tag element. - - - - - - - - - - Represent an isParameterPresent sql tag element. - - - - - - - - - - Represent an isPropertyAvailable sql tag element. - - - - - - - - - - Represent an iterate sql tag element. - - - - - - - - - - Conjonction attribute - - - - - Close attribute - - - - - Open attribute - - - - - Description résumée de BaseTagHandler. - - - - - Summary description for ISqlTagHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BODY TAG - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Description résumée de ConditionalTagHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for DynamicTagHandler. - - - - - - - - - - - - - - IsEmptyTagHandler represent a isEmpty tag element in a dynamic mapped statement. - - - - - - - - - - - - - - Summary description for IsEqualTagHandler. - - - - - - - - - - - - - - Summary description for IsGreaterEqualTagHandler. - - - - - - - - - - - - - - Summary description for IsGreaterThanTagHandler. - - - - - - - - - - - - - - Summary description for IsLessEqualTagHandler. - - - - - - - - - - - - - - Summary description for IsLessThanTagHandler. - - - - - - - - - - - - - - Summary description for IsNotEmptyTagHandler. - - - - - - - - - - - - - - Summary description for IsNotEqualTagHandler. - - - - - - - - - - - - - - Summary description for IsNotNullTagHandler. - - - - - Summary description for IsNullTagHandler. - - - - - - - - - - - - - - - - - - - - - - - Summary description for IsNotParameterPresentTagHandler. - - - - - Summary description for IsParameterPresentTagHandler. - - - - - - - - - - - - - - - - - - - - - - - Summary description for IsNotPropertyAvailableTagHandler. - - - - - Summary description for IsPropertyAvailableTagHandler. - - - - - - - - - - - - - - - - - - - - - - - Summary description for IterateContext. - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp01212002.asp - http://www.microsoft.com/mspress/books/sampchap/6173.asp - http://www.dur.ac.uk/barry.cornelius/java/a.taste.of.csharp/onefile/ - - - - - Constructor - - - - - - Sets the enumerator to its initial position, - which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - - True if the enumerator was successfully advanced to the next element; - False if the enumerator has passed the end of the collection. - - - - - Removes from the underlying collection the last element returned by the iterator. - - - - - Gets the current element in the collection. - - - - - Gets the index of the current element in the collection. - - - - - Return true if the current element is the first. - - - - - Return true if the current element is the last. - - - - - Returns true if the iteration has more elements. (In other words, returns true - if next would return an element rather than throwing an exception.) - - - - - Summary description for IterateTagHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for SqlTagContext. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DynamicSql represent the root element of a dynamic sql statement - - - ... - - - - - Summary description for ISql. - - - - - Get the RequestScope for this request. - - - The parameter object (used by DynamicSql/SimpleDynamicSql). - Use to complete the sql statement. - - - The RequestScope. - - - - Constructor - - The mapped statement. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for SqlText. - - - - - - - - - - - - - - - - - - - - Summary description for SimpleDynamicSql. - - - - - Constructor - - The sql statement. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Build the PreparedStatement - - - - - - - - Summary description for ProcedureSql. - - - - - Constructor - - The statement. - - - - - - - - - - - - - Build the PreparedStatement - - - - - - - - Summary description for StaticSql. - - - - - Constructor - - The statement. - - - - Get the sql command text to execute. - - The parameter object (used in DynamicSql) - - The sql command text. - - - - Build the PreparedStatement - - - - - - - Summary description for delete. - - - - - Summary description for Statement. - - - - - Summary description for ISql. - - - - - Create an instance of result class. - - An object. - - - - Create an instance of 'IList' class. - - An object which implment IList. - - - - Identifier used to identify the statement amongst the others. - - - - - The type of the statement (text or procedure). - - - - - Extend statement attribute - - - - - The sql statement to execute. - - - - - The ResultMap used by the statement. - - - - - The parameterMap used by the statement. - - - - - The CacheModel used by this statement. - - - - - The CacheModel name to use. - - - - - The list class type to use for strongly typed collection. - - - - - The result class type to used. - - - - - The parameter class type to used. - - - - - Do not use direclty, only for serialization. - - - - - Initialize an statement for the sqlMap. - - The scope of the configuration - - - - Create an instance of result class. - - An object. - - - - Create an instance of 'IList' class. - - An object which implment IList. - - - - Extend statement attribute - - - - - The CacheModel name to use. - - - - - Tell us if a cacheModel is attached to this statement. - - - - - The CacheModel used by this statement. - - - - - The list class name to use for strongly typed collection. - - - - - The list class type to use for strongly typed collection. - - - - - The result class name to used. - - - - - The result class type to used. - - - - - The parameter class name to used. - - - - - The parameter class type to used. - - - - - Name used to identify the statement amongst the others. - - - - - The sql statement - - - - - The ResultMap name used by the statement. - - - - - The ParameterMap name used by the statement. - - - - - The ResultMap used by the statement. - - - - - The parameterMap used by the statement. - - - - - The type of the statement (text or procedure) - Default Text. - - Text or StoredProcedure - - - - Do not use direclty, only for serialization. - - - - - The Generate tag used by a generated delete statement. - (CRUD operation) - - - - - Represent a generate tag element. - The generation would happen at the point where the - SqlMapClient instance is built. - - - - - Do not use direclty, only for serialization. - - - - - The table name used to build the SQL query. - - - Will be used to get the metadata to build the SQL if needed. - - - - - The by attribute is used to generate the where clause. - - The by="" attribute can support multiple colums. - - < delete ...> - <generate table="EMPLOYEE" by="EMPLOYEE_ID, LAST_MOD_DATE" /> - </delete> - - - - - Represent an insert statement. - - - - - Do not use direclty, only for serialization. - - - - - Extend statement attribute - - - - - The selectKey statement used by an insert statement. - - - - - The Generate tag used by a generated insert statement. - (CRUD operation) - - - - - Construct the list of IDataParameters for the statement - and prepare the sql - - - - - The list of IDataParameter name used by the PreparedSql. - - - - - The list of IDataParameter to use for the PreparedSql. - - - - - The prepared statement. - - - - - Summary description for PreparedStatementFactory. - - - - - Constructor - - - - - - - - - Create a list of IDataParameter for the statement and build the sql string. - - - - - For store procedure, auto discover IDataParameters for stored procedures at run-time. - - The current session. - - - - Create IDataParameters for command text statement. - - - - - Create IDataParameters for procedure statement. - - - - - Parse sql command text. - - - - - Represent a store Procedure. - - - - - Do not use direclty, only for serialization. - - - - - - - The scope of the configuration - - - - The type of the statement StoredProcedure. - - - - - Extend statement attribute - - - - - Summary description for Select. - - - - - Do not use direclty, only for serialization. - - - - - The Generate tag used by a generated select statement. - (CRUD operation) - - - - - Represent a SelectKey tag element. - - - - - Do not use direclty, only for serialization. - - - - - Extend statement attribute - - - - - The property name object to fill with the key. - - - - - The type of the selectKey tag : 'Pre' or 'Post' - - - - - True if it is a post-generated key. - - - - - Summary description for SqlGenerator. - - - - - Creates SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an select SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an insert SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an update SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an delete SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Summary description for Update. - - - - - Do not use direclty, only for serialization. - - - - - The Generate tag used by a generated update statement. - (CRUD operation) - - - - - Builds SqlMapper instances from a supplied resource (e.g. XML configuration file) - - - - - Default congig name - - - - - Default provider name - - - - - Dot representation - - - - - Token for SqlMapConfig xml root. - - - - - Token for xml path to SqlMapConfig settings element. - - - - - Token for providers config file name. - - - - - Token for useStatementNamespaces attribute. - - - - - Token for cacheModelsEnabled attribute. - - - - - Token for validateSqlMap attribute. - - - - - Token for validateSqlMapConfig attribute. - - - - - Token for embedStatementParams attribute. - - - - - Token for xml path to SqlMapConfig providers element. - - - - - Default constructor - - - - - Constructs a DomSqlMapBuilder - with or without configuration document validation using the - SqlMapConfig schema. - - - Specify whether the configuration Xml document should be - validated with the SqlMapConfig schema. - - - - - Configure a SqlMapper from default resource file named SqlMap.config. - - An SqlMap - The file path is relative to the application root. - - - - Configure an SqlMap. - - An xml sql map configuration document. - the SqlMap - - - - Configure a SqlMapper from a file path. - - - A relative ressource path from your Application root - or a absolue file path file:\\c:\dir\a.config - - An SqlMap - - - - Configure a SqlMapper from a stream. - - A stream resource - An SqlMap - - - - Configure a SqlMapper from a FileInfo. - - A FileInfo resource - An SqlMap - - - - Configure a SqlMapper from an Uri. - - A Uri resource - - - - - Configure and monitor the default configuration file for modifications - and automatically reconfigure SqlMap. - - An SqlMap - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A relative ressource path from your Application root - or an absolue file path file:\\c:\dir\a.config - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A FileInfo to your config file. - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - Callback called when the SqlMap.config changed. - - The state config. - - - - Build a SqlMapper instance - - An xml configuration document - A data source - - - return an a SqlMapper instance - - - - validate againts schema - - The doc to validate - schema File Name - - - - Load statement, parameters, resultmap. - - - - - - - Used by Dao - - - - Load SqlMap configuration from - from the XmlDocument passed in parameter. - - The xml sql map configuration. - - - - - Reset PreparedStatements cache - - - - - Intilaize an SqlMap. - - - - - Load and initialize providers from specified file. - - - - - Parse the provider tag. - - A provider object. - - - - Load sqlMap statement. - - - - - Process the Sql Statement - - - - - - Parse dynamic tags - - - - - - - - - - - Apply inline paremeterMap - - - - - - - Initialize the list of variables defined in the - properties file. - - - - - Generate the command text for CRUD operation - - - - - - - Build a ParameterMap - - - - - Build a ResultMap - - - - - Register under Statement Name or Fully Qualified Statement Name - - An Identity - The new Identity - - - - Gets a resource stream. - - The schema resource key. - A resource stream. - - - - Summary description for SerializerFactory. - - - - - - - - - - - - - - - - - The DataMapperException is thrown when an error in the SqlMapper component occurs. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance - using the message parameter. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance to - the Message property of the passed in exception. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception - that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous - exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference - (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the - class with serialized data. - - - This constructor is called during deserialization to reconstitute the - exception object transmitted over a stream. - - - The that holds the serialized - object data about the exception being thrown. - - - The that contains contextual - information about the source or destination. - - - - - Summary description for DeleteMappedStatement. - - - - - Summary description for MappedStatement. - - - - - Summary description for IMappedStatement. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The IPreparedCommand to use - - - - - Name used to identify the MappedStatement amongst the others. - This the name of the SQL statment by default. - - - - - The SQL statment used by this MappedStatement - - - - - The SqlMap used by this MappedStatement - - - - - Constructor - - An SqlMap - An SQL statement - - - - Gets a percentage of successful cache hits achieved - - The percentage of hits (0-1), or -1 if cache is disabled. - - - - - - - - - - - - - - - - - - - - - - Retrieve the output parameter and map them on the result object. - This routine is only use is you specified a ParameterMap and some output attribute - or if you use a store procedure with output parameter... - - - The current session. - The result object. - The command sql. - - - - Executes an SQL statement that returns a single row as an Object. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The request scope. - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - - - - - Executes the SQL and retuns all rows selected. This is exactly the same as - calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A List of result objects. - - - - Executes the SQL and retuns a subset of the rows selected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. - - - - Executes the SQL and retuns a List of result objects. - - The request scope. - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - - A List of result objects. - - - - Executes the SQL and and fill a strongly typed collection. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A strongly typed collection of result objects. - - - - Execute an update statement. Also used for delete statement. - Return the number of row effected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of row effected. - - - - Execute an insert statement. Fill the parameter object with - the ouput parameters if any, also could return the insert generated key - - The session - The parameter object used to fill the statement. - Can return the insert generated key. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - - The session used to execute the statement - - - The object used to set the parameters in the SQL. - - - The property of the result object to be used as the key. - - - The property of the result object to be used as the value (or null) - - A hashtable of object containing the rows keyed by keyProperty. - - If a transaction is not in progress, or the database throws an exception. - - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The request scope. - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Process 'select' result properties - - - - - - - - - - - - - - - - - Raise an event ExecuteEventArgs - (Used when a query is executed) - - - - - ToString implementation. - - A string that describes the MappedStatement - - - - - - - - - The IPreparedCommand to use - - - - - Name used to identify the MappedStatement amongst the others. - This the name of the SQL statement by default. - - - - - The SQL statment used by this MappedStatement - - - - - The SqlMap used by this MappedStatement - - - - - Enumeration of the ExecuteQuery method. - - - - - All data tor retrieve 'select' result property - - - As ADO.NET allows to open DataReader per connection at once, we keep - all th data to make the open the 'whish' DataReader after having closed the current. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for InsertMappedStatement. - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for PaginatedDataList. - - - - - Constructor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Provides a view of the IList pramaeter - from the specified position - to the specified position . - - The IList elements. - Starting position for the view of elements. - Ending position for the view of elements. - A view of list. - - - The list that is returned is just a view, it is still backed - by the orignal list. Any changes you make to it will be - reflected in the orignal list. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sets the enumerator to its initial position, - which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the current element in the page. - - - - - Summary description for SelectMappedStatement. - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - Summary description for UpdateMappedStatement. - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The ConfigurationScope maintains the state of the build process. - - - - - Default constructor - - - - - - - Type of the ResultMap - Property name to map - - - - - - - Indicates whether or not to validate the configuration document - - - - - Set if theparser should validate the sqlMap documents - - - - - Tells us if the xml configuration file validate the schema - - - - - The current SqlMap namespace. - - - - - The SqlMapper we are building. - - - - - The current TypeHandlerFactory - - - - - Tell us if we are in a DataAccess context. - - - - - Tell us if we cache model is enabled. - - - - - External data source - - - - - The current context node we are analizing - - - - - The XML SqlMap config file - - - - - A XML SqlMap file - - - - - Tell us if we use Configuration File Watcher - - - - - Tell us if we use statements namespaces - - - - - Get the request's error context - - - - - List of providers - - - - - List of global properties - - - - - Indicates if parameters should be embedded in the sql statement. - - - - - An error context to help us create meaningful error messages. - - - - - Clear the error context - - - - - - - - - - - The resource causing the problem - - - - - The activity that was happening when the error happened - - - - - The object ID where the problem happened - - - - - More information about the error - - - - - Hold data during the process of a mapped statement. - - - - - Default constructor - - - - - Check if the ResultMap is well set, process case of subMap resultMap. - - The current IDataReader - the resultMap to use - - - - Get the request's error context - - - - - The 'select' result property to process after having process the main properties. - - - - - The ResultMap used by this request. - - - - - The parameterMap used by this request. - - - - - The PreparedStatement used by this request. - - - - - Definition for session container. - - - - - Store the local session on the container. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session from the container. - - - - - Get the local session - - - - - Build a session container for a Windows or Web context. - When running in the context of a web application the session object is - stored in HttpContext items and has 'per request' lifetime. - When running in the context of a windows application the session object is - stored in a with a TLS (ThreadLocalStorage). - - - - - Get a session container for a Windows or Web context. - - - - - - Session container for web application. - - - - - Token for SqlMapConfig xml root. - - - - - Constructor - - - - - Store the local session on the container. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session from the container. - - - - - Get the local session - - - - - Session container for windows/console application. - - - - - Store the local session on the container. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session from the container. - - - - - Get the local session - - - - - Summary description for BaseTypeHandler. - - - - - Summary description for ITypeHandler. - - - - - Gets a column value by the name - - - - - - - - Gets a column value by the index - - - - - - - - Retrieve ouput database value of an output parameter - - ouput database value - type used in EnumTypeHandler - - - - - Sets a parameter on a IDbCommand - - the parameter - the parameter value - the dbType of the parameter - - - - Converts the String to the type that this handler deals with - - the tyepe of the property (used only for enum conversion) - the String value - the converted value - - - - Compares two values (that this handler deals with) for equality - - one of the objects - the other object as a String - true if they are equal - - - - - - - - - - Gets a column value by the name - - - - - - - - Gets a column value by the index - - - - - - - - Retrieve ouput database value of an output parameter - - ouput database value - type used in EnumTypeHandler - - - - - Converts the String to the type that this handler deals with - - the tyepe of the property (used only for enum conversion) - the String value - the converted value - - - - Sets a parameter on a IDbCommand - - the parameter - the parameter value - the dbType of the parameter - - - - Compares two values (that this handler deals with) for equality - - one of the objects - the other object as a String - true if they are equal - - - - Boolean TypeHandler. - - - - - - - - - - - - - Description résumée de ByteArrayTypeHandler. - - - - - - - - - - - - - Description résumée de ByteTypeHandler. - - - - - - - - - - - - - Description résumée de CharTypeHandler. - - - - - - - - - - - - - Custom type handler for adding a TypeHandlerCallback - - - - - Performs processing on a value before it is used to set - the parameter of a IDbCommand. - - - The value to be set - Data base type - - - - Description résumée de DateTimeTypeHandler. - - - - - - - - - - - - - Description résumée de DecimalTypeHandler. - - - - - - - - - - - - - Description résumée de Double. - - - - - - - - - - - - - Summary description for EnumTypeHandler. - - - - - Sets a parameter on a IDbCommand - - the parameter - the parameter value - the dbType of the parameter - - - - - - - - - - - - Description résumée de GuidTypeHandler. - - - - - - - - - - - - - Description résumée de Int16TypeHandler. - - - - - - - - - - - - - Summary description for Int32TypeHandler. - - - - - - - - - - - - - Description résumée de Int64TypeHandler. - - - - - - - - - - - - - Allows parameters to be set on the underlying prepared IDbCommand. - TypeHandlerCallback implementations use this interface to - process values before they are set on the IDbCommand. - - - There is no need to implement this. The implementation - will be passed into the TypeHandlerCallback automatically. - - - - - Returns the underlying IDataParameter - - - - - Get the parameter value - - - - - Allows values to be retrieved from the underlying IDataReader. - TypeHandlerCallback implementations use this interface to - get values that they can subsequently manipulate before - having them returned. * or index with these methods. - - - There is no need to implement this. The implementation - will be passed into the TypeHandlerCallback automatically. - - - - - Returns the underlying IDataReader - - - - - Get the parameter value - - - - - A simple interface for implementing custom type handlers. -

- Using this interface, you can implement a type handler that - will perform customized processing before parameters are set - on a IDbCommand and after values are retrieved from - a IDataReader. Using a custom type handler you can extend - the framework to handle types that are not supported, or - handle supported types in a different way. For example, - you might use a custom type handler to implement proprietary - BLOB support (e.g. Oracle), or you might use it to handle - booleans using "Y" and "N" instead of the more typical 0/1. -

-
- - - Performs processing on a value before it is used to set - the parameter of a IDbCommand. - - The interface for setting the value on the IDbCommand. - The value to be set - - - - Performs processing on a value before after it has been retrieved - from a IDataReader. - - The interface for getting the value from the IDataReader. - The processed value. - - - - Casts the string representation of a value into a type recognized by - this type handler. This method is used to translate nullValue values - into types that can be appropriately compared. If your custom type handler - cannot support nullValues, or if there is no reasonable string representation - for this type (e.g. File type), you can simply return the String representation - as it was passed in. It is not recommended to return null, unless null was passed - in. - - - - - - - Description résumée de ObjectTypeHandler. - - - - - - - - - - - - - A ParameterSetter implementation - - - - - Default Constructor - - - - - - Returns the underlying DataParameter - - - - - Set the parameter value - - - - - Description résumée de ResultGetterImpl. - - - - - Creates an instance for a IDataReader and column index - - The dataReader - the column index - - - - Creates an instance for a IDataReader and column name - - The dataReader - the column name - - - - Creates an instance for an output parameter - - value of an output parameter (store procedure) - - - - Returns the underlying IDataReader - - Null for an output parameter - - - - Get the parameter value - - - - - Description résumée de SingleTypeHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - Description résumée de SByteTypeHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - Description résumée de TimespanTypeHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - Not much of a suprise, this is a factory class for TypeHandler objects. - - - - - Constructor - - - - - Get a TypeHandler for a Type - - the Type you want a TypeHandler for - the handler - - - - Get a TypeHandler for a type - - the type you want a TypeHandler for - the database type - the handler - - - - Get a TypeHandler for a type and a dbType type - - the type - the dbType type - the handler - - - - Register (add) a type handler for a type - - the type - the handler instance - - - - Register (add) a type handler for a type and dbType - - the type - the dbType - the handler instance - - - - When in doubt, get the "unknown" type handler - - if I told you, it would not be unknown, would it? - - - - - - - - - - - Implementation of TypeHandler for dealing with unknown types - - - - - Constructor to create via a factory - - the factory to associate this with - - - - Performs processing on a value before it is used to set - the parameter of a IDbCommand. - - - The value to be set - Data base type - - - - Compares two values (that this handler deals with) for equality - - one of the objects - the other object as a String - true if they are equal - - - - Summary description for FlushInterval. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Get the HashCode for this CacheKey - - - - - - ToString implementation. - - A string that give the CacheKey HashCode. - - - - Indicate if the generated key by a selectKey statement - concern a pre or post-generated key. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for ExecuteEventArgs. - - - - - Set or get the statement name - - - - - Summary description for LazyLoadList. - - - - - Constructor for a lazy list loader - - - - - Constructor for a lazy list loader - - The dataSource used to do the query - The mapped statement used to build the list - The parameter object used to build the list - The property's name which been proxified. - The target object which contains the property proxydied. - - - - Static constructor - - The dataSource used the query - The statement used to build the list - The parameter object used to build the list - The property's name which been proxified. - The target object which contains the property proxydied. - A proxy - - - - - - - - - - - - A singleton class to access the default SqlMapper defined by the SqlMap.Config - - - - - - - - - - - Init the 'default' SqlMapper defined by the SqlMap.Config file. - - - - - Get the instance of the SqlMapper defined by the SqlMap.Config file. - - A SqlMapper initalized via the SqlMap.Config file. - - - - Get the instance of the SqlMapper defined by the SqlMap.Config file. (Convenience form of Instance method.) - - A SqlMapper initalized via the SqlMap.Config file. - - - - Summary description for SqlMap. - - - - - Container session unique for each thread. - - - - - Create a new SqlMap - - - - - Set the falg to tell us if cache models were enabled - or not. - - - - - Sets the flag indicating if statements should used embedded - parameters - - - - - Configure an SqlMap. - - An xml sql map configuration document. - the SqlMap - - - - Configure an SqlMap from default resource file named SqlMap.config. - - An SqlMap - The file path is relative to the application root. - - - - Configure an SqlMap from via a relative ressource path. - - - A relative ressource path from your Application root - or an absolue file path file:\\c:\dir\a.config - - An SqlMap - - - - Configure and monitor the default configuration file for modifications - and automatically reconfigure SqlMap. - - An SqlMap - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A relative ressource path from your Application root - or a absolue file path file:\\c:\dir\a.config - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - - - - - - - Open a connection - - - - - Begins a database transaction. - - - - - Begins a database transaction on the currect session - - Open a connection. - - - - Begins a database transaction with the specified isolation level. - - - The isolation level under which the transaction should run. - - - - - Start a database transaction on the current session - with the specified isolation level. - - Open a connection. - - The isolation level under which the transaction should run. - - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - Executes a Sql SELECT statement that returns that returns data - to populate a single object instance. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The single result object populated with the result set data. -
- - - Executes a Sql SELECT statement that returns a single object of the type of the - resultObject parameter. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An object of the type to be returned. - The single result object populated with the result set data. - - - - Alias to QueryForMap, .NET spirit. - Feature idea by Ted Husted. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - - - - Alias to QueryForMap, .NET spirit. - Feature idea by Ted Husted. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the entire result object. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - A List of result objects. -
- - - Executes the SQL and retuns all rows selected. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. -
- - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An Ilist object used to hold the objects. - A List of result objects. -
- - - Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to - automatically scroll through results from a database table. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL - The maximum number of objects to store in each page - A PaginatedList of beans containing the rows - - - - Runs a query with a custom object that gets a chance to deal - with each row as it is processed. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - - A List of result objects. -
- - - Executes a Sql INSERT statement. - Insert is a bit different from other update methods, as it - provides facilities for returning the primary key of the - newly inserted row (rather than the effected rows). This - functionality is of course optional. -

- The parameter object is generally used to supply the input - data for the INSERT values. -

- The name of the statement to execute. - The parameter object. - The primary key of the newly inserted row. - This might be automatically generated by the RDBMS, - or selected from a sequence table or other source. - -
- - - Executes a Sql UPDATE statement. - Update can also be used for any other update statement type, - such as inserts and deletes. Update returns the number of - rows effected. -

- The parameter object is generally used to supply the input - data for the UPDATE values as well as the WHERE clause parameter(s). -

- The name of the statement to execute. - The parameter object. - The number of rows effected. -
- - - Executes a Sql DELETE statement. - Delete returns the number of rows effected. - - The name of the statement to execute. - The parameter object. - The number of rows effected. - - - - Gets a MappedStatement by name - - The name of the statement - The MappedStatement - - - - Adds a (named) MappedStatement. - - The key name - The statement to add - - - - Get a ParameterMap by name - - The name of the ParameterMap - The ParameterMap - - - - Adds a (named) ParameterMap. - - the ParameterMap to add - - - - Gets a ResultMap by name - - The name of the result map - The ResultMap - - - - Adds a (named) ResultMap - - The ResultMap to add - - - - Gets a named TypeAlias from the list of available TypeAlias - - The name of the TypeAlias. - The TypeAlias. - - - - Adds a named TypeAlias to the list of available TypeAlias. - - The key name. - The TypeAlias. - - - - Gets the type object from the specific class name. - - The supplied class name. - The correpsonding type. - - - - - Flushes all cached objects that belong to this SqlMap - - - - - Adds a (named) cache. - - The cache to add - - - - Gets a cache by name - - The name of the cache to get - The cache object - - - - - - - - - - Returns the DalSession instance - currently being used by the SqlMap. - - - - - Tell if the session is started. - - - - - - A flag that determines whether cache models were enabled - when this SqlMap was built. - - - - - A flag that determines whether statements use - embedded parameters. - - - - - The TypeHandlerFactory - - - - - The MappedStatements collection - - - - - The ParameterMap collection - - - - - The ResultMap collection - - - - - The DataSource - - - - - - - - - - Summary description for SqlMapSession. - - - - - - - - - - - - - - - - - Changes the vote to commit (true) or to abort (false) in transsaction - - - - - Holds value of connection - - - - - Holds value of transaction - - - - - Complete (commit) a transaction - - - Use in 'using' syntax. - - - - - Open the connection - - - - - Close the connection - - - - - Begins a database transaction. - - - - - Begins a database transaction - - Open a connection. - - - - Begins a database transaction with the specified isolation level. - - - The isolation level under which the transaction should run. - - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - Create a command object - - - - - - - Create an IDataParameter - - An IDataParameter. - - - - - - - - - - - - - - - - - Releasing, or resetting resources. - - - - - - - - - - - - - - - - - - - - Changes the vote for transaction to commit (true) or to abort (false). - - -
-
diff --git a/Examples/npetshop2/External-bin/NUnitAsp.license.txt b/Examples/npetshop2/External-bin/NUnitAsp.license.txt deleted file mode 100644 index 8fc9975..0000000 --- a/Examples/npetshop2/External-bin/NUnitAsp.license.txt +++ /dev/null @@ -1,12 +0,0 @@ -Permission is hereby granted, free of charge, to any person obtaining a copy of this software -and associated documentation files (the "Software"), to deal in the Software without restriction, -including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, -and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, -INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE -AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT - OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/Examples/npetshop2/External-bin/log4net.dll b/Examples/npetshop2/External-bin/log4net.dll deleted file mode 100644 index bfc63d794555231ab445b1bd1e8d1f21bd543f97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 196608 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

pVp7 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

9h`Pcx8W0ZsP-J(gjnA; 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 diff --git a/Examples/npetshop2/External-bin/log4net.license.txt b/Examples/npetshop2/External-bin/log4net.license.txt deleted file mode 100644 index 007db57..0000000 --- a/Examples/npetshop2/External-bin/log4net.license.txt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ============================================================================ - * The Apache Software License, Version 1.1 - * ============================================================================ - * - * Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The end-user documentation included with the redistribution, if any, must - * include the following acknowledgment: "This product includes software - * developed by the Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, if - * and wherever such third-party acknowledgments normally appear. - * - * 4. The names "log4j" and "Apache Software Foundation" must not be used to - * endorse or promote products derived from this software without prior - * written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", nor may - * "Apache" appear in their name, without prior written permission of the - * Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * on behalf of the Apache Software Foundation. For more information on the - * Apache Software Foundation, please see . - * - */ diff --git a/Examples/npetshop2/External-bin/log4net.xml b/Examples/npetshop2/External-bin/log4net.xml deleted file mode 100644 index 98ecc83..0000000 --- a/Examples/npetshop2/External-bin/log4net.xml +++ /dev/null @@ -1,14792 +0,0 @@ - - - - log4net - - - -

- Appender that logs to a database. - - - - appends logging events to a table within a - database. The appender can be configured to specify the connection - string by setting the property. - The connection type (provider) can be specified by setting the - property. For more information on database connection strings for - your specific database see
http://www.connectionstrings.com/. - - - Records are written into the database either using a prepared - statement or a stored procedure. The property - is set to (System.Data.CommandType.Text) to specify a prepared statement - or to (System.Data.CommandType.StoredProcedure) to specify a stored - procedure. - - - The prepared statement text or the name of the stored procedure - must be set in the property. - - - The prepared statement or stored procedure can take a number - of parameters. Parameters are added using the - method. This adds a single to the - ordered list of parameters. The - type may be subclassed if required to provide database specific - functionality. The specifies - the parameter name, database type, size, and how the value should - be generated using a . - - - - An example of a SQL Server table that could be logged to: - - CREATE TABLE [dbo].[Log] ( - [ID] [int] IDENTITY (1, 1) NOT NULL , - [Date] [datetime] NOT NULL , - [Thread] [varchar] (255) NOT NULL , - [Level] [varchar] (20) NOT NULL , - [Logger] [varchar] (255) NOT NULL , - [Message] [varchar] (4000) NOT NULL - ) ON [PRIMARY] - - - - An example configuration to log to the above table: - - <appender name="ADONetAppender_SqlServer" type="log4net.Appender.ADONetAppender" > - <param name="ConnectionType" value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /> - <param name="ConnectionString" value="data source=GUINNESS;initial catalog=test_log4net;integrated security=false;persist security info=True;User ID=sa;Password=sql" /> - <param name="CommandText" value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message]) VALUES (@log_date, @thread, @log_level, @logger, @message)" /> - <param name="Parameter"> - <param name="ParameterName" value="@log_date" /> - <param name="DbType" value="DateTime" /> - <param name="Layout" type="log4net.Layout.PatternLayout"> - <param name="ConversionPattern" value="%d{yyyy'-'MM'-'dd HH':'mm':'ss'.'fff}" /> - </param> - </param> - <param name="Parameter"> - <param name="ParameterName" value="@thread" /> - <param name="DbType" value="String" /> - <param name="Size" value="255" /> - <param name="Layout" type="log4net.Layout.PatternLayout"> - <param name="ConversionPattern" value="%t" /> - </param> - </param> - <param name="Parameter"> - <param name="ParameterName" value="@log_level" /> - <param name="DbType" value="String" /> - <param name="Size" value="50" /> - <param name="Layout" type="log4net.Layout.PatternLayout"> - <param name="ConversionPattern" value="%p" /> - </param> - </param> - <param name="Parameter"> - <param name="ParameterName" value="@logger" /> - <param name="DbType" value="String" /> - <param name="Size" value="255" /> - <param name="Layout" type="log4net.Layout.PatternLayout"> - <param name="ConversionPattern" value="%c" /> - </param> - </param> - <param name="Parameter"> - <param name="ParameterName" value="@message" /> - <param name="DbType" value="String" /> - <param name="Size" value="4000" /> - <param name="Layout" type="log4net.Layout.PatternLayout"> - <param name="ConversionPattern" value="%m" /> - </param> - </param> - </appender> - - - - - - Abstract base class implementation of that - buffers events in a fixed size buffer. - - - - This base class should be used by appenders that need to buffer a - number of events before logging them. For example the - buffers events and then submits the entire contents of the buffer to - the underlying database in one go. - - - Subclasses should override the - method to deliver the buffered events. - - The BufferingAppenderSkeleton maintains a fixed size cyclic - buffer of events. The size of the buffer is set using - the property. - - A is used to inspect - each event as it arrives in the appender. If the - triggers, then the current buffer is sent immediately - (see ). Otherwise the event - is stored in the buffer. For example, an evaluator can be used to - deliver the events immediately when an ERROR event arrives. - - - The buffering appender can be configured in a mode. - By default the appender is NOT lossy. When the buffer is full all - the buffered events are sent with . - If the property is set to true then the - buffer will not be sent when it is full, and new events arriving - in the appender will overwrite the oldest event in the buffer. - In lossy mode the buffer will only be sent when the - triggers. This can be useful behaviour when you need to know about - ERROR events but not about events with a lower level, configure an - evaluator that will trigger when an ERROR event arrives, the whole - buffer will be sent which gives a history of events leading up to - the ERROR event. - - - - - - Abstract base class implementation of . - - - - This class provides the code for common functionality, such - as support for threshold filtering and support for general filters. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - - - - Implement this interface for your own strategies for printing log statements. - - - - Implementers should consider extending the - class which provides a default implementation of this interface. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Log the logging event in Appender specific way. - - The event to log - - - This method is called to log a message into this appender. - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - The name uniquely identifies the appender. - - - - - A string based interface to configure components. - - - - - Activate the options that were previously set with calls to option setters. - - - This allows to defer activation of the options until all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - - - - Default constructor - - - Empty default constructor - - - - - Finalizes this appender by calling the implementation's - method. - - - - - Initialise the appender based on the options set - - - - - Closes the appender and release resources. - - - - Release any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - This method cannot be overridden by subclasses. This method - delegates the closing of the appender to the - method which must be overridden in the subclass. - - - - - - Performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific - method. - - The event to log. - - - This method cannot be overridden by derived classes. A - derived class should override the method - which is called by this method. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - Calls and checks that - it returns true. - - - - - If all of the above steps succeed then the - will be passed to the abstract method. - - - - - - Checks if the message level is below this appender's threshold. - - to test against. - - - If there is no threshold set, then the return value is always true. - - - - true if the meets the - requirements of this appender. - - - - - Is called when the appender is closed. Derived classes should override - this method if resources need to be released. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Adds a filter to the end of the filter chain. - - - - The Filters are organized in a linked list. - - - Setting this property causes the new filter to be pushed onto the - back of the filter chain. - - - - - - Clears the filter list for this appender. - - - - - Subclasses of should implement this method - to perform actual logging. - - The event to append. - - - A subclass must implement this method to perform - logging of the . - - This method will be called by - if all the conditions listed for that method are met. - - - To restrict the logging of events in the appender - override the method. - - - - - - Called before as a precondition. - - - - This method is called by - before the call to the abstract method. - - - This method can be overridden in a subclass to extend the checks - made before the event is passed to the method. - - - A subclass should ensure that they delegate this call to - this base class if it is overridden. - - - true if the call to should proceed. - - - - Renders the to a string. - - The event to render. - The event rendered as a string. - - - Helper method to render a to - a string. This appender must have a - set to render the to - a string. - - If there is exception data in the logging event and - the layout does not process the exception, this method - will append the exception text to the rendered string. - - - - - - The layout of this appender. - - - See for more information. - - - - - The name of this appender. - - - See for more information. - - - - - The level threshold of this appender. - - - - There is no level threshold filtering by default. - - - See for more information. - - - - - - It is assumed and enforced that errorHandler is never null. - - - - It is assumed and enforced that errorHandler is never null. - - - See for more information. - - - - - - The first filter in the filter chain. - - - - Set to null initially. - - - See for more information. - - - - - - The last filter in the filter chain. - - - See for more information. - - - - - Flag indicating if this appender is closed. - - - See for more information. - - - - - The guard prevents an appender from repeatedly calling its own DoAppend method - - - - - Gets or sets the threshold of this appender. - - - The threshold of the appender. - - - - All log events with lower level than the threshold level are ignored - by the appender. - - - In configuration files this option is specified by setting the - value of the option to a level - string, such as "DEBUG", "INFO" and so on. - - - - - - Gets or sets the for this appender. - - The of the appender - - - The provides a default - implementation for the property. - - - - - - The filter chain. - - The head of the filter chain filter chain. - - - Returns the head Filter. The Filters are organized in a linked list - and so all Filters on this Appender are available through the result. - - - - - - Gets or sets the for this appender. - - The layout of the appender. - - - See for more information. - - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - - The name uniquely identifies the appender. - - - - - - Tests if this appender requires a to be set. - - - - In the rather exceptional case, where the appender - implementation admits a layout but can also work without it, - then the appender should return true. - - - This default implementation always returns true. - - - - true if the appender requires a layout object, otherwise false. - - - - - The default buffer size. - - - The default size of the cyclic buffer used to store events. - This is set to 512 by default. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - the events passed through this appender must be - fixed by the time that they arrive in the derived class'SendBuffer method. - - - - Initialise the appender based on the options set - - - - - Close this appender instance. - - - Close this appender instance. If this appender is marked - as not then the remaining events in - the buffer must be sent when the appender is closed. - - - - - This method is called by the method. - - the event to log - - Stores the in the cyclic buffer. - - The buffer will be sent (i.e. passed to the - method) if one of the following conditions is met: - - - - The cyclic buffer is full and this appender is - marked as not lossy (see ) - - - An is set and - it is triggered for the - specified. - - - - Before the event is stored in the buffer it is fixed - (see ) to ensure that - any data referenced by the event will be valid when the buffer - is processed. - - - - - Sends the contents of the buffer. - - The buffer containing the events that need to be send. - - The subclass must override either - or . - - - - - Sends the events. - - The events that need to be send. - - The subclass must override either - or . - - - - - The size of the cyclic buffer used to hold the logging events. - - - Set to by default. - - - - - The cyclic buffer used to store the logging events. - - - - - The triggering event evaluator that causes the buffer to be sent immediately. - - - The object that is used to determine if an event causes the entire - buffer to be sent immediately. This field can be null, which - indicates that event triggering is not to be done. The evaluator - can be set using the property. If this appender - has the ( property) set to - true then an must be set. - - - - - Indicates if the appender should overwrite events in the cyclic buffer - when it becomes full, or if the buffer should be flushed when the - buffer is full. - - - If this field is set to true then an must - be set. - - - - - The triggering event evaluator filters discarded events. - - - The object that is used to determine if an event that is discarded should - really be discarded or if it should be sent to the appenders. - This field can be null, which indicates that all discarded events will - be discarded. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - The events delivered to the subclass must be fixed. - - - - - Gets or sets a value that indicates whether the appender is lossy. - - - true if the appender is lossy, otherwise false. The default is false. - - - - This appender uses a buffer to store logging events before - delivering them. A triggering event causes the whole buffer - to be send to the remote sink. If the buffer overruns before - a triggering event then logging events could be lost. Set - to false to prevent logging events - from being lost. - - If is set to true then an - must be specified. - - - - - Gets or sets the size of the cyclic buffer used to hold the - logging events. - - - The size of the cyclic buffer used to hold the logging events. - - - The option takes a positive integer - representing the maximum number of logging events to collect in - a cyclic buffer. When the is reached, - oldest events are deleted as new events are added to the - buffer. By default the size of the cyclic buffer is 512 events. - - - - - Gets or sets the that causes the - buffer to be sent immediately. - - - The that causes the buffer to be - sent immediately. - - - - The evaluator will be called for each event that is appended to this - appender. If the evaluator triggers then the current buffer will - immediately be sent (see ). - - If is set to true then an - must be specified. - - - - - Gets or sets the value of the to use. - - - The value of the to use. - - - - The evaluator will be called for each event that is discarded from this - appender. If the evaluator triggers then the current buffer will immediately - be sent (see ). - - - - - - Gets or sets a value indicating if only part of the logging event data - should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the - event data to be fixed and serialised. This will improve performance. - - - See for more information. - - - - - - Gets or sets a the fields that will be fixed in the event - - - - - Initializes a new instance of the class. - - - - - Initialise the appender based on the options set - - - - - Override the parent method to close the database - - - - - Inserts the events into the database. - - The events to insert into the database. - - - - Adds a parameter to the command. - - The parameter to add to the command. - - - Adds a parameter to the ordered list of command parameters. - - - - - - Writes the events to the database using the transaction specified. - - The transaction that the events will be executed under. - The array of events to insert into the database. - - The transaction argument can be null if the appender has been - configured not to use transactions. See - property for more information. - - - - - Formats the log message into database statement text. - - The event being logged. - - This method can be overridden by subclasses to provide - more control over the format of the database statement. - - - Text that can be passed to a . - - - - - Connects to the database. - - - - - Retrieves the class type of the ADO.NET provider. - - - - - Prepares the database command and initialize the parameters. - - - - - The that will be used - to insert logging events into a database. - - - - - The database command. - - - - - Flag to indicate if we are using a command object - - - - - Database connection string. - - - - - String type name of the type name. - - - - - The text of the command. - - - - - The command type. - - - - - Incicats whether to use Utransactions when writing to the - database. - - - - - The list of objects. - - - The list of objects. - - - - - Gets or sets the database connection string that is used to connect to - the database. - - - The database connection string used to connect to the database. - - - - The connections string is specific to the connection type. - See for more information. - - - Connection string for MS Access via ODBC: - "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\\data\\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\\data\\train33.mdb" - - Another connection string for MS Access via ODBC: - "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\\Work\\cvs_root\\log4net-1.2\\access.mdb;UID=;PWD=;" - - Connection string for MS Access via OLE DB: - "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\Work\\cvs_root\\log4net-1.2\\access.mdb;User Id=;Password=;" - - - - - Gets or sets the type name of the connection - that should be created. - - - The type name of the connection. - - - - The type name of the ADO.NET provider to use. - - - The default is to use the OLE DB provider. - - - Use the OLE DB Provider. This is the default value. - System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the MS SQL Server Provider. - System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the ODBC Provider. - Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral - This is an optional package that you can download from - http://msdn.microsoft.com/downloads - search for ODBC .NET Data Provider. - - - - - Gets or sets the command text that is used to insert logging events - into the database. - - - The command text used to insert logging events into the database. - - - - Either the text of the prepared statement or the - name of the stored procedure to execute to write into - the database. - - - The property determines if - this text is a prepared statement or a stored procedure. - - - - - - Gets or sets the command type to execute. - - - The command type to execute. - - - - This value may be either (System.Data.CommandType.Text) to specify - that the is a prepared statement to execute, - or (System.Data.CommandType.StoredProcedure) to specify that the - property is the name of a stored procedure - to execute. - - - The default value is (System.Data.CommandType.Text). - - - - - - Gets or sets a value that indicates whether transactions should be used - to insert logging events in the database. - - - true if transactions should be used to insert logging events in - the database, otherwisr false. The default value is true. - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to insert - logging events into a database. Classes deriving from - can use this property to get or set this . Use the - underlying returned from if - you require access beyond that which provides. - - - - - Parameter type used by the . - - - - This class provides the basic database parameter properties - as defined by the interface. - - This type can be subclassed to provide database specific - functionality. The two methods that are called externally are - and . - - - - - - Initializes a new instance of the - class. - - - - - Prepare the specified database command object. - - The command to prepare. - - - Prepares the database command object by adding - this parameter to its collection of parameters. - - - - - - Renders the logging event and set the parameter value in the command. - - The command containing the parameter. - The event to be rendered. - - - Renders the logging event using this parameters layout - object. Sets the value of the parameter on the command object. - - - - - - The name of this parameter. - - - - - The database type for this parameter. - - - - - The precision for this parameter. - - - - - The scale for this parameter. - - - - - The size for this parameter. - - - - - The to use to render the - logging event into an object for this parameter. - - - - - Gets or sets the name of this parameter. - - - The name of this parameter. - - - - - Gets or sets the database type for this parameter. - - - The database type for this parameter. - - - - - Gets or sets the precision for this parameter. - - - The precision for this parameter. - - - - - Gets or sets the scale for this parameter. - - - The scale for this parameter. - - - - - Gets or sets the size for this parameter. - - - The size for this parameter. - - - - - Gets or sets the to use to - render the logging event into an object for this - parameter. - - - The used to render the - logging event into an object for this parameter. - - - - - A strongly-typed collection of objects. - - - - - Creates a synchronized (thread-safe) wrapper for a - AppenderCollection instance. - - - An AppenderCollection wrapper that is synchronized (thread-safe). - - - - - Creates a read-only wrapper for a - AppenderCollection instance. - - - An AppenderCollection wrapper that is read-only. - - - - - An empty readonly static AppenderCollection - - - - - Initializes a new instance of the AppenderCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the AppenderCollection class - that has the specified initial capacity. - - - The number of elements that the new AppenderCollection is initially capable of storing. - - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified AppenderCollection. - - The AppenderCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - Copies the entire AppenderCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire AppenderCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the AppenderCollection. - - The to be added to the end of the AppenderCollection. - The index at which the value has been added. - - - - Removes all elements from the AppenderCollection. - - - - - Creates a shallow copy of the . - - - - - Determines whether a given is in the AppenderCollection. - - The to check for. - true if is found in the AppenderCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the AppenderCollection. - - The to locate in the AppenderCollection. - - The zero-based index of the first occurrence of - in the entire AppenderCollection, if found; otherwise, -1. - - - - - Inserts an element into the AppenderCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the AppenderCollection. - - The to remove from the AppenderCollection. - - The specified was not found in the AppenderCollection. - - - - - Removes the element at the specified index of the AppenderCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the AppenderCollection. - - An for the entire AppenderCollection. - - - - Adds the elements of another AppenderCollection to the current AppenderCollection. - - The AppenderCollection whose elements should be added to the end of the current AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a array to the current AppenderCollection. - - The array whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a collection to the current AppenderCollection. - - The collection whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the AppenderCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the AppenderCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - Advances the enumerator to the next element in the collection. - - - The collection was modified after the enumerator was created. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - A value - - - - - Supports simple iteration over a . - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - The collection was modified after the enumerator was created. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - - Appends log events to the ASP.NET system. - - - - - Diagnostic information and tracing messages that you specify are appended to the output - of the page that is sent to the requesting browser. Optionally, you can view this information - from a separate trace viewer (Trace.axd) that displays trace information for every page in a - given application. - - - Trace statements are processed and displayed only when tracing is enabled. You can control - whether tracing is displayed to a page, to the trace viewer, or both. - - - The logging event is passed to the or - method depending on the level of the logging event. - - - - - - Initializes a new instance of the class. - - - - - Actual writing occurs here. - Most subclasses of will need to - override this method. - - the event to log - - - - This appender requires a to be set. - - true - - - - Buffers events and then forwards them to attached appenders. - - - - The events are buffered in this appender until conditions are - met to allow the appender to deliver the events to the attached - appenders. See for the - conditions that cause the buffer to be sent. - - The forwarding appender can be used to specify different - thresholds and filters for the same appender at different locations - within the hierarchy. - - - - - - Interface for attaching appenders to objects. - - - - - Attaches an appender. - - The appender to add. - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - - Removes all attached appenders. - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - - - - Gets all attached appenders. - - - A collection of attached appenders, or null if there - are no attached appenders. - - - - - Initializes a new instance of the class. - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Send the events. - - The events that need to be send. - - - Forwards the events to the attached appenders. - - - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Appends logging events to the console. - - - - ColoredConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. It also allows the color of a specific type of message to be set. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes directly to the application's attached console - not to the System.Console.Out or System.Console.Error TextWriter. - The System.Console.Out and System.Console.Error streams can be - programatically redirected (for example NUnit does this to capture program ouput). - This appender will ignore these redirections because it needs to use Win32 - API calls to colorise the output. To respect these redirections the - must be used. - - - When configuring the colored console appender, mapping should be - specified to map a logging level to a color. For example: - - - <mapping> - <level value="ERROR" /> - <foreColor value="White" /> - <backColor value="Red, HighIntensity" /> - </mapping> - <mapping> - <level value="DEBUG" /> - <backColor value="Green" /> - </mapping> - - - The Level is the standard log4net logging level and ForeColor and BackColor can be any - combination of: - - Bluecolor is blue - Greencolor is red - Redcolor is green - Whitecolor is white - Yellowcolor is yellow - Purplecolor is purple - Cyancolor is cyan - HighIntensitycolor is intensified - - - - - - - - The to use when writing to the Console - standard output stream. - - - - - The to use when writing to the Console - standard error output stream. - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - Add a mapping of level to color - done by the config file - - The mapping to add - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - This appender requires a to be set. - - true - - - - The enum of possible color values for use with the color mapping method - - - - - color is blue - - - - - color is green - - - - - color is red - - - - - color is white - - - - - color is yellow - - - - - color is purple - - - - - color is cyan - - - - - color is inensified - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - - The level to map to a color - - - - - The mapped foreground color for the specified level - - - - - The mapped background color for the specified level - - - - - Appends logging events to the console. - - - - ConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes each message to the System.Console.Out or - System.Console.Error that is set at the time the event is appended. - Therefore it is possible to progamatically redirect the output of this appender - (for example NUnit does this to capture program ouput). While this is the desired - behaviour of this appender it may have security implications in your application. - - - - - - The to use when writing to the Console - standard output stream. - - - - - The to use when writing to the Console - standard error output stream. - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - This appender requires a to be set. - - true - - - - Implements an Appender for test purposes that counts the - number of output calls to . - - - This appender is used in the unit tests. - - - - - Initializes a new instance of the class. - - - - - Registers how many times the method has been called. - - The logging event. - - - - The number of times has been called. - - - - - Returns the number of times has been called. - - - The number of times has been called. - - - - - Writes events to the system event log. - - - - The EventID of the event log entry can be - set using the EventLogEventID property () - on the . - - - There is a limit of 32K characters for an event log message - - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class - with the specified . - - The to use with this appender. - - - - Initialise the appender based on the options set - - - - - This method is called by the - method. - - the event to log - - Writes the event to the system event log using the - . - - If the event has an EventID property (see ) - set then this integer will be used as the event log event id. - - - There is a limit of 32K characters for an event log message - - - - - - Get the equivalent for a - - the Level to convert to an EventLogEntryType - The equivalent for a - - Because there are fewer applicable - values to use in logging levels than there are in the - this is a one way mapping. There is - a loss of information during the conversion. - - - - - The log name is the section in the event logs where the messages - are stored. - - - - - Name of the application to use when logging. This appears in the - application column of the event log named by . - - - - - The name of the machine which holds the event log. This is - currently only allowed to be '.' i.e. the current machine. - - - - - The name of the log where messages will be stored. - - - The string name of the log where messages will be stored. - - - This is the name of the log as it appears in the Event Viewer - tree. The default value is to log into the Application - log, this is where most applications write their events. However - if you need a separate log for your application (or applications) - then you should set the appropriately. - This should not be used to distinguish your event log messages - from those of other applications, the - property should be used to distinguish events. This property should be - used to group together events into a single log. - - - - - - Property used to set the Application name. This appears in the - event logs when logging. - - - The string used to distinguish events from different sources. - - - Sets the event log source property. - - - - - This property is used to return the name of the computer to use - when accessing the event logs. Currently, this is the current - computer, denoted by a dot "." - - - The string name of the machine holding the event log that - will be logged into. - - - This property cannot be changed. It is currently set to '.' - i.e. the local machine. This may be changed in future. - - - - - This appender requires a to be set. - - true - - - - Appends logging events to a file. - - - - Logging events are sent to the specified file. - - - The file can be opened in either append or - overwrite mode. - - - - - - Sends logging events to a . - - - An Appender that writes to a . - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class and - sets the output destination to a new initialized - with the specified . - - The layout to use with this appender. - The to output to. - - - - Initializes a new instance of the class and sets - the output destination to the specified . - - The layout to use with this appender - The to output to - - The must have been previously opened. - - - - - This method determines if there is a sense in attempting to append. - - - - This method checked if an output target has been set and if a - layout has been set. - - - false if any of the preconditions fail. - - - - This method is called by the - method. - - The event to log. - - - Writes a log statement to the output stream if the output stream exists - and is writable. - - - The format of the output will depend on the appender's layout. - - - - - - Close this appender instance. The underlying stream or writer is also closed. - - - Closed appenders cannot be reused. - - - - - Writes the footer and closes the underlying . - - - - - Closes the underlying . - - - - - Clears internal references to the underlying - and other variables. - - - Subclasses can override this method for an alternate closing behaviour. - - - - - Writes a footer as produced by the embedded layout's property. - - - - - Writes a header produced by the embedded layout's property. - - - - - This is the where logging events - will be written to. - - - - - Immediate flush means that the underlying - or output stream will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logging events are not actually persisted if and when the application - crashes. - - - The default value is true. - - - - - - Gets or set whether the appender will flush at the end - of each append operation. - - - - The default behaviour is to flush at the end of each - append operation. - - - If this option is set to false, then the underlying - stream can defer persisting the logging event to a later - time. - - - - Avoiding the flush operation at the end of each append results in - a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - Sets the where the log output will go. - - - - The specified must be open and writable. - - - The will be closed when the appender - instance is closed. - - - Note: Logging to an unopened will fail. - - - - - - Gets or set the and the underlying - , if any, for this appender. - - - The for this appender. - - - - - This appender requires a to be set. - - true - - - - Default constructor - - - - - Construct a new appender using the layout, file and append mode. - - the layout to use with this appender - the full path to the file to write to - flag to indicate if the file should be appended to - - - - Construct a new appender using the layout and file specified. - The file will be appended to. - - the layout to use with this appender - the full path to the file to write to - - - - Activate the options on the file appender. This will - case the file to be opened. - - - - - Closes any previously opened file and calls the parent's . - - - - - Closes the previously opened file. - - - - - Sets and opens the file where the log output will - go. The specified file must be writable. - - The path to the log file - If true will append to fileName. Otherwise will truncate fileName - - If there was already an opened file, then the previous file - is closed first. - - This method will ensure that the directory structure - for the specified exists. - - - - - Sets the quiet writer being used. - - - This method can be overridden by sub classes. - - the writer to set - - - - Convert a path into a fully qualified path. - - The path to convert. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - The fully qualified path. - - - - Flag to indicate if we should append to the file - or overwrite the file. The default is to append. - - - - - The name of the log file. - - - - - The encoding to use for the file stream. - - - - - Gets or sets the path to the file that logging will be written to. - - - The path to the file that logging will be written to. - - - - If the path is relative it is taken as relative from - the application base directory. - - - - - - Gets or sets a flag that indicates weather the file should be - appended to or overwritten. - - - Indicates whether the file should be appended to or overwritten. - - - - If the value is set to false then the file will be overwritten, if - it is set to true then the file will be appended to. - - The default value is true. - - - - - Gets or sets used to write to the file. - - - The used to write to the file. - - - - - This appender forwards logging events to attached appenders. - - - - The forwarding appender can be used to specify different thresholds - and filters for the same appender at different locations within the hierarchy. - - - - - - Initializes a new instance of the class. - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - This method is called by the - method. - - The event to log. - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Stores logging events in an array. - - - - The memory appender stores all the logging events - that are appended in an in-memory array. - - - Use the property to get - the current list of events that have been appended. - - - Use the method to clear the - current list of events. - - - - - - Initializes a new instance of the class. - - - - - This method is called by the method. - - the event to log - - Stores the in the events list. - - - - - Clear the list of events - - - Clear the list of events - - - - - The list of events that have been appended. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - Gets the events that have been logged. - - - The events that have been logged. - - - - - Gets or sets a value indicating whether only part of the logging event - data should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the event - data to be fixed and stored in the appender, hereby improving performace. - - - See for more information. - - - - - - Gets or sets a the fields that will be fixed in the event - - - - - Logs entries by sending network messages using the - native function. - - - - You can send messages only to names that are active - on the network. If you send the message to a user name, - that user must be logged on and running the Messenger - service to receive the message. - - - The receiver will get a top most window displaying the - messages one at a time, therefore this appender should - not be used to deliver a high volume of messages. - - - The following table lists some possible uses for this appender : - - - - - Action - Property Value(s) - - - Send a message to a user account on the local machine - - - = <name of the local machine> - - - = <user name> - - - - - Send a message to a user account on a remote machine - - - = <name of the remote machine> - - - = <user name> - - - - - Send a message to a domain user account - - - = <name of a domain controller | uninitialized> - - - = <user name> - - - - - Send a message to all the names in a workgroup or domain - - - = <workgroup name | domain name>* - - - - - Send a message from the local machine to a remote machine - - - = <name of the local machine | uninitialized> - - - = <name of the remote machine> - - - - - - - Note : security restrictions apply for sending - network messages, see - for more information. - - - - - An example configuration section to log information - using this appender from the local machine, named - LOCAL_PC, to machine OPERATOR_PC : - - - <appender name="NetSendAppender_Operator" type="log4net.Appender.NetSendAppender, log4net"> - <param name="Server" value="LOCAL_PC" /> - <param name="Recipient" value="OPERATOR_PC" /> - <layout type="log4net.Layout.PatternLayout, log4net"> - <param name="ConversionPattern" value="%-5p %c [%x] - %m%n" /> - </layout> - </appender> - - - - - - The DNS or NetBIOS name of the server on which the function is to execute. - - - - - The sender of the network message. - - - - - The message alias to which the message should be sent. - - - - - Initializes the appender. - - - The default constructor initializes all fields to their default values. - - - - - Initialise the appender based on the options set. - - - - The appender will be ignored if no was specified. - - - The required property was not specified. - - - - This method is called by the method. - - The event to log. - - - Sends the event using a network message. - - - - - - Sends a buffer of information to a registered message alias. - - The DNS or NetBIOS name of the server on which the function is to execute. - The message alias to which the message buffer should be sent - The originator of the message. - The message text. - The length, in bytes, of the message text. - - - The following restrictions apply for sending network messages : - - - - - Platform - Requirements - - - Windows NT - - - No special group membership is required to send a network message. - - - Admin, Accounts, Print, or Server Operator group membership is required to - successfully send a network message on a remote server. - - - - - Windows 2000 or later - - - If you send a message on a domain controller that is running Active Directory, - access is allowed or denied based on the access control list (ACL) for the securable - object. The default ACL permits only Domain Admins and Account Operators to send a network message. - - - On a member server or workstation, only Administrators and Server Operators can send a network message. - - - - - - - For more information see Security Requirements for the Network Management Functions. - - - - - If the function succeeds, the return value is zero. - - - - - - Gets or sets the sender of the message. - - - The sender of the message. - - - If this property is not specified, the message is sent from the local computer. - - - - - Gets or sets the message alias to which the message should be sent. - - - The recipient of the message. - - - This property should always be specified in order to send a message. - - - - - Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. - - - DNS or NetBIOS name of the remote server on which the function is to execute. - - - - For Windows NT 4.0 and earlier, the string should begin with \\. - - - If this property is not specified, the local computer is used. - - - - - - This appender requires a to be set. - - true - - - - Appends log events to the OutputDebugString system. - - - - OutputDebugStringAppender appends log events to the - OutputDebugString system. - - - The string is passed to the native OutputDebugString - function. - - - - - - Initializes a new instance of the class. - - - - - This method is called by the - method. - - the event to log - - - - Stub for OutputDebugString native method - - the string to output - - - - This appender requires a to be set. - - true - - - - Delivers logging events to a remote logging sink. - - - - This Appender is designed to deliver events to a remote sink. - That is any object that implements the - interface. It delivers the events using .NET remoting. The - object to deliver events to is specified by setting the - appenders property. - This appender sets the hostname property in the - collection to the name of - the machine on which the event is logged. - - - - - - Initializes a new instance of the class. - - - - - Initialise the appender based on the options set - - - - - Send the contents of the buffer to the remote sink. - - The events to send. - - - - The URL of the remote sink. - - - - - The local proxy (.NET remoting) for the remote logging sink. - - - - - Gets or sets the URL of the well-known object that will accept - the logging events. - - - The well-known URL of the remote sink. - - - - - Interface used to deliver objects to a remote sink. - - - This interface must be implemented by a remoting sink - if the is to be used - to deliver logging events to the sink. - - - - - Delivers logging events to the remote sink - - Array of events to log. - - - - Appender that rolls log files based on size or date or both. - - - - RollingFileAppender can function as either or and do both - at the same time (making size based rolling files until a data/time - boundary is crossed at which time it rolls all of those files - based on the setting for . - - - A of few additional optional features have been added:
- -- Attach date pattern for current log file
- -- Backup number increments for newer files
- -- Infinite number of backups by file size -
- - A few notes and warnings: For large or infinite number of backups - countDirection > 0 is highly recommended, with staticLogFileName = false if - time based rolling is also used -- this will reduce the number of file renamings - to few or none. Changing staticLogFileName or countDirection without clearing - the directory could have nasty side effects. If Date/Time based rolling - is enabled, CompositeRollingAppender will attempt to roll existing files - in the directory without a date/time tag based on the last modified date - of the base log files last modification. - - - A maximum number of backups based on date/time boundaries would be nice - but is not yet implemented. - -
-
- - - Initializes a new instance of the class. - - - - - Sets the quiet writer being used. - - - This method can be overridden by sub classes. - - the writer to set - - - - Handles append time behaviour for CompositeRollingAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Creates and opens the file for logging. If - is false then the fully qualified name is determined and used. - - the name of the file to open - true to append to existing file - - This method will ensure that the directory structure - for the specified exists. - - - - - Determines curSizeRollBackups (only within the current rollpoint) - - - - - Generates a wildcard pattern that can be used to find all files - that are similar to the base file name. - - - - - - - Builds a list of filenames for all files matching the base filename plus a file - pattern. - - - - - - - Initiates a roll over if needed for crossing a date boundary since the last run. - - - - - Initializes based on existing conditions at time of . - The following is done: - A) determine curSizeRollBackups (only within the current rollpoint) - B) initiates a roll over if needed for crossing a date boundary since the last run. - - - - - Does the work of bumping the 'current' file counter higher - to the highest count when an incremental file name is seen. - The highest count is either the first file (when count direction - is greater than 0 ) or the last file (when count direction less than 0). - In either case, we want to know the highest count that is present. - - - - - - - Takes a list of files and a base file name, and looks for - 'incremented' versions of the base file. Bumps the max - count up to the highest count seen. - - - - - - - Calculates the RollPoint for the m_datePattern supplied. - - The RollPoint that is most accurate for the date pattern supplied - - Essentially the date pattern is examined to determine what the - most suitable roll point is. The roll point chosen is the roll point - with the smallest period that can be detected using the date pattern - supplied. i.e. if the date pattern only outputs the year, month, day - and hour then the smallest roll point that can be detected would be - and hourly roll point as minutes could not be detected. - - - - - Sets initial conditions including date/time roll over information, first check, - scheduledFilename, and calls to initialize - the current number of backups. - - - - - Rollover the file(s) to date/time tagged file(s). - Opens the new file (through setFile) and resets curSizeRollBackups. - - - - - Renames file to file . It - also checks for existence of target file and deletes if it does. - - Name of existing file to roll. - New name for file. - - - - Deletes the specified file if it exists. - - The file to delete. - - - - Implements roll overs base on file size. - - - If the maximum number of size based backups is reached - (curSizeRollBackups == maxSizeRollBackups) then the oldest - file is deleted -- it's index determined by the sign of countDirection. - If countDirection < 0, then files - {File.1, ..., File.curSizeRollBackups -1} - are renamed to {File.2, ..., - File.curSizeRollBackups}. Moreover, File is - renamed File.1 and closed. - - A new file is created to receive further log output. - - If maxSizeRollBackups is equal to zero, then the - File is truncated with no backup files created. - - If maxSizeRollBackups < 0, then File is - renamed if needed and no files are deleted. - - - - - Roll on to the next interval after the date passed - - the current date - the next roll point an interval after the currentDateTime date - - Advances the date to the next roll point after the - currentDateTime date passed to the method. - - - - - Roll on to the next interval after the date passed - - the current date - the type of roll point we are working with - the next roll point an interval after the currentDateTime date - - Advances the date to the next roll point after the - currentDateTime date passed to the method. - - - - - This object supplies the current date/time. Allows test code to plug in - a method to control this class when testing date/time based rolling. - - - - - The date pattern. By default, the pattern is set to ".yyyy-MM-dd" - meaning daily rollover. - - - - - The actual formatted filename that is currently being written to - or will be the file transferred to on roll over - (based on staticLogFileName). - - - - - The timestamp when we shall next recompute the filename. - - - - - Holds date of last roll over - - - - - The type of rolling done - - - - - The default maximum file size is 10MB - - - - - There is zero backup files by default - - - - - How many sized based backups have been made so far - - - - - The rolling file count direction. - - - - - The rolling mode used in this appender. - - - - - Cache flag set if we are rolling by date. - - - - - Cache flag set if we are rolling by size. - - - - - Value indicting whether to always log to the same file. - - - - - FileName provided in configuration. Used for rolling properly - - - - - Gets or sets the datepattern to be used for generating file names - when rolling over on date. - - - The datepattern to be used for generating file names when rolling - over on date. - - - - Takes a string in the same format as expected by - . - - - This property determines the rollover schedule when rolling over - on date. - - - - - - Gets or sets the maximum number of backup files that are kept before - the oldest is erased. - - - The maximum number of backup files that are kept before the oldest is - erased. - - - - If set to zero, then there will be no backup files and the log file - will be truncated when it reaches . - - - If a negative number is supplied then no deletions will be made. Note - that this could result in very slow performance as a large number of - files are rolled over unless is used. - - - The maximum applies to each time based group of files and - not the total. - - - Using a daily roll the maximum total files would be - (#days run) * (maxSizeRollBackups). - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size that the output file is allowed to reach before being - rolled over to backup files. - - - - This property is equivalent to except - that it is required for differentiating the setter taking a - argument from the setter taking a - argument. - - - The default maximum filesize is 10MB. - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size that the output file is allowed to reach before being - rolled over to backup files. - - - - This property allows you to specify the maximum size with the - suffixes "KB", "MB" or "GB" so that the size is interpreted being - expressed respectively in kilobytes, megabytes or gigabytes. - - - For example, the value "10KB" will be interpreted as 10240. - - - The default maximum filesize is 10MB. - - - - - - Gets or sets the path to the file that logging will be written to. - - - The path to the file that logging will be written to. - - - - If the path is relative it is taken as relative from - the application base directory. - - - - - - Gets or sets the rolling file count direction. - - - The rolling file count direction. - - - - Indicates if the current file is the lowest numbered file or the - highest numbered file. - - - By default newer files have lower numbers ( < 0), - ie. log.1 is most recent, log.5 is the 5th backup, etc... - - - > 0 does the opposite ie. - log.1 is the first backup made, log.5 is the 5th backup made, etc. - For infinite backups use > 0 to reduce - rollover costs. - - The default file count direction is -1. - - - - - Gets or sets the rolling style. - - The rolling style. - - The default rolling style is . - - - - - Gets or sets a value indicting whether to always log to - the same file. - - - true if always should be logged to the same file, otherwise false. - - - - By default file.log is always the current file. Optionally - file.log.yyyy-mm-dd for current formatted datePattern can by the currently - logging file (or file.log.curSizeRollBackup or even - file.log.yyyy-mm-dd.curSizeRollBackup). - - - This will make time based rollovers with a large number of backups - much faster -- it won't have to - rename all the backups! - - - - - - Style of rolling to use - - - - - Roll files based only on the size of the file - - - - - Roll files based only on the date - - - - - Roll files based on both the size and date of the file - - - - - The code assumes that the following 'time' constants are in a increasing sequence. - - - - - Roll the log not based on the date - - - - - Roll the log for each minute - - - - - Roll the log for each hour - - - - - Roll the log twice a day (midday and midnight) - - - - - Roll the log each day (midnight) - - - - - Roll the log each week - - - - - Roll the log each month - - - - - This interface is used to supply Date/Time information to the . - - - This interface is used to supply Date/Time information to the . - Used primarily to allow test classes to plug themselves in so they can - supply test date/times. - - - - - Gets the "current" time. - - The "current" time. - - - - Default implementation of that returns the current time. - - - - - Gets the "current" time. - - The "current" time. - - - - Send an e-mail when a specific logging event occurs, typically on errors - or fatal errors. - - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - This appender sets the hostname property in the - collection to the name of - the machine on which the event is logged. - - - - - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses. - - - A semicolon-delimited list of e-mail addresses. - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - - Gets or sets the name of the SMTP relay mail server to use to send - the e-mail messages. - - - The name of the e-mail relay server. If SmtpServer is not set, the - name of the local SMTP server is used. - - - - - Obselete - - - Use the BufferingAppenderSkeleton Fix methods instead - - - - - This appender requires a to be set. - - true - - - - Send an email when a specific logging event occurs, typically on errors - or fatal errors. Rather than sending via smtp it writes a file into the - directory specified by . This allows services such - as the IIS SMTP agent to manage sending the messages. - - - - The configuration for this appender is identical to that of the SMTPAppender, - except that instead of specifying the SMTPAppender.SMTPHost you specify - . - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - This appender sets the hostname property in the - collection to the name of - the machine on which the event is logged. - - - - - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - - Convert a path into a fully qualified path. - - The path to convert. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - The fully qualified path. - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses. - - - A semicolon-delimited list of e-mail addresses. - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - - Gets or sets the path to write the messages to. This should be the same - as that used by the agent sending the messages. - - - - - This appender requires a to be set. - - true - - - - Appends log events to the system. - - - - The application configuration file can be used to control what listeners - are actually used. - - - - - - Initializes a new instance of the . - - - - - Initializes a new instance of the - with a specified layout. - - The layout to use with this appender. - - - - Overrides the parent method to close the default trace channel - - - - - Writes the logging event to the system. - - The event to log. - - - - Immediate flush means that the underlying writer or output stream - will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logs events are not actually written to persistent media if and - when the application crashes. - - - The default value is true. - - - - - Gets or sets a value that indicates whether the appender will - flush at the end of each write. - - - The default behaviour is to flish at the end of each - write. If the option is set tofalse, then the underlying - stream can defer writing to physical medium to a later time. - - - Avoiding the flush operation at the end of each append results - in a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - - This appender requires a to be set. - - true - - - - Sends logging events as connectionless UDP datagrams to a remote host or a - multicast group using an . - - - - UDP guarantees neither that messages arrive, nor that they arrive in the correct order. - - - This appender sets the hostname property in the - collection to the name of - the machine on which the event is logged. - - - To view the logging results, a custom application can be developed that listens for logging - events. - - - When decoding events send via this appender remember to use the same encoding - to decode the events as was used to send the events. See the - property to specify the encoding to use. - - - - This example shows how to log receive logging events that are sent - on IP address 244.0.0.1 and port 8080 to the console. The event is - encoded in the packet as a unicode string and it is decoded as such. - - IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - UdpClient udpClient; - byte[] buffer; - string loggingEvent; - - try { - udpClient = new UdpClient(8080); - - while(true) - { - buffer = udpClient.Receive(ref remoteEndPoint); - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); - Console.WriteLine(loggingEvent); - } - } - catch(Exception e) - { - Console.WriteLine(e.ToString()); - } - - - Dim remoteEndPoint as IPEndPoint - Dim udpClient as UdpClient - Dim buffer as Byte() - Dim loggingEvent as String - - Try - remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) - udpClient = new UdpClient(8080) - - While True - buffer = udpClient.Receive(ByRef remoteEndPoint) - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) - Console.WriteLine(loggingEvent) - Wend - Catch e As Exception - Console.WriteLine(e.ToString()) - End Try - - - An example configuration section to log information using this appender to the - IP 224.0.0.1 on port 8080: - - - <appender name="UdpAppender" type="log4net.Appender.UdpAppender, log4net"> - <param name="RemoteAddress" value="224.0.0.1" /> - <param name="RemotePort" value="8080" /> - <layout type="log4net.Layout.PatternLayout"> - <param name="ConversionPattern" value="%-5p %c [%x] - %m%n" /> - </layout> - </appender> - - - - - - Initializes a new instance of the class. - - - The default constructor initializes all fields to their default values. - - - - - Initialise the appender based on the options set. - - - - The appender will be ignored if no was specified or - an invalid remote or local TCP port number was specified. - - - The required property was not specified. - The TCP port number assigned to or is less than or greater than . - - - - This method is called by the method. - - The event to log. - - - Sends the event using an UDP datagram. - - - Exceptions are passed to the . - - - - - - Closes the UDP connection and releases all resources associated with - this instance. - - - Disables the underlying and releases all managed - and unmanaged resources associated with the . - - - - - Initializes the underlying connection. - - - - The underlying is initialized and binds to the - port number from which you intend to communicate. - - - Exceptions are passed to the . - - - - - - The IP address of the remote host or multicast group to which - the logging event will be sent. - - - - - The TCP port number of the remote host or multicast group to - which the logging event will be sent. - - - - - The cached remote endpoint to which the logging events will be sent. - - - - - The TCP port number from which the will communicate. - - - - - The instance that will be used for sending the - logging events. - - - - - The encoding to use for the packet. - - - - - Gets or sets the IP address of the remote host or multicast group to which - the underlying should sent the logging event. - - - The IP address of the remote host or multicast group to which the logging event - will be sent. - - - - Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to - 239.255.255.255). Multicast packets can pass across different networks through routers, so - it is possible to use multicasts in an Internet scenario as long as your network provider - supports multicasting. - - - Hosts that want to receive particular multicast messages must register their interest by joining - the multicast group. Multicast messages are not sent to networks where no host has joined - the multicast group. Class D IP addresses are used for multicast groups, to differentiate - them from normal host addresses, allowing nodes to easily detect if a message is of interest. - - - Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below : - - - - - IP Address - Description - - - 224.0.0.1 - - - Sends a message to all system on the subnet. - - - - - 224.0.0.2 - - - Sends a message to all routers on the subnet. - - - - - 224.0.0.12 - - - The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. - - - - - - - A complete list of actually reserved multicast addresses and their owners in the ranges - defined by RFC 3171 can be found at the IANA web site. - - - The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative - addresses. These addresses can be reused with other local groups. Routers are typically - configured with filters to prevent multicast traffic in this range from flowing outside - of the local network. - - - - - - Gets or sets the TCP port number of the remote host or multicast group to which - the underlying should sent the logging event. - - - An integer value in the range to - indicating the TCP port number of the remote host or multicast group to which the logging event - will be sent. - - - The underlying will send messages to this TCP port number - on the remote host or multicast group. - - The value specified is less than or greater than . - - - - Gets or sets the TCP port number from which the underlying will communicate. - - - An integer value in the range to - indicating the TCP port number from which the underlying will communicate. - - - The underlying will bind to this port for sending messages. - - - Setting the value to 0 (the default) will cause the udp client not to bind to - a local port. - - The value specified is less than or greater than . - - - - Gets or sets used to write the packets. - - - The used to write the packets. - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to send logging events - over a network. Classes deriving from can use this - property to get or set this . Use the underlying - returned from if you require access beyond that which - provides. - - - - - Gets or sets the cached remote endpoint to which the logging events should be sent. - - - The cached remote endpoint to which the logging events will be sent. - - - The method will initialize the remote endpoint - with the values of the and - properties. - - - - - This appender requires a to be set. - - true - - - - Assembly level attribute that specifies a domain to alias to this assembly's repository. - - - - An assembly's logger repository is defined by its , - however this can be overidden by an assembly loaded before the target assembly. - - - An assembly can alias another assembly's domain to its repository by - specifying this attribute with the name of the target domain. - - - This attribute can only be specified on the assembly and may be used - as many times as nessasary to alias all the required domains. - - - - - - Initializes a new instance of the class with - the specified domain to alias to this assembly's repository. - - The domain to alias to this assemby's repository. - - - - Gets or sets the domain to alias to this assemby's repository. - - - The domain to alias to this assemby's repository. - - - - - Use this class to quickly configure a . - - - - Allows very simple programmatic configuration of log4net. - - - Only one appender can be configured using this configurator. - The appender is set at the root of the hierarchy and all logging - events will be delivered to that appender. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Initializes the log4net system with a default configuration. - - - - Initializes the log4net logging system using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the log4net system using the specified appender. - - The appender to use to log all logging events. - - - - Initializes the with a default configuration. - - The repository to configure. - - - Initializes the specified repository using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the using the specified appender. - - The repository to configure. - The appender to use to log all logging events. - - - - Base class for all log4net configuration attributes. - - - This is an abstract class that must be extended by - specific configurators. This attribute allows the - configurator to be parameterised by an assembly level - attribute. - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - - Assembly level attribute that specifies the logging domain for the assembly. - - - - Assemblies are mapped to logging domains. Each domain has its own - logging repository. This attribute specified on the assembly controls - the configuration of the domain. The property specifies the name - of the domain that this assembly is a part of. The - specifies the type of the repository objects to create for the domain. If - this attribute is not specified and a is not specified - then the assembly will be part of the default shared logging domain. - - - This attribute can only be specified on the assembly and may only be used - once per assembly. - - - - - - Initializes a new instance of the class. - - - - - Initialise a new instance of the class - with the name of the domain. - - The name of the domain. - - - - Gets or sets the name of the logging domain. - - - The string name to use as the name of the domain associated with this - assembly. - - - This value does not have to be unique. Several assemblies can share the - same domain. They will share the logging configuration of the domain. - - - - - Getsor sets the type of repository to create for this assembly. - - - The type of repository to create for this assembly. - - - - The type of the repository to create for the domain. - The type must implement the - interface. - - - This will be the type of repository created when - the domain is created. If multiple assemblies reference the - same domain then the repository is only created once using the - of the first assembly to call into the - domain. - - - - - - Use this class to initialize the log4net environment using a DOM tree. - - - Configures a using an XML DOM tree. - - - - - Private constructor - - - - - Automatically configures the log4net system based on the - application's configuration settings. - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - - - Automatically configures the using settings - stored in the application's configuration file. - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - The repository to configure. - - - - Configures log4net using a log4net element - - - Loads the log4net configuration from the XML element - supplied as . - - The element to parse. - - - - Configures the using the specified XML - element. - - - Loads the log4net configuration from the XML element - supplied as . - - The repository to configure. - The element to parse. - - - - Configures log4net using the specified configuration file. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - <configuration> - <appSettings> - <add key="log4net-config-file" value="log.config"/> - </appSettings> - </configuration> - - - - - - Configures log4net using the specified configuration file. - - A stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - <configuration> - <appSettings> - <add key="log4net-config-file" value="log.config"/> - </appSettings> - </configuration> - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures log4net using the file specified, monitors the file for changes - and reloads the configuration if a change is detected. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behaviour of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the using the file specified, - monitors the file for changes and reloads the configuration if a change - is detected. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behaviour of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the specified repository using a log4net element. - - The hierarchy to configure. - The element to parse. - - - Loads the log4net configuration from the XML element - supplied as . - - - This method is ultimately called by one of the Configure methods - to load the configuration from an . - - - - - - Class used to watch config files. - - - Uses the to monitor - changes to a specified file. Because multiple change notifications - may be raised when the file is modified, a timer is used to - compress the notifications into a single event. The timer - waits for time before delivering - the event notification. If any further - change notifications arrive while the timer is waiting it - is reset and waits again for to - elaps. - - - - - The default amount of time to wait after receiving notification - before reloading the config file. - - - - - Holds the FileInfo used to configure the DOMConfigurator - - - - - Holds the repository being configured. - - - - - The timer used to compress the notification events. - - - - - Initializes a new instance of the class. - - The repository to configure. - The configuration file to watch. - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - This handler reloads the configuration from the file when the event is fired. - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - This handler reloads the configuration from the file when the event is fired. - - - - - Called by the timer when the configuration has been updated. - - null - - - - Assembly level attribute to configure the . - - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - Configure the repository using the . - The specified must extend the - class otherwise the will not be able to - configure it. - - - The does not extend . - - - - Gets or sets the filename of the configuration file. - - - The filename of the configuration file. - - - - If specified, this is the name of the configuration file to use with - the . This file path is relative to the - application base directory (). - - - - - - Gets or sets the extension of the configuration file. - - - The extension of the configuration file. - - - - If specified this is the extension for the configuration file. - The path to the config file is built by using the application - base directory (), - the assembly name and the config file extension. - - - - - - Gets or sets a value indicating whether to watch the configuration file. - - - true if the configuration should be watched, false otherwise. - - - - If this flag is specified and set to true then the framework - will watch the configuration file and will reload the config each time - the file is modified. - - - - - - Class to register for the log4net section of the configuration file - - - The log4net section of the configuration file needs to have a section - handler registered. This is the section handler used. It simply returns - the XML element that is the root of the section. - - - Example of registering the log4net section handler : - - <?xml version="1.0" encoding="utf-8" ?> - <configuration> - <configSections> - <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> - </configSections> - <log4net> - log4net configuration XML goes here - </log4net> - </configuration> - - - - - - Initializes a new instance of the class. - - - - - Parses the configuration section. - - The configuration settings in a corresponding parent configuration section. - The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. - The for the log4net section. - The for the log4net section. - - - - Assembly level attribute that specifies a plugin to attach to - the repository. - - - - - Interface used to create plugins. - - - - - Creates the plugin object. - - - - - Initializes a new instance of the class - with the specified type. - - The type of plugin to create. - - - - Creates the plugin object defined by this attribute. - - - Creates the instance of the object as - specified by this attribute. - - The plugin object. - - - - Returns a representation of the properties of this object. - - - Overrides base class method to - return a representation of the properties of this object. - - A representation of the properties of this object - - - - Gets or sets the type name for the plugin. - - - The type name for the plugin. - - - - - Formats a in the format "HH:mm:ss,SSS" for example, "15:49:37,459". - - - - - Interface to abstract the rendering of a - instance into a string. - - - - - Formats the specified date as a string. - - The date to format. - The string builder to write to. - The string builder passed. - - - - String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. - - - - - String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. - - - - - String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. - - - - - Renders the date into a string. Format is "HH:mm:ss". - - - Sub classes should override this method to render the date - into a string using a precision up to the second. This method - will be called at most once per second and the result will be - reused if it is needed again during the same second. - - The date to render into a string. - The string builder to write to. - - - - Renders the date into a string. Format is "HH:mm:ss,SSS". - - - Uses the FormatDateWithoutMillis() method to generate the - time string up to the seconds and then appends the current - milliseconds. The results from FormatDateWithoutMillis() are - cached and FormatDateWithoutMillis() is called at most once - per second. - Sub classes should override FormatDateWithoutMillis() - rather than FormatDate(). - - The date to render into a string. - The stringbuilder to write to. - The stringbuilder passed. - - - - Last stored time with precision up to the second. - - - - - Last stored time with precision up to the second, formatted - as a string. - - - - - Formats a in the format "dd MMM YYYY HH:mm:ss,SSS" for example, "06 Nov 1994 15:49:37,459". - - - - - Initializes a new instance of the class. - - - - - Formats the date as: "dd MMM YYYY HH:mm:ss" - the base class will append the ',SSS' milliseconds section. - We will only be called at most once per second. - - - Formats a DateTime in the format "dd MMM YYYY HH:mm:ss" for example, "06 Nov 1994 15:49:37". - - The date to format. - The string builder to write to. - - - - The format info for the invariant culture. - - - - - Formats the specified as a string: 'YYYY-MM-dd HH:mm:ss,SSS'. - - - - - Initializes a new instance of the class. - - - - - Formats the date specified as a string: 'YYYY-MM-dd HH:mm:ss' - the base class will append the ',SSS' milliseconds section. - We will only be called at most once per second. - - The date to format. - The string builder to write to. - - - - Formats the using the method. - - - - - Initializes a new instance of the class - with the specified format string. - - - The format string must be compatible with the options - that can be supplied to . - - The format string. - - - - Formats the date using . - - The date to convert to a string. - The stringbuilder to write to. - The stringbuilder passed. - - - - The format string used to format the . - - - The format string must be compatible with the options - that can be supplied to . - - - - - This filter drops all . - - - You can add this filter to the end of a filter chain to - switch from the default "accept all unless instructed otherwise" - filtering behaviour to a "deny all unless instructed otherwise" - behaviour. - - - - - Users should extend this class to implement customised logging - event filtering. - - - Users should extend this class to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - The method must return one - of the integer constants , or . - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behaviour is to log all logging events. - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - - - Users should implement this interface to implement customised logging - event filtering. - - - Users should implement this interface to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - The method must return one - of the integer constants , - or . - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behaviour is to log all logging events. - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - - - Decide if the logging event should be logged through an appender. - - The LoggingEvent to decide upon - The decision of the filter - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - - - - Property to get and set the next filter in the filter - chain of responsibility. - - - The next filter in the chain - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - Points to the next filter in the filter chain. - - - See for more information. - - - - - Usually filters options become active when set. - We provide a default do-nothing implementation for convenience. - - - - - Decide if the should be logged through an appender. - - The to decide upon - The decision of the filter - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - This method is marked abstract and must be implemented - in a subclass. - - - - - Property to get and set the next filter in the filter - chain of responsibility. - - - The next filter in the chain - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - Default constructor - - - - - Always returns the integer constant - - - Ignores the event being logged and just returns - . This can be used to change the default filter - chain behaviour from to . This filter - should only be used as the last filter in the chain - as any further filters will be ignored! - - the LoggingEvent to filter - Always returns - - - - The return result from - - - The return result from - - - - - The log event must be dropped immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This filter is neutral with respect to the log event. - The remaining filters, if any, should be consulted for a final decision. - - - - - The log event must be logged immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This is a very simple filter based on matching. - - - The filter admits two options and - . If there is an exact match between the value - of the option and the of the - , then the method returns in - case the option value is set - to true, if it is false then - is returned. - - - - - flag to indicate if the filter should on a match - - - - - the to match against - - - - - Default constructor - - - - - Tests if the of the logging event matches that of the filter - - - If the of the event matches the level of the - filter then the result of the function depends on the - value of . If it is true then - the function will return , it it is false then it - will return . If the does not match then - the result will be the opposite of when it does match. - - the event to filter - see remarks - - - - The property is a flag that determines - the behaviour when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - - - The that the filter will match - - - - - This is a simple filter based on matching. - - - The filter admits three options and - that determine the range of priorities that are matched, and - . If there is a match between the range - of priorities and the of the , then the - method returns in case the - option value is set to true, if it is false - then is returned. If there is no match, is returned. - - - - - Flag to indicate the behaviour when matching a - - - - - the minimum value to match - - - - - the maximum value to match - - - - - Default constructor - - - - - Check if the event should be logged. - - - If the of the logging event is outside the range - matched by this filter then - is returned. If the is matched then the value of - is checked. If it is true then - is returned, otherwise - is returned. - - the logging event to check - see remarks - - - - The property is a flag that determines - the behaviour when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - - - Set the minimum matched - - - - - Sets the maximum matched - - - - - Simple filter to match a string in the - - - Simple filter to match a string in the - - - - - Flag to indicate the behaviour when we have a match - - - - - The string to substring match against the message - - - - - A string regex to match - - - - - A regex object to match (generated from m_stringRegexToMatch) - - - - - The key to use to lookup the string - from the MDC - - - - - Default constructor - - - - - Initialise and precompile the Regex if required - - - - - Check if this filter should allow the event to be logged - - - The is matched against the . - If the occurs as a substring within - the message then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - the event being logged - see remarks - - - - The property is a flag that determines - the behaviour when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - - - The string that will be substring matched against - the rendered message. If the message contains this - string then the filter will match. - - - - - The regular expression pattern that will be matched against - the rendered message. If the message matches this - pattern then the filter will match. - - - - - The key to lookup in the and then - match against. - - - - - Simple filter to match a string in the - - - Simple filter to match a string in the - - - - - Flag to indicate the behaviour when we have a match - - - - - The string to substring match against the message - - - - - A string regex to match - - - - - A regex object to match (generated from m_stringRegexToMatch) - - - - - Default constructor - - - - - Initialise and precompile the Regex if required - - - - - Check if this filter should allow the event to be logged - - - The is matched against the . - If the occurs as a substring within - the message then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - the event being logged - see remarks - - - - The property is a flag that determines - the behaviour when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - - - The string that will be substring matched against - the rendered message. If the message contains this - string then the filter will match. - - - - - The regular expression pattern that will be matched against - the rendered message. If the message matches this - pattern then the filter will match. - - - - - Simple filter to match a string in the rendered message - - - Simple filter to match a string in the rendered message - - - - - Flag to indicate the behaviour when we have a match - - - - - The string to substring match against the message - - - - - A string regex to match - - - - - A regex object to match (generated from m_stringRegexToMatch) - - - - - Default constructor - - - - - Initialise and precompile the Regex if required - - - - - Check if this filter should allow the event to be logged - - - The rendered message is matched against the . - If the occurs as a substring within - the message then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - the event being logged - see remarks - - - - The property is a flag that determines - the behaviour when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - - - The string that will be substring matched against - the rendered message. If the message contains this - string then the filter will match. - - - - - The regular expression pattern that will be matched against - the rendered message. If the message matches this - pattern then the filter will match. - - - - - Type converter for Boolean. - - - Supportes conversion from string to boolean type. - - - - - Interface supported by type converters - - - This interface supports conversion from arbitary types - to a single target type. See . - - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - - Exception base type for conversion errors. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class - with the specified message. - - A message to include with the exception. - - - - Initializes a new instance of the class - with the specified message and inner exception. - - A message to include with the exception. - A nested exception to include. - - - - Initializes a new instance of the class - with serialized data. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - - Creates a new instance of the class. - - The conversion destination type. - The value to convert. - An instance of the . - - - - Register of type converters for specific types. - - - - - Initializes a new instance of the class. - - - - - Static constructor. - - - This constructor defines the intrinsic type converters - - - - - Adds a converter for a specific type. - - The type being converted to. - The type converter to use to convert to the destination type. - - - - Adds a converter for a specific type. - - The type being converted to. - The type of the type converter to use to convert to the destination type. - - - - Gets the type converter to use to convert values to the destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - - Lookups the type converter to use as specified by the attributes on the - destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - - Creates the instance of the type converter. - - The type of the type converter. - - The type specified for the type converter must implement - the interface and must have a public - default (no argument) constructor. - - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - The singleton registry. - - - - - Mapping from to type converter. - - - - - Gets or sets the tye converter for a specific type. - - - The type converter for a specific type. - - - - - Implementation of that converts an - instance from a string. - - - - - Overrides the CanConvertFrom method of IConvertFrom. - The ITypeDescriptorContext interface provides the context for the - conversion. Typically this interface is used at design time to - provide information about the design-time container. - - - true if the source is a string - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to an encoding - the encoding - - - - Class and Interface level attribute that specifes a type converter - to use with the associated type. - - - To associate a type converter with a target type apply a - TypeConverterAttribute to the target type. Specify the - type of the type converter on the attribute. - - - - - The string type name of the type converter - - - - - Default constructor - - - - - Create a new type converter attribute for the specified type name - - The string type name of the type converter - - The type specified must implement the - interface. - - - - - Create a new type converter attribute for the specified type - - The type of the type converter - - The type specified must implement the - interface. - - - - - The string type name of the type converter - - - The string type name of the type converter - - - The type specified must implement the - interface. - - - - - A straightforward implementation of the interface. - - - - - Initializes a new instance of the class. - - - - - Calls the method on all - attached appenders. - - The event being logged. - The number of appenders called. - - - - Attaches an appender. - - The appender to add. - - If the appender is already in the list it won't be added again. - - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - - Removes all attached appenders. - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - - - - Array of appenders - - - - - Gets all attached appenders. - - - A collection of attached appenders, or null if there - are no attached appenders. - - - - - Subclass of that maintains a count of - the number of bytes written. - - - - - QuietTextWriter does not throw exceptions when things go wrong. - Instead, it delegates error handling to its . - - - - - Create a new QuietTextWriter using a writer and error handler - - the writer to actually write to - the error handler to report error to - - - - Writes a string to the output. - - The string data to write to the output. - - - - Flushes any buffered output. - - - - - Closes the underlying output writer. - - - - - The error handler instance to pass all errors to - - - - - The instance of the underlying TextWriter used for output - - - - - Flag to indicate if this writer is closed - - - - - Gets or sets the error handler that all errors are - passed to. - - - The error handler that all errors are passed to. - - - - - Gets a value indicating whether this writer is closed. - - - true if this writer is closed, otherwise false. - - - - - Gets the underlying . - - - The underlying . - - - - - Creates a new instance of the class - with the specified and . - - The to actually write to. - The to report errors to. - - - - Writes a string to the output and counts the number of bytes written. - - The string data to write to the output. - - - - Total number of bytes written. - - - - - Gets or sets the total number of bytes written. - - - The total number of bytes written. - - - - - A fixed size rolling buffer of logging events. - - - - - Initializes a new instance of the class with - the specified maximum number of buffered logging events. - - The maximum number of logging events in the buffer. - The argument is not a positive integer. - - - - Appends a to the buffer. - - The event to append to the buffer. - The event discarded from the buffer, if any. - true if the buffer is not full, otherwise false. - - - - Gets the oldest (first) logging event in the buffer and removes it - from the buffer. - - The oldest logging event in the buffer - - - - Pops all the logging events from the buffer into an array. - - An array of all the logging events in the buffer. - - - - Resizes the cyclic buffer to . - - The new size of the buffer. - The argument is not a positive integer. - - - - Gets the th oldest event currently in the buffer. - - The th oldest event currently in the buffer. - - If is outside the range 0 to the number of events - currently in the buffer, then null is returned. - - - - - Gets or sets the maximum size of the buffer. - - The maximum size of the buffer. - - - - Gets the number of logging events in the buffer. - - The number of logging events in the buffer. - - This number is guaranteed to be in the range 0 to - (inclusive). - - - - - An always empty . - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to enforce the singleton pattern. - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - - The singleton instance of the empty collection. - - - - - Gets the singleton instance of the empty collection. - - The singletion instance of the empty collection. - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - For the this property is always true. - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - - An always empty . - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to enforce the singleton pattern. - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - - Adds an element with the provided key and value to the - . - - The to use as the key of the element to add. - The to use as the value of the element to add. - - - - Removes all elements from the . - - - - - Determines whether the contains an element - with the specified key. - - The key to locate in the . - false - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - - Removes the element with the specified key from the . - - The key of the element to remove. - - - - The singleton instance of the empty dictionary. - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - For the this property is always true. - - - - - Gets the number of elements contained in the - - - The number of elements contained in the . - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - - Gets a value indicating whether the has a fixed size. - - true - - - - Gets a value indicating whether the is read-only. - - true - - - - Gets an containing the keys of the . - - An containing the keys of the . - - - - Gets an containing the values of the . - - An containing the values of the . - - - - Gets or sets the element with the specified key. - - The key of the element to get or set. - null - - - - Contain the information obtained when parsing formatting modifiers - in conversion modifiers. - - - - - Initializes a new instance of the class. - - - - - Resets all properties to their default values. - - - - - Dump debug info - - - - - Gets or sets the minimum value. - - The minimum value. - - - - Gets or sets the maximum value. - - The maximum value. - - - - Gets or sets a flag indicating whether left align is enabled - or not. - - A flag indicating whether left align is enabled or not. - - - - Outputs log statements from within the log4net assembly. - - - - Log4net components cannot make log4net logging calls. However, it is - sometimes useful for the user to learn about what log4net is - doing. - - - All log4net internal debug calls go to the standard output stream - whereas internal error messages are sent to the standard error output - stream. - - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Static constructor that initializes logging by reading - settings from the application configuration file. - - - - The log4net.Internal.Debug application setting - controls internal debugging. This setting should be set - to true to enable debugging. - - - The log4net.Internal.Quiet application setting - suppresses all internal logging including error messages. - This setting should be set to true to enable message - suppression. - - - - - - Writes output to the standard output stream. - - The message to log. - - Uses Console.Out for console output, - and Trace for OutputDebugString output. - - - - - Writes output to the standard error stream. - - The message to log. - - Use Console.Error for console output, - and Trace for OutputDebugString output. - - - - - Writes log4net internal debug messages to the - standard output stream. - - The message to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal debug messages to the - standard output stream. - - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The message to log. - - - All internal error messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The message to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The message to log. - An exception to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Default debug level - - - - - In quietMode not even errors generate any output. - - - - - Gets or sets a value indicating whether log4net internal logging - is enabled or disabled. - - - true if log4net internal logging is enabled, otherwise - false. - - - - When set to true, internal debug level logging will be - displayed. - - - This value can be set by setting the application setting - log4net.Internal.Debug in the application configuration - file. - - - The default value is false, i.e. debugging is - disabled. - - - - - The following example enables internal debugging using the - application configuration file : - - - <configuration> - <appSettings> - <add key="log4net.Internal.Debug" value="true" /> - </appSettings> - </configuration> - - - - - - Gets or sets a value indicating whether log4net should generate no output - from internal logging, not even for errors. - - - true if log4net should generate no output at all from internal - logging, otherwise false. - - - - When set to true will cause internal logging at all levels to be - suppressed. This means that no warning or error reports will be logged. - This option overrides the setting and - disables all debug also. - - This value can be set by setting the application setting - log4net.Internal.Quiet in the application configuration file. - - - The default value is false, i.e. internal logging is not - disabled. - - - - The following example disables internal logging using the - application configuration file : - - <configuration> - <appSettings> - <add key="log4net.Internal.Quiet" value="true" /> - </appSettings> - </configuration> - - - - - - Represents a native error code and message. - - - - - Create an instance of the class with the specified - error number and message. - - The number of the native error. - The message of the native error. - - - - Create a new instance of the class. - - the error number for the native error - - An instance of the class for the specified - error number. - - - - The message for the specified error number is lookup up using the - native Win32 FormatMessage function. - - - - - - Retrieves the message corresponding with a Win32 message identifier. - - Message identifier for the requested message. - - The message will be searched for in system message-table resource(s) - using the native FormatMessage function. - - - The message corresponding with the specified message identifier. - - - - - Return error information string - - error information string - - - - Formats a message string. - - Formatting options, and how to interpret the parameter. - Location of the message definition. - Message identifier for the requested message. - Languager identifier for the requested message. - If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . - If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. - Pointer to an array of values that are used as insert values in the formatted message. - - - The function requires a message definition as input. The message definition can come from a - buffer passed into the function. It can come from a message table resource in an - already-loaded module. Or the caller can ask the function to search the system's message - table resource(s) for the message definition. The function finds the message definition - in a message table resource based on a message identifier and a language identifier. - The function copies the formatted message text to an output buffer, processing any embedded - insert sequences if requested. - - - To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. - - - - - If the function succeeds, the return value is the number of TCHARs stored in the output - buffer, excluding the terminating null character. - - - If the function fails, the return value is zero. To get extended error information, - call . - - - - - - Gets the number of the native error. - - - The number of the native error. - - - - - Gets the message of the native error. - - - The message of the native error. - - - - - An always empty . - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to enforce the singleton pattern. - - - - - Test if the enumerator can advance, if so advance. - - false as the cannot advance. - - - - Resets the enumerator back to the start. - - - - - The singleton instance of the . - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - - Gets the current key from the enumerator. - - - Throws an exception because the - never has a current value. - - - - - Gets the current value from the enumerator. - - The current value from the enumerator. - - Throws an because the - never has a current value. - - - - - Gets the current entry from the enumerator. - - - Throws an because the - never has a current entry. - - - - - An always empty . - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to enforce the singleton pattern. - - - - - Test if the enumerator can advance, if so advance - - false as the cannot advance. - - - - Resets the enumerator back to the start. - - - - - The singleton instance of the . - - - - - Get the singleton instance of the . - - The singleton instance of the . - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - - Implements log4net's default error handling policy which consists - of emitting a message for the first error in an appender and - ignoring all suqsequent errors. - - - - The error message is printed on the standard error output stream. - - - This policy aims at protecting an otherwise working application - from being flooded with error messages when logging fails. - - - - - - Appenders may delegate their error handling to an . - - - Error handling is a particularly tedious to get right because by - definition errors are hard to predict and to reproduce. - - - - - Handles the error and information about the error condition is passed as - a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - The error code associated with the error. - - - - Prints the error message passed as a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - - - - Prints the error message passed as a parameter. - - The message associated with the error. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class - with the specified prefix. - - The prefix to use for each message. - - - - Prints the message and the stack trace of the exception on the standard - error output stream. - - The error message. - The exception. - The internal error code. - - - - Prints the message and the stack trace of the exception on the standard - error output stream. - - The error message. - The exception. - - - - Print a the error message passed as parameter on the standard - error output stream. - - The error message. - - - - Flag to indicate if it is the first error - - - - - String to prefix each message with - - - - - A convenience class to convert property values to specific types. - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Concatenates two string arrays. - - Left array. - Right array. - Array containing both left and right arrays. - - - - Concatenates two arrays. - - Left array - Right array - Array containing both left and right arrays. - - - - Converts string escape characters back to their correct values. - - String to convert. - Converted result. - - - - Converts a string to a value. - - String to convert. - The default value. - - If is "true", then true is returned. - If is "false", then false is returned. - Otherwise, is returned. - - The value of . - - - - Converts a string to an integer. - - String to convert. - The default value. - - is returned when - cannot be converted to a value. - - The value of . - - - - Parses a file size into a number. - - String to parse. - The default value. - - - Parses a file size of the form: number[KB|MB|GB] into a - long value. It is scaled with the appropriate multiplier. - - - is returned when - cannot be converted to a value. - - - The value of . - - - - Converts a string to an object. - - The target type to convert to. - The string to convert to an object. - - The object converted from a string or null when the - conversion failed. - - - - - Looks up the for the target type. - - The type to lookup the converter for. - The converter for the specified type. - - - - Checks if there is an apropriate type conversion from the source type to the target type. - - The type to convert from. - The type to convert to. - true if there is a conversion from the source type to the target type. - - - - Converts an object to the target type. - - The object to convert to the target type. - The type to convert to. - The converted object. - - - - Finds the value corresponding to in - and then perform variable substitution - on the found value. - - The key to lookup. - The association to use for lookups. - The substituted result. - - - - Instantiates an object given a class name. - - The fully qualified class name of the object to instantiate. - The class to which the new object should belong. - The object to return in case of non-fulfilment. - - Checks that the is a subclass of - . If that test fails or the object could - not be instantiated, then is returned. - - - An instance of the or - if the object could not be instantiated. - - - - - Performs variable substitution in string from the - values of keys found in . - - The string on which variable substitution is performed. - The dictionary to use to lookup variables. - - - The variable substitution delimiters are ${ and }. - - - For example, if props contains "key=value", then the call - - - - string s = OptionConverter.substituteVars("Value of key is ${key}."); - - - - will set the variable s to "Value of key is value.". - - - If no value could be found for the specified key, then substitution - defaults to an empty string. - - - For example, if system properties contains no value for the key - "inexistentKey", then the call - - - - string s = OptionConverter.subsVars("Value of inexistentKey is [${inexistentKey}]"); - - - - will set s to "Value of inexistentKey is []". - - - An Exception is thrown if contains a start - delimiter "${" which is not balanced by a stop delimiter "}". - - - The result of the substitutions. - - - - Converts the string representation of the name or numeric value of one or - more enumerated constants to an equivalent enumerated object. - - The type to convert to. - The enum string value. - If true, ignore case; otherwise, regard case. - An object of type whose value is represented by . - - - - Abstract class that provides the formatting functionality that - derived classes need. - - - Conversion specifiers in a conversion patterns are parsed to - individual PatternConverters. Each of which is responsible for - converting a logging event in a converter specific manner. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class - with the specified formatting info object. - - The formatting info object to use. - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - The on which the pattern converter should be executed. - - - - - A template method for formatting in a converter specific way. - - that will receive the formatted result. - The on which the pattern converter should be executed. - - - - Fast space padding method. - - to which the spaces will be appended. - The number of spaces to be padded. - - - - the next patter converter in the chain - - - - - Most of the work of the class - is delegated to the PatternParser class. - - - - - Initializes a new instance of the class - with the specified pattern string. - - The pattern to parse. - - - - Parses the pattern into a chain of pattern converters. - - The head of a chain of pattern converters. - - - - Extracts the option from the pattern at the current index. - - - The option is the section of the pattern between '{' and '}'. - - - The option if the current index of the parse is at the start - of the option, otherwise null. - - - - - The option is expected to be in decimal and positive. In case of error, zero is returned. - - The option as a number. - - - - Internal method that works on a single option in the - pattern - - The option specifier. - - - - Resets the internal state of the parser and adds the specified pattern converter - to the chain. - - The pattern converter to add. - - - - Adds a pattern converter to the chain. - - The converter to add. - - - - the literal being parsed - - - - - the total length of the pattern - - - - - the current index into the pattern - - - - - The first pattern converter in the chain - - - - - the last pattern converter in the chain - - - - - the formatting info object - - - - - The pattern - - - - - Basic pattern converter - - - - - Construct the pattern converter with formatting info and type - - the formatting info - the type of pattern - - - - To the conversion - - the event being logged - the result of converting the pattern - - - - Internal method to get the time difference between two DateTime objects - - start time - end time - the time difference in milliseconds - - - - Pattern converter for literal instances in the pattern - - - - - Constructor, takes the literal string - - - - - - Override the formatting behaviour to ignore the FormattingInfo - because we have a literal instead. - - the builder to write to - the event being logged - - - - Convert this pattern into the rendered message - - the event being logged - the literal - - - - Mapped Diagnostic pattern converter - - - - - Construct the pattern converter with formatting info and MDC key - - the formatting info - the MDC key to emit - - - - To the conversion - - the event being logged - the result of converting the pattern - - - - Property pattern converter - - - - - Construct the pattern converter with formatting info and event property key - - the formatting info - the property key to emit - - - - To the conversion - - the event being logged - the result of converting the pattern - - - - Date pattern converter, uses a to format the date - - - - - Construct the converter with formatting info and a - to format the date - - the formatting info - the date formatter - - - - Convert the pattern into the rendered message - - the event being logged - - - - - Converter to include event location information - - - - - Construct the converter with formatting information and - the type of location information required. - - - - - - - Convert the pattern to the rendered message - - the event being logged - the relevant location information - - - - Converter to deal with '.' separated strings - - - - - Construct a converter with formatting info and a precision - argument. The precision is the number of '.' separated sections - to return, starting from the end of the string and working - towards to the start. - - the formatting info - the precision - - - - Overridden by subclasses to get the fully qualified name before the - precision is applied to it. - - the event being logged - the fully qualified name - - - - Convert the pattern to the rendered message - - the event being logged - the precision of the fully qualified name specified - - - - Pattern converter for the class name - - - - - Constructor - - formatting info - namespace depth precision - - - - Gets the fully qualified name of the class - - the event being logged - the class name - - - - Converter for logger name - - - - - Constructor - - formatting info - logger hierarchy depth precision - - - - Gets the fully qualified name of the logger - - the event being logged - the logger name - - - - String keyed object map. - - - Only member objects that are serializable will - be serialized allong with this collection. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class - with serialized data. - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - Because this class is sealed the serialization constructor is private. - - - - - Gets the key names. - - An array of key names. - An array of all the keys. - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - - Gets or sets the value of the property with the specified key. - - - The value of the property with the specified key. - - The key of the property to get or set. - - The property value will only be serialized if it is serializable. - If it cannot be serialized it will be silently ignored if - a serialization operation is performed. - - - - - Utility class for system specific information. - - - - - Private constructor to prevent instances. - - - - - Gets the assembly location path for the specified assembly. - - The assembly to get the location for. - - This method does not guarantee to return the correct path - to the assembly. If only tries to give an indication as to - where the assembly was loaded from. - - The location of the assembly. - - - - Gets the fully qualified name of the , including - the name of the assembly from which the was - loaded. - - The to get the fully qualified name for. - - This is equivalent to the Type.AssemblyQualifiedName property, - but this method works on the .NET Compact Framework 1.0 as well as - the full .NET runtime. - - The fully qualified name for the . - - - - Gets the short name of the . - - The to get the name for. - - - The short name of the assembly is the - without the version, culture, or public key. i.e. it is just the - assembly's file name without the extension. - - - Use this rather than Assembly.GetName().Name because that - is not available on the Compact Framework. - - - Because of a FileIOPermission security demand we cannot do - the obvious Assembly.GetName().Name. We are allowed to get - the of the assembly so we - start from there and strip out just the assembly name. - - - The short name of the . - - - - Gets the file name portion of the , including - the extension. - - The to get the file name for. - The file name of the assembly. - - - - Loads the type specified in the type string. - - A sibling type to use to load the type. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified, it will be loaded from the assembly - containing the specified relative type. - - - The type loaded or null if it could not be loaded. - - - - Loads the type specified in the type string. - - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the - assembly that is directly calling this method. - - - The type loaded or null if it could not be loaded. - - - - Loads the type specified in the type string. - - An assembly to load the type from. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the specified - assembly. - - - The type loaded or null if it could not be loaded. - - - - Generate a new guid - - A new Guid - - - - Gets an empty array of types. - - - The Type.EmptyTypes field is not available on - the .NET Compact Framework 1.0. - - - - - Cache the host name for the current machine - - - - - Cache the application friendly name - - - - - Gets the system dependent line terminator. - - - The system dependent line terminator. - - - - - Gets the base directory for this . - - The base directory path for the current . - - - - Gets the path to the configuration file for the current . - - The path to the configuration file for the current . - - The .NET Compact Framework 1.0 does not have a concept of a configuration - file. For this runtime, we use the entry assembly location as the root for - the configuration file name. - - - - - Gets the path to the file that first executed in the current . - - The path to the entry assembly. - - - - Gets the ID of the current thread. - - The ID of the current thread. - - - On the .NET framework, the AppDomain.GetCurrentThreadId method - is used to obtain the thread ID for the current thread. This is the - operating system ID for the thread. - - - On the .NET Compact Framework 1.0 it is not possible to get the - operating system thread ID for the current thread. The native method - GetCurrentThreadId is implemented inline in a header file - and cannot be called. - - - - - - Get the host name or machine name for the current machine - - - The host name () or - the machine name (Environment.MachineName) for - the current machine, or if neither of these are available - then NOT AVAILABLE is returned. - - - - - Get this application's friendly name - - - The friendly name of this application as a string - - - - If available the name of the application is retrieved from - the AppDomain using AppDomain.CurrentDomain.FriendlyName. - - Otherwise the file name of the entry assembly is used. - - - - - Utility class for transforming strings. - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Write a string to an XmlWriter - - the writer to write to - the string to write - - The test is escaped either using XML escape entities - or using CDATA sections. - - - - - Count the number of times that the substring occurs in the text - - the text to search - the substring to find - the nunmber of times the substring occurs in the text - - The substring is assumed to be non repeating within itself. - - - - - A Layout that renders only the Exception text from the logging event - - - A Layout that renders only the Exception text from the logging event - This Layout should only be used with appenders that utilise multiple - layouts (e.g. ). - - - - - Extend this abstract class to create your own log layout format. - - - This is the base implementation of the - interface. Most layout objects should extend this class. - - - - - Interface implemented by layout objects - - - An object is used to format a - as a string. The method is called by an - appender to transform the into a string. - - The layout can also supply and - text that is appender before any events and after all the events respectively. - - - - - Implement this method to create your own layout format. - - The event to format - returns the formatted event - - This method is called by an appender to format - the as a string. - - - - - The content type output by this layout. - - The content type - - The content type output by this layout. - This is a MIME type e.g. "text/plain". - - - - - The header for the layout format. - - the layout header - - The Header text will be appended before any logging events - are formatted and appended. - - - - - The footer for the layout format. - - the layout footer - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - Flag indicating if this layout handle exceptions - - false if this layout handles exceptions - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - - - - The header text - - - See for more information. - - - - - The footer text - - - See for more information. - - - - - Empty default constructor - - - Empty default constructor - - - - - Activate the options that were previously set with calls to option setters. - - - This allows deferred activation of the options once all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - This method must be implemented by the subclass. - - - - - Implement this method to create your own layout format. - - The event to format - returns the formatted event - - This method is called by an appender to format - the as a string. - - This method must be implemented by the subclass. - - - - - The content type output by this layout. - - The content type is "text/plain" - - The content type output by this layout. - This base class uses the value "text/plain". - To change this value a subclass must override this - property. - - - - - The header for the layout format. - - the layout header - - The Header text will be appended before any logging events - are formatted and appended. - - - - - The footer for the layout format. - - the layout footer - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - Flag indicating if this layout handle exceptions - - false if this layout handles exceptions - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - This method must be implemented by the subclass. - - - - - Constructs a ExceptionLayout - - - - - - - Does not do anything as options become effective immediately. - - - - - Gets the exception text from the logging event - - the event being logged - the formatted string - - - - The ExceptionLayout only handles the exception. Thus, it returns false. - - - The ExceptionLayout only handles the exception. Thus, it returns false. - - - The ExceptionLayout only handles the exception. Thus, it returns false. - - - - - Interface for raw layout objects - - - Interface used to format a - to an object. - - This interface should not be confused with the - interface. This interface is used in - only certain specialised situations where a raw object is - required rather than a formatted string. The - is not generally usefull than this interface. - - - - - Implement this method to create your own layout format. - - The event to format - returns the formatted event - - Implement this method to create your own layout format. - - - - - Interface for raw layout objects - - - Interface used to format a - to an object. - - This interface should not be confused with the - interface. This interface is used in - only certain specialised situations where a raw object is - required rather than a formatted string. The - is not generally usefull than this interface. - - - - - The layout to adapt - - - - - Construst a new adapter - - the layout to adapt - - - - Format the logging event as an object. - - The event to format - returns the formatted event - - Format the logging event as an object. - Uses the object supplied to - the constructor to perform the formatting. - - - - - A flexible layout configurable with pattern string. - - - - The goal of this class is to a - and return the results as a string. The results - depend on the conversion pattern. - - - The conversion pattern is closely related to the conversion - pattern of the printf function in C. A conversion pattern is - composed of literal text and format control expressions called - conversion specifiers. - - - You are free to insert any literal text within the conversion - pattern. - - - Each conversion specifier starts with a percent sign (%) and is - followed by optional format modifiers and a conversion - character. The conversion character specifies the type of - data, e.g. logger, level, date, thread name. The format - modifiers control such things as field width, padding, left and - right justification. The following is a simple example. - - - Let the conversion pattern be "%-5p [%t]: %m%n" and assume - that the log4net environment was set to use a PatternLayout. Then the - statements - - - ILog log = LogManager.GetLogger(typeof(TestApp)); - log.Debug("Message 1"); - log.Warn("Message 2"); - - would yield the output - - DEBUG [main]: Message 1 - WARN [main]: Message 2 - - - Note that there is no explicit separator between text and - conversion specifiers. The pattern parser knows when it has reached - the end of a conversion specifier when it reads a conversion - character. In the example above the conversion specifier - %-5p means the level of the logging event should be left - justified to a width of five characters. - - - The recognized conversion characters are : - - - - Conversion Character - Effect - - - a - - Used to output the frienly name of the AppDomain where the - logging event was generated. - - - - c - - - Used to output the logger of the logging event. The - logger conversion specifier can be optionally followed by - precision specifier, that is a decimal constant in - brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the logger name will be - printed. By default the logger name is printed in full. - - - For example, for the logger name "a.b.c" the pattern - %c{2} will output "b.c". - - - - - C - - - Used to output the fully qualified class name of the caller - issuing the logging request. This conversion specifier - can be optionally followed by precision specifier, that - is a decimal constant in brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the class name will be - printed. By default the class name is output in fully qualified form. - - - For example, for the class name "log4net.Layout.PatternLayout", the - pattern %C{1} will output "PatternLayout". - - - WARNING Generating the caller class information is - slow. Thus, it's use should be avoided unless execution speed is - not an issue. - - - - - d - - - Used to output the date of the logging event. The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %d{HH:mm:ss,fff} or - %d{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %d{ISO8601} or %d{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - F - - - Used to output the file name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. It's use should be avoided unless execution speed - is not an issue. - - - - - l - - - Used to output location information of the caller which generated - the logging event. - - - The location information depends on the CLI implementation but - usually consists of the fully qualified name of the calling - method followed by the callers source the file name and line - number between parentheses. - - - The location information can be very useful. However, it's - generation is extremely slow. It's use should be avoided - unless execution speed is not an issue. - - - - - L - - - Used to output the line number from where the logging request - was issued. - - - WARNING Generating caller location information is - extremely slow. It's use should be avoided unless execution speed - is not an issue. - - - - - m - - - Used to output the application supplied message associated with - the logging event. - - - - - M - - - Used to output the method name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. It's use should be avoided unless execution speed - is not an issue. - - - - - n - - - Outputs the platform dependent line separator character or - characters. - - - This conversion character offers practically the same - performance as using non-portable line separator strings such as - "\n", or "\r\n". Thus, it is the preferred way of specifying a - line separator. - - - - - p - - - Used to output the level of the logging event. - - - - - P - - - Used to output the an event specific property. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %X{user} would include the value - from the property that is keyed by the string 'user'. Each property value - that is to be included in the log must be specified separately. - Properties are added to events by loggers or appenders. By default - no properties are defined. - - - - - r - - - Used to output the number of milliseconds elapsed since the start - of the application until the creation of the logging event. - - - - - t - - - Used to output the name of the thread that generated the - logging event. Uses the thread number if no name is available. - - - - - u - - - Used to output the user name for the currently active user - (Principal.Identity.Name). - - - WARNING Generating caller information is - extremely slow. It's use should be avoided unless execution speed - is not an issue. - - - - - W - - - Used to output the WindowsIdentity for the currently - active user. - - - WARNING Generating caller WindowsIdentity information is - extremely slow. It's use should be avoided unless execution speed - is not an issue. - - - - - x - - - Used to output the NDC (nested diagnostic context) associated - with the thread that generated the logging event. - - - - - X - - - Used to output the MDC (mapped diagnostic context) associated - with the thread that generated the logging event. The key to lookup - must be specified within braces and directly following the - pattern specifier, e.g. %X{user} would include the value - from the MDC that is keyed by the string 'user'. Each MDC value - that is to be included in the log must be specified separately. - - - - - % - - - The sequence %% outputs a single percent sign. - - - - - - By default the relevant information is output as is. However, - with the aid of format modifiers it is possible to change the - minimum field width, the maximum field width and justification. - - - The optional format modifier is placed between the percent sign - and the conversion character. - - - The first optional format modifier is the left justification - flag which is just the minus (-) character. Then comes the - optional minimum field width modifier. This is a decimal - constant that represents the minimum number of characters to - output. If the data item requires fewer characters, it is padded on - either the left or the right until the minimum width is - reached. The default is to pad on the left (right justify) but you - can specify right padding with the left justification flag. The - padding character is space. If the data item is larger than the - minimum field width, the field is expanded to accommodate the - data. The value is never truncated. - - - This behaviour can be changed using the maximum field - width modifier which is designated by a period followed by a - decimal constant. If the data item is longer than the maximum - field, then the extra characters are removed from the - beginning of the data item and not from the end. For - example, it the maximum field width is eight and the data item is - ten characters long, then the first two characters of the data item - are dropped. This behaviour deviates from the printf function in C - where truncation is done from the end. - - - Below are various format modifier examples for the logger - conversion specifier. - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Format modifierleft justifyminimum widthmaximum widthcomment
%20cfalse20none - - Left pad with spaces if the logger name is less than 20 - characters long. - -
%-20ctrue20none - - Right pad with spaces if the logger - name is less than 20 characters long. - -
%.30cNAnone30 - - Truncate from the beginning if the logger - name is longer than 30 characters. - -
%20.30cfalse2030 - - Left pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
%-20.30ctrue2030 - - Right pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
-
-
- - This is essentially the TTCC layout - %r [%t] %-5p %c %x - %m\n - - - Similar to the TTCC layout except that the relative time is - right padded if less than 6 digits, thread name is right padded if - less than 15 characters and truncated if longer and the logger - name is left padded if shorter than 30 characters and truncated if - longer. - %-6r [%15.15t] %-5p %30.30c %x - %m\n - -
- - - Default pattern string for log output. - Currently set to the string "%m%n" - which just prints the application supplied message. - - - - - A conversion pattern equivalent to the TTCCLayout. Current value is %r [%t] %p %c %x - %m%n. - - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - output buffer appended to when Format() is invoked - - - - - the pattern - - - - - the head of the pattern converter chain - - - - - Constructs a PatternLayout using the DEFAULT_LAYOUT_PATTERN - - - The default pattern just produces the application supplied message. - - - - - Constructs a PatternLayout using the supplied conversion pattern - - the pattern to use - - - - Returns PatternParser used to parse the conversion string. Subclasses - may override this to return a subclass of PatternParser which recognize - custom conversion characters. - - the pattern to parse - - - - - Does not do anything as options become effective immediately. - - - - - Produces a formatted string as specified by the conversion pattern. - - the event being logged - the formatted string - - - - The ConversionPattern option. This is the string which - controls formatting and consists of a mix of literal content and - conversion specifiers. - - - - - The PatternLayout does not handle the exception contained within - LoggingEvents. Thus, it returns true. - - - - - Type converter for the interface - - - Used to convert objects to the interface - - - - - Can the sourceType be converted to an - - the source tybe to be converted - true if the source type can be converted to - - - - Convert the value to a object - - the value to convert - the object - - - - Extract the date from the - - - Extract the date from the - - - - - Constructs a RawDateLayout - - - - - - - Implement this method to create your own layout format. - - The event to format - returns the formatted event - - Implement this method to create your own layout format. - - - - - A very simple layout - - - SimpleLayout consists of the level of the log statement, - followed by " - " and then the log message itself. For example, - - DEBUG - Hello world - - - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - output buffer appended to when Format() is invoked - - - - - Constructs a SimpleLayout - - - - - - - Does not do anything as options become effective immediately. - - - - - Produces a formatted string. - - the event being logged - the formatted string - - - - The SimpleLayout does not handle the exception contained within - LoggingEvents. Thus, it returns true. - - - - - Layout that formats the log events as XML elements. - - - - The output of the consists of a series of - log4net:event elements. It does not output a complete well-formed XML - file. The output is designed to be included as an external entity - in a separate file to form a correct XML file. - - - For example, if abc is the name of the file where - the output goes, then a well-formed XML file would - be: - - - <?xml version="1.0" ?> - - <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> - - <log4net:events version="1.2" xmlns:log4net="http://log4net.sourceforge.net/"> - &data; - </log4net:events> - - - This approach enforces the independence of the - and the appender where it is embedded. - - - The version attribute helps components to correctly - interpret output generated by . The value of - this attribute should be "1.2" for release 1.2 and later. - - - Alternatively the Header and Footer properties can be - configured to output the correct XML header, open tag and close tag. - - - - - - Layout that formats the log events as XML elements. - - - - This is an abstract class that must be subclassed by an implementation - to conform to a specific schema. - - - Deriving classes must implement the method. - - - - - - Initial buffer size. - - - - - Maximum buffer size before it is recycled. - - - - - Initializes a new instance of the class - with no location info. - - - - - Initializes a new instance of the class. - - - - The parameter determines whether - location information will be output by the layout. If - is set to true, then the - file name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Does not do anything as options become effective immediately. - - - - - Produces a formatted string. - - The event being logged. - The formatted string. - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - - Output buffer appended to when - is invoked. - - - - - Flag to indicate if location information should be included in - the XML events. - - - - - Gets a value indicating whether to include location information in - the XML events. - - - true if location information should be included in the XML - events; otherwise, false. - - - - If is set to true, then the file - name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Gets the content type output by this layout. - - As this is the XML layout, the value is always "text/xml". - - - - The XMLLayout does handle the exception contained within - LoggingEvents. Thus, it returns false. - - - - - Constructs an XmlLayout - - - - - Constructs an XmlLayout. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Builds a cache of the element names - - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - - The prefix to use for all generated element names - - - - - The prefix to use for all element names - - - - The default prefix is log4net. Set this property - to change the prefix. If the prefix is set to an empty string - then no prefix will be written. - - - - - - Layout that formats the log events as XML elements compatible with the log4j schema - - - - Formats the log events acording to the http://jakarta.apache.org/log4j schema. - - - - - - Constructs an XMLLayoutSchemaLog4j - - - - - Constructs an XMLLayoutSchemaLog4j. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Actualy do the writing of the xml - - the writer to use - the event to write - - - - The version of the log4j schema to use. - - - - Only version 1.2 of the log4j schema is supported. - - - - - - The default Renderer renders objects by calling their method. - - - The default renderer supports rendering objects to strings as follows: - - - - Value - Rendered String - - - null - "(null)" - - - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - int[] {1, 2, 3}. - If the array is not one dimensional the - Array.ToString() is returned. - - - - - - Renders the exception type, message - and stack trace. Any nested exception is also rendered. - - - - other - - Object.ToString() - - - - - The serves as a good base class - for renderers that need to provide special handling of exception - types. The method is used to render - the exception and its nested exceptions, however the - method is called just to render the exceptions message. This method - can be overridden is a subclass to provide additional information - for some exception types. See for - more information. - - - - - Implement this interface in order to render objects as strings - - - Certain types require special case conversion to - string form. This conversion is done by an object renderer. - Object renderers implement the - interface. - - - - - Render the object to a string - - The map used to lookup renderers - The object to render - the object rendered as a string - - Render the object to a - string. - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - - - - Default constructor - - - Default constructor - - - - - Render the object to a string - - The map used to lookup renderers - The object to render - the object rendered as a string - - Render the object to a - string. - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - The default renderer supports rendering objects to strings as follows: - - - - Value - Rendered String - - - null - - "(null)" - - - - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - int[] {1, 2, 3}. - If the array is not one dimensional the - Array.ToString() is returned. - - The method is called - to do the actual array rendering. This method can be - overridden in a subclass to provide different array - rendering. - - - - - - Renders the exception type, message - and stack trace. Any nested exception is also rendered. - - The method is called - to do the actual exception rendering. This method can be - overridden in a subclass to provide different exception - rendering. - - - - other - - Object.ToString() - - - - - - - - Render the array argument into a string - - The map used to lookup renderers - the array to render - the string representation of the array - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - int[] {1, 2, 3}. - If the array is not one dimensional the - Array.ToString() is returned. - - - - - Render the exception into a string - - The map used to lookup renderers - the exception to render - the string representation of the exception - - Renders the exception type, message, and stack trace. Any nested - exceptions are also rendered. - - The - method is called to render the Exception's message into a string. This method - can be overridden to change the behaviour when rendering - exceptions. To change or extend only the message that is - displayed override the - method instead. - - - - - Render the exception message into a string - - The map used to lookup renderers - the exception to get the message from and render - the string representation of the exception message - - This method is called to render the exception's message into - a string. This method should be overridden to extend the information - that is rendered for a specific exception. - - See for more information. - - - - - Map class objects to an . - - - - - Constructor - - - - - Render using the appropriate renderer. - - - Find the appropriate renderer for the type of the - parameter. This is accomplished by calling the - method. Once a renderer is found, it is - applied on the object and the result is returned - as a . - - the object to render to a string - the string rendering of - - - - Gets the renderer for the specified object type - - - Gets the renderer for the specified object type - - Syntactic sugar method that calls - with the type of the object parameter. - - the object to lookup the renderer for - the renderer for - - - - Gets the renderer for the specified type - - the type to lookup the renderer for - the renderer for the specified type - - - - Internal function to recursively search interfaces - - the type to lookup the renderer for - the renderer for the specified type - - - - Clear the map of renderers - - - - - Register an for . - - the type that will be rendered by - the renderer for - - - - Get the default renderer instance - - the default renderer - - - - Interface implemented by logger repository plugins. - - - - - Attaches the plugin to the specified . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - - Gets or sets the name of the plugin. - - - The name of the plugin. - - - - - A strongly-typed collection of objects. - - - - - Creates a synchronized (thread-safe) wrapper for a - PluginCollection instance. - - - A PluginCollection wrapper that is synchronized (thread-safe). - - - - - Creates a read-only wrapper for a - PluginCollection instance. - - - A PluginCollection wrapper that is read-only. - - - - - Initializes a new instance of the PluginCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the PluginCollection class - that has the specified initial capacity. - - - The number of elements that the new PluginCollection is initially capable of storing. - - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified PluginCollection. - - The PluginCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - Copies the entire PluginCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire PluginCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the PluginCollection. - - The to be added to the end of the PluginCollection. - The index at which the value has been added. - - - - Removes all elements from the PluginCollection. - - - - - Creates a shallow copy of the . - - - - - Determines whether a given is in the PluginCollection. - - The to check for. - true if is found in the PluginCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the PluginCollection. - - The to locate in the PluginCollection. - - The zero-based index of the first occurrence of - in the entire PluginCollection, if found; otherwise, -1. - - - - - Inserts an element into the PluginCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the PluginCollection. - - The to remove from the PluginCollection. - - The specified was not found in the PluginCollection. - - - - - Removes the element at the specified index of the PluginCollection. - - The zero-based index of the element to remove. - - is less than zero. - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the PluginCollection. - - An for the entire PluginCollection. - - - - Adds the elements of another PluginCollection to the current PluginCollection. - - The PluginCollection whose elements should be added to the end of the current PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a array to the current PluginCollection. - - The array whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a collection to the current PluginCollection. - - The collection whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the PluginCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - An object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - - The at the specified index. - - The zero-based index of the element to get or set. - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false. - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false. - - - - Gets or sets the number of elements the PluginCollection can contain. - - - The number of elements the PluginCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - Advances the enumerator to the next element in the collection. - - - The collection was modified after the enumerator was created. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - A value - - - - - Supports simple iteration over a . - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - The collection was modified after the enumerator was created. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - The current element in the collection. - - - - - Map of repository plugins. - - - This class is a name keyed map of the plugins that are - attached to a repository. - - - - - Initiazlies a new instance of the class with a - repository that the plugins should be attached to. - - The repository that the plugins should be attached to. - - - - Adds a to the map. - - The to add to the map. - - The will be attached to the repository when added. - - - - - Removes a from the map. - - The to remove from the map. - - - - Gets a by name. - - The name of the to lookup. - - The from the map with the name specified, or - null if no plugin is found. - - - - - Gets all possible plugins as a list of objects. - - All possible plugins as a list of objects. - - - - Class from which logger repository plugins derive. - - - - - Initializes a new Plugin with the specified name. - - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - - The name of this plugin. - - - - - The repository this plugin is attached to. - - - - - Gets or sets the name of this plugin. - - - The name of this plugin. - - - - - Gets or sets the that this plugin is - attached to. - - - The that this plugin is attached to. - - - - - Publishes an instance of - on the specified URI. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class - with specified name. - - The name to publish the sink under in the remoting infrastructure. - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - - Gets or sets the URI of this sink. - - - The URI of this sink. - - - - - Delivers objects to a remote sink. - - - - - Initializes a new instance of the for the - specified . - - The repository to log to. - - - - Logs the events to the repository. - - The events to log. - - The events passed are logged to the - - - - - Obtains a lifetime service object to control the lifetime - policy for this instance. - - - null to indicate that this instance should live - forever. - - - - - The underlying that events should - be logged to. - - - - - Gets or sets the underlying that - events should be logged to. - - - The underlying that events should - be logged to. - - - - - Implementation of DefaultLoggerFactory. - - - - - Implement this interface to create new instances of - or a sub-class of . - - - - This interface is used by the to - create new objects. - - - The method is called - to create a named . - - - - - - Constructs a new instance with the - specified name. - - The name of the . - The instance for the specified name. - - - Called by the to create - new named instances. - - - - - - Initializes a new instance of the class. - - - - - Constructs a new instance with the specified name. - - The name of the . - A new instance. - - - - Internal class used to provide implementation of - interface. Applications should use to get - logger instances. - - - This is one of the central class' in the log4net implementation. One of the - distinctive features of log4net are hierarchical loggers and their - evaluation. - - - - - Interface that all loggers should implement. - - - - - This generic form is intended to be used by wrappers. - - The wrapper class' fully qualified class name. - The level of the message to be logged. - The message object to log. - the exception to log, including its stack trace. Pass null to not log an exception. - - Generates a logging event for the specified using - the and . - - - - - This is the most generic printing method that is intended to be used - by wrappers. - - The event being logged. - - Logs the specified logging event. - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - - Gets the name of the logger. - - - The name of the logger. - - - - - Gets the where this - Logger instance is attached to. - - The that this logger belongs to. - - - - This constructor created a new instance and - sets its name. - - - - Loggers are constructed by - objects. See for the default - logger creator. - - - The name of the . - - - - Add to the list of appenders of this - Logger instance. - - An appender to add to this logger - - Add to the list of appenders of this - Logger instance. - If is already in the list of - appenders, then it won't be added again. - - - - - Look for the appender named as name - - The name of the appender to lookup - The appender with the name specified, or null. - - Returns the named appender, or null if the appender is not found. - - - - - Remove all previously added appenders from this Logger instance. - - - Remove all previously added appenders from this Logger instance. - This is useful when re-reading configuration information. - - - - - Remove the appender passed as parameter form the list of appenders. - - The appender to remove - - Remove the appender passed as parameter form the list of appenders. - - - - - Remove the appender passed as parameter form the list of appenders. - - The name of the appender to remove - - Remove the named appender passed as parameter form the list of appenders. - - - - - This generic form is intended to be used by wrappers. - - The wrapper class' fully qualified class name. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - Generate a logging event for the specified using - the and . - - - - - This is the most generic printing method. - This generic form is intended to be used by wrappers - - The event being logged. - - Logs the logging event specified. - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - - Call the appenders in the hierarchy starting at - this. If no appenders could be found, emit a - warning. - - - This method calls all the appenders inherited from the - hierarchy circumventing any evaluation of whether to log or not - to log the particular log request. - - The event to log. - - - - Closes all attached appenders implementing the IAppenderAttachable interface. - - - Used to ensure that the appenders are correctly shutdown. - - - - - This is the most generic printing method. This generic form is intended to be used by wrappers - - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - Generate a logging event for the specified using - the . - - - - - Creates a new logging event and logs the event without further checks. - - The wrapper class' fully qualified class name. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - Generates a logging event and delivers it to the attached - appenders. - - - - - Creates a new logging event and logs the event without further checks. - - The event being logged. - - Delivers the logging event to the attached appenders. - - - - - The fully qualified name of the Logger class. - - - - - The name of this logger. - - - - - The assigned level of this logger. - - - The level variable need not be - assigned a value in which case it is inherited - form the hierarchy. - - - - - The parent of this logger. - - - The parent of this logger. All loggers have at least one ancestor which is the root logger. - - - - - Loggers need to know what Hierarchy they are in. - - - Loggers need to know what Hierarchy they are in. - The hierarchy that this logger is a member of is stored - here. - - - - - Helper implementation of the interface - - - - - Flag indicating if child loggers inherit their parents appenders - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - Gets or sets the parent logger in the hierarchy. - - - The parent logger in the hierarchy. - - - Part of the Composite pattern that makes the hierarchy. - - - - - Gets or sets a value indicating if child loggers inherit their parent's appenders. - - - true if child loggers inherit their parent's appenders. - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - Gets the effective level for this logger. - - - - Starting from this logger, searches the logger hierarchy for a - non-null level and returns it. Otherwise, returns the level of the - root logger. - - The Logger class is designed so that this method executes as - quickly as possible. - - The nearest level in the logger hierarchy. - - - - Gets or sets the where this - Logger instance is attached to. - - The hierarchy that this logger belongs to. - - - - Gets or sets the assigned , if any, for this Logger. - - - The of this logger. - - - The assigned can be null. - - - - - Get the appenders contained in this logger as an - . - - - Get the appenders contained in this logger as an - . If no appenders - can be found, then a is returned. - - A collection of the appenders in this logger - - - - Gets the logger name. - - - The name of the logger. - - - - - Gets the where this - Logger instance is attached to. - - The that this logger belongs to. - - - - Initializes a new instance of the class - with the specified name. - - - - - Initializes the log4net environment using a DOM tree. - - - Configures a using an XML DOM tree. - - - - - Initializes a new instance of the class - with the specified . - - The hierarchy to build. - - - - Configures the log4net framework by parsing a DOM tree of XML elements. - - The root element to parse. - - - - Parse appenders by IDREF. - - The appender ref element. - The instance of the appender that the ref refers to. - - - - Parses an appender element. - - The appender element. - The appender instance or null when parsing failed. - - - - Parses a logger element. - - The logger element. - - - - Parses the root logger element. - - The root element. - - - - Parses the children of a logger element. - - The category element. - The logger instance. - Flag to indicate if the logger is the root logger. - - - - Parses an object renderer. - - The renderer element. - - - - Parses a level element. - - The level element. - The logger object to set the level on. - Flag to indicate if the logger is the root logger. - - - - Sets a paramater on an object. - - - The parameter name must correspond to a writable property - on the object. The value of the parameter is a string, - therefore this function will attempt to set a string - property first. If unable to set a string property it - will inspect the property and its argument type. It will - attempt to call a static method called 'Parse' on the - type of the property. This method will take a single - string argument and return a value that can be used to - set the property. - - The parameter element. - The object to set the parameter on. - - - - Converts a string value to a target type. - - The type of object to convert the string to. - The string value to use as the value of the object. - - An object of type with value or - null when the conversion could not be performed. - - - - - Creates an object as specified in XML. - - The XML element that contains the definition of the object. - The object type to use if not explicitly specified. - The type that the returned object must be or must inherit from. - The object or null - - - - key: appenderName, value: appender. - - - - - The Hierarchy being configured. - - - - - Delegate used to handle logger creation event notifications. - - The in which the has been created. - The event args that hold the instance that has been created. - - - - Provides data for the event. - - - A event is raised every time a - is created. - - - - - The created - - - - - Initializes a new instance of the event argument - class,with the specified . - - The that has been created. - - - - Gets the that has been created. - - - The that has been created. - - - - - Delegate used to handle event notifications for hierarchy configuration changes. - - The that has had its configuration changed. - Empty event arguments. - - - - This class is specialized in retrieving loggers by name and - also maintaining the logger hierarchy. Implements the - interface. - - - The casual user should not have to deal with this class - directly. - - The structure of the logger hierarchy is maintained by the - method. The hierarchy is such that children - link to their parent but parents do not have any references to their - children. Moreover, loggers can be instantiated in any order, in - particular descendant before ancestor. - - In case a descendant is created before a particular ancestor, - then it creates a provision node for the ancestor and adds itself - to the provision node. Other descendants of the same ancestor add - themselves to the previously created provision node. - - - - - Skeleton implementation of the interface - - - Skeleton implementation of the interface. - All types should extend this type. - - - - - Interface implemented by logger repositories. - - - This interface is implemented by logger repositories. e.g. - . - - This interface is used by the - to obtain interfaces. - - - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - The name of the logger to lookup - The Logger object with the name specified - - If the names logger exists it is returned, otherwise - null is returned. - - - - - Returns all the currently defined loggers as an Array. - - All the defined loggers - - Returns all the currently defined loggers as an Array. - - - - - Returns a named logger instance - - The name of the logger to retrieve - The logger object with the name specified - - Returns a named logger instance - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - - Shutdown the repository - - Shutting down a repository will safely close and remove - all appenders in all loggers including the root logger. - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - The method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - Reset the repositories configuration to a default state - - - Reset all values contained in this instance to their - default state. - - Existing loggers are not removed. They are just reset. - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - Log the through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - The name of the repository - - - The name of the repository - - - The name of the repository - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - The RendererMap holds a mapping between types and - objects. - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - - Get the level map for the Repository. - - - Get the level map for the Repository. - The level map defines the mappings between - level names and objects in - this repository. - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - - Repository specific properties - - - These properties can be specified on a reporitory specific basis - - - - - Default Construtor - - - Initialises the repository with default (empty) properties - - - - - Construct the repository using specific properties - - the properties to set for this repository - - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - The name of the logger to lookup - The Logger object with the name specified - - - - Returns all the currently defined loggers in the repository as an Array - - - Returns all the currently defined loggers in the repository as an Array. - The root logger is not included in the returned - enumeration. - - All the defined loggers - - - - Return a new logger instance - - - Return a new logger instance. - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - The name of the logger to retrieve - The logger object with the name specified - - - - Shutdown the repository - - - Shutdown the repository. Can be overriden in a subclass. - This base class implementation notifies the - listeners and all attached plugins of the shutdown event. - - - - - Reset the repositories configuration to a default state - - - Reset all values contained in this instance to their - default state. - - Existing loggers are not removed. They are just reset. - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - Log the logEvent through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Adds an object renderer for a specific class. - - The type that will be rendered by the renderer supplied. - The object renderer used to render the object. - - - - Notify the registered listeners that the repository is shutting down - - - - - Notify the registered listeners that the repository has had its configuration reset - - - - - The name of the repository - - - The string name of the repository - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - The RendererMap holds a mapping between types and - objects. - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - - Get the level map for the Repository. - - - Get the level map for the Repository. - The level map defines the mappings between - level names and objects in - this repository. - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - - Repository specific properties - - - These properties can be specified on a reporitory specific basis - - - - - - - - - - - Initialise the log4net system using the specified appender - - the appender to use to log all logging events - - - - - - - - - - Initialise the log4net system using the specified config - - the element containing the root of the config - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - The properties to pass to this repository. - - - - Initializes a new instance of the class with - the specified . - - The factory to use to create new logger instances. - - - - Initializes a new instance of the class with - the specified . - - The properties to pass to this repository. - The factory to use to create new logger instances. - - - - Check if the named logger exists in the hierarchy. If so return - its reference, otherwise returns null. - - The name of the logger to lookup - The Logger object with the name specified - - - - Returns all the currently defined loggers in the hierarchy as an Array - - - Returns all the currently defined loggers in the hierarchy as an Array. - The root logger is not included in the returned - enumeration. - - All the defined loggers - - - - Return a new logger instance named as the first parameter using - the default factory. - - - Return a new logger instance named as the first parameter using - the default factory. - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - The name of the logger to retrieve - The logger object with the name specified - - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - The Shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - Reset all values contained in this hierarchy instance to their default. - - - Reset all values contained in this hierarchy instance to their - default. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - Existing loggers are not removed. They are just reset. - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - Log the logEvent through this hierarchy. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Initialise the log4net system using the specified appender - - the appender to use to log all logging events - - - - Initialise the log4net system using the specified config - - the element containing the root of the config - - - - Test if this hierarchy is disabled for the specified . - - The level to check against. - - true if the repository is disabled for the level argument, false otherwise. - - - - If this hierarchy has not been configured then this method will - always return true. - - - This method will return true if this repository is - disabled for level object passed as parameter and - false otherwise. - - - See also the property. - - - - - - Clear all logger definitions from the internal hashtable - - - This call will clear all logger definitions from the internal - hashtable. Invoking this method will irrevocably mess up the - logger hierarchy. - - You should really know what you are doing before - invoking this method. - - - - - Return a new logger instance named as the first parameter using - . - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated by the - parameter and linked with its existing - ancestors as well as children. - - The name of the logger to retrieve - The factory that will make the new logger instance - The logger object with the name specified - - - - Notify the registered listeners that the hierarchy has had its configuration changed - - - - - Sends a logger creation event to all registered listeners - - The newly created logger - - - - Updates all the parents of the specified logger - - - This method loops through all the potential parents of - 'log'. There 3 possible cases: - - - No entry for the potential parent of 'log' exists - We create a ProvisionNode for this potential - parent and insert 'log' in that provision node. - - - There entry is of type Logger for the potential parent. - The entry is 'log's nearest existing parent. We - update log's parent field with this entry. We also break from - he loop because updating our parent's parent is our parent's - responsibility. - - - There entry is of type ProvisionNode for this potential parent. - We add 'log' to the list of children for this - potential parent. - - - - The logger to update the parents for - - - - Replace a with a in the hierarchy. - - - We update the links for all the children that placed themselves - in the provision node 'pn'. The second argument 'log' is a - reference for the newly created Logger, parent of all the - children in 'pn' - - We loop on all the children 'c' in 'pn': - - If the child 'c' has been already linked to a child of - 'log' then there is no need to update 'c'. - - Otherwise, we set log's parent field to c's parent and set - c's parent field to log. - - - - - - - Event used to notify that a logger has been created. - - - - - Event to notify that the hierarchy has had its configuration changed. - - - Event to notify that the hierarchy has had its configuration changed. - - - - - Flag to indicate if we have already issued a warning - about not having an appender warning. - - - - - Gets the root of this hierarchy. - - - - - Gets or sets the default instance. - - The default . - - - - Used internally to accelerate hash table searches. - - - - - Initializes a new instance of the class - with the specified name. - - The name of the logger. - - - - Returns a hash code for the current instance. - - A hash code for the current instance. - - - - Determines whether two instances - are equal. - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - Gets the name of the logger. - - - The name of the logger. - - - - - ProvisionNodes are used in the when - there is no specified for that node. - - - - - Initializes a new instance of the class - with the specified child logger. - - A child logger to add to this node. - - - - The sits at the top of the logger hierarchy. - - - - The is a regular except - that it provides several guarantees. - - - First, it cannot be assigned a null - level. Second, since the root logger cannot have a parent, the - property always returns the value of the - level field without walking the hierarchy. - - - - - - Initializes a new instance of the class with - the specified logging level. - - The level to assign to the root logger. - - The root logger names itself as "root". However, the root - logger cannot be retrieved by name. - - - - - Gets the assigned level value without walking the logger hierarchy. - - The assigned level value without walking the logger hierarchy. - - - - Gets or sets the assigned , if any, for the root - logger. - - - The of the root logger. - - - Setting the level of the root logger to a null reference - may have catastrophic results. We prevent this here. - - - - - Delegate used to handle logger repository shutdown event notifications - - The - that is shutting down. - Empty event args - - Delegate used to handle logger repository shutdown event notifications - - - - - Delegate used to handle logger repository configuration reset event notifications - - The - that has had its configuration reset. - Empty event args - - Delegate used to handle logger repository configuration reset event notifications - - - - - The default implementation of the interface. - - - Uses attributes defined on the calling assembly to determine how to - configure the hierarchy for the domain.. - - - - - Interface used my the to select the . - - - The uses a to specify the policy for - selecting the correct to return to the caller. - - - - - Gets the for the specified assembly. - - The assembly to use to lookup to the - The for the assembly. - - - - Gets the for the specified domain - - The domain to use to lookup to the . - The for the domain. - - - - Creates a new repository for the assembly specified. - - The assembly to use to create the domain to associate with the . - The type of repository to create, must implement . - The repository created. - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - Creates a new repository for the domain specified. - - The domain to associate with the . - The type of repository to create, must implement . - The repository created. - - The created will be associated with the domain - specified such that a call to with the - same domain specified will return the same repository instance. - - - - - Gets the list of currently defined repositories. - - - An array of the instances created by - this . - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - - Creates a new repository selector. - - The type of the repositories to create, must implement - is null. - does not implement . - - - - Gets the for the specified assembly. - - The assembly use to lookup the . - - - The type of the created and the domain - to create can be overridden by specifying the - attribute on the . - - - The default values are to use the - implementation of the interface and to use the - as the name of the domain. - - - The created will be automatically configured using - any attributes defined on - the . - - - is null. - The for the assembly - - - - Get the for the specified domain - - the domain to use to lookup to the - The for the domain - throw if is null - throw if the does not exist - - - - Create a new repository for the assembly specified - - the assembly to use to create the domain to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the domain to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the domain. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - The is null. - - - - Create a new repository for the assembly specified - - the assembly to use to create the domain to associate with the . - The type of repository to create, must implement . - The name to assign to the created repository - Set to true to read and apply the assembly attributes - The repository created. - - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the domain to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the domain. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - The is null. - - - - Create a new repository for the domain specified - - the domain to associate with the - the type of repository to create, must implement . - If this param is null then the default repository type is used. - the repository created - - The created will be associated with the domain - specified such that a call to with the - same domain specified will return the same repository instance. - - throw if is null - throw if the already exists - - - - Copy the list of objects - - an array of all known objects - - - - Alias a domain to an existing repository. - - The domain to alias. - The repository that the domain is aliased to. - - - Aliases a domain to an existing repository. - - - The domain specified will be aliased to the repository when created. - The domain must not already exist. - - - When the domain is created it must utilise the same reporitory type as - the domain it is aliased to, otherwise the aliasing will fail. - - - - - - Notifies the registered listeners that the repository has been created. - - The repository that has been created - - - - Get the domain and repository type for the specified assembly - - the assembly that has a - in/out param to hold the domain to use for the assembly, caller should set this to the default value before calling - in/out param to hold the type of the repository to create for the domain, caller should set this to the default value before calling - - - - Configure the repository using information from the assembly - - The assembly containing - attributes which define the configuration for the repository - the repository to configure - - - - Load the attribute defined plugins on the assembly - - the assembly that contains the attributes - the repository to alias to - - - - Load the attribute defined aliases on the assembly - - the assembly that contains the attributes - the repository to alias to - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - - Defined error codes that can be passed to the method. - - - - - A general error - - - - - Error while writing output - - - - - Failed to flush file - - - - - Failed to close file - - - - - Unable to open output file - - - - - No layout specified - - - - - Failed to parse address - - - - - Base interface for all wrappers - - - Base interface for all wrappers - All wrappers must extend this interface - - - - - Get the implementation behind this wrapper object. - - - The object that in implementing this object. - - - The object that in implementing this - object. The Logger object may not - be the same object as this object because of logger decorators. - This gets the actual underlying objects that is used to process - the log events. - - - - - Delegate used to handle logger repository creation event notifications - - The which created the repository. - The event args - that holds the instance that has been created. - - Delegate used to handle logger repository creation event notifications - - - - - Provides data for the event. - - - A event is raised every time a - is created. - - - - - The created - - - - - Construct instance using specified - - the that has been created - - - - The that has been created - - - The that has been created - - - - - Implementations of this interface allow certain appenders to decide - when to perform an appender specific action. - - - Implementations of this interface allow certain appenders to decide - when to perform an appender specific action. - - - - - Is this the triggering event? - - The event to check - true if this event triggers the action, otherwise false - - Return true if this event triggers the action - - - - - Defines the set of levels recognised by the system. - - - Defines the set of levels recognised by the system. - - The predefined set of levels recognised by the system are - , , , - , , and - . - - The Level class is sealed. You cannot extend this class. - - - - - The OFF level designates a higher level than all the rest. - - - - - The EMERGENCY level designates very severe error events. System unusable, emergencies. - - - - - The FATAL level designates very severe error events that will presumably lead the application to abort. - - - - - The ALERT level designates very severe error events. Take immediate action, alerts. - - - - - The CRITICAL level designates very severe error events. Critical condition, critical. - - - - - The SEVERE level designates very severe error events. Critical condition, critical. - - - - - The ERROR level designates error events that might still allow the application to continue running. - - - - - The WARN level designates potentially harmful situations. - - - - - The NOTICE level designates informational messages that highlight the progress of the application at the highest level. - - - - - The INFO level designates informational messages that highlight the progress of the application at coarse-grained level. - - - - - The DEBUG level designates fine-grained informational events that are most useful to debug an application. - - - - - The FINE level designates fine-grained informational events that are most useful to debug an application. - - - - - The TRACE level designates fine-grained informational events that are most useful to debug an application. - - - - - The FINER level designates fine-grained informational events that are most useful to debug an application. - - - - - The VERBOSE level designates fine-grained informational events that are most useful to debug an application. - - - - - The FINEST level designates fine-grained informational events that are most useful to debug an application. - - - - - The ALL level designates the lowest level possible. - - - - - Instantiate a level object. - - integer value for this level, higher values represent more severe levels - the string name of this level - - - - Returns the string representation of this level. - - - - - - Override Equals to compare the levels of - Level objects. Defers to base class if - the target object is not a Level. - - The object to compare against - true if the objects are equal - - - - Returns a hash code that is suitable for use in a hashtree etc - - the hash of this object - - - - Operator greater than that compares Levels - - left hand side - right hand side - true if left hand side is greater than the right hand side - - - - Operator less than that compares Levels - - left hand side - right hand side - true if left hand side is less than the right hand side - - - - Operator greater than or equal that compares Levels - - left hand side - right hand side - true if left hand side is greater than or equal to the right hand side - - - - Operator less than or equal that compares Levels - - left hand side - right hand side - true if left hand side is less than or equal to the right hand side - - - - Operator equals that compares Levels - - left hand side - right hand side - true if left hand side is equal to the right hand side - - - - Operator not equals that compares Levels - - left hand side - right hand side - true if left hand side is not equal to the right hand side - - - - Compares two specified values. - - A - A - A signed number indicating the relative values of l and r. - - Less than zero: l is less than r. - Zero: l and r are equal. - Greater than zero: l is greater than r. - - - - - Compares this instance to a specified - - An or a null reference - A signed number indicating the relative values of this instance and r. - - Less than zero: this instance is less than r. - Zero: this instance and r are equal. - Greater than zero: this instance is greater than r. - Any instance of , regardless of its value, - is considered greater than a null reference. - - - - - The name of this level - - - The name of this level - - - The name of this level. Readonly. - - - - - The Value of this level - - - The Value of this level - - - The Value of this level. Readonly. - - - - - A strongly-typed collection of objects. - - - - - Creates a synchronized (thread-safe) wrapper for a - LevelCollection instance. - - - A LevelCollection wrapper that is synchronized (thread-safe). - - - - - Creates a read-only wrapper for a - LevelCollection instance. - - - A LevelCollection wrapper that is read-only. - - - - - Initializes a new instance of the LevelCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the LevelCollection class - that has the specified initial capacity. - - - The number of elements that the new LevelCollection is initially capable of storing. - - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified LevelCollection. - - The LevelCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - Copies the entire LevelCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire LevelCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the LevelCollection. - - The to be added to the end of the LevelCollection. - The index at which the value has been added. - - - - Removes all elements from the LevelCollection. - - - - - Creates a shallow copy of the . - - - - - Determines whether a given is in the LevelCollection. - - The to check for. - true if is found in the LevelCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the LevelCollection. - - The to locate in the LevelCollection. - - The zero-based index of the first occurrence of - in the entire LevelCollection, if found; otherwise, -1. - - - - - Inserts an element into the LevelCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the LevelCollection. - - The to remove from the LevelCollection. - - The specified was not found in the LevelCollection. - - - - - Removes the element at the specified index of the LevelCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the LevelCollection. - - An for the entire LevelCollection. - - - - Adds the elements of another LevelCollection to the current LevelCollection. - - The LevelCollection whose elements should be added to the end of the current LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a array to the current LevelCollection. - - The array whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a collection to the current LevelCollection. - - The collection whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the LevelCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the LevelCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - Advances the enumerator to the next element in the collection. - - - The collection was modified after the enumerator was created. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - A value - - - - - Supports simple iteration over a . - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - The collection was modified after the enumerator was created. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - An evaluator that triggers at a threshold level - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - The threshold for triggering - - - - - Create a new evaluator using the threshold. - - - Create a new evaluator using the threshold. - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - Create a new evaluator using the specified threshold. - - the threshold to trigger at - - Create a new evaluator using the specified threshold. - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - Is this the triggering event? - - The event to check - This method returns true, if the event level - is equal or higher than the . - Otherwise it returns false - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - the threshold to trigger at - - - The that will cause this evaluator to trigger - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - Mapping between string name and Level object - - - Mapping between string name and Level object. - This mapping is held seperatly for each ILoggerRepository. - The level name is case insensitive. - - - - - Mapping from level name to Level object. The - level name is case insensitive - - - - - Mapping from level value to Level object - - - - - Construct the level map - - - Construct the level map. - - - - - Clear the internal maps of all levels - - - Clear the internal maps of all levels - - - - - Create a new Level and add it to the map - - the string to display for the Level - the level value to give to the Level - - - - Add a Level it to the map - - the Level to add - - - - Lookup a by name - - The name of the Level to lookup - a Level from the map with the name specified - - Returns the from the - map with the name specified. If the no level is - found then null is returned. - - - - - Lookup a by value - - The value of the Level to lookup - a Level from the map with the value specified - - Returns the from the - map with the value specified. If the no level is - found then null is returned. - - - - - Return all possible levels as a list of Level objects. - - all possible levels as a list of Level objects - - - - The internal representation of caller location information. - - - - - When location information is not available the constant - NA is returned. Current value of this string - constant is ?. - - - - - Instantiate location information based on the current thread - - the fully name of the calling class (not assembly qualified) - - - - Create LocationInfo with specified data - - the fully qualified class name - the method name - the file name - the line number of the method within the file - - - - Return the fully qualified class name of the caller making the logging request. - - - - - - Return the file name of the caller. - - - - - - Returns the line number of the caller. - - - - - - Returns the method name of the caller. - - - - - - All available caller information, in the format - fully.qualified.classname.of.caller.methodName(Filename:line) - - - - - - Exception base type for log4net. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class with - the specified message. - - A message to include with the exception. - - - - Initializes a new instance of the class - with the specified message and inner exception. - - A message to include with the exception. - A nested exception to include. - - - - Initializes a new instance of the class - with serialized data. - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - - Static manager that controls the creation of repositories - - - - Static manager that controls the creation of repositories - - - This class is used by the wrapper managers (e.g. ) - to provide access to the objects. - - - - - - Private constructor to prevent instances. Only static methods should be used. - - - Private constructor to prevent instances. Only static methods should be used. - - - - - Hook the shutdown event - - - On the full .NET runtime, the static constructor hooks up the - AppDomain.ProcessExit and AppDomain.DomainUnload> events. - These are used to shutdown the log4net system as the application exits. - - - - - Register for ProcessExit and DomainUnload events on the AppDomain - - - This needs to be in a seperate method because the events make - a LinkDemand for the ControlAppDomain SecurityPermission. Because - this is a LinkDemand it is demanded at JIT time. Therefore we cannot - catch the exception in the method itself, we habe to catch it in the - caller. - - - - - Return the default instance. - - the domain to lookup in - Return the default instance - - Gets the for the domain specified - by the argument. - - - - - Returns the default instance. - - The assembly to use to lookup the domain. - The default instance. - - - - Returns the named logger if it exists. - - - If the named logger exists (in the specified domain) then it - returns a reference to the logger, otherwise it returns - null. - - The domain to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified domain. - - - - - Returns the named logger if it exists. - - - If the named logger exists (in the specified assembly's domain) then it - returns a reference to the logger, otherwise it returns - null. - - The assembly to use to lookup the domain. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified assembly's domain. - - - - - Returns all the currently defined loggers in the specified domain. - - The domain to lookup in. - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified assembly's domain. - - The assembly to use to lookup the domain. - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Retrieves or creates a named logger. - - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The domain to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The assembly to use to lookup the domain. - The name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The domain to lookup in. - The opf which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - the assembly to use to lookup the domain - The opf which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the domain specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The domain to shutdown. - - - - Shuts down the repository for the domain specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the domain. The domain is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The assembly to use to lookup the domain. - - - - Resets all values contained in this repository instance to their defaults. - - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - The domain to lookup in. - - - - Resets all values contained in this repository instance to their defaults. - - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - The assembly to use to lookup the domain. - - - - Creates a domain with the specified name. - - The name of the domain, this must be unique amongst domain. - The created for the domain. - - - Creates the default type of which is a - object. - - - The name must be unique. Domains cannot be redefined. - An will be thrown if the domain already exists. - - - The specified domain already exists. - - - - Creates a domain with the specified name and repository type. - - The name of the domain, this must be unique to the domain. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the domain specified. - The created for the domain. - - - The name must be unique. Domains cannot be redefined. - An Exception will be thrown if the domain already exists. - - - The specified domain already exists. - - - - Creates a domain for the specified assembly and repository type. - - The assembly to use to get the name of the domain. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the domain specified. - The created for the domain. - - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Gets the list of currently defined repositories. - - An array of all the known objects. - - - - Internal method to get pertinent version info. - - A string of version info. - - - - Called when the event fires - - the that is exiting - null - - Called when the event fires. - - When the event is triggered the log4net system is . - - - - - Called when the event fires - - the that is exiting - null - - Called when the event fires. - - When the event is triggered the log4net system is . - - - - - Initialise the default repository selector - - - - - Gets or sets the repository selector used by the . - - - The repository selector used by the . - - - - The repository selector () is used by - the to create and select repositories - (). - - - The caller to supplies either a string name - or an assembly (if not supplied the assembly is inferred using - ). - - - This context is used by the selector to lookup a specific repository. - - - For the full .NET Framework, the default repository is DefaultRepositorySelector; - for the .NET Compact Framework CompactRepositorySelector is the default - repository. - - - - - - Implementation of the interface. - - - - This class should be used as the base for all wrapper implementations. - - - - - - Constructs a new wrapper for the specified logger. - - The logger to wrap. - - - - The logger that this object is wrapping - - - - - Gets the implementation behind this wrapper object. - - - The object that this object is implementing. - - - - The Logger object may not be the same object as this object - because of logger decorators. - - - This gets the actual underlying objects that is used to process - the log events. - - - - - - Portable data structure used by - - - - - The logger name. - - - - - Level of logging event. Level cannot be Serializable - because it is a flyweight. Due to its special serialization it - cannot be declared final either. - - - - - The nested diagnostic context (NDC) of logging event. - - - - - The local cache of the MDC dictionary - - - - - The application supplied message of logging event. - - - - - The name of thread in which this logging event was generated - - - - - The time the event was logged - - - - - Location information for the caller. - - - - - String representation of the user's windows name, - like DOMAIN\username - - - - - String representation of the current thread's principal identity. - - - - - The string representation of the exception - - - - - String representation of the AppDomain. - - - - - Additional event specific properties - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - - - Flags passed to the property - - - - - Fix the MDC - - - - - Fix the NDC - - - - - Fix the rendered message - - - - - Fix the thread name - - - - - Fix the callers location information - - - CAUTION: Very slow to generate - - - - - Fix the callers windows user name - - - CAUTION: Slow to generate - - - - - Fix the domain friendly name - - - - - Fix the callers principal name - - - CAUTION: May be slow to generate - - - - - Fix the exception text - - - - - No fields fixed - - - - - All fields fixed - - - - - Partial fields fixed - - - - This set of partial fields gives good performance. The following fields are fixed: - - - - - - - - - - - - - - The internal representation of logging events. - - - When an affirmative decision is made to log then a - instance is created. This instance - is passed around to the different log4net components. - - This class is of concern to those wishing to extend log4net. - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - - - The key into the map for the host name value. - - - - - The key into the map for the host name value. - - - - - The key into the map for the host name value. - - - - - Initializes a new instance of the class - from the supplied parameters. - - Fully qualified classname of the logger. - The repository this event is logged in. - The name of the logger of this event. - The level of this event. - The message of this event. - The exception for this event. - - - Except , and , - all fields of LoggingEvent are filled when actually needed. Call - to cache all data locally - to prevent inconsistencies. - - This method is called by the log4net framework - to create a logging event. - - - - - - Initializes a new instance of the class - using specific data. - - Data used to initialise the logging event. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - - - Initializes a new instance of the class - with serialized data. - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - The data in this event must be fixed before it can be serialised. - - - The method must be called during the - method call if this event - is to be used outside that method. - - - - - - Gets the portable data for this . - - - - A new can be constructed using a - instance. - - The for this event. - - - - Looks up the specified key in the . - - The key to lookup. - - The value associated with the key, or null if the key was not found. - - - - - Returns this event's exception's rendered using the - . - - - This event's exception's rendered using the . - - - - - Fixs instance fields that hold volatile data. - - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - incurred by calling but it - is essential to maintaining data consistency. - - - Calling is equivalent to - calling passing the parameter - false. - - - See for more - information. - - - - - - Fixes instance fields that hold volatile data. - - Set to true to not fix data that takes a long time to fix. - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - The param controls the data that - is fixed. Some of the data that can be fixed takes a long time to - generate, therefore if you do not require those settings to be fixed - they can be ignored by setting the param - to true. This setting will ignore the - and settings. - - - Set to false to ensure that all - settings are fixed. - - - - - - Fix the fields specified by the parameter - - the fields to fix - - Only fields specified in the will be fixed. - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - Creates a cached copy of the . - - - - - Stores the time when this class is loaded. - - - This is used to provide times relative to the - application start. - - - - - The internal logging event data. - - - - - The fully qualified classname of the calling - logger class. - - - - - The application supplied message of logging event. - - - - - The exception that was thrown. - - - This is not serialised. The string representation - is serialised instead. - - - - - The repository that generated the logging event - - - This is not serialised. - - - - - The fix state for this event - - - These flags indicate which fields have been fixed. - Not serialised. - - - - - Gets the time when the application started, in milliseconds elapsed - since 01.01.1970. - - - The time when the application started, in milliseconds elapsed - since 01.01.1970. - - - - - Gets the of the logging event. - - - The of the logging event. - - - - - Gets the time of the logging event. - - - The time of the logging event. - - - - - Gets the name of the logger that logged the event. - - - The name of the logger that logged the event. - - - - - Gets the location information for this logging event. - - - The location information for this logging event. - - - The collected information is cached for future use. - - - - - Gets the text of the . - - - The text of the . - - - - - Get the MDC dictionary. - - - - - Gets the message object used to initialise this event. - - - The message object used to initialise this event. - - - Gets the message object used to initialise this event. - Note that this event may not have a valid message object. - If the event is serialised the message object will not - be transferred. To get the text of the message the - property must be used - not this property. - If there is no defined message object for this event then - null will be returned. - - - - - Gets the message, rendered through the . - - - The message rendered through the . - - - The collected information is cached for future use. - - - - - Gets the name of the current thread. - - - The name of the current thread, or the thread ID when - the name is not available. - - - The collected information is cached for future use. - - - - - Gets the name of the current user. - - - The name of the current user, or NOT AVAILABLE when the - underlying runtime has no support for retrieving the name of the - current user. - - - - Calls WindowsIdentity.GetCurrent().Name to get the name of - the current windows user. - - - To improve performance, we could cache the string representation of - the name, and reuse that as long as the identity stayed constant. - Once the identity changed, we would need to re-assign and re-render - the string. - - - However, the WindowsIdentity.GetCurrent() call seems to - return different objects every time, so the current implementation - doesn't do this type of caching. - - - Timing for these operations: - - - 00:00:00.2031250 sec, 10000 loops, WindowsIdentity.GetCurrent() - 00:00:08.0468750 sec, 10000 loops, WindowsIdentity.GetCurrent().Name - - - This means we could speed things up almost 40 times by caching the - value of the WindowsIdentity.GetCurrent().Name property, since - this takes (8.04-0.20) = 7.84375 seconds. - - - - - - Gets the identity of the current thread principal. - - - The string name of the identity of the current thread principal. - - - - Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get - the name of the current thread principal. - - - - - - Gets the AppDomain friendly name. - - - - - Gets additional event specific properties. - - - Additional event specific properties. - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - - - The fixed fields in this event - - - The set of fields that are fixed in this event - - - - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - - Implementation of wrapper interface. - - - - This implementation of the interface - forwards to the held by the base class. - - - - - - The ILog interface is use by application to log messages into - the log4net framework. - - - - Use the to obtain logger instances - that implement this interface. The - static method is used to get logger instances. - - - This class contains methods for logging at different levels and also - has properties for determining if those logging levels are - enabled in the current configuration. - - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - - - - Logs a message object with the level. - - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - The message object to log. - The exception to log, including its stack trace. - - - - - - Logs a message object with the level. - - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Logs a message object with the INFO level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - The message object to log. - The exception to log, including its stack trace. - - - - - - Log a message object with the level. - - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - The message object to log. - The exception to log, including its stack trace. - - - - - - Logs a message object with the level. - - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - The message object to log. - The exception to log, including its stack trace. - - - - - - Log a message object with the level. - - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - The message object to log. - The exception to log, including its stack trace. - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - For some ILog interface log, when you write: - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, string construction and concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed (who isn't), then you should write: - - - if (log.IsDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in and once in - the . This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. This is the preferred style of logging. - - Alternatively if your logger is available statically then the is debug - enabled state can be stored in a static variable like this: - - - private static readonly bool isDebugEnabled = log.IsDebugEnabled; - - - Then when you come to log you can write: - - - if (isDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way the debug enabled state is only queried once - when the class is loaded. Using a private static readonly - variable is the most efficient because it is a run time constant - and can be heavily optimised by the JIT compiler. - - - Of course if you use a static readonly variable to - hold the enabled state of the logger then you cannot - change the enabled state at runtime to vary the logging - that is produced. You have to decide if you need absolute - speed or runtime flexibility. - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - Construct a new wrapper for the specified logger. - - The logger to wrap. - - - - Logs a message object with the level. - - The message object to log. - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the DEBUG level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - See the form for more detailed information. - - - - - - Logs a message object with the level. - - The message object to log. - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the INFO level including - the stack trace of the - passed as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - See the form for more detailed information. - - - - - - Logs a message object with the level. - - the message object to log - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the WARN level including - the stack trace of the - passed as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - See the form for more detailed information. - - - - - - Logs a message object with the level. - - The message object to log. - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the ERROR level including - the stack trace of the - passed as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - See the form for more detailed information. - - - - - - Logs a message object with the level. - - The message object to log. - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the FATAL level including - the stack trace of the - passed as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - See the form for more detailed information. - - - - - - The fully qualified name of the Logger class. - - - - - Gets the fully qualified classname of the logger. - - - The fully qualified classname of the logger. - - - - - Checks if this logger is enabled for the DEBUG - level. - - - true if this logger is enabled for DEBUG events, - false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - - For some log Logger object, when you write: - - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed, then you should write: - - - if (log.IsDebugEnabled()) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in IsDebugEnabled and once in - the Debug. This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. - - - - - - Checks if this logger is enabled for the INFO level. - - - true if this logger is enabled for INFO events, - false otherwise. - - - See for more information and examples - of using this method. - - - - - - Checks if this logger is enabled for the WARN level. - - - true if this logger is enabled for WARN events, - false otherwise. - - - See for more information and examples - of using this method. - - - - - - Checks if this logger is enabled for the ERROR level. - - - true if this logger is enabled for ERROR events, - false otherwise. - - - See for more information and examples of using this method. - - - - - - Checks if this logger is enabled for the FATAL level. - - - true if this logger is enabled for FATAL events, - false otherwise. - - - See for more information and examples of using this method. - - - - - - Delegate used to handle creation of new wrappers. - - The logger to wrap in a wrapper. - - - - Maps between logger objects and wrapper objects. - - - - This class maintains a mapping between objects and - objects. Use the indexor accessor to lookup the - for the specified . - - - - - - Initializes a new instance of the class with - the specified handler to create the wrapper objects. - - The handler to use to create the wrapper objects. - - - - Creates the wrapper object for the specified logger. - - The logger to wrap in a wrapper. - - This implementation uses the - passed to the constructor to create the wrapper. This method - can be overriden in a subclass. - - The wrapper object for the logger. - - - - Event handler for repository shutdown event. - - The sender of the event. - The event args. - - - - Map of logger repositories. - - - - - The handler to use to create the extension wrapper objects. - - - - - Internal reference to the delegate used to register for repository shutdown events. - - - - - Gets the wrapper object for the specified logger. - - - The wrapper object for the specified logger. - - - If the logger is null then the coresponding wrapper is null - - - - - Gets the map of logger repositories. - - - Map of logger repositories. - - - - - This is the class used by client applications to bind to logger - instances. - - - - See the interface for more details. - - - log4net uses NUnit 2.0 to provide internal unit testing. - To run the tests you will need a copy of NUnit 2.0. Then - run the following command: - - nunit-console.exe /assembly:<log4net assembly> - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the default hierarchy) then it - returns a reference to the logger, otherwise it returns - null. - - - The fully qualified logger name to look for. - The logger found, or null if no logger could be found. - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the specified domain) then it - returns a reference to the logger, otherwise it returns - null. - - - The domain to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the logger doesn't exist in the specified - domain. - - - - - Returns the named logger if it exists. - - The assembly to use to lookup the domain. - The fully qualified logger name to look for. - - The logger, or null if the logger doesn't exist in the specified - assembly's domain. - - - - - Returns all the currently defined loggers in the default domain. - - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified domain. - - The domain to lookup in. - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified assembly's domain. - - The assembly to use to lookup the domain. - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Retrieves or creates a named logger. - - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The domain to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The assembly to use to lookup the domain. - The name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Get the logger for the fully qualified name of the type specified. - - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The domain to lookup in. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The assembly to use to lookup the domain. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the default repository. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - default repository. - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the domain specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The domain to shutdown. - - - - Shuts down the repository for the domain specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the domain. The domain is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The assembly to use to lookup the domain. - - - - Resets all values contained in this repository instance to their defaults. - - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The domain to lookup in. - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The assembly to use to lookup the domain. - - - - Returns the default instance. - - The instance for the default domain. - - - Gets the for the domain specified - by the callers assembly (). - - - - - - Returns the default instance. - - The domain to lookup in. - The default instance. - - - Gets the for the domain specified - by the argument. - - - - - - Returns the default instance. - - The assembly to use to lookup the domain. - The default instance. - - - Gets the for the domain specified - by the argument. - - - - - - Creates a domain with the specified repository type. - - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the domain specified. - The created for the domain. - - - The created will be associated with the domain - specified such that a call to will return - the same repository instance. - - - - - - Creates a domain with the specified name. - - The name of the domain, this must be unique amongst domain. - The created for the domain. - - - Creates the default type of which is a - object. - - - The name must be unique. Domains cannot be redefined. - An will be thrown if the domain already exists. - - - The specified domain already exists. - - - - Creates a domain with the specified name and repository type. - - The name of the domain, this must be unique to the domain. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the domain specified. - The created for the domain. - - - The name must be unique. Domains cannot be redefined. - An will be thrown if the domain already exists. - - - The specified domain already exists. - - - - Creates a domain for the specified assembly and repository type. - - The assembly to use to get the name of the domain. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the domain specified. - The created for the domain. - - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Gets the list of currently defined repositories. - - An array of all the known objects. - - - - Looks up the wrapper object for the logger specified. - - The logger to get the wrapper for. - The wrapper for the logger specified. - - - - Looks up the wrapper objects for the loggers specified. - - The loggers to get the wrappers for. - The wrapper objects for the loggers specified. - - - - Create the objects used by - this manager. - - The logger to wrap. - The wrapper for the logger specified. - - - - The wrapper map to use to hold the objects. - - - - - Implementation of Mapped Diagnostic Contexts. - - - - The MDC class is similar to the class except that it is - based on a map instead of a stack. It provides mapped - diagnostic contexts. A Mapped Diagnostic Context, or - MDC in short, is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The MDC is managed on a per thread basis. - - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Gets the context identified by the parameter. - - - If the parameter does not look up to a - previously defined context then null will be returned. - - The key to lookup in the MDC. - The string value held for the key, or a null reference if no corresponding value is found. - - - - Puts a context value (the parameter) as identified - with the parameter into the current thread's - context map. - - - If a value is already defined for the - specified then the value will be replaced. If the - is specified as null then the key value mapping will be removed. - - The key to store the value under. - The value to store. - - - - Removes the key value mapping for the key specified. - - The key to remove. - - - - Clear all entries in the MDC - - - - - Gets the map on this thread. - - The map on the current thread. - - - - Gets a readonly copy of the map on this thread. - - A readonly copy of the map on the current thread. - - - - The thread local data slot to use for context information. - - - - - Implementation of Nested Diagnostic Contexts. - - - - A Nested Diagnostic Context, or NDC in short, is an instrument - to distinguish interleaved log output from different sources. Log - output is typically interleaved when a server handles multiple - clients near-simultaneously. - - - Interleaved log output can still be meaningful if each log entry - from different contexts had a distinctive stamp. This is where NDCs - come into play. - - - Note that NDCs are managed on a per thread basis. The NDC class - is made up of static methods that operate on the context of the - calling thread. - - - How to push a message into the context - - using(NDC.Push("my context message")) - { - ... all log calls will have 'my context message' included ... - - } // at the end of the using block the message is automatically removed - - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Clears all the contextual information held on the - current thread. - - - After calling this method the will be 0. - - - - - Creates a clone of the stack of context information. - - - The results of this method can be passed to the - method to allow child threads to inherit the context of their - parent thread. - - A clone of the context info for this thread. - - - - Inherits the contextual information from another thread. - - - This thread will use the context information from the stack - supplied. This can be used to initialise child threads with - the same contextual information as their parent threads. These - contexts will NOT be shared. Any further contexts that - are pushed onto the stack will not be visible to the other. - Call to obtain a stack to pass to - this method. - - The context stack to inherit. - - - - Removes the top context from the stack. - - - Remove the top context from the stack, and return - it to the caller. If the stack is empty then an - empty string (not null) is returned. - - - The message in the context that was removed from the top - of the stack. - - - - - Pushes a new context message. - - The new context message. - - An that can be used to clean up - the context stack. - - - Pushes a new context onto the context stack. An - is returned that can be used to clean up the context stack. This - can be easily combined with the using keyword to scope the - context. - - Simple example of using the Push method with the using keyword. - - using(log4net.NDC.Push("NDC_Message")) - { - log.Warn("This should have an NDC message"); - } - - - - - - Removes the context information for this thread. It is - not required to call this method. - - - This method is not implemented. - - - - - Forces the stack depth to be at most . - - - Forces the stack depth to be at most . - This may truncate the head of the stack. This only affects the - stack in the current thread. Also it does not prevent it from - growing, it only sets the maximum depth at the time of the - call. This can be used to return to a known context depth. - - The maximum depth of the stack - - - - Gets the current context information. - - The current context information. - - - - Peeks at the message on the top of the context stack. - - The message on the top of the stack. - - - - Gets the stack of context objects on this thread. - - The stack of context objects on the current thread. - - - - The thread local data slot to use for context information. - - - - - Gets the current context depth. - - The current context depth. - - - - Inner class used to represent a single context in the stack. - - - - - Initializes a new instance of the class - with the specified message and parent context. - - The message for this context. - The parent context in the chain. - - - - Get the message. - - The message. - - - - Gets the full text of the context down to the root level. - - - The full text of the context down to the root level. - - - - - Inner class that is returned from - - - This class is disposable and when it is disposed it automatically - returns the NDC to the correct depth. - - - - - Initializes a new instance of the class with - the specified stack and return depth. - - The internal stack used by the NDC. - The depth to return the stack to when this object is disposed. - - - - Returns the NDC stack to the correct depth. - - - - - The NDC internal stack - - - - - The depth to rethrow the stack to when this instance is disposed - - - - diff --git a/Examples/npetshop2/NPetshop.Domain/Accounts/Account.cs b/Examples/npetshop2/NPetshop.Domain/Accounts/Account.cs deleted file mode 100644 index b13ef01..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Accounts/Account.cs +++ /dev/null @@ -1,63 +0,0 @@ - -using System; - -namespace NPetshop.Domain.Accounts -{ - /// - /// Business entity used to model user account - /// - [Serializable] - public class Account - { - - #region Private Fields - private string _login = string.Empty; - private string _password = string.Empty; - private string _email = string.Empty; - private string _status = string.Empty; - private Address _address = new Address(); - private Profile _profile = new Profile(); - #endregion - - #region Properties - public string Login - { - get{return _login;} - set{_login = value;} - } - - public string Password - { - get{return _password;} - set{_password = value;} - } - - public string Email - { - get{return _email;} - set{_email = value;} - } - - public string Status - { - get{return _status;} - set{_status = value;} - } - - public Address Address - { - get{return _address;} - set{_address = value;} - } - - - public Profile Profile - { - get{return _profile;} - set{_profile = value;} - } - - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Domain/Accounts/Address.cs b/Examples/npetshop2/NPetshop.Domain/Accounts/Address.cs deleted file mode 100644 index f94f929..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Accounts/Address.cs +++ /dev/null @@ -1,82 +0,0 @@ -using System; - - -namespace NPetshop.Domain.Accounts -{ - /// - /// Business entity used to model an address - /// - [Serializable] - public class Address - { - - #region Private Fields - private string _firstName; - private string _lastName; - private string _address1; - private string _address2; - private string _city; - private string _state; - private string _zip; - private string _country; - private string _phone; - #endregion - - #region Properties - - public string FirstName - { - get { return _firstName; } - set { _firstName = value; } - } - - public string LastName - { - get { return _lastName; } - set { _lastName = value; } - } - - public string Address1 - { - get { return _address1; } - set { _address1 = value; } - } - - public string Address2 - { - get { return _address2; } - set { _address2 = value; } - } - - public string City - { - get { return _city; } - set { _city = value; } - } - - public string State - { - get { return _state; } - set { _state = value; } - } - - public string Zip - { - get { return _zip; } - set { _zip = value; } - } - - public string Country - { - get { return _country; } - set { _country = value; } - } - - public string Phone - { - get { return _phone; } - set { _phone = value; } - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Domain/Accounts/Profile.cs b/Examples/npetshop2/NPetshop.Domain/Accounts/Profile.cs deleted file mode 100644 index b72f432..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Accounts/Profile.cs +++ /dev/null @@ -1,55 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Accounts -{ - /// - /// Business entity used to model user profile - /// - public class Profile - { - - #region Private Fields - private Category _favouriteCategory = null; - private string _favoriteLanguage = string.Empty; - private bool _isShowFavorites = false; - private bool _isShowBanners = false; - private string _bannerName = string.Empty; - #endregion - - #region Properties - - public Category FavouriteCategory - { - get{return _favouriteCategory;} - set{_favouriteCategory = value;} - } - - public string FavoriteLanguage - { - get{return _favoriteLanguage;} - set{_favoriteLanguage = value;} - } - - public bool IsShowFavorites - { - get{return _isShowFavorites;} - set{_isShowFavorites = value;} - } - - public bool IsShowBanners - { - get{return _isShowBanners;} - set{_isShowBanners = value;} - } - - public string BannerName - { - get{return _bannerName;} - set{_bannerName = value;} - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Domain/AssemblyInfo.cs b/Examples/npetshop2/NPetshop.Domain/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop2/NPetshop.Domain/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop2/NPetshop.Domain/Billing/CreditCard.cs b/Examples/npetshop2/NPetshop.Domain/Billing/CreditCard.cs deleted file mode 100644 index 8f4d1ed..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Billing/CreditCard.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; - - -namespace NPetshop.Domain.Billing -{ - - /// - /// Business entity used to model credit card information. - /// - [Serializable] - public class CreditCard{ - - #region Private Fields - private string _cardType; - private string _cardNumber; - private string _cardExpiration; - #endregion - - #region Properties - /// - /// Default constructor - /// - public CreditCard() - { - } - - /// - /// Constructor with specified initial values - /// - /// Card type, e.g. Visa, Master Card, American Express - /// Number on the card - /// Expiry Date, form MM/YY - public CreditCard(string cardType, string cardNumber, string cardExpiration){ - this._cardType = cardType; - this._cardNumber = cardNumber; - this._cardExpiration = cardExpiration; - } - - // Properties - public string CardType { - get { return _cardType; } - set { _cardType = value; } - } - - public string CardNumber { - get { return _cardNumber; } - set { _cardNumber = value; } - } - - public string CardExpiration { - get { return _cardExpiration; } - set { _cardExpiration = value; } - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Domain/Billing/LineItem.cs b/Examples/npetshop2/NPetshop.Domain/Billing/LineItem.cs deleted file mode 100644 index 516780d..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Billing/LineItem.cs +++ /dev/null @@ -1,91 +0,0 @@ - -using System; - -using NPetshop.Domain.Shopping; -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Billing -{ - /// - /// Business entity used to model an order line item - /// - public class LineItem - { - - #region Private Fields - private Order _order = null; - private Item _item = null; - private int _lineNumber = 0; - private int _quantity = 0; - private decimal _total = 0.0m; - #endregion - - #region Constructors - public LineItem() { } - - public LineItem(int lineNumber, ShoppingCartLine cartItem) - { - _lineNumber = lineNumber; - this.Quantity = cartItem.Quantity; - this.Item = cartItem.Item; - } - #endregion - - #region Properties - - public Order Order - { - get{return _order;} - set{_order = value;} - } - - public int LineNumber - { - get{return _lineNumber;} - set{_lineNumber = value;} - } - - public decimal Total - { - get{return _total;} - } - - public Item Item - { - get{return _item;} - set - { - _item = value; - CalculateTotal(); - } - } - - - public int Quantity - { - get{return _quantity;} - set - { - _quantity = value; - CalculateTotal(); - } - } - #endregion - - #region Private methods - - private void CalculateTotal() - { - if (_item != null) - { - _total = this.Item.ListPrice * this.Quantity; - } - else - { - _total = 0.0m; - } - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Domain/Billing/Order.cs b/Examples/npetshop2/NPetshop.Domain/Billing/Order.cs deleted file mode 100644 index 96753e8..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Billing/Order.cs +++ /dev/null @@ -1,115 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Accounts; -using NPetshop.Domain.Shopping; - -namespace NPetshop.Domain.Billing -{ - - /// - /// Business entity used to model an order - /// - [Serializable] - public class Order - { - - #region Private Fields - private int _id; - private Account _account; - private DateTime _orderDate; - private CreditCard _creditCard = new CreditCard(); - private Address _billingAddress = new Address(); - private Address _shippingAddress = new Address(); - private decimal _totalPrice; - private IList _lineItems = new ArrayList(); - #endregion - - #region Properties - - - public int Id - { - get{return _id;} - set{_id = value;} - } - - public Account Account - { - get{return _account;} - set{_account = value;} - } - - - public DateTime OrderDate - { - get{return _orderDate;} - set{_orderDate = value;} - } - - public CreditCard CreditCard - { - get{return _creditCard;} - set{_creditCard = value;} - } - - - public Address BillingAddress - { - get{return _billingAddress;} - set{_billingAddress = value;} - } - - public Address ShippingAddress - { - get{return _shippingAddress;} - set{_shippingAddress = value;} - } - - public decimal TotalPrice - { - get{return _totalPrice;} - set{_totalPrice = value;} - } - - public IList LineItems - { - get{return _lineItems;} - set{_lineItems = value;} - } - #endregion - - public Order(Account account, ShoppingCart cart, Address address) - { - _account = account; - _orderDate = DateTime.Now; - - _shippingAddress = address; - _billingAddress = address; - - _totalPrice = cart.Total; - - IEnumerator enumerator = cart.GetAllLines(); - while( enumerator.MoveNext() ) - { - ShoppingCartLine cartLine = (ShoppingCartLine) enumerator.Current; - AddLineItem( cartLine ); - } - } - - #region Public Methods - - public void AddLineItem(ShoppingCartLine cartItem) - { - LineItem lineItem = new LineItem(_lineItems.Count + 1, cartItem); - AddLineItem(lineItem); - } - - public void AddLineItem(LineItem lineItem) - { - _lineItems.Add(lineItem); - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Domain/Catalog/Category.cs b/Examples/npetshop2/NPetshop.Domain/Catalog/Category.cs deleted file mode 100644 index d2f6564..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Catalog/Category.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Collections; - -namespace NPetshop.Domain.Catalog -{ - - /// - /// Business entity used to model category - /// - [Serializable] - public class Category - { - - #region Private Fields - private string _Id; - private string _name; - private string _description; - private IList _products = new ArrayList(); - #endregion - - #region Properties - public string Id - { - get{return _Id;} - set{_Id = value;} - } - - public string Name - { - get{return _name;} - set{_name = value;} - } - - - public string Description - { - get{return _description;} - set{_description = value;} - } - - public IList Products - { - get{return _products;} - set{_products = value;} - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Domain/Catalog/Item.cs b/Examples/npetshop2/NPetshop.Domain/Catalog/Item.cs deleted file mode 100644 index 98febe8..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Catalog/Item.cs +++ /dev/null @@ -1,84 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; - -namespace NPetshop.Domain.Catalog -{ - /// - /// Summary description for Item. - /// - public class Item - { - #region Private Fields - private string _id; - private decimal _listPrice; - private decimal _unitCost; - private string _currency; - private string _photo; - private int _quantity; - private string _attribute1; - private Product _product; - private Supplier _supplier; - #endregion - - #region Properties - public string Attribute1 - { - get{return _attribute1;} - set{_attribute1 = value;} - } - - public int Quantity - { - get{return _quantity;} - set{_quantity = value;} - } - - public string Id - { - get{return _id;} - set{_id = value;} - } - - public decimal ListPrice - { - get{return _listPrice;} - set{_listPrice = value;} - } - - public decimal UnitCost - { - get{return _unitCost;} - set{_unitCost = value;} - } - - public string Currency - { - get{return _currency;} - set{_currency = value;} - } - - public Product Product - { - get{return _product;} - set{_product = value;} - } - - public Supplier Supplier - { - get{return _supplier;} - set{_supplier = value;} - } - - public string Photo - { - set {_photo = value;} - get {return _photo;} - } - - - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Domain/Catalog/Product.cs b/Examples/npetshop2/NPetshop.Domain/Catalog/Product.cs deleted file mode 100644 index eafd852..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Catalog/Product.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; - -namespace NPetshop.Domain.Catalog -{ - - /// - /// Business entity used to model a product - /// - [Serializable] - public class Product { - - #region Private Fields - private string _id; - private string _name; - private string _description; - private Category _category; - #endregion - - #region Properties - public string Id - { - set{_id = value;} - get { return _id; } - } - - public string Name - { - set{_name = value;} - get { return _name; } - } - - public string Description - { - set{_description = value;} - get { return _description; } - } - - public Category Category - { - set{_category = value;} - get{return _category;} - } - #endregion - - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Domain/Catalog/Supplier.cs b/Examples/npetshop2/NPetshop.Domain/Catalog/Supplier.cs deleted file mode 100644 index e6629bd..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Catalog/Supplier.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; - -using NPetshop.Domain.Accounts; - -namespace NPetshop.Domain.Catalog -{ - /// - /// Summary description for Supplier. - /// - public class Supplier - { - #region Private Fields - private int _id; - private string _name; - private Address _address = new Address(); - #endregion - - #region Properties - - public int Id - { - get{return _id;} - set{_id = value;} - } - - public string Name - { - get{return _name;} - set{_name = value;} - } - - public Address Address - { - get{return _address;} - set{_address = value;} - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj b/Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj deleted file mode 100644 index 760bcc6..0000000 --- a/Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj +++ /dev/null @@ -1,160 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj.user b/Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj.user deleted file mode 100644 index dc80744..0000000 --- a/Examples/npetshop2/NPetshop.Domain/NPetshop.Domain.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Domain/Sequence.cs b/Examples/npetshop2/NPetshop.Domain/Sequence.cs deleted file mode 100644 index a26d2c0..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Sequence.cs +++ /dev/null @@ -1,42 +0,0 @@ -using System; - -namespace NPetshop.Domain -{ - - [Serializable] - public class Sequence - { - - #region Private Fields - private String _name; - private int _nextId; - #endregion - - /* Constructors */ - - public Sequence() { } - - public Sequence(String name, int nextId) - { - this._name = name; - this._nextId = nextId; - } - - #region Properties - - public string Name - { - set{_name = value;} - get { return _name; } - } - - - public int NextId - { - set{_nextId = value;} - get { return _nextId; } - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCart.cs b/Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCart.cs deleted file mode 100644 index 60f3d89..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCart.cs +++ /dev/null @@ -1,127 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Shopping -{ - - [Serializable] - public class ShoppingCart : IEnumerable - { - #region Private Fields - private IPaginatedList _cartLines = new PaginatedArrayList(4); - #endregion - - #region Properties - - public IPaginatedList Lines - { - get{ return _cartLines; } - } - - public bool IsEmpty - { - get{ return _cartLines.Count == 0; } - } - - public decimal Total - { - get - { - decimal total = 0; - IEnumerator lines = GetAllLines(); - while (lines.MoveNext()) - { - ShoppingCartLine line = (ShoppingCartLine) lines.Current; - total += line.Total; - } - return total; - } - } - #endregion - - #region Pulbic methods - public IEnumerator GetEnumerator() - { - return _cartLines.GetEnumerator(); - } - - public IEnumerator GetAllLines() - { - ArrayList allItems = new ArrayList(); - int index = _cartLines.PageIndex; - _cartLines.GotoPage(0); - - foreach(ShoppingCartLine line in _cartLines) - { - allItems.Add(line); - } - while (_cartLines.NextPage()) - { - foreach(ShoppingCartLine line in _cartLines) - { - allItems.Add(line); - } - } - - _cartLines.GotoPage(index); - return allItems.GetEnumerator(); - } - - public void Add(ShoppingCartLine newLine){ - ShoppingCartLine existingLine = FindLine(newLine); - if (existingLine != null) - { - existingLine.Quantity += newLine.Quantity; - } - else - { - _cartLines.Add(newLine); - } - } - - public void Add(Item item){ - ShoppingCartLine existingLine = FindLine(item); - if (existingLine != null) - { - existingLine.Quantity += 1; - } - else - { - _cartLines.Add(new ShoppingCartLine(item)); - } - } - - public void RemoveLine(ShoppingCartLine otherLine){ - RemoveLine(otherLine.Item); - } - - public void RemoveLine(Item item){ - foreach (ShoppingCartLine line in _cartLines) - { - if (line.Item.Product.Name == item.Product.Name) - { - _cartLines.Remove(line); - break; - } - } - } - - public ShoppingCartLine FindLine(ShoppingCartLine otherLine){ - return FindLine(otherLine.Item); - } - - public ShoppingCartLine FindLine(Item item){ - foreach (ShoppingCartLine line in _cartLines){ - if (line.Item.Product.Name == item.Product.Name){ - return line; - } - } - return null; - } - #endregion - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCartLine.cs b/Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCartLine.cs deleted file mode 100644 index fcce360..0000000 --- a/Examples/npetshop2/NPetshop.Domain/Shopping/ShoppingCartLine.cs +++ /dev/null @@ -1,90 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; - -namespace NPetshop.Domain.Shopping -{ - - [Serializable] - public class ShoppingCartLine - { - #region Private Fields - private Item _item = null; - private bool _isInStock = false; - private int _quantity = -1; - private decimal _total = 0; - #endregion - - #region Constructors - public ShoppingCartLine(Item item) - { - this.Item = item; - this.Quantity = 1; - } - - public ShoppingCartLine(Item item, int quantity) - { - this.Item = item; - this.Quantity = quantity; - } - #endregion - - #region Properties - public Item Item - { - get { return _item; } - set - { - _item = value; - CalculateTotal(); - } - } - - public int Quantity - { - get { return _quantity; } - set - { - _quantity = value; - CalculateTotal(); - } - } - - public bool IsInStock - { - get { return _isInStock; } - set { _isInStock = value; } - } - - public decimal Total - { - get { return _total; } - } - - #endregion - - #region Public methods - public void IncrementQuantity() - { - _quantity++; - CalculateTotal(); - } - #endregion - - #region Private methods - private void CalculateTotal() - { - if (_item != null) - { - _total = _quantity * _item.ListPrice; - } - else - { - _total = 0; - } - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/AssemblyInfo.cs b/Examples/npetshop2/NPetshop.Persistence/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql b/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql deleted file mode 100644 index 9287403..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DBUser.sql +++ /dev/null @@ -1,16 +0,0 @@ -USE [NPetshop] - -if not exists (select * from master.dbo.syslogins where loginname = N'NPetshop') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'NPetshop', @loginpass=N'ibatisnet', @loginlang = N'us_english' - exec sp_addlogin N'NPetshop', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'NPetshop' and uid < 16382) - EXEC sp_grantdbaccess N'NPetshop', N'NPetshop' -GO - -exec sp_addrolemember N'db_owner', N'NPetshop' -GO \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql b/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql deleted file mode 100644 index c3c0499..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/DataLoad.sql +++ /dev/null @@ -1,86 +0,0 @@ - -INSERT INTO [Suppliers] VALUES (1, 'XYZ Pets', 'AC', '600 Avon Way', '', 'Los Angeles', 'CA', '94024', '212-947-0797') -INSERT INTO [Suppliers] VALUES (2, 'ABC Pets', 'AC', '700 Abalone Way', '', 'San Francisco', 'CA', '94024', '415-947-0797') - -INSERT INTO [Categories] VALUES ('FISH', 'Fish', NULL) -INSERT INTO [Categories] VALUES ('DOGS', 'Dogs', NULL) -INSERT INTO [Categories] VALUES ('REPTILES', 'Reptiles', NULL) -INSERT INTO [Categories] VALUES ('CATS', 'Cats', NULL) -INSERT INTO [Categories] VALUES ('BIRDS', 'Birds', NULL) - -INSERT INTO [Products] VALUES ('FI-SW-01', 'FISH', 'Angelfish', 'Saltwater fish from Australia') -INSERT INTO [Products] VALUES ('FI-SW-02', 'FISH', 'Tiger Shark', 'Saltwater fish from Australia') -INSERT INTO [Products] VALUES ('FI-FW-01', 'FISH', 'Koi', 'Freshwater fish from Japan') -INSERT INTO [Products] VALUES ('FI-FW-02', 'FISH', 'Goldfish', 'Freshwater fish from China') -INSERT INTO [Products] VALUES ('K9-BD-01', 'DOGS', 'Bulldog', 'Friendly dog from England') -INSERT INTO [Products] VALUES ('K9-PO-02', 'DOGS', 'Poodle', 'Cute dog from France') -INSERT INTO [Products] VALUES ('K9-DL-01', 'DOGS', 'Dalmation', 'Great dog for a fire station') -INSERT INTO [Products] VALUES ('K9-RT-01', 'DOGS', 'Golden Retriever', 'Great family dog') -INSERT INTO [Products] VALUES ('K9-RT-02', 'DOGS', 'Labrador Retriever', 'Great hunting dog') -INSERT INTO [Products] VALUES ('K9-CW-01', 'DOGS', 'Chihuahua', 'Great companion dog') -INSERT INTO [Products] VALUES ('RP-SN-01', 'REPTILES', 'Rattlesnake', 'Doubles as a watch dog') -INSERT INTO [Products] VALUES ('RP-LI-02', 'REPTILES', 'Iguana', 'Friendly green friend') -INSERT INTO [Products] VALUES ('FL-DSH-01', 'CATS', 'Manx', 'Great for reducing mouse populations') -INSERT INTO [Products] VALUES ('FL-DLH-02', 'CATS', 'Persian', 'Friendly house cat, doubles as a princess') -INSERT INTO [Products] VALUES ('AV-CB-01', 'BIRDS', 'Amazon Parrot', 'Great companion for up to 75 years') -INSERT INTO [Products] VALUES ('AV-SB-02', 'BIRDS', 'Finch', 'Great stress reliever') - -INSERT INTO [Items] VALUES ('EST-1', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Large', NULL, NULL, NULL, NULL,'fish1.jpg') -INSERT INTO [Items] VALUES ('EST-2', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Small', NULL, NULL, NULL, NULL,'fish1.jpg') -INSERT INTO [Items] VALUES ('EST-3', 'FI-SW-02', 18.50, 12.00, 1, 'P', 'Toothless', NULL, NULL, NULL, NULL,'fish2.jpg') -INSERT INTO [Items] VALUES ('EST-4', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotted', NULL, NULL, NULL, NULL,'fish3.jpg') -INSERT INTO [Items] VALUES ('EST-5', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotless', NULL, NULL, NULL, NULL,'fish3.jpg') -INSERT INTO [Items] VALUES ('EST-6', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Male Adult', NULL, NULL, NULL, NULL,'dog1.jpg') -INSERT INTO [Items] VALUES ('EST-7', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Female Puppy', NULL, NULL, NULL, NULL,'dog1.jpg') -INSERT INTO [Items] VALUES ('EST-8', 'K9-PO-02', 18.50, 12.00, 1, 'P', 'Male Puppy', NULL, NULL, NULL, NULL,'dog2.jpg') -INSERT INTO [Items] VALUES ('EST-9', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotless Male Puppy', NULL, NULL, NULL, NULL,'dog3.jpg') -INSERT INTO [Items] VALUES ('EST-10', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotted Adult Female', NULL, NULL, NULL, NULL,'dog3.jpg') -INSERT INTO [Items] VALUES ('EST-11', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Venomless', NULL, NULL, NULL, NULL,'reptile1.jpg') -INSERT INTO [Items] VALUES ('EST-12', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Rattleless', NULL, NULL, NULL, NULL,'reptile1.jpg') -INSERT INTO [Items] VALUES ('EST-13', 'RP-LI-02', 18.50, 12.00, 1, 'P', 'Green Adult', NULL, NULL, NULL, NULL,'reptile2.jpg') -INSERT INTO [Items] VALUES ('EST-14', 'FL-DSH-01', 58.50, 12.00, 1, 'P', 'Tailless', NULL, NULL, NULL, NULL,'cat1.jpg') -INSERT INTO [Items] VALUES ('EST-15', 'FL-DSH-01', 23.50, 12.00, 1, 'P', 'Tailed', NULL, NULL, NULL, NULL,'cat1.jpg') -INSERT INTO [Items] VALUES ('EST-16', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'cat2.jpg') -INSERT INTO [Items] VALUES ('EST-17', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'cat2.jpg') -INSERT INTO [Items] VALUES ('EST-18', 'AV-CB-01', 193.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird1.jpg') -INSERT INTO [Items] VALUES ('EST-19', 'AV-SB-02', 15.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird2.jpg') -INSERT INTO [Items] VALUES ('EST-20', 'FI-FW-02', 5.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'fish4.jpg') -INSERT INTO [Items] VALUES ('EST-21', 'FI-FW-02', 5.29, 1.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'fish4.jpg') -INSERT INTO [Items] VALUES ('EST-22', 'K9-RT-02', 135.50, 100.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-23', 'K9-RT-02', 145.49, 100.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-24', 'K9-RT-02', 255.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-25', 'K9-RT-02', 325.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg') -INSERT INTO [Items] VALUES ('EST-26', 'K9-CW-01', 125.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog6.jpg') -INSERT INTO [Items] VALUES ('EST-27', 'K9-CW-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog6.jpg') -INSERT INTO [Items] VALUES ('EST-28', 'K9-RT-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog4.jpg') - -INSERT INTO [Inventories] VALUES ('EST-1', 10000) -INSERT INTO [Inventories] VALUES ('EST-2', 10000) -INSERT INTO [Inventories] VALUES ('EST-3', 10000) -INSERT INTO [Inventories] VALUES ('EST-4', 10000) -INSERT INTO [Inventories] VALUES ('EST-5', 10000) -INSERT INTO [Inventories] VALUES ('EST-6', 10000) -INSERT INTO [Inventories] VALUES ('EST-7', 10000) -INSERT INTO [Inventories] VALUES ('EST-8', 10000) -INSERT INTO [Inventories] VALUES ('EST-9', 10000) -INSERT INTO [Inventories] VALUES ('EST-10', 10000) -INSERT INTO [Inventories] VALUES ('EST-11', 10000) -INSERT INTO [Inventories] VALUES ('EST-12', 10000) -INSERT INTO [Inventories] VALUES ('EST-13', 10000) -INSERT INTO [Inventories] VALUES ('EST-14', 10000) -INSERT INTO [Inventories] VALUES ('EST-15', 10000) -INSERT INTO [Inventories] VALUES ('EST-16', 10000) -INSERT INTO [Inventories] VALUES ('EST-17', 10000) -INSERT INTO [Inventories] VALUES ('EST-18', 10000) -INSERT INTO [Inventories] VALUES ('EST-19', 10000) -INSERT INTO [Inventories] VALUES ('EST-20', 10000) -INSERT INTO [Inventories] VALUES ('EST-21', 10000) -INSERT INTO [Inventories] VALUES ('EST-22', 10000) -INSERT INTO [Inventories] VALUES ('EST-23', 10000) -INSERT INTO [Inventories] VALUES ('EST-24', 10000) -INSERT INTO [Inventories] VALUES ('EST-25', 10000) -INSERT INTO [Inventories] VALUES ('EST-26', 10000) -INSERT INTO [Inventories] VALUES ('EST-27', 10000) -INSERT INTO [Inventories] VALUES ('EST-28', 10000) - -INSERT INTO [Sequences] (Sequence_Name, Sequence_NextId) VALUES ('OrderNum', 0) \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/Schema.sql b/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/Schema.sql deleted file mode 100644 index 44d01ac..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Ddl/MSSQL/Schema.sql +++ /dev/null @@ -1,345 +0,0 @@ -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'NPetshop') - DROP DATABASE [NPetshop] -GO - -CREATE DATABASE [NPetshop] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'NPetshop', N'autoclose', N'true' -GO - -exec sp_dboption N'NPetshop', N'bulkcopy', N'false' -GO - -exec sp_dboption N'NPetshop', N'trunc. log', N'true' -GO - -exec sp_dboption N'NPetshop', N'torn page detection', N'true' -GO - -exec sp_dboption N'NPetshop', N'read only', N'false' -GO - -exec sp_dboption N'NPetshop', N'dbo use', N'false' -GO - -exec sp_dboption N'NPetshop', N'single', N'false' -GO - -exec sp_dboption N'NPetshop', N'autoshrink', N'true' -GO - -exec sp_dboption N'NPetshop', N'ANSI null default', N'false' -GO - -exec sp_dboption N'NPetshop', N'recursive triggers', N'false' -GO - -exec sp_dboption N'NPetshop', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'NPetshop', N'concat null yields null', N'false' -GO - -exec sp_dboption N'NPetshop', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'NPetshop', N'default to local cursor', N'false' -GO - -exec sp_dboption N'NPetshop', N'quoted identifier', N'false' -GO - -exec sp_dboption N'NPetshop', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'NPetshop', N'auto create statistics', N'true' -GO - -exec sp_dboption N'NPetshop', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'NPetshop', N'db chaining', N'false' -GO - -use [NPetshop] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Products_Categories]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Products] DROP CONSTRAINT FK_Products_Categories -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Inventories_Items]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Inventories] DROP CONSTRAINT FK_Inventories_Items -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Items_Products]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Items] DROP CONSTRAINT FK_Items_Products -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Items_Suppliers]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) -ALTER TABLE [dbo].[Items] DROP CONSTRAINT FK_Items_Suppliers -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Categories] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Inventories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Inventories] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Items]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Items] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Products]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Products] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Suppliers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Suppliers] -GO - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Sequences]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Sequences] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Categories] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [dbo].[Categories] ( - [Category_Id] [varchar] (10) NOT NULL , - [Category_Name] [varchar] (80) NULL , - [Category_Description] [varchar] (255) NULL -) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Categories] WITH NOCHECK ADD - CONSTRAINT [PK_Categories] PRIMARY KEY CLUSTERED - ( - [Category_Id] - ) ON [PRIMARY] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Products] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [dbo].[Products] ( - [Product_Id] [varchar] (10) NOT NULL , - [Category_Id] [varchar] (10) NOT NULL , - [Product_Name] [varchar] (80) NULL , - [Product_Description] [varchar] (255) NULL -) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Products] WITH NOCHECK ADD - CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED - ( - [Product_Id] - ) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Products] ADD - CONSTRAINT [FK_Products_Categories] FOREIGN KEY - ( - [Category_Id] - ) REFERENCES [dbo].[Categories] ( - [Category_Id] - ) -GO - --- -------------------------------------------------------------------------------------------------- --- CREATE TABLE [Suppliers] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Suppliers] ( - [Supplier_Id] int PRIMARY KEY, - [Supplier_Name] varchar(80) NULL, - [Supplier_Status] varchar(2) NOT NULL, - [Supplier_Addr1] varchar(80) NULL, - [Supplier_Addr2] varchar(80) NULL, - [Supplier_City] varchar(80) NULL, - [Supplier_State] varchar(80) NULL, - [Supplier_Zip] varchar(5) NULL, - [Supplier_Phone] varchar(40) NULL -) -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Items] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Items] ( - [Item_Id] varchar(10) PRIMARY KEY, - [Product_Id] varchar(10) NOT NULL REFERENCES [Products]([Product_Id]), - [Item_ListPrice] decimal(10, 2) NULL, - [Item_UnitCost] decimal(10, 2) NULL, - [Supplier_Id] int NULL REFERENCES [Suppliers]([Supplier_Id]), - [Item_Status] varchar(2) NULL, - [Item_Attr1] varchar(80) NULL, - [Item_Attr2] varchar(80) NULL, - [Item_Attr3] varchar(80) NULL, - [Item_Attr4] varchar(80) NULL, - [Item_Attr5] varchar(80) NULL, - [Item_Photo] varchar(80) NULL -) -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Inventories] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Inventories] ( - [Item_Id] [varchar] (10) NOT NULL REFERENCES Items([Item_Id]), - [Inventory_Quantity] [int] NOT NULL -) ON [PRIMARY] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Accounts] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Accounts] ( - [Account_Id] varchar(20) PRIMARY KEY, - [Account_Email] varchar(80) NOT NULL, - [Account_FirstName] varchar(80) NOT NULL, - [Account_LastName] varchar(80) NOT NULL, - [Account_Status] varchar(2) NULL, - [Account_Addr1] varchar(80) NOT NULL, - [Account_Addr2] varchar(80) NULL, - [Account_City] varchar(80) NOT NULL, - [Account_State] varchar(80) NOT NULL, - [Account_Zip] varchar(20) NOT NULL, - [Account_Country] varchar(20) NOT NULL, - [Account_Phone] varchar(20) NOT NULL -) - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Profiles] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [Profiles] ( - [Account_Id] varchar(20) PRIMARY KEY, - [Profile_LangPref] varchar(80) NOT NULL, - [Profile_FavCategory] varchar(10) NULL, - [Profile_MyListOpt] bit NULL, - [Profile_BannerOpt] bit NULL -) - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [SignsOn] --- -------------------------------------------------------------------------------------------------*/ - -CREATE TABLE [SignsOn] ( - [Account_Id] varchar(20) PRIMARY KEY, - [SignOn_Password] varchar(20) NOT NULL -) - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Orders] --- -------------------------------------------------------------------------------------------------*/ -CREATE TABLE [Orders] ( - [Order_Id] [int] NOT NULL , - [Account_ID] varchar(20) NOT NULL , - [Order_Date] datetime NOT NULL , - [Order_ShipToFirstName] varchar(80) NOT NULL , - [Order_ShipToLastName] varchar(80) NOT NULL , - [Order_ShipAddr1] varchar(80) NOT NULL , - [Order_ShipAddr2] varchar(80) NULL , - [Order_ShipCity] varchar(80) NOT NULL , - [Order_ShipState] varchar(80) NOT NULL , - [Order_ShipZip] varchar(20) NOT NULL , - [Order_ShipCountry] varchar(20) NOT NULL , - [Order_BillToFirstName] varchar(80) NOT NULL , - [Order_BillToLastName] varchar(80) NOT NULL , - [Order_BillAddr1] varchar(80) NOT NULL , - [Order_BillAddr2] varchar(80) NULL , - [Order_BillCity] varchar(80) NOT NULL , - [Order_BillState] varchar(80) NOT NULL , - [Order_BillZip] varchar(20) NOT NULL , - [Order_BillCountry] varchar(20) NOT NULL , - [Order_TotalPrice] decimal(10, 2) NOT NULL , - [Order_CreditCard] varchar(20) NOT NULL , - [Order_ExprDate] varchar(7) NOT NULL , - [Order_CardType] varchar(40) NOT NULL -) ON [PRIMARY] -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [LinesItem] --- ------------------------------------------------------------------------------------------------- -CREATE TABLE [LinesItem] ( - [Order_Id] int NOT NULL , - [LineItem_LineNum] int NOT NULL , - [Item_Id] varchar(10) NOT NULL , - [LineItem_Quantity] int NOT NULL , - [LineItem_UnitPrice] decimal(10, 2) NOT NULL -) ON [PRIMARY] -GO - -ALTER TABLE [LinesItem] WITH NOCHECK ADD - CONSTRAINT [PkLineItem] PRIMARY KEY CLUSTERED - ( - [Order_Id], - [LineItem_LineNum] - ) ON [PRIMARY] -GO - -ALTER TABLE [Orders] WITH NOCHECK ADD - PRIMARY KEY CLUSTERED - ( - [Order_Id] - ) ON [PRIMARY] -GO - -ALTER TABLE [LinesItem] ADD - FOREIGN KEY - ( - [Order_Id] - ) REFERENCES [Orders] ( - [Order_Id] - ), - CONSTRAINT [FK_LinesItem_Items] FOREIGN KEY - ( - [Item_Id] - ) REFERENCES [Items] ( - [Item_Id] - ) -GO - -ALTER TABLE [Orders] ADD - CONSTRAINT [FK_Orders_Accounts] FOREIGN KEY - ( - [Account_ID] - ) REFERENCES [Accounts] ( - [Account_Id] - ) -GO - -CREATE INDEX [IxItem] ON [Items]([Product_Id], [Item_Id], [Item_ListPrice], [Item_Attr1]) -GO - --- --------------------------------------------------------------------------------------------------- --- CREATE TABLE [Sequences] --- ------------------------------------------------------------------------------------------------- -CREATE TABLE [dbo].[Sequences] ( - [Sequence_Name] [varchar] (30) NOT NULL , - [Sequence_NextId] [int] NOT NULL -) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Sequences] WITH NOCHECK ADD - CONSTRAINT [PK_Sequences] PRIMARY KEY CLUSTERED - ( - [Sequence_Name] - ) ON [PRIMARY] -GO - -ALTER TABLE [dbo].[Sequences] ADD - CONSTRAINT [DF_Sequences_Sequence_NextId] DEFAULT (0) FOR [Sequence_NextId] -GO diff --git a/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DBUser.sql b/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DBUser.sql deleted file mode 100644 index 80bacf1..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DBUser.sql +++ /dev/null @@ -1,2 +0,0 @@ --- Create a new user, grant her rights, and set her password. -grant select, insert, update, delete ON npetshop.* TO npetshop@'localhost' IDENTIFIED BY 'ibatis' ; \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DataLoad.sql b/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DataLoad.sql deleted file mode 100644 index 2af9428..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/DataLoad.sql +++ /dev/null @@ -1,121 +0,0 @@ - -USE `npetshop`; - -# -# Dumping data for table `accounts` -# -INSERT INTO `accounts` (Account_Id, Account_Email, Account_FirstName, Account_LastName, Account_Status, Account_Addr1, Account_Addr2, Account_City, Account_State, Account_Zip, Account_Country, Account_Phone) VALUES ('w', 'w', 'w', 'w', '', 'w', 'w', 'w', 'New York', 'w', 'Canada', 'w'); - -# -# Dumping data for table `categories` -# -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('BIRDS', 'Birds', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('CATS', 'Cats', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('DOGS', 'Dogs', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('FISH', 'Fish', NULL); -INSERT INTO `categories` (Category_Id, Category_Name, Category_Description) VALUES ('REPTILES', 'Reptiles', NULL); - -# -# Dumping data for table `inventories` -# -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-1', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-2', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-3', 555); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-4', 9999); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-5', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-6', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-7', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-8', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-9', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-10', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-11', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-12', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-13', 9999); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-14', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-15', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-16', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-17', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-18', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-19', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-20', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-21', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-22', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-23', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-24', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-25', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-26', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-27', 10000); -INSERT INTO `inventories` (Item_Id, Inventory_Quantity) VALUES ('EST-28', 10000); - -# -# Dumping data for table `items` -# -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-1', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Large', NULL, NULL, NULL, NULL,'fish1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-2', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Small', NULL, NULL, NULL, NULL,'fish1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-3', 'FI-SW-02', 18.50, 12.00, 1, 'P', 'Toothless', NULL, NULL, NULL, NULL,'fish2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-4', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotted', NULL, NULL, NULL, NULL,'fish3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-5', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotless', NULL, NULL, NULL, NULL,'fish3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-6', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Male Adult', NULL, NULL, NULL, NULL,'dog1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-7', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Female Puppy', NULL, NULL, NULL, NULL,'dog1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-8', 'K9-PO-02', 18.50, 12.00, 1, 'P', 'Male Puppy', NULL, NULL, NULL, NULL,'dog2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-9', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotless Male Puppy', NULL, NULL, NULL, NULL,'dog3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-10', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotted Adult Female', NULL, NULL, NULL, NULL,'dog3.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-11', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Venomless', NULL, NULL, NULL, NULL,'reptile1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-12', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Rattleless', NULL, NULL, NULL, NULL,'reptile1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-13', 'RP-LI-02', 18.50, 12.00, 1, 'P', 'Green Adult', NULL, NULL, NULL, NULL,'reptile2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-14', 'FL-DSH-01', 58.50, 12.00, 1, 'P', 'Tailless', NULL, NULL, NULL, NULL,'cat1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-15', 'FL-DSH-01', 23.50, 12.00, 1, 'P', 'Tailed', NULL, NULL, NULL, NULL,'cat1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-16', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'cat2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-17', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'cat2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-18', 'AV-CB-01', 193.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird1.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-19', 'AV-SB-02', 15.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird2.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-20', 'FI-FW-02', 5.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'fish4.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-21', 'FI-FW-02', 5.29, 1.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'fish4.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-22', 'K9-RT-02', 135.50, 100.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-23', 'K9-RT-02', 145.49, 100.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-24', 'K9-RT-02', 255.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-25', 'K9-RT-02', 325.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-26', 'K9-CW-01', 125.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog6.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-27', 'K9-CW-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog6.jpg'); -INSERT INTO `items` (Item_Id, Product_Id, Item_ListPrice, Item_UnitCost, Supplier_Id, Item_Status, Item_Attr1, Item_Attr2, Item_Attr3, Item_Attr4, Item_Attr5, Item_Photo) VALUES ('EST-28', 'K9-RT-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog4.jpg'); - -# -# Dumping data for table `products` -# -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('AV-CB-01', 'BIRDS', 'Amazon Parrot', 'Great companion for up to 75 years'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('AV-SB-02', 'BIRDS', 'Finch', 'Great stress reliever'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-FW-01', 'FISH', 'Koi', 'Freshwater fish from Japan'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-FW-02', 'FISH', 'Goldfish', 'Freshwater fish from China'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-SW-01', 'FISH', 'Angelfish', 'Saltwater fish from Australia'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FI-SW-02', 'FISH', 'Tiger Shark', 'Saltwater fish from Australia'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FL-DLH-02', 'CATS', 'Persian', 'Friendly house cat, doubles as a princess'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('FL-DSH-01', 'CATS', 'Manx', 'Great for reducing mouse populations'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-BD-01', 'DOGS', 'Bulldog', 'Friendly dog from England'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-CW-01', 'DOGS', 'Chihuahua', 'Great companion dog'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-DL-01', 'DOGS', 'Dalmation', 'Great dog for a fire station'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-PO-02', 'DOGS', 'Poodle', 'Cute dog from France'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-RT-01', 'DOGS', 'Golden Retriever', 'Great family dog'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('K9-RT-02', 'DOGS', 'Labrador Retriever', 'Great hunting dog'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('RP-LI-02', 'REPTILES', 'Iguana', 'Friendly green friend'); -INSERT INTO `products` (Product_Id, Category_Id, Product_Name, Product_Description) VALUES ('RP-SN-01', 'REPTILES', 'Rattlesnake', 'Doubles as a watch dog'); - -# -# Dumping data for table `profiles` -# -INSERT INTO `profiles` (Account_Id, Profile_LangPref, Profile_FavCategory, Profile_MyListOpt, Profile_BannerOpt) VALUES ('w', 'Japanese', 'DOGS', 1, 1); - -# -# Dumping data for table `sequences` -# -INSERT INTO `sequences` (Sequence_Name, Sequence_NextId) VALUES ('OrderNum', 0); - -# -# Dumping data for table `signson` -# -INSERT INTO `signson` (Account_Id, SignOn_Password) VALUES ('ibatis', 'ibatis'); - -# -# Dumping data for table `suppliers` -# -INSERT INTO `suppliers` (Supplier_Id, Supplier_Name, Supplier_Status, Supplier_Addr1, Supplier_Addr2, Supplier_City, Supplier_State, Supplier_Zip, Supplier_Phone) VALUES (1, 'XYZ Pets', 'AC', '600 Avon Way', '', 'Los Angeles', 'CA', '94024', '212-947-0797'); -INSERT INTO `suppliers` (Supplier_Id, Supplier_Name, Supplier_Status, Supplier_Addr1, Supplier_Addr2, Supplier_City, Supplier_State, Supplier_Zip, Supplier_Phone) VALUES (2, 'ABC Pets', 'AC', '700 Abalone Way', '', 'San Francisco', 'CA', '94024', '415-947-0797'); diff --git a/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/Schema.sql b/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/Schema.sql deleted file mode 100644 index ae45401..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Ddl/MySql/Schema.sql +++ /dev/null @@ -1,156 +0,0 @@ -# MySQL dump -# -# Host: localhost Database: npetshop -# ------------------------------------------------------ - -#CREATE DATABASE `npetshop`; -USE `npetshop`; - -# -# Table structure for table `accounts` -# -CREATE TABLE `accounts` ( - `Account_Id` varchar(20) default NULL, - `Account_Email` varchar(80) default NULL, - `Account_FirstName` varchar(80) default NULL, - `Account_LastName` varchar(80) default NULL, - `Account_Status` char(2) default NULL, - `Account_Addr1` varchar(80) default NULL, - `Account_Addr2` varchar(80) default NULL, - `Account_City` varchar(80) default NULL, - `Account_State` varchar(80) default NULL, - `Account_Zip` varchar(20) default NULL, - `Account_Country` varchar(20) default NULL, - `Account_Phone` varchar(20) default NULL -) ; - -# -# Table structure for table `categories` -# -CREATE TABLE `categories` ( - `Category_Id` varchar(10) default NULL, - `Category_Name` varchar(80) default NULL, - `Category_Description` varchar(255) default NULL -) ; - -# -# Table structure for table `inventories` -# -CREATE TABLE `inventories` ( - `Item_Id` varchar(10) default NULL, - `Inventory_Quantity` int default NULL -) ; - -# -# Table structure for table `items` -# -CREATE TABLE `items` ( - `Item_Id` varchar(10) default NULL, - `Product_Id` varchar(10) default NULL, - `Item_ListPrice` decimal(10,2) default NULL, - `Item_UnitCost` decimal(10,2) default NULL, - `Supplier_Id` int default NULL, - `Item_Status` char(2) default NULL, - `Item_Attr1` varchar(80) default NULL, - `Item_Attr2` varchar(80) default NULL, - `Item_Attr3` varchar(80) default NULL, - `Item_Attr4` varchar(80) default NULL, - `Item_Attr5` varchar(80) default NULL, - `Item_Photo` varchar(80) default NULL -) ; - - -# -# Table structure for table `linesitem` -# -CREATE TABLE `linesitem` ( - `Order_Id` int default NULL, - `LineItem_LineNum` int default NULL, - `Item_Id` varchar(10) default NULL, - `LineItem_Quantity` int default NULL, - `LineItem_UnitPrice` decimal(10,2) default NULL -) ; - -# -# Table structure for table `orders` -# -CREATE TABLE `orders` ( - `Order_Id` int NOT NULL default '0', - `Account_ID` varchar(20) default NULL, - `Order_Date` date default NULL, - `Order_ShipToFirstName` varchar(80) default NULL, - `Order_ShipToLastName` varchar(80) default NULL, - `Order_ShipAddr1` varchar(80) default NULL, - `Order_ShipAddr2` varchar(80) default NULL, - `Order_ShipCity` varchar(80) default NULL, - `Order_ShipState` varchar(80) default NULL, - `Order_ShipZip` varchar(20) default NULL, - `Order_ShipCountry` varchar(20) default NULL, - `Order_BillToFirstName` varchar(80) default NULL, - `Order_BillToLastName` varchar(80) default NULL, - `Order_BillAddr1` varchar(80) default NULL, - `Order_BillAddr2` varchar(80) default NULL, - `Order_BillCity` varchar(80) default NULL, - `Order_BillState` varchar(80) default NULL, - `Order_BillZip` varchar(20) default NULL, - `Order_BillCountry` varchar(20) default NULL, - `Order_TotalPrice` decimal(10,2) default NULL, - `Order_CreditCard` varchar(20) default NULL, - `Order_ExprDate` varchar(7) default NULL, - `Order_CardType` varchar(40) default NULL, - PRIMARY KEY (`Order_Id`) -) ; - -# -# Table structure for table `products` -# -CREATE TABLE `products` ( - `Product_Id` varchar(10) default NULL, - `Category_Id` varchar(10) default NULL, - `Product_Name` varchar(80) default NULL, - `Product_Description` varchar(255) default NULL -) ; - -# -# Table structure for table `profiles` -# -CREATE TABLE `profiles` ( - `Account_Id` varchar(20) default NULL, - `Profile_LangPref` varchar(80) default NULL, - `Profile_FavCategory` varchar(10) default NULL, - `Profile_MyListOpt` bool default NULL, - `Profile_BannerOpt` bool default NULL -) ; - -# -# Table structure for table `sequences` -# -CREATE TABLE `sequences` ( - `Sequence_Name` varchar(30) default NULL, - `Sequence_NextId` int default NULL -) ; - - -# -# Table structure for table `signson` -# -CREATE TABLE `signson` ( - `Account_Id` varchar(20) default NULL, - `SignOn_Password` varchar(20) default NULL -) ; - -# -# Table structure for table `suppliers` -# -CREATE TABLE `suppliers` ( - `Supplier_Id` int default NULL, - `Supplier_Name` varchar(80) default NULL, - `Supplier_Status` char(2) default NULL, - `Supplier_Addr1` varchar(80) default NULL, - `Supplier_Addr2` varchar(80) default NULL, - `Supplier_City` varchar(80) default NULL, - `Supplier_State` varchar(80) default NULL, - `Supplier_Zip` varchar(5) default NULL, - `Supplier_Phone` varchar(40) default NULL -) ; - diff --git a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs b/Examples/npetshop2/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs deleted file mode 100644 index e90396e..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Accounts/IAccountDao.cs +++ /dev/null @@ -1,24 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Accounts; - -namespace NPetshop.Persistence.Interfaces.Accounts -{ - /// - /// Summary description for IAccountDao. - /// - public interface IAccountDao - { - Account GetAccount(string login); - - IList GetUsernameList(); - - Account GetAccount(string login, string password); - - void InsertAccount(Account account); - - void UpdateAccount(Account account); - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs b/Examples/npetshop2/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs deleted file mode 100644 index 4fe881f..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Billing/IOrderDao.cs +++ /dev/null @@ -1,22 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Catalog; -using NPetshop.Domain.Billing; -using IBatisNet.Common.Pagination; - -namespace NPetshop.Persistence.Interfaces.Billing -{ - /// - /// Summary description for IOrderDao. - /// - public interface IOrderDao - { - IPaginatedList GetOrdersByUsername(string userName); - - Order GetOrder(int orderId); - - void InsertOrder(Order order); - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs b/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs deleted file mode 100644 index 8b579d6..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/ICategoryDao.cs +++ /dev/null @@ -1,19 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Catalog; - -namespace NPetshop.Persistence.Interfaces.Catalog -{ - /// - /// Summary description for ICategoryDao. - /// - public interface ICategoryDao - { - IList GetCategoryList(); - - Category GetCategory(string categoryId); - - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs b/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs deleted file mode 100644 index 85a43c6..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IItemDao.cs +++ /dev/null @@ -1,24 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; -using NPetshop.Domain.Billing; -using IBatisNet.Common.Pagination; - -namespace NPetshop.Persistence.Interfaces.Catalog -{ - /// - /// Summary description for IItemDao. - /// - public interface IItemDao - { - void UpdateQuantity(Order order); - - bool IsItemInStock(string itemId); - - IPaginatedList GetItemListByProduct(string productId); - - Item GetItem(string itemId); - - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs b/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs deleted file mode 100644 index 67f5081..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Interfaces/Catalog/IProductDao.cs +++ /dev/null @@ -1,20 +0,0 @@ - -using System; - -using NPetshop.Domain.Catalog; -using IBatisNet.Common.Pagination; - -namespace NPetshop.Persistence.Interfaces.Catalog -{ - /// - /// Summary description for IProductDao. - /// - public interface IProductDao - { - IPaginatedList GetProductListByCategory(string categoryId); - - Product GetProduct(string productId); - - IPaginatedList SearchProductList(string keywords); - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/Interfaces/ISequenceDao.cs b/Examples/npetshop2/NPetshop.Persistence/Interfaces/ISequenceDao.cs deleted file mode 100644 index 06685bd..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Interfaces/ISequenceDao.cs +++ /dev/null @@ -1,14 +0,0 @@ - -using System; - - -namespace NPetshop.Persistence.Interfaces -{ - /// - /// Summary description for ISequenceDao. - /// - public interface ISequenceDao - { - int GetNextId(string name); - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs deleted file mode 100644 index 26d18f9..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Accounts/AccountSqlMapDao.cs +++ /dev/null @@ -1,56 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Accounts; -using NPetshop.Persistence.Interfaces.Accounts; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Accounts -{ - /// - /// Summary description for AccountSqlMapDao - /// - public class AccountSqlMapDao : BaseSqlMapDao, IAccountDao - { - #region IAccountDao Members - - public Account GetAccount(string login) - { - return (ExecuteQueryForObject("GetAccountByUsername", login) as Account); - } - - public IList GetUsernameList() - { - return ExecuteQueryForList("GetUsernameList", null); - } - - public Account GetAccount(string login, string password) - { - Account account = new Account(); - account.Login = login; - account.Password = password; - return (ExecuteQueryForObject("GetAccountByLoginAndPassword", account) as Account); - } - - public void InsertAccount(Account account) - { - ExecuteInsert("InsertAccount", account); - ExecuteInsert("InsertProfile", account); - ExecuteInsert("InsertSignon", account); - } - - public void UpdateAccount(Account account) - { - ExecuteUpdate("UpdateAccount", account); - ExecuteUpdate("UpdateProfile", account); - - if (account.Password.Length > 0) - { - ExecuteUpdate("UpdateSignon", account); - } - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs deleted file mode 100644 index de5096f..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/BaseSqlMapDao.cs +++ /dev/null @@ -1,162 +0,0 @@ - - -using System; -using System.Collections; -using IBatisNet.Common.Pagination; -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.DaoSessionHandlers; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; -using IBatisNet.DataMapper; - -namespace NPetshop.Persistence.MapperDao -{ - /// - /// Summary description for BaseSqlMapDao. - /// - public class BaseSqlMapDao : IDao - { - protected const int PAGE_SIZE = 4; - - /// - /// Looks up the parent DaoManager, gets the local transaction - /// (which should be a SqlMapDaoTransaction) and returns the - /// SqlMap associated with this DAO. - /// - /// The SqlMap instance for this DAO. - protected SqlMapper GetLocalSqlMap() - { - DaoManager daoManager = DaoManager.GetInstance(this); - SqlMapDaoSession sqlMapDaoSession = (SqlMapDaoSession)daoManager.LocalDaoSession; - - return sqlMapDaoSession.SqlMap; - } - - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected IList ExecuteQueryForList(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - try - { - return sqlMap.QueryForList(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for list. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - /// - /// - protected IList ExecuteQueryForList(string statementName, object parameterObject, int skipResults, int maxResults) - { - SqlMapper sqlMap = GetLocalSqlMap(); - try - { - return sqlMap.QueryForList(statementName, parameterObject, skipResults, maxResults); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for list. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - /// - protected IPaginatedList ExecuteQueryForPaginatedList(string statementName, object parameterObject, int pageSize) - { - SqlMapper sqlMap = GetLocalSqlMap(); - try - { - return sqlMap.QueryForPaginatedList(statementName, parameterObject, pageSize); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for paginated list. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected object ExecuteQueryForObject(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - - try - { - return sqlMap.QueryForObject(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for object. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected int ExecuteUpdate(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - - try - { - return sqlMap.Update(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for update. Cause: " + e.Message, e); - } - } - - /// - /// Simple convenience method to wrap the SqlMap method of the same name. - /// Wraps the exception with a DataAccessException to isolate the SqlMap framework. - /// - /// - /// - /// - protected object ExecuteInsert(string statementName, object parameterObject) - { - SqlMapper sqlMap = GetLocalSqlMap(); - - try - { - return sqlMap.Insert(statementName, parameterObject); - } - catch (Exception e) - { - throw new DataAccessException("Error executing query '"+statementName+"' for insert. Cause: " + e.Message, e); - } - } - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs deleted file mode 100644 index 8137351..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/OrderSqlMapDao.cs +++ /dev/null @@ -1,44 +0,0 @@ - -using System; - -using IBatisNet.Common.Pagination; - -using NPetshop.Domain.Billing; -using NPetshop.Persistence.MapperDao; -using NPetshop.Persistence.Interfaces.Billing; - -namespace NPetshop.Persistence.MapperDao.Billing.MSSQL -{ - /// - /// Summary description for OrderSqlMapDao. - /// - public class OrderSqlMapDao : BaseSqlMapDao, IOrderDao - { - #region IOrderDao Members - - public IPaginatedList GetOrdersByUsername(string userName) - { - return ExecuteQueryForPaginatedList("GetOrdersByUsername", userName, 10); - } - - public Order GetOrder(int orderId) - { - Order order = null; - order = ExecuteQueryForObject("GetOrder", orderId) as Order; - order.LineItems = ExecuteQueryForList("GetLineItemsByOrderId", order.Id); - return order; - } - - public void InsertOrder(Order order) - { - ExecuteInsert("InsertOrder", order); - foreach(LineItem lineItem in order.LineItems) - { - lineItem.Order = order; - ExecuteInsert("InsertLineItem", lineItem); - } - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs deleted file mode 100644 index fd7d87c..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/MSSQL/SequenceSqlMapDao.cs +++ /dev/null @@ -1,35 +0,0 @@ - -using System; - -using NPetshop.Domain; -using NPetshop.Persistence.Interfaces; -using IBatisNet.DataMapper.Exceptions; - -namespace NPetshop.Persistence.MapperDao.Billing.MSSQL -{ - /// - /// Summary description for SequenceSqlMapDao. - /// - public class SequenceSqlMapDao : BaseSqlMapDao, ISequenceDao - { - - #region ISequenceDao Members - - /// - /// This is a generic sequence ID generator that is based on a database - /// table called 'SEQUENCE', which contains two columns (NAME, NEXTID). - /// - /// name The name of the sequence. - /// The Next ID - /// - /// Dummy version for SQL Server. Actual orderId - /// won't be known until we acutlaly insert! - /// - public int GetNextId(string name) - { - return -1; - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs deleted file mode 100644 index 0ce6467..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Billing/OrderSqlMapDao.cs +++ /dev/null @@ -1,44 +0,0 @@ - -using System; - -using IBatisNet.Common.Pagination; - -using NPetshop.Domain.Billing; -using NPetshop.Persistence.MapperDao; -using NPetshop.Persistence.Interfaces.Billing; - -namespace NPetshop.Persistence.MapperDao.Billing -{ - /// - /// Summary description for OrderSqlMapDao. - /// - public class OrderSqlMapDao : BaseSqlMapDao, IOrderDao - { - #region IOrderDao Members - - public IPaginatedList GetOrdersByUsername(string userName) - { - return ExecuteQueryForPaginatedList("GetOrdersByUsername", userName, 10); - } - - public Order GetOrder(int orderId) - { - Order order = null; - order = ExecuteQueryForObject("GetOrder", orderId) as Order; - order.LineItems = ExecuteQueryForList("GetLineItemsByOrderId", order.Id); - return order; - } - - public void InsertOrder(Order order) - { - ExecuteInsert("InsertOrder", order); - foreach(LineItem lineItem in order.LineItems) - { - lineItem.Order = order; - ExecuteInsert("InsertLineItem", lineItem); - } - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs deleted file mode 100644 index c979b5a..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/CategorySqlMapDao.cs +++ /dev/null @@ -1,31 +0,0 @@ - -using System; -using System.Collections; - -using NPetshop.Domain.Catalog; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Catalog -{ - /// - /// Summary description for CategorySqlMapDao. - /// - public class CategorySqlMapDao : BaseSqlMapDao, ICategoryDao - { - - #region ICategoryDao Members - - public IList GetCategoryList() - { - return ExecuteQueryForList("GetCategoryList", null); - } - - public Category GetCategory(string categoryId) - { - return (Category) ExecuteQueryForObject("GetCategory", categoryId); - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs deleted file mode 100644 index 6284e13..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ItemSqlMapDao.cs +++ /dev/null @@ -1,58 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; - -using NPetshop.Domain.Catalog; -using NPetshop.Domain.Billing; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Catalog -{ - /// - /// Summary description for ItemSqlMapDao. - /// - public class ItemSqlMapDao : BaseSqlMapDao, IItemDao - { - #region IItemDao Members - - public void UpdateQuantity(Order order) - { - foreach(LineItem lineItem in order.LineItems) - { - string itemId = lineItem.Item.Id; - int increment = lineItem.Quantity; - - Hashtable param = new Hashtable(); - param.Add("ItemId", itemId); - param.Add("Increment", increment); - - ExecuteUpdate("UpdateInventoryQuantity", param); - } - } - - public bool IsItemInStock(string itemId) - { - int i = (int)ExecuteQueryForObject("GetInventoryQuantity", itemId); - return (i > 0); - } - - public IPaginatedList GetItemListByProduct(string productId) - { - return ExecuteQueryForPaginatedList("GetItemListByProduct", productId, PAGE_SIZE); - } - - public Item GetItem(string itemId) - { - int inventoryQuantity = (int) ExecuteQueryForObject("GetInventoryQuantity", itemId); - Item item = (Item) ExecuteQueryForObject("GetItem", itemId); - item.Quantity = inventoryQuantity; - return item; - } - - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs deleted file mode 100644 index fff5911..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/Catalog/ProductSqlMapDao.cs +++ /dev/null @@ -1,71 +0,0 @@ - -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; -using IBatisNet.Common.Utilities; - -using NPetshop.Domain.Catalog; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Persistence.MapperDao; - -namespace NPetshop.Persistence.MapperDao.Catalog -{ - /// - /// Summary description for ProductSqlMapDao. - /// - public class ProductSqlMapDao : BaseSqlMapDao, IProductDao - { - - #region IProductDao Members - - public IPaginatedList GetProductListByCategory(string categoryId) - { - return ExecuteQueryForPaginatedList("GetProductListByCategory", categoryId, PAGE_SIZE); - } - - public Product GetProduct(string productId) - { - return (ExecuteQueryForObject("GetProduct", productId) as Product); - } - - public IPaginatedList SearchProductList(string keywords) - { - object parameterObject = new ProductSearch(keywords); - return ExecuteQueryForPaginatedList("SearchProductList", parameterObject, PAGE_SIZE); - } - - #endregion - - #region Inner Classes - - public class ProductSearch - { - private IList keywordList = new ArrayList(); - - public ProductSearch(String keywords) - { - StringTokenizer splitter = new StringTokenizer(keywords, " ", false); - string token = null; - - IEnumerator enumerator = splitter.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - keywordList.Add("%" + token + "%"); - } - } - - public IList KeywordList - { - get - { - return keywordList; - } - } - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs b/Examples/npetshop2/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs deleted file mode 100644 index 690e51b..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/MapperDao/SequenceSqlMapDao.cs +++ /dev/null @@ -1,41 +0,0 @@ - -using System; - -using NPetshop.Domain; -using NPetshop.Persistence.Interfaces; -using IBatisNet.DataMapper.Exceptions; - -namespace NPetshop.Persistence.MapperDao -{ - /// - /// Summary description for SequenceSqlMapDao. - /// - public class SequenceSqlMapDao : BaseSqlMapDao, ISequenceDao - { - - #region ISequenceDao Members - - /// - /// This is a generic sequence ID generator that is based on a database - /// table called 'SEQUENCE', which contains two columns (NAME, NEXTID). - /// - /// name The name of the sequence. - /// The Next ID - public int GetNextId(string name) - { - Sequence sequence = new Sequence(name, -1); - - sequence = ExecuteQueryForObject("GetSequence", sequence) as Sequence; - if (sequence == null) - { - throw new DataMapperException("Error: A null sequence was returned from the database (could not get next " + name + " sequence)."); - } - object parameterObject = new Sequence(name, sequence.NextId + 1); - ExecuteUpdate("UpdateSequence", parameterObject); - - return sequence.NextId; - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Persistence/Maps/Account.xml b/Examples/npetshop2/NPetshop.Persistence/Maps/Account.xml deleted file mode 100644 index c2e7596..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Maps/Account.xml +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - ( Account_Email, Account_FirstName, Account_LastName, - Account_Status, Account_Addr1, Account_Addr2, Account_City, Account_State, Account_Zip, - Account_Country, Account_Phone, Account_Id) - values - ( #Email#, #Address.FirstName#, #Address.LastName#, - #Status#, #Address.Address1#, #Address.Address2#, #Address.City#, #Address.State#, - #Address.Zip#, #Address.Country#, #Address.Phone#, #Login#) - - - update Accounts - set Account_Email = #Email#, - Account_FirstName = #Address.FirstName#, - Account_LastName = #Address.LastName#, - Account_Status = #Status#, - Account_Addr1 = #Address.Address1#, - Account_Addr2 = #Address.Address2#, - Account_City = #Address.City#, - Account_State = #Address.State#, - Account_Zip = #Address.Zip#, - Account_Country = #Address.Country#, - Account_Phone = #Address.Phone# - where Account_Id = #Login# - - - - - insert into Profiles - (Profile_LangPref, Profile_FavCategory, Profile_MyListOpt, Profile_BannerOpt, Account_Id) - values - (#Profile.FavoriteLanguage#, #Profile.FavouriteCategory.Id#, #Profile.IsShowFavorites#, #Profile.IsShowBanners#, #Login#) - - - update Profiles - set Profile_LangPref = #Profile.FavoriteLanguage#, - Profile_FavCategory = #Profile.FavouriteCategory.Id#, - Profile_MyListOpt = #Profile.IsShowFavorites#, - Profile_BannerOpt = #Profile.IsShowBanners# - where Account_Id = #Login# - - - insert into SignsOn - (SignOn_Password, Account_Id) - values - (#Password#, #Login#) - - - update SignsOn set SignOn_Password = #Password# where Account_Id = #Login# - - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/Maps/Category.xml b/Examples/npetshop2/NPetshop.Persistence/Maps/Category.xml deleted file mode 100644 index 1b0f5a9..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Maps/Category.xml +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/Maps/Item.xml b/Examples/npetshop2/NPetshop.Persistence/Maps/Item.xml deleted file mode 100644 index 052bbd4..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Maps/Item.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - update Inventories - set Inventory_Quantity = Inventory_Quantity - #Increment# - where Item_ID = #ItemId# - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/Maps/LineItem.xml b/Examples/npetshop2/NPetshop.Persistence/Maps/LineItem.xml deleted file mode 100644 index a19d3ac..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Maps/LineItem.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - Insert Into LinesItem - (Order_Id, LineItem_LineNum, Item_Id, LineItem_Quantity, LineItem_UnitPrice) - Values - (#Order.Id#, #LineNumber#, #Item.Id#, #Quantity#, #Item.ListPrice#) - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/Maps/Order.xml b/Examples/npetshop2/NPetshop.Persistence/Maps/Order.xml deleted file mode 100644 index 20f92b3..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Maps/Order.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - Insert Into Orders - (Order_ID,Account_ID, Order_Date, - Order_ShipToFirstName, Order_ShipToLastName, Order_ShipAddr1, Order_ShipAddr2, - Order_ShipCity, Order_ShipState, Order_ShipZip, Order_ShipCountry, - Order_BillToFirstName, Order_BillToLastName, Order_BillAddr1, Order_BillAddr2, - Order_BillCity, Order_BillState, Order_BillZip, Order_BillCountry, - Order_TotalPrice, - Order_CreditCard, Order_ExprDate, Order_CardType) - Values - (#Id#,#Account.Login#, #OrderDate#, - #ShippingAddress.FirstName#, #ShippingAddress.LastName#, #ShippingAddress.Address1#, #ShippingAddress.Address2#, - #ShippingAddress.City#, #ShippingAddress.State#, #ShippingAddress.Zip#, #ShippingAddress.Country#, - #BillingAddress.FirstName#, #BillingAddress.LastName#, #BillingAddress.Address1#, #BillingAddress.Address2#, - #BillingAddress.City#, #BillingAddress.State#, #BillingAddress.Zip#, #BillingAddress.Country#, - #TotalPrice#, - #CreditCard.CardNumber#, #CreditCard.CardExpiration#, #CreditCard.CardType#) - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/Maps/Product.xml b/Examples/npetshop2/NPetshop.Persistence/Maps/Product.xml deleted file mode 100644 index e5c276c..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Maps/Product.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/Maps/Sequence.xml b/Examples/npetshop2/NPetshop.Persistence/Maps/Sequence.xml deleted file mode 100644 index d4454e7..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/Maps/Sequence.xml +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - update Sequences - set Sequence_NextId = #NextId# where Sequence_Name = #Name# - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj b/Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj deleted file mode 100644 index d697904..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj +++ /dev/null @@ -1,254 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj.user b/Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj.user deleted file mode 100644 index ec0724f..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/NPetshop.Persistence.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/SqlMap.config b/Examples/npetshop2/NPetshop.Persistence/SqlMap.config deleted file mode 100644 index 5733007..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/SqlMap.config +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/dao.config b/Examples/npetshop2/NPetshop.Persistence/dao.config deleted file mode 100644 index b427be5..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/dao.config +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Persistence/providers.config b/Examples/npetshop2/NPetshop.Persistence/providers.config deleted file mode 100644 index 6f2e118..0000000 --- a/Examples/npetshop2/NPetshop.Persistence/providers.config +++ /dev/null @@ -1,233 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Presentation/AccountController.cs b/Examples/npetshop2/NPetshop.Presentation/AccountController.cs deleted file mode 100644 index 0065698..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/AccountController.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using NPetshop.Domain.Accounts; -using NPetshop.Domain.Shopping; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for AccountController. - /// - public class AccountController : NPetshopController - { - private IAccountService _accountService =null; - private IShoppingService _shoppingService = null; - private Account _account =null; - - public Account Account - { - get { return _account; } - set { _account = value; } - } - - public AccountController( - IAccountService accountService, - IShoppingService shoppingService) - { - _accountService = accountService; - _shoppingService = shoppingService; - _account = new Account(); - } - - private void CreateUserEnvironment() - { - this.NState.CurrentUser = _account; - this.NState.CurrentShoppingCart = new ShoppingCart(); - this.NState.CurrentOrder = null; - this.NState.Command = "goHome"; - this.Navigate(); - } - - public void CreateNewAccount() - { - _accountService.InsertAccount(this.Account); - CreateUserEnvironment(); - } - - public void UpdateAccount() - { - _accountService.UpdateAccount(this.Account); - this.NState.CurrentUser = this.Account; - this.State.Command = "goHome"; - this.Navigate(); - } - - public void EditAccount() - { - if (this.NState.CurrentUser != null) - { - this.NState.Command = "editAccount"; - } - else - { - this.NState.Command = "register"; - } - this.Navigate(); - } - - public void CancelEdition() - { - this.Navigate(); - } - - public void SignIn() - { - this.Navigate(); - } - - public void RegisterUser() - { - this.Navigate(); - } - - public void SignOut() - { - this.NState.CurrentUser = null; - this.NState.CurrentShoppingCart = null; - this.Navigate(); - } - - public bool TryToAuthenticate() - { - _account = _accountService.GetAccount(this.Account.Login, this.Account.Password); - - if (this.Account!=null) - { - //myList = catalogService.getProductListByCategory(account.getFavouriteCategoryId()); - CreateUserEnvironment(); - return true; - } - else - { - return false; - } - } - } -} diff --git a/Examples/npetshop2/NPetshop.Presentation/AssemblyInfo.cs b/Examples/npetshop2/NPetshop.Presentation/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop2/NPetshop.Presentation/BillingController.cs b/Examples/npetshop2/NPetshop.Presentation/BillingController.cs deleted file mode 100644 index 9be6445..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/BillingController.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using NPetshop.Domain.Shopping; -using NPetshop.Service.Interfaces; - -using NPetshop.Domain.Accounts; -using NPetshop.Domain.Billing; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for BillingController. - /// - public class BillingController : NPetshopController - { - private IBillingService _billingService = null; - - public BillingController(IBillingService billingService) - { - _billingService = billingService; - } - - public void NewOrder(Order order, bool shipToBillinAddress) - { - this.NState.CurrentOrder = order; - if (shipToBillinAddress) - { - order.ShippingAddress = order.BillingAddress; - this.NState.Command = "confirm"; - } - else - { - this.NState.Command = "ship"; - } - this.Navigate(); - } - - public void SubmitShippingAddress(Address address) - { - this.NState.CurrentOrder.ShippingAddress = address; - this.Navigate(); - } - - public void CancelShippingAddress() - { - this.Navigate(); - } - - public void ConfirmOrder(Order order) - { - // save the order - _billingService.InsertOrder(order); - this.NState.CurrentShoppingCart = new ShoppingCart(); - this.Navigate(); - } - } -} diff --git a/Examples/npetshop2/NPetshop.Presentation/CatalogController.cs b/Examples/npetshop2/NPetshop.Presentation/CatalogController.cs deleted file mode 100644 index c9aec1b..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/CatalogController.cs +++ /dev/null @@ -1,53 +0,0 @@ -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Catalog; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for CatalogController. - /// - public class CatalogController : NPetshopController - { - private ICatalogService _catalogService = null; - - public CatalogController(ICatalogService catalogService) - { - _catalogService = catalogService; - } - - public void ShowProductsByCategory(string categoryId) - { - IPaginatedList productList = _catalogService.GetProductListByCategory(categoryId); - - this.NState.CurrentList = productList; - this.Navigate(); - } - - public void ShowItemsByProduct(string productId) - { - Product product = _catalogService.GetProduct(productId); - IPaginatedList itemList = _catalogService.GetItemListByProduct(product); - - this.NState.CurrentList = itemList; - this.Navigate(); - } - - public void ShowItem(string itemId) - { - Item item = _catalogService.GetItem(itemId); - this.NState.CurrentObject = item; - this.Navigate(); - } - - public void SearchProducts(string keywords) - { - IPaginatedList productList = null; - - productList = _catalogService.SearchProductList(keywords.ToLower()); - this.NState.CurrentList = productList; - this.NState.CurrentObject = keywords; - this.Navigate(); - } - } -} diff --git a/Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj b/Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj deleted file mode 100644 index 81d3aee..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj +++ /dev/null @@ -1,180 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj.user b/Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj.user deleted file mode 100644 index 7a073da..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/NPetshop.Presentation.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Presentation/NPetshopContainer.cs b/Examples/npetshop2/NPetshop.Presentation/NPetshopContainer.cs deleted file mode 100644 index cfec686..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/NPetshopContainer.cs +++ /dev/null @@ -1,88 +0,0 @@ - - -using System; -using System.Configuration; -using Castle.Facilities.TypedFactory; -using Castle.MVC.Navigation; -using Castle.MVC.StatePersister; -using Castle.MVC.States; -using Castle.MVC.Views; -using Castle.Windsor; -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Configuration; -using NPetshop.Service.Impl; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for NPetshopContainer. - /// - public class NPetshopContainer : WindsorContainer - { - public NPetshopContainer(): base() - { - TypedFactoryFacility facility = new TypedFactoryFacility(); - AddFacility("typedfactory", facility ); - facility.AddTypedFactoryEntry( - new FactoryEntry("stateFactory", typeof(IStateFactory), "Create", "Release") ); - - // Add DaoManager - bool test = Convert.ToBoolean(ConfigurationSettings.AppSettings["test"]); - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); - if (test) - { - builder.Configure(@"..\..\..\NPetshop.Persistence\dao.config"); - } - else - { - builder.Configure(@"..\NPetshop.Persistence\dao.config"); - } - this.Kernel.AddComponentInstance("DaoManager", typeof(DaoManager), DaoManager.GetInstance("SqlMapDao") ); - - // Add services - AddServices(); - // Add Controllers - AddControllers(); - AddMVC(test); - } - - private void AddServices() - { - AddComponent( "AccountService", typeof(IAccountService), typeof(AccountService)); - AddComponent( "BillingService", typeof(IBillingService), typeof(BillingService)); - AddComponent( "CatalogService", typeof(ICatalogService), typeof(CatalogService)); - AddComponent( "ShoppingService", typeof(IShoppingService), typeof(ShoppingService)); - } - - private void AddMVC(bool test) - { - if (test) - { - AddComponent( "statePersister", typeof(IStatePersister), typeof(MemoryStatePersister)); - } - else - { - AddComponent( "statePersister", typeof(IStatePersister), typeof(SessionPersister)); - } - AddComponent( "state", typeof(IState), typeof(NPetshopState)); - if (test) - { - AddComponent( "viewManager", typeof(IViewManager), typeof(MockViewManager)); - } - else - { - AddComponent( "viewManager", typeof(IViewManager), typeof(XmlWebViewManager)); - } - AddComponent( "navigator", typeof(INavigator), typeof(DefaultNavigator)); - } - - private void AddControllers() - { - AddComponent( "AccountController", typeof(AccountController) ); - AddComponent( "BillingController", typeof(BillingController) ); - AddComponent( "CatalogController", typeof(CatalogController) ); - AddComponent( "ShoppingController", typeof(ShoppingController) ); - } - } -} diff --git a/Examples/npetshop2/NPetshop.Presentation/NPetshopController.cs b/Examples/npetshop2/NPetshop.Presentation/NPetshopController.cs deleted file mode 100644 index 6820327..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/NPetshopController.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Castle.MVC.Controllers; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for NPetshopControleur. - /// - public abstract class NPetshopController: Controller - { - /// - /// Get user context. - /// - public NPetshopState NState - { - get - { - return this.State as NPetshopState; - } - } - } -} diff --git a/Examples/npetshop2/NPetshop.Presentation/NPetshopState.cs b/Examples/npetshop2/NPetshop.Presentation/NPetshopState.cs deleted file mode 100644 index 488845d..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/NPetshopState.cs +++ /dev/null @@ -1,53 +0,0 @@ -using System; - -using Castle.MVC.States; - -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Accounts; -using NPetshop.Domain.Shopping; -using NPetshop.Domain.Billing; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for NPetshopState. - /// - public class NPetshopState: BaseState - { - private const string SESSSION_ACCOUNT_KEY = "_SESSSION_ACCOUNT_KEY_"; - private const string CART_SESSION_KEY = "_CART_SESSION_KEY_"; - private const string ORDER_SESSION_KEY = "_ORDER_SESSION_KEY_"; - private const string LIST_SESSION_KEY = "_LIST_SESSION_KEY_"; - private const string OBJECT_SESSION_KEY = "_OBJECT_SESSION_KEY_"; - - public Account CurrentUser - { - get { return this[SESSSION_ACCOUNT_KEY] as Account; } - set { this[SESSSION_ACCOUNT_KEY] = value; } - } - - public ShoppingCart CurrentShoppingCart - { - get { return this[CART_SESSION_KEY] as ShoppingCart; } - set { this[CART_SESSION_KEY] = value; } - } - - public Order CurrentOrder - { - get { return this[ORDER_SESSION_KEY] as Order; } - set { this[ORDER_SESSION_KEY] = value; } - } - - public IPaginatedList CurrentList - { - get { return this[LIST_SESSION_KEY] as IPaginatedList; } - set { this[LIST_SESSION_KEY] = value; } - } - - public object CurrentObject - { - get { return this[OBJECT_SESSION_KEY]; } - set { this[OBJECT_SESSION_KEY] = value; } - } - } -} diff --git a/Examples/npetshop2/NPetshop.Presentation/ShoppingController.cs b/Examples/npetshop2/NPetshop.Presentation/ShoppingController.cs deleted file mode 100644 index 277240b..0000000 --- a/Examples/npetshop2/NPetshop.Presentation/ShoppingController.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using NPetshop.Domain.Shopping; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Presentation -{ - /// - /// Summary description for ShoppingController. - /// - public class ShoppingController : NPetshopController - { - private ICatalogService _catalogService = null; - - public ShoppingController(ICatalogService catalogService) - { - _catalogService = catalogService; - } - - public void AddItemToCart(string itemId) - { - if (this.NState.CurrentShoppingCart != null) - { - this.NState.CurrentShoppingCart.Add(_catalogService.GetItem(itemId)); - } - else - { - this.NState.Command = "signIn"; - } - this.Navigate(); - } - - public void RemoveItemFromCart(string itemId) - { - if (this.NState.CurrentShoppingCart != null) - { - this.NState.CurrentShoppingCart.RemoveLine(_catalogService.GetItem(itemId)); - this.NState.Command = "showCart"; - } - else - { - this.NState.Command = "signIn"; - } - this.Navigate(); - } - - public void ShowShoppingCart() - { - if (this.NState.CurrentShoppingCart != null) - { - this.NState.Command = "showCart"; - } - else - { - this.NState.Command = "signIn"; - } - this.Navigate(); - } - - public void UpdateQuantityByItemId(string itemId, int quantity) - { - ShoppingCartLine cartLine = this.NState.CurrentShoppingCart.FindLine(_catalogService.GetItem(itemId)); - cartLine.Quantity = quantity; - this.NState.Save(); - } - - public void ProceedCheckout() - { - this.Navigate(); - } - - public void ContinueCheckout() - { - this.Navigate(); - } - } -} diff --git a/Examples/npetshop2/NPetshop.Service/AssemblyInfo.cs b/Examples/npetshop2/NPetshop.Service/AssemblyInfo.cs deleted file mode 100644 index 9f89a32..0000000 --- a/Examples/npetshop2/NPetshop.Service/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop2/NPetshop.Service/Impl/AccountService.cs b/Examples/npetshop2/NPetshop.Service/Impl/AccountService.cs deleted file mode 100644 index 26cf1f4..0000000 --- a/Examples/npetshop2/NPetshop.Service/Impl/AccountService.cs +++ /dev/null @@ -1,88 +0,0 @@ - - -using System.Collections; - -using IBatisNet.DataAccess; - -using NPetshop.Domain.Accounts; -using NPetshop.Persistence.Interfaces.Accounts; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Service.Impl -{ - /// - /// Summary description for AccountService. - /// - public class AccountService : IAccountService - { - #region Private Fields - private IAccountDao _accountDao = null; - private DaoManager _daoManager = null; - #endregion - - #region Constructor - public AccountService(DaoManager daoManager) - { - _daoManager = daoManager; - _accountDao = _daoManager.GetDao( typeof(IAccountDao) ) as IAccountDao; - } - #endregion - - #region Public methods - - public Account GetAccount(string username) - { - Account account = null; - - account = _accountDao.GetAccount(username); - - return account; - } - - public Account GetAccount(string login, string password) - { - Account account = null; - - account = _accountDao.GetAccount(login, password); - - return account; - } - - public void InsertAccount(Account account) - { - _daoManager.BeginTransaction(); - try - { - _accountDao.InsertAccount(account); - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - } - - public void UpdateAccount(Account account) - { - _daoManager.BeginTransaction(); - try - { - _accountDao.UpdateAccount(account); - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - } - - public IList GetUsernameList() - { - return _accountDao.GetUsernameList(); - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Service/Impl/BillingService.cs b/Examples/npetshop2/NPetshop.Service/Impl/BillingService.cs deleted file mode 100644 index 417cffe..0000000 --- a/Examples/npetshop2/NPetshop.Service/Impl/BillingService.cs +++ /dev/null @@ -1,91 +0,0 @@ - - -using IBatisNet.Common.Pagination; -using IBatisNet.DataAccess; -using NPetshop.Domain.Billing; -using NPetshop.Persistence.Interfaces; -using NPetshop.Persistence.Interfaces.Billing; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Service.Impl -{ - /// - /// Summary description for OrderService. - /// - public class BillingService : IBillingService - { - #region Private Fields - private DaoManager _daoManager = null; - private IOrderDao _orderDao = null; - private IItemDao _itemDao = null; - private ISequenceDao _sequenceDao = null; - #endregion - - #region Constructor - public BillingService(DaoManager daoManager) - { - _daoManager = daoManager; - _itemDao = _daoManager[typeof(IItemDao)] as IItemDao; - _orderDao = _daoManager[typeof(IOrderDao)] as IOrderDao; - _sequenceDao = _daoManager[typeof(ISequenceDao)] as ISequenceDao; - - } - #endregion - - #region Public methods - - - #region Order - - public void InsertOrder(Order order) - { - // Get the next id within a separate transaction - order.Id = GetNextId("OrderNum"); - - _daoManager.BeginTransaction(); - try - { - _itemDao.UpdateQuantity(order); - _orderDao.InsertOrder(order); - - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - } - - public IPaginatedList GetOrdersByUsername(string userName) - { - return _orderDao.GetOrdersByUsername(userName); - } - - #endregion - - #region Sequence - public int GetNextId(string key) - { - int id = -1; - - _daoManager.BeginTransaction(); - try - { - id = _sequenceDao.GetNextId(key); - _daoManager.CommitTransaction(); - } - catch - { - _daoManager.RollBackTransaction(); - throw; - } - - return id; - } - #endregion - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Service/Impl/CatalogService.cs b/Examples/npetshop2/NPetshop.Service/Impl/CatalogService.cs deleted file mode 100644 index ce5625e..0000000 --- a/Examples/npetshop2/NPetshop.Service/Impl/CatalogService.cs +++ /dev/null @@ -1,113 +0,0 @@ - - -using System.Collections; -using IBatisNet.Common.Pagination; -using IBatisNet.DataAccess; -using NPetshop.Domain.Catalog; -using NPetshop.Persistence.Interfaces.Catalog; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Service.Impl -{ - /// - /// Summary description for CatalogService. - /// - public class CatalogService : ICatalogService - { - #region Private Fields - private DaoManager _daoManager = null; - private IItemDao _itemDao = null; - private IProductDao _productDao = null; - private ICategoryDao _categoryDao = null; - #endregion - - #region Constructor - public CatalogService(DaoManager daoManager) - { - _daoManager = daoManager; - _categoryDao = _daoManager[typeof(ICategoryDao)] as ICategoryDao; - _productDao = _daoManager[typeof(IProductDao)] as IProductDao; - _itemDao = _daoManager[typeof(IItemDao)] as IItemDao; - } - #endregion - - #region Public methods - - #region Item - public IPaginatedList GetItemListByProduct(Product product) - { - IPaginatedList itemList = null; - - itemList = _itemDao.GetItemListByProduct(product.Id); - foreach(Item item in itemList) - { - item.Product = product; - } - - return itemList; - } - - public Item GetItem(string itemId) - { - Item item = null; - - item = _itemDao.GetItem(itemId); - - return item; - } - - public bool IsItemInStock(string itemId) - { - return _itemDao.IsItemInStock(itemId); - } - #endregion - - #region Product - public Product GetProduct(string productId) - { - Product product = null; - - product = _productDao.GetProduct(productId); - - return product; - } - - public IPaginatedList GetProductListByCategory(string categoryId) - { - IPaginatedList productList = null; - - productList = _productDao.GetProductListByCategory(categoryId); - - return productList; - } - - public IPaginatedList SearchProductList(string keywords) - { - IPaginatedList productList = null; - - productList = _productDao.SearchProductList(keywords); - - return productList; - } - #endregion - - #region Category - public IList GetCategoryList() - { - return _categoryDao.GetCategoryList(); - } - - public Category GetCategory(string categoryId) - { - Category category = null; - - category = _categoryDao.GetCategory(categoryId); - - return category; - } - #endregion - - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Service/Impl/ShoppingService.cs b/Examples/npetshop2/NPetshop.Service/Impl/ShoppingService.cs deleted file mode 100644 index b707348..0000000 --- a/Examples/npetshop2/NPetshop.Service/Impl/ShoppingService.cs +++ /dev/null @@ -1,26 +0,0 @@ - - -using NPetshop.Domain.Shopping; -using NPetshop.Service.Interfaces; - -namespace NPetshop.Service.Impl -{ - /// - /// Summary description for ShoppingService. - /// - public class ShoppingService : IShoppingService - { - - public ShoppingService() - { - } - - #region Public methods - - public ShoppingCart CreateNewShoppingCart() - { - return new ShoppingCart(); - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Service/Interfaces/IAccountService.cs b/Examples/npetshop2/NPetshop.Service/Interfaces/IAccountService.cs deleted file mode 100644 index d7e245e..0000000 --- a/Examples/npetshop2/NPetshop.Service/Interfaces/IAccountService.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections; -using NPetshop.Domain.Accounts; - -namespace NPetshop.Service.Interfaces -{ - public interface IAccountService - { - Account GetAccount(string username); - Account GetAccount(string login, string password); - void InsertAccount(Account account); - void UpdateAccount(Account account); - IList GetUsernameList(); - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Service/Interfaces/IBillingService.cs b/Examples/npetshop2/NPetshop.Service/Interfaces/IBillingService.cs deleted file mode 100644 index 993bba7..0000000 --- a/Examples/npetshop2/NPetshop.Service/Interfaces/IBillingService.cs +++ /dev/null @@ -1,12 +0,0 @@ -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Billing; - -namespace NPetshop.Service.Interfaces -{ - public interface IBillingService - { - void InsertOrder(Order order); - IPaginatedList GetOrdersByUsername(string userName); - int GetNextId(string key); - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Service/Interfaces/ICatalogService.cs b/Examples/npetshop2/NPetshop.Service/Interfaces/ICatalogService.cs deleted file mode 100644 index 919abf4..0000000 --- a/Examples/npetshop2/NPetshop.Service/Interfaces/ICatalogService.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System.Collections; -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Catalog; - -namespace NPetshop.Service.Interfaces -{ - public interface ICatalogService - { - IPaginatedList GetItemListByProduct(Product product); - Item GetItem(string itemId); - bool IsItemInStock(string itemId); - Product GetProduct(string productId); - IPaginatedList GetProductListByCategory(string categoryId); - IPaginatedList SearchProductList(string keywords); - IList GetCategoryList(); - Category GetCategory(string categoryId); - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Service/Interfaces/IShoppingService.cs b/Examples/npetshop2/NPetshop.Service/Interfaces/IShoppingService.cs deleted file mode 100644 index 04587a5..0000000 --- a/Examples/npetshop2/NPetshop.Service/Interfaces/IShoppingService.cs +++ /dev/null @@ -1,9 +0,0 @@ -using NPetshop.Domain.Shopping; - -namespace NPetshop.Service.Interfaces -{ - public interface IShoppingService - { - ShoppingCart CreateNewShoppingCart(); - } -} \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj b/Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj deleted file mode 100644 index 851e9e0..0000000 --- a/Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj +++ /dev/null @@ -1,155 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj.user b/Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj.user deleted file mode 100644 index dc80744..0000000 --- a/Examples/npetshop2/NPetshop.Service/NPetshop.Service.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Test/AssemblyInfo.cs b/Examples/npetshop2/NPetshop.Test/AssemblyInfo.cs deleted file mode 100644 index 76201ae..0000000 --- a/Examples/npetshop2/NPetshop.Test/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// Les informations gnrales relatives un assembly dpendent de -// l'ensemble d'attributs suivant. Pour modifier les informations -// associes un assembly, changez les valeurs de ces attributs. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Les informations de version pour un assembly se composent des quatre valeurs suivantes: -// -// Version principale -// Version secondaire -// Numro de build -// Rvision -// -// Vous pouvez spcifier toutes les valeurs ou indiquer des numros de rvision et de build par dfaut -// en utilisant '*', comme ci-dessous : - -[assembly: AssemblyVersion("1.0.*")] - -// -// Pour signer votre assembly, vous devez spcifier la cl utiliser. Consultez -// la documentation Microsoft .NET Framework pour plus d'informations sur la signature d'un assembly. -// -// Utilisez les attributs ci-dessous pour contrler la cl utilise lors de la signature. -// -// Remarques: -// (*) Si aucune cl n'est spcifie, l'assembly n'est pas sign. -// (*) KeyName fait rfrence une cl installe dans le fournisseur de -// services cryptographiques (CSP) de votre ordinateur. KeyFile fait rfrence un fichier qui contient -// une cl. -// (*) Si les valeurs de KeyFile et de KeyName sont spcifies, le -// traitement suivant se produit: -// (1) Si KeyName se trouve dans le CSP, la cl est utilise. -// (2) Si KeyName n'existe pas mais que KeyFile existe, la cl -// de KeyFile est installe dans le CSP et utilise. -// (*) Pour crer KeyFile, vous pouvez utiliser l'utilitaire sn.exe (Strong Name, Nom fort). -// Lors de la spcification de KeyFile, son emplacement doit tre -// relatif au rpertoire de sortie du projet qui est -// %Project Directory%\obj\. Par exemple, si votre KeyFile se trouve -// dans le rpertoire du projet, vous devez spcifier l'attribut -// AssemblyKeyFile sous la forme [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) DelaySign (signature diffre) est une option avance. Pour plus d'informations, consultez la -// documentation Microsoft .NET Framework. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj b/Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj deleted file mode 100644 index 3d235a0..0000000 --- a/Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj.user b/Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj.user deleted file mode 100644 index 2adef7e..0000000 --- a/Examples/npetshop2/NPetshop.Test/NPetshop.Test.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Test/Persistence/BaseTest.cs b/Examples/npetshop2/NPetshop.Test/Persistence/BaseTest.cs deleted file mode 100644 index fd432d6..0000000 --- a/Examples/npetshop2/NPetshop.Test/Persistence/BaseTest.cs +++ /dev/null @@ -1,30 +0,0 @@ -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Configuration; -using log4net; -using log4net.Config; -using NUnit.Framework; - -[assembly : DOMConfigurator(Watch=true)] - -namespace NPetshop.Test.Persistence -{ - /// - /// Description rsume de BaseTest. - /// - [TestFixture] - public abstract class BaseTest - { - protected DaoManager daoManager = null; - protected readonly ILog _logger = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType ); - - [SetUp] - public void SetUp() - { - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); - builder.Configure(@"..\..\..\NPetshop.Persistence\dao.config"); - - daoManager = DaoManager.GetInstance("SqlMapDao"); - } - - } -} diff --git a/Examples/npetshop2/NPetshop.Test/Persistence/DaoTest.cs b/Examples/npetshop2/NPetshop.Test/Persistence/DaoTest.cs deleted file mode 100644 index 8510d75..0000000 --- a/Examples/npetshop2/NPetshop.Test/Persistence/DaoTest.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections; -using NPetshop.Persistence.Interfaces.Accounts; -using NPetshop.Persistence.Interfaces.Catalog; -using NUnit.Framework; - - -namespace NPetshop.Test.Persistence -{ - /// - /// Description rsume de DaoTest. - /// - public class DaoTest : BaseTest - { - - [Test] - public void TestGetDao() - { - Type type = typeof(IAccountDao); - - IAccountDao accountDao = (IAccountDao)daoManager[typeof(IAccountDao)]; - - Assert.IsNotNull(accountDao); - Assert.IsTrue(type.IsInstanceOfType(accountDao)); - } - - [Test] - public void TestCategoryDao() - { - ICategoryDao categoryDao = (ICategoryDao)daoManager[typeof(ICategoryDao)]; - - IList list = categoryDao.GetCategoryList(); - Assert.IsNotNull(list); - Assert.IsTrue(list.Count>0); - } - } -} diff --git a/Examples/npetshop2/NPetshop.Test/Presentation/ControllerTest.cs b/Examples/npetshop2/NPetshop.Test/Presentation/ControllerTest.cs deleted file mode 100644 index 8d73730..0000000 --- a/Examples/npetshop2/NPetshop.Test/Presentation/ControllerTest.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using NUnit.Framework; -using NPetshop.Presentation; -using NPetshop.Service; - -namespace NPetshop.Test.Presentation -{ - /// - /// Summary description for ControllerTest. - /// - [TestFixture] - public class ControllerTest - { - private NPetshopContainer _container; - private CatalogController _catalogController = null; - private NPetshopState _state = null; - - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - _container = null; - _catalogController = null; - _state = null; - - _container = new NPetshopContainer(); - - _catalogController = _container[typeof(CatalogController)] as CatalogController; - _state = _catalogController.State as NPetshopState; - } - - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - _container.Dispose(); - } - - #endregion - - #region Test Controller - - /// - /// Test Container - /// - [Test] - public void TestContainer() - { - object controller = _container.Resolve("BillingController"); - Assert.IsTrue(controller.GetType()==typeof(BillingController)); - } - - /// - /// Test catalog browsing - /// - [Test] - public void TestCatalogController() - { - _state.CurrentView = "no-case"; - _state.Command = "showCategory"; - _catalogController.ShowProductsByCategory("FISH"); - - Assert.IsTrue(_state.PreviousView=="no-case"); - Assert.IsTrue(_state.CurrentView=="Category"); - Assert.IsTrue(_state.CurrentList.Count==4); - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Test/Web/WebFormTest.cs b/Examples/npetshop2/NPetshop.Test/Web/WebFormTest.cs deleted file mode 100644 index 3e7ef06..0000000 --- a/Examples/npetshop2/NPetshop.Test/Web/WebFormTest.cs +++ /dev/null @@ -1,35 +0,0 @@ -using NUnit.Extensions.Asp; -using NUnit.Extensions.Asp.AspTester; -using NUnit.Framework; - -namespace NPetshop.Test.Web -{ - /// - /// Description rsume de WebFormTest. - /// - [TestFixture] - public class WebFormTest : WebFormTestCase - { - [Test] - public void TestGotToCatalog() - { - // First, instantiate "Tester" objects: - UserControlTester ucStartUp = new UserControlTester("StartUp", CurrentWebForm); - UserControlTester ucSideBar = new UserControlTester("SideBar", ucStartUp); - LinkButtonTester linkbuttonFish = new LinkButtonTester("LinkbuttonFish", ucSideBar); - - UserControlTester ucCategory= new UserControlTester("Category", CurrentWebForm); - LabelTester labelCategory = new LabelTester("LabelCategory",ucCategory); - - // Second, visit the page being tested: - Browser.GetPage("http://localhost/NPetshop.Web/Views/default.aspx"); - string homePage = this.Browser.CurrentUrl.AbsoluteUri.ToString(); - linkbuttonFish.Click(); - - // First, test - string catalogPage = this.Browser.CurrentUrl.AbsoluteUri.ToString(); - Assert(catalogPage, homePage != catalogPage); - AssertEquals("Fish", labelCategory.Text); - } - } -} diff --git a/Examples/npetshop2/NPetshop.Test/bin/Debug/NPetshop.Test.dll.config b/Examples/npetshop2/NPetshop.Test/bin/Debug/NPetshop.Test.dll.config deleted file mode 100644 index 91cdc89..0000000 --- a/Examples/npetshop2/NPetshop.Test/bin/Debug/NPetshop.Test.dll.config +++ /dev/null @@ -1,145 +0,0 @@ - - - - - -
- -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Test/bin/Debug/properties.config b/Examples/npetshop2/NPetshop.Test/bin/Debug/properties.config deleted file mode 100644 index 967fd94..0000000 --- a/Examples/npetshop2/NPetshop.Test/bin/Debug/properties.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Test/readme.txt b/Examples/npetshop2/NPetshop.Test/readme.txt deleted file mode 100644 index 66d30b7..0000000 --- a/Examples/npetshop2/NPetshop.Test/readme.txt +++ /dev/null @@ -1,2 +0,0 @@ - -- In order to run the test, you must puts NunitAsp.dll in the External-bin directory \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/@css/styles.css b/Examples/npetshop2/NPetshop.Web/@css/styles.css deleted file mode 100644 index a421f32..0000000 --- a/Examples/npetshop2/NPetshop.Web/@css/styles.css +++ /dev/null @@ -1,211 +0,0 @@ -b, #categoryMenu a, #splashMenu a, .gridHead td, .label, .title -{ - color: #023030; - font-weight: bold; -} - -body -{ - background-color: #ffffff; - color: #000000; - margin: 0px; -} - -.pageHeader -{ - font-family: Verdana; - color: #003300; - font-size: 16pt; -} - -.header -{ - font-family: Verdana, Arial; - color: #003300; - font-size: 9pt; - font-weight: bold; -} - -.fieldHeader -{ - font-family: Verdana, Arial; - color: #003300; - font-size: 9pt; - font-weight: bold; -} - -.errText -{ - font-family: Verdana, Arial; - color: #990000; - font-size: 9pt; -} - -.text -{ - font-family: Verdana, Arial; - color: #000000; - font-size: 9pt; -} -A.text -{ - font-family: Verdana, Arial; - color: #000000; - font-size: 9pt; - text-decoration: none; -} -A.text:hover -{ - color: #003399; - text-decoration: underline; -} - -.tableHeader -{ - font-weight: bold; - font-size: 10pt; - color: #003300; - font-style: italic; - font-family: Arial; -} - -.menuOrange -{ - font-weight: bold; - font-size: 8pt; - color: #fe9901; - font-family: Arial; - text-decoration: none; -} -A.menuOrange -{ - font-weight: bold; - font-size: 8pt; - color: #fe9901; - font-family: Arial; - text-decoration: none; -} -A.webServiceTestLabel -{ - font-weight: bold; - font-size: 12pt; - color: #fe9901; - font-family: Arial; - text-decoration: none; -} -A.webServiceTestLabel:hover -{ - text-decoration: underline; -} -A.menuOrange:hover -{ - text-decoration: underline; -} - -.menuBlack -{ - font-weight: bold; - font-size: 9pt; - color: #333333; - font-family: Arial; - text-decoration: none; -} -A.menuBlack -{ - font-weight: bold; - font-size: 9pt; - color: #333333; - font-family: Arial; - text-decoration: none; -} -A.menuBlack:hover -{ - text-decoration: underline; -} - -A.catLink -{ - font-family: Arial; - font-size: 14pt; - color: #003300; - font-style: italic; - text-decoration: none; -} -A.catLink:hover -{ - text-decoration: underline; -} -.gridHead td -{ - border-bottom: solid 2px black; -} - -.gridItem td, .gridFoot td -{ - border-bottom: 1px solid black; - height: 25px; -} - -.gridHead td, .gridItem td, .gridFoot td -{ - padding-left: 10px; - padding-right: 10px; -} - -.gridFoot -{ - background: gainsboro; -} - -.gridNav -{ - padding-top: 10px; -} - -.label -{ - padding-right: 5px; - text-align: right; -} - -.num -{ - text-align: right; -} - -.numFooter -{ - background: gainsboro; - text-align: right; -} - -.textBox{ - background-color: transparent; - padding: 3px; - line-height: normal !important; - border-style: none; - border-bottom: 1px solid #8E959E; - color: #023030 -} - -.textBox-on { - background-color: transparent; - padding: 3px; - line-height: normal !important; - border-style: none; - border-bottom: 1px solid #f30; - color: #333 -} -.select { - background-color: #EDF7FF; - border: 1px inset; - font-family: tahoma,arial,geneva,verdana,lucida,helvetica,sans-serif; - font-size: 12px; - font-weight: normal; - padding: 2px; - color: #023030 -} -.btnImage {cursor: pointer; cursor: hand;margin:1px 2px} - - - diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/bird1.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/bird1.jpg deleted file mode 100644 index c181bb054e99632045ca986a1191d0c1edd9df45..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3391 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 O)Zqe5bhtqDZ~p;3+fO$D diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/cat1.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/cat1.jpg deleted file mode 100644 index 190d83daa59b65860030b7795944eae71eb20055..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3721 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 diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/dog1.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/dog1.jpg deleted file mode 100644 index 8671bae4f77ba1b22e5419383185dbfab1e1934e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3319 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 YnNTpSS;q`BfGkXT09#WY(9zW20WHcSk^lez diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/dog2.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/dog2.jpg deleted file mode 100644 index d288963e18995342c59aabb7b8ec86389a5d91d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3525 zcmbW&c{J2t{{ZmM7`su4v4ydfoopGhBr&p7jGZi5vQ)@kSyQrP3?XZl!4NaHu?+gk z(%2#~#u7r`rfgBRu{4jK=Q+=F&hM|^@AtmvegC=dbI*C*d+z(vC+VMoQzk}NjQ|jc z0T4PK0DT5909cusS(uqvSy))u*jU*iJe&{?4v4^M?vp&if-n(bK_MYgNku79ad`bLL9n?HYTZSU;v z(f0qiKmhn(tmFA#u>axWI(9KIGJ+Xd{qaBl)l$G&mK!-zJ%K zPIpev~bicw@#^i z(EN8qQ;)(u7cw?f^R-foW?}*1KkQAk^|<7j z|2XCLbd9}twgX{+oVT17 zFA{WFyGp{kC@VVG>R zWzXGhFd?@y{BpUPk#uNICA3&d-fqbeny*n=;c0Ir9SS= z!u&JLM6goBY`W5_V_&{Vd$9V9gjZXt)jH19P_(S*cJd>K@o75HGaZ$bpzJ91N}3LM zZyhPqCO9iY(YB0VwqD!5+Em@#eRdCXF+M0lIx>L{RMjY?`?D17tT=nAlr7)i(W!1$kCHCT>hAXq7zqYa-jaC44F_E>f<7 z^Q_?2df(oGQsX<*>7rl0R_YcBq$;P9v(?^l9J7tT9S{SR$#W7bsrta2FA+S4z> zd}nQ1I+76g8X^j-$U=y_ol!K=i3{0yhh;Qh(~FBrbIvQ

ka)I_T{^xrgPrlvbyk z2{}`k@c!e2q{1%CMhK&=(=r3v1xu(Jo*ljRp|lU7Uu*&$b9Li{?=MUL{_yhiLNROy{M3tQ9`)hGnPr}nE!`GV?_%32OU_( z2R5f^$${SrK*yfGQkR_SwbUkfWaH;tkk_$k<0Z|KG>U1?yVjZ<;DrAf?Sov(!&fh5 zj^xDm`5HEdJMMtMYs`isq(6;gl67n-s1Gl}2b*hXV5bAY=;?5OWR~fdX6xalF6tQS zBXMTWy+6x{|C`+NkN7P*!0|0`Ih!=tLLBZ*i+PJE+QsTEs5Oyw!xeeWE7oPc-?W2c zyMDUaYnmE3|K|5VG1;dDT;9z6^@=x~-tK-)+>Sdb_|G}{b55JEL-9_n)L4+XEE@ol44xEu#TCgou?ZP5r%#^ zq!;t~mc`aUwKDhtG1~;=E;STRN=lBtje9`rLr~P$h)C`V2P*zW&f${?f0UYBp7E;X zrJ`A9*^<<~mDoMXYlos#HN$U3AO|-$>9NMP{B2B`HDOB7BKKu*)#mt8S@5ZF3aXk8 z)VD|8t~%~zh`*BigC^mhqfLg1G@LC*CzYXtk2D9<72O!$=+XOFe6+>#=J?%AH{`PBPG=S%<;VXadyi;6dW zgZb4jA^vOxTxwgomyBrHJdx???UAHzE8UZ-DPS2bqWZ%*y2i(R!4F^0+oJKEfN^Fx zXB7D3oo2}s?*UnzYq>89Xhh+iyc(F&pih+kJJZ`D`Q(?|N9mdO1t1+E5dLJc zU{a#+BBju0)HyTgest)MH|itT9ah%-ZG6N|YuN3)i45vBtCI01@y}S@@flXAg9~{u z?}y=XeJo9_BPSW}j`&imN27*24?9zie774KEwrz!8|+4RHI}Wv*2&4=4%1Q)u-D3m znNiG8nK*=bhAY3GQkl0e@la4CIS}h~;k0_6%MT4#J;CLq-D~z8j+&7VkhnvOu~qJ` zk4;b`FLq8mh&EX-g7$=SU(0uJ^3&)%YO_omqAl~);+CP69!Q6q+lmNeY9{1XIZv{j zG2x3YeB*FVggn#Z5Nx>m72f^?F{?KRUA;#z`8sHX?5-jo4uFH z*Ojgx{kJI>B9><3mOeMRQw2Ny2nHR!>-A2l(fJKy*7}0MXLr&44S3b=Z;|nKuBrkT z{X|^j+Dv(U{{VQrCd65I^F;RIv+|^KwrQwBO?dF3&g#A*|+lb+2 zLFc;gUPTMh=Z@?50Pt~dso|6}ecGedkaLzZAFuC>T0}8iuNc%Bm-lLX)WR`n6iEtP z*Q}0|Gm_I@lU=0 z=WX{@xu)#)>L6=ht-OHu!X0g<67g61z1(A%f_Q&Nqe2?dj};%^qFGCbJlsE$g~SyPR)!`>A;F@sn5~uu=qsx2q*jRyA2H+K(YY-rj}>%ojkj% z+dq3vvIhCP#Iajoo{ksnI|LV(&Y!Q%HF}Bpc{Qu0W9||n9#najk3=2V!ggj&U;Fsi z42$*^qCfFuEpF0a4JoN!VxlE+p|#-4x^2>_A^-pvLGQyWzw;67j5qc51#eYYT*k?K zzQK?rT@u57oPvhR8R`mRJRtj0?2t1#Al6(~ngRV3B{hw^%adma*qk~*PRQmLzIl7kL_i7|T&ZfXBiRh^9~d18pIf6aWAK diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/dog3.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/dog3.jpg deleted file mode 100644 index 4541ff411120ee4cbc7ea37a0e573ea672b0e0ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3583 zcmbW(c{J2-`v>sP7~5E~OVnnj@Es-%MMno7(DOn^b5_$AI&v~A6et-RbzxREv`=9$d_c^a~{c|0R9!vxLmIw<300OZ9 z;)e$~7za!MPIh(yH9RW&r>e?9?0AP^pI9uZz%5jad72LC_jpbZe<1aJTj43Yv^ z1VCT`&;bRI1ON~l=$`@p9S{qcm5rT)6T-!P*ig$4uzubO*w9OjtxzOjhosyn>>p)@f}WT|E<1 zGlcnh3rqV;4woIBoL#)GdHY=VMfu$f4!IQ?c02rT+`aqp4-yjb=^2@ipFDk*m0wU; z^s>05wCr_tP3@bydU8X12c?rr>+0_59~c}O9vK~D%*@WsFMMV$E-kNbeE+ezwY~Fm z_m2w%fd9ohy#EFJA1;AI7Yi#Zn3dy?3&aw7SYQEGHkdlQpwUH+D_9{Zcq}K>I4!U0 zEks(wZtdvRpgyi+GMY28>wjqfl>P5ucm7|p|G@t1VgNi~(BbgF0)Qc~y(?en!v&E6 z^wQ69XEB@1=B)WT)YD5m-k5i|%Lb#rcfDJ@DO-=<902FfSqE1u{Z@2+g_jtCSl z(y>Y(q8o0{>!PmtKkrY!IFU)$_LVq7TyM2+zMcOucyW#sq5_+e(>Fc)6xHi>gzIg`mYvw5 z?3t9i;m2m%KPjOzVKFxBQJJM1)`Y*bJIweoj$|8%^?vVyLB`D=fsEGse(WhNRRXB?O8-9W&)yC>6S-?wS} z?lbJVY6kV`O4yaeaV8!~Q7JuEwXm3pF zW8{`={T?dPyufwBxL1jD>}MkKTm6y?!f|k+6j?U0l@U3ZJHorRNIZmCN(@7jI=6VG^*x-FfGZ;w3pF5Q6WqQGb0U=1~`dh zY@$I+E}!JdzoID;euzn!kjNtiT2E6@#1Vxw2DOj02_Ca(J4*L(%uGpE#(j#KZ%`0q ztX?%RrAg>7FH9_5hq}WzfZWisV>ZW7G3|(4d5+l5%PRYMM2kSk2Ii9Kv(07XaHZeZ z~NjEwuwC(2gW@MU^e%h4{-@Zs$F<1%1*$kK}YlX#5T{Q0Lapsf>Ql`DPfY5{lh zi)PeD_nEwM3rR!9j=keRh_45?&k^%=%!x_7AjZVnMJhDbjwWvBKf@|0@-Hn1!JR?M%9aiw+NES$QQ!Ogl&vy(W zyUn2MvbG?>!!=#FF}5cq2f&xaHG;rS+K>Gp>$7(o6i&Shv*ok2kIU&`THW-d2dsoK zPAghWr{s=YzQNmBZW2_so>o&jT}nEGe0F2i>uF$Kka->{zuz1ENc@He!4jsVp(|B< zSFP~lZ&;GE>=f^=zshpQOWcj3LE~YU6hc}1U)zr7xxGZ_5igoz`<#w*c9CkU z-l8q?ce8M&_luy=NJ?4%PO6gzk5JG;471rxVw~C-{sf%7cANOnQV2DtA2r~kaq}~u zU2*aEieC?|2*cRH_n49!^k~Y6iuY=DG0y>T>&cb%a~|4J6_Uxp73C1wY^(Gh*66}6 zr`_qfxVwh#d!Nte=YeX0wTq#}I-i7!o)J-HB_`YsImv&KS!@4*3&}CFb zgv$QcH*dyY8~_pO{z@s)dQ9fJ@~tgFnSO+7H_fxYpt7U|=7|jOWxi+3E$}qQ&Nl6S z!YGR3xs&h%mT-xbuLPoZFLA6awC{MfcSX@knN5W@i#FR_XzOrOFLhWU&AsjKh@`Cl;bhzscF1ZaLC_TRbFxHTSv0rp(&rtZRd@%_(iN zVJ?Yg+LVHRGx;2je`=8VdCN+fM&EM4HLWR?t(Dm@2G57Gz4bt!k(JT)csIFzw<+uF z4bjSz=Rm9U2)PW((lGhUf?PDr!({G+geKiUh;Vu#>>Jjj)9;Q>pKyK*TgVR`$#u~p z(b9O!R}waQwi*-zxzU#FIV)>xIIK0d}m7-*d)fp0FQF4#YYB9wYnMsanj_LUopkz=C4`K_lnCEFDMlW>*DN2{;VA z%E5sOEWG`lNzB_JDg833oEb=vzQOrpmYfQ8b@OnlSySxdX9tV!DG>%pH`Ia)uKRt~ zJv*g78HU?wbK7+^b*=3VM0&kmcNla$R(KvxI>oUrxq`CNNc_=qYa^0RGzdXoqV zv39C-Ur{iWw{Co>%Y1@tyjbcSwRghXHWzBYkNPe+C!0%GTWNUML-EEdIrLgdC1ZbU zY0X*SZcAo_wlhy$C+SRY=@0|p=*9dLsDPQ&^OU%pAxloS%$Zsa*=%K`gH}3z5yiTj zt>>L&b|xXHhq)?gIa*0}Qr%Wy3&otQzv6rV_zNHcLH>_8$R(4m7ZTph@6M4=_E$|l zp3EE@S}b8~QiO^D z0#p~ema+YL$(P#iB=)O>(I`l+-aSzbM<;n##8^%=N<{TYwZFPBJ|e%~Agemxyn zM)DnbA;;05yHwwoc)8@CiTnC&ejl)`wzwQ!8+M!UtnAJlaLY&UY}=2SFRN}o!@zndh2*C(Tq%;Ni+@Kt!6KH&EuZx)W+at zZFzlMLMh4C-9)5Yi$6R0Qd^d?p4(X<`RA)DGY{eiU{@Sxh2Dn{PwScK!zS+)3v%e63af^{a- zQ||~IM+;w_)NuHu=EvF}kt0+Vrqt#r)(P~#5@~XjoiE9886SHWC|*?fKC*zU%%H$UGbrd_>>tuauBQM1 diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/dog4.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/dog4.jpg deleted file mode 100644 index 4d9a06bdcb915762cbb26a6a8dd9b00d4b7b4e3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3082 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�`~GCjZPI)bz4(+ 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 S+WVx(r(Y diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/dog6.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/dog6.jpg deleted file mode 100644 index aec020c5436b315dfbdb11b3107f4b32bc4055de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3371 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 aOdxiw4s$^~8c-E+Ee(eXmxilcF8m*;awW+C diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/fish1.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/fish1.jpg deleted file mode 100644 index 1734fb7c6ae56531329d222cb28d82fbac98e0f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4048 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 b0e&JGy?Bv33^hQI$%q!fV5|iMUQPW6?jfAs diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/fish2.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/fish2.jpg deleted file mode 100644 index 8bcc3175781b61519c91945aac1160cb032d71c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3035 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 diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/fish4.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/fish4.jpg deleted file mode 100644 index 7b669b3a770424158bd4b969c1ceed9940198586..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2917 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 diff --git a/Examples/npetshop2/NPetshop.Web/@images/Pets/reptile1.jpg b/Examples/npetshop2/NPetshop.Web/@images/Pets/reptile1.jpg deleted file mode 100644 index 15e6458d5ae89a9775bf78e5ea8a1dde4494776f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4235 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 E0c)Vz{?cE&L_lu4JQ z-l4K+t079q+x`q=MGC83E9)I9m25jC=NxbE^B+8)&+~+Y1^cZ?3IG9M$^tAF%V_{^ zL#Pf6<_rL%Xt)Z3N+2i?fLaJbx?es*p&m5p3he0}O#8VliN|wtw(Qt3L8Z>BOD3MR zn=+0W52l;k+&>f-o8Aw<@9F7)pt*+)rqc!8XmrcQIHNM_c|`ahG+HYLGcz+|Op=Z< znR6CP4~Y~PA3tuk4E)tUZLt_l#=gd1CY_vKP0h>|pEJhAngfL+qoWp!x$k9UrGAPtXxxqvs9 zx^vRQW5|kN+_&c$4Bi?|eR!+iDCFdjkk_{4>Wt%`nzZFyb}a^T5=QNhk2N|v-EwCA z%67Pf!B$Wx!|4Z16B9@A=ueLxS&YViS5%lf+P}*D-QNClRK%aYKDY3A9}ee(;Y;qW z)L$X!H5xWuy;5{W6$7JYe!A8%GFAkm@BAz6LiHU54t+d1sWAPJ^Zfan{8zrJ(IhV7 zn$8uqohh70r_)$04TW;!PEG68(u|Gk5m%Q$k?0wbU>fK*j~TAuarFT!tK8jcPUX!} zX`PGRx+S8xtx`OR5*igb_Osd~@M>Ef(4)CC>h5Mt*;#+S&@eT--+_{qd92!hf`ALCS<$57Gc`Fxxq3s(cTyt zw;?u0@^*N*{PLxi6Gy+s&zXTC04%@*eC7X70Q}b}tXQEMbz>Hu=9bv1DQn6l^VXJz z)|Bh=nag(fhYG@Lcf1Uasg{cP3v31}(~cK&D7i7VLk&j_LaeI9_v42l{YYn9b}rS_ zosJGIC9sR!>V>pc@@n7eZ)Xxzo1c6ieqmIG<|;Scp(U?p&q#9%c*{y2*QgXDzgRzP zE&D5}tSLL3Ha7B?530KDNic@aK z5+BJ&kLahD4A`uldwxA(`RB8~`|=!GrmMAQIsQZOpoHf~~ zCg^SzW7~JV--$lP6fs=eHC0CCl*7`tKnqyP``g-cT|_I#=Q20f-nW}DKk(qwQyg(c z{GUHSmVyP5=PveR;0hdm5r}@X*1wJgWk)U@H9)*w9%4P+E7Z`WTpcRSgij=ri8;RH zN*!inu`t(hc_qDzvvj&lN1>Px7c6`$iOq-SnWK?Hp?O;DnSs#4cyR$~jdYh#C>LFA z;Kgtcbe8LWc>3p1f$h7*L2Gsd?7*i*6nEhqH|^D~@vM7n$h2BDp%1Mv2w%M2+O1dv zd!lA%GWTOmSxl!UX*IZ&SPIr=**-Ss)R34sJ3cxHj>^g;Dx3Gs@e=koT-7?@rK41hp_)=tCQIMAZoUrB}#j~CxMNVXoiAZ2LWy| zJ8Sc2Oe>&Na$ zVOyX?s!ezf&a1zioE`lV6q-usMI=^>Q%DV zA>}{eayB;&6TzeaB=N?$tYJy$xo8z3IvD-wL2K@bB&S)mLR@zyFV64m`O_+$hhQ*l z@X}z8R|K*sxhrQysW-j0RRS0vqM{^_^Z7~_ajja(LdG+C*}-loY_tMZufT?85eY|5 zdc$0R7XluIjNxlC%gG$wB5Ne{A(qX^PgTB~)FXFJ_fR-$;j(c}9@@3>O86>-fk^XG zJG(jjY2_CClX5mbi5!I2LUm6QHWJij7gk|;&5GV;YS}GXWVFOvjYE_5n%#EI^I@o+ zWofXzh(-Q}=ng=H532fc0f3_Nv)8R3s~=Zn!Bs zX~47$YZGZ*N*hN*LOu5Wjqr?X;&0k|l(l7K+qa9U{j-96Jz$Dt3*)**p4SD|T^WA) zDHa`#5483rND-amarTBhm6So!XUW4~Z6jPeZ)-Pi|6#iV{F{y0FhUMyG9PRsdTnUP zk&3}N!+_w>VW&Osaik?dDErv`cLfAV c{E{&1Q(s&Qi5!W&Jlj(lRbL(AOa}h{1I~Dj3jhEB diff --git a/Examples/npetshop2/NPetshop.Web/@images/space.gif b/Examples/npetshop2/NPetshop.Web/@images/space.gif deleted file mode 100644 index 2a68106d151063a2c2eeb50d016254d1e5aca6b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 85 zcmZ?wbhEHbWMp7u*vtR|4Pe{=rW$~}hK2(N4m310{0EBvXZR1MfHaT=1d2ad7#SG& S8FYY>Kofv$7N!rb4AuZGMj2!P diff --git a/Examples/npetshop2/NPetshop.Web/@images/splash.jpg b/Examples/npetshop2/NPetshop.Web/@images/splash.jpg deleted file mode 100644 index ad3def0556cfc7bf8d5b703e526ca009146c7a75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 46200 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 PwceRb&V^zD066~#4h)b~ diff --git a/Examples/npetshop2/NPetshop.Web/@images/top_stripe1.gif b/Examples/npetshop2/NPetshop.Web/@images/top_stripe1.gif deleted file mode 100644 index 41b3212c41921d64a104416e18d301ce095dda3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 840 zcmZ?wbhEHbWMnX8_|Cw#Ass9 zVr0Z*YQbz~X_%63oStfwnqiuey(*evT@=%fP=;^wIDX7#`Za^$-%KE4{6CZ7|15_8 za~OWj&z`&u)An4)Hpy0&J&M#n6u_57LGaHATMTS7*1BXTy YUZs!|7ZhDOMT9jP3>G*zFfdpH0B6@L$N&HU diff --git a/Examples/npetshop2/NPetshop.Web/@images/top_stripe2.gif b/Examples/npetshop2/NPetshop.Web/@images/top_stripe2.gif deleted file mode 100644 index 382878172bece09ffab01173d0d9d1a64c29b3a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 814 zcmZ?wbhEHbWMoid_|Cw#Ass9 zVr0Z*YQbz~X_%63oStfwnqiuey(*evT@=%fP=;^wIDX7#`Za^$-%KE4{6CZ7|15_8 wa~OWj&z`!BQz-+*fuwcQ#W)5L3n~DY?U|_HY05|g_+5i9m diff --git a/Examples/npetshop2/NPetshop.Web/@images/top_stripe3.gif b/Examples/npetshop2/NPetshop.Web/@images/top_stripe3.gif deleted file mode 100644 index 9032783f67c3bb7bbd7b488091e51cfb24b0ec04..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 819 zcmZ?wbhEHbWMoig_|Cw#Ass9 zVr0Z*YQbz~X_%63oStfwnqiuey(*evT@=%fP=;^wIDX7#`Za^$-%KE4{6CZ7|15_8 za~OWj&z`!BFpj&d_L1S}UGl#HNOhtin8@IGZ$P57i25SHX CASS~A diff --git a/Examples/npetshop2/NPetshop.Web/AssemblyInfo.cs b/Examples/npetshop2/NPetshop.Web/AssemblyInfo.cs deleted file mode 100644 index 7c317a7..0000000 --- a/Examples/npetshop2/NPetshop.Web/AssemblyInfo.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("NPetShop")] -[assembly: AssemblyDescription("Fully functional web application based on iBATIS.NET")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("Gilles Bayon")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.0.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the "project output directory". The location of the project output -// directory is dependent on whether you are working with a local or web project. -// For local projects, the project output directory is defined as -// \obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// For web projects, the project output directory is defined as -// %HOMEPATH%\VSWebCache\\\obj\. -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/Examples/npetshop2/NPetshop.Web/ChangeLog.txt b/Examples/npetshop2/NPetshop.Web/ChangeLog.txt deleted file mode 100644 index 5e43162..0000000 --- a/Examples/npetshop2/NPetshop.Web/ChangeLog.txt +++ /dev/null @@ -1,5 +0,0 @@ - -- Full MVC with Castle.MVC (see web.config to see web flow) -- IOC integration with Castle.Winstor (inject service, controller, ...) but Dao is always by iBATIS -( an next version will also inject the Dao in Service) -- Addes unit test for Dao, Presentation, Web (vias NunitAsp), Service layers \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Controls/ExtendedRepeater.cs b/Examples/npetshop2/NPetshop.Web/Controls/ExtendedRepeater.cs deleted file mode 100644 index b30ab33..0000000 --- a/Examples/npetshop2/NPetshop.Web/Controls/ExtendedRepeater.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using System.Web; -using System.Web.UI; -using System.Web.UI.WebControls; - -namespace NPetshop.Web.Controls -{ - ///

- /// Summary description for ExtendedRepeater. - /// - public class ExtendedRepeater: Repeater - { - - private ITemplate _noDataTemplate = null; - - public ITemplate NoDataTemplate - { - get - { - return _noDataTemplate; - } - set - { - _noDataTemplate = value; - } - } - - - protected override void OnPreRender(System.EventArgs e) - { - base.OnDataBinding (e); - - if(this.Items.Count == 0) - { - NoDataTemplate.InstantiateIn(this); - } - - } - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Default.aspx b/Examples/npetshop2/NPetshop.Web/Default.aspx deleted file mode 100644 index 99023a5..0000000 --- a/Examples/npetshop2/NPetshop.Web/Default.aspx +++ /dev/null @@ -1,27 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Header" Src="UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="UserControls/Footer.ascx" %> -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Presentation.Controls" Assembly="NPetshop.Presentation" %> -<%@ Page language="c#" Codebehind="Default.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Default" %> -<%@ Register TagPrefix="uc1" TagName="SideBar" Src="UserControls/SideBar.ascx" %> - - - - NPetShop - - - - - - - -
- -
- - -
- - -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Default.aspx.cs b/Examples/npetshop2/NPetshop.Web/Default.aspx.cs deleted file mode 100644 index 8c15f70..0000000 --- a/Examples/npetshop2/NPetshop.Web/Default.aspx.cs +++ /dev/null @@ -1,168 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -using NPetshop.Presentation; -using NPetshop.Presentation.UserActions; - -using NUserControls = NPetshop.Presentation; - - -namespace NPetshop.Web -{ - /// - /// Act as a router for incoming request - /// - public class Default : System.Web.UI.Page, IController - { - protected System.Web.UI.WebControls.PlaceHolder placeholder; - protected string currentView = string.Empty; - protected System.Web.UI.WebControls.Label LabelStatus; - protected System.Web.UI.WebControls.ValidationSummary ValidationSummary1; - protected string nextView = string.Empty; - - #region IController - public string CurrentView - { - get - { - return this.currentView; - } - set - { - this.currentView=value; - } - } - - public string NextView - { - get - { - return this.nextView; - } - set - { - this.nextView=value; - } - } - - #endregion - - private void Page_Load(object sender, System.EventArgs e) - { - if ( ViewState["CurrentView"]!=null ) - { - currentView = (string)ViewState["CurrentView"]; - Context.Items.Add("currentView",currentView); - nextView = (string)ViewState["NextView"]; - Context.Items.Add("nextView",nextView); - } - else - { - // Go to Home) - currentView = WebViews.STARTUP; - nextView=null; - } - - if (Request.QueryString["action"] != null) - { - currentView = Request.QueryString["action"]; - nextView=null; - } - - // Make the right control visible - NUserControls.UserControl userControl = (NUserControls.UserControl) LoadControl("UserControls/"+currentView+".ascx"); - userControl.ID = "ID_" + currentView; -// -// if (currentView == "Error") -// { -// LabelStatus.Controls.Add(userControl); -// } -// else -// { - placeholder.Controls.Add(userControl); -// } - - userControl.CurrentController = this; - } - - protected override void OnError(EventArgs e) - { - System.Exception oops = Server.GetLastError(); - - Context.Items.Add("stackTrace",Server.GetLastError().StackTrace); - Context.Items.Add("messageError",Server.GetLastError().Message); - if (Server.GetLastError().InnerException!=null) - { - Context.Items.Add("innerMessageError",Server.GetLastError().InnerException.Message); - } - else - { - Context.Items.Add("innerMessageError", string.Empty); - } - Context.Items.Add("sourceError",Server.GetLastError().Source); - Context.Items.Add("errorView",this.currentView.ToString()); - Server.ClearError(); - Server.Transfer("default.aspx?action=Error"); - } - - protected override void OnPreRender(System.EventArgs e) - { - if ( nextView==null ) - { - return; - } - if ( currentView!=nextView ) - { - // Show the next view - NUserControls.UserControl nextControl = (NUserControls.UserControl) LoadControl("UserControls/"+nextView+".ascx"); - nextControl.ID = "ID_" + nextView; - placeholder.Controls.Add(nextControl); - nextControl.CurrentController = this; - nextControl.DataBind(); - - // Delete last view - NUserControls.UserControl lastControl = (NUserControls.UserControl) placeholder.FindControl("ID_"+currentView); - placeholder.Controls.Remove(lastControl); - currentView = nextView; - } - else - { - Control currentControl = placeholder.FindControl("ID_"+currentView); - currentControl.DataBind(); - } - ViewState["CurrentView"]= currentView; - ViewState["NextView"] = nextView; - } - - - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Default.aspx.resx b/Examples/npetshop2/NPetshop.Web/Default.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Default.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Global.asax b/Examples/npetshop2/NPetshop.Web/Global.asax deleted file mode 100644 index fb79924..0000000 --- a/Examples/npetshop2/NPetshop.Web/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="NPetshop.Web.Global" %> diff --git a/Examples/npetshop2/NPetshop.Web/Global.asax.cs b/Examples/npetshop2/NPetshop.Web/Global.asax.cs deleted file mode 100644 index d0e63b4..0000000 --- a/Examples/npetshop2/NPetshop.Web/Global.asax.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Web; -using System.Web.SessionState; - -using Castle.Windsor; - -using NPetshop.Presentation; - -namespace NPetshop.Web -{ - /// - /// Summary description for Global. - /// - public class Global : System.Web.HttpApplication, IContainerAccessor - { - private static WindsorContainer _container; - - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - #region IContainerAccessor Members - - public IWindsorContainer Container - { - get - { - return _container; - } - } - - #endregion - - public Global() - { - InitializeComponent(); - } - - protected void Application_Start(Object sender, EventArgs e) - { - _container = new NPetshopContainer(); - } - - protected void Session_Start(Object sender, EventArgs e) - { - - } - - protected void Application_BeginRequest(Object sender, EventArgs e) - { - } - - protected void Application_EndRequest(Object sender, EventArgs e) - { - - } - - protected void Application_AuthenticateRequest(Object sender, EventArgs e) - { - - } - - protected void Application_Error(Object sender, EventArgs e) - { - - } - - protected void Session_End(Object sender, EventArgs e) - { - - } - - protected void Application_End(Object sender, EventArgs e) - { - _container.Dispose(); - } - - #region Web Form Designer generated code - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - } - #endregion - - } -} - diff --git a/Examples/npetshop2/NPetshop.Web/Global.asax.resx b/Examples/npetshop2/NPetshop.Web/Global.asax.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop2/NPetshop.Web/Global.asax.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj b/Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj deleted file mode 100644 index b078367..0000000 --- a/Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj +++ /dev/null @@ -1,952 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj.webinfo b/Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj.webinfo deleted file mode 100644 index 6f1cbc5..0000000 --- a/Examples/npetshop2/NPetshop.Web/NPetshop.Web.csproj.webinfo +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/Examples/npetshop2/NPetshop.Web/NPetshop.mdb b/Examples/npetshop2/NPetshop.Web/NPetshop.mdb deleted file mode 100644 index c4257f87997d44dd7860da7e5fbe6b1608f9527c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 499712 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 diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx deleted file mode 100644 index 145b925..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx +++ /dev/null @@ -1,19 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="AccountUI" Src="AccountUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AccountEdition.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AccountEdition" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- My account. -
- - - - - -
-   - -
-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs deleted file mode 100644 index 328ffd0..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Accounts -{ - /// - /// Description rsume de AccountEdition. - /// - public class AccountEdition : NPetshopUC - { - protected Button ButtonCancel; - protected Button ButtonUpdateAccount; - protected AccountUI ucAccount; - private AccountController _accountController = null; - - public AccountController AccountController - { - set { _accountController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - if(!IsPostBack ) - { - DataBind(); - } - } - - public override void DataBind() - { - ucAccount.Account = this.NPetshopState.CurrentUser; - } - - private void ButtonUpdateAccount_Click(object sender, EventArgs e) - { - if (Page.IsValid) - { - _accountController.Account = ucAccount.Account; - _accountController.UpdateAccount(); - } - } - - private void ButtonCancel_Click(object sender, EventArgs e) - { - _accountController.CancelEdition(); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.ButtonUpdateAccount.Click += new EventHandler(this.ButtonUpdateAccount_Click); - this.ButtonCancel.Click += new EventHandler(this.ButtonCancel_Click); - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountEdition.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx deleted file mode 100644 index 9a2cf66..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx +++ /dev/null @@ -1,84 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AccountUI.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AccountUI" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="AddressUI.ascx" %> -
- - Account - - - - - - - - - - - - - -
Login: - - -
Password: - - -
E-mail Address: - - -
-
-
- - Address - -
-
- - Preferences - - - - - - - - - - - - - - - -
- - - - - -
Show the .NET Pet Shop in  - - English - Japanese - -
-
- - - - - -
My favorite category is  - - Fish - Dogs - Reptiles - Cats - Birds - -
-
Make items in my favorite category more prominent as I shop.
Show pet tips based on my favorite category.
-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs deleted file mode 100644 index ab7575f..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.cs +++ /dev/null @@ -1,101 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Accounts; - using NPetshop.Domain.Catalog; - - /// - /// Description rsume de Account. - /// - public class AccountUI : NPetshopUC - { - protected System.Web.UI.WebControls.TextBox textboxLogin; - protected System.Web.UI.WebControls.TextBox textboxPassword; - protected System.Web.UI.WebControls.TextBox textboxEmail; - - protected System.Web.UI.WebControls.RequiredFieldValidator valUserId; - protected System.Web.UI.WebControls.RequiredFieldValidator valPassword; - protected System.Web.UI.WebControls.RequiredFieldValidator valEmail; - protected System.Web.UI.WebControls.DropDownList listLanguage; - protected System.Web.UI.WebControls.DropDownList listCategory; - protected System.Web.UI.WebControls.CheckBox chkShowFavorites; - protected System.Web.UI.WebControls.CheckBox chkShowBanners; - protected AddressUI ucAddress; - - public NPetshop.Domain.Accounts.Account Account - { - get - { - NPetshop.Domain.Accounts.Account account = new NPetshop.Domain.Accounts.Account(); - - account.Login = textboxLogin.Text; - account.Password = textboxPassword.Text; - account.Email = textboxEmail.Text; - - account.Address = ucAddress.Address ; - - account.Profile.FavoriteLanguage = listLanguage.SelectedItem.Value ; - account.Profile.FavouriteCategory = new Category(); - account.Profile.FavouriteCategory.Id = listCategory.SelectedItem.Value; - account.Profile.IsShowFavorites = chkShowFavorites.Checked; - account.Profile.IsShowBanners = chkShowBanners.Checked; - - return account; - } - set - { - textboxLogin.Text = value.Login; - textboxPassword.Text = value.Password; - textboxEmail.Text = value.Email; - - ucAddress.Address = value.Address; - - SetSelectedItem(listLanguage, value.Profile.FavoriteLanguage); - SetSelectedItem(listCategory, value.Profile.FavouriteCategory.Id); - chkShowFavorites.Checked = value.Profile.IsShowFavorites; - chkShowBanners.Checked = value.Profile.IsShowBanners; - } - } - - private void SetSelectedItem(DropDownList list, string value) - { - ListItem item = list.Items.FindByValue(value); - if (item != null) - { - item.Selected = true; - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - this.SetFocus(textboxLogin); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AccountUI.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx deleted file mode 100644 index f225977..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx +++ /dev/null @@ -1,57 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AddressStatic.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AddressStatic" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
First Name: - -
Last Name: - -
Street Address: - -
- -
City: - -
State / Province: - -
Postal Code: - -
Country: - -
Telephone Number: - -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs deleted file mode 100644 index 7caa7c1..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.cs +++ /dev/null @@ -1,69 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Accounts; - - /// - /// Description rsume de AddressStatic. - /// - public class AddressStatic : System.Web.UI.UserControl - { - protected System.Web.UI.WebControls.Literal LiteralFirstName; - protected System.Web.UI.WebControls.Literal LiteralLastName; - protected System.Web.UI.WebControls.Literal LiteralAddress1; - protected System.Web.UI.WebControls.Literal LiteralAddress2; - protected System.Web.UI.WebControls.Literal LiteralCity; - protected System.Web.UI.WebControls.Literal LiteralState; - protected System.Web.UI.WebControls.Literal LiteralZip; - protected System.Web.UI.WebControls.Literal LiteralCountry; - protected System.Web.UI.WebControls.Literal LiteralPhone; - - public Address Address - { - set - { - LiteralFirstName.Text = value.FirstName; - LiteralLastName.Text = value.LastName; - LiteralAddress1.Text = value.Address1; - LiteralAddress2.Text = value.Address2; - LiteralCity.Text = value.City; - LiteralZip.Text = value.Zip; - LiteralState.Text = value.State; - LiteralCountry.Text = value.Country; - LiteralPhone.Text = value.Phone; - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressStatic.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx deleted file mode 100644 index c6b4a27..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx +++ /dev/null @@ -1,81 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AddressUI.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.AddressUI" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
First Name: - - -
Last Name: - - -
Street Address: - - -
- -
City: - - -
State / Province: - - - - - - -
- - California - New York - Texas - - Postal Code: - - -
-
Country: - - USA - Canada - Japan - -
Telephone Number: - - -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs deleted file mode 100644 index 83ce3b4..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.cs +++ /dev/null @@ -1,100 +0,0 @@ -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Accounts; - - /// - /// Summary description for AddressUI. - /// - public class AddressUI : NPetshopUC - { - protected System.Web.UI.WebControls.TextBox txtFirstName; - protected System.Web.UI.WebControls.RequiredFieldValidator valFirstName; - protected System.Web.UI.WebControls.TextBox txtLastName; - protected System.Web.UI.WebControls.RequiredFieldValidator valLastName; - protected System.Web.UI.WebControls.TextBox txtAddress1; - protected System.Web.UI.WebControls.RequiredFieldValidator valAddress1; - protected System.Web.UI.WebControls.TextBox txtAddress2; - protected System.Web.UI.WebControls.TextBox txtCity; - protected System.Web.UI.WebControls.RequiredFieldValidator valCity; - protected System.Web.UI.WebControls.DropDownList listState; - protected System.Web.UI.WebControls.TextBox txtZip; - protected System.Web.UI.WebControls.RequiredFieldValidator valZip; - protected System.Web.UI.WebControls.DropDownList listCountry; - protected System.Web.UI.WebControls.TextBox txtPhone; - protected System.Web.UI.WebControls.RequiredFieldValidator valPhone; - - public Address Address - { - get - { - Address address = new Address(); - - address.FirstName = txtFirstName.Text ; - address.LastName = txtLastName.Text; - address.Address1 = txtAddress1.Text; - address.Address2 = txtAddress2.Text; - address.City = txtCity.Text; - address.Zip = txtZip.Text; - address.State = listState.SelectedItem.Value; - address.Country = listCountry.SelectedItem.Value; - address.Phone = txtPhone.Text; - - return address; - } - set - { - txtFirstName.Text = value.FirstName; - txtLastName.Text = value.LastName; - txtAddress1.Text = value.Address1; - txtAddress2.Text = value.Address2; - txtCity.Text = value.City; - txtZip.Text = value.Zip; - SetSelectedItem(listState, value.State); - SetSelectedItem(listCountry, value.Country); - txtPhone.Text = value.Phone; - } - } - - private void SetSelectedItem(DropDownList list, string value) - { - ListItem item = list.Items.FindByValue(value); - if (item != null) - { - item.Selected = true; - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - this.SetFocus(txtFirstName); - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/AddressUI.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx deleted file mode 100644 index a14ca3f..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx +++ /dev/null @@ -1,16 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Account" Src="AccountUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="NewAccount.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.NewAccount" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -
You are a new customer : sign up for - an account. -
- - - - - -
  -
-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs deleted file mode 100644 index c66381b..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.cs +++ /dev/null @@ -1,84 +0,0 @@ -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Accounts -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - - /// - /// Description rsume de NewAccount. - /// - public class NewAccount : NPetshopUC - { - protected System.Web.UI.WebControls.Literal LiteralMessage; - protected System.Web.UI.WebControls.Button ButtonCreateNewAccount; - protected System.Web.UI.WebControls.Button ButtonCancel; - protected NPetshop.Web.UserControls.Accounts.AccountUI ucAccount; - private AccountController _accountController = null; - - public AccountController AccountController - { - set { _accountController = value; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - private void ButtonCreateNewAccount_Click(object sender, System.EventArgs e) - { - if (Page.IsValid) - { - _accountController.Account = ucAccount.Account; - - try - { - _accountController.CreateNewAccount(); - } - catch - { - - } -// catch(NPetshop.Presentation.Exceptions.LoginAlreadyExistsException) -// { -// LiteralMessage.Text = "Login already exist."; -// } - } - } - - private void ButtonCancel_Click(object sender, System.EventArgs e) - { -// AbstractWebAction action = new ShowStartPageAction(Context); -// this.CurrentController.NextView = action.NextViewToDisplay; - } - - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - this.ButtonCreateNewAccount.Click += new System.EventHandler(this.ButtonCreateNewAccount_Click); - this.ButtonCancel.Click += new System.EventHandler(this.ButtonCancel_Click); - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/NewAccount.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx deleted file mode 100644 index 41f617c..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx +++ /dev/null @@ -1,39 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SignIn.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.SignIn" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - -
- Are you a new user? - Register -

- Or a registered user? -

- - - - - - - - - - - - -
Login : - - -
Password : - - -
- -
- -

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs deleted file mode 100644 index 3948e36..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Accounts -{ - /// - /// Description rsume de SigneOn. - /// - public class SignIn : NPetshopUC - { - protected RequiredFieldValidator valUserId; - protected TextBox TextBoxLogin; - protected TextBox TextBoxPassword; - protected Literal LiteralMessage; - protected Button ButtonLogIn; - protected Button ButtonRegister; - protected LinkButton LinkbuttonRegister; - protected RequiredFieldValidator valPassword; - private AccountController _accountController = null; - - public AccountController AccountController - { - set { _accountController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - this.SetFocus(this.TextBoxLogin); - } - - private void LinkbuttonRegister_Click(object sender, EventArgs e) - { - _accountController.RegisterUser(); - } - - private void ButtonLogIn_Click(object sender, EventArgs e) - { - if (Page.IsValid) - { - _accountController.Account.Login = TextBoxLogin.Text; - _accountController.Account.Password = TextBoxPassword.Text; - - if (_accountController.TryToAuthenticate()==false) - { - LiteralMessage.Text = "Invalid login or password. SignIn failed."; - } - } - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.ButtonLogIn.Click += new EventHandler(this.ButtonLogIn_Click); - this.LinkbuttonRegister.Click += new EventHandler(this.LinkbuttonRegister_Click); - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignIn.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx deleted file mode 100644 index 9cc9db5..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx +++ /dev/null @@ -1,14 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SignOut.ascx.cs" Inherits="NPetshop.Web.UserControls.Accounts.SignOut" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - -
-

You are signed out.

-

Thank you for shopping.

-

- You may - SIGN IN - again. -

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs deleted file mode 100644 index e72231e..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Accounts -{ - /// - /// Description rsume de SigneOut. - /// - public class SignOut : NPetshopUC - { - protected LinkButton LinkButtonSignIn; - private AccountController _accountController = null; - - public AccountController AccountController - { - set { _accountController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - } - - private void LinkButtonSignIn_Click(object sender, EventArgs e) - { - _accountController.SignIn(); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonSignIn.Click += new EventHandler(this.LinkButtonSignIn_Click); - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Accounts/SignOut.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx deleted file mode 100644 index 7dc2521..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx +++ /dev/null @@ -1 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="AdviceBanner.ascx.cs" Inherits="NPetshop.Web.UserControls.AdviceBanner" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.cs deleted file mode 100644 index 7a4f209..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de AdviceBanner. - /// - public class AdviceBanner : System.Web.UI.UserControl - { - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/AdviceBanner.ascx.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx deleted file mode 100644 index c599c83..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx +++ /dev/null @@ -1,23 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Banner.ascx.cs" Inherits="NPetshop.Web.UserControls.Banner" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Search" Src="Catalog/Search.ascx" %> - - - - -
- - SIGN OUT | - SIGN IN -   | - MY ACCOUNT -   | - - - |  - - -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.cs deleted file mode 100644 index 6215197..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.cs +++ /dev/null @@ -1,96 +0,0 @@ -using NPetshop.Presentation; -using Castle.MVC.Controllers;// Attribut - -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - - /// - /// Description rsume de Banner. - /// - public class Banner : NPetshopUC - { - protected System.Web.UI.WebControls.LinkButton LinkbuttonSignOut; - protected System.Web.UI.WebControls.LinkButton LinkbuttonSignIn; - protected System.Web.UI.HtmlControls.HtmlImage Img2; - protected System.Web.UI.WebControls.LinkButton LinkbuttonAccount; - private AccountController _accountController = null; - protected System.Web.UI.WebControls.LinkButton LinkbuttonCart; - private ShoppingController _shoppingController = null; - - public ShoppingController ShoppingController - { - set { _shoppingController = value; } - } - - public AccountController AccountController - { - set { _accountController = value; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - } - - private void LinkbuttonSignIn_Click(object sender, System.EventArgs e) - { - _accountController.SignIn(); - } - - private void LinkbuttonSignOut_Click(object sender, System.EventArgs e) - { - _accountController.SignOut(); - } - - private void LinkbuttonAccount_Click(object sender, System.EventArgs e) - { - _accountController.EditAccount(); - } - - protected override void OnPreRender(System.EventArgs e) - { - bool userLoggedIn = (this.NPetshopState.CurrentUser!= null); - - LinkbuttonSignIn.Visible = ! userLoggedIn; - LinkbuttonSignOut.Visible = userLoggedIn; - } - - private void LinkbuttonCart_Click(object sender, System.EventArgs e) - { - _shoppingController.ShowShoppingCart(); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkbuttonSignOut.Click += new System.EventHandler(this.LinkbuttonSignOut_Click); - this.LinkbuttonSignIn.Click += new System.EventHandler(this.LinkbuttonSignIn_Click); - this.LinkbuttonAccount.Click += new System.EventHandler(this.LinkbuttonAccount_Click); - this.LinkbuttonCart.Click += new System.EventHandler(this.LinkbuttonCart_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Banner.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx deleted file mode 100644 index 182fc62..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx +++ /dev/null @@ -1,11 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Bill.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Bill" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="BillUI" Src="BillUI.ascx" %> - - -
- Order Complete! -

- -

diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.cs deleted file mode 100644 index 1a8f390..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; - -namespace NPetshop.Web.UserControls.Billing -{ - /// - /// Summary description for Bill. - /// - public class Bill : NPetshopUC - { - protected BillUI ucBill; - - - private void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - ucBill.Order = this.NPetshopState.CurrentOrder; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Bill.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx deleted file mode 100644 index cd8cd8e..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx +++ /dev/null @@ -1,79 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="../Accounts/AddressUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="BillUI.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.BillUI" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="AddressStatic" Src="../Accounts/AddressStatic.ascx" %> -
- - Payment Information - - - - - - - - - - - - - -
Card Type::
Card Number:
Card Expiration:
-
-
- - Billing Address - -
-
- - Shipping Address - -
-
- - Status - - - - - - - - - - - - - -
Date:
Items: - - - - - - - - - - - - - - - - - - - - - - - -
LineItemProductPriceQuantitySubtotal
<%# DataBinder.Eval(Container.DataItem, "LineNumber") %><%# DataBinder.Eval(Container.DataItem, "Item.Id") %><%# DataBinder.Eval(Container.DataItem, "Item.Product.Id") %><%# DataBinder.Eval(Container.DataItem, "Item.ListPrice", "{0:c}") %><%# DataBinder.Eval(Container.DataItem, "Quantity") %><%# DataBinder.Eval(Container.DataItem, "Total", "{0:c}") %>
-
Total: - - - -
-
-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs deleted file mode 100644 index fffae4d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.cs +++ /dev/null @@ -1,71 +0,0 @@ -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Billing; - - /// - /// Summary description for BillUI. - /// - public class BillUI : NPetshopUC - { - protected System.Web.UI.WebControls.Literal LiteralCardNumber; - protected System.Web.UI.WebControls.Literal LiteralCardExpiration; - protected System.Web.UI.WebControls.Literal LiteralCardType; - protected System.Web.UI.WebControls.Literal LiteralOrderDate; - protected NPetshop.Web.UserControls.Accounts.AddressStatic billingAddress; - protected System.Web.UI.WebControls.Literal LiteralTotal; - protected System.Web.UI.WebControls.Repeater RepeaterItems; - protected NPetshop.Web.UserControls.Accounts.AddressStatic shippingAddress; - - public Order Order - { - set - { - LiteralCardNumber.Text = value.CreditCard.CardNumber; - LiteralCardExpiration.Text = value.CreditCard.CardExpiration; - LiteralCardType.Text = value.CreditCard.CardType; - - LiteralOrderDate.Text = value.OrderDate.ToShortDateString(); - - billingAddress.Address = value.BillingAddress; - shippingAddress.Address = value.ShippingAddress; - - RepeaterItems.DataSource = value.LineItems; - RepeaterItems.DataBind(); - LiteralTotal.Text = value.TotalPrice.ToString("c"); - } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/BillUI.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx deleted file mode 100644 index c9f9988..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx +++ /dev/null @@ -1,19 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="BillUI" Src="BillUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Confirmation.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Confirmation" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Please confirm the information below and then press continue... -

- - - - - -
- -
-

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs deleted file mode 100644 index 7b67b7a..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.cs +++ /dev/null @@ -1,68 +0,0 @@ -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Summary description for Confirmation. - /// - public class Confirmation : NPetshopUC - { - protected System.Web.UI.WebControls.Button ButtonContinue; - protected NPetshop.Web.UserControls.Billing.BillUI ucBill; - private BillingController _billingController = null; - - public BillingController BillingController - { - set { _billingController = value; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - if (!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - ucBill.Order = this.NPetshopState.CurrentOrder; - } - - - private void ButtonContinue_Click(object sender, System.EventArgs e) - { - _billingController.ConfirmOrder(this.NPetshopState.CurrentOrder); - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.ButtonContinue.Click += new System.EventHandler(this.ButtonContinue_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Confirmation.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx deleted file mode 100644 index 90b4629..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx +++ /dev/null @@ -1,91 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Payment.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Payment" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="../Accounts/AddressUI.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Payment Information -

-

- - Credit Card - - - - - - - - - - - - - -
Credit Card Type: - - Visa - MasterCard - American Express -
Card Number: - -
Expiration Date: - - - - - - - -
Month: - - 01 - 02 - 03 - 04 - 05 - 06 - 07 - 08 - 09 - 10 - 11 - 12 - Year: - - 2004 - 2005 - 2006 - 2007 - 2008 - -
-
-
-
- - Billing Address - -
-
- - Shipping Address - - - - - -
- Ship to billing address
-
- - - - - - - -
 
-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.cs deleted file mode 100644 index 3699454..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Domain.Billing; -using NPetshop.Presentation; -using NPetshop.Web.UserControls.Accounts; - -namespace NPetshop.Web.UserControls.Billing -{ - /// - /// Summary description for Order. - /// - public class Payment : NPetshopUC - { - protected RequiredFieldValidator valCardNumber; - protected DropDownList dropdownlistCardType; - protected TextBox textboxCardNumber; - protected DropDownList dropdownlistMonth; - protected DropDownList dropdownlistYear; - protected CheckBox checkboxShipBilling; - protected Button ButtonSubmit; - protected AddressUI ucBillingAddress; - private BillingController _billingController = null; - - public BillingController BillingController - { - set { _billingController = value; } - } - - public Order Order - { - get - { - Order order = new Order(this.NPetshopState.CurrentUser, - this.NPetshopState.CurrentShoppingCart, - ucBillingAddress.Address); - - CreditCard creditCard = new CreditCard(); - creditCard.CardExpiration = dropdownlistMonth.SelectedValue +"/"+ dropdownlistYear.SelectedValue; - creditCard.CardNumber = textboxCardNumber.Text; - creditCard.CardType = dropdownlistCardType.SelectedValue; - order.CreditCard = creditCard; - - return order; - } - set - { - - } - } - - private void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - if (this.NPetshopState.CurrentOrder == null) - { - ucBillingAddress.Address = this.NPetshopState.CurrentUser.Address; - } - else - { - ucBillingAddress.Address = this.NPetshopState.CurrentOrder.BillingAddress; - } - } - - private void ButtonSubmit_Click(object sender, EventArgs e) - { - _billingController.NewOrder(this.Order, checkboxShipBilling.Checked); - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.ButtonSubmit.Click += new EventHandler(this.ButtonSubmit_Click); - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Payment.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx deleted file mode 100644 index 4cba5d2..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx +++ /dev/null @@ -1,20 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="AddressUI" Src="../Accounts/AddressUI.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Shipping.ascx.cs" Inherits="NPetshop.Web.UserControls.Billing.Shipping" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - -
-

-

- - Shipping Address - -
- - - - - -
-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs deleted file mode 100644 index 1e9b111..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.cs +++ /dev/null @@ -1,68 +0,0 @@ -using NPetshop.Presentation; -using NPetshop.Web.UserControls.Accounts; - -namespace NPetshop.Web.UserControls.Billing -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - - /// - /// Summary description for Shipping. - /// - public class Shipping : NPetshopUC - { - protected System.Web.UI.WebControls.Button ButtonBack; - protected System.Web.UI.WebControls.Button ButtonSubmit; - protected AddressUI ucShippingAddress = null; - private BillingController _billingController = null; - - public BillingController BillingController - { - set { _billingController = value; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - private void ButtonBack_Click(object sender, System.EventArgs e) - { - _billingController.CancelShippingAddress(); - } - - private void ButtonSubmit_Click(object sender, System.EventArgs e) - { - _billingController.SubmitShippingAddress(ucShippingAddress.Address); - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.ButtonBack.Click += new System.EventHandler(this.ButtonBack_Click); - this.ButtonSubmit.Click += new System.EventHandler(this.ButtonSubmit_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Billing/Shipping.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx deleted file mode 100644 index 5da20bc..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx +++ /dev/null @@ -1,48 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Category.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Category" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Category -

- - - - - - - - - - - - - - - - - -
Product IDNameDescription
- <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Id %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Name %> - - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Description %> -
- -
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.cs deleted file mode 100644 index 910eaad..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.cs +++ /dev/null @@ -1,106 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using IBatisNet.Common.Pagination; -using NPetshop.Domain.Catalog; -using NPetshop.Presentation; - - -namespace NPetshop.Web.UserControls.Catalog -{ - /// - /// Description rsume de Category. - /// - public class Category : NPetshopUC - { - protected LinkButton LinkbuttonPrev; - protected Label LabelCategory; - protected Repeater RepeaterProducts; - protected LinkButton LinkbuttonNext; - private CatalogController _catalogController = null; - - public CatalogController CatalogController - { - set { _catalogController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - IPaginatedList productList = this.NPetshopState.CurrentList; - Domain.Catalog.Category category = ((Domain.Catalog.Product) productList[0]).Category; - - RepeaterProducts.DataSource = productList; - RepeaterProducts.DataBind(); - - if (productList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - LinkbuttonNext.CommandArgument = category.Id; - } - else - { - LinkbuttonNext.Visible = false; - } - if (productList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - LinkbuttonPrev.CommandArgument = category.Id; - } - else - { - LinkbuttonPrev.Visible = false; - } - - LabelCategory.Text = category.Name; - } - - protected void RepeaterProducts_ItemCommand(object source, RepeaterCommandEventArgs e) - { - _catalogController.ShowItemsByProduct(e.CommandArgument.ToString()); - } - - private void LinkbuttonPrev_Command(object source, CommandEventArgs e) - { - IPaginatedList productList = this.NPetshopState.CurrentList; - productList.PreviousPage(); - DataBind(); - } - - private void LinkbuttonNext_Command(object source, CommandEventArgs e) - { - IPaginatedList productList = this.NPetshopState.CurrentList; - productList.NextPage(); - DataBind(); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - this.LinkbuttonPrev.Command += new System.Web.UI.WebControls.CommandEventHandler(this.LinkbuttonPrev_Command); - this.LinkbuttonNext.Command += new System.Web.UI.WebControls.CommandEventHandler(this.LinkbuttonNext_Command); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Category.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx deleted file mode 100644 index f61476e..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx +++ /dev/null @@ -1,38 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Item.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Item" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> - - -
- Product -

- - - - - -
- - - - - - - - - - - - - - - - - - - -
Name :
Description :
Price :
Quantity :
-

Add to cart

-
-

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.cs deleted file mode 100644 index 1503ef6..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.cs +++ /dev/null @@ -1,77 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Catalog -{ - /// - /// Description rsume de Item. - /// - public class Item : NPetshopUC - { - protected Label LabelDescription; - protected Label LabelName; - protected Label LabelPrice; - protected LinkButton LinkButtonAddToCart; - protected Label LabelProduct; - protected Image ImagePhoto; - protected Label LabelQty; - private ShoppingController _shoppingController = null; - - public ShoppingController ShoppingController - { - set { _shoppingController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - Domain.Catalog.Item item = this.NPetshopState.CurrentObject as Domain.Catalog.Item; - if (item != null) - { - LabelProduct.Text = item.Product.Name; - LabelDescription.Text = item.Attribute1; - LabelPrice.Text = item.ListPrice.ToString(); - LabelQty.Text = item.Quantity.ToString(); - LabelName.Text = item.Id; - ImagePhoto.ImageUrl = ImagePhoto.ResolveUrl("~/@images/pets/"+item.Photo); - LinkButtonAddToCart.CommandArgument = item.Id; - } - } - - private void LinkButtonAddToCart_Click(object sender, CommandEventArgs e) - { - _shoppingController.AddItemToCart(e.CommandArgument.ToString()); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonAddToCart.Command += new CommandEventHandler(this.LinkButtonAddToCart_Click); - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Item.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx deleted file mode 100644 index 0eb0949..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx +++ /dev/null @@ -1 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="MyList.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.MyList" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs deleted file mode 100644 index 0ec923c..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de MyList. - /// - public class MyList : System.Web.UI.UserControl - { - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/MyList.ascx.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx deleted file mode 100644 index d83e3b5..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx +++ /dev/null @@ -1,50 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Product.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Product" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -
Product -

- - - - - - - - - - - - - - - - - - - -
Item IDDescriptionList Price 
- - <%# ((NPetshop.Domain.Catalog.Item)Container.DataItem).Id %> - - <%# ((NPetshop.Domain.Catalog.Item)Container.DataItem).Product.Description %> - <%# DataBinder.Eval(Container.DataItem, "ListPrice", "{0:c}") %> - - - Add to cart - -
- -
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.cs deleted file mode 100644 index 96ff4cf..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using IBatisNet.Common.Pagination; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Catalog -{ - /// - /// Summary description for Product. - /// - public class Product : NPetshopUC - { - protected Label LabelProduct; - protected Repeater RepeaterItems; - protected LinkButton LinkbuttonPrev; - protected LinkButton LinkbuttonNext; - private CatalogController _catalogController = null; - private ShoppingController _shoppingController = null; - - public ShoppingController ShoppingController - { - set { _shoppingController = value; } - } - - public CatalogController CatalogController - { - set { _catalogController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - if (!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - IPaginatedList itemList = this.NPetshopState.CurrentList as IPaginatedList; - Domain.Catalog.Product product = itemList[0] as Domain.Catalog.Product; - - foreach(Domain.Catalog.Item item in itemList) - { - product = item.Product; - } - - LabelProduct.Text = product.Name; - RepeaterItems.DataSource = itemList; - RepeaterItems.DataBind(); - - if (itemList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - LinkbuttonNext.CommandArgument = product.Id; - } - else - { - LinkbuttonNext.Visible = false; - } - if (itemList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - LinkbuttonPrev.CommandArgument = product.Id; - } - else - { - LinkbuttonPrev.Visible = false; - } - } - - protected void RepeaterItems_ItemCommand(object source, RepeaterCommandEventArgs e) - { - if (e.CommandName == "showItem") - { - _catalogController.ShowItem(e.CommandArgument.ToString()); - } - else if (e.CommandName == "addToCart") - { - _shoppingController.AddItemToCart(e.CommandArgument.ToString()); - } - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Product.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx deleted file mode 100644 index e32da19..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx +++ /dev/null @@ -1,4 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Search.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.Search" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -SEARCH diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.cs deleted file mode 100644 index 5592030..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.cs +++ /dev/null @@ -1,57 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Catalog -{ - /// - /// Description rsume de Search. - /// - public class Search : NPetshopUC - { - protected LinkButton LinkButtonSearch; - protected RequiredFieldValidator RequiredFieldValidatorKeyword; - protected TextBox TextBoxSearch; - private CatalogController _catalogController = null; - - public CatalogController CatalogController - { - set { _catalogController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - private void LinkButtonSearch_Click(object sender, EventArgs e) - { - string keywords = TextBoxSearch.Text; - - _catalogController.SearchProducts(keywords); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonSearch.Click += new EventHandler(this.LinkButtonSearch_Click); - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/Search.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx deleted file mode 100644 index ba2186c..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx +++ /dev/null @@ -1,49 +0,0 @@ -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Web.Controls" Assembly="NPetshop.Web" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SearchProduct.ascx.cs" Inherits="NPetshop.Web.UserControls.Catalog.SearchProduct" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - -
- Search result for keywords : - - -

- - - - - - - - - - - - - - - - - -
Product IDNameDescription
<%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Id %> - - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Name %> - <%# ((NPetshop.Domain.Catalog.Product)Container.DataItem).Description %>
-
No -product found !
-
- - - - - -
- Prev - - Next -
-

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs deleted file mode 100644 index a504464..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.cs +++ /dev/null @@ -1,108 +0,0 @@ -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Catalog -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using IBatisNet.Common.Pagination; - using NPetshop.Domain.Catalog; - - /// - /// Description rsume de SearchProduct. - /// - public class SearchProduct : NPetshopUC - { - protected System.Web.UI.WebControls.LinkButton LinkbuttonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.Literal LiteralKeywords; - protected NPetshop.Web.Controls.ExtendedRepeater RepeaterProduct; - protected System.Web.UI.WebControls.LinkButton LinkButtonProduct; - private CatalogController _catalogController = null; - - public CatalogController CatalogController - { - set { _catalogController = value; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - if (!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - IPaginatedList productList = this.NPetshopState.CurrentList; - string keywords = this.NPetshopState.CurrentObject as string; - - LiteralKeywords.Text = keywords; - RepeaterProduct.DataSource = productList; - RepeaterProduct.DataBind(); - - if (productList.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - } - else - { - LinkbuttonNext.Visible = false; - } - if (productList.IsPreviousPageAvailable) - { - LinkbuttonPrev.Visible = true; - } - else - { - LinkbuttonPrev.Visible = false; - } - - } - - protected void RepeaterProduct_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - _catalogController.ShowItemsByProduct(e.CommandArgument.ToString()); - } - - protected void LinkbuttonPrev_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.NPetshopState.CurrentList; - productList.PreviousPage(); - DataBind(); - } - - protected void LinkbuttonNext_Command(object source, System.Web.UI.WebControls.CommandEventArgs e) - { - IPaginatedList productList = this.NPetshopState.CurrentList; - productList.NextPage(); - DataBind(); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Catalog/SearchProduct.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx deleted file mode 100644 index 98f408f..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx +++ /dev/null @@ -1,51 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Error.ascx.cs" Inherits="NPetshop.Web.UserControls.Error" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - Error on page -
- Exception : - - -
- Error message : - - Label -
- Inner Error message : - - Label -
- Source : - - Label -
- View : - - Label -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.cs deleted file mode 100644 index 9ca01ca..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.cs +++ /dev/null @@ -1,55 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Presentation.Core; - using NPetshop.Presentation.UserActions; - - /// - /// Description rsume de Error. - /// - public class Error : NPetshop.Presentation.UserControl - { - protected System.Web.UI.WebControls.Label LabelException; - protected System.Web.UI.WebControls.Label LabelErrorMessage; - protected System.Web.UI.WebControls.Label LabelSourceError; - protected System.Web.UI.WebControls.Label LabelInnerErrorMessage; - protected System.Web.UI.WebControls.Label LabelViewOnError; - - private void Page_Load(object sender, System.EventArgs e) - { - LabelException.Text = HttpContext.Current.Items["stackTrace"].ToString(); - LabelErrorMessage.Text = HttpContext.Current.Items["messageError"].ToString(); - LabelSourceError.Text = HttpContext.Current.Items["sourceError"].ToString(); - LabelViewOnError.Text = HttpContext.Current.Items["errorView"].ToString(); - LabelInnerErrorMessage.Text = HttpContext.Current.Items["innerMessageError"].ToString(); - - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Error.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx deleted file mode 100644 index 7982b57..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx +++ /dev/null @@ -1,2 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Footer.ascx.cs" Inherits="NPetshop.Web.UserControls.Footer" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> -
2004-2005 Gilles Bayon. All rights reserved.
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.cs deleted file mode 100644 index ab3646c..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.cs +++ /dev/null @@ -1,41 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de Footer. - /// - public class Footer : System.Web.UI.UserControl - { - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Footer.ascx.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx deleted file mode 100644 index b7c8d0b..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx +++ /dev/null @@ -1,9 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Header.ascx.cs" Inherits="NPetshop.Web.UserControls.Header" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - -

- -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.cs deleted file mode 100644 index 3d03e1a..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.cs +++ /dev/null @@ -1,46 +0,0 @@ -namespace NPetshop.Web.UserControls -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - /// - /// Description rsume de Header. - /// - public class Header : System.Web.UI.UserControl - { - protected System.Web.UI.HtmlControls.HtmlImage space0; - protected System.Web.UI.HtmlControls.HtmlImage space1; - protected System.Web.UI.WebControls.Image Image1; - protected System.Web.UI.HtmlControls.HtmlImage title; - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.resx deleted file mode 100644 index b8f94b8..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Header.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - False - - - Private - - - True - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/NPetshopUC.cs b/Examples/npetshop2/NPetshop.Web/UserControls/NPetshopUC.cs deleted file mode 100644 index c91b611..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/NPetshopUC.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -using Castle.MVC.Views; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls -{ - /// - /// An NPetshop User Control - /// - public class NPetshopUC : WebUserControlView - { - /// - /// Get user context. - /// - public NPetshopState NPetshopState - { - get - { - return this.State as NPetshopState; - } - } - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx deleted file mode 100644 index 6606ea6..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx +++ /dev/null @@ -1,63 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Web.Controls" Assembly="NPetshop.Web" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Cart.ascx.cs" Inherits="NPetshop.Web.UserControls.Shopping.Cart" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - -
- Shopping Cart -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 ItemProductIn StockPriceQuantitySubtotal
- - Remove - - - <%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Id %> - <%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Product.Name %><%# DataBinder.Eval(Container.DataItem, "IsInStock") %><%# DataBinder.Eval(Container.DataItem, "Item.ListPrice", "{0:c}") %> - - - <%# DataBinder.Eval(Container.DataItem, "Total", "{0:c}") %>
- Total:<%= Total.ToString("c") %>
- -

No item in cart ! - - - - - - - - - -
<< PrevNext >>
Proceed to Checkout >>
-

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs deleted file mode 100644 index 664ce1d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.cs +++ /dev/null @@ -1,163 +0,0 @@ -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls.Shopping -{ - using System; - using System.Data; - using System.Drawing; - using System.Web; - using System.Web.UI.WebControls; - using System.Web.UI.HtmlControls; - - using NPetshop.Domain.Shopping; - - /// - /// Description rsume de Cart. - /// - public class Cart : NPetshopUC - { - protected System.Web.UI.WebControls.Literal LiteralTotal; - protected NPetshop.Web.Controls.ExtendedRepeater RepeaterCart; - protected System.Web.UI.WebControls.LinkButton LinkButtonPrev; - protected System.Web.UI.WebControls.LinkButton LinkbuttonNext; - protected System.Web.UI.WebControls.LinkButton LinkbuttonProceedCheckout; - protected System.Web.UI.WebControls.LinkButton LinkButtonRemove; - protected System.Web.UI.WebControls.LinkButton LinkButtonItem; - protected System.Web.UI.WebControls.TextBox TextboxQuantity; - protected System.Web.UI.WebControls.RegularExpressionValidator valInteger; - protected System.Web.UI.WebControls.LinkButton LinkButtonUpdateCart; - private ShoppingCart _cart = null; - private ShoppingController _shoppingController = null; - private CatalogController _catalogController = null; - - public ShoppingController ShoppingController - { - set { _shoppingController = value; } - } - - public CatalogController CatalogController - { - set { _catalogController = value; } - - } - //Property to show total - protected decimal Total - { - get { return _cart.Total; } - } - - private void Page_Load(object sender, System.EventArgs e) - { - _cart = this.NPetshopState.CurrentShoppingCart; - if(!IsPostBack) - { - DataBind(); - } - } - - public override void DataBind() - { - bool empty = ((_cart == null) || _cart.IsEmpty); - if (! empty) - { - RepeaterCart.DataSource = _cart; - RepeaterCart.DataBind(); - - if (_cart.Lines.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - } - else - { - LinkbuttonNext.Visible = false; - } - if (_cart.Lines.IsPreviousPageAvailable) - { - LinkButtonPrev.Visible = true; - } - else - { - LinkButtonPrev.Visible = false; - } - } - else - { - LinkbuttonNext.Visible = false; - LinkButtonPrev.Visible = false; - LinkbuttonProceedCheckout.Visible = false; - } - } - - protected void QuantityChanged(object o, System.EventArgs e) - { - Page.Validate(); - if (Page.IsValid) - { - TextBox textboxQuantity = o as System.Web.UI.WebControls.TextBox; - LinkButton linkButtonRemove = textboxQuantity.Parent.FindControl("LinkButtonRemove") as LinkButton; - - int quantity = int.Parse(textboxQuantity.Text); - string itemId = linkButtonRemove.CommandArgument.ToString(); - - _shoppingController.UpdateQuantityByItemId(itemId, quantity); - } - } - - protected void RepeaterCart_ItemCommand(object source, System.Web.UI.WebControls.RepeaterCommandEventArgs e) - { - if (e.CommandName == "removeItem") - { - _shoppingController.RemoveItemFromCart(e.CommandArgument.ToString()); - } - else if (e.CommandName == "update") - { - DataBind(); - } - else if (e.CommandName == "showItem") - { - _catalogController.ShowItem( e.CommandArgument.ToString() ); - } - } - - private void LinkButtonPrev_Click(object sender, System.EventArgs e) - { - _cart.Lines.PreviousPage(); - } - - private void LinkbuttonNext_Click(object sender, System.EventArgs e) - { - _cart.Lines.NextPage(); - } - - private void LinkbuttonProceedCheckout_Click(object sender, System.EventArgs e) - { - _shoppingController.ProceedCheckout(); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.LinkButtonPrev.Click += new System.EventHandler(this.LinkButtonPrev_Click); - this.LinkbuttonNext.Click += new System.EventHandler(this.LinkbuttonNext_Click); - this.LinkbuttonProceedCheckout.Click += new System.EventHandler(this.LinkbuttonProceedCheckout_Click); - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Cart.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx deleted file mode 100644 index f199b83..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx +++ /dev/null @@ -1,50 +0,0 @@ -<%@ Register TagPrefix="cc1" Namespace="NPetshop.Web.Controls" Assembly="NPetshop.Web" %> -<%@ Register TagPrefix="uc1" TagName="TopBar" Src="../TopBar.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Banner" Src="../Banner.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="Checkout.ascx.cs" Inherits="NPetshop.Web.UserControls.Shopping.Checkout" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - -
- Checkout Summary -

- - - - - - - - - - - - - - - - - - - - - - - - - - -
Item IDProductIn StockPriceQuantitySubtotal
<%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Id %><%# ((NPetshop.Domain.Shopping.ShoppingCartLine)Container.DataItem).Item.Product.Name %><%# DataBinder.Eval(Container.DataItem, "IsInStock") %><%# DataBinder.Eval(Container.DataItem, "Item.ListPrice", "{0:c}") %><%# DataBinder.Eval(Container.DataItem, "Quantity") %><%# DataBinder.Eval(Container.DataItem, "Total", "{0:c}") %>
Total:<%= Total.ToString("c") %>
- -

No item in cart ! - - - - - - - - - -
<< PrevNext >>
Continue Checkout >>
-

-
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs deleted file mode 100644 index 52c3529..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.cs +++ /dev/null @@ -1,114 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Domain.Shopping; -using NPetshop.Presentation; -using NPetshop.Web.Controls; - -namespace NPetshop.Web.UserControls.Shopping -{ - /// - /// Summary description for Checkout. - /// - public class Checkout : NPetshopUC - { - protected ExtendedRepeater RepeaterCart; - protected LinkButton LinkButtonPrev; - protected LinkButton LinkbuttonNext; - protected LinkButton LinkbuttonContinueCheckout; - private ShoppingCart _cart = null; - private ShoppingController _shoppingController = null; - - public ShoppingController ShoppingController - { - set { _shoppingController = value; } - } - - //Property to show total - protected decimal Total - { - get { return _cart.Total; } - } - - private void Page_Load(object sender, EventArgs e) - { - _cart = this.NPetshopState.CurrentShoppingCart; - DataBind(); - } - - public override void DataBind() - { - bool empty = ((_cart == null) || _cart.IsEmpty); - if (! empty) - { - RepeaterCart.DataSource = _cart; - RepeaterCart.DataBind(); - - if (_cart.Lines.IsNextPageAvailable) - { - LinkbuttonNext.Visible = true; - } - else - { - LinkbuttonNext.Visible = false; - } - if (_cart.Lines.IsPreviousPageAvailable) - { - LinkButtonPrev.Visible = true; - } - else - { - LinkButtonPrev.Visible = false; - } - } - else - { - LinkbuttonNext.Visible = false; - LinkButtonPrev.Visible = false; - LinkbuttonContinueCheckout.Visible = false; - } - } - private void LinkbuttonContinueCheckout_Click(object sender, EventArgs e) - { - _shoppingController.ContinueCheckout(); - } - - private void LinkButtonPrev_Click(object sender, EventArgs e) - { - _cart.Lines.PreviousPage(); -// this.CurrentController.NextView = WebViews.CART; - } - - private void LinkbuttonNext_Click(object sender, EventArgs e) - { - _cart.Lines.NextPage(); -// this.CurrentController.NextView = WebViews.CART; - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.LinkButtonPrev.Click += new EventHandler(this.LinkButtonPrev_Click); - this.LinkbuttonNext.Click += new EventHandler(this.LinkbuttonNext_Click); - this.LinkbuttonContinueCheckout.Click += new EventHandler(this.LinkbuttonContinueCheckout_Click); - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/Shopping/Checkout.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx deleted file mode 100644 index 831eca3..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx +++ /dev/null @@ -1,40 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="SideBar.ascx.cs" Inherits="NPetshop.Web.UserControls.SideBar" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - - - -
- Fish
-   Saltwater
-   Freshwater

-
- Dogs
-   Poodle
-   Greyhounds

-
- Reptiles
-   Iguanas
-   Snakes
-   Turtles

-
- Cats
-   Manx
-   Persian

-
- Birds
-   Eclectus
-   African Greys
-   Macaws
-

-
-
- -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.cs deleted file mode 100644 index 012431a..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.cs +++ /dev/null @@ -1,56 +0,0 @@ -using System; -using System.Web.UI.WebControls; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls -{ - /// - /// Description rsume de SideBar. - /// - public class SideBar : NPetshopUC - { - protected LinkButton Linkbutton1; - protected LinkButton Linkbutton2; - protected LinkButton Linkbutton3; - protected LinkButton Linkbutton4; - protected LinkButton LinkbuttonFish; - private CatalogController _catalogController = null; - - public CatalogController CatalogController - { - set { _catalogController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public void LinkButton_Command(object sender, CommandEventArgs e) - { - _catalogController.ShowProductsByCategory(e.CommandArgument.ToString()); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/SideBar.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx deleted file mode 100644 index 00f4032..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx +++ /dev/null @@ -1,26 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="SideBar" Src="SideBar.ascx" %> -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="StartUp.ascx.cs" Inherits="NPetshop.Web.UserControls.StartUp" TargetSchema="http://schemas.microsoft.com/intellisense/ie5" %> - - - - - -
- - - - Birds - Fish - Dogs - Reptiles - Cats - Birds - Pet Selection Map -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.cs deleted file mode 100644 index 312ed9e..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.cs +++ /dev/null @@ -1,54 +0,0 @@ -using System; -using System.Web.UI.HtmlControls; - -using Castle.MVC.Controllers; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls -{ - /// - /// Summary description for Initial. - /// - public class StartUp : NPetshopUC - { - protected HtmlImage Img1; - private CatalogController _catalogController = null; - - public CatalogController CatalogController - { - set { _catalogController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - if (IsPostBack && this.Request.Form["__EVENTTARGET"]=="checkMap") - { - this.State.Command = "showCategory"; - _catalogController.ShowProductsByCategory(Request.Form["__EVENTARGUMENT"]); - } - } - - #region Web Form Designer generated code - - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/StartUp.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx b/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx deleted file mode 100644 index 5583d45..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx +++ /dev/null @@ -1,21 +0,0 @@ -<%@ Control Language="c#" AutoEventWireup="false" Codebehind="TopBar.ascx.cs" Inherits="NPetshop.Web.UserControls.TopBar" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%> - - - - - -
- - Fish  |  - Dogs  |  - Reptiles  |  - Cats  |  - Birds - -
diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.cs b/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.cs deleted file mode 100644 index ece331c..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Web.UI.HtmlControls; -using System.Web.UI.WebControls; -using Castle.MVC.Controllers; -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls -{ - /// - /// Description rsume de TopBar. - /// - public class TopBar : NPetshopUC - { - protected LinkButton LinkbuttonFish; - protected LinkButton LinkbuttonDogs; - protected LinkButton LinkbuttonReptiles; - protected LinkButton LinkbuttonCats; - protected LinkButton LinkbuttonBirds; - protected HtmlImage Img1; - private CatalogController _catalogController = null; - - public CatalogController CatalogController - { - set { _catalogController = value; } - } - - private void Page_Load(object sender, EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - public void LinkButton_Command(object sender, CommandEventArgs e) - { - _catalogController.ShowProductsByCategory(e.CommandArgument.ToString()); - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.resx b/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.resx deleted file mode 100644 index 787145d..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/TopBar.ascx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - False - - - Private - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/UserControls/UserControl.cs b/Examples/npetshop2/NPetshop.Web/UserControls/UserControl.cs deleted file mode 100644 index 85a4777..0000000 --- a/Examples/npetshop2/NPetshop.Web/UserControls/UserControl.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; -using System.Configuration; - -using NPetshop.Presentation; - -namespace NPetshop.Web.UserControls -{ - /// - /// Summary description for UserControl. - /// - public class UserControl : System.Web.UI.UserControl - { - protected NPetshop.Web.Index currentRouter; - - public UserControl() - { - } - - /// - /// currentRouter - /// - public NPetshop.Web.Index CurrentRouter - { - get - { - return currentRouter; - } - set - { - this.currentRouter=value; - } - } - - public string GetNetxtView(string forwardName) - { - ControllerConfiguration config = (ControllerConfiguration) Context.Items["ControllerConfig"]; - return config.GetForwardAction( this.CurrentRouter.CurrentView, forwardName); - } - - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx b/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx deleted file mode 100644 index 0c73d11..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="AccountEdition" Src="../../UserControls/Accounts/AccountEdition.ascx" %> -<%@ Page language="c#" Codebehind="AccountEdition.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Account.AccountEdition" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> - - - - AccountEdition - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.cs deleted file mode 100644 index 76e466b..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Account -{ - /// - /// Summary description for AccountEdition. - /// - public class AccountEdition : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/AccountEdition.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx b/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx deleted file mode 100644 index 080ae99..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Page language="c#" Codebehind="Register.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Account.Register" %> -<%@ Register TagPrefix="uc1" TagName="NewAccount" Src="../../UserControls/Accounts/NewAccount.ascx" %> - - - - Register - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.cs deleted file mode 100644 index 6709a43..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Account -{ - /// - /// Summary description for Register. - /// - public class Register : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/Register.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx b/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx deleted file mode 100644 index 0e1a54d..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Page language="c#" Codebehind="SignIn.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Account.SignIn" %> -<%@ Register TagPrefix="uc1" TagName="SignIn" Src="../../UserControls/Accounts/SignIn.ascx" %> - - - - SignIn - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.cs deleted file mode 100644 index 8316210..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Account -{ - /// - /// Summary description for SignIn. - /// - public class SignIn : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/SignIn.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx b/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx deleted file mode 100644 index 9f65343..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="SignOut" Src="../../UserControls/Accounts/SignOut.ascx" %> -<%@ Page language="c#" Codebehind="SignOut.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Account.SignOut" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> - - - - SignOut - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.cs deleted file mode 100644 index b88f9c2..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Account -{ - /// - /// Summary description for SignOut. - /// - public class SignOut : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Account/SignOut.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx deleted file mode 100644 index 80f7381..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Bill" Src="../../UserControls/Billing/Bill.ascx" %> -<%@ Page language="c#" Codebehind="Billing.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Billing.Billing" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> - - - - Billing - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.cs deleted file mode 100644 index 6027538..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Billing -{ - /// - /// Summary description for Billing. - /// - public class Billing : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Billing.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx deleted file mode 100644 index 4d1e58d..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Page language="c#" Codebehind="Confirmation.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Billing.Confirmation" %> -<%@ Register TagPrefix="uc1" TagName="Confirmation" Src="../../UserControls/Billing/Confirmation.ascx" %> - - - - Confirmation - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.cs deleted file mode 100644 index c38654f..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Billing -{ - /// - /// Summary description for Confirmation. - /// - public class Confirmation : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Confirmation.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx deleted file mode 100644 index cf54439..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Payment" Src="../../UserControls/Billing/Payment.ascx" %> -<%@ Page language="c#" Codebehind="Payment.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Billing.Payment" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> - - - - Payment - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.cs deleted file mode 100644 index d372444..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace NPetshop.Web.Views.Billing -{ - /// - /// Summary description for Payment. - /// - public class Payment : NPetshopView - { - private void Page_Load(object sender, EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Payment.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx deleted file mode 100644 index 60a08d9..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Page language="c#" Codebehind="Shipping.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Billing.Shipping" %> -<%@ Register TagPrefix="uc1" TagName="Shipping" Src="../../UserControls/Billing/Shipping.ascx" %> - - - - Shipping - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.cs deleted file mode 100644 index eebc87c..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Billing -{ - /// - /// Summary description for Shipping. - /// - public class Shipping : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Billing/Shipping.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx deleted file mode 100644 index a789dea..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Category" Src="../../UserControls/Catalog/Category.ascx" %> -<%@ Page language="c#" Codebehind="Category.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Catalog.Category" %> - - - - Category - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.cs deleted file mode 100644 index 67aa7a8..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.cs +++ /dev/null @@ -1,47 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - - -namespace NPetshop.Web.Views.Catalog -{ - /// - /// Description rsume de Category. - /// - public class Category : NPetshopView - { - - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Category.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx deleted file mode 100644 index 67417c6..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Page language="c#" Codebehind="Item.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Catalog.Item" %> -<%@ Register TagPrefix="uc1" TagName="Item" Src="../../UserControls/Catalog/Item.ascx" %> - - - - Item - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.cs deleted file mode 100644 index 8538a1a..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Catalog -{ - /// - /// Description rsume de Item. - /// - public class Item : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Item.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx deleted file mode 100644 index 66149c0..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Product" Src="../../UserControls/Catalog/Product.ascx" %> -<%@ Page language="c#" Codebehind="Product.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Catalog.Product" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> - - - - Product - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.cs deleted file mode 100644 index ae35921..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Catalog -{ - /// - /// Description rsume de Product. - /// - public class Product : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/Product.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx deleted file mode 100644 index 9480152..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="SearchProduct" Src="../../UserControls/Catalog/SearchProduct.ascx" %> -<%@ Page language="c#" Codebehind="SearchProduct.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Catalog.SearchProduct" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> - - - - SearchProduct - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.cs deleted file mode 100644 index ef4072c..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Web; -using System.Web.SessionState; -using System.Web.UI; -using System.Web.UI.WebControls; -using System.Web.UI.HtmlControls; - -namespace NPetshop.Web.Views.Catalog -{ - /// - /// Description rsume de SearchProduct. - /// - public class SearchProduct : NPetshopView - { - private void Page_Load(object sender, System.EventArgs e) - { - // Placer ici le code utilisateur pour initialiser la page - } - - #region Code gnr par le Concepteur Web Form - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: Cet appel est requis par le Concepteur Web Form ASP.NET. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Mthode requise pour la prise en charge du concepteur - ne modifiez pas - /// le contenu de cette mthode avec l'diteur de code. - /// - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Catalog/SearchProduct.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/NPetshopView.cs b/Examples/npetshop2/NPetshop.Web/Views/NPetshopView.cs deleted file mode 100644 index 7646201..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/NPetshopView.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; - -using Castle.MVC.Views; -using NPetshop.Presentation; - -namespace NPetshop.Web.Views -{ - /// - /// An NPetshop view. - /// - public class NPetshopView : WebFormView - { - public NPetshopView() - { - this.Load+=new EventHandler(this.NPetshopView_Load); - } - - private void NPetshopView_Load(object sender, EventArgs e) - { - this.RegisterClientScriptBlock("basefix", ""); - } - - /// - /// Get user context. - /// - public NPetshopState NPetshopState - { - get - { - return this.State as NPetshopState; - } - } - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx b/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx deleted file mode 100644 index 608bb8c..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Cart" Src="../../UserControls/Shopping/Cart.ascx" %> -<%@ Page language="c#" Codebehind="Cart.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Shopping.Cart" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> - - - - Cart - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.cs deleted file mode 100644 index 770809d..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace NPetshop.Web.Views.Shopping -{ - /// - /// Summary description for Cart. - /// - public class Cart : NPetshopView - { - private void Page_Load(object sender, EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Cart.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx b/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx deleted file mode 100644 index 4ad271e..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="Header" Src="../../UserControls/Header.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../../UserControls/Footer.ascx" %> -<%@ Page language="c#" Codebehind="Checkout.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views.Shopping.Checkout" %> -<%@ Register TagPrefix="uc1" TagName="Checkout" Src="../../UserControls/Shopping/Checkout.ascx" %> - - - - Checkout - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.cs deleted file mode 100644 index b384761..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace NPetshop.Web.Views.Shopping -{ - /// - /// Summary description for Checkout. - /// - public class Checkout : NPetshopView - { - private void Page_Load(object sender, EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/Shopping/Checkout.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Views/default.aspx b/Examples/npetshop2/NPetshop.Web/Views/default.aspx deleted file mode 100644 index 4c55757..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/default.aspx +++ /dev/null @@ -1,25 +0,0 @@ -<%@ Register TagPrefix="uc1" TagName="StartUp" Src="../UserControls/StartUp.ascx" %> -<%@ Register TagPrefix="uc1" TagName="Footer" Src="../UserControls/Footer.ascx" %> -<%@ Page language="c#" Codebehind="default.aspx.cs" AutoEventWireup="false" Inherits="NPetshop.Web.Views._default" %> -<%@ Register TagPrefix="uc1" TagName="Header" Src="../UserControls/Header.ascx" %> - - - - default - - - - - - - - -
- -
- -
- -
- - diff --git a/Examples/npetshop2/NPetshop.Web/Views/default.aspx.cs b/Examples/npetshop2/NPetshop.Web/Views/default.aspx.cs deleted file mode 100644 index ed8a8b7..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/default.aspx.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; - -namespace NPetshop.Web.Views -{ - /// - /// Summary description for _default. - /// - public class _default : NPetshopView - { - private void Page_Load(object sender, EventArgs e) - { - // Put user code to initialize the page here - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent(); - base.OnInit(e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.Load += new EventHandler(this.Page_Load); - - } - #endregion - } -} diff --git a/Examples/npetshop2/NPetshop.Web/Views/default.aspx.resx b/Examples/npetshop2/NPetshop.Web/Views/default.aspx.resx deleted file mode 100644 index e38bff3..0000000 --- a/Examples/npetshop2/NPetshop.Web/Views/default.aspx.resx +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.3 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - True - - - Private - - - False - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/Web.config b/Examples/npetshop2/NPetshop.Web/Web.config deleted file mode 100644 index 2e308ad..0000000 --- a/Examples/npetshop2/NPetshop.Web/Web.config +++ /dev/null @@ -1,191 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/npetshop2/NPetshop.Web/properties.config b/Examples/npetshop2/NPetshop.Web/properties.config deleted file mode 100644 index bbae3b4..0000000 --- a/Examples/npetshop2/NPetshop.Web/properties.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.Web/readme.txt b/Examples/npetshop2/NPetshop.Web/readme.txt deleted file mode 100644 index 814a572..0000000 --- a/Examples/npetshop2/NPetshop.Web/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ - -Home page -http://localhost/NPetshop.Web/Views/default.aspx \ No newline at end of file diff --git a/Examples/npetshop2/NPetshop.sln b/Examples/npetshop2/NPetshop.sln deleted file mode 100644 index 72b0ecc..0000000 --- a/Examples/npetshop2/NPetshop.sln +++ /dev/null @@ -1,61 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Presentation", "NPetshop.Presentation\NPetshop.Presentation.csproj", "{182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Service", "NPetshop.Service\NPetshop.Service.csproj", "{AFD8E8A6-C647-4107-B069-DE24C617CFA7}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Domain", "NPetshop.Domain\NPetshop.Domain.csproj", "{7D1DA776-6341-43C8-B9C7-8FA344996665}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Persistence", "NPetshop.Persistence\NPetshop.Persistence.csproj", "{CD60B882-160E-4BC9-A580-3A8079A60499}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Web", "http://localhost/NPetshop.Web/NPetshop.Web.csproj", "{C0EE0335-5733-409B-B4E3-59C3B9799731}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NPetshop.Test", "NPetshop.Test\NPetshop.Test.csproj", "{BD25CBA1-38E2-4BD1-A32B-6632B55C938B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Debug.ActiveCfg = Debug|.NET - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Debug.Build.0 = Debug|.NET - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Release.ActiveCfg = Release|.NET - {182B5E6F-CAFA-42A6-B0EA-8782F2F3A48A}.Release.Build.0 = Release|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Debug.ActiveCfg = Debug|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Debug.Build.0 = Debug|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Release.ActiveCfg = Release|.NET - {AFD8E8A6-C647-4107-B069-DE24C617CFA7}.Release.Build.0 = Release|.NET - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Debug.ActiveCfg = Debug|.NET - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Debug.Build.0 = Debug|.NET - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Release.ActiveCfg = Release|.NET - {7D1DA776-6341-43C8-B9C7-8FA344996665}.Release.Build.0 = Release|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Debug.ActiveCfg = Debug|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Debug.Build.0 = Debug|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Release.ActiveCfg = Release|.NET - {CD60B882-160E-4BC9-A580-3A8079A60499}.Release.Build.0 = Release|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Debug.ActiveCfg = Debug|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Debug.Build.0 = Debug|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Release.ActiveCfg = Release|.NET - {C0EE0335-5733-409B-B4E3-59C3B9799731}.Release.Build.0 = Release|.NET - {BD25CBA1-38E2-4BD1-A32B-6632B55C938B}.Debug.ActiveCfg = Debug|.NET - {BD25CBA1-38E2-4BD1-A32B-6632B55C938B}.Debug.Build.0 = Debug|.NET - {BD25CBA1-38E2-4BD1-A32B-6632B55C938B}.Release.ActiveCfg = Release|.NET - {BD25CBA1-38E2-4BD1-A32B-6632B55C938B}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/Examples/tutorial/Build-chm.bat b/Examples/tutorial/Build-chm.bat deleted file mode 100644 index 6ec02b1..0000000 --- a/Examples/tutorial/Build-chm.bat +++ /dev/null @@ -1,5 +0,0 @@ -xsltproc --nonet tutorial.xsl iBatisTutorial.xml - -hhc htmlhelp.hhp - -pause \ No newline at end of file diff --git a/Examples/tutorial/Model/Helper.cs b/Examples/tutorial/Model/Helper.cs deleted file mode 100644 index 6680ed8..0000000 --- a/Examples/tutorial/Model/Helper.cs +++ /dev/null @@ -1,16 +0,0 @@ -using IBatisNet.DataMapper; - -namespace iBatisTutorial.Model -{ - /// - /// Base class for Helper objects (*Helper). - /// Provides shared utility methods. - /// - public abstract class Helper - { - public SqlMapper Mapper () - { - return IBatisNet.DataMapper.Mapper.Instance (); - } - } -} \ No newline at end of file diff --git a/Examples/tutorial/Model/Helpers.cs b/Examples/tutorial/Model/Helpers.cs deleted file mode 100644 index 3a68b52..0000000 --- a/Examples/tutorial/Model/Helpers.cs +++ /dev/null @@ -1,23 +0,0 @@ -namespace iBatisTutorial.Model -{ - /// - /// Singleton "controller" for Helper classes. - /// - public class Helpers - { - private static volatile PersonHelper _PersonHelper = null; - - public static PersonHelper Person () - { - if (_PersonHelper == null) - { - lock (typeof (PersonHelper)) - { - if (_PersonHelper == null) // double-check - _PersonHelper = new PersonHelper (); - } - } - return _PersonHelper; - } - } -} diff --git a/Examples/tutorial/Model/Model.csproj b/Examples/tutorial/Model/Model.csproj deleted file mode 100644 index 6ad83d7..0000000 --- a/Examples/tutorial/Model/Model.csproj +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/tutorial/Model/Model.csproj.user b/Examples/tutorial/Model/Model.csproj.user deleted file mode 100644 index 95b963b..0000000 --- a/Examples/tutorial/Model/Model.csproj.user +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/tutorial/Model/Person.cs b/Examples/tutorial/Model/Person.cs deleted file mode 100644 index 56d0ed4..0000000 --- a/Examples/tutorial/Model/Person.cs +++ /dev/null @@ -1,64 +0,0 @@ -using System; - -namespace iBatisTutorial.Model -{ - - /// - /// Business object representing a Person - /// entity in our problem domain. - /// - public class Person - { - /* - private string _Property; - public string Property - { - get { return _Property; } - set { _Property = value; } - } - */ - - private int _Id; - public int Id - { - get { return _Id; } - set { _Id = value; } - } - - private string _FirstName; - public string FirstName - { - get { return _FirstName; } - set { _FirstName = value; } - } - - private string _LastName; - public string LastName - { - get { return _LastName; } - set { _LastName = value; } - } - - private DateTime _BirthDate; - public DateTime BirthDate - { - get { return _BirthDate; } - set { _BirthDate = value; } - } - - private double _WeightInKilograms; - public double WeightInKilograms - { - get { return _WeightInKilograms; } - set { _WeightInKilograms = value; } - } - - private double _HeightInMeters; - public double HeightInMeters - { - get { return _HeightInMeters; } - set { _HeightInMeters = value; } - } - - } -} \ No newline at end of file diff --git a/Examples/tutorial/Model/PersonHelper.cs b/Examples/tutorial/Model/PersonHelper.cs deleted file mode 100644 index 280e835..0000000 --- a/Examples/tutorial/Model/PersonHelper.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Collections; - -namespace iBatisTutorial.Model -{ - /// - /// Helper class for Person entities. - /// - public class PersonHelper : Helper - { - public Person Select (int id) - { - return (Person) Mapper ().QueryForObject ("Select", id); - } - - public IList SelectAll () - { - return Mapper ().QueryForList ("Select", null); - } - - public int Insert (Person person) - { - Mapper ().Insert ("Insert", person); - // Insert is designed so that it can return the new key - // but we are not utilizing that feature here - return 1; - } - - public int Update (Person person) - { - return Mapper ().Update ("Update", person); - } - - public int Delete (int id) - { - return Mapper ().Delete ("Delete", id); - } - - } -} \ No newline at end of file diff --git a/Examples/tutorial/Model/PersonTest.cs b/Examples/tutorial/Model/PersonTest.cs deleted file mode 100644 index 4a98911..0000000 --- a/Examples/tutorial/Model/PersonTest.cs +++ /dev/null @@ -1,65 +0,0 @@ -using System.Collections; -using NUnit.Framework; - -namespace iBatisTutorial.Model -{ - /// - /// Tests to exercise Person and PersonHelper methods. - /// - [TestFixture] - public class PersonTest - { - [Test] - public void PersonList () - { - // try it - IList people = Helpers.Person ().SelectAll (); - - // test it - Assert.IsNotNull (people, "Person list not returned"); - Assert.IsTrue (people.Count > 0, "Person list is empty"); - Person person = (Person) people[0]; - Assert.IsNotNull (person, "Person not returned"); - } - - [Test] - public void PersonUpdate () - { - const string EXPECT = "Clinton"; - const string EDITED = "Notnilc"; - - // get it - Person person = Helpers.Person ().Select (1); - - // test it - Assert.IsNotNull (person, "Missing person"); - Assert.IsTrue (EXPECT.Equals (person.FirstName), "Mistaken identity"); - - //change it - person.FirstName = EDITED; - Helpers.Person ().Update (person); - - // get it again - person = Helpers.Person ().Select (1); - - // test it - Assert.IsTrue (EDITED.Equals (person.FirstName), "Same old, same old?"); - - // change it back - person.FirstName = EXPECT; - Helpers.Person ().Update (person); - } - - [Test] - public void PersonInsertDelete () - { - // insert it - Person person = new Person (); - person.Id = -1; - Helpers.Person ().Insert (person); - // delete it - int count = Helpers.Person ().Delete (person.Id); - Assert.IsTrue (count > 0, "Nothing to delete"); - } - } -} \ No newline at end of file diff --git a/Examples/tutorial/Model/Resources/PersonHelper.xml b/Examples/tutorial/Model/Resources/PersonHelper.xml deleted file mode 100644 index 6f2cb0b..0000000 --- a/Examples/tutorial/Model/Resources/PersonHelper.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into PERSON - (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, - PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) - values - (#Id#, #FirstName#, #LastName#, - #BirthDate#, #WeightInKilograms#, #HeightInMeters#) - - - - update PERSON set - PER_FIRST_NAME = #FirstName#, - PER_LAST_NAME = #LastName#, - PER_BIRTH_DATE = #BirthDate#, - PER_WEIGHT_KG = #WeightInKilograms#, - PER_HEIGHT_M = #HeightInMeters# - where PER_ID = #Id# - - - - delete from PERSON - where PER_ID = #value# - - - - - diff --git a/Examples/tutorial/Model/bin/Debug/properties.config b/Examples/tutorial/Model/bin/Debug/properties.config deleted file mode 100644 index 11ce9d8..0000000 --- a/Examples/tutorial/Model/bin/Debug/properties.config +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/Examples/tutorial/Model/bin/Debug/providers.config b/Examples/tutorial/Model/bin/Debug/providers.config deleted file mode 100644 index 992997a..0000000 --- a/Examples/tutorial/Model/bin/Debug/providers.config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - diff --git a/Examples/tutorial/Model/bin/Debug/sqlmap.config b/Examples/tutorial/Model/bin/Debug/sqlmap.config deleted file mode 100644 index 6589b4d..0000000 --- a/Examples/tutorial/Model/bin/Debug/sqlmap.config +++ /dev/null @@ -1,21 +0,0 @@ - - - -   -   - - - - - - - - - - - - - - - diff --git a/Examples/tutorial/README.txt b/Examples/tutorial/README.txt deleted file mode 100644 index a6d7530..0000000 --- a/Examples/tutorial/README.txt +++ /dev/null @@ -1,27 +0,0 @@ -Tutorial README.txt - -* Prerequisite: NUnit 2.1.x - -* Download the iBatisNet Tutorial. - - A zip file containing the Tutorial Visual Studio 2003 solution can be downloaded iBatisNet SourceForge project. - - * http://ibatisnet.sf.net/ - -* Extact the Tutorial to a likely location, such as "c:\projects\Apache\iBatisNet\". - -* Adjust the database location, if necessary. For simplicity, the application uses an Access database. If you use another path, edit the string: - -Data Source=C:\projects\Apache\iBatisNet\Tutorial\WebView\Resources\iBatisTutorial.mdb" - -to match the location of your project. - -* Set the WebView project for web sharing using the alias "iBatisTutorial". - - (Right-click for folder properties, press the Web Sharing tab, click Add, and enter "iBatisTutorial" for the alias.) - -* Open Visual Studio, start the application in Debug mode, and take the Tutorial for a spin. - - * If necessary, set WebView as the StartUp Project and set Default.aspx as the Start Page. - - * If you get an "Operation must use an updateable query" error, you may need to give the ASP.NET machine account Modify permissions for both the folder containing the database as well as the Access database file itself. Modify permissions are required for the folder since Access creates a locking database file (.ldbin the same directory as the Access .mdb file when a client is using the database. \ No newline at end of file diff --git a/Examples/tutorial/Tests/PersonTest.cs b/Examples/tutorial/Tests/PersonTest.cs deleted file mode 100644 index 92bfdd4..0000000 --- a/Examples/tutorial/Tests/PersonTest.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System.Collections; -using NUnit.Framework; - -namespace iBatisTutorial.Model -{ - [TestFixture] - public class PersonTest - { - [Test] - public void PersonList () - { - // try it - IList people = Helpers.Person ().SelectAll (); - - // test it - Assert.IsNotNull (people, "Person list not returned"); - Assert.IsTrue (people.Count > 0, "Person list is empty"); - Person person = (Person) people[0]; - Assert.IsNotNull (person, "Person not returned"); - } - - [Test] - public void PersonUpdate () - { - const string EXPECT = "Clinton"; - const string EDITED = "Notnilc"; - - // get it - Person person = new Person (); - person = Helpers.Person ().Select (1); - - // test it - Assert.IsNotNull (person, "Missing person"); - Assert.IsTrue (EXPECT.Equals (person.FirstName), "Mistaken identity"); - - //change it - person.FirstName = EDITED; - Helpers.Person ().Update (person); - - // get it again - person = Helpers.Person ().Select (1); - - // test it - Assert.IsTrue (EDITED.Equals (person.FirstName), "Same old, same old?"); - - // change it back - person.FirstName = EXPECT; - Helpers.Person ().Update (person); - } - - [Test] - public void PersonInsertDelete () - { - // insert it - Person person = new Person (); - person.Id = -1; - Helpers.Person ().Insert (person); - // delete it - int count = Helpers.Person ().Delete (person.Id); - Assert.IsTrue (count > 0, "Nothing to delete"); - } - } -} \ No newline at end of file diff --git a/Examples/tutorial/Tests/Resources/PersonHelper.xml b/Examples/tutorial/Tests/Resources/PersonHelper.xml deleted file mode 100644 index 33ab7b2..0000000 --- a/Examples/tutorial/Tests/Resources/PersonHelper.xml +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into PERSON - (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, - PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) - values - (#Id#, #FirstName#, #LastName#, - #BirthDate#, #WeightInKilograms#, #HeightInMeters#) - - - - update PERSON set - PER_FIRST_NAME = #FirstName#, - PER_LAST_NAME = #LastName#, - PER_BIRTH_DATE = #BirthDate#, - PER_WEIGHT_KG = #WeightInKilograms#, - PER_HEIGHT_M = #HeightInMeters# - where PER_ID = #Id# - - - - delete from PERSON - where PER_ID = #value# - - - - - diff --git a/Examples/tutorial/Tests/Tests.csproj b/Examples/tutorial/Tests/Tests.csproj deleted file mode 100644 index 3bded2e..0000000 --- a/Examples/tutorial/Tests/Tests.csproj +++ /dev/null @@ -1,112 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/tutorial/Tests/bin/Debug/iBatisTutorial.mdb b/Examples/tutorial/Tests/bin/Debug/iBatisTutorial.mdb deleted file mode 100644 index 4b2a7cdcfe67e1f4e867de21fc1f51370a547dae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118784 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 t+`5byj2nqtG|O98KSC^` - - - - - - - diff --git a/Examples/tutorial/Tests/bin/Debug/providers.config b/Examples/tutorial/Tests/bin/Debug/providers.config deleted file mode 100644 index 8a94349..0000000 --- a/Examples/tutorial/Tests/bin/Debug/providers.config +++ /dev/null @@ -1,102 +0,0 @@ - - - - - - - - - - - - diff --git a/Examples/tutorial/Tests/bin/Debug/sqlmap.config b/Examples/tutorial/Tests/bin/Debug/sqlmap.config deleted file mode 100644 index a9aea91..0000000 --- a/Examples/tutorial/Tests/bin/Debug/sqlmap.config +++ /dev/null @@ -1,24 +0,0 @@ - - - -   - - - - - - - - - - - - - - - - - - diff --git a/Examples/tutorial/WebView/AssemblyInfo.cs b/Examples/tutorial/WebView/AssemblyInfo.cs deleted file mode 100644 index 472109c..0000000 --- a/Examples/tutorial/WebView/AssemblyInfo.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System.Reflection; -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly : AssemblyTitle ("")] -[assembly : AssemblyDescription ("")] -[assembly : AssemblyConfiguration ("")] -[assembly : AssemblyCompany ("")] -[assembly : AssemblyProduct ("")] -[assembly : AssemblyCopyright ("")] -[assembly : AssemblyTrademark ("")] -[assembly : AssemblyCulture ("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly : AssemblyVersion ("1.0.*")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the "project output directory". The location of the project output -// directory is dependent on whether you are working with a local or web project. -// For local projects, the project output directory is defined as -// \obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// For web projects, the project output directory is defined as -// %HOMEPATH%\VSWebCache\\\obj\. -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly : AssemblyDelaySign (false)] -[assembly : AssemblyKeyFile ("")] -[assembly : AssemblyKeyName ("")] \ No newline at end of file diff --git a/Examples/tutorial/WebView/Forms/Person.aspx b/Examples/tutorial/WebView/Forms/Person.aspx deleted file mode 100644 index 6390e1a..0000000 --- a/Examples/tutorial/WebView/Forms/Person.aspx +++ /dev/null @@ -1,35 +0,0 @@ -<%@ Page language="c#" Codebehind="Person.aspx.cs" AutoEventWireup="false" Inherits="iBatisTutorial.Web.Forms.PersonPage" %> - - - - Person - - - - - - -
- -

Person List

- - - - - - - - - - -

-
-
- - diff --git a/Examples/tutorial/WebView/Forms/Person.aspx.cs b/Examples/tutorial/WebView/Forms/Person.aspx.cs deleted file mode 100644 index 5839b61..0000000 --- a/Examples/tutorial/WebView/Forms/Person.aspx.cs +++ /dev/null @@ -1,113 +0,0 @@ -using System; -using System.Web.UI; -using System.Web.UI.WebControls; -using iBatisTutorial.Model; - -namespace iBatisTutorial.Web.Forms -{ - public class PersonPage : Page - { - #region panel: List - - protected Panel pnlList; - protected DataGrid dgList; - protected Button btnAdd; - - private void List_Init () - { - btnAdd.Text = "Add New Person"; - this.btnAdd.Click += new EventHandler (List_Add); - } - - private void List_Load () - { - dgList.DataSource = Helpers.Person ().SelectAll (); - dgList.DataBind (); - } - - protected void List_Delete (object source, DataGridCommandEventArgs e) - { - int id = GetKey (dgList, e); - Helpers.Person ().Delete (id); - List_Load (); - } - - protected void List_Edit (object source, DataGridCommandEventArgs e) - { - dgList.EditItemIndex = e.Item.ItemIndex; - List_Load (); - } - - protected void List_Update (object source, DataGridCommandEventArgs e) - { - Person person = new Person (); - person.Id = GetKey (dgList, e); - person.FirstName = GetText (e, 0); - person.LastName = GetText (e, 1); - person.HeightInMeters = GetDouble (e, 2); - person.WeightInKilograms = GetDouble (e, 3); - Helpers.Person ().Update (person); - List_Cancel(source,e); // Almost a hack :) - } - - protected void List_Cancel (object source, DataGridCommandEventArgs e) - { - dgList.EditItemIndex = -1; - List_Load (); - } - - private int GetKey (DataGrid dg, DataGridCommandEventArgs e) - { - return (Int32) dg.DataKeys[e.Item.DataSetIndex]; - } - - private string GetText (DataGridCommandEventArgs e, int v) - { - return ((TextBox) e.Item.Cells[v].Controls[0]).Text; - } - - private double GetDouble (DataGridCommandEventArgs e, int v) - { - return Convert.ToDouble (GetText (e, v)); - } - - protected void List_Add (object source, EventArgs e) - { - Person person = new Person (); - person.FirstName = "--New Person--"; - Helpers.Person ().Insert (person); - List_Load (); - } - - #endregion - - private void Page_Load (object sender, EventArgs e) - { - List_Init (); - if (!IsPostBack) - List_Load (); - } - - #region Web Form Designer generated code - - protected override void OnInit (EventArgs e) - { - // - // CODEGEN: This call is required by the ASP.NET Web Form Designer. - // - InitializeComponent (); - base.OnInit (e); - } - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent () - { - this.Load += new EventHandler (this.Page_Load); - } - - #endregion - } -} \ No newline at end of file diff --git a/Examples/tutorial/WebView/Forms/Person.aspx.resx b/Examples/tutorial/WebView/Forms/Person.aspx.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/tutorial/WebView/Forms/Person.aspx.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/tutorial/WebView/Global.asax b/Examples/tutorial/WebView/Global.asax deleted file mode 100644 index 9c2693e..0000000 --- a/Examples/tutorial/WebView/Global.asax +++ /dev/null @@ -1 +0,0 @@ -<%@ Application Codebehind="Global.asax.cs" Inherits="iBatisTutorial.Global" %> diff --git a/Examples/tutorial/WebView/Global.asax.cs b/Examples/tutorial/WebView/Global.asax.cs deleted file mode 100644 index 4ad2670..0000000 --- a/Examples/tutorial/WebView/Global.asax.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.ComponentModel; -using System.Web; - -namespace iBatisTutorial -{ - /// - /// Summary description for Global. - /// - public class Global : HttpApplication - { - /// - /// Required designer variable. - /// - private IContainer components = null; - - public Global () - { - InitializeComponent (); - } - - protected void Application_Start (Object sender, EventArgs e) - { - } - - protected void Session_Start (Object sender, EventArgs e) - { - } - - protected void Application_BeginRequest (Object sender, EventArgs e) - { - } - - protected void Application_EndRequest (Object sender, EventArgs e) - { - } - - protected void Application_AuthenticateRequest (Object sender, EventArgs e) - { - } - - protected void Application_Error (Object sender, EventArgs e) - { - } - - protected void Session_End (Object sender, EventArgs e) - { - } - - protected void Application_End (Object sender, EventArgs e) - { - } - - #region Web Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent () - { - this.components = new Container (); - } - - #endregion - } -} \ No newline at end of file diff --git a/Examples/tutorial/WebView/Global.asax.resx b/Examples/tutorial/WebView/Global.asax.resx deleted file mode 100644 index 3f337e0..0000000 --- a/Examples/tutorial/WebView/Global.asax.resx +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 1.0.0.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - diff --git a/Examples/tutorial/WebView/ReadMe.txt b/Examples/tutorial/WebView/ReadMe.txt deleted file mode 100644 index 16c0d28..0000000 --- a/Examples/tutorial/WebView/ReadMe.txt +++ /dev/null @@ -1,6 +0,0 @@ -If you got error -"Operation must use an updateable query." - -This is almost always a permissions issue. Be sure that the MDB file is in a folder -where \ASPNET have read/write access -(because it needs to create an .LDB file when modifying the database). diff --git a/Examples/tutorial/WebView/Resources/PersonHelper.xml b/Examples/tutorial/WebView/Resources/PersonHelper.xml deleted file mode 100644 index de149d1..0000000 --- a/Examples/tutorial/WebView/Resources/PersonHelper.xml +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into PERSON - (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, - PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) - values - (#Id#, #FirstName#, #LastName#, - #BirthDate#, #WeightInKilograms#, #HeightInMeters#) - - - - update PERSON set - PER_FIRST_NAME = #FirstName#, - PER_LAST_NAME = #LastName#, - PER_BIRTH_DATE = #BirthDate#, - PER_WEIGHT_KG = #WeightInKilograms#, - PER_HEIGHT_M = #HeightInMeters# - where PER_ID = #Id# - - - - delete from PERSON - where PER_ID = #value# - - - - - diff --git a/Examples/tutorial/WebView/Resources/iBatisTutorial.mdb b/Examples/tutorial/WebView/Resources/iBatisTutorial.mdb deleted file mode 100644 index 716487885cca37d25d7db0e5712f1b5b78250e76..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118784 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 Wr00apD-p|boPnK9!~J_N`2P=W6ajkx diff --git a/Examples/tutorial/WebView/Web.config b/Examples/tutorial/WebView/Web.config deleted file mode 100644 index 756d04f..0000000 --- a/Examples/tutorial/WebView/Web.config +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/tutorial/WebView/WebView.csproj b/Examples/tutorial/WebView/WebView.csproj deleted file mode 100644 index 11c0e20..0000000 --- a/Examples/tutorial/WebView/WebView.csproj +++ /dev/null @@ -1,174 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/tutorial/WebView/default.htm b/Examples/tutorial/WebView/default.htm deleted file mode 100644 index fd2c946..0000000 --- a/Examples/tutorial/WebView/default.htm +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - -

Loading ...

- - diff --git a/Examples/tutorial/WebView/iBatisTutorial.mdb b/Examples/tutorial/WebView/iBatisTutorial.mdb deleted file mode 100644 index 731cd7b0915c92440c865bc2a888569ee5352184..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118784 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 TIxmBiB{%~+yN3JsPVoO9v)!p> diff --git a/Examples/tutorial/WebView/properties.config b/Examples/tutorial/WebView/properties.config deleted file mode 100644 index 648a3f4..0000000 --- a/Examples/tutorial/WebView/properties.config +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - diff --git a/Examples/tutorial/WebView/providers.config b/Examples/tutorial/WebView/providers.config deleted file mode 100644 index 992997a..0000000 --- a/Examples/tutorial/WebView/providers.config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - diff --git a/Examples/tutorial/WebView/sqlmap.config b/Examples/tutorial/WebView/sqlmap.config deleted file mode 100644 index 11040ee..0000000 --- a/Examples/tutorial/WebView/sqlmap.config +++ /dev/null @@ -1,21 +0,0 @@ - - - -   -   - - - - - - - - - - - - - - - diff --git a/Examples/tutorial/default.css b/Examples/tutorial/default.css deleted file mode 100644 index d28d3d9..0000000 --- a/Examples/tutorial/default.css +++ /dev/null @@ -1,27 +0,0 @@ - -.programlisting { - font-family: courier; - font-size: 11px; - font-weight: normal; - font-family: Lucida Console, monospace; - background-color: #EEEEEE; - padding: 0.25cm; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC - } -.sidebar { - background-color: #E5ECF9; - padding: 0.25cm; -} -.navheader,.navfooter{ - background-color: #809BC8; -} -.navheader a { - color:#fff; - text-decoration: none; -} -.navfooter a { - color:#fff; - text-decoration: none; -} \ No newline at end of file diff --git a/Examples/tutorial/figure01.png b/Examples/tutorial/figure01.png deleted file mode 100644 index 9eb2cdc07c0850dee3e0cff1dad45afc83430d52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14289 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 C3BaTP diff --git a/Examples/tutorial/figure02.png b/Examples/tutorial/figure02.png deleted file mode 100644 index a4683e329623649ed952b4f63faabbab8abedd00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5966 zcmb`LcQ~7U+s8vG)uE-R8m+yG+LWSZb6c%Zn^sZ8-YcQCYL^%lt9A)uMa`gU*B&uT zNkq)rjrqj=K6j7jegAup_xyN=_^=lp)Z=Nb7-Tm3rKT`B+oa2@zmMHc`d zWhB-ZN>bvrVJ$}#0AL^msyxy6o!-dQh@0cT8O~Dd1AP*1Y#})o!g@e2`u+YIKA_;K zI(>XD>zzwysON_=k`yIW5LU@1Fc{22Jci`QLlOYs6BhswoI<=cAs%garHQCvik+Lzdw6wgV|5_wA$0G8j0bufp#u?Ja@A$XFl7;2zaY!w~R;1Z&;PC8R zikmzbi^PmmPBhH)7}kI#qUWsWXGs9G_L0SN`KK_l(-TfW>!}GTI@bP~4M0(&RhZ}6 zUjTsMTiGX10WWm~6Bu$O1|u_FWGv79ol7QD8FZa3Jo*;>#M<4bc4yLrE(J@}s32$& z$-x+s#YGRR9v%d}SpAm?3gOy%b^Me~KjL0q7T-(2^Tk;eQmM?_Cw=F z70qor4f=2so%0{+V=$W*H)(Q!9q@~Hf5Q95g2o!-?50y}F$gfJqM^z3R%Il}t2ug& zxuY^}$0yY}0c1k~Fam0*vFoUvHZHt9-Q!7R0c63s%o_%g;|V-9MLI&V#J^$VC%INh z6=nAofSkETL!a(O&QH}aOeOKhHJE{cC@-qJ`A*I&|tY%1oFiW5JpKXI4esNsulh>6d0SMYtKUh@A z8)gFO_L?Sz6vcH=n`lDQUgiJ*YM}o&Wd0ENhqph)Ki~x$Yn+`CVq*b-g^uGc9Ky2Y z`%>bT0%SF4DQH8)TtRT=HrcOb56#fL2>VDsGa}JLWP(J?q7~EVP`0uSePK|e3c+a%HE6lJvWQ&t)i?-n4yrVPnuot zy*cvbF6wM_4Yp`=4zbd7+$+
d)lPuWQsJPe!9kg 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 diff --git a/Examples/tutorial/iBatisTutorial.sln b/Examples/tutorial/iBatisTutorial.sln deleted file mode 100644 index 4248c24..0000000 --- a/Examples/tutorial/iBatisTutorial.sln +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Model", "Model\Model.csproj", "{9024A1F6-D029-4CB0-99C1-6B50EC1BDFB3}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebView", "http://localhost/iBatisTutorial/WebView.csproj", "{F324FCB6-809E-4AEE-82BD-81459E03CA24}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {9024A1F6-D029-4CB0-99C1-6B50EC1BDFB3}.Debug.ActiveCfg = Debug|.NET - {9024A1F6-D029-4CB0-99C1-6B50EC1BDFB3}.Debug.Build.0 = Debug|.NET - {9024A1F6-D029-4CB0-99C1-6B50EC1BDFB3}.Release.ActiveCfg = Release|.NET - {9024A1F6-D029-4CB0-99C1-6B50EC1BDFB3}.Release.Build.0 = Release|.NET - {F324FCB6-809E-4AEE-82BD-81459E03CA24}.Debug.ActiveCfg = Debug|.NET - {F324FCB6-809E-4AEE-82BD-81459E03CA24}.Debug.Build.0 = Debug|.NET - {F324FCB6-809E-4AEE-82BD-81459E03CA24}.Release.ActiveCfg = Release|.NET - {F324FCB6-809E-4AEE-82BD-81459E03CA24}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/Examples/tutorial/iBatisTutorial.xml b/Examples/tutorial/iBatisTutorial.xml deleted file mode 100644 index d9e7bbe..0000000 --- a/Examples/tutorial/iBatisTutorial.xml +++ /dev/null @@ -1,972 +0,0 @@ - - -

- iBatisNet Tutorial - - - Welcome - - This tutorial takes an "over-the-shoulder" Cookbook approach. We'll - define a simple data access problem and use iBATIS to solve it for - us. - - - What's covered here - - This Tutorial covers the iBATIS Data Mapper, build 1.0.1. - - - - - Test first! - - Let's say our client has a database and one of the tables in the - database is a list of people. Client tells us: - - We would like to use a web application to display the people - in this table and to add, edit, and delete individual - records. - - Not a complicated story, but it will cover the CRUD most developers - want to learn first. :) Let's start with the people table client - mentioned. Since we're keeping it simple, we'll say it's a table in an - Access database. The table definition is shown as Example 1. - - - The Person Table - - Name Type Size -PER_ID Long Integer 4 -PER_FIRST_NAME Text 40 -PER_LAST_NAME Text 40 -PER_BIRTH_DATE Date/Time 8 -PER_WEIGHT_KG Double 8 -PER_HEIGHT_M Double 8 - - - The first thing our story says is that client would like to display - a list of people. Example 2 shows our test for that. - - - PersonTest.cs - - using System.Collections; -using IBatisNet.DataMapper; -using NUnit.Framework;complete - -namespace iBatisTutorial.Model -{ - [TestFixture] - public class PersonTest - { - [Test] - public void PersonList () - { - // try it - IList people = Mapper.Instance().QueryForList("SelectAll",null); - - // test it - Assert.IsNotNull(people,"Person list not returned"); - Assert.IsTrue(people.Count>0,"Person list is empty"); - Person person = (Person) people[0]; - Assert.IsNotNull(person,"Person not returned"); - } - } -} - - - Well, Example 2 sure looks easy enough! We ask a method to "select - all", and it returns a list of person objects. But, what code do we need - to write to pass this test? - - Let's see. The test uses a list of person objects. We could start - with a blank object, just to satisfy the test, and add the display - properties later. But let's be naughty and skip a step. Our fully-formed - person object is shown in Example 3. - - - Person.cs - - using System; -namespace iBatisTutorial.Model -{ - public class Person - { - private int _Id; - private string _FirstName; - private string _LastName; - private DateTime _BirthDate; - private double _WeightInKilograms; - private double _HeightInMeters; - - public int Id - { - get{ return _Id; } - set{ _Id = value; } - } - -// Other public properties for the private fields ... - - } -} - - - OK, that was fun! The Assert class is built into NUnit, so to - compile Example 2, we just need the Mapper object and - QueryForList method. The Mapper is built into the - iBATIS framework, so we don't need to write that either. The iBATIS - QueryForList method executes our SQL statement - (or stored procedure) and returns the result as a list. Each row in the - result becomes an entry in the list. Along with - QueryForList, there is also - Delete, Insert, - Select, QueryForObject, - and a couple of other methods in the iBATIS API. (See Section 5 in the - Developers Guide for details.) - - Looking at Example 2, we see that the - QueryForList method takes the name of the - statement we want to run and any runtime values the statement may need. - Since a "SelectAll" statement wouldn't need any runtime values, we pass - null in our test. - - OK. Easy enough. But where does iBATIS get the "SelectAll" - statement? Some systems try to generate SQL statements for you, but iBATIS - specializes in data mapping, not code generation. It's our job (or the job - of our database administrator) to craft the SQL or provide a stored - procedure. We then describe the statement in an XML element, like the one - shown in Example 4. - - - We use XML elements to map a database statement to an application - object - - <typeAlias alias="Person" assembly="iBatisTutorial.Model.dll" - type="iBatisTutorial.Model.Person" /> - - <resultMap id="SelectAllResult" class="Person"> - <result property="Id" column="PER_ID" /> - <result property="FirstName" column="PER_FIRST_NAME" /> - <result property="LastName" column="PER_LAST_NAME" /> - <result property="BirthDate" column="PER_BIRTH_DATE" /> - <result property="WeightInKilograms" column="PER_WEIGHT_KG" /> - <result property="HeightInMeters" column="PER_HEIGHT_M" /> - </resultMap> - - <select id="SelectAll" resultMap="SelectAllResult"> - select - PER_ID, - PER_FIRST_NAME, - PER_LAST_NAME, - PER_BIRTH_DATE, - PER_WEIGHT_KG, - PER_HEIGHT_M - from PERSON - </select> - - - - Since this is a very simple case, iBATIS could in fact generate - this SQL for us. In Example 4, we could have also written the select - statement this way: <select id="SelectAll" resultMap="SelectAllResult"> - <generate table="PERSON" /> - </select> - - Using the columns from the ResultMap, iBATIS would generate the - SQL statement for us. But this feature only works with the simplest of - SQL statements. Most often, you will write your own SQL statement or - pass parameters to a stored procedure. (See Section 3 in the - Developers Guide for more about the generate tag.) - The iBATIS mapping documents can hold several sets of related - elements, like those shown in Example 4. We can also have as many mapping - documents as we need. Having multiple mapping documents is handy when - several developers are working on the project at once. - - So, the framework gets the SQL code for the query from the mapping, - and plugs it into a prepared statement. But, how does iBATIS know where to - find the table's datasource? - - Surprise! More XML! You can define a configuration file for each - datasource your application uses. Example 5 shows a configuration file for - our Access database. - - - SqlMap.config - a configuration file for our Access - database - - <?xml version="1.0" encoding="UTF-8" ?> -<sqlMapConfig - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="SqlMapConfig.xsd"> - - <providers file="providers.config"/> - - <database> - <dataSource name="iBatisTutorial" - connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=/Resources/iBatisTutorial.mdb"/> - </database> - - <sqlMaps> - <sqlMap file="/Resources/PersonHelper.xml"/> - </sqlMaps> - -</sqlMapConfig> - - - Of course, besides Access, other ADO.NET providers are supported, - including SqlServer, Oracle, MySQL, and generic ODBC providers. (See - Section 5 in the Developers Guide for details.) - - The last part of the configuration file ("sqlMaps") is where we list - our mapping documents, like the one shown back in Example 4. We can list - as many documents as we need here, and they will all be read when the - configuration is parsed. - - OK, so how does the configuration get parsed? - - Look back at Example 2. The heart of the code is the call to the - "Mapper" object (under the remark "try it"). The - Mapper object is a singleton. The first time it's - called, it reads in the configuration documents to create the - Mapper object. On subsequent calls, it reuses the - Mapper object, so that the configuration is re-read - only if the file changes. - - The framework comes bundled with a default - Mapper class. If you want to use a different name - for the configuration file, or need to use more than one database, you can - also use your own class, by copying and modifying the standard - version. - - Example 6 shows the code for the standard Mapper class that comes - with the framework, and that you can use "out of the box". - - - The standard "Mapper" facade for providing access to the data - maps - - using IBatisNet.Common.Utilities; -using IBatisNet.DataMapper; - -namespace IBatisNet.DataMapper -{ - public class Mapper - { - private static volatile SqlMapper _mapper = null; - - protected static void Configure (object obj) - { - _mapper = (SqlMapper) obj; - } - protected static void InitMapper() - { - ConfigureHandler handler = new ConfigureHandler (Configure); - _mapper = SqlMapper.ConfigureAndWatch (handler); - } - - public static SqlMapper Instance() - { - if (_mapper == null) - { - lock (typeof (SqlMapper)) - { - if (_mapper == null) // double-check - InitMapper(); - } - } - return _mapper; - } - - public static SqlMapper Get() - { - return Instance(); - } - } -} - - - If you wanted to use a second database, you could load another - configuration by changing the call to ConfigureHandler. There's another - signature that takes a file name, which you can use to specify another - configuration, as so:ConfigureHandler handler = new ConfigureHandler (Configure,"sqlmap2.config");You - can access as many different database configurations as you need, just by - setting up additional Mapper classes. Each Mapper configuration is a - facade for a database. As far as our application knows, the "Mapper" *is* - the database. Behind the Mapper facade, you can change the location of the - database, or switch between SQL statements and stored procedures, with - zero-changes to your application code. - - If we put this all together into a solution, we can "green bar" our - test, as shown by Figure 1. If you'd like to see that bar for yourself, - open the iBatisNet Tutorial solution available from the website - <http://sf.net/projects/ibatisnet>. If you do, you'll note that we - set up the solution using two projects. A "Model" project for our business - and database code and corresponding unit tests, and a "Web" project our - user application. (After extracting the solution, set Web Sharing for the - "Web" folder as "iBatisTutorial".) - -
- Green Bar! - - - - - - -
-
- - - Playtest second! - - Now that we have a passing test, we setup a page to display our list - of people. Example 7 shows the ASPX code for our display page. The key - piece is the DataGrid. - - - ASPX page for our Person list - - <%@ Page language="c#" Codebehind="Person.aspx.cs" AutoEventWireup="false" Inherits="iBatisTutorial.Web.Forms.Person" %> -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > -<html> - <head> - <title>Person</title> - <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> - <meta name="CODE_LANGUAGE" Content="C#"> - <meta name=vs_defaultClientScript content="JavaScript"> - <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5"> - </head> - <body> - <form id="Person" method="post" runat="server"> - <asp:Panel ID="pnlList" Runat="server"> - <h1>Person List</h1> - <asp:DataGrid id="dgList" Runat="server"></asp:DataGrid> - </asp:Panel> - </form> - </body> -</html> - - - Of course, we still need to populate that DataGrid. Example 8 shows - the code-behind. The operative method is - List_Load. The rest is supporting code. - - - Code-behind class for our Person list page - - using System; -using System.Web.UI; -using System.Web.UI.WebControls; -using IBatisNet.DataMapper; - -namespace iBatisTutorial.Web.Forms -{ - public class PersonPage : Page - { - - #region panel: List - - protected Panel pnlList; - protected DataGrid dgList; - - private void List_Load () - { - dgList.DataSource = Mapper.Instance().QueryForList("SelectAll",null); - dgList.DataBind(); - } - - #endregion - - private void Page_Load(object sender, System.EventArgs e) - { - if (!IsPostBack) - { - List_Load (); - } - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - InitializeComponent(); - base.OnInit(e); - } - - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} - - - If we run this now, we'll get a list like the one shown in Figure - 2. - -
- A quick-and-dirty Person List - - - - - - -
- - Not pretty, but at least we have a starting point. The DataGrid is a - flexible control, and we can always adjust the column order and headings - by changing the ASPX file. The point of this exercise is to get the data - to the grid so we can refine it later. -
- - - Test, test, again ... - - Of course, tweaking the Person List display is not going to be the - end of it. Clients always want more, and now ours wanted to display a list - and edit, add, or delete records. Let's write some - tests for the rest of the tasks, as shown in Example 9. - - - New stories, new tests - - [Test] - public void PersonUpdate () - { - const string EXPECT = "Clinton"; - const string EDITED = "Notnilc"; - // get it - person.Id = 1; person = (Person) Mapper.Instance().QueryForObject("Select",1); - // test it - Assert.IsNotNull(person,"Missing person"); - Assert.IsTrue(EXPECT.Equals(person.FirstName),"Mistaken identity"); - //change it - person.FirstName = EDITED; - Mapper.Instance().Update("Update",person); - // get it again some - person = (Person) Mapper.Instance().QueryForObject("Select",1); - // test it - Assert.IsTrue(EDITED.Equals(person.FirstName),"Same old, same old?"); - // change it back - person.FirstName = EXPECT; - Mapper.Instance().Update("Update",person); - } - - [Test] - public voidPersonInsertDelete () - { - // insert it - Person person = new Person(); - person.Id = -1; - Mapper.Instance().Insert("Insert",person); - // delete it - int count = Mapper.Instance().Delete("Delete",-1); - Assert.IsTrue(count>0,"Nothing to delete"); - } - - - Not the best tests ever written, but for now, they will do :) - - To make the new tests work, we'll need some new mapping statements. - Example 10 shows the complete PersonHelper.xml mapper document. - - - The new and improved Mapper document - - <xml version="1.0" encoding="utf-8" ?> - -<sqlMap - namespace="Person" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="SqlMap.xsd"> - - <alias> - <typeAlias alias="Person" assembly="iBatisTutorial.Model.dll" type="iBatisTutorial.Model.Person" /> - </alias> - - <resultMaps> - <resultMap id="SelectResult" class="Person"> - <result property="Id" column="PER_ID" /> - <result property="FirstName" column="PER_FIRST_NAME" /> - <result property="LastName" column="PER_LAST_NAME" /> - <result property="BirthDate" column="PER_BIRTH_DATE" /> - <result property="WeightInKilograms" column="PER_WEIGHT_KG" /> - <result property="HeightInMeters" column="PER_HEIGHT_M" /> - </resultMap> - </resultMaps> - - <statements> - - <select id="Select" parameterClass="int" resultMap="SelectResult"> - select - PER_ID, - PER_FIRST_NAME, - PER_LAST_NAME, - PER_BIRTH_DATE, - PER_WEIGHT_KG, - PER_HEIGHT_M - from PERSON - <dynamic prepend="WHERE"> - <isParameterPresent> - PER_ID = #value# - </isParameterPresent> - </dynamic> - </select> - - <insert id="Insert" parameterClass="Person" resultClas"int"> - insert into PERSON - (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, - PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) - values - (#Id#, #FirstName#, #LastName#, - #BirthDate#, #WeightInKilograms#, #HeightInMeters#) - </insert> - - <update id="Update" parameterClass="Person" resultClass="int"> - update PERSON set - PER_FIRST_NAME = #FirstName#, - PER_LAST_NAME = #LastName#, - PER_BIRTH_DATE = #BirthDate#, - PER_WEIGHT_KG = #WeightInKilograms#, - PER_HEIGHT_M = #HeightInMeters# - where PER_ID = #Id# - </update> - - <delete id="Delete" parameterClass="int" resultClass="int"> - delete from PERSON - where PER_ID = #value# - </delete> - - </statements> -</sqlMap> - - - - Of course, the statements in Example 10 are so simple that - iBATIS could generate the SQL for us. Since your own applications are - liable to be more complex, we continue to use manual SQL in the - examples. - - - Hmm. So, what's with this <isParameterPresent> tag in the - Select element? The <isParameterPresent> tag is an example of - Dynamic SQL. Rather than have nearly identical statements for SelectAll - and SelectById, we can use Dynamic SQL to let the same statement serve - both purposes. If Id is null, the WHERE clause is omitted. Otherwise, the - WHERE clause is included. Dynamic SQL is even more useful for "Query By - Example" stories. (See Section 3.7 in the Developers Guide for - more.) - - Why bother? Because with the dynamic clause, we can use a single - Select statement for SelectAll or SelectById. Since both invocations are - suppose to return the same result, using one statement instead of two - reduces redundancy and saves maintenance. - - Well, waddya know, if run our tests now, we are favored with a green - bar!. It all works! - Though, of course, everything did not work perfectly the first - time! We had to fix this and that, and try, try, again. But NUnit made - trying again quick and easy. For changes to the XML mappings document, - we do not even have to recompile. We can just update the XML and rerun - the test! No fuss, no muss. - - - Turning back to our ASP.NET page, we can revamp the DataGrid to - allow in-place editing and deleting. To add records, we provide a button - after the grid that inserts a blank person for client to edit. The ASPX - code is shown as Example 11. - - - ASPX code for our enhanced DataGrid - - <asp:DataGrid id="dgList" Runat="server" - AutoGenerateColumns=False - DataKeyField="Id" - OnEditCommand="List_Edit" - OnCancelCommand="List_Cancel" - OnUpdateCommand="List_Update" - OnDeleteCommand="List_Delete"> - <Columns> - <asp:BoundColumn DataField="FirstName" HeaderText="First"></asp:BoundColumn> - <asp:BoundColumn DataField="LastName" HeaderText="Last"></asp:BoundColumn> - <asp:BoundColumn DataField="HeightInMeters" HeaderText="Height"></asp:BoundColumn> - <asp:BoundColumn DataField="WeightInKilograms" HeaderText="Weight"></asp:BoundColumn> - <asp:EditCommandColumn ButtonType="PushButton" EditText="Edit" CancelText="Cancel" - <asp:ButtonColumn ButtonType="PushButton" Text="Delete" CommandName="Delete"></asp:ButtonColumn> - UpdateText="Save"></asp:EditCommandColumn> - </Columns> - </asp:DataGrid> - <p><asp:Button ID="btnAdd" Runat="server"></asp:Button></p> - - - Example 12 shows the corresponding methods from the - code-behind. - - - The code-behind methods for our new DataGrid - - #region panel: List - - protected Panel pnlList; - protected DataGrid dgList; - protected Button btnAdd; - - private void List_Init() - { - btnAdd.Text ="Add New Person"; - this.btnAdd.Click += new EventHandler(List_Add); - } - - private void List_Load () - { - dgList.DataSource = Mapper.Instance().QueryForList("Select",null); - dgList.DataBind(); - } - - protected void List_Delete(object source, DataGridCommandEventArgs e) - { - int id = GetKey(dgList,e); - Mapper.Instance().Delete("Delete",id); - List_Load(); - } - - protected void List_Edit(object source, DataGridCommandEventArgs e) - { - dgList.EditItemIndex = e.Item.ItemIndex; - List_Load(); - } - - protected void List_Update(object source, DataGridCommandEventArgs e) - { - Person person = new Person(); - person.Id = GetKey(dgList,e); - person.FirstName = GetText(e,0); - person.LastName = GetText(e,1); - person.HeightInMeters = GetDouble(e,2); - person.WeightInKilograms = GetDouble(e,3); - Mapper.Instance().Update("Update",person); - List_Cancel(); // Not really, it's already saved. - } - - protected void List_Cancel(object source, DataGridCommandEventArgs e) - { - dgList.EditItemIndex = -1; - List_Load(); - } - - private int GetKey(DataGrid dg, DataGridCommandEventArgs e) - { - return (Int32) dg.DataKeys[e.Item.DataSetIndex]; - } - - private string GetText(DataGridCommandEventArgs e, int v) - { - return ((TextBox) e.Item.Cells[v].Controls[0]).Text; - } - - private double GetDouble(DataGridCommandEventArgs e, int v) - { - return Convernext to the t.ToDouble(GetText(e,v)); - } - - #endregion - - private void Page_Load(object sender, System.EventArgs e) - { - List_Init(); - if (!IsPostBack) - { - List_Load (); - } - } - - // Web Form Designer generated code ... - - - OK, we are CRUD complete! There's more we could do here. In - particular, we should add validation methods to prevent client from - entering alphabetic characters where only numbers can live. But, that's - ASP.NET grunt-work, and this is an iBATIS tutorial. - We could also add more error-checking and exception-trapping. But, we have - a green bar, and for now, we can stand tall and proudly declare: - Mission accomplished! - - - - Then, refactor - - Well, almost accomplished. The story is - complete from client's perspective, but I really don't like spelling out - the statement names in so many places. Mistyping the name is a bug waiting - to happen. Let's encapsulate the statements we want to call in a helper - class, so we only spell out the statement name in one place. Example 13 - shows our PersonHelper class. - PersonHelper.cs - A helper class for accessing the - database - - using System.Collections; - -namespace iBatisTutorial.Model -{ - - public class PersonHelper: BaseHelper - { - - public Person Select(int id) - { - return (Person) Mapper().QueryForObject("Select",id); - } - - public IList SelectAll() - { - return Mapper().QueryForList("Select",null); - } - - public int Insert(Person person) - { - Mapper().Insert("Insert",person); - // Insert is designed so that it can return the new key - // but we are not utilizing that feature here - return 1; - } - - public int Update(Person person) - { - return Mapper().Update("Update",person); - } - - public int Delete(int id) - { - return Mapper().Delete("Delete",id); - } - -} - - - In a larger application, there would be several other "business" - objects, like "Person", and several other helper objects. Knowing this, we - setup a base Helper class. Our Helper base class, shown in Example 14, - provides the Mapper method that hooks up our application with - iBATIS. - - - Helper.cs -- Our only link to iBATIS - - using IBatisNet.DataMapper; - -namespace iBatisTutorial.Model -{ - public class Helper - { - public SqlMapper Mapper () - { - return IBatisNet.DataMapper.Mapper.Instance (); - } - } -} - - - We could now go back and do a straight-forward refactoring. - Everywhere we called, say: - - Mapper.Get().Update("Update",person); - - we could now call: - - PersonHelper helper = new PersonHelper(); helper.Update(person); - - Hmm. Better in terms of being strongly typed, worse in terms of - object management. Now we have to create an instance of PersonHelper to - make a data access call. Example 15 shows an alternative solution: Use a - singleton to instantiate our helper class one time. - - - Helpers.cs - A singleton "concierge" for our Helper - classes. - - namespace iBatisTutorial.Model { - public class Helpers - { - private static volatile PersonHelper _PersonHelper = null; - public static PersonHelper Person () - { - if (_PersonHelper == null) - { - lock (typeof (PersonHelper)) - { - if (_PersonHelper == null) // double-check - _PersonHelper = new PersonHelper(); - } - } - return _PersonHelper; - } - } -} - - - Now if we do a refactoring, we can replace: - - Mapper.Instance().Update("Update",person);with - - Helpers.Person().Update(person);If - we had another helper, say for pets, we could add that to the Helper class - and also be able to call: - - Helpers.Pet().Update(pet);and so - forth. As shown in Figure 3, we can also make full use of Intellisense in - selecting both a helper class and its methods. - -
- Intellisense works great with our Helper singleton! - - - - - - -
- - Figure 4 shows the Subversion DIFF report after refactoring for the - Helper classes. The lines that changed are emphasized. - -
- Refactoring the Person test class - - Index: C:/projects/SourceForge/ibatisnet/Tutorial2/Model/PersonTest.cs -=================================================================== ---- C:/projects/SourceForge/ibatisnet/Tutorial2/Model/PersonTest.cs (revision 196) -+++ C:/projects/SourceForge/ibatisnet/Tutorial2/Model/PersonTest.cs (working copy) -@@ -1,5 +1,5 @@ - using System.Collections; --using IBatisNet.DataMapper; -+using iBatisTutorial.Model; - using NUnit.Framework; - - namespace iBatisTutorial.Model -@@ -11,7 +11,7 @@ - public void PersonList () - { - // try it -- IList people = Mapper.Instance().QueryForList("Select",null); -+ IList people = Helpers.Person().SelectAll(); - // test it - Assert.IsNotNull(people,"Person list not returned"); -@@ -28,7 +28,7 @@ - - // get it - Person person = new Person(); -- person = (Person) Mapper.Instance().QueryForObject("Select",1); -+ person = Helpers.Person().Select(1); - - // test it - Assert.IsNotNull(person,"Missing person"); -@@ -36,17 +36,17 @@ - - //change it - person.FirstName = EDITED; -- Mapper.Instance().Update("Update",person); -+ Helpers.Person().Update(person); - - // get it again -- Mapper.Instance().Insert("Insert",person); -+ Helpers.Person().Insert(person); -- person = (Person) Mapper.Instance().QueryForObject("Select",1); -+ person = Helpers.Person().Select(1); - - // test it - Assert.IsTrue(EDITED.Equals(person.FirstName),"Same old, same old?"); - - // change it back - person.FirstName = EXPECT; -- Mapper.Instance().Update("Update",person); -+ Helpers.Person().Update(person); - } - - [Test] -@@ -55,9 +55,9 @@ - // insert it - Person person = new Person(); - person.Id = -1; -- Mapper.Instance().Insert("Insert",person); -+ Helpers.Person().Insert(person); - // delete it -- int count = Mapper.Instance().Delete("Delete",-1); -+ int count = Helpers.Person().Delete(person.Id); - Assert.IsTrue(count>0,"Nothing to delete"); - } - } -
- - Now, all our references are to our own Helper singleton rather than - the iBATIS Mapper class. Figure 5 shows the same type of DIFF report for - our ASP.NET code-behind file. The ASP.NET page is unchanged. (Ahh,the - beauty of code-behind!) - -
- Refactoring the Person list code-behind class. - - Index: C:/projects/SourceForge/ibatisnet/Tutorial2/WebView/Forms/Person.aspx.cs -=================================================================== ---- C:/projects/SourceForge/ibatisnet/Tutorial2/WebView/Forms/Person.aspx.cs (revision 196) -+++ C:/projects/SourceForge/ibatisnet/Tutorial2/WebView/Forms/Person.aspx.cs (working copy) -@@ -1,13 +1,10 @@ - using System; - using System.Web.UI; - using System.Web.UI.WebControls; --using IBatisNet.DataMapper; - using iBatisTutorial.Model; - - namespace iBatisTutorial.Web.Forms - { - public class PersonPage : Page - { - -@@ -25,14 +22,14 @@ - - private void List_Load () - { -- dgList.DataSource = Mapper.Instance().QueryForList("Select",null); -+ dgList.DataSource = Helpers.Person().SelectAll(); - dgList.DataBind(); - } - - protected void List_Delete(object source, DataGridCommandEventArgs e) - { - int id = GetKey(dgList,e); -- Mapper.Instance().Delete("Delete",id); -+ Helpers.Person().Delete(id); - List_Load(); - } - -@@ -50,7 +47,7 @@ - person.LastName = GetText(e,1); - person.HeightInMeters = GetDouble(e,2); - person.WeightInKilograms = GetDouble(e,3); -- Mapper.Instance().Update("Update",person); -+ Helpers.Person().Update(person); - List_Load(); - } - -@@ -79,7 +76,7 @@ - { - Person person = new Person(); - person.FirstName = "--New Person--"; -- Mapper.Instance().Insert("Insert",person); -+ Helpers.Person().Insert(person); - List_Load(); - } -
- - Note that adding the Helper singleton let us remove all iBATIS - framework semantics from the Test and code-behind classes. Looking at the - classes, you can't tell what data persistence system (if any) is being - used. All you see is a call to some Helper. In my book, that's a Good - Thing! - - Now I'm happy, and ready to move on to the next story ... As for - you, if you've liked what you've seen so far, please move on to the - Developers Guide. There are many more goodies in store. -
-
\ No newline at end of file diff --git a/Examples/tutorial/tutorial.xsl b/Examples/tutorial/tutorial.xsl deleted file mode 100644 index b6e2276..0000000 --- a/Examples/tutorial/tutorial.xsl +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - gfx/ - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/DomainDiagram.png b/Examples/tutorial2/DomainDiagram.png deleted file mode 100644 index a5a5ab6a012fe19ebf260f819bfbb6773d03eac3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25875 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
b(CQG~=jR)gA@9De zPK>!%t`GQ3BvB1E*;f3{4cdzJ0{c(IoMz7uUtTfjO?M;k(rj7>XM?|q(BcB46oc~| z%89x;gknjO_foK5mkcm06`^|M-Z3f;FL%}`6JLG^aUAMR|BDBq+^XW3FJzSDSPA@y zheaP4gy^Ia8~49rBJm?iHIaULIz~ydySlPL z4N#Z=y20+3BU^4r|4XUk^>i)u#PSRmHq?ZnA++wdMcuF~`jUw0sbJ>cw5URY+DdCu zE}q9{c#fAmGBj{xw9Gf1P=M>nYgP}=<_@WdQ6K)n?eY5>@9+nPu2NlUDuYUA@Ex%5R30@gP`s0o4QFp>K?y!V?aF z^;fopx8)fZv4w_nGV++Fi%<$*Xwduq%&te~2Qb8&aKKLabQOZ;U$uea@`N^BOiJ^0 zgFQy`Y(nwcO}ztZx)6*ws?60JDdo5Dvp*WNke~X~x#@mPpQgQujC?6osyEUjv4z@u zk={s(WLALw2zt!KX0{a)*HJ>X{dGLYqV2gMz8Z$t2&7}&FJHjWt^NqM?&qO|bAdlb zLCr@?$bfzxx>1AI)=YJ55IQ&|QR{0;2L@#`5QH3y&ar7ep>xCnj19p*A%-m;nU?nI zbOR@t(9zgXad~S6ap=%a7NpxkPQeft3>Elo+L++3kQCvz6BCudppF?S+ML@4$+t=i z(OI0+kR zma=oCMR;1ou`9lLY(}O@4ktb(-CZM5TMaZT-(1@RMspe%El%(1%yEy8;gHkiV2;%(DpA++EUVQhpueV=-{~>E#)IWlgt3^qgXr zOw0=@q_2*>>f@*??3ah*xVIq>$I%En5)U16B>t|29|}qR+toB0l%G(;DDp-=rcO0i zZXg@=)6)x}V&V<}G8_}Ja5r%Rmn}>j+5C+%ww1{pNx;SALy3%8<4m@gyDOxcIXHSM$%?91{UBKSTj znD#Qqv?kZ1q%XDV5V=0PLCVGbN1y$e6vaAHJVN^h-FsEu^x1e{=eA>rTOaFt6SA7s zc4>>+cnX^DRB1mfg^}*$pRLpf%RR(Q#DlI^cKaXoWtpwClqm^Rx7$1o;1>LTsD>jOcl0Zt8?N|$vbsJk%28EH2r6zN1+|0Ben<|DG#lI*5%l2^ zx2q%S8AW}KRc$9k;&BOE$!LQR=LsaO#wb=e|y#Siw@?QgU-3D`+qi99e2%DWj~C#A#c&*1-HIiy6Q~x z`HjP`yyktQ&wu~=;v**y9>44Myu#bp9QM?oj=3Tpz}ckz_LyZh{WW$VZz zK6(4|YybB6wCVHi|M-Q;^UcTKUbemB@h$!5JU{W95s!8G>4MLCUU2o1w|~F4Yr(Dk zlmFSisdMtPz8!}5uD-07_+-X;+b>x^u;=5Cel&6P-5Z`6^y$1_8yibv(^mG|edayG zE_!%OZ~xXuzAvskygcih^|zLYj!Qp%a!~BL^Aq28{KMxj_Ps1TyYGT$HeKoee)PGY z94z|rz)^omcDizK-ra~&2WeR7NnO4i1UX4 zr8@o;AIh_93G`~1H<#ODg8(`(YxgkyoTY&49|{{ zv2m=EFcNn7#6i7osVMpKqumSiQzvP z7IY4Dw#1OmBzbaY%B^F#n&Bpf4>Ek2;pYsaU5GQuu(C^e7ubQ}-Yz8PKo_dLZ6RyR za9<(m9PLV!0SqTIe5EVNImqeW-6;1|hU>dg>%Qqmxox@=y{J2-`!gKG@FAwZ$7z2L z;>l*%mSG2m35G{79KmoR!)XkEW_U_ZDw}4wkm2h+sjkzD2%c9&xf>a7V#?{IXtt@>S`vH1;+D>qa+0k=Dd=jG@zj`H?5~XV6}11$5q}3(fV*{PGWH>`LSPFR`x;m-VwpvZ=?3XJKrCS_57;c+ z-C4%{ca$;8@Bv#TG#ryP01EdkyBVFkq>#W~D57?=>}i$Ak2qpeddAFvHvZZWVv+6Ce&#?~wB zYOZgybq_c%5Z7qb@2^9O4?gf$miZye+#qgc>~n?P&Qg9oPzlwLu2u;|Coo4X=- z73gb&n*jH7T^9wZMp>35YvTUkGl1^|-T{0icz~fFdj2ce7Vz63X%!FA0a4cwrTd1c zF5)!Bc-#OtS-z=SB-=%F{OS$EsUd3J=^?6Dwzno^BeyX`TCEOUh1OjhIv*5inYF?7 zZd$he%FsqosBB*`IJ{TuD~5&7=Jb!AbVQeQO>~a*$Cjpd39vCllHbgJ4N#Wao87~7 z(%&(^5u>tMv4j~DD`Mrym0H~udkOS+WA}pc&)7qN-^LyXG}=4~*p^{ehW*<-1Immx zy8&-%^P*|81hl%%3DDt%HgAFQdYe^f#g}c~MY>=7LvY@hM{;h<`_`w4d-JFtAJ3y6 z9G!n8>{Fe875KXr906Eb@T7T!7*w#`I6{m7L|p}Aa8A?2aBac6kaJl9`PH=rq{Cwc zpo(3-A;2h7r@vjkDZpqSL4Uh^RluU+Bv}LW9E9I#o8e+Z@r!Kp zB^Fp47!6A;bn^xQJCCsyfolR&L>uvEh20XE2JA}4b_uF4E;@DN`UKUND|#r5G;1r0 z8Iu;oW`qBv1@lCIH*Yr9>+z}_S+IjR*UhsLja=o)>mr_Z^BP50vEP%|Lu7TQDlROz zxbQ2hNVI2+YF~qBg#Hs4vd1pKSET)2tP$TFohdOfBzPHaJ}gt%IAEpX&y2~wEfcvt z9Vs^;)+%94=JgY2xp}uE#yH=_?!i3vR}bevv95@uEEiV>AH%K4EsRM$hlslvlQNGL zkGpxhMY(uEVu7cEFC$`mU2#%B3={uQ81=(&@w39HA4UkPm!tLjctdEQL{h6GTUaQGF9dXU3%WOcF&BL)*jJBvGa~X{<~V0~AIrnk0rRj9N5V zOi&orFhxvN7}ao+n9dm0&`vv9(2Yy!A%)sBu|{!H`%V?Nxp{-IL%2ufQGKV2XB0;D zO&9wVM)l1QUn-31s}yE$r-lxQcREW<92L3@-%|HsO!oUM@wLnO8RB8SUJjd)E^`Fk z(~)}i(P~6b7aOR}69ZjrxK<}BTx^^+U(97pN=b{m+`Ll|Up?kxGqkhBs~*mU;#)WG z6m79UL+~f1G>Xd^BMZ*en#66Myrp8Vo7aHY>OB{`0k`D;<6=v+RU#Kh>5k0v#45&Q zzn?GGdGgK|8yQ=P`r?SjH+%BdirX2Jqkp}4fH5g$z1ZR5Trc*xc^$-`#XFw73&lU( zyo6p2Dc#FBcyujQafw@u^!bE;fp#WlUgsxb{~Oq}Kr4_Ho+HB9}3#=WSv-V;jV#&^6i}Vxhtw z2;HdNDXvx6>!I7UyTn@x`#f}ywp~Q}kjxF@^U$N(-^2)o<%gfv?iLM<$+q7k&S7jh z_xnBKiN35$U|jfB?H=(D#x?||hWBarihnDtI{YE99~hICxL4%%qjFNpz2da~87cRQ zm5h-Tq2DL|q%e|lpSXxIDdj$K3u98sec~HB8b=IDy4)u^4j_!A#Ps_`cZHFZ`$dv5 zDdm1KLgtCp;ZERuSYg+Pd*}~}j}`Vbu!qHYN3cwB0NA4F=?e8 zV!MkKiyh)!i3N^{4AOUsj~QFdv&~NacmrCCF_B~SCq$2N=#MQPmu-sQ{o(jWknb0Pm606 z)+@S1|GU`fVt>+~6aR3rjrt3sV35>oWOS?kvKXweY0?4#qB5 z*j~o=43(VkFjibHv2Ph0$k^&Y+w3WjQm(L$*)xof z2TNyru;|6vXJ$B~S7(m~=M0vz0_|Iayh|Bd#jX8XT*cU~;8)of8()j(C1*g-xdPZL zjO`DS%&)~hg^|p!#iz2IM!I}0jA5kBE{$~gT9h(I^=(DDVKNVX9T(q-5eg&DZ^S6Z zX#Tv%_(sf^Sm2DD$Bgg9LWzlV&J)0%RoE(EKZwHNRNsEC{U@aihdo>z~9; z3L~w55_dC3n!RoOB%X4y&kUhuk06=SE&)NxH0NO9Zw4 z5))lwGmM}%+Qps#wnbrw#Y)Yv_LPe~VMMgVD3T(rl%<`kFseOEyIo>zr7Z1Eg;5)_ zv_}|Q9XK{Nz|7K~RM@0g1lS&lLC-Ztww84q)j;uX9H&t^3ZoigS}tSMw{IIU?NkqE zTkSLtXIpJLV{)c#tIcuCjWpY83teoY*-m?qvE}08*bK9?HhMJGPBqLnyJ)i{Cbq=t z&92&?U2L)0UE9H!TpxOByH%bRTxIsu_DKv<;-W~~?_z7sBJID7EysB9o4qw(1=ojj zp$))tCC25FT1PkUDl@4Sd-964{%+nDvsfGE$t%&us=UWzH=89|gUk88DAg`i*fX*B zMVYomVXwuunTKhG$2)D0i#{6tC%j}d^NHCu!mebDY7=5-^yc_z(O)|t^TfmP7|Q*muxH|faFU)g zhB#M>H{%_AM`#Nbb}-)Ecck_jV>`9(xqW;`Yd>HxhjwN)b zHYInYZ>Y9+oWyE#$NI{(mlU=F>H!iGPYC8X}jEag7#O1b#HsV z??i3t6v^4Y?IphP+6IMHNB8Ixv@HrdzU>vhiP}*o6X$XWE<6W$RSFBYtFtc9&SC6A zk=w4px=`CM^LQS-P}?K(_?+lMEw`3yK;BAlc5<;b)-|N|=-J#82(t$J>#13X68Q$+}G|Qdox$GtAqx!(Hrl>vnCJ!iqW!5_f15 z6gIHKDcUw|hQzP~`=r-itqtOoz%DLx#V0SXMKS(t^pxv)9s^J0c1%*)!4`^>FjB0pLdtYHB z^Fi%X#&&5`--BA*&eZUbR_MVV(@GiJAVzik%6dW@%os%_Yk=jB2_3(+p45(F zY_*sU>}jp=OqMCm0``n{R*JBdVok^Q#dF$P#`bHMcNG5TwM!IsL&r7NZfyf&GAemN z+rroevAv_;|AO|E!XE4x^}ncn=VH13m$gKiYSe$i$sT6a&!=PehD zzTEK%>rFTBK*t{bH?^%?j{Lfx|84DF7mJI1+7l8BeA#iJf1mc8!t_r4fW5-lE{vRG z{qJZWy4dml_q8q!q#5O%#JHK7p|1a%47hCTCxAv04;+_8N|4#eP z#WwnX)J80jGP`uT-hWV=>tc8Mb$useJGH(jXXzg+Y$P~?dg3f9w^N(m=~#bMpQ^Bh zozngs{YDpi)Ss*0#h4u71^NRjZ%d~a{RR3%3cJ12TmJU?ql{r^3JZ49>1M+zlH?^Q_XUhEyC4Wo!DCZKVE}rAGr2JATZ|%bisnj??Lr8v^dpaoe=7w_9oc5Ml z!llmRQtMje5?vD+9&g$Zl79>HNa&Ru;u`yOJ=8K4py;ZsOw;=jN19i{jm$}!8_L2h z_20qrTUzp$EG9X9-44|%%oN#cM{~NR%wM960>3WCaw%`x+ZNfIza(KPmu+domU?=v z>P<_ZA&McS&0A8u`VglkGCa+_SLS;8$9AVSP5^Aqsd;*NCiBSJrN7mK;^^a*_FK{| zM^H;&lB1)gRb| zs0&IP;#m)cBxvFr52afXQThX7PGCBDktU=sN!=vnc;+F=2J@R@5-2`yg{8EjR_kI3 z=$J9U>1Zp$Fn)zac4qwHs-4M7xB_UT zpI?GCEG@-Qw$Ynj#&m+ttS;rq6+y0{F>VEwHN{Hi|1CVfRMu;;-;$R0lveWc(>qjM zga9>;NS*XCt_%R%k&j!krS&pxdv`Z(fAVtYLU2!$l02GhD;)LWWlWP7|8|+;4hqlQlA#y8+cm#uJ8%$>dmfW^cS>t zUE`41wJY%#b$vMSx~g|iN2$-pfpRgs>-T`m!B1MPw93Ugq)E?});8@bF1y>W1-EI} zAzdzR={m#Qrrn41Hf@i}4I=klq=RCA*U{kl91_Y!`);Gf_mI;Dxs~0h#xapDNY`?D zx4#JK6w=$Yg@EN^L$|UZwdiobYr9eFws(u8)GokH;llZ2(+XCl2G>22Dj46k5#E$40l|2FM$rtAV-E_Rayomv`Wo5#d=-7g6~EyC@t zfSj&9NX}slk6~B=__UbO;~Mac3vU5W4bxK$8yT)-xQ^ilhSxCsE5mIJ?`OD!;j;{1 zX1I^x0ft`y2F15M9y7=$TZ0$s{+@RP%SCq2F?vw6@A+WxOD);+@gP~4da7?v()LJ( z)(LA0lT8?N^6Z6+3Wkzeayc|(7U?jf^HEm7xQ{$g_jG`3im5|<%ZXY+j=F! zkBP@n_A&81;8yWPuOq_uF$`+)#OhE`@0=JLE*Cu#6T)ALA&Ha1nlUQzhw#%FHCF_K z`XuCj&pLmp{V}oKcv{eVDBLheEC>e;8ZR%1Sv?!WF@r|U3*v8y72)@oKbN5ftHyEB zo%&kSsIOn=@ksu5E9&jk`!VAMaYFCB$O~dh@1Bv@*(L!w`b zk;NmU1C43Lj~QR0jps#5(7K7y5=b}&JZBVFM$6HbxF|PnD_(*0ZN=wD%f;WAe|gb` z(Fx+k;u}Euym*ZM9=^Jci}yqvuw3*k>7P|D29(TzUyUjuD^2M=C5wD!MwZ4hHDhMU zN^1hrcYxAVa(C7=+M)fhcXKLPAh`p>NI z#emX-S!c2|@~$-&we%)ylUQGxpWRNow6t?}Ip(6C+2sFyLAkp0yhw$ywRC)Th4EZ;6~h$_uVc7_;Rg&2lld7A zXIRB>1;gtY?qK)NW$8ZP3 z4;UJL=4UvZVHLv_46kFjgW(4Z4cv5t4H>RrcpbwX3X+B&aJqYtIfJY-(y{Cn46kFj zgJJg&_Z`C(3`ays=amdUWH=&=C?j&1&hSHqv)T}4OD@3=8IEYn6ozIyO7~#6lA+n2 zC@UF$$Z%&z=I_Luoe9oj*rN-l8GgucWg$^UbS1cjq1lZoJqWI3xbp~3AIbEiInA)g zU`lUc*y9*V?_@Y)2&F%iu$%(ip z*M#p2e-M}(Qc?+BFOE_Eqpfx~fc z`Y7C%9*8^AgAkbw#+~P5#28S=;%4*&z)AGW9wHT>D~8Jhl)f)OFMn5wHyGw z0(f!g3&6$UZ#@)CKa`U1QqGBtLwa?DzC6##`U~)Z_J@zgK5qgH-*@j(+=>OoGyS;g5+t* zKPPrHc-l)&-#b1brsaJESef@3;F)<}0{)TVI)<0$kv?7WiQY56qlH%Flm5r#cSBm{ zDxP+WKv@u80=S(eZ?>pxMF)aY7%pbYdWJJPkgXPk9|ixj9bN+5%kYB^uOa;@!(XDm z+mZM$>-3yo$DRY1tl%pKe5eh42j9)Wm+1GW2=+ye4&T5PQLzqRSLk9r{7J`GU@^dp zup;Qf%OxxuA=?;d8pU2mft0UEGUr5_EAN zd=-0dc&aX*ffwr7^Be~F9BS6Z^YB<5@yr0gz3^CFybSNu#Vh!RKo_sVJ9Y6Ie(h2h z?_hn_ao2D-;79ObU3`MO{kr%Reyoen;KjQ52fSCue+Ok8;8*ZxU3?FZ*2NEE3gD08 zWVHP!Kpl6jrU7=;P6h0wod(!hn-17Ts{}06ssOuc)qvf!Ie;Uz8o*K7Jiy~{3th)v z%my5*oe6k~mIj=oEdZ?1=-ah30CjPewg|9EYXoHp!)3Tpu8XCBn)su(6zSy*SKv0e zCRPIKVwJW6>D7QbzGYnnxL!LKlnVfLeABlE@IviRpj-rq-qF?pUW#w}&^y|NpkIMo z-smHS8?{T3{)=`Q;BDF!fOl$t0nc54X9PEd?+)ig`$SKO-WvTPYA&PG27Gx3f5fmB z|G<}gv^UTE;d?VbVa;js3uK~Gsq3-(U8EI82p5A-uxBl(tsWwVSEd_ktII|#s;{i8 zsT!ZM7cMHBRa+}6M%L9dG*qWrWf-=grgm0!s%*GDtJ+CVs;Qe_TU|bBvKYB=eyTd1 zuCePy`K(!#95;Jn_3Y|Yb$wN}C)1^g$&2P!XRz|roCS5&^$i)yq=w3dY9fhp$emMP zo=R0NI+U2fht8gAFms%d~i&1va|)Pkx8J5^DCmR(iZGXJdVRD-8PCYh;f zR84j5tc;?gY8F;|(Btd|JHuN6B~sN@o_39`oLOC)DLvM%q{7^~k+t05Or2sZbZo|4 zH4neIP&LoPazbTl-mp|sLwhygmP<%Gw3hqf&Mqn5yPwI9)q<*j-wBvOR9* z88F_VDom_ySdglB`I?oboQ(WQ)wLNnWS2X%g(uad8WvR6{))vM*Gx}osHy$ULxY&p zV(hG{ar0@!q({_Lk+Z=^L9D5t)sj4^p;fYERFr|URhgPIkUDJGX^qFsIHrdNrRFep^T5Ho?W@1 z77Dv{F?r-!G_GY?@>EV@9-5EAw}_F63+fwc>Z%VdsK~Onn33DU^3ua?S6|8CZI?rF zS!8plxTl=bp{Cj^Y*KZ@|1|S))%De>O3W*1F|0BTk+Z5@5(-Om@x&p9*H)&}Jn3dQ zDrhv$uB@s)gf3_7Nma0n@MiI}R#iQpJEwwk)SUclnhMn&&G=mQ9ncj9;(wD zX!0TbBs$+t^D51x@eV@Dx`>;Y-cXrBNnQ?wLNb|W(Hi5B#q{dTk|n253QS-h%rVk! zrq@=_Zh-A-=FCNmLD9w7nluOq5UM9N)HS5V^x2iQX_ZFd$(-RvC9`IYlGzTWMW=b^ z*oykuwwPX3$IGmkj)stYtcYv|>P#9$6|+yQuAYTimZu75NKc0UJy&E@b8ZT4geCy)@dPP0doKe5}C*Lz~B zihB464ftwzF&?(a?Rigb{VdF46vC0|=?SlH5m}C}OkwiD(C20-#ujYN2FLVSSia#? zb@Lk*DQ_YduArHM6DlHNWTc0SIlKhwX>KHk1*7Z~>Q7@nYTytlV*@8!P1&3~ZnoR&xq=(+R9Wl`;r)*s>TSAPKTxPL`2+V0BIK`DO0qGNg0fVCPOLjgrvsnSZ&A$4R^%kW>Zwi0GYR_W(LKFS;Lt7tP9 zG@vG#+dK@BG_|<1F|d%yP{v6}Pvblp`;a|7>PQ32+GN^m7GkEwg=os%s#3gFz$ih7 z4wt5s9>lg}&XM)$1u4h2>GD){MSVGVYUFVCPEKjnP#L^%;fnfSu44L3M;ThY=T(z# zp2lG9Y^bcMFF&iYhNDDp7M3cC(76iCP*hr(dOBvJ+B!8o*31&hWts_gXtLT23rf1k zWXv_y4UXYmvJ)6o(2kY1m2wdv)8ZHH_~F%t2vkHV#AwDH1&T-=l=2={Z);@_u+2FZ z#dJGQnVN$I604$TO3Hl=+eT466pvhYxOj%jtjxHngYg?2SMkQcREJa6OLu7OnhsJo z-H~25-IZ83y>iy9arLUzb?D7H`>bjY0VfL5MNg!J92rGF>5Kp*eC2*ovV>k(xQOYhWF}5dm+?5RslqUFcf~XMaU4&! zXibu1iheZg4`i-crt)7D=%4vgFlS%Wdt7K#` zON?GLGgUJyqY{NsXdG?J`f*jmAQR_~p&`)k@MpQObis1{=4R#&kwdQ1(o7K*ArECSAk|~DYptazk3z_g)B8+P#ocK%ORf@C)%kx4m+u>>G^O3Zgg|DL&VCykPw=*T#3fLZ_V+*cKF>3= z+L)v?9|E&4&)nB@&)Yrs+;i{DtekCDSLYgOjb9HT4L4y~p~%n_-y7XuF+V%jrl9Rj zwjT?mq2DJ&BF4%_W`^4YPeR9XBux3&D}D!}rata;s_-UpU)q7H7A?Qo(WDMBCQFG! zY)EWlf~ikuqK7fBIT&|P#&2PgmVt3W)6=EjJXH_O14@9b1JKd%@?5Yd%pM${ZVhLJ z=?G19tl5cfCHs8EZZ>MrrPqEUbr+?6NYh_%W3dVLWtUn?9@!ARj>E%X!-lj}< zB|{-Pp0Xkc^ zwReM2k5|{u&eWD&+^$o8=C(sc6=ko_$9nF~Qo>4G>Ee~!?B2#zN!YKeZ5jUfE)C3dl6-E3mb*2mt&Dx+jQZ1HNt3iU8F z!?@lVO4hl=rw*w2>Ud2HwZY(|Ccukk1Ee+DMlnNy-KbpcaRtoe;2qA*StE|aF2t@e`~AA7IfyU0;Pp;9pE5t9Wl?qGQ6Mk8B+{`uLn5{pVtiMDpUECkpZ4~)v&7Pg-rUn_eN8gU*H@TjNV$+y zcOeve2}nO#{Yl4$3tJ^?nz$966|B@7RN(G$YO3SYIEE2>!Bf@QRh;)VH@>jYxXGqQ z5w?Xjf}A?$k#varq`i)vnmX3N4X6>SN=swJScY`=dvC=tPJakO+*>idjI~#E>E5bi zjioh<%HCTAv*tLyy|+TR&D7U6s;FPB&9C~H@4eN>tIgTvnw_KETRC0hm^>|xR@3KYy#Dl+LhV@+)tq|`ct&|YMqrZ9Gp8J z&A(xhZRY8!0vEPEYyEWNOUT0;fb`hGM+0^ANQcV@!|P~xJrrI);9v3ZRuZ?NI+sGB zd}?)Rsj-YMq@~_gc$?|dNf4H!Q4TvVPaftF0RL!_V8&I~5ra?T?iP0UQTP3`c7E|F zdn^L&m#3T}&Msu##B~m42}vz0A|GC8C%2RG)2qIPbBxg#T+%UFs+N*_< zB*-sBCYwG+@6#5sGeGC-R~on6qx`EmHg0P5%B*Y&pSYoe0ZY59o#z0j=B_S;gM#3v zC?Cf6D-XwvHR8>+8|;1Uiya&RIZg|%=s+Mn6QEDHdSJMW2SrQeo+xCKy}3>mX1Wg* zu(=0pxxI(XpWUpl1g|)9j6fu2&m7`$%R& zusAfussca~3J7A&I8`AZ;LEyUar}hglEe)i{s+%KS=$Y|nuHCUnFdQ^=7X_{&3e<- zS=zDvNql@JUb34`$)=zFHe#~Nlx%F1mdKj}YKx8ft=m$35+QO~J?&V+K%kG4>%y6K zisI*iKTEn2$N7y}bx^jjU=j|l#g2N@j&bh6A-!YaP+v}{7GdjYTmn|D=1LrjlKP!R zRPs6eHcO{DxDzoco%2R$cbtNIT7%|ywzF9FJqY>37r5DUOYz)kx+%_-J7Uyi*9EA( zP*9V=+hDP3I@3*zL&soZS4TE!5<8+E>!eus6HG82eL|C1d}xW#+8|5eMB+ zcrr|8AE^wo_lF~sTIn%C;drnaZnXs?XA5XZC(^Aqjl9OvWwUzP2^@QRhRZSdlq)uH z#{_|-m8L>E4!;Dm$}|n|yfTE$$r^V)k$irf@6)wwOZAk zUz*oOWV+FDkYPY|ka3~btf7P)u*8;FIQT7MQse~?Q(`>D`)5+G$TaBf}f(oewn zR7EbSU#DUdfp1@}`xt;=TJYKHc!!gL)jFqbdoZogpKL}vqmy8x=2AebgDIh;gLcuE z4!~U02^DH9M_E3t3HAi;iV>up2=v8Gx=TaE5Bw)?v9rY+m`@r8E>E5jkBQ|;il=AlwX57DAf91Cj(%z{ zTu%W17X8>=@a*QI`^Y=h>fMckA+B%G_sj%v#WmqB_`peIgio3t%%K}q=NiYTTO}IepjR8>G}^5# z3ye8q_@zAQ)Ciz%iQ!e8d(30Ko+jy7Oi!%!9!swclF%7w5I^R`nGbYhAs%>%cWZg7 zncz{r%=c8Nw|F~mJmOf7_qiT)&p5Z$Yh=S+6Z}nrzre5CI!#KPlEmCD|9Y9vVCX2_ zBo1(i)46TZI%&G7AfKB?SB?WO?&mg1pSZKfH;@Y-NyzJm?88!^!);UDEMrKD;A8nk zT1$iKd~@r#jd;PZ)Xa1Dd)b}g8#X>kUfOV++7Ywi=<#f)kq)8H;68dT$CbRfaNNwV|74tB2<`;z%%W4+PWr4iaUob8=U1mpYSB}9Eai00|?sVKP3%M&TkMW`P zHoqnc@-5)ItzGhTvw!-f=N|vN>&Kp7EPm%>uYTxnUH+S&`ox9%4&Qw)U&&^o)~ivu zui`R&gVD}`N+uKS?5{Zg7_xl1e}p{M!&gxZWxeDd``UlJE&nWvySpVT@NPVMWe$!N$ z)}z*MRLG19nbGWENr;rFJ8O0RxqHxMqTSK%yvvlM-TZ;i5qj|$;X&);gAAFEcG`f) zjp9cr9y3hFz+{uL>kg?cMqJcVdb3Zffekkn2p;p`hDFV=?|M7#I!qC1p#P4lcMpOv zFa3j2>x(&O>@9;YWhKLx#y(M^qm_^tx5N-t>i5UMfQ`cg&XM7*+QmJCBfcbWC3#BJ z@C9q}!hlL&P{B)9@RAk0G^o+bB}0O-#58ygqUG#h7IsBt#)&R^>7PaFSuwqg)U!02 z5WH{e@e@7X=FxUa{b!zDt=GVHsL}`D3Q_B`WD1r3kSR{4+2W+t4qMYVLQ}XJ9W6jT z{q>qfEK%z&shmLHjZRy^>l6%tX6xJb{E1MW7yv~I^!$m?oiGs%M`aV(zF5`J8yD@9 zEI>7?4D#|a;9!HtR-!Uqe^w;Dp~q`_+}T>`SKGXAW&_``(e7xpeFFQWQcuF7^Xl=6 z9xr>Pcp0G9+>Fym+ACWcCcXjZwSHl!e&u_M_e0*_XXNq63ib5R07ks zRR)ZRz)?TWj~PvbFxn*zfhO6YKjx`&hQ0*68Ie0~%)Mhg_3e04SsfC|?cJU|TQy9a z$->mEq=F(*wnd2E_M9=KZ;PYjp0?M+q`qWo1*&&^`FH%wUCF0hA`{inIFw0Kq&*@^ z-vo=J{4er~q{lw<>ZhKm~^`@9`lm=3ASSf0c zg04|FX31!b$v`CDI)O3crS3ivZ&zGfg=uV5(o6$Sg4P2!0(mzHR( zw+eJ=-Nj-RkTBKQk=9+>BQjZ@XpG;TrlDh=Jy=gn3k@SIjSb0%D`cSn>B9Im$r2*< z95K1RDTy8xM{aMC)I=b#4b9sz0U*f-MC7f*?LIz`%>@6NO$RXtF?#BF8oziok+hx_ zbM0Dhvo13QCeWU>ZEeFePL@LKg62Ak#j+*_88mDH_vsZJ&g)3{Xpv4F-}W#vE{2 z;J`ZJBYVgAylRmt$hefE_CsasU!e!OToH}!3LGm5&y(d6?DWZOxx~aHEgDo)s0<{z zq>>tliYtANO6GuvQW9tn0W%pugT{zphjMaB73q@6xnlYubWNP?hql8Ku{hiMihD1g z{?~GRN`-U!91`WvO^uK8fhqQx1~=b&W9i`c?!5Z1zyHuDzxT}-Kl82HKU}=;`CX%L z{r0Wjdg<-w{`&2I`LDlu(5-y<`WJsN{q6T1e(de~n;(4a@fUvhwci_k?4Nh;{rs6f zn!W!$KmGon{Mt|d;>7ZI|L{kTyTaI^om2n#`b&eS|Lyz#bo$rd|GVwCPM`Vi{GJbO zU3zff>z{e})xEF%!N`yPZ27_Ozxemr{~pMIlhZ_J!9u>pJ^8*|M!rPeL|@z^OH$lZ zJRlo1?=cc~*Dlkc})LO{&&iv$Qr+|i%lYSFFGAfz`je~ zX1Z*lP+}CAv7xPp|3>eVXooGy^<9u+L`&RtiJ_G-S^zFv^JjI%=Jh2acP)~uauK(YOd z*rG*O@@QYmBAblap*3k|yDf_~FqrGZ9#@TLx5+RW&Dyq~#ms0WBZs8(L%D&dmd7fI zars?Q`*T{t#N_snth5zt2`DgNwph2z80q~Wc(fqY)bdDLK(M)uTbnI#jo zzfjs_x~_H1R=U#&AAyyl(^h0#)P^$WXU~gsIf? z+jIC&?JsBbuS8x-yW#~z!>Ik$KL4UMs8C=9K^@v(^<$dTLz`zou2f_K@0IvGVa(iz za@$Ot@~EW^tuN`X4NYDN5R2&ZauSN04(E2z)VG#Pf#UF#X4oICeV-(&{+bHc#SxR4 zCb5ZYpN!i+Q{OQVHxQd0E?_OsA7-|nxm+sIHlfG*jngzAjfotujkX~GXH=f5fX$G# z9rgpW6lfL5FsU?!+b<3{rrDpHQ~4b8t=Rr6n2*m<$ZEPV0jXazzJ5bK!scA1FJDG$ zA*Bp^zmXqwndq758Ed`Mp4(Z1STC@)C1$E#uz;9V{D1)|Aq3$J43|sq%5BkV%>Pa; z*p%eUn%gcT4&w~EJ|K`Rm)?^bk^`Z(+iAMjms)d3Ds1J;K}_x8-k4OFr8e`9(6fO8sTgQFed%Ne)-7X_Bj@Htxgc|c5@&b~`;e%ITMxmvhh+_l z^T1!pz3aeZrbQRgYHCJ<*tQ(-fO+4snuD3(@x*x`xVx}{bm0t9UXv^ zZky@seSQN-Bi801bo<}K+&q8>FyR1wb$d%!S~SKQ6zL{K)xdY&v#5ld74a>m3ZDpF z;gZY>ze{{3`2l`!+ONL5AibaAZ;r&h_A{1lN3hA~=PaLOP1qn%ewT;~ zuXDjC!)LMkdu)9AE7UH*Q%PptcqLlamsQ*dRPTkGhfF?)`P6rxIzm||4!;Z;Tr?h> z2{=lFbW^WI`R0~GDvxG(q!vz$INkaMK|A4&i?!|J!~@VhO=I>>*e~e^;v&Y zr@~C@)`<1}q?5g$9tV0H=y9OOfgT5X9O!YN$AKOPdK~yw;6R3N)N<}Chkg}s?cvzt mK#v1G4)i$C<3NuCJr49Z(BnXl13eD(IMCxjj|2Y~4*V||p_HTm diff --git a/Examples/tutorial2/External-bin/IBatisNet.Common.dll b/Examples/tutorial2/External-bin/IBatisNet.Common.dll deleted file mode 100644 index 7f841a0fd3f4c125b30be40820f32d82a860e590..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98304 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 PQs5#5E>hs%2L=8&oxhi; diff --git a/Examples/tutorial2/External-bin/IBatisNet.Common.xml b/Examples/tutorial2/External-bin/IBatisNet.Common.xml deleted file mode 100644 index f1a83d1..0000000 --- a/Examples/tutorial2/External-bin/IBatisNet.Common.xml +++ /dev/null @@ -1,4793 +0,0 @@ - - - - IBatisNet.Common - - - - - Summary description for NodeUtils. - - - - - Searches for the attribute with the specified name in this attributes list. - - - The key - - - - - Searches for the attribute with the specified name in this attributes list. - - - The key - The default value to be returned if the attribute is not found. - - - - - Searches for the attribute with the specified name in this attributes list. - - - The key - The default value to be returned if the attribute is not found. - - - - - Searches for the attribute with the specified name in this attributes list. - - - The key - The default value to be returned if the attribute is not found. - - - - - Searches for the attribute with the specified name in this attributes list. - - - The key - The default value to be returned if the attribute is not found. - - - - - - - - - - - - - - - - - - - - Replace properties by their values in the given string - - - - - - - - The class defines a set property accessor and - provides Reflection.Emit-generated - via the new DynamicMethod (.NET V2). - - - - - Abstract base class for member accessor - - - - - The null internal value used by this member type - - - - - List of type-opCode - - - - - Static constructor - "Initialize a private IDictionary with type-opCode pairs - - - - - Get the null value for a given type - - - - - - - The interface defines a field/property set accessor. - provides Reflection.Emit-generated - implementations for drastically improved performance over default late-bind - invoke. - - - - - The interface defines a field/property contract. - - - - - Gets the member name. - - - - - Gets the type of this member (field or property). - - - - - The interface defines a field/property set contrat to set the - value on a field or property. - - - - - Sets the value for the field/property of the specified target. - - Object to set the field/property on. - Value. - - - - The property name - - - - - The property type - - - - - Initializes a new instance of the class - for set property access via DynamicMethod. - - Type of the target object. - Name of the property. - - - - Sets the field for the specified target. - - Target object. - Value to set. - - - - Gets the property's name. - - - - - - Gets the property's type. - - - - - - The LogManager can produce ILogFactory for various logging APIs, - most notably for log4net. - Other implemenations such as - * SimpleLogger - * NoOpLogger are also supported. - - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Gets the logger. - - The type. - - - - - Gets the logger. - - The name. - - - - - Builds the logger factory adapter. - - - - - - Builds the default logger factory adapter. - - - - - - Gets or sets the adapter. - - The adapter. - - - - Logger sending everything to the trace output stream. - - - - - A simple logging interface abstracting logging APIs. - - - - - Log a message object with the level. - - The message object to log. - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - - Log a message object with the level. - - The message object to log. - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - - Log a message object with the level. - - The message object to log. - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - - Log a message object with the level. - - The message object to log. - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - - Log a message object with the level. - - The message object to log. - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - - Checks if this logger is enabled for the level. - - - - - Checks if this logger is enabled for the level. - - - - - Checks if this logger is enabled for the level. - - - - - Checks if this logger is enabled for the level. - - - - - Checks if this logger is enabled for the level. - - - - - - - - - Include the current time in the log message - Include the instance name in the log message - The date and time format to use in the log message - - - - Do the actual logging. - This method assembles the message and write - the content of the message accumulated in the specified - StringBuffer to the appropriate output destination. The - default implementation writes to System.Console.Error.

-

- - - -
- - - Is the given log level currently enabled ? - - - - - - - Log a debug message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Factory interface to create provider specific ado.net objects. - - - - - Create a connection object for this provider. - - An 'IDbConnection' object. - - - - Create a command object for this provider. - - An 'IDbCommand' object. - - - - Create a dataAdapter object for this provider. - - An 'IDbDataAdapter' object. - - - - Create a IDataParameter object for this provider. - - An 'IDbDataParameter' object. - - - - Change the parameterName into the correct format IDbCommand.CommandText - for the ConnectionProvider - - The unformatted name of the parameter - A parameter formatted for an IDbCommand.CommandText - - - - Changes the parameterName into the correct format for an IDbParameter - for the Driver. - - - For SqlServerConnectionProvider it will change id to @id - - The unformatted name of the parameter - A parameter formatted for an IDbParameter. - - - - Init the provider. - - - - - The name of the assembly which conatins the definition of the provider. - - Examples : "System.Data", "Microsoft.Data.Odbc" - - - - Tell us if it is the default data source. - Default false. - - - - - Tell us if this provider is enabled. - Default true. - - - - - Tell us if this provider allows having multiple open with - the same . - - - - - The connection class name to use. - - - "System.Data.OleDb.OleDbConnection", - "System.Data.SqlClient.SqlConnection", - "Microsoft.Data.Odbc.OdbcConnection" - - - - - Does this ConnectionProvider require the use of a Named Prefix in the SQL - statement. - - - The OLE DB/ODBC .NET Provider does not support named parameters for - passing parameters to an SQL Statement or a stored procedure called - by an IDbCommand when CommandType is set to Text. - - For example, SqlClient requires select * from simple where simple_id = @simple_id - If this is false, like with the OleDb or Obdc provider, then it is assumed that - the ? can be a placeholder for the parameter in the SQL statement when CommandType - is set to Text. - - - - - Does this ConnectionProvider require the use of the Named Prefix when trying - to reference the Parameter in the Command's Parameter collection. - - - This is really only useful when the UseParameterPrefixInSql = true. - When this is true the code will look like IDbParameter param = cmd.Parameters["@paramName"], - if this is false the code will be IDbParameter param = cmd.Parameters["paramName"] - ie - Oracle. - - - - - The OLE DB/OBDC .NET Provider uses positional parameters that are marked with a - question mark (?) instead of named parameters. - - - - - Used to indicate whether or not the provider - supports parameter size. - - - See JIRA-49 about SQLite.Net provider not supporting parameter size. - - - - - Used to indicate whether or not the provider - supports parameter precision. - - - See JIRA-49 about SQLite.Net provider not supporting parameter precision. - - - - - Used to indicate whether or not the provider - supports a parameter scale. - - - See JIRA-49 about SQLite.Net provider not supporting parameter scale. - - - - - Used to indicate whether or not the provider - supports DeriveParameters method for procedure. - - - - - The command class name to use. - - - "System.Data.SqlClient.SqlCommand" - - - - - The ParameterDbType class name to use. - - - "System.Data.SqlDbType" - - - - - The ParameterDbTypeProperty class name to use. - - - SqlDbType in SqlParamater.SqlDbType, - OracleType in OracleParameter.OracleType. - - - - - The dataAdapter class name to use. - - - "System.Data.SqlDbType" - - - - - The commandBuilder class name to use. - - - "System.Data.OleDb.OleDbCommandBuilder", - "System.Data.SqlClient.SqlCommandBuilder", - "Microsoft.Data.Odbc.OdbcCommandBuilder" - - - - - Name used to identify the provider amongst the others. - - - - - Description. - - - - - Parameter prefix use in store procedure. - - @ for Sql Server. - - - - Check if this provider is Odbc ? - - - - - Create the CommandBuilder Type for this provider. - - An object. - - - - Get the ParameterDb Type for this provider. - - An object. - - - - Description résumée de ObjectProbe. - - - - - Returns an array of the readable properties names exposed by an object - - The object - The properties name - - - - Returns an array of the writeable members name exposed by a object - - The object - The members name - - - - Returns the type that the set expects to receive as a parameter when - setting a member value. - - The object to check - The name of the member - The type of the member - - - - Returns the type that the set expects to receive as a parameter when - setting a member value. - - The class type to check - The name of the member - The type of the member - - - - Returns the type that the get expects to receive as a parameter when - setting a member value. - - The object to check - The name of the member - The type of the member - - - - Returns the type that the get expects to receive as a parameter when - setting a member value. - - The type to check - The name of the member - The type of the member - - - - Returns the MemberInfo of the set member on the specified type. - - The type to check - The name of the member - The type of the member - - - - Gets the value of an array member on the specified object. - - The obj. - The array index. - The accessor factory. - The member value. - - - - Sets the array member. - - The obj. - Name of the indexed. - The value. - The accessor factory. - - - - Return the specified member on an object. - - The Object on which to invoke the specified property. - Name of the member. - The accessor factory. - An Object representing the return value of the invoked property. - - - - Gets the member's value on the specified object. - - The obj. - Name of the member. - The accessor factory. - The member's value - - - - Sets the member value. - - he Object on which to invoke the specified mmber. - Name of the member. - The member value. - The object factory. - The accessor factory. - - - - Sets the member. - - The obj. - Name of the member. - The member value. - The accessor factory. - - - - Checks to see if a Object has a writable property/field be a given name - - The object to check - The property to check for - True if the property exists and is writable - - - - Checks to see if the Object have a property/field be a given name. - - The Object on which to invoke the specified property. - The name of the property to check for. - - True or false if the property exists and is readable. - - - - - - - - - - - - The interface defines a field/property get contrat to get the - value of a field or a property. - - - - - Gets the value stored in the field/property for the specified target. - - Object to retrieve the field/property from. - The value. - - - - Summary description for ProviderDeSerializer. - - - - - Deserializes the specified node in a . - - The node. - The - - - - Summary description for DataSourceDeSerializer. - - - - - Deserialize a DataSource object - - - - - - - A factory to build for a type. - - - - - Factory contact to build for a type. - - - - - Generate an instance. - - Target object type. - Field or Property name. - null if the generation fail - - - - Initializes a new instance of the class. - - if set to true [allow code generation]. - - - - Create a Dynamic ISetAccessor instance for a property - - Target object type. - Property name. - null if the generation fail - - - - Create a Dynamic ISetAccessor instance for a field - - Target object type. - field name. - null if the generation fail - - - - Create a ISetAccessor instance for a property - - Target object type. - Property name. - null if the generation fail - - - - Create a ISetAccessor instance for a field - - Target object type. - Field name. - null if the generation fail - - - - Create a Reflection ISetAccessor instance for a property - - Target object type. - Property name. - null if the generation fail - - - - Create Reflection ISetAccessor instance for a field - - Target object type. - field name. - null if the generation fail - - - - Generate an instance. - - Target object type. - Field or Property name. - null if the generation fail - - - - The class provides an reflection set access - to a field of a specified target class. - - - - - Initializes a new instance of the class. - - Type of the target. - Name of the field. - - - - Sets the value for the field of the specified target. - - Object to set the property on. - Property value. - - - - Gets the member name. - - - - - Gets the type of this member, such as field, property. - - - - - A factory to build for a type. - - - - - Factory contact to build for a type. - - - - - Generate an instance. - - Target object type. - Field or Property name. - null if the generation fail - - - - Initializes a new instance of the class. - - if set to true [allow code generation]. - - - - Create a Dynamic IGetAccessor instance for a property - - Target object type. - Property name. - null if the generation fail - - - - Create a Dynamic IGetAccessor instance for a field - - Target object type. - Property name. - null if the generation fail - - - - Create a IGetAccessor instance for a property - - Target object type. - Property name. - null if the generation fail - - - - Create a IGetAccessor instance for a field - - Target object type. - Field name. - null if the generation fail - - - - Create a Reflection IGetAccessor instance for a property - - Target object type. - Property name. - null if the generation fail - - - - Create Reflection IGetAccessor instance for a field - - Target object type. - field name. - null if the generation fail - - - - Generate an instance. - - Target object type. - Field or Property name. - null if the generation fail - - - - The class provides an IL-based get access - to a property of a specified target class. - - - - - The interface defines a field/property get accessor. - provides Reflection.Emit-generated - implementations for drastically improved performance over default late-bind - invoke. - - - - - The property name - - - - - The property type - - - - - The class parent type - - - - - The IL emitted IGet - - - - - Initializes a new instance of the class. - - Type of the target object. - Name of the property. - The . - The . - - - - This method create a new type oject for the the property accessor class - that will provide dynamic access. - - The assembly builder. - The module builder. - - - - Create an type that will provide the set access method. - - - new ReflectionPermission(PermissionState.Unrestricted).Assert(); - CodeAccessPermission.RevertAssert(); - - The module builder. - - - - Gets the property value from the specified target. - - Target object. - Property value. - - - - Gets the property's name. - - - - - - Gets the property's type. - - - - - - The class provides an IL-based get access - to a field of a specified target class. - - Will Throw FieldAccessException on private field - - - - The field name - - - - - The class parent type - - - - - The IL emitted IGet - - - - - Initializes a new instance of the class. - - Type of the target object. - Name of the field. - The assembly builder. - The module builder. - - - - This method create a new type oject for the the property accessor class - that will provide dynamic access. - - The assembly builder. - The module builder. - - - - Create an type that will provide the set access method. - - - new ReflectionPermission(PermissionState.Unrestricted).Assert(); - CodeAccessPermission.RevertAssert(); - - The module builder. - - - - Gets the value stored in the field for the specified target. - - Object to retrieve the field from. - The value. - - - - Gets the field's name. - - - - - - Gets the field's type. - - - - - - The class defines a field get accessor and - provides Reflection.Emit-generated - via the new DynamicMethod (.NET V2). - - - - - The field name - - - - - The class parent type - - - - - Initializes a new instance of the class - for field get access via DynamicMethod. - - Type of the target object. - Name of the field. - - - - Sets the field for the specified target. - - Target object. - Value to set. - - - - Gets the field's name. - - - - - - Gets the field's type. - - - - - - DBHelperParameterCache provides functions to leverage a - static cache of procedure parameters, and the - ability to discover parameters for stored procedures at run-time. - - - - - Resolve at run time the appropriate set of Parameters for a stored procedure - - An IDalSession object - the name of the stored procedure - whether or not to include their return value parameter - - - - - Discover at run time the appropriate set of Parameters for a stored procedure - - An IDalSession object - Name of the stored procedure. - if set to true [include return value parameter]. - The stored procedure parameters. - - - - Deep copy of cached IDataParameter array. - - - - - - - Add parameter array to the cache - - a valid connection string for an IDbConnection - the stored procedure name or SQL command - an array of IDataParameters to be cached - - - - Clear the parameter cache. - - - - - retrieve a parameter array from the cache - - a valid connection string for an IDbConnection - the stored procedure name or SQL command - an array of IDataParameters - - - - Retrieves the set of IDataParameters appropriate for the stored procedure - - - This method will query the database for this information, and then store it in a cache for future requests. - - a valid session - the name of the stored procedure - an array of IDataParameters - - - - Retrieves the set of IDataParameters appropriate for the stored procedure - - - This method will query the database for this information, and then store it in a cache for future requests. - - a valid session - the name of the stored procedure - a bool value indicating whether the return value parameter should be included in the results - an array of IDataParameters - - - - Specifies the isolation level of a transaction. - - - - - Volatile data can be read but not modified, - and no new data can be added during the transaction. - - - - - Volatile data can be read but not modified during the transaction. - New data may be added during the transaction. - - - - - Volatile data cannot be read during the transaction, but can be modified. - - - - - Volatile data can be read and modified during the transaction. - - - - - Volatile data can be read but not modified, - and no new data can be added during the transaction. - - - - - Helper methods with regard to type. - - -

- Mainly for internal use within the framework. -

-
-
- - - Creates a new instance of the class. - - -

- This is a utility class, and as such exposes no public constructors. -

-
-
- - - Resolves the supplied type name into a - instance. - - - The (possibly partially assembly qualified) name of a - . - - - A resolved instance. - - - If the type cannot be resolved. - - - - - Instantiate a 'Primitive' Type. - - a typeCode. - An object. - - - - Instantiate a Nullable Type. - - The nullable type. - An object. - - - - Helper class that returns appropriate boxing opcode based on type - - From Spring.NET - - - - Initializes the class. - - - - - Gets the . - - The type. - - - - - A implementation that can create objects - via Activator.CreateInstance - - - - - A factory that can create objects - - - - - Create a new instance for a given type - - The type instance to build - The types of the constructor arguments - Returns a new see cref="IFactory"/> instance - - - - Create a new see instance for a given type - - The type instance to build - The types of the constructor arguments - Returns a new instance. - - - - Contains parameters that specify Transaction behaviors. - - - - - Length of time that the transaction waits before automatically - closing itself - - - - - The isolation level of the transaction. - - - - - Summary description for NoOpLoggerFA. - - - - - LoggerFactoryAdapter interface is used internally by LogManager - Only developers wishing to write new SLF4J adapters need to - worry about this interface. - - - - - Get a ILog instance by type - - - - - - - Get a ILog instance by type name - - - - - - - Constructor - - - - - Constructor - - - - - Get a ILog instance by type - - - - - - - Get a ILog instance by type name - - - - - - - A template for a session in the iBATIS.NET framwork. - Holds the connection, the transaction ... - - - - - Complete (commit) a transsaction - - - - - Open a connection. - - - - - Open a connection, on the specified connection string. - - The connection string - - - - close a connection - - - - - Open a connection and begin a transaction - - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - - - - Begins a database transaction - - Open a connection. - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - The transaction isolation level for this connection. - - - - Open a connection and begin a transaction at the data source - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - The connection string - Open a connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Commit a transaction and close the associated connection - - - - - Commits the database transaction. - - Close the connection - - - - Rollbak a transaction and close the associated connection - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - Create a command - - The type of the command - An IDbCommand. - - - - Create an DataParameter - - An IDbDataParameter. - - - - Create a DataAdapter - - The statement or stored procedure - used to select records in the data source. - An IDbDataAdapter. - - - - Create a DataAdapter - - An IDbDataAdapter. - - - - The data source use by the session. - - - - - The Connection use by the session. - - - - - The Transaction use by the session. - - - - - Description résumée de ScriptRunner. - - - - - Constructor - - - - - Run an sql script - - The dataSouce that will be used to run the script. - a path to an sql script file. - - - - Run an sql script - - The dataSouce that will be used to run the script. - a path to an sql script file. - parse out the statements in the sql script file. - - - - Execute the given sql statements - - The dataSouce that will be used. - An ArrayList of sql statements to execute. - - - - Parse and tokenize the sql script into multiple statements - - the script to parse - - - - The class provides an reflection get access - to a property of a specified target class. - - - - - Initializes a new instance of the class. - - Type of the target. - Name of the property. - - - - Gets the value stored in the property for - the specified target. - - Object to retrieve the property from. - Property value. - - - - Gets the property name. - - - - - Gets the type of this property. - - - - - Represents the method that handles calls from Configure. - - - obj is a null object in a DaoManager context. - obj is the reconfigured sqlMap in a SqlMap context. - - - - - - - - - - Master Config File name. - - - - - Delegate called when a file is changed, use it to rebuild. - - - - - Class used to watch config files. - - - Uses the to monitor - changes to a specified file. Because multiple change notifications - may be raised when the file is modified, a timer is used to - compress the notifications into a single event. The timer - waits for time before delivering - the event notification. If any further - change notifications arrive while the timer is waiting it - is reset and waits again for to - elaps. - - - - - The default amount of time to wait after receiving notification - before reloading the config file. - - - - - The timer used to compress the notification events. - - - - - A list of configuration files to watch. - - - - - The list of FileSystemWatcher. - - - - - - - - - Represent the call context of the SqlMap or DaoManager ConfigureAndWatch method call. - - - - - - Add a file to be monitored. - - - - - - Reset the list of files being monitored. - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - This handler reloads the configuration from the file when the event is fired. - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - This handler reloads the configuration from the file when the event is fired. - - - - - Summary description for NoOpLogger. - - - - - A NOP implementation. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - A StringTokenizer java like object - - - - - Constructs a StringTokenizer on the specified String, using the - default delimiter set (which is " \t\n\r\f"). - - The input String - - - - Constructs a StringTokenizer on the specified String, - using the specified delimiter set. - - The input String - The delimiter String - - - - Constructs a StringTokenizer on the specified String, - using the specified delimiter set. - - The input String - The delimiter String - Returns delimiters as tokens or skip them - - - - - - - - - - Returns the number of tokens in the String using - the current deliminter set. This is the number of times - nextToken() can return before it will generate an exception. - Use of this routine to count the number of tokens is faster - than repeatedly calling nextToken() because the substrings - are not constructed and returned for each token. - - - - - Logger sending everything to the standard output error stream. - - - - - - - - - Include the current time in the log message - Include the instance name in the log message - The date and time format to use in the log message - - - - Do the actual logging. - This method assembles the message and write - the content of the message accumulated in the specified - StringBuffer to the appropriate output destination. The - default implementation writes to System.Console.Error.

-

- - - -
- - - Is the given log level currently enabled ? - - - - - - - Log a debug message. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Accessor factory - - - - - Initializes a new instance of the class. - - The set accessor factory. - The get accessor factory. - - - - The factory which build - - - - - The factory which build - - - - - Describes how a transaction scope is associated with a transaction. - - - - - The transaction scope must be associated with a transaction. - If we are in a transaction scope join it. If we aren't, create a new one. - - - - - Always creates a new transaction scope. - - - - - Don't need a transaction scope, but if we are in a transaction scope then join it. - - - - - Means that cannot cannot be associated with a transaction scope. - - - - - The transaction scope must be associated with an existing transaction scope. - - - - - Description résumée de IProxyGenerator. - - - - - The class defines a get property accessor and - provides Reflection.Emit-generated - via the new DynamicMethod (.NET V2). - - - - - The property name - - - - - The property type - - - - - Initializes a new instance of the class - for get property access via DynamicMethod. - - Type of the target object. - Name of the property. - - - - Gets the field value from the specified target. - - Target object. - Property value. - - - - Gets the property's name. - - - - - - Gets the property's type. - - - - - - IDataSource - - - - - DataSource Name. - - - - - Connection string used to create connections. - - - - - The data provider. - - - - - Information about a data provider. - - - - - Do not use direclty, only for serialization. - - - - - Init the provider. - - - - - Create a connection object for this provider. - - An 'IDbConnection' object. - - - - Create a command object for this provider. - - An 'IDbCommand' object. - - - - Create a dataAdapter object for this provider. - - An 'IDbDataAdapter' object. - - - - Create a IDbDataParameter object for this provider. - - An 'IDbDataParameter' object. - - - - Change the parameterName into the correct format IDbCommand.CommandText - for the ConnectionProvider - - The unformatted name of the parameter - A parameter formatted for an IDbCommand.CommandText - - - - Changes the parameterName into the correct format for an IDbParameter - for the Driver. - - - For SqlServerConnectionProvider it will change id to @id - - The unformatted name of the parameter - A parameter formatted for an IDbParameter. - - - - Equals implemantation. - - The test object. - A boolean. - - - - A hashcode for the provider. - - An integer. - - - - ToString implementation. - - A string that describes the provider. - - - - The name of the assembly which conatins the definition of the provider. - - Examples : "System.Data", "Microsoft.Data.Odbc" - - - - Tell us if it is the default data source. - Default false. - - - - - Tell us if this provider is enabled. - Default true. - - - - - Tell us if this provider allows having multiple open with - the same . - - - It's a new feature in ADO.NET 2.0 and Sql Server 2005 that allows for multiple forward only read only result sets (MARS). - Some databases have supported this functionality for a long time : - Not Supported : DB2, MySql.Data, OLE DB provider [except Sql Server 2005 when using MDAC 9], SQLite, Obdc - Supported : Sql Server 2005, Npgsql - - - - - The connection class name to use. - - - "System.Data.OleDb.OleDbConnection", - "System.Data.SqlClient.SqlConnection", - "Microsoft.Data.Odbc.OdbcConnection" - - - - - Does this ConnectionProvider require the use of a Named Prefix in the SQL - statement. - - - The OLE DB/ODBC .NET Provider does not support named parameters for - passing parameters to an SQL Statement or a stored procedure called - by an IDbCommand when CommandType is set to Text. - - For example, SqlClient requires select * from simple where simple_id = @simple_id - If this is false, like with the OleDb or Obdc provider, then it is assumed that - the ? can be a placeholder for the parameter in the SQL statement when CommandType - is set to Text. - - - - - Does this ConnectionProvider require the use of the Named Prefix when trying - to reference the Parameter in the Command's Parameter collection. - - - This is really only useful when the UseParameterPrefixInSql = true. - When this is true the code will look like IDbParameter param = cmd.Parameters["@paramName"], - if this is false the code will be IDbParameter param = cmd.Parameters["paramName"] - ie - Oracle. - - - - - The OLE DB/OBDC .NET Provider uses positional parameters that are marked with a - question mark (?) instead of named parameters. - - - - - Used to indicate whether or not the provider - supports parameter size. - - - See JIRA-49 about SQLite.Net provider not supporting parameter size. - - - - - Used to indicate whether or not the provider - supports parameter precision. - - - See JIRA-49 about SQLite.Net provider not supporting parameter precision. - - - - - Used to indicate whether or not the provider - supports a parameter scale. - - - See JIRA-49 about SQLite.Net provider not supporting parameter scale. - - - - - Used to indicate whether or not the provider - supports DeriveParameters method for procedure. - - - - - The command class name to use. - - - "System.Data.SqlClient.SqlCommand" - - - - - The ParameterDbType class name to use. - - - "System.Data.SqlDbType" - - - - - The ParameterDbTypeProperty class name to use. - - - SqlDbType in SqlParamater.SqlDbType, - OracleType in OracleParameter.OracleType. - - - - - The dataAdapter class name to use. - - - "System.Data.SqlDbType" - - - - - The commandBuilder class name to use. - - - "System.Data.OleDb.OleDbCommandBuilder", - "System.Data.SqlClient.SqlCommandBuilder", - "Microsoft.Data.Odbc.OdbcCommandBuilder" - - - - - Name used to identify the provider amongst the others. - - - - - Description. - - - - - Parameter prefix use in store procedure. - - @ for Sql Server. - - - - Check if this provider is Odbc ? - - - - - Get the CommandBuilder Type for this provider. - - An object. - - - - Get the ParameterDb Type for this provider. - - An object. - - - - Resolves (instantiates) a by it's (possibly - assembly qualified) name, and caches the - instance against the type name. - - - - - Resolves a by name. - - -

- The rationale behind the creation of this interface is to centralise - the resolution of type names to instances - beyond that offered by the plain vanilla - method call. -

-
-
- - - Resolves the supplied to a - - instance. - - - The (possibly partially assembly qualified) name of a - . - - - A resolved instance. - - - If the supplied could not be resolved - to a . - - - - - The cache, mapping type names ( instances) against - instances. - - - - - Creates a new instance of the class. - - - The that this instance will delegate - actual resolution to if a - cannot be found in this instance's cache. - - - If the supplied is . - - - - - Resolves the supplied to a - - instance. - - - The (possibly partially assembly qualified) name of a - . - - - A resolved instance. - - - If the supplied could not be resolved - to a . - - - - - An ProxyGenerator with cache that uses the Castle.DynamicProxy library. - - - - - Cosntructor - - - - - Generates a proxy implementing all the specified interfaces and - redirecting method invocations to the specifed interceptor. - - Interface to be implemented - instance of - The target object. - Proxy instance - - - - Generates a proxy implementing all the specified interfaces and - redirecting method invocations to the specifed interceptor. - - Array of interfaces to be implemented - instance of - The target object. - Proxy instance - - - - Generates a proxy implementing all the specified interfaces and - redirecting method invocations to the specifed interceptor. - This proxy is for object different from IList or ICollection - - The target type - The interceptor. - The arguments for constructor. - - - - - A implementation that builds object via DynamicMethod. - - - - - Factory to create object for a given type - - - - - Create a new instance with the specified parameters - - - An array of values that matches the number, order and type - of the parameters for this constructor. - - - If you call a constructor with no parameters, pass null. - Anyway, what you pass will be ignore. - - A new instance - - - - Create a new instance with the specified parameters - - - An array of values that matches the number, order and type - of the parameters for this constructor. - - - If you call a constructor with no parameters, pass null. - Anyway, what you pass will be ignore. - - A new instance - - - - Initializes a new instance of the class. - - The instance type to create. - The types argument. - - - - Emit parameter IL for a method call. - - IL generator. - Arguments type defined for a the constructor. - - - - Summary description for TraceLoggerFA. - - - - - Constructor - - - - - - Get a ILog instance by type - - - - - - - Get a ILog instance by type name - - - - - - - This class represents a cached set of class definition information that - allows for easy mapping between property names and get/set methods. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the . - - Member's name. - The - - - - Gets the type of the member. - - Member's name. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets an instance of ReflectionInfo for the specified type. - summary> - The type for which to lookup the method cache. - The properties cache for the type - - - - - - - - - The class provides an reflection get access - to a field of a specified target class. - - - - - Initializes a new instance of the class. - - Type of the target. - Name of the field. - - - - Gets the value stored in the field for the specified target. - - Object to retrieve the field/property from. - The field alue. - - - - Gets the member name. - - - - - Gets the type of this member, such as field, property. - - - - - Resolves a by name. - - -

- The rationale behind the creation of this class is to centralise the - resolution of type names to instances beyond that - offered by the plain vanilla System.Type.GetType method call. -

-
- $Id: TypeResolver.cs,v 1.5 2004/09/28 07:51:47 springboy Exp $ -
- - - Creates a new instance of the TypeResolver class. - - - - - Resolves the supplied to a - instance. - - - The unresolved name of a . - - - A resolved instance. - - - If the supplied could not be resolved - to a . - - - - - Resolves the supplied generic , - substituting recursively all its type parameters., - to a instance. - - - The (possibly generic) name of a . - - - A resolved instance. - - - If the supplied could not be resolved - to a . - - - - - Resolves the supplied to a - - instance. - - - The (possibly partially assembly qualified) name of a - . - - - A resolved instance. - - - If the supplied could not be resolved - to a . - - - - - Uses - to load an and then the attendant - referred to by the - parameter. - - -

- is - deprecated in .NET 2.0, but is still used here (even when this class is - compiled for .NET 2.0); - will - still resolve (non-.NET Framework) local assemblies when given only the - display name of an assembly (the behaviour for .NET Framework assemblies - and strongly named assemblies is documented in the docs for the - method). -

-
- - The assembly and type to be loaded. - - - A , or . - - - - -
- - - Check all assembly - to load the attendant referred to by - the parameter. - - - The type to be loaded. - - - A , or . - - - - - Holder for the generic arguments when using type parameters. - - -

- Type parameters can be applied to classes, interfaces, - structures, methods, delegates, etc... -

-
-
- - - The generic arguments prefix. - - - - - The generic arguments suffix. - - - - - The character that separates a list of generic arguments. - - - - - Creates a new instance of the GenericArgumentsInfo class. - - - The string value to parse looking for a generic definition - and retrieving its generic arguments. - - - - - Returns an array of unresolved generic arguments types. - - -

- A empty string represents a type parameter that - did not have been substituted by a specific type. -

-
- - An array of strings that represents the unresolved generic - arguments types or an empty array if not generic. - -
- - - The (unresolved) generic type name portion - of the original value when parsing a generic type. - - - - - The (unresolved) generic method name portion - of the original value when parsing a generic method. - - - - - Is the string value contains generic arguments ? - - -

- A generic argument can be a type parameter or a type argument. -

-
-
- - - Is generic arguments only contains type parameters ? - - - - - Holds data about a and it's - attendant . - - - - - The string that separates a name - from the name of it's attendant - in an assembly qualified type name. - - - - - Creates a new instance of the TypeAssemblyInfo class. - - - The unresolved name of a . - - - - - The (unresolved) type name portion of the original type name. - - - - - The (unresolved, possibly partial) name of the attandant assembly. - - - - - Is the type name being resolved assembly qualified? - - - - - A Factory for getting the ProxyGenerator. - - - - - - - - The class defines a field get accessor and - provides Reflection.Emit-generated - via the new DynamicMethod (.NET V2). - - - - - The field name - - - - - The class parent type - - - - - Initializes a new instance of the class - for field get access via DynamicMethod. - - Type of the target object. - Name of the field. - - - - Gets the field value from the specified target. - - Target object. - Property value. - - - - Gets the field's name. - - - - - - Gets the field's type. - - - - - - A ConfigurationException is thrown when an error has occured in the configuration process. - - - When this exception occurs check the .xml or .config file. - - - - - The DalException is thrown when an error in the Dal occurs. - - - This is the base exception for all exceptions thrown in the framework. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance - using the message parameter. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance to - the Message property of the passed in exception. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception - that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous - exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference - (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the - class with serialized data. - - - This constructor is called during deserialization to reconstitute the - exception object transmitted over a stream. - - - The that holds the serialized - object data about the exception being thrown. - - - The that contains contextual - information about the source or destination. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance to a system-supplied message - that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance to the Message property - of the passed in exception. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance using - the message parameter. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the Exception class with serialized data. - - - This constructor is called during deserialization to reconstitute the exception - object transmitted over a stream. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - - - Provides access to a central registry of aliased s. - - -

- Simplifies configuration by allowing aliases to be used instead of - fully qualified type names. -

-

- Comes 'pre-loaded' with a number of convenience alias' for the more - common types; an example would be the 'int' (or 'Integer' - for Visual Basic.NET developers) alias for the - type. -

-
-
- - - The alias around the 'list' type. - - - - - Another alias around the 'list' type. - - - - - Another alias around the 'bool' type. - - - - - The alias around the 'bool' type. - - - - - The alias around the 'byte' type. - - - - - The alias around the 'char' type. - - - - - The alias around the 'DateTime' type. - - - - - Another alias around the 'DateTime' type. - - - - - The alias around the 'decimal' type. - - - - - The alias around the 'double' type. - - - - - The alias around the 'float' type. - - - - - Another alias around the 'float' type. - - - - - The alias around the 'guid' type. - - - - - The alias around the 'Hashtable' type. - - - - - Another alias around the 'Hashtable' type. - - - - - Another alias around the 'Hashtable' type. - - - - - The alias around the 'short' type. - - - - - Another alias around the 'short' type. - - - - - The alias around the 'int' type. - - - - - Another alias around the 'int' type. - - - - - Another alias around the 'int' type. - - - - - The alias around the 'long' type. - - - - - Another alias around the 'long' type. - - - - - The alias around the 'unsigned short' type. - - - - - Another alias around the 'unsigned short' type. - - - - - The alias around the 'unsigned int' type. - - - - - Another alias around the 'unsigned int' type. - - - - - The alias around the 'unsigned long' type. - - - - - Another alias around the 'unsigned long' type. - - - - - The alias around the 'SByte' type. - - - - - The alias around the 'string' type. - - - - - The alias around the 'TimeSpan' type. - - - - - The alias around the 'int?' type. - - - - - The alias around the 'int?[]' array type. - - - - - The alias around the 'decimal?' type. - - - - - The alias around the 'decimal?[]' array type. - - - - - The alias around the 'char?' type. - - - - - The alias around the 'char?[]' array type. - - - - - The alias around the 'long?' type. - - - - - The alias around the 'long?[]' array type. - - - - - The alias around the 'short?' type. - - - - - The alias around the 'short?[]' array type. - - - - - The alias around the 'unsigned int?' type. - - - - - The alias around the 'unsigned long?' type. - - - - - The alias around the 'ulong?[]' array type. - - - - - The alias around the 'uint?[]' array type. - - - - - The alias around the 'unsigned short?' type. - - - - - The alias around the 'ushort?[]' array type. - - - - - The alias around the 'double?' type. - - - - - The alias around the 'double?[]' array type. - - - - - The alias around the 'float?' type. - - - - - The alias around the 'float?[]' array type. - - - - - The alias around the 'bool?' type. - - - - - The alias around the 'bool?[]' array type. - - - - - Creates a new instance of the class. - - -

- This is a utility class, and as such has no publicly visible - constructors. -

-
-
- - - Initialises the static properties of the TypeAliasResolver class. - - - - - Resolves the supplied to a . - - - The alias to resolve. - - - The the supplied was - associated with, or if no - was previously registered for the supplied . - - The alis name will be convert in lower character before the resolution. - - If the supplied is or - contains only whitespace character(s). - - - - - The class provides an IL-based set access - to a property of a specified target class. - - - - - The property name - - - - - The property type - - - - - The class parent type - - - - - The IL emitted ISet - - - - - Initializes a new instance of the class. - Generates the implementation for setter methods. - - Type of the target object. - Name of the property. - The . - The . - - - - This method create a new type oject for the the property accessor class - that will provide dynamic access. - - The assembly builder. - The module builder. - - - - Create an type that will provide the set access method. - - - new ReflectionPermission(PermissionState.Unrestricted).Assert(); - CodeAccessPermission.RevertAssert(); - - The module builder. - - - - Sets the property for the specified target. - - Target object. - Value to set. - - - - Gets the member name. - - - - - - Gets the type of this member (field or property). - - - - - - The class provides an IL-based set access - to a field of a specified target class. - - Will Throw FieldAccessException on private field - - - - The field name - - - - - The class parent type - - - - - The IL emitted ISet - - - - - Initializes a new instance of the class. - - Type of the target object. - Name of the field. - The assembly builder. - The module builder. - - - - This method create a new type oject for the the property accessor class - that will provide dynamic access. - - The assembly builder. - The module builder. - - - - Create an type that will provide the set access method. - - - new ReflectionPermission(PermissionState.Unrestricted).Assert(); - CodeAccessPermission.RevertAssert(); - - The module builder. - - - - Sets the field for the specified target. - - Target object. - Value to set. - - - - Gets the field's name. - - - - - - Gets the field's type. - - - - - - Summary description for PaginatedArrayList. - - - - - Summary description for IPaginatedList. - - - - - Moves to the next page after the current page. If the current - page is the last page, wrap to the first page. - - - - - - Moves to the page before the current page. If the current - page is the first page, wrap to the last page. - - - - - - Moves to a specified page. If the specified - page is beyond the last page, wrap to the first page. - If the specified page is before the first page, wrap - to the last page. - - The index of the specified page. - - - - The maximum number of items per page. - - - - - Is the current page the first page ? - True if the current page is the first page or if only - a single page exists. - - - - - Is the current page a middle page (i.e. not first or last) ? - Return True if the current page is not the first or last page, - and more than one page exists (always returns false if only a - single page exists). - - - - - Is the current page the last page ? - Return True if the current page is the last page or if only - a single page exists. - - - - - Is a page available after the current page ? - Return True if the next page is available - - - - - Is a page available before the current page ? - Return True if the previous page is available - - - - - Returns the current page index, which is a zero based integer. - All paginated list implementations should know what index they are - on, even if they don't know the ultimate boundaries (min/max) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Provides a view of the IList pramaeter - from the specified position - to the specified position . - - The IList elements. - Starting position for the view of elements. - Ending position for the view of elements. - A view of list. - - - The list that is returned is just a view, it is still backed - by the orignal list. Any changes you make to it will be - reflected in the orignal list. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sets the enumerator to its initial position, - which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the current element in the page. - - - - - A implementation that can create objects via DynamicMethod. - - - - - Create a new instance for a given type - - The type instance to build - The types of the constructor arguments - Returns a new see instance. - - - - Generates the key for a cache entry. - - The type instance to build. - The types of the constructor arguments - The key for a cache entry. - - - - A implementation that for abstract type - - - - - Initializes a new instance of the class. - - The type to create. - - - - Create a new instance with the specified parameters - - An array of values that matches the number, order and type - of the parameters for this constructor. - A new instance - - If you call a constructor with no parameters, pass null. - Anyway, what you pass will be ignore. - - - - - Summary description for ProbeException. - - - - - Initializes a new instance of the ProbeException class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance to the Message property - of the passed in exception. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance using - the message parameter. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the Exception class with serialized data. - - - This constructor is called during deserialization to reconstitute the exception - object transmitted over a stream. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - - - A class to simplify access to resources. - - The file can be loaded from the application root directory - (use the resource attribute) - or from any valid URL (use the url attribute). - For example,to load a fixed path file, use: - <properties url=”file:///c:/config/my.properties” /> - - - - - Protocole separator - - - - - Strips protocol name from the resource name - - Name of the resource - Name of the resource without protocol name - - - - Get config file - - - A config resource path. - - An XmlDocument representation of the config file - - - - Determines whether the specified file exists. - - The file to check. - - true if the caller has the required permissions and path contains the name of an existing file - false if the caller has the required permissions and path doesn't contain the name of an existing file - else exception - - - - - Load an XML resource from a location specify by the node. - - An location node - the global properties - Return the Xml document load. - - - - Get the path resource of an url or resource location. - - The specification from where to load. - the global properties - - - - - Get XmlDocument from a stream resource - - - - - - - Get XmlDocument from a FileInfo resource - - - - - - - Get XmlDocument from a Uri resource - - - - - - - Get XmlDocument from relative (from root directory of the application) path resource - - - - - - - Get XmlDocument from absolute path resource - - - - - - - - - - - - - - Load a file from a given resource path - - - The resource path - - return a FileInfo - - - - Resolves the supplied type name into a instance. - - - The (possibly partially assembly qualified) name of a . - - - A resolved instance. - - - If the type cannot be resolved. - - - - - The name of the directory containing the application - - - - - The name of the directory used to probe the assemblies. - - - - - Holds data about a and it's - attendant . - - - - - The string that separates file name - from their attendant - names in an assembly qualified type name. - - - - - Creates a new instance of the FileAssemblyInfo class. - - - The unresolved name of a . - - - - - - - - - - - The resource file name . - - - - - The original name. - - - - - The file name portion. - - - - - The (unresolved, possibly partial) name of the attandant assembly. - - - - - Is the type name being resolved assembly qualified? - - - - - The class provides an reflection set access - to a property of a specified target class. - - - - - Initializes a new instance of the class. - - Type of the target. - Name of the property. - - - - Sets the value for the property of the specified target. - - Object to set the property on. - Property value. - - - - Gets the property name. - - - - - Gets the type of this property. - - - - - Build IFactory object via IL - - - - - constructor - - - - - Create a factory which build class of type typeToCreate - - The type instance to build - The types of the constructor arguments - Returns a new instance. - - - - Creates a . - - The type instance to create. - The types. - The - - - - Implements the create instance. - - The type builder. - The type to create. - The argument types. - - - - Emit parameter IL for a method call. - - IL generator. - Arguments type defined for a the constructor. - - - - Create objects via Activator.CreateInstance - - - - - - - - - - - Create a new instance with the specified parameters - - - An array of values that matches the number, order and type - of the parameters for this constructor. - - - If you call a constructor with no parameters, pass null. - Anyway, what you pass will be ignore. - - A new instance - - - - Summary description for HashCodeProvider. - - - - - Supplies a hash code for an object. - - The object. - A hash code - - Buggy in .NET V1.0 - .NET Fx v1.1 Update: - As of v1.1 of the framework, there is a method System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(object) that does this as well. - I will not use to Keep compatiblity with .NET V1.0 - - - - - Setting for a logger. - - - - - - - - - - - - - - - - - - - - - - The 8 logging levels used by Log are (in order): - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for ConfigurationSectionHandler. - - - - - Constructor - - - - - - - - - - - - - - - - - - - - - A factory to create objects - - - - - Constructor - - - - - - Create a new factory instance for a given type - - The type instance to build - The types of the constructor arguments - Returns a new instance factory - - - - A implementation that can create objects via IL code - - - - - Initializes a new instance of the class. - - - - - Create a new instance for a given type - - The type instance to build - The types of the constructor arguments - Returns a new instance. - - - - Generates the key for a cache entry. - - The type instance to build. - The types of the constructor arguments - The key for a cache entry. - - - - Simple interface to COM+ transactions through Enterprise Service. - Makes a code block transactional à la Indigo (evolution will be easier, it's the same API) - It's important to make sure that each instance - of this class gets Close()'d. - Easiest way to do that is with the using statement in C#. - - - Don't support nested transaction scope with different transaction options. - - System.EnterpriseServices.ServiceDomain is available only on - - XP SP2 (or higher) - - Windows Server 2003 - - XP SP1 + Hotfix 828741 - and only in .Net 1.1. - It CAN'T be used on Windows 2000. - - http://support.microsoft.com/default.aspx/kb/319177/EN-US/ - - - using (TransactionScope tx = new TransactionScope()) - { - - // Open connection to database 1 - // Transaction will be automatically enlist into it - // Execute update in database 1 - // Open connection to database 2 - // Transaction will be automatically enlist into it - // Execute update in database 2 - - // the following code will be executed only if no exception - // occured in the above code; since we got here ok, let's vote for commit; - tx.Completed(); - } - when “using” call Dispose on the transaction scope at the end - of the “using” code block, the "ambient" transaction will be commited only and only if - the Completed method have been called. - - - - - Creates a new instance with a TransactionScopeOptions.Required - and TransactionOptions.IsolationLevel.ReadCommitted. - - - - - Creates a new instance with the specified TransactionScopeOptions - and TransactionOptions.IsolationLevel.ReadCommitted. - - The specified TransactionScopeOptions - - - - Creates a new instance. - - The specified TransactionScopeOptions. - The specified TransactionOptions. - - - - - - - - - Give the correpondance of a TransactionScopeOptions (à la Indigo) object in a TransactionOption (COM+) object - - The TransactionScopeOptions to macth. - The TransactionOption correspondance - - - - Give the correpondance of a TransactionIsolationLevel (à la Indigo) object in a IsolationLevel (COM+) object - - The IsolationLevel to macth. - The TransactionIsolationLevel correspondance - - - - Close the TransactionScope - - - - - Complete (commit) a transsaction - - - - - Implementation of IDisposable so that this class - can be used with C#'s using statement. - - - - - Changes the vote to commit (true) or to abort (false). - If all the TransactionScope instances involved in a - transaction have voted to commit, then the entire thing is committed. - If any TransactionScope instances involved in a - transaction vote to abort, then the entire thing is aborted. - - - - - Count of the TransactionScope that have been open. - - - - - Returns whether or not the current thread is in a transaction context. - - - - - Gets the current value of the vote. - - - - - Description résumée de ConsoleOutLoggerFA. - - - - - Constructor - - - - - - Get a ILog instance by type - - - - - - - Get a ILog instance by type name - - - - - - - A DALForeignKeyException is thrown when foreign key error occured in a sql statement. - - - This exception is not used by the framework. - - - - - Initializes a new instance of the DalException class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance to the Message property - of the passed in exception. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance using - the message parameter. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the Exception class with serialized data. - - - This constructor is called during deserialization to reconstitute the exception - object transmitted over a stream. - - - The that holds the serialized object data about the exception being thrown. - - - The that contains contextual information about the source or destination. - - - - - Information about a data source. - - - - - Constructor - - - - - ToString implementation. - - A string that describes the data source - - - - The connection string. - - - - - DataSource Name - - - - - The provider to use for this data source. - - -
-
diff --git a/Examples/tutorial2/External-bin/IBatisNet.DataAccess.dll b/Examples/tutorial2/External-bin/IBatisNet.DataAccess.dll deleted file mode 100644 index 7f092e65efadc2993833d0bb041de6418751ceca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 53248 zcmeHw349#Yk#}{^OwS={>>0`OjYkF>S(fDk12$l6*^-UGk`Kwo28^WD>xh>kOOj&goKcrgHy?RG?kJ_)elYB(v$M?-Qi5|g~KPv>D7z`sjI^)qOeKq`a z-6PuCr|Y_QrgMn_%iLil`x8CMY}U*tx>E^jFq=qc6D{jH6a8jys;R0fa+WQ6eJjyg z%|~axBgd=(Xt-Hey+YxCuz;Aud%OpsF zX{In$SlYDKFBsXHnlon&CqBd7BFXlSU(#e7Ra5=%rKP3X9zgO z`28C+6}_pQ=To-KeI8bBcq3O2zTq$g)z3l7M2Sc}x+yYT0oozXus#XtW+P~`75-Hh zZ@9qr6yL!JIJsY{7x-xfuIRs5ZXOCn^c)<>sF-v+E?QN%RyQXC|3rA=GtghJZvxLJ z!j(oSsGD#A!$coO205!?>H;4vM+d_@Vl|ONtdWU+h&0ZSv~?7U_{@c%n2P|!JWA<_7)mHoUn17VSW5JO5VHAAHBign{y?z{f7!9Ps z1Vk+~JxMj}2SkTy%Kc9IhgA1ls%5%PKcuA)SP~Byi7)+5y z-Doh(^Enk(*T~$TT30~_zoA@l3G$5GWl%OU_i>D22=F%?@-@Ot7a?on{0i$QV9zZB zvS0Tdlzi~v{Hv62wa>#R`QU>?aZES>z2yp5mn$NaT+su3^~4Mx?Y7&4>Np!Q4gt%k zzZfbUWH}%pKG_7WKv(h)EeD6W0-(l(O_YZo!YeGAu#j?fy;Qxso4Vq3()Y80mW z41I!G0OJpF&OmrIf50tT4fYBnXwCE^lCJ^6QQ81ug-bwCHVoHd9eVBU@DuGI;(@JS z!y?`4Vs?0w(J)*0)z+gY;a=h^7`bG~SoK-gg3G)FwKR_R)lN6tkdlxWnH%)gCxAtC z!zs*u1`|qIU;U*;nZ&8TB zY|R_Sg^-!+Kz2o3e`5la(&F%^bs)rb|H1XR21B_GxXf-~9U(~S_0^01wqTwtPA1db z2&VFaA+vgcPH6P}n4N$ek2!|2&m)q@a^HsD5yNkO4_CuyKE)Tq z{4OqL7x;6V0LOd^e7{oGQ2eMvL>X|=9dW(%3G0DA4X92JNiedaSRL&*FE zv+YC+L*_9g8*5dzwHxf7+^{mxARDMAtnA~D`C%Xb@$9pa?)nEpNM!r?>254KDs5k^ zzY8@vX8F?b8eSbdb}!D(?8VvHx$r73jLwFB?+`e`gnm>W(ya-sNXaO*2bQ%Id18)S z7R=S?7g@L~F{TL`C@71?-QPmwZRf$egOA)w8X;eB$l{bV-EUV0#g5be% zJW`CXZtX5n&~@PI$lSHDNWp)r;WM$Il6V7a&V3~k9qR2xRG*q|2bfFR5)ogV_qk(@ zv54}-idY3avBL30_HS`ui37HZs(mrTMD$hxCT8dd=5p|}K*?h*pjQWu&8!Yt_o99< zE&@3gDlENXAr*#W0i_aLKg|7v5b;i2yObHzpSoXR^hjj;+Mgt{*(0|yRtbAmDtk3h^IDE)ME`*phG{69B!S$x9P~-A&<3+0TLgH~@<;i)l zADRbOuzrHl-mLm1$T9~3mSEl?Y-xS~&FXnhlyO!YL2Y}OM<&1U62zLKkX7wCOF((N ztDf?Bo9gPQ^w|r61%2RO64*|qXhC16=S?-I**zbLMbPsR)$=f)ILE_py!qzO{=kZd z%8n=QD8t;xt#oH^xNX4_M$E8EEK#W}QCaAqYTJ0uC@*PFX>XOaL}?!@BbF`du|%b6 zrfrEz)yAq=6)aKZ#0+lZ@rPAmjQkd6x(DA|;eL+K^H@Ol(m>hoI z(^rFzapaDXv*1X_8zYynlc_Os2SllnGpa+%MO3?!ICi?r2A*!z$|z_KA)_(wU>wl% z6EV0OtSqWTfARP&Cs&NC)=r*9mJ){*1cr)HScuso!xcOM9arLPRIVh--iOB#<`&*t z*iqy`lrOcA+oMX}0PKNAA%AZVD?Kvb;vo70iTj{lRmsPQ@PJICySSru+H z!l&l3-r0wHoZFz*t&3@SjE^5eH>kE0k#d(LU{U8h@ z{Es^2ng<$hYCi#n`a_V04YgHS#d~n9X(A0XvCa|lY~ANqBuNc(X5sX!iN)X~Vu5`< z$G$G+D`XtR-0W|-7{c1oHtZ3Fai%`89!psRho`EjIRde~bu)1G<)i3-PNRvf?npd2sZ zpi`R$MQI*&4%1A;DOm0yT2Gp!Ieul38+UElc$HV3!bnu0j5>0~FdskcI>gX~8h#m1@LToJ_(;9k-v9$W|x z9y2T-`&9Y(8gZt&iK{JJQ-#$B0l7=Tu>Y;p*5NoKd#%sJ8Uv%&hx3MwcKu~*Eoq2D0{zJOAuZ2c8h+qjZe2Tn@|W#hGO8@X@H+tG;89n?79 z>7WC`#XEC22dC}c-=tbm1Fv0&dRDA_iZ$Y|xfyO%VVF6-uAu7HP@*)Nw*%oN; z2aU%ipVe`Q!kP+egi;P}3&J}JvkzePET7R1bzPxzc)-t_?Ct9%`T?GYry8}5+GdQ5F`P@g$_Xy zAY9}SBypF1;9?NW8Bl0mh4l%v)DBGrdc&jki8)uI=k9^U4sv1p@LaFQ1Zd>W06569 z8k*E$HM~XE6MPnnK9h51y*|Ocm4g`#=OB8KuK+RF(j@3r z3%w34v4$Jt*LP=c;Ji?Wn{(TlLJa0uK|q4 zc_rG+ixmipvB9c?6eXbHde!CVx+h$sBI#y`HM-Q(!8LDawQp$7xZt=nQN|Mc3M33w zJ7PU$8Y`^EngX3!m1K-2?rp1kH-}RLsvdi@5B{-fbsA3 zTHl0%f-W6h@(~n0HmSn;A@WtEkyWd`dO3zsD%^Ewz)Mc-nM5^>>OK+ocGGJ0SU9)q zlswxG^&?e)>qx7Vr2^_hq{j=glkh_(CJwF^3W)x?5=E*{1DF z=!fIUoi?ew+>f7<+(n-5P(JDt{U=L*bHMR=2i&}=)*n!xPY&R$_Q}q`!qPdi-!P}3 zQ!9e9lK_Psh{t9RHvk{K{#_vY!nZ199+R&g%HkHjLVCs zIO7M8i!d#RHHpMN_T3M_XZT~!z$=lj=e~~W53Z7=%*!pDRL>FReulyao0)KcnPt+` z4={%(DJS61U|ppiG7#TYOxCZVPWhZaa!#PAjI38KfoxvD$dwl`YixpCnXuX>$dw7L zHo>{FzAS<@<}0_2udFs-F>=(}ND?4i>JTIW!etIY5+EROt0IyB0jB|qAc-H^s~Z+* zCs~x8WFdBvi(?-lh0qT?C-C_kCjMCN8|Vkjh+MGo9CekaEov9eGOX}aEG@nX4qgZ| zi;Y-w`5`39P+B>*&;_$%eJcTa*=W*jZbyiLZs4F7vWWma4X>CT@5ipurw=u)Z}4EbRS8Pe2iSa%0nXD z^BtoLJ?AYX`FrfXV#H3e5L*}7k8PDv1m{(cft2OMepZ==pO)cAHlDO+Pd zFE;(~X3@cxentAau?)!cBcB1iK<9GY3)emJCgmW+(5D?wQT0je1719`Sa7=$$UE3lmu~Ss>!r= z%-I&0Wx+%V%@0 z(0r zb4~r}9?Q&`efg#yvw!~PbPg?;*O?#eO`G%DviVddlg_2GxfIv9CwD=gl}=@QGecRJ zYuU{7%I2=N&Zdsmu0)G#n?zqalS-^Ivwi6ugBEOPW)rHNwv2RcXTCq96j(O1FPU+r zr*l2YT#D;U=hJ&oLEaj4YPM3l2h&z6na^A4?!i1TGoM0xJS@Gc8(25#N~brhWi#!n z9gf_9mFi3HW4bs*m_5So(1dCmUJu=q?u9eW1V>mHV4;CbYG2pTKuTyrbQQA8S*e^k zX!SttJouK)WLJaA*&Q?IAHUF`l{qc`RDXA>x0l_ld?gpnN3|vD3e9dKYcjgYJtjJQ zU;ZQw&cXB;R<;R>#K5S_X2Ng-DJ!2&VU+Zzv+H_#1}*f{0;m0>OYperM#rCs!|cSc zgDYK@iNljceKW>hQCp;jNFnnx4c8&AD4Y4&;!buyMuQPNv(p$Z%)X=ic&mGh_) ze>r7eEDZZ%=S?K~llvTBUg-4w=$f4|@iZJoXbDB)k#TW)iMZu7An{SlMAz z`M2Wr5XD`KAgVN03JPs>>)vvoI}z<9<~&K9=4j&e@rA$&F8;sHXaB;XZcjHur>p&6 z<}`1$@AAn`wK_O)-<3KeFG)@@@Rn^CqEa^1!%MMFwH6t*ZYVn)y!BSfbbjJCo-7tQ zk+{f7PqK=zjr%r-FVBkR#7!#gw*QOQg6^<7y%ztaj=CqA;T3=Bs`hR4PS>se%NlkH zqefWN4hU*s54*DS(v=$Dg2Sg0-#v?(7Bro^;QU4BGbJGR_HUd)bmk$V-{3logOD@T zSk5uWz=cFFGi_5Rt-oCTtjd{dHnrg-hpqwsdIj=UX83t+`RF)mzI?_fw6G88e`@FO zjTWx`N_>&Ta|J}N;)}bBd@qS`*g(_qMb&%;BRZagE6$pvT+qI%7DVip7_?JQ>Jhp@ zH}xoeQ~x;NGy0vnK`()B&@^9#&!8UPR$rXP`G14-dHyr~wUqR)^&4~((oy<>|7-pT z{hQwee;~l6E&!ZD4;UXZ&Y+{lqehg@58esN)!`2r23;FwX}NF`b=?)-8;(+aglqhA zDtz6BVizX#zl`0K_S z^l5=l2>hAA-wPZUV-07;nCD`FR|>oy!awG`nLdiV5Z;GXqN;k-n{J!N2L31^qa zGAGbNk(t&GYE{&PcTh)A`$xbT0M;&?4{9H!B{U!RBU!T}l6Nk>L$Gg44a?~P!G0l} z%jrSEehVx>E9h~-D)ck-0NzLYwqQ#IYolkS_SHJ;(m}^)!|*@p)p%;^KlSC{YxJ$c z6G3AU^Qz0qQIvFzAW%HffVB0@qn9$rwcq!;98;Y61ZRB zI|be&@bdzX2>hYIV*>wGpg+tqrwLpPSVtFyANI$n4QbUDKRqA0+HRLdk5^n5(CF!k zVZfIK{!7ITNWWh3&cNp38I{$zJKkFP1SpSJ{0(4d<@W%$fv!T2dl0|`fF7pr>Yz2rzQRKDlYp!s`@~QM6U&$8_fa^k7N1o68K($ z9~JoExUU)`QoGX^T>JV2T##;_w9K~#r49=A{?IDlWx#G!d7hOnS+GF8upN!EO|pxR)TGqk&)eDv{@4EB)1)K|fD0esd`2pMl>t z`=!F9T!{Wduvaza3{m4u=6qFSDG|CrFjZd#?H7#OuvDv{+XQ<*z2aZ4RnkxFa)0!% z#(3It7E2kSae)qP9DPc#n?wD9ZuspNY-~8t2kdDZyBm3Ndcnp%j=VVi&c?nJ*rip| zpKa_h!2+|mhMPk_3Jf5x%En$5Y=VvbCNPM+=?at9R#Uyg=*_@>jqd^bla1YMtifDbIh$*LKYh{okycCV1XF!Gi8Jsy8hF9@d(Dd-)h4Sf z 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

1-mI=o{o08=OB5*vNlRB2n)5 z0^Fz5Q&=|>*C;L-6`?fY)$XTCI*su48m-p zczmJ{YBh@4HL?sP0)GR*`N0op06Xfn{Qfu|5O<#^#IwQX-kf&Lqa3W%=Mbk8Hd1mK z@bIZDJP&ELWHRk|2SNR+LMkOc%fY#C&Vrm+iHI?D%mQN;7_-2b1^&w|z<*G@beQm*KZOM)YAnW9su^|6(LI%R`}?aXz-u^9X1gPRv&0+>Afp^#9u% z{2NaEmuL9nT;(USfwM@RGd!Obq%}EzvE+P*AB}92BOp9zg3nn}s&Gb}krNvA@PIJT zL;gSU84PsFV?V4;f%v4TSkg~~X93!+{w>DcIR3@ATkscYH1|YFJp_ygOXMB{?{5=0 zpej7)&WEPmbS-q`2VW9Y4?cdVmhbrU6LWl*ZwIvJ2e9}giMPv^;3qo0lZCzU_9$*;GqMcq4Kp^Ws}0PMuQ zz5^$uc)qa=ErGu?!F_%n9tl^ebJ0KQgr9r2@DMRSlFyH@=jHI64!%A!?ewRbtD?eE|F~S%av%r`I#w;*qfiVk=SzycpV-^^*!2gdHcu4)t;XCmp t-q>f%0%H~!v%r`I#w;*qfiVk=SzycpV-^^*z?cQbEHGw)|2Hl0KLOZmIUfK3 diff --git a/Examples/tutorial2/External-bin/IBatisNet.DataAccess.xml b/Examples/tutorial2/External-bin/IBatisNet.DataAccess.xml deleted file mode 100644 index 8921dea..0000000 --- a/Examples/tutorial2/External-bin/IBatisNet.DataAccess.xml +++ /dev/null @@ -1,1586 +0,0 @@ - - - - IBatisNet.DataAccess - - - -

- Summary description for MessageManager. - - - - - Constructor. - - - - - Gets a resource stream. - - The resource key. - A resource stream. - - - - Formats a message stored in the assembly resource file. - - The resource key. - The format arguments. - A formatted string. - - - - Gets a message manager for the assembly resource file. - - - - - Gets the message with the specified key from the assembly resource file. - - Key of the item to retrieve from the resource file. - Value from the resource file identified by the key. - - - - Class used to expose constants that represent keys in the resource file. - - - - - Summary description for SqlMapDaoSessionHandler. - - - - - Description résumée de IDaoSessionHandler. - - - - - - - - - - - - - - The properties scope - A collection of object useful to init - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for DaoProxy. - - - - - Constructor for a DaoProxy - - - - - Create a new proxy for the Dao - - The dao object to proxy - - - - - - - - - - - - - - - - - - - Summary description for - - - - - Do not use direclty, only for serialization. - - - - - Initialize dao object. - - - - - The implementation class of the dao. - - IBatisNet.DataAccess.Test.Implementations.MSSQL.SqlAccountDao - - - - The Interface class that the dao must implement. - - - - - The dao interface type. - - - - - The dao implementation type. - - - - - The concrete dao. - - - - - The proxy dao. - - - - - The DaoManager who manage this dao. - - - - - Mark a class as a Dao object. - - - - - Summary description for SessionHolder. - - - See also LocalDataStoreSlot - - - - - Token for SqlMapConfig xml root. - - - - - Constructor - - The DaoManager name. - - - - Store the local session. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session. - - - - - Get the local session - - - - - Summary description for DaoDeSerializer. - - - - - Deserialize a Dao object - - - - - - - - Contract for a dao manager - - - - - Begins a database transaction with the specified isolation level. - - - The isolation level under which the transaction should run. - - A IDalSession. - - - - Begins a database transaction. - - A IDalSession - - - - Close a connection - - - - - Commits the database transaction. - - - Auto close the connection. - - - - - Gets a Dao instance for the requested interface type. - - The requested interface type. - A Dao instance - - - - Get a new DaoSession - - A new DaoSession - - - - Determines whether [is DAO session started]. - - - true if [is DAO session started]; otherwise, false. - - - - - Open a connection, on the specified connection string. - - The connection string - - - - Open a connection. - - A IDalSession. - - - - Rolls back a transaction from a pending state. - - - Close the connection. - - - - - Gets the local DAO session. - - The local DAO session. - - - - Gets the local data source. - - The local data source. - - - - Gets a Dao instance for the requested interface type. - - - - - Summary description for DomDaoManagerBuilder. - - - - - - - - - - Key for default config name - - - - - Key for default provider name - - - - - Key for default dao session handler name - - - - - Token for xml path to properties elements. - - - - - Token for xml path to property elements. - - - - - Token for xml path to settings add elements. - - - - - Token for providers config file name. - - - - - Token for xml path to provider elements. - - - - - Token for xml path to dao session handlers element. - - - - - Token for xml path to handler element. - - - - - Token for xml path to dao context element. - - - - - Token for xml path to database provider elements. - - - - - Token for xml path to database source elements. - - - - - Token for xml path to dao session handler elements. - - - - - Token for xml path to dao elements. - - - - - Token for xml path to DaoConfig providers element. - - - - - Constructor. - - - - - Configure DaoManagers from via the default file config. - (accesd as relative ressource path from your Application root) - - - - - Configure DaoManagers from an XmlDocument. - - An xml configuration document. - - - - Configure DaoManagers from a file path. - - - A relative ressource path from your Application root - or a absolue file path file:\\c:\dir\a.config - - - - - Configure DaoManagers from a stream. - - A stream resource - - - - Configure DaoManagers from a FileInfo. - - A FileInfo resource - An SqlMap - - - - Configure DaoManagers from an Uri. - - A Uri resource - - - - - Configure and monitor the configuration file for modifications and - automatically reconfigure - - - Delegate called when a file is changed to rebuild the - - - - - Configure and monitor the configuration file for modifications and - automatically reconfigure - - - A relative ressource path from your Application root - or an absolue file path file://c:\dir\a.config - - - Delegate called when the file has changed, to rebuild the dal. - - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A FileInfo to your config file. - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - Called when the configuration has been updated. - - The state config. - - - - Build DaoManagers from config document. - - - - - Load and build the dao managers. - - The scope of the configuration - - - - Load and initialize providers from specified file. - - The scope of the configuration - - - - Load and initialize custom DaoSession Handlers. - - The scope of the configuration - - - - Build dao contexts - - The scope of the configuration - - - - Initialize the list of variables defined in the - properties file. - - The scope of the configuration - - - - Initialize the provider - - The scope of the configuration - A provider - - - - Build the data source object - - The scope of the configuration - A DataSource - - - - Parse dao factory tag - - The scope of the configuration - - - - - Apply an XML NameSpace - - - - - - - Apply the provider namespace prefix - - - - - - - The DataAccessException is thrown when an error in the Dao occurs. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance - using the message parameter. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance to - the Message property of the passed in exception. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception - that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous - exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference - (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the - class with serialized data. - - - This constructor is called during deserialization to reconstitute the - exception object transmitted over a stream. - - - The that holds the serialized - object data about the exception being thrown. - - - The that contains contextual - information about the source or destination. - - - - - An ADO.NET implementation of the DataAccess Session . - - - - - Abstract definition of a DataAccess Session - - - - - - - - - - The DaoManager that manages this Dao instance will be passed - in as the parameter to this constructor automatically upon - instantiation. - - - - - - Complete (commit) a transsaction - - - - - Opens a database connection. - - - - - Open a connection, on the specified connection string. - - The connection string - - - - Closes the connection - - - - - Begins a transaction. - - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - - - - Begins a database transaction - - Open a connection. - - - - Begins a transaction at the data source with the specified IsolationLevel value. - - The transaction isolation level for this connection. - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - The connection string - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - - - - - - - - Create an IDataParameter - - An IDataParameter. - - - - - - - - - - - - - - - - - Releasing, or resetting resources. - - - - - - - - - - - - - - - - - - - - Holds value of connection - - - - - Holds value of transaction - - - - - - - - - - - - Complete (commit) a transaction - - - Use in 'using' syntax. - - - - - Opens a database connection. - - - - - Open a connection, on the specified connection string. - - The connection string - - - - Closes the connection - - - - - Begins a transaction. - - - Oepn a connection. - - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - - - - Begins a database transaction - - Open a connection. - - - - Begins a transaction at the data source with the specified IsolationLevel value. - - The transaction isolation level for this connection. - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open the connection ? - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - The connection string - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - - - - - - - - Create an IDataParameter - - An IDataParameter. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Changes the vote for transaction to commit (true) or to abort (false). - - - - - DaoManager is a facade class that provides convenient access to the rest - of the DAO framework. It's primary responsibilities include: - - Reading configuration information and initializing the framework - - Managing different contexts for different configurations - - Providing access to Dao implementation - - Providing access to the DaoSession pool for connections, transactions - - -
-             Exemple 1:
-             DaoManager daoManager = DaoManager.GetInstance("PetStore"); 
-             ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category");
-             DaoSession daoSession = daoManager.GetDaoSession();
-             daoSession.OpenConnection();
-             ArrayList categoryList = categoryGetCategoryList(5,daoSession);
-             daoSession.CloseConnection(daoSession);
-             

- Exemple 2: - DaoManager daoManager = DaoManager.GetInstance("PetStore"); - ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category"); - daoManager.OpenConnection(); - ArrayList categoryList = categoryGetCategoryList(5); - daoManager.CloseConnection(); - - Exemple 3: - Product p1 = new Product(); - Product p2 = new Product(); - Category c 1= new Category() - c1.Add(p1); - c2.Add(p2); -

- DaoManager daoManager = DaoManager.GetInstance("PetStore"); - ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category"); - IProductDao productDao = (IProductDao) daoManager.GetDao("Product"); - daoManager.BeginTransaction(); - try - { - productInsert(p1); - productInsert(p2); - categoryInsert(c1); - daoManager.CommitTransaction(); - } - catch - { - daoManager.RollBackTransaction(); - }

-            
-        
-        
-            
-            Key for default context name
-            
-        
-        
-             
-             
-             
-            
-            (contextName, daoManager)
-            
-        
-        
-            
-            Container session unique for each thread. 
-            
-        
-        
-            
-            Make the default constructor private to prevent
-            instances from being created.
-            
-        
-        
-            
-            Configure an DaoManager from via the default file config.
-            (accesd as relative ressource path from your Application root)
-            
-        
-        
-            
-            Configure an DaoManager from via a file.
-            
-            
-            A relative ressource path from your Application root.
-            
-        
-        
-            
-            Configure and monitor the configuration file for modifications and 
-            automatically reconfigure  
-            
-            
-            Delegate called when a file is changed to rebuild the 
-            
-        
-        
-             
-             Configure and monitor the configuration file for modifications and 
-             automatically reconfigure  
-             
-             
-             A relative ressource path from your Application root.
-             
-            
-             Delegate called when the file has changed, to rebuild the dal.
-             
-        
-        
-            
-            Cleared all reference to 
-            
-        
-        
-            
-            Create anew instance of a DaoManager
-            
-            A DaoManager.
-        
-        
-            
-            Gets the default DaoManager.
-            
-            A DaoManager.
-        
-        
-            
-            Gets a DaoManager registered with the specified id.
-            
-            The name of the DaoManger.
-            A DaoManager.
-        
-        
-            
-            Get the DaoManager associated with this a Dao instance
-            
-            A Dao instance.
-            A DaoManager
-        
-        
-            
-            Register a DaoManager
-            
-            
-            
-        
-        
-            
-            Get a new DaoSession
-            
-            
-        
-        
-            
-            Determines whether [is DAO session started].
-            
-            
-            	true if [is DAO session started]; otherwise, false.
-            
-        
-        
-            
-            Open a connection.
-            
-            A IDalSession.
-        
-        
-            
-            Open a connection, on the specified connection string.
-            
-            The connection string
-        
-        
-            
-            Close a connection
-            
-        
-        
-            
-            Begins a database transaction.
-            
-            A IDalSession
-        
-        
-            
-            Begins a database transaction with the specified isolation level.
-            
-            
-            The isolation level under which the transaction should run.
-            
-            A IDalSession.
-        
-        
-            
-            Commits the database transaction.
-            
-            
-            Close the connection.
-            
-        
-        
-            
-            Rolls back a transaction from a pending state.
-            
-            
-            Close the connection.
-            
-        
-        
-            
-            Release the local session.
-            
-            Use in SqlMapDaoSession
-        
-        
-            
-            Gets a Dao instance for the requested interface type.
-            
-            The requested interface type.
-            A Dao instance
-        
-        
-            
-            Register a dao
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Gets the local data source.
-            
-            The local data source.
-        
-        
-            
-            DaoManger name
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Gets the local DAO session.
-            
-            The local DAO session.
-        
-        
-            
-            Gets a Dao instance for the requested interface type.
-            
-        
-        
-            
-            Summary description for DaoSessionHandlerDeSerializer.
-            
-        
-        
-            
-            Deserialize a Dao object
-            
-            
-            
-            
-        
-        
-            
-            An SqlMappper implementation of the DataAccess Session.
-            
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            Complete (commit) a transaction
-            
-            
-            Use in 'using' syntax.
-            
-        
-        
-            
-            Opens a database connection.
-            
-        
-        
-            
-            Open a connection, on the specified connection string.
-            
-            The connection string
-        
-        
-            
-            Closes the connection
-            
-        
-        
-            
-            Begins a transaction.
-            
-        
-        
-            
-            Open a connection and begin a transaction on the specified connection string.
-            
-            The connection string
-        
-        
-            
-            Begins a database transaction
-            
-            Open a connection.
-        
-        
-            
-            Begins a transaction at the data source with the specified IsolationLevel value.
-            
-            The transaction isolation level for this connection.
-        
-        
-            
-            Open a connection and begin a transaction on the specified connection string.
-            
-            The connection string
-            The transaction isolation level for this connection.
-        
-        
-            
-            Begins a transaction on the current connection
-            with the specified IsolationLevel value.
-            
-            The transaction isolation level for this connection.
-            Open a connection.
-        
-        
-            
-            Begins a transaction on the current connection
-            with the specified IsolationLevel value.
-            
-            The transaction isolation level for this connection.
-            The connection string
-            Open a connection.
-        
-        
-            
-            Commits the database transaction.
-            
-            
-            Will close the connection.
-            
-        
-        
-            
-            Commits the database transaction.
-            
-            Close the connection
-        
-        
-            
-            Rolls back a transaction from a pending state.
-            
-            
-            Will close the connection.
-            
-        
-        
-            
-            Rolls back a transaction from a pending state.
-            
-            Close the connection
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            Releasing, or resetting resources.
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Summary description for SimpleDaoSessionHandler.
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            Description résumée de ConfigurationScope.
-            
-        
-        
-            
-            Default constructor
-            
-        
-        
-            
-            XmlNamespaceManager
-            
-        
-        
-            
-            The current context node we are analizing
-            
-        
-        
-            
-            The XML dao config file
-            
-        
-        
-            
-            Tell us if we use Configuration File Watcher
-            
-        
-        
-            
-             Get the request's error context
-            
-        
-        
-            
-             List of providers
-            
-        
-        
-            
-             List of global properties
-            
-        
-        
-            
-            List of Dao Section Handlers
-            
-        
-        
-            
-            An error context to help us create meaningful error messages.
-            
-        
-        
-            
-            Clear the error context
-            
-        
-        
-            
-            ToString method for ErrorContext
-            
-            
-        
-        
-            
-            The resource causing the problem
-            
-        
-        
-            
-            The activity that was happening when the error happened
-            
-        
-        
-            
-            The object ID where the problem happened
-            
-        
-        
-            
-            More information about the error
-            
-        
-        
-            
-            The cause of the error
-            
-        
-        
-            
-            Description résumée de DaoSessionHandler.
-            
-        
-        
-            
-            Do not use direclty, only for serialization.
-            
-        
-        
-            
-            Constructor
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            Examples of Type: "IBatisNet.DataAccess.DaoSessionHandlers.SimpleDaoSessionHandler"
-            
-        
-        
-            
-            The impelmenattion type
-            
-        
-        
-            
-            
-            
-        
-    
-
diff --git a/Examples/tutorial2/External-bin/IBatisNet.DataMapper.dll b/Examples/tutorial2/External-bin/IBatisNet.DataMapper.dll
deleted file mode 100644
index 9db2c3486abf0c6bda04337dfbec6359be0e0d47..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 241664
zcmeEv37A|}mH*3ouU=KXUecB7RCf}RbP|$0YRS?Gp%WkpTi7vxU=kH%QxlPkRUJf{
zig824u()eb&Uxa=}BI&|SBL-p;K4Q;(_==i6dJ@i6z@g+-odcs33
z>5V5i&S_ITr+mZPj*oNuq0>9BYf8>>c7n4Zg$`bC%Q_^@|7~Z{(3UH^EK)tw(h&sb6xb0iy5*5_n1iPf6e@2|Oi%|BocFk?U&wac$~iky-uwDb8bGoZ?Io
zD3+S1PI2CTtqmN66ZV(S^Q$?}H-|V*SoU_zhNFI`xXg3rfd*(7ysGEdGM>MGO4;?y
z93c6o$8mzt3(Q=moa07Abb()7<~mE^x=82WjwSu9aGDc=Qdli|@Xd#B*Eyg&VV7Cc6TJ=1!a8s_c+uka)EoRL
zYKMdaT9zr!R9lv5&i?7lD$op3;sPX47CF5NIEX8FW*2$*9DXup2ECuAlzRPMf1_t^
zAmA|MV?aBMHu_F*W}x8SjClyLT^Tb(qzdA@b6L|%yefWr)L-;V#Z0A?&lWPK3t%`k
zaRxROGlfjSAO2~+y)HcGMc@tQ2=I2d>jaIvkZXuad;oz6vJSg~Y#nucxk06c<^zZZ
z0F`S2?^6I2!vfw*fM-5{^yXdgd**ZS)=^EDn>)Zf0Cy85;bV>JhU+zvjbEl-9SNQS
z@Z^pWB#fC0kf^aql*)qJSUer{qh(|fK2R4ugD?+PS48E?yPrr+6m3}b!3I=aGyuIw
zYQClGS?cTUkh19da&W1-J`CS3l<7dazVhJsUjZ^D1LUxAI4Lrt@cOJ2jI(1v6w=WEhc5J`(rs;bD-!h?{t8~70j1m)`{5-wT|yBLd7ToyR!Y-l$`Usc-H
zUn-fSQGl&saQzlkc^84%QXs%Z+469-7O}or$3iZtKO6eo_&!?BRVh9{qfMo;AMl;%
zK>fxGGw`81^c!FH;6o?lH|C?I>_nCLWpA19Tn`@j=b2mCb(}9v@_Ksv*hGhstlGPS
z#5_M^*0XebXMn#5-q15G%wrG+CNpbcBEth>l9>c^2N_C2bKEhsZ@+vET0K3khRw0a
z!yJd7(*7w;XqS)HG#0y%q+gzo6yiC>-Elk+HMx#1z(ud8IN|{y9|Ob#Ko|qW^IXNK
zPF2_D?UqaBVRsDXSKpuq3d`4d+xszORlB`Wx~@4Da#94(Kz8Ax@)edJ=HoU_Bx_7>
z2R>xn6K5=*n0*G^2uACme1;pHOR`?$eAGlH-^W-XW6WuAkvIBG
zLQ{R_i=iT+XTg*8nc4bll1>x@Fgnp9^k&KD8M);~{G;T*5DEeuf)cA*i(=TM|=Oj7a25bR6GXd=Z2rzRjvd#}|
z>dEJZub*gu!(2f$THICc7+p`hMX1{#>+M}2Q9dOV=-)pDje+f;WK++w?sV&-wF=dl
zblE-xvA8Vbyb(Hq_F8ZoXQHG{>^49(#an23r?tG$ZQrW#0KL%=lDUlviq~Xrpv}x&
zzsbDNXazV%nBTY%Jxi0kxo&h8(s5b`-3^;U${nNAcqfY2WI@ZT8k^7wxuxj&aLUKl
zpGRpz?ZW6yRD98C3{wsoa-lzT>#sn(LHh`+eQs&Cc?K~tbcSIi>qeXD5rTmwI4lI+
z=xrp%{{3>$LW4X=S`oVF(2btST%LuW{{6v4;In~lIqaI|?w`ID9p5z9ZJr0fG|1(A
zxY=CeIdB#!BLiA8&UaZ3G<3Ahq>igy^*5kI+Qqw#41^bIbYS*CNP+1F$j)O{{tf9p
z(<20Cq3oyz2fac%|5{i5LO033#a9@Z3s8oAgI)E*AhfKx5TWQImag#w@O9O`Zd;0X
zBlJkwnS!N(;|x0eRcCMwgyO=#WP@&99k}eT2JK18KJ|&pK6!f2^a%mxzZ~45ouS^n
zYTk|B0euK7^HMbt29U+;{g@xjPcKGkA$gs@O)UE-%72>8-*XNJo$+=51nGTKR0(L`
zPW_3?5W0T!PASCv$qM0{OSBa1!^wlD_p4p5mxC(SKm
zzIuS{Y+o?n>0cG+H{Y3YWSpOt4I|H!DjWE&{4HfW9c3Gz7rSmuIA=XU2{EOcFjLS}
znMO|kQE?d~XT~vFMp!@mOmr8j1=B}(d;REc29_|;ul`vWmrn*A47(k2cp|y?`sVWo
zl6=h9e5W)L^EKa@b#%Mzi{tW~R1RWuc=EE(h+aL(ydWzBOVxyGY-K*=loGufa%LrZ
z90v!KVV5=NWsGA3&?w13*s1{^}WO?9uv!Ti8HvNU9Qu|<$b{1
zq`hKJHlcb=-d*
zHD1S_s12EKOs-=G>btbB954GP%nzN-WU@a{eu0Cv%-_^Uz*P9nCn_T*YIZ!B@62A;
z(&Y`vbNtxz1Z6Z29wMP
z$GD8MnU(6hkkqUH5x}%s9Ge{<`254|J)xY>KlO
zE>>As>tICi&E+V5Sm_JQizw$kV8fiuskNyiT>B+OKs?W^N%6ESBu|92@zg?Wi9lht
zj(0KL1W7~$%o|eYTJ+z+;|%cFXpp-g8iixF<7ZJ&|0QTxe;d5NYa+PTzm&3Tla%&}%Mv{PD*FF}{}XOzi#hAb8jk=F`bEv5xfJQggOA(WC6@
z+0UO2o?vY#z}kSVB)^H>C0ZVa=qJEMfN2Icxnm>|?L*2YqxTJl_4B}D&|1R=x`yQ#
z!nFwhR<3jgpAIQ7FD!H0@){EQW6VG)jlQQT&FNLKkHHT$Gt{cFt4SPcv{g8FhnV9ibY^`_~=2TW+I-z9M
zM!V8Un^HaikLiSiTb8Zv%vO?4l-eG!ZW&h?hjW*V^BlM+tc-hX1hOM&
zc0pKJ=*@7)5}4S9k|ke1OfQVex?^lJu<24_TMj&N*7@XeXU@~&@prki;ORR4uGRJ=
z^+W^XvEJx9v&lqX0S03
zmSI^)&@){fR4J;0+$dI8{B&KPp$b4G})8{bB!fT7d>^7CmO(SO00T^FeB-k=i
zS@)#l&?&VL(VD~Z23s};%vIwcW8)wk*vfxw9M7Gh1rS8zSo#j74|NpmTu9%mFt+W)
zQ0X^dAP#m$^zFykzHB&b;@Ky8+{`L=Y)SO!IN9k#7LTqTxdLQ^*Vi=I6)*zQOvL3Yrm^Unyv2{oM+RUJ4?*Z!U4w<%**lRm&IXuD$H)
zDZOYX5-3j2V5$+6Cq~JcrHqVgrnRSpv9WDW32h&9DMC|wN*Sc(o|1qcfYg$s0vN8-
z`|#uUlv+7eBqz>?Fqd`EW|0qJseD#LO_`5?pHx2C`cEK1Rg)KjTd0ZG8v_gh?6i&|
z3rp&=5z}}Xt1IoNmL5q2Aja-$h8ZCqL>v(V!~?)c3=j_hhsOZ%0I(_shzEe-7$6=1
zR>T1D0I-yRTaYb18l1btyc`^tmgX>NTElpEKwaS17)Gy1*SrE~>=l*lomhm?MFurSeHp;-RL9>*u;bjV%p{W6yS^tWHT3th`L}%>I@e;h+K09d
z69^&f4pC11Z9vSu2;>|Cw96a3S{hRJ&=q2B=Q=y#&IhlJ3UUksHyVIz2Jr(wmBI9>
zUyh?i>X(yjW%XlkJ1`~ji!9AFh0h}V5cSWee}VdE(?3W3GE~o`Uz+whFwEX7c8_Lw
z2ll}{QNw|yUG+brb{m*^hF76?k@&EL9`RXy0AEiqlCNd5c&H|h8?kU@%w+>-Ioc&=
z1JI=#fF72*O5K%8klSr;M9>{0y6m%~8v0zqF}{XPlB|Teflb}H;D)Wk-&E18z5~Lu
zQaTQ3rL}JXpsk$*g`iZw6Wr}71ZXED58q(@TMA0rNf5V_;ECFa9pI&%;1mEF0tfb}
zA0^zkrI^u{l1a6cOyhOnEp92~Mfs>7QfO-_E(R`^Q&qr?Sh3L>{*X5HMc07uc2<1H
zk#@kn+C1cm`4n{Bua#0`w^Y1))LznaP(PW3KrnWR-qBvpN8+TtNIdYNtCH?`>u#V+f{Eu;LS&rW
z$fDrSj&da7HcrO0uSqJ_OG0krjbN{N0=+trlA86B<;0G13IgTp+_4kkR(q5k&zuID
zWp|9EY~U1kjMO}X(I*_;3LeV8i9th91<$;h0+Hf)<_x4?6sJEEff`6FHHnJT`i5!!
zbXwn>1$@Q!OpunL_u+jTe1_LaQ$!1n0Ak6K_4s7bOU~>{!8~(oN71tW*L7YWGi*@8>%%d2}
zaPX}Ug+hCo52sqlLN*KFGgbV
z`wF@3T|n;1SA)EHJJR9=i1uSHMuC;jkZl|1TpqIs%`NzeZpF_|Hcg&tx{7o;kN3AB$qWx9C5%>cpz~HxVMI<&7-iu+3_9&ZY}dD=MNGkA
zw6XI^*Sr_M)G4-=$KW1D98pZq+y@O(zi;kM{1~S`lms&7Q;Ac3!5_V4W2?nJar!#k;b&aTn;3I@D`qD&w>p5C?r9(~AjcT%zd&?!
z2`bTzw((aR7fl#lFdW<9=g1otuVJ9m`)pa~9Je|vzNKR+?cR?-4v-1@jDDP}kw(gd
z^?W~gyN$&C=n6QnPL}FN0O;4>k6+zeLi-J`%DVf5=K`bgeuSbA;HSIsLHzdQXPUd<
zHtxm`Z74bOA@~;MG1h+=9P|3K8>(-a&apgU
z)4U5A>#mFNvag6UFoF3PQf7G==Hu`@BIS0m>vH#(og#|sd_yUe%=?h%?9+B;Um`?$mk^xU3g;)l$Dss_h5HOzst2Wtr;|L{?
z2?=3(K|*;YbWe-WD-%MiE$IX@AtB7-g;K#+QeSA1x@R1z1TrzHj3t#(Qtt&R2(6By
zuKDc##~WQQN~Ad)pci$qPr-7$`N9kHKdEaC1L
z2f~in&oh>AO{+MK2LLTvz0xcT0cVYY`5-b>&c&!{y&nP8VA31x{U!#|Xg!iQUIwiy
zW((Q+UW(@GmX0OH&_dRX0SxDGjG}vgK0fKbgG~C`@kxJva7k?er0t+7ya4?47jtRo
zpc`GvqQpSy`QFzmjx?FyGB@ea(oH5BI6%WI<_r1SNIDmoc7d#>T??n2toNgo@0TFo
zk%!R3q|&WH$>T5?Ddf$A5We)xhFy!r6(%1*4q|I5%HFR?ind+QGYeJ1Y1z>vS7u%J}vttUGXdkPB%5KcBC5FSK0*@r-Q
zMxjSm*YHMPMu`hOIwFHT=}peT4mo5nUuAG;;ZVrn(1Vb{jWZ^d!NSVC!orjQaM6VV
zEljn8$_r6qAV?j22l+45{1+7#A^$~f`Lp*}{U0qwmJR})S|G;{ii<}uRyl>mlG*Lo
zQB1JVCAC-o5*U@XH?1%F3IrgBUW$c6!F(1xm>#wrEP=z)^3im%$B`_?!2wns=+zXN
zB0ghg3yYLwIv_2}rnMx=b4*Qge3<-q6S`RI;Yh8A#VUuW5J3)6n;bfOmM-QtW=ac1Sr!VGg83R{?IeuhD?
zIIA$rh(T60c1|JPrN(g>o^cVG4Giefvyt5NFfx^Z#XrJ-1$93f?jjgV
zVmRYoi}0av?}iIScGjR(5dTVq?}1wmTKI%tjWD*WoI5+D-fT$3Hv=%?B^5
z^X>3o0j~l0vpV3{B8($s&V6AEpX60jyhm$Mx>nsM|UVCrNF#gRt6P}{w)iiZtzC|>43ipRCA>%7|e
z@zyD#RS7gGW
za+b5xey_BnSVlAx#+5Aff9~9Nd8w+ji@@gmX{4>Lv+@{aI?AIq%|fn;A=O#2HjCbW
z7f3A&lG18JV8bx?gSgG-4(2m2UQc}zp|maJ24thQ5Rr#XL#+C3jH3C|0$Z!<`;kTc
zo|r+YLi7Gsj*|MJiBj(-Z#UzoIJYtbOTMHX(#Fi{)S2yE(dgPf%&O+9Iu8|wpw2_%
z)LG2?opTxmrkbWO^oPkAnpatgnRCKW+$~A1R)>C?H6~)>nHFyv|cz
z=NIOK*ZFO{3J04&W}HAcTM%Tw{wuU9H1)>kS5_^fpX9`2kws-^+uTZ
z#^g*a9N|2*ZQ^Se@;dVm=Cz3eJq%4O{l%bQ(W2)gOnVjf1I-NhqwQeQ@RGB_Y6)yf
z0;?pjDtuPoJ_~QPUlT1(5O^2bBCu|d3FD-b0ID|XmBfJ!U8nQdi1JxYA?G5ZOiQX#U0{Q)hgJL
zE_xAXOfWIHFd=lvQeYjj6xd|46odoIGMkcRTuRCkx&I0dwxLzPg=~bEO@c}ee2o)w
zwy^_KBpLv){8qNB3$4d4Q%bg;xGt&!u@PYcRg61QS!v|8T3{Aqwb&KLy;?03tuXqN
zC9`Pxb(2@iVIxq4c)6j~($?TV)ln_oR?Cy+ZS-Q6u?q|GLRV+a2&|)K1U6aC2*QDD
zrYlu5@#rWu(`DYw329O@T}jP!jjNfi#`nl|+_8w9dsNOnD(5cqMqsRlu`)f^ssFfB
z9QEG$6R17sX(A}dgmmCY+hmiqpi~33kcEO%pHG4pk$^OC8#%rRLRg#eB;~N{oLOz_
zoN}Rzez~mua(@wrUO3`tGai|!Jgu&|GJ>-?PNCB3or~5SpuOTYBu@?>Hb
z=73>Pw&MOGT%iKT$bXbo9aE6>_e|a*pRp(k^eBT+TI>b1fz3X||eVAby}j&eLqW
zEEX&pXGQ@{BQ9(e9X+PNI^-;{$>b~u2bOaoCFi)HBIklRrme>;Byui{lXIc*2M$X`
zTT+p8QRQ4zIoI0cTvIu>t=s#HICRz0=U+}P=cPKz>v~@Mzt}_~avoaHuFuo0oJ$3Z
z7LBpTh8f0%)ultu0_%{oz$TNkARJiE{V6%e1*M#k{Wx*Dsg_WrS!RRv48nHM#hV#5?s-SaVPn(UMrPC?Fl{y!`3$yW+%FW@0!@ftjog|1ea|*??c2vH_9K=Ma7j@DFs@Zhng}
zSabSelS${h31PyoPT6RL4#Ld$t6lB*S9Uwj+mTOyPdofHgwF+hPX~N1@L`a4_NCxO
zoIhrsOQE%VmqB_cuA1#6#%uf(_0cWY`Qq_hdZ7E`9>_C3C4L;#t+e(QWNV2?JN!-D
zT5PgZ_)&hdSOE5}>wt{jvc0TCXQRGM;7
z@>&JW@XQos1JKO+oeB~oY}?kBl;Ix4>Z~A}%LgSdf_)mNgzzk6&SXKNoEKwLG2?oL
zOmsOSafc)86d|u=ke8lWfc@!oaEHU8BY!~YaiHi71bg!42XJOC$*X6^ikIdMY>DCA
zaPE+Kl%Ag0leZpOlxYo!CE?S+D*FA!OmC(-&^U<$r#yA27O>+HuAtMq8gnESWG@$6
zV_cDB@UD|N83=gcN$*Hjo{=~ENDplbYiJ+qsUO<4OZBLMKID=sWb=H|68nrk_T-p4
zZ~h5Ms)xAwLJqg>0Y%XQb0S338;G#_d^zZvU6(-*(~A>LJa={rVgDr-
zwrBDnu*LyantME`N#1cKYy&d6VQXnEEGe-v@u+5F11g|9r?p#OvM`>HVgZLkR|Q~H
z8B32j8nD+AcUK;
zD?zGirznBf7)B5;UT*ZZ!xZVJBEBvaTsgwqzM2tBwLo6O6}T-P$5gpt$94ZG_;m}g
zi26W*CaZ4ieZBuc2Q!Sivgz3J-TJwd?L@~lV(CeRUJ5MP^$J$wU=ZX$Wm)}RR4Yil
zhGR-6iQN?0&G;$iMm7Tv3I$z^59#Tk@=j9yB%s~)KtwW{^yI3?=c~t9PT4|oGLq)i
zzV&0Iku93~9Uzg8;=R0(hXcY9_?&p*oLH$@C-t8rktN+>l+KS_hg8_tPIyI!&}ycT
zrws22{h{arv#IhEldg%38u4JClt(+NSYE%
zcbj0kwa7h%9u&D}T#@Y@;WV@jRPP}W(mUXO0&aRtz8o;_TK-c9{BR^9{${NJsB}yKvT_$wSLV5D4(sosEMTmu6G3b
zQi50q*~emx$8QfK=+SBM@kxZ80dSJlvS=pRXd2B68!vIc{t2*AUy0JlWIeA_1A}s;
znVEqw=V@ht$tf(D
z!))lIiJSzmDYNg+#a6|@tR;|#l+o(YNuGirraGHIrwhMm#Dx%7OYUnc=I2pD9e;5|
zl<%TVqCe+?cRTU<@957LTl&L!Wvo9?M%5pA`a<+ao=!G*pfQO4(4+eEKKO9N6u+xq
z021o8s
zlpC!7Qj{bIRiZ5R6mqdD<)BKW22iX@xdW+EDp#mdWfhc3HtYl0N;lZnRU5Q0ADBDI
zWEDV~g+GFTRUIlJ)9F_E{cQz%5M`3LBrz>vA6D?<7RXkC3r@>q#)127I{8+R)IC79y!y35PywqFao2T7A_E)oyCS6cj6(7iKt$EH*-
z9ma_P5rxMjsi4MB<1*UbUm@IH?tHxkO&E)70g~$}u-P+Bv=d@b5bA*Eybp!zp)PQ(
z41a1)lV0g_z1L!#DW@fIc+p;r$5a_Y%tUQD1gDY>wp{S1A_%%g9Lh;3i_oLj+
zYY50RN!ZQE;-N`$xLHXy!P5^u2WaL)aA?5
z57-3ttD)QW4IPWN9W{WbdZby4UpcF;P}h=K*iPo&G#PTFG*u4dfW?@YgZtA-1#JQj
zSl;TXDl|*x=%D^sD{0$vLcedpZIW>$?R!1ncrsG9ZCYgQJD-P(^;aQ-cg-Jz%m!Ah
zlWVbESy?s8t<`MFM9|4>>V0y*Wc~%%atqk-t|XqgTmmPoY`1ilU#cEC-O#OmSxufU
z^f?b|<-iXgNFIeuIuiifbII{lXU%C(YZZD|4!v~zOais_O^`FyS6l+#YysjDfUa6F
z#3kUZ79cJGZ?gb#*SLcMu(G=lUELnUd(m$ogweCn3Y!dA@b-0E%Lc@i^v*tuZbmz<*Ow|ULSkH|0--mL@0-(olef7fp7DcP&
zb7mTldn$*dqke}djgT>>CntCGYRBdl7K7;b64{4TwZ*--Wx_j&(Z2y$^kMF}m8|g+
zD=M9L%S{14`*MXK`U6lNQA!!}?+E10AMwj)-lv#9!H0VubKvk1MVJ~q&%7SAYWTE<
zKBZ8ZGGJZ@h?aG#pTiXU420#zVX*GcSX<(ahrzJb-SNFO5EmFmFZjuE`eAI0`g+eO&yz
z2@$Xn{RbF_y#EXbdu3y+LobH{tw&kHePOPOg$-<@;Ul<1_**0aTiHzXefak2)ftV9
zeg_D$k@x&uT=AP((Km!#IBQQ*Ki6c_z{Ant0d)9Thyd0TxiVQnTE0h)IA<;5<4CKX
z2U*%2F4O28P?q;%&{{W1d9ia4mv9xhd;YL73Ic9${3g0Vcf$_+e!`t(fnGf0_hldQapcp!ScOnhZ4@dV^a
z5SGZ^O!TiL$=7G6Pd7gm@NKL(v+gpO4?OKvKP
zRm;f^OjyC{TJk6Y2y?aQB;MqY^)fFH=J)!;{|akhZ%}(i1+Oz`&Gk#2!TN_b*oe>yO%a4YaieUe+JiS~;&%eO=`&
z*c|h^)H(5r|7m^AqdmsT71E#R7TUw#qFW@G=oSV7zCi^#6YADqpbstG!k$m%Aav`J
z%7S)1k^Vpx?5`l$sVOH}=|5aqJ5f4OGU;5PY5zGv`dHH*Xsf-+`r1I=?B=WWZ~jtT
zcX{UrKW*t5Cfd#kf4iRH#AsU2L;zGa7T=ck(Kc=mR@W9kJLY$(bLv$sexD6~H-KO6
zn;l$Vla-c%{^7q^$8J`YJ?rISWlxP;$pbIxctHGj0C}
zdUx&}5Mh)7Ii7>{{D!Pq%dQNy&pDDkSoUf3DLr{SRl{f3LqOL62P3IWGM8_T1RC5!|{kCT+(O!6tqrGXths+dV@7ke5Z0sdrR)YGbDC?
zDD{PTE2fNj*-o6E?~PXstvHNE+&7#8JlkIGs^B3_HY(3{-jv=1RI>$`FR@EmLhN|D
zIgD6Y>>$didZ-X5ZMFBNn__xS7WWhV&V65t+g*?I)qhk!ZR{&i*i#^j3f_o&1B7H;
zaJ+pO+Ks)~j{^|x!$cqR*1v-eSriW_rDfj~8&?hKPo*pYq@hyPhkM4Pgzz4en6Hh{
zg|+)15W}&Dd0z>4glQYp;h>(az&aH1gsN^->rykd9<|iD1Jn~TnKjP6@yl+$kM>_jjQol9jpIU9f59EJE3MW@<;kW#p
z3un>yoCXhpc946a$l1HgSTKs*3^GzN$Vy)Rw0Y3z4N;$ty_cmP1Jtu)00z`X>(
zy*rK&4*(ys5g(2t#Dj=?Y{Z>(+pVE@B()5#B_8-6C*Cz4UPK6&(D+HX8b5Vb?==Mj
znC~Yh3oIT0J{SYU1HcCefO}UQAs(0^)%JHj+7th*C5Aa!FDY6tX<0AJYP~F-^-?s}
zOLn5ORtUS5dWF2WuML5y}v(XX_nQnw?^WtQ$lVn8RfqQkK>BUd;6Oxw2PUUn+
zoJ4bCtmec@SM5n*AKi{kxhXc4Dvs042}xysKZ2+;+NGiSeBT7q3NmP>l5-sIWMJ>+
zxKXdbX-Pt)m^j|h2dr|ctgAoCTGvFYl0;LdP1!%4!R#*n+5~&i<7-#3qPx_CNo>~+yeJp$A|Q@@OA^^r+Sb6)op2XHF)QdbJ4X3vNKWc?fI=+J%QK}S%JMwtr+_XEM?7dB5QhT9
z1NP_+;t}EJ!iGk_Rchk95w?iAUz2fmL5gRvE+S6Vta0=TRX#UbOc*D17#Oib2jdU`
znEjoTjqq$=SUcT59s4kwxll;q8TO@0BbouPY#65EqnQ#f`QpMTjv;yxk9@MVBTp@j
zc+f)%!-)7iBU%roN)Vla?GIY-O8I6Z*sh)plg^P4w;YnOr8^AY0>J#U%6*X+!m}dh
zmCOs^Dfjv%?6V@BnN5Dm8ei@8`pspC_XZRV&j6y!icTi49Md;JhEL;ohBx(rHVXa6
zOro~h=fPXoKsP9}8SxHSUk0CLI|+#+&ZxR8Zl*ie*o(<1_W1(?Yg!OgA@6?#q>6oq
zlGM{YE_D7#d
z8TOdxWQ@75$QNFmT!WbuI|k-EK(8&d=)Wa8ckKIdYAmA@m|h>qLoMX$EQ|bm
zB4b`zg+UU>(zb*9MT6LlfgCb2*E@^)Eo$J&RwI_pSccpSlBvwjh?K%i4CvlFCGJ{^nOt>Y&MNUCnOsVVa4L_cd>CyvgTr#ZIwLPN
zs>4&aMCLWF{w7qh&hMxvuL1v1&;s>~e>+3J>Sb#Eer8Em0;{;CZDHjiWy)JJ72in{
zVMSYzTc4NN&R)AZ-D~yUOLE%o`dokeZbs%Z;@0|NxKilz{87ed%zRYBHd(I7`%}wN
z>~pBUEt)G_JW;my=2#pny7dj4U4$TFOFCi!sO=&I5on&a^T$V^2lz~PDBtdt&kG~I
zHF_N8M+=#dkgiA3ZDTGtf7wKzN$}D`iXSavs+F1@mUZ!1<44$14R;ZOeBP0cz{XCv
zix5PxDMjm%8H@B*xYD=~aZ5S^Te#saLJ$GTv{FP&K}gvzXW9O_mUQrPbm67?jun;o
z>C}t))-o?@Es*mv+|bOVdV{Epd<5ayOtOl4ADstp{HpykTi|D0qKlwAe7P;!jnLrA8!
zWxRa-MPvf!3ve)WHEx8Y47RAkMU~#bE2Y97PkV&5U%SEHQ_zWtDw-NVqg|MGG`|D_
z`+BL7}XFEM>pn@)5&3n$J{JbOXQ`dimq&n@v
z5dIM8l^?)o5Xj)bCgoEC?ilmJvZ^nR-7K-(Tc3~D4JGBT5yvtiB^_4+n$i_2yUpuS
zRG}ewn+1I!fAcGZyJK|ZP+{}o6rhOAnqN%;
zIK(!;4!}Uy$hF8QTfG3!Nk1Lu##bN{7@L?nm*3-#F~7W731|&#C<#rI?`VhSZ~)yg
zlI0bJe}T#YpF|m4g~&Z}9A6n6es>9`VPOvino{&(!Zb$!X%Xyv+LM$pzOSj{9I+=x
zxi!y&7rjU?Dkas6OhvHyW#qyJNP5^B8DrSn?eB)|N&Gi#rH`z60%LLDdq_**NqMSR
zC9*u8837wIRF>(7V65s
z9fRg9ewZ1n{IFW|;5!mN8H)8g)SfhK^`oBk+r=K!PJX@$-C-CV1zL@xNs#%JA3z$+
z4FYp0BJr6Jb{XXuHc^5NUMGnSeuQJ5X`(tOogyE3Wtq5_%-jOa6RW5K2Ac8>b|v^t
z2t@VLt-nKr$Udk^Fh8wAH(G}rIB|2K_yX~w^#H}8ehoo}Jco4}T>jY)Y5yJRH{L~>
z-=cS*`8{=T&L0t2orKLF(HjlH>o(-9)?Na}nA9A@j4*d;{tzLmj<^JT-vY!XfE0-#
zE&-2PfVc!aVgcgf@CRMK!>*^yeqdw8CHg;FfVc$gvjA}k_y-FRmw<0ufVc$wy#}&tIDYk
z`!+g^lBu`RJvB|F-$oyw1YA1yZS+)R>uvOpA^t#bqo)#hSb^8L6ijm!1H($A^)~vF
z{vK=rU=bW0i<VFSGx~7)1kcmQd)Dpm
zrvKWRo7ZnHEb8B1-1%dQSm$l?QPT4$+x@|pA=k$7U`ju!-jxl^bI^=i`0@9kVV5lI
zFYX|fTC^9KBw=a!sj1NQP_`-EILHtwFt1N`
zVRXW{0Xro&=L`N+x8KY}``aUj98#%=AI|2?J+Ok{tb3+%SXR#}XOsq(`C26G7)_(W
zjAg=SK{nA^pr~4sFG~@=L772T9`D=1+QL1DyTO1jCV8C4gkQJvJo91tVT{0z&qwep
z*Rop1`C+&IJ@k>$26jq#D4GE;I*}o?WChDEih#s-5+l)Ae?m=aEeIsYG(RG97oyYW
zfh;%rA%gPh6)_8y-|TG^Gf9xKQQSUFW9>($saQ-uDHfRcY20IoCpM^&4OzI!yk#C_
z^mNE5S;U1{#x3m&2Os*
zEV^L!>dJ15i>?q+SUWp6IPZp2R
zN2eg5Z{(j!vCCZl7jc=z10no828aiMpTz+2e9I1u3|KD_t(QdH=v=6*>ov|mW!crL
z&iT;m^BakU#v)Wk`+C*dNRL}#?@VA>_fq)v157oO
zXJ#qn_5@|N0zSbUmO|L(PzAguSv}5Ez}JCMicTky84CGP3o@XPe*t8AbOv#z6O!~f
zEfxMH#io7ZWhggRN?6kpm|D~Rge@5F%)xU@G*Z2}o_Q1m-9}%nB6OG}#S2jinc?Y<>Dl=kkH*REqU@CA1ijl0uFJ
z#Fgi^_2gxfc#6?d!p=^tZWnn=w^y)vb&tZvf}dWjluP8lQYa
zHy)U2P;@NwZ-u{c7gBf0DdO&2>kM&DPbsI5lG=4G4_L?{a`A
zPc7$qE<%1sh>jD4yPL#n>;?`u|9^*oc^d*C{#rU>uSYXZbcCg8S4a(dE8
z;A10cbs1QSOIdv9BcQt#bQ@T8jc;eIt_xd2B+=^J`V{aE=%aj>N_!QUK8e=q;b3tj
zAbAp4Kk<~Ue-!Do!Qyr$F0X0I<1~>bua_<5-GJrXQ!kFoHG3
zg9r?y3J?zf{}lto1HgaA0Pz6u=NKR!0R9pK!~?)zV}N)7_>UMM9svFn1H=Qs9|_>M
zrs#oTfX=R?IVv8B9;6wg{X5bAlDcBlRsSHFtWG!mxuS1!cXIs`XOh+SKH{JeG{kHqloS
zu+xNj?p~HTT8}cTkOrcS=#FnER5I=S#?zWRz^A`@54n|=D+?cA4u7rL1*q12ZIO-T
zfhBV$NaBkjR#N6H1e+{#vtO~x>Z96j)XQ#}bF$h=Df%j}>KxnqsSH(ZW&PG9ah%R?Nm!Pa7A!=g
zogiAoK)~)(?-bS*7nmGh|{b3_8cn5?PY0gHb)OFH95rmG;2XPVw$;;X_y-g5=SOrZd9UQre1E;PrpvO
zxMsm3p5LE=9q~-C+r+7-*ldEMOtvBQhmB_-Rp{*2lgY1y{ZHJ9R;uK0AH)%w|9UyD(!c4fM1~4m_2H1x19LO_bnaZ#Tbsj
z_c
zv5ugcd*&RZ8-;yfiYy|J@N31O{sVNH8i9u4c2(wK9WQti%+~P2L<(>7BIe&g9Ax#^ya}A`@W7OQK<{ds378E>HRI~@Gutl*N8K_S
z;+c`&oY{;VW!&zmWOb{%M~K)bh_K~fs{b3x!|QZeL4hV%*e
zHy}gJJ0ov%l>;0|KvBfTAcAL~0g*Wds+Qhg!J9UX%*>QIt?g>DWx&VQP19j?Dsw(|cPn|5#&UFoU(L
z*@Y^lriiO&-Z17kqilDL^JPSkIP}L?VHnW%JM23>qu+8yrw
z5_&ut^SiS4AU90RC7jmA=PQANV{k=O2+xR@c;rWMc^+I-eB(0>RtOWltJ#c^yIq+
zujka0k4l&39{mnHsx!BW-=a^e)%oCxYaSfJe|B|N{bv|HGCV;T)Q>m<76J@+p$;3!
z@j1i|DjQLMV}R>%fMel96$bLW)1qFyhc_by%ZSK({f+&6-;Mnw#c6M!W@XND
zlk81sHCK=ax1M_8Mi{e0oHV3g?)jH+yTCVH2*Rm}gY6MaIP$|kOHuMPxqXT;)b1-IS
zwxG8GTdcttrYvX=K&qpLJSa3Tr)(sHA6((
z2gS;Qw(dKZpnjmguo=s_v#$PbTyFE_oOpMp{%*9-fyM>U{~o#UBnM$}11E1TWIN4{
z{1hsND>g|}#jY*WpsAe-gw^juv;r~$s7}XAdqmJvzBpAof^{O^3&Yz2_4g8vU7B$E
zay*`$$$3$elFi|owS=yg5Sw-dv=@QW`x8pw0kcQ|C*Vc1#*wWL16^N?sLvRI@LL@Z
z7{SM(gma6H#up!4E@W^zS?RCogVh~1btLi%vwOG31B#xu!`fjz^=y
zTVHu|qIk4T1oC|zNX+gvdG)zqrX*6vooNad`@T{dn9>u;>IrxnAVwa5$Wk$QErQsq
zcejJ_<#C#J^D6irDi}>4Bd=tg&{k_>LdMYeQF&pVTT*E-?I4wN#crDh(Le
z(_mUzDpCD#g6prsuP3j(YTsUeod7NZrwXu76t3VthM^_RPFTYLFO~4^v&u$Pi(l){
zwCqu0vO--g!aG3MaZr}8x2sJET__UaLl*drcHl=ZKl3?^n4+w80w;rI-_-F|!NVo(rI2d|MSz*K
z_D^ggVje^L6jK`1o_f+>3@0jL*jdDEe<7zughGb$ib-6=%I5meYHE`x&kkgF74~YF
z89pj85%Dg(Igpm0*Wa(CyZD)d4vj#g#rpSph_4Bq=m)oXPfy)cnw_TV>ao3km1kIv
zW0@1Yb9(jlt}YKJJjE;;?mK3Jvo)_J>mHtW&=WP?i8riF!zpbHDq)X@o4HCt=HY59
zUFGzjqG!Q9@cK;f%0HQV?ZkZ0uU`)NGsKW~TwC&Y5M>7=%*%kHzBhvx
zjUb9fh>sDe;|{prBx?t8b)O0|76-LZkmRm;6B3L
zHi`Z<1mNlCn@HlhNKM1UH(Q1Y^EJ@n!!tziaPro?3bFuSS?77aj?dd*uF)zd-3k1Z(hjk=R!;v46!E+kGTw>6sw0?R<#R`ITKbF9~rZ%xq~8R
z-R5+ZR-UaA;v}ch)$M6{NH1Q!a2&{v5hue61gRK|sG%{Sp^s^1^r3>*jdn~ct
zie@kkH4Q|i6OJ-rC+2nl%@rM(FP;eVN@BhQKcWJn-d7>y%llL)2u5anL49CTPd>Nq
zoB#Rv
zU8S4ACyCJsgwju>X=5f=sw?fVMLQg?||v
zCfknnl5A`@pv{CfxSh~Z|903k#0GaYN}x8lCVX=5=>RskgS2D8q8m0|N?OcfaywQB
zE-Y_5+f(C&^TKurEpHq{^o%phLfad&3N*vmcC}wtBRgTZ^CMW)LW5;O7~P7WoreOp
zgAw(2u_4G>K*JwS!fIzZ6?yT`E`e}15Rx4NjplrM#UcX>%Pa;w`9^G0aMa+_oI`k~
ziL(nn4J9yGz-Z0;IxuQGF9Yv8$cm0nbH!hO5FB{syDAP6h(JT7!H}O+m#q!9yAD3ncFfgJ?a2uO6DgnUc`9${d&%IiC9P)*J1Z5Ii5q^
zZJ-`r4w-oqpZRIrhhc#xk-Ok#djoT?xc)|S4?P+4AvhU>)olO^(nVlN?K9?;5Sh*k
zQ6u41*_q~Jz|luPvgTEYP1un2ZWrqA6~f1dftNC?`9KX@RyFdH0SJcXjF$Epbv
zPgaz2dkWq9KtttjPzC955@e9
zq|)bP9rD=!KYgAS9g|v6!~+Y;q8K2a*n+}X+kFsj@3FVcY@$>1pxfi@Y|AIMvt7>8
zd5!PE={yMr+d0pxdARxMIIo0`x?=>T&VilCJzbnd6Y!Hd2X+u=G9d$OJ*ZH`0{}L?
z6d)b|$}vDZ0HFI-4DkR^B>;`xB89@>wjpQ3g9}xyfOZGp$
zO*p{Oy;R5!yPvUx#N3OUHKcK6#T8uxjchKFFbq3k^lFBeB8+mgubYp&(9Q6^+h-=b1l*Yfi4Tv4t
z9V55P%L*!qG1(%Q^g>jNl|WcQ9y{
z2f@Ru!9zcmHJBa*={pv9*_WR{mkSQpLqVqS-pBDNJbUXSfW4+0X+1wTHDhmC#ILi$
zYQDSuc~*M~q&>6Y_bJ&xZesMfUN4rLM9D{A$J(#v_V?hf4Ian47YuO((3=)2$BR$~
z9F4;QP(;E#uhigSFnorshhf4%Up>LcEjS>iZ)RjgY~~9rO6TB{Z6AB~*-jSQ1@RmW
z*CJbUG=XQDm^dcKdso7*cXXG5-y^`UJ4P7J_Yy5W-^=IWm^%6KE(d~^T^{m
z<{^{X<|^RfwB-?WWDe@-HHu!>lS>rM!x2-#**?xKXyy#7%e+zS56!YRdVCy-w{v>4
zL4LQ+f9?-lSe9`bFe#9aI2I&V7Wz$p0%cD)QC0rL9C
z7WJl54{YY`YmOnV)DOHELnxK)K8k|pnj|3Fla{3?j-pSrn!RHZPUuT9VQIfO}}mCK%hnBkLM^=)lZZXuL#v{*L`Feho-ZM2{jG
z8(^&?(pM0W%*9&g!$&ACrH$n&ZD`PQ0#oyXKcY!BE8&`uNJ64X-Uw;}
z4SiUkx3I&+f(yf!(EX)A-^V&nLH)JN4cgHLJw%{6bU$g_VS&D@Be#H1R8Yk@b?0JX$KE~5$LTQ(E00Fwnt;m_^=cuVUO5hUL()O
z9R*N1z6UY$`Uv3W(X5nGQ=)FMT}^3eUws%9>&N4#aRUU46YDK>-r;64+~&Tu`Qi3M=RvgWb_DkZcjYgA)cG9+`Md=OLa0EsOD{0Z(okrg6`MvzXkz)q%Uk
z6H{#CjqM~h_?-|ja>X_-mWMVjW*2Ctv5iaWn)-O7lo@BW#HRNq(AP4*nS9=i0qg)}
z##~u+8GQlPLX)3~d<(gLD+w~6gE&{$kpR}cPKZ9=lp@N4$K__3SZ?MPXr685Uh*V(
z-$b@y06ds;buC;h7E%E{z^PPHD~Gtp#7l9sovnvT;=J5CI2ek@VwYfskF)OabTLh6
z9;=>#D8yiZp4lBEDrcEt)I*Ti3t_BuZh}0Nz?!$9=rJZ#KQz06-Xv{B@XXBssNcLD
z-W_X6^s7Lv9wGkv>(LoogtLLrZQlp6*$dHk03Q8>}sj~bE?p;QZ~oMEIV>Az;+0IcM*5=C47O
zJI;sjZr&8}b3S$jV%fJTZ`J3fIIiNYVqqVvmI-7wbA6l4c!YIwhU4P1RQ*yv9W~r1
zH4J{xXP-&7@n`wMC*4z$%)$~tbwI5P^qpX^NhM0v>{PAUXMsz#7!Nd$0S5a<(m!9Q
z!(YYYgHxIDggJH9Uk(B~@&8+LJ0n(1s<0OorG(sb#`rCN6Xx1cKHt3SNfhv`wk-W<
zdXndbHcxE1gONRQR>W-;z4D6g3WJytsHf1Tq|R&HnRuibJdH>GI3jF
zv#G*%*~=3AUTUhOHI*cKV$!6CN@ty)X8Ex>y&L4mr@y#^HQ}dUw99H+8(XA%oTV!q
z4wAzsCdD?j7)N
zNOwwif+U~EX|ei#LOAat31q_i5*^Vj$p?TIlqtWhR(|89c2lb|*m!H$8=Lu18pSDCy^$xd??+0
zG2K*Ro3Yf7*hNlv7LUeu5#PZkJ1c6uy$+X)&^r%-=LyQrQY7nS8DIYjB5$Pri8Up&
zQ4A-z^CB1Cn;U@dj`0^ugNs1Ze2|3Y^;#V7`XH*cTTe0PZrF+!CSf2M_T(WC17j!-
zBjd}-I7hJCz_f^S26^${g;Y531dA7Tvi0?nf{?mJ1?bTI0DNQ
zKX*(hPB(o7PKkS5q0A|ZU3r{KB276=vwaA1DR%4kzOccAIGDo&ctWvNW;Sj=6c~7I
zpHXuVrRBrp<-D5Tk5|jPYv*J(7P_L3f@ZOI-!MN|u29Af`~j
z!FgI!0j~j6=}!Q?Ez2sB_q5&?Xe&km*LL~7dLh5=L40ZoF9J=iUkNS?Q&X2>r|P_=
z>>LC8GXHuZ=N`D&4;9-H9QeQM4}NA
z;%Bj!wghDmYpGosCaC&e&4c3`DJ9NXqHd~P=b0`n*Q$eW}vS
zr;u^{S=;Ezpl7|O(W|#g&!ATnALc_G0dN|OoE2UIn<{ihc~mm
zG+u}LX`Vz3cZ|tQ763g}^E*^?Q?eWrgfS8@HzD2~BTYHMHLzlyJI0Lki)kSUyU`Nj
zM93!?`7^n1q0e0ZO93P)YD4wUph_)@oJ!)C2U91<#_{!W=osz@D?F+pmkM%QDtvVm
z;Xb0iq<-V^m>YZoehx%Z3VS|=|ly)-Ct+VM2fmudT{;@9TagD(%uaT0!bSR~1E@4P&Zxt)l)tR93;4-Lwb|3SVrR)&~0w
zVM-#^0?bTENYDTA(_cKRTs_%(?Af+87+@qq-%a4X7u;U5rNGigFCnGFa^7t}m>b9O
zi@-#6Ht6wY`t&8mLZBzS6d;GY#-$l$niQs7cE19^ahNaez$_sXJ>12zCC3FZes<~z
zqS*(IQxcvt+%qm8R&8ynJI1aK=f-dd5di(56>h~yJ+3=JzDB5aDZEJkze}%BYfq?G
z(^an^8NN&)M_R%PRe`~$6zMYP+W!?rdb%nS$H^;EZEr*WRR0;;x?F?P3*y?<26{uF
z=_)Q69nr9K_$<>f13}ZU|IvibY`7F0O)vf5&Mt`Rh?9Bx8UnFnALZ(8kk8=
zZ{6S>7s*me+uuEc1B|%rl<}&|-7)ef6J)#5D@UL*9+n^d9#lc1TPKZpS?CEU!>rwwG@m~mEs`Xb~KAgsrc-nEFMMNZc
zHeCY50{|*r0pbDRf*2qk>W|BB;W$`_V?I3u2AZ%s$MbYDV(01Sx1h`xCp1aHDsc2!
zC>Je~pM%>x4-wQ&o;CePxG;S~H_4Jb1gGVy9dB22@)X6=4P4Fnm{BrId5Yp43c_@f
z`N?|}KTwb?=&X%UBBPz)J1kv~b}*&O4YJYa!N%xyTue|h`xbQ9nSm0oXHTSl!#Eep
z^{$+KmuQTr?ikBy?nkBVThLRV1yq~r5_oZKFiw@%RPs$o$LVq!JDde-?|qk3yjT5a
zc<%n-B`u}NuPggtTs5T!Cfcsj2xrif_Cxh`_!%K=gEab
zKcsh*k$Wi%4(R&kO9%$$
z%lPec_YHQ}`%X?&lV!qpdbLbcO}u^kaj7=@eU16fob}4jb*_|>-;rjiF4f?r&nzzh
zWAcalP@>qN!MUgOho0CM-X(35^rN#7gS!&w6T_~#vx6AM1t)AMkd*7If(tm@-;wOjHYFfXu=mS
z%AsElJ^9cR*R32&_JAj^>iM;d=i|hW@@7XvzCB5+>l~27N5jD$F4q~fObDNA$9E$A
zyP5vKf1W(b@Pu@LPu}9Tzdcs|f7p8u_^OKZeSGGeb8l`!dO{LH3ndUCfj~eY^xm5k
zQD8NM0D&YIZxTdeFcFNR$YMi4MMSKC0wOk4RE(%7sMuCiY_WH~YgyF)^S(3p+?z^*
zyZhVSfAWF3=b3lrop)y5Y46OLgKpOuY+nJO-?G=V6%gVG9YjhRgr~H?fH*#L-Z>zk
zdF_YK|DKc_Qw~{P+T1QXw=xHWee8~cOdV`*_=?S&sESZld=o_6s7=}F4
zpW$vsB|Q|Wr-T}OtS`m6oLF~K2se%p`%cDk;=P<$EGOQ}nQa!e0L6GV6nduHsEM@CC3D~o8s5^3P73_8~k3F
zz0QQ);z&#<7nKy2)oND24=76hy4e%zcyO@?RDIO1kRS6=QN>t6dq?}2;(THNM&wDG
z5%jAjzK~O0n(qzb{l&6erO6NIk0=@RNB2W!IxozS&BxSPQNpG=*+=ORWK$$x7EN_P
z=28sC)$e>h#f{H6d+PUcC@cWn$EY*wcY>c$M1Fo})9yyq)7dokZs6Ipk3zg>({jND
zXVXmk{2b0n(@`|;-%teNE~K5m9;yhtf8~3GF=K7$9TU&mQ4*oVNcSV#ql@zR&Gu-k
zJfJ!{m1N~{20Zj7!!huwe5FM1pHTdD-6}EVpLeUojVP4f=(B1_FSIR$o&=3co|ium
zLgFgQS}rw)5h}v}a@oEJ&0ciH0N+`iv=r&M`+NPX6cCofH-N6+>@)c8V$_`}u-fA@
z=SE^sa)Q${4+A($loICj*QGqAA_fE%0#>zvM=*?WgX~Fy0_6Y;`>1N
zA)uP!cJZ_t<9%M9e+2TCTm%ixAB-Np1S@(d>I!4u`>RQlP%x7*)UAOWctI9Z9Qu-B
zts(V6bvl);Qt+L{ZW5r*Vh7vYT)rdN)N`ph0-ezrqsv{}UJGYHKhS?BT@JQEox2%@
z4``1o*dxIxL{2%xD)tC73Q=_iokqBlJXBkBh%IP~_fT7;PA|wPAihlucOVMVJp?&p
zYhAF@vj&x-7MyrB`bySLJ4~Q5iCBRy9LXK+)ax96$8!^+;g!u;tWn7>#_xD;QGU(f
zM@B_{qmy1f#)F#P^SZWkd#8tD>zE#jrDO0iMhT-8)J+QN*^VH}TSX0Ue@@xB4T-3)
z^SO~n6+n}22PszFgha26(j7=ae%BwxbSv-+sO`NOPS2xuLUc(|lrttOpz|<#b$KJb
z#}(5p-syRP#C3Vzzz?gwO15*H&QvuDZn&C3w_Zg!yYDslIu}e9quoKsfZC$aeJ7cu
z?)9rLs`i@d>o^h)aIZsEtNhbmiJu@ij((0`Emx|+)|CsMs>Uy7=a!YpFX5GaKe9gA
ze!J82t6fO6MVs!I8muB@vG0IeVxTagPEYt)Z^dRvJyH)Gz{*=?x%J%ja2(@WU
zkHt2>@*u6RULFDNEGh}V>gJ2D=*lau?hvP^t&ctHosPoFL-sMhJUTty?ZDWE=v?HV
zH}7tQUy|A=tW0!WM@Hbo9BZ<1nzO67q?OUw(+^zzlCeu#lSfr1dnY=s?j`;j3D!y>
zhvHhT`sm|Su&u7Ce){;3e|hgm)8Fn_-qfjJMmCrlnqTq4{Kc)w!NrS8J=ZQVZ`b+QSdbYs_04jU8>S)(uQI{MdssR&
zg`KFN_u2+|28|;dBng&OfEEu!K3x8wHEfQUKH|)2xXMGne(KCA*&Eb$2KHO*VTyTlFGn6JtFRF6LY|@mVsIzgSRLKPZ#xv6fo_vt
z@!n5@HXDx~IFNbqmJENmJ0j4;fu%m+9~j{RHGxyYh76rnQq0szmOH)0jU#;!l2TR|
zUKV45YIW|ay!6-Wt9-DY0{f<;96=Y}IgqJp;kmIi3yKQqJOT%oittFE+m>|X$4t6~
z7VkPc^AVN5=&g1|)n~}j@+dL-@~IPVLeRM`?gQ}l>O~cXq!&snx<#o-
zDNQ`TA&}Cyx?*vGgms>XGfut&!BqoXt?MUfxgvtiq<5f0*lkJL44FK1W(Heo)V=eR
zbP1kR$^q^NAt=~!$=r>S2~#D5Ghis0@Jio*H8A^`vR9%OpiQE{n03V9XX*#9fZr~(
z2XpylRO~NdxC+v$IEAj*Av4MvWIPxnEM5gk>mAD$mbS2KZ*>0^1gP&uUfI!2peYsx
zVQe%(`{0i#-QNsMb_7H@-)oP1R9Ph>@CHfuJ3RZ4Y14O^hFa4_C_6n&jbbFm
z*`iK1xsUpF??M?i(PzMLVv}etWv%`*g;BB;yD88P4+bDnBAAJKs^@`|?^vH`fJDfLOOz}Dp`5fv<9kszcO_g*N
zmVD-T#GmA8soZHP)fhS%JWbLawv7j24}r3PO$GV^qKrEi&fo$-k3+ua2BFjAaw?)y
zI@dWviCjb_W2#rM4HPZc8#*fbjyuMQG`zWG7NSKP^jU1PfSyp9#KOrgeNVzr39_p&
zrRd~z6{bY^MS40Q)x+RKUHle(h|>>X@|c3Fv64e$I?<^iGEP&ne9S4J`$7JO8719m
z3$KQi97!)j9a~>a{Vyb=th*26k=2Rk9ERwk%L^Gj1Kk^6Z5xCum!a=I)4IC8n_tRN
zUr;~wozuvcdY`Bh-i`4Aybgo6?4JO0#R&7s2z33nxd3JC5Ex*@gDB(ZAY88mYf?}X
zb4(i;*Gj^ia+Ec^X;q_D-&~sDRdah1UZU8|y
zxFUM?iIaala>yGrhN57ype+CSnO;h#%ICsO_p2y_2ET3UkH7sLak`ht=yfIXW
zZot5Y;q6jL!+q>3%rx*)WKXf3xBLU>W$?15&*JsDO{;AEnmNf^9$h@OJs8rnvwT^s?RlqP82{&l@v#
zZ}h2|ReTcxj28&yK8_aU{s2z#&C2(F_!e)%GmTsnO?P^#&vS@@D4V?~8>5H<;S2_G
zQ+FO1`OBb~#kar%A4p326q?e+X*jU0{{Q`_DTUJrp+{sJ1hRB}!5
zBCQpW^cj4V!7+aXA_QZmNC~M61a~0+YJxckG>}MklRmyjfWt*l=K51oZVy<6U?z!7
zsu^)JT-5F0UX?%aL*IkMxj~Hnm>}RV{RjA@H9BU*T!@%-3_qy{9+G2BdU=Gi+a1_S
zO4DTQEjdLqqL5
zyU~3Cgz(Gd7rjRzkh3rvY4t%t313n8|V;-dQ-^ALc_1CJPyov@BlfheYQ7nEYlX#kD@
zL>gOAo8Te-Sp0Uh>vvJ|I88TOyx62z9s*ypefx@dlHyAply+_-ghg)8gpS|~Ziwxm*fjTV37PjnX3y)?siSuY!i+2FSmk6;2;TRbDSuQ3
zl)O_3QK<~-nU8b`!5=K)@2AwAk1Am?XKP0Va4rgyCUi4x05Q9GKA?Pbg&*yY@qCWw
z_tTM2`qPG&cM(7zTYHZl)tbX9exHE86OqGU4T`?F_&E7Hia($qyj1cb{pNoJxAx-vDEd4B!*v9
zd`=!7MiEO_MDn_Wh3L$3;BX!BGKyHfB9^v@1k~3b>d$rirKIKKyAFMcAV2CppDtq2
z2KCjs}L;r=R`r23#(AvUueRrs)R2!ud0dQ3M(Du
zx~fsWCc<9~&rOvH?r(I2yDIye?r(J(k5nO8?(a0K=PFa&-;+N+H-oIaR+(hFf6#G0
zs7!GGsQt}pm5NLGFEKn-^1&OGYLY`Mj}sIdp{fY4Lt&cC)GDQOn^JBhIA!G!9Waf^A-4HjPPA6xv>Li25zuiq@N)<46qQBYHIvN5tUvv5tttUu{hb
zr^~;5D@ppG84)p7JKbMHrX~)(r%bQw;cK?EtcgZ|_W}adnMAs`xeGjky|<7Bx+>p6
zMt6z1)LmlK_OV2w9(DFI)n<_81j_mxtm*HiIYZJnfCWE){=#hWjegWon#nL)1nkiWDlYqW^1o;7H8%~|V$NomujNogoc|BRru
zbf$Tf%E$iy2l)s>GpwEubPb)o1zM?!bUs2!?oP;4bW$J664|I6Y(IVK&*Wjatz*>+
zJV>4WO|zndIwv|)+WJ(=jnT2@LZ`iMtZzhr$OKtwD&s_Uok?L_>?||(zG*Dyc@7az
zQ;X`5{0?FpTM-B
zUgL0Ma^URrg7R}y@8G8Dq?_Zo!P`FWacF^^+MzJ;_uZ3fZjXLhJcF{ye+Wd(0k9f$
z@+IcB-4NRewx=>4(#lR^3H%c}x#SSMC`k{xN#Vs9S3vheSlM#o)N?6{*N1v6cR4Mr
zU>4G`ur%i+=Gi_~W#?=EhC;-Y2rP*Q(*xP4xlht-VF#Ucul3H#xi#Hc*{{YsD{*3p
zM~N-oQKG(gRqm>KS0x?8ZIAr=E~^ZranpN8C7l_^dB0l6#=N@5#!;2WMto2XiJd`(
ziyFpToc7>oO{(|ks54&c@aR%|j5H>mcX8!0k>(iRK<)IV{kM3mylH>L(M-Y5Wmh`qY!?Mj2cJyU!?e6$k#-Ke}1zPuKP$x4(W
zJ$@Bt2J((M7!ggrsyHCIQ$XPnngfRh6wt4GHi86ojt-zRi!wPlpn!heKciFh?L!Rk
z@zlIv%);w24P{1l>0#hS>sz`fhO(kQsMDHy^*}5C7fKgjH&Ub+(0OMFUscPWMS|+Q
zIQa%=oO4jNhi9pL?UgX)mM?{V4{y_*0OMoS#?-vpB|@62K7{NR9pHZ%;+mcdXo4^e
ziSs+BxU)F|_tc^af|4$UN^zO{o!o}yoDYrgFL)3yvfE&UfxW6J4a=}s{fg+yZu1X3
zt;WlHf6{Jq5^VB+BVLq5-S&e`PUjpkGe|}`8qP(c@OHf{DIzdS}Re~5r
zlr4nv+YlQ~KazPa@?W>iY@_jog;~ZASbT-H;sQziWU=U5tf#uW`mEEuyP8%S*so4Q
z4!l=b<0ZHty-j(qZ=;Xqsi@-rm+#e7-6;zQXjc0kQBXX-e~ZQ#g#9-ZCLe;k594VM
z45GMz1TJ2IEkd&}k~#wTeeg&f{GqWopXPSzz#Nw8-mw=}GMLKqaWAtTdwrWa8xTq#
zqNBcGCCckL=vjUVrV!o}E7o*LF`=c+W!;s<fS2(6oLiPAAgc=*pK-wnK#vtsQELT61aFV)78YVhzL`bqSRX(+#{d~b-
z#il-7#X)yTUAzMRJtR7Cf4lNN%09pM+jKcSSGOxa3SWCPeFOk@WnZj#6-(Kb9|qND
z^2OZsA$S-?jS#T7yfH2dOxMaI!lj|xdi%~>UYiq05bnGLj
zk5C{2TVH+trrVKDawqnltGIUBZp6ke=rQ!I+1O8L0abp%y6(NgWwscJn)%trU21_ZLH
zpqmuf+KAw>x^nMTsk@I;ozo?0-p(mpdEC-NEM}{1(gd^wzU~e2ZnT4SQo-o^t!muB
z1e2O^IXX1`x>=<1@m($7LU}v_Cj6?F8~a8SXO-RQv{D{lB5}nvo;+&kJ>91~eD!p<^6*u{PV%se7>oPoDARPjnjhfttk;7d
z;8E`N;0Jgd@OtnAJf87-@B=)a_ImIGJf0*Eb$0talmY$ey+8_~A1SuMYFJF1wJ(XG
zA4vfHNYZ-yrpah9#rw%aonw3okLtYDUsX~<58-cl$6tdRN-;^LWK((I3lF^>Bm%bt
zuLq^>rWWM&AQ{}$g1jCis+*dI*Ml<0dape2;%qXgq+=G}-+_fB##NG+zXd^GX2E@(
zgai1?6@?d}oN)G&GUsyV^CF#QVK@zfXE)5G>RKxP8jG|00W#QAZ0}3BV^mbWXF8}5
zCr^w{Pv}y^$Au0er2of-o@Y!wz52M&3&6_m*cRnTYfnsFAB6&8HAyt@w}mL4S|#(h
zg$U|z3sET5t#7OxMMXD|R0pF-#lL~NJ)}eJ9PjU`^c2ne-Jwdcm^aMc5QZ{B-yI?^
z`@2I7)Q&+QhoWQ}_}w95tYrEZ-AfQdP0_bDq_yxXC}-=AIK3AB1O2gD3uALj-A7)_
z8HO~(t;bx6*NQX1H6IrM2Cb%a>T!0XN(8KmtNK_;2Kf0grB$(aO-y;BH8G{;RB2Yq
zcR$GfD&@QGdET`UyGf+{J*FqrgU|o)E%NmSq;-2e
z=b~>zMm}m%_gvH$jCiA5YB>j@SYe8aPZw*xeu6bXuH_`xnWvm1`+{MPoM^{^03|l?
z6M%FM?Un2Z^rx;8c@eE2
zdNbv@-s{=vT;^)9x3WZGJn&sj!skyeQR3-4C1B`8FYNvcBs$UtC6Y7<{X?1yS4|wE
z_O8j;iw;U|@4J{mdpCu*doUs-yKp3hBOJl}R58(Em>ft)RhVvs>VRkuP7#Za^g`&m
zvj6i1Z_d`q?n}WkCNu+GkB;Y?c*{Mlxw-blnNyL^bP19m3x
zuUY`!r*Ko}5rqSkc=dv-DZ<6yEdE^vyHdJp4k=qYw^vNm<_1Sz(aI6_D?zi9I
zbd3BTFnMW`kJ}cYen&1wH^EImfZu$E*}j0hQ2bo}WzdH=IiB}}wZu|?u-5PUxt^~`
z#7W3qAK1aga*~tH1bs#TItwtS%O>pW`4u4p_%rc*zpi?13hTC@0N*BV%z!XNyp|wAuBJ_JvTdVe*d=9rjAJI-FD!B
zkf44`^V9P)7i8sTBot(L=4Ta5$jHsgU!0Md)xYh6f`Y~AUAtz_$tcLq?~(z}1zBC(
zp7~wpW)x(M&se-T%hNU?Bq%Eo~zV1(O~J1lEnMqy4t|F#ztX5?hg%g&lh0U$|U
zetK?xL0-Piv>+>YaiJ%h+07U~ZVHRgWof=&gr&aF7hZT_mkZN4aQD>IZe8sdHhY_K
zozi+`S>j`@GN0ciH#^hg&Ueo%=#uHq?K(X>A2~>wQcyTI+nq8xuOKTYCp$kYFF%V?
zT#}zY&y$^%H#g^^JQP>|w%J1lPaQp_%Y@-m6NcGklQ7hsH!pjBp$En1&Pz~P)X}r^
z7Zl{?sI>dHotKegGtSP>%*fB8q_PXLmwW-9#h$Er*-PO+09gtN3M5s?$jfsVu)NTXK=zvJ&Mc(*
z_4)c`5fz~`mVmm?&V$VEJmS?A%&Ns?-^xi)qFR9xR9O~Wv^Z;UPIg9qTU!Lw$l{!=
zrBgv+KP9TS6m&c&9O5KU^!{y0t5HaK^V=pA<^$`Jo7=W)?F=YpJ>zpmsz}9tIxCb&
z%{d#D0j)v1X;|KB7OjrF%$-ApRXsO#M9Iv^$(fUpxu~{Ce>%^ns?dDsGrA~U#g)nr
znhGsPj=aT}kejh|VrFKc2ijklH^*I=Hy3@4H+Q6bmAIXr>`J5RuBl4Ns0QOzXIp5c
z&HomWsb`+zF7#w(HBiH-?NzV&`Zu0TcV1prCbj-4y4_KAow6aGUd2!@=b)E7MIKL8
zH;X;)CE0V)7`5J1S2@4p{3q)c(#G&vke&5sTZLwHQQL&v>^yIiz+m6722x{>>dDGi
zs#L90^%e%&nLQZkZn)5sQ(ceh2%nWZCu=S>-dYklJq@u-rS8^SRrvpi9M@PEi?UF|
zRhv{D#kwRTho%iR$2jdWRn4VgW!iwA<@Dsr&nhUOk-lMKVOlT+a~htyPVml_YMMVJ
z=n0c|npQ`lXVMILynAj|PX6$`j5#^AYjurvj5^CkkCQd!f*j1Qt5;qFBthr&17{GLLX9TqETyj
zpH|c}f<3FNXL!BftDiK~N9n~wy>p<-zLwyuHJ$E~X{kmN%zyflzDA+v!Y1g!WGgSDz}-;GQKmbmFc-5tdyb~f
zVs*@7DQJTu*oK*!6RJl~Q)AZi3+F%|Y8?1{V_nsGgRbthgeqGZ5
znrQqh>=W5F7!B%gvC7Z#WTQJ+R)el5G+q9x>4uira*raNdlteYQ$YIILYR9I_rws*=L136-xw
zooYSeZBbsa{I(+4cI)HxFPK=>AUS5tnOSoSJvG}kF)OZVqHhUu|B9-4{Nd8BT2$E4E2uNE(^Ej0e^7!o
z_U5(JVdesNc4k)PWlzoBY;CGKKP!)#b(Y=s{CA&NnX~hU=PpJ!Tx&;-0JK?HSAdbU
z_n76WZ@8%oU|*^uy>VIj`Sl5N%Je3<3r?9i3UjLbAW0P68Wh5HwbylUIu+dyg^d;KR5
z2t0dwYa>jH$>mW&1RHH9G2$o%!$W)*3sl#!k!IKB|vsr_pKQ%*$eQ3boBj
zPOoWHUSn~CBw?$Z4^i#AYIl>H%?FFHeO{@jnsbqFEU&5a&ChCR444nFmhW^&8i%3N6VaYWHB2}hN5HuLC+5p@YFIxi#Xr4#WaFfo
zr{Le)S?6Qkn^`ax8`ZToS-W^^4KY^_Gqnb291ytN*H@QMYA2P}A6y8=G=tQ~s}Q%5*SJ9ad{>$c+uTu_6CgH{`|vxoviS
z<56GVHAnw{-z7P<>F7Vt?BqRQ-Z&mNj>nDTvHy5{x~3~ciPHd
z`-zzR|Jefs|D8i)Xey66fc{Mh#|K8?>Bil9Hf>q;z?HZd}W{#V#=&#p_@0uC7^A;B7
z@f|&XhE45FzK*ryDNebc-VluQf$FN58qec#Z&71G)SiO|)JDT^HOs@v!8(s5)+j91
zclGM3qo_~g;{E&@@1Uw94SXS@rnimjhyex2%%(4aG$=2W`BU8MR%4;f%|>!`6}-|6
z_2T=#;Qox!d5a5ux38#VvZ`NjHLhx-#dQ4*LGNH)k_zzUHa^oj@J;yZm#C{?FbYW|uu*rq!?u`A@S?_P&}_(`2po
zE}1S)tKKuzzb5!5xq31p8q>Wnw*Sf7magg%>5Vle*f;
z9plk|?qIC$OC62R$t-P9j+BC;p{r|)tIiYaD2sZGvZvQ(@HsF3a8mxU~(8o0Ztv}W`w*T3gNO}kN^q6wTzYXAJ#
zeoJGw+V8#5!&l9BI_kcmdSO+*_xZFE*7qmZ9=9GJ&#JN0|6iQ@+3NCVCw?}ge~+5$
zZnLI2-@ok6lE!ebZ2`xf=ez&6y4yZ-YEl(*tW*Wi-v&v!MvzEN8TsYNf4tX-LXh^_F07
zs+??ftDs_pwt=G*r@GO;R+HaicfP-2u=a4cYu(%V((1P6yLC08x~v@DzR}a0v6@U}
zb++}I`zR$1HzTS&#hp{EUel_3to)T+_S2JZicDg8=i*wk>hqnlQ_YPV^c5yw4}^-XU%yKk*`4Ev_gsxcD0RqbCCd>Y@sORXBq+k^83%US-PsI94@sbu-X%hjz1HCFR!
z)|`DADyszv;&(A-SA14-R)Fw$KDPBjn3}-
z^~X2r?B?r;XA9cUDcvbQVNv7Y?(2pdn7iEn)vNJOf5XUcw5h2t*26Y+(E1}EHGQ~T
zg{m|}b6d5U+q0BvLzlkkxz?era4~&Sw)Xh?YbCYD*T#if>6j?$kJfngn+8giSydp6
z8#*_knd9J`?2J>HVyd=4JsqjKDynhpt+8#WDQmsrpWfK5E2Ji6`IimcRhQG%HLcN}
z(`e7}t`77xVN$ibUTf_Hvj5-RyWP+c(;jLYJ|}22Y4}fh>f5<$bYOn6S$jc#e;Ld$sh<3|`ID+4Ud3c_}uT|tzi1odtIDZEGrcDt)
zuazPke(gq18$Arau4|V^{3n_aK{|&{kD73CvFXEbUt#xMc0XtL|2X6ya6?6Sj1}V)En?_73C}@dQcRDSNO56I
zCZ1QuTnrA|V%8$e1MEJu|+PHgEEt6Gt?>)-~7M_a9F<`h>akk7^rS9Ayx-*GXHc8Y6b3+>{a|K1iX|J9lZ_
zB~%>jO1V4M^IfP_BbHu|K+edYnl*cE?N#d4S!RStM=FEQ+;cRu7cb
z)w3w%?dE3ykIuPy`0@$?6VJUEAhwdFJ=dcqkkby7;@gUlo+x4
zyn@&m@#1+m;rT;$zha-?*-bc~{QI0wVMelhJ-d&>4HCUtjclDZ5kZj4BROW-&Ju8#sygReS%uw-aCh5;FnN*t#=2FOq<`T74
z7Ug3*B
z?-q}8$ao=TIC{EAIb?H24%u8%yp|kt3=pNznrSmMEdgHPB1fizry<&M3d<#>V2C7+
zw+=Mw``{wvRvofCqdgk+;gHYEw~>M&25}0Z#@k5U5QCZ4)<{P839V+@Odtm%%5A3M
z0WDCB7NrT{;$9#J&=^L$fF_9$F;&Pm;o=dXsUlRI&FBczLd6W``IbSs4Hf4w`i4=M
zn8~S2lkyNIW-~1k$N_X7(>j>l(D_rj(kL?m$bsM0!a!aoff9%@;1Hu(8XaM@P@|*F
zrNq1%xP^F&x!i5;1(z1$Z6G0znN%z7#P3WyffU+^Gaw1on8PBeI|++XOO2e2QW!|6#zMau3}Wm=o)bw%d*BnwRwZs&gd2g`pv^5To
zi$cB%B*Zqv3j{jKrTe7oHCIodw>aL9E{SgEBk?Y$&@NC0QoQ5Lr3cUq`LXzf;|&j_
zI{H|Au2K)AQu;)E#d2n7^bMC%ejt_7C*nJ%6$Mf$eI|b5cpEhOh0zX1pNoGmIuJ-Y
z___Fv(VKy!J)es|fQ0xeu$!3(BuzrUGWrULG$bG>I7o=^m=-S5g8BzJfDDsrY*7%&
z@}qDt@@V7)mvB)WM3Vg|0vKJx=!6I~Nh9wIq84{TG%-n+_6JdqV#v-WwXxTLf<=Jr
z#qmC6T7VpYRuL|K4x+kkB8PIw@Fo!&%3nu$563$%Bsat%lH@kd!#W@#QsiEi
z?5>co%!G>*p_GT=GJ%m5M!m)e*`86;Fe=?qvZFZU;$9oO3gv%1Sfy?Eya4MG)c@xuqVp&S$
z&5VK~NX`n;hvN{mhG`ercN=#pudN>X+`9
z(;YOX-Wo|`>Ml78vy*UfeUOuhh|!rE6)_s8Q8A+|
zjV@udlFHdpY&T<;@)L1&;T)yoJ#x8r{ms5lyl@
zA#Y>Ug3*)mcIJ6zG-=(F@(wP+VbNztV;&+O;?!40Q|d3u$GHU8MNTO<lD5IzAd$Um~hP`Djh5a;w3
z6n8)i%rnI$EylxL(_%8*TU$(n`&z5f=&#>p_v2RIAmk71nyu+MqV+gX+qRx;Mu@^T
zH^VJscLTfkvHLu`@4}Vh_clH`N!sZp1KW-^OU2Z-kHXDpOS#KocNx27OudeuZ(?_6
z+b0q7DSm#Q-B;T_fLQOfJplhN+2w>&iT~OBJf|aZppq#So{ra9lS@8K+9@WN
z{LXHRGw8WDyHnWBVfQk2Z-zU)WH&#*$j=|}^C#?zP82tq-6VGVvpbI6bJ$(TZV9_r
zvwJ(ckFk4%-A~#5fnBpR@r+=%HM^+F8P
zZa^~ePhhtPTveW4J)E38B3O!f$z$Ovy}CSk5}xl*o(A`sWYWFgJDeL_D$eOj<*Z8h
zysl?k(7>*fL!{WybvoR;y3U0AVAu2EzScDh?uT6$!u_)A186nBbamr7y#={SV`Zub
z&q_0gcO!k9$nH7pX0p4cE9q@UvmX%B=sp?GLF|Ti|0%@jyruhSb9%`gc%EMJ7`sQ<
z{fb>j+D{=?ragd+iK9e-9f}fSv{mRdQy~sbh7sYMg>uK;z?e!eop6oNR
z*C9M-vb&@AD|n`!p;Vmc{dw5*lAJ!2uO;lRfU8>i^pYFwzA{1zv)|9*lS@+iQEB&OSJmBwe$?AgElY7u
zzXb^CX7`eQIe1>(kN9t4_fd9_u=^RiKeHRqpGq>aKXLv?^TmkOu0O>Z+P@IbWBT_s
zBE(yR-o>+Om6X#`F@G@SI+xu7xGHzvntf~VD=3X)aJ@bmO(#W8FZp0FxfO7|8mP2R
z=@pev*jOPhwZ~W2$#j{gvvY77V!zVW_8?TrzQ}
zukB17dJL)09eM!eyp*4*50rxVNb%KB($!yvHjk3RF)Rh{nZu};8!?Pzn9A-Uc7574
zxuolGYNrF?Mu-)|*H|&)+Toj{V#JMbrPu_2ul9a2{1N#4$Zq5aN=vm4>Yt@hTCMu<
zW+SK;+Kix4AQ>Se#Gnx`M|peHg(FCw3*dV7YV!!n#a-;~WcLwvpBq8Cw`3$yOGmD;
zq_|=v@l@?dmH#y(iO;PgNgh=fcaMyVmSWGymm#eho0RrCMjeZsT+)8jX!P(s;Yu-@
z-8LgqqP=+x=syo})oAD$MY*_)-CIX3hX13Z3hj{8HodWwB$tjRNtA3d^#sCS$3B}!
z|AOaxM)x&T_{k+{V<_Zcc2#(i{Ed>bG47BEv3|_4$Xz`8>=n0-nT#6T!R|w2NPnJU
zSM?IljcL=gRJ=B(1KbZ0m&U2S7=6A5=Th<880t>~$5JkOjvI=$P}t@mkHX|`;OG0;
zeV*NS;d)1Z|FM3+xa&~z)7V|e?!|Cbzahm-zUpx1Utwf*Olybf6Nr1k{u`a*atV;YLiN(zv7r^?s@!P^0rllSmW(4i__@$>c_{
z+j25#ozjhtlfSX`zvnn=eKe=?)-sL$-ciig51E{%i!{R5`b_$v=N9Fqjj>aW~!JSN!>eG3F*
z0RNRctk|BIYkN`q*nYf=Nx0n6Ep`}oFTJ!rv12i}*C=FA>}1%{y);U}hbV<`n?@;M
znZaa21YC6vSMe8=3=X&2@2U<9M_0s
zX(i&@2>g``k|jZm(1>JdD`sd!`D-s0D&(Rv>mU|uM6z@cS1~H%^g0kj{FOTv#b$tZ
zJ<}>Aq0S<)EzwlSRFTSPowz*KBT~f5X+-Ib5OWmb6h?^!8c~^z5-S*~^hR-Bk%y4Yv1>t7f8`)M#3U-oDD{b=wMHb_WRao}%Q8izGE%8e5xsRt;yFcRYeYP!
ziPelsp&=WwSF}&lD1~#x^BPeKGsWu)aSF4=TZ~i+v%NWTyb!wuJ4eU;Xy=P?R+$P(
zwDZM1jLKYn;`WJ5u}h;Nar=Q@(`am5l9(&r(P&oOvp^qdv?%Tn&{qnvMrPTm-x&A4
z$P$0(kO$&^5c5PpMXN!v&skXULY}D}(ndeV
z-y^T~L%ZZ!KlHG?)<&ZFZE~F-S}!-)D7g7k@)jF)Z2pqm;)kx4ci8C6=11jSHX7Ib
zU3ssKGMdj8JN!_g^r7bAm&yBVTF2%Ua;G2qPCj6xALD_q9UaJ6k&h!lbqLVH+jJT0~}S|^6LTxuK;kJ{)G<5_XYMk|4u
zbS5tAL{ZBtjdBrZqic-k#Py6SBx%9(;;4-#0!1fNyb4LW`+``j5w(>U#1R`!1PV`4
zA!Fl5%NNBY8_ko4#9ABW%9q4Z8%>jkMRXT$yxH;TKR@ZPE{dEm);UL+vq#_j&ODJ(kkS;qC_Lo>*L}o8?DFg>3WSw
zcRv+dZM0r~A>w$zuaG~+?~>n$l{R`NO(e
zYK^F8h?Y+0(pKLa37S?ex3>DlXlJ9HtsG`jrFdu9
zv`bqxF+1C6YpYnZi;XB=TBUeBY}%!*I+|zNXltufGu=iMZxAEuHJ)qL-yAIONGG{z
zt})ddE{`yR^|bYD?6>vnOSDokkkLMkMzx-8j*=%Cm5C`pqvh8AD&)DX=a^$;@&H0*
zt~srf#5mcHQK`sloo$Yj;~7;1E@|yCC(3CWtwhL)GE1Y)j20^-cOr#}@*+)p1o0-x
zQcWvI$VqaGrX6PVkft4H^p>W5&FC|Y90?TfXN{s6IR=u{6@l#%mLP>Fjgk|J%*nE?
zLb7MVY;%fC)#y-okvUZk)M!9Ls+=yzYcxEe)I3|x)M!G&Y%xPF&}eExnK?r)(P$RX
zIdY{!f#*Y(bLBM}EoQVyqZJ7r^IW-2$Ga}!DxgO-ZDYb@F-tzDX?GtZC07g;_Fa5as=vxF6eWHfPCEjMj-?+iV3|&q&Wk4%
zE2Z75=3IFuqw>K1?cM?!qS0CH-ZQi01RZjIyN`g**68APUzqdcc^X~QZl9PZ=WDd3
z-F~3OjLHKaXqP1B%cUAU-L6p1m!&%7EA75B7syo_ebDazfUec(d+^Mb8#Ou!p4swt
zjRM+ZrYg5-6xALxRk=r_)}Sqt`!wnV+9LU^Mm<5xkuPa99<&_!hDKSS<;wRoS^`?G
zbPiLcbb0%Kn0YdkQF-8v?WL6`n`_#g?UO{FJVT>FvHO6!Y4i}dR2U@BS&!|1}ErrC;
z#9+%KA09z@SOL`3Dv(DRl?f}hwY5Yp8p-(+6A}}x3uTE$vlBa6OJy)G0n1&a6H8@N
zjYuahk}VmPx#o4)CoYnS8eQ07KhSU;lIne#9HkM}`!YFIBPzinIZMT3sf*-dg&^ll
z(Dsj3lHJ=O%PN*9#xQb~blfLO*x-+;P2isT{7+ogJmMLXOvHC*rM;
z(=>Vr@m9z}jh^VZ$yzCkHF}BBWf~nvyp{55jlMy=m2#a%Cp&JnE|Z%TLLRnRW%8s#
zA|z?Ib-8RkPURsa=@IJ+*iy4Nd&ox=x+fdSo{ryhzf>r1
zmKQ37S?sdlTjVMmT>^Byjmm;I$s;ye9ek_&%0|}*ZLRhWD+kvg$D
zqbE{#7_ZC6H9DMnd&nE|S&fdT-UIZKMt@JeALuQGP}X}x-jt~&oOjVDw$%Ka%+e^h
zo5y@dE@f0EUT^ty$UE{Xpaf_^T(=iOj>(&tRuM?0bWGl^5tSg$?5KFI+;02CG5LT-
z%ew6c+NaUwpuH;(XmmYj@5+}nx(&4VGaOJT9kQN=Vi8ak-k2vgI9@=dAG2K9U&E6luM6S?iT=!J@iCnGG+1)2&rFXqXb3m(*w`jBov`^(78WnUmLqC=GX>>{V
zpwQ3cUWK?le8&2j0R2o%>j@gkOsE^s=Zr{q2c`83{lZ4m(uRh9X`_W{qx}$#cs?5G
zt`99wTNZ31$Evi6zIcwC)6NO~*2~jzZ`%2x-`nWnwE3Yw`k}?4fA>SnLVxu`mxiA7
zLu*6-@I$wTng-<$Ida_5{rpgeAKD%o;D`2v2Kk}KLxXK}DD7Zqn2kP7do?uDMu*bg
z4~;dRMd>DB6+-11Z@i}wm1lF~CocJlKq}7`hFD3mR0L9awlrKCQF*pB!Zo7uY-zOA
zh|062k*E=sXGS*~1CZrd4qY_vTz(fFCs3bCa}
zx3DDR;xaB5gxnLFY}{<4$3wdqpE074{ldB#1(&OkR1!Un0~%3D^fqFyP_&2BmWB2=
z+S_Px=s+Wf(F(Dr$C$98#?n>Zkn=-F8||<3@_avZoRP25!)dpMPBcnvv^I3IagY&l
zIVWtIar`PTmrFxu8f#Z8M7s1BBlv2CNSDqxcCJx~v~G@ZlF7&F-oIPddwEN#!5!2z2_RPYbc}|opOyt7oC~A=0eXc1W6=`cPueE5fd}X+3-H6FxM$=YBslyXTs)HFn6Xp4a;!8cFC)
z1p33S9>xwIqH)ECa(mtsw$=`LanGj>AG!*uUt`lYA$1?x)l*v6+O#Jtp~L>j@nO%&
z!Vc;9z2|LVJ`{K6oj|v9304GBnO$pa(}>FKT4N8R@<1wy>x_LGQAu29JgY;JoYxyK
zX+&~fZ@j^%%vIPcN!(ymXd31A2ICuzD7QBlKk1N{_u41c8GmTBq1S#O*L75a6@ir7
z8;x*AWv*=qd7}}h(US;yqtQl(q>@-~oS|v2A>?|an?_$C9*wA`HyYP7Ds#!+`@~Jg%^F4Z-Vbz#Mv0)^Z0yh|9kiQ`y^JaX
zNkeWip3sOib?=B>s{jLKZJD&K6pt`V)uHyiJ1w6FIY
zVYe9-8ok{67|^#G9q*kawiv%E#3Sq$Bl<>`(;zvw7~2_@xqk2cP1xB
z#0KJWjrePyPT|iPJvK5=7x8?-=*39!e8HOs$DMupg}-PFQXx5omyJmp5zkkQsf<>N
z-F-%czivd|L_AlDNBc|)f6Lge(ZN2$#5=~xn~A1Uc-L^;La1C&3hx=Aj1=tyBi4`h
zq0!Zk_KDHkk5*xf@S}ZhO!T9DVa)cUeQnJ1qkUr(`q92OmTMZ7;19-)ezgBHwlgBT
z+l=tP8}m1L^DtZdY`AT-3aEsUvb+6ayk*m}!+$j{zLnxt1cs!0%zqeHXw)V>32#BI
zRY-PW^pr+@(r1JAf<^T^4@Q
z7-6F&=5NMC9dc3Z67zQ>Q=_HnmxTXe6lheMzA{{xA8B-D`kHWu`MpNhre7ECH2=`(
zuJjGz0cOZ;0)G{9clzdVm)S<6ed%|G2bx_K3Os;31eyIb?X~o6;X&pYjgF=73~yr2
z(5M2k1e^0T`g{6=;UQ*$Mge{Ig@>A#Y82J?uoY&m)u>h9JHx}xO&WFS`%HL*xm}}P
zeGi65nh$F}6PGd<<*%i=Mj^2%HYB2@xlz+1`gzRO=2lIk5^QbWrxBG>g88sUl%qE0
z7aCEH+L|Xc+MOO1(awzCO6isJnVLj%l16lXBFX%#Ms$9nleu3bS~Dk`uWCeV<}T*P
z3h|mb)%;8&Ivj+SNZv^f3RX(E-qUm>+5M8fZPuFE#qG
z|9+qo8vVWhK5?dbQlp>&mq(mwI_~5gx#9*a3+`oxFjDK=US_jY0+%;tj=(8YK-(
z5(CXGj4A?Y{XWpVSJQ?Lyv-PB?$+pujyod;nvZHUnd3dJQ4V+xG+)%{a>N^CzNXQA
z1NTM@GLI=F?(MKIVz8NfH&5`B;M(f0vgDx>fn)@~SwGE-?
z7*VU5Ek>G07_Ag127Mec(oDUFc&d{tW6j=-)JlJ>`6DA0Z-PnT&^jD}J-&~aV4l<=
z2~9G4-%B(V@+=PN-EZ_F+Hd?v#8geA{YEo#x{YZ6?_6_`AD5ZtcpHU9&NOG*Xup_c
z&b3iYp1D+U;nN1$W{J&no0V;cBrfzO
zJN=bAh)a$i`p9ydfAx#!G1oIH7Zfkw+@%r4D>UD<(MQ%&^EVZb=SxMVV;iMV=A!vh
zkr}EG*Vx5ojE&;u#byE{HQE=OTdp`(KUl%bvKReD!to4
zyUYyIXd7sknNb=&2wIuhT%#vID>K_G1j*v%<>o9#G@_?RUSam#!8}>&E6t%cS|zSD
zr!rC_`c>u;Mig&&z-i#_F(QYzx6ixg(cv0jg^DaANyxeR)=7(-G58DVcT=O_1m51BS-n%Gu
z%7Z6ztN9Zn)dKD`|4_(9yHIzU0lQgF7wziZX@+S;yLxw;aT?JM++AjZMp5ne1D&A}
z?dsiacGHM<_3k#)HKN_Cd(0sk(eBkf=2(pihj`3;%_$l!A2J(gmPVHkxiWH_Iai}=
zhO7a~)#xVBwwr|--2>WobGb&ei@3uq(};EvcbI?G=%FF|#C_(C8ofMZKhS24J{fXd
z)>v4twOMZ-wE2W2Z?7nTW$B4(R&pltL=kkdq!nqcH;e!51Km_VlEGwiymQF
z#N|VegH~vxPw|fC&5TOLx}l#&K5YK1Y1@Z>8~LbdJ*whuANo_|KJ%DH4-Wm#eA4__
zqY1Gh>Pa)`F$%dtyfD-mwckwD=*^)aQBRq(GUo+z#r}QcU>9p%nGeILd?RwO_n30n6sQIu)BTNUW2_-ej`Hq>c
z5y|r@0<5&L@9h={!JrF;Un`?jVOgr%o7T6
z3ZI%kF;YA~HUH2diRY)L^GPKq@%-Ej(TI3{X+|r=T)sAAHH}jE+H9o}o%{XP?951|
z@PnCVqwY~Zm_rnDg$?Ty^`kjPqZY%u1C3*(%JYP|SR<0`Cv&|KQ_cON`aQM)5MnN@b)*wODJmA1&UxKp|JwuzjMrb&*CF
z4ciZNsYX|W*220{qfMZ-u&!gI<~A*@J&dToUKrKV`r&|2me$s<3b~GhOKS^90ZC5R
zPvFwpYN8R@f)cDKjmQ?1V71VQ>^*I)_8Nr_f6QoOr6|OGNLy=cB{WqbF?M)SR9ov{
zIi-g;?1o<+m1vDRs8Bvok~QlEh3@TeT~uew^&%nF`co}8qf(@R^@FvXQJHJU@O`42
zbp@k!;>qE6M0K-k?7iXJqq=r
zSBR#xZlKjqBhtDd))I|K>xNldG$K74VeQd~ba0eat`KY880(Nmq;+GgPZ_Dy$5`Jo
zQmK!zQeUOi$twL?)EMguMiuh>5${J$uo?2nnoHq)#`hcLMqz1
z)-XmDlJxUjYv$`d+AJ&6M%%1eRt_UIubXXMrV-8S&a*b!=p$>6wcjsZmi4?}ym=Om
zUE;4?P`m|JM;m=)EwaWlf=zVH_OoKU#tHwvASaLhCa|YHqW{n)4>fS>}3WgvY$lTBy-GBW45TYxD_d
zORXY}z6WiowNj(sK)c9Vtx@2}*+4gF)O4iBTxQ*(Q3ueLS$AsGYvgB9Mb=J*c<;K%
zn)4RR!uc!mYH~=sghb1Sk`um*y4Xu|3;=DpjTVo@sc{<(Z~6DAOROb+JWH&*8C6J%
zS7N=P5ydODzEKGFoF3o}0wXmSzS`R8M_X%c)il!Uwbtx+h^LCT&RW1o
z>GeA6O+VUt>wO!^==E0IF^Z>W#@19uWtbTUM{lwoRtP1ZDsQtcdsl^|{o*aw8ja|b
z-WF?*LVtH#H@rN
z(L1g0G@3bTbo4GO?n9OO%u$o0cU!|W8lEsC`T?s%qeJ28(R-}VG#Zd_GGwon^pT3!
z6DK|&veq&x6>~?;HXpW*Gg3YDBUX!#DWuZKeb#i1NF$%HF4c&1aKE)dBht^Ot!)ai
zMjo(sYD7Ks0qaFZO3w~hM|C`!%^a}8Kk=paoHbD+O7D5AL?cS?MeACPD7}}gtqO5^
zhpoFcqVx`1&oENy9kveXcr@nxf7HDRe3ix3KR(ZM@AHHpJA`Zm5=ej$wg4`OiXjPb
zB?}}$K)`TGF5yBpauXzKtJJz+t%^$(TdNc|DlWKF(c)hET9=B7Th+Sa(rT?*m+J3(
z&Y5Sqxd|_A-}n80{dJW$lHOJgXd^06)9g1{=&uf0Q=U(
zI*eC>4F@D&YQ|57yc#^+#WoLlE%>sFT{-0S;3qD2&5$>PD?X5X^mgFw;7%9oFy0P+
zqA_|q@J?{Q
zm+uGv$(XF@?+1r`Or>m8?V%TjydQjqG0}A&2K)bo;$)2e68wteB;Q|xcu1?`-W>9m
zV9h6tp_Gq?d>Z@}W0LZ-;C&K@S$uQwv*1IF$r}Fm;M*FbwfKwR0T+8K_*L)|H{W+d
zz75X(RBCuAw7svghI~fYMzuGzbfB`H(by{?d^^z^`-Q}P%~m+LrV;fmt
z_qP7b81XE_=xcr9!}?jhzomTV^rDl{{?;Ik(Mf23Yl_Cw=j~PltfMtHe%>BnCuwZv
zyn>X0R-MMG=S@i&WUbX$WZqH0+BJ5{ys>Jqb-KpRpVwgww$9cV-De+S{ZwODBW{Rw
zrC_XSQ>?!W#%n*Ye{!qUj(O|*rdYkcBW$C3Y~D8mhgz!{J4ewvon~DoSg%ppGgH#6
z{oixGUgNW8r=(lUlmYadUVofdk&uHab+zj!>w$_L?W}Tu`bq`l5HKunCRUct5sv9rE;xnHAY%$wDqvYNH2}G9@7}<
ztZ~-w1Y<2V-g;8U(d*ywRv&!vg2tUz`-#?lj7eLjS$i0hR!_4OUQSc1zs@-`Wtugg
zF-dv2Mc>LJPSA_0!>tt>qZd_&TdOrjr>lost!}`a)y#%g3r?tnW0os{C)jZ2tPuIlay+{}Nb#!PKwIKN)UjAu@fRmPau8ndhm+_+7u)WX-K&?B*vXIp7DVPuE=DrJtf
zFNv_tYIMadDIqJfm)G|bEJWbH$F1DdyHY&tsEYej%G|iZ)KdqPI~cz*udqgODRLL5
z!kWO?;81a>Hh!Rg&zr^CYW`
zv7f1iioGc(S=TYPS+xOMYSkPj{W}ZTGOHe6U!mS!25h;t4_`hY?0R4)Ti5pU%B;0+
z60Fzf6)&gMTDNPgcjX(v?$cOi<-5Qh(%AUQ-D-ukS7XOi?g92k!C02U)+da~U5Bvs
zrN-#4L)iLC=i6BMUCK(!=+ABGbx~z-=t`@%#^{zpoi#{fB&~H;reIt{y*0|kGK_j_
zJYymg5$kAQ+-hq+V^@YZc
zn2(nd*7q7aVg9C}%~sMt>BF-57Xcffu?NTeY-o#>=ES8DmaQ?;^DWj`jgg*jvF2)w
zZsE6D^ELJt#I;&WG)A|M*I8kW(XHckR#ambBIP=3lg8-2ew%ffVBp!!!I<@lV9?&1
zRJ+xPFFBCDZk~@FrgeG>VdtpR=Ko^odTYQ?!Oow5!_W=Z@fzDY|J%NuR;9-7m_K>Y
zsn!aOJvRU0zCW;bGA2^~LuBjaFJ3
zr4&!_kF2{jMxNlatOqnkH(}4R-q#rE^0Taw>5`9h`Po*5#z=dgYb_Owwf83LWF1F(
zev`G9F`0iqv0`!9>5Pf*;wRQ!jBQp^7Cb%lBJ1!Bs!w{m*(zg9O4)4vQZTinc>mDN
z*0mZdTkz+hmsu%zEGX7RX8+5r5sb+VzALN(jgb!dxpkz*=my`_RW*0lP-|wwcHAa1S
z(mF?D)Q6|7OEgA(*k}FH#dh?2!TL30)UpiYCF?=PsAXw=U$(wxOuhv0s?{fp`XKh%
zYt~}MHmcvJelYY6E0-T%Zd6Mb{B7u;tuhz;e(1Z_v~0>JmfVNdiHuQwo77*d)r^VO
z_^Wk0V`6K3Vtu4BlF!eqf*dMEeEy$X%QQyv`K8sYF_OrytTP2;Y5m6fvBqf6^^J86
zV=@lkSU2f>w8#6#dRt>u-*?vVkzReuK0#wtpJ^}C7}XcF&lZg9v+eUVM)leDHpZkr
z+uot`Q4O~JuEuD_^|A+zlKQC3-u4KMQGI>v@q%#;{p?8^qZ<0zGZ>Q^`q?Ee_T1op
z_Dzg!R6km9W!kB230(Vu4Jq5UYZY@9;TE%ieCHI30N^(pojZp!M^sWwb_8fm_>
zKFuDiF}kyUxSg#ry0d<`Jwao%rXFq|tueZ@ez-kHV{~WzaJxn@gYHTnj-Nu{8Vu4>
z)9wBmBfUGr9jrM=t5cJy0d&o7XabPvA9ZgsH-`kiR!j+Z#nic9QiF7|rAWp;_iNJrM%iy1pd
zJyBDUQg2_t*hckg%}J^C_TmXr3Z2bIY-1u}GAe8AK8%UQxyF9R7uRC%cd-nk#eS19
zv9nt3zxv{0c3={h$sW3P`!KD(t(r>!P)eQN34HL0iC<26>Ay)N}Md$q=%9PmW&bo&{N9hbc)
z_(OX@q2wbyafZEtG4aryX+I`$-0F??`;3X_d82*I6w3E5`+G1AvRvmenI
z)o`W#j9^^DRrYg?NtsvKuQDc{p{wj=hckDXgIC-2jEOF|+U|3N7q`tG!r0@z=#KR^
zJ5^(JJ9?WvTw}Cj*k)(@@?B?-W$Y2Y*L8*beBskhk|9p&ZQXXh`oguV8FW4JBJ^u2`N
z+v5Z?=oL@RYq$=cDfzJY}ECn5;)n*%vcLea}GL
zb&S#2UY`22-El0{Ei(a(f*BIR{deQz=V{~h0zx|cQ=+@4D+nmWQ>qR$@Ub1^@jBXyiWDnLD
zy_|(F(za5SG!TCcCVkJClxZgQ
zD)IPYCLOCWDl?c=uQ4jqPC8FxRA#TF%LU^ydnaAVn3UN&=~|tV+Sxnld5uw-eUiS_
z7?s&CDY?|+%YdYzf^nIHlF}KIG6yB)GA46#P||gbkss`i)Imx2`%(^0dep`4PaT{z
ze>T-1HcDDjYz|>m=I>LplFnjGP7X#S?a>&W9ONWzm@6%-EqW`MoAf$k=kS*m#w5L`
zu?xrSQDc%m(HQwy#wPtkV>CC%CaDnD*Nf)n*ra5Q(T&0Uq=6cvIh~(`PeM)xTI!Z%7UczjAX(wZ}hkZGA
z-HHiGN*QYPiS)Zwt$^|2)0loP(=X@nHo$rl9Xz%gX-u`4Q&QN73-{C#fA0>?!=6g;=kk|!=-lw<
z@|V_Ajqh?#MFx7xE4(7^1yrBK9{2o|3Z@IJ^@V$)zr$$+`uXhVyyT_6<1-zcKD30#
zf?*WURHwNVQxPSgDSoJA_aV_1`Ep88fKh@VB;()3C2^dg;
zWmH0MK>P{>)1`MZIun@gK~qg-3iTboHHmOQ&11^4gp@MN{CS1a6I_K7OeN`Q)o{kb
zubKTC+aKRT=<(uj;?$^o7DJ)!)HLItRCD&G@m$lne!%ikHjRg#9OQxs1LZ5?_
z_$?i-SEO{QOEHy%>zN{JE3H!jMV1nNKYCU6uuq24F@>AUn`1k
z^ut6wNwJR3q?uwUD#27I*HU|;fI;;`K>R8Kps99qxN!xAV}RYI-{7ND35NPQOmN^z
z%9R5cQ2BsCH5JfO#{$|q4W%^Id7wCBA$dg`JjL|1I*Ro}KWE4?iMLVx_Ke@o@!K%|
z5_$^LD4Qx5wFh)-g<}Vou0)Hdr}BHEQ;jC;jd<(AqZ`~RN#hSY>#UbDex3E`|9P&1
zmvHb{XVvi9yb<8V~8R0zT3aB-JL9N@pa=L4kKbPogSv~*LT>okx
z6QYf7j5|EY3@l~a%IIm7jsIfGAGsEx2)BEx
z@&8+TPxct?%CUm4BB<>a4hzMDrdkDh0Kd#bTC^2mOP$_rN<&@U1Klglsqwmlr2JQE
zq+XcnJ}&JUKvTWMVLz0*gd%CAormr%>B(~VhU+4o)7^|qoP+-!V{1};rBsz2=C^@xpk3YYJN1H3m0#_dfyInC)V#OL2Qd_JJ5
zF5igXYnT5z+zGV-{kuDW^Up*${g=$uKDTykvfzW#J|fENuzy%sjbk&SXlwZ
zik4Oh^zXm??Mdv*zekZ)y~-mlGAY)$Xh^?L*dHFTnxw)@6Hp$-(Mw}EjqH~TIsBi`
zT(a9uMP5yVJ=>-#<&tTp8|ptV-@othhkMc_{xtq@Pw5j|NPY}Q3nj+-%k+nZ^WvrV
z*VU8HA<^2Q`D?My+}1vGDStlr8Bq0r*hK>3_nMi*2QT4HPUF{02VXt?vU+f-_GV2$
z?=knGE>pb>7|=WJM2dJ4Bn|E2gX*71kKZn4IS~o(9VO07zi9T!4l&5Pww~!SPib!w
z;JiVe(U#72=p*PKHUDTnhgNmxHTpBtKjt?7C!_2iqyKx2E#rQ0+3;&Tznu8Pq*bu9
zVE>rVg(7|oFE&1n#QNuvKkOd`|L7cw=1-hWem;u~lWups5IyOCsw<$f*HG`qGwg|1
z{#oPan1sbLEanmp-8V=n&A2^?_7ieB|G8}c=Oy^Z%OCcSmwy~vx#c1ui`kM9*wgs}
z(c@2@h~k_&`Og;~1Sh
z_@z#4Ik7P$d~i8Tv_|}Mu%|GUX(-SBlsOnb6G=WDNt4+s+&Ht5@@`>x=+fdJala&x
zJ!2|4zm^g4@AnhuEJ>81WbL4HtAIYYB1>MZ9cQKX_dQVyNjW{uT>otK&th54Z$sZr
zbq{l34@05XVN4zCQN~?H&>!~u(EL3m-a04alBOr_EDsiq|2E{a+4uZ2MRZ2eo1(n
z>rD!(yLt4xr(5iAaX3tA9IMqoBMx1&^(3GFc?tem;1By}fxq^i?9#srHyDcj@Vy&$
z&e!~Qg~SS!v&djG%^IO3Y6gE^i4~i~gU&kQKiQPg@$0}uZSSv3^r28Zjq0CA&X^`@
zU4Qz2&tLuT%#xuJo3*S|C|#35Ko*@OXOHjvMOf*2j^kpTI^q!{b9dG@`wG}z#sPa!rwd506pmk
z|19(7uQO*oN_V=#Kcf@-)b$)a~{R8jpyN3Ss9rd09ioy|Hh%5>
z82rY22{8IsrqV#m#BWJwsaE{ndSCn-h<_>gmyUl~YBb`<;NK*5pDIM&!__nRP4gl6
zanCpKtK^@kxrhs?eEge$e}(u3@cYz!q^nXT#)+!NSdREw;46@)UR_``0B^)Et*^tk
z;$!M}_(kRt;|J;!{2KCfbtY&VLHiMC=ONus)L8SU$a^7Z7lC#$@^40)E<@Z^sQoI`
z`E$fy1N!wyb2I3-qn>;5_kNW1AZWiuzK0S2F#7rk=udzXPpIDb*AM>&;$I5>rK{f|
z?Oycl_sIWW`1dsGehy{t1N~Lxdkz0yNBY;1{&l4PGw`?Y?_H$(80kMn`wJDlx5&Zk
zEWA%t^nN5q(YuixMejv&6ulG4QS?3}N71{G9DGS?GSbsKkQ_ztKXMek`^Z=H-XmYp
zJCA%t?>q7pz3V74>DzfBh6@-jVHjo@1?(`^ak!J=MuwXJmj^ZzR9hAOUiKFA(bNx8
zlhupGMlhMbFPf|U{?lM1LJU4y2N?EcXePDn%KQNHHWDzKnmQZQOE?J)bEORM6FzKZB^qc^_xX(x4
z&h)}S^GSIbd(8_^DgeZoW)udtfKnK^1#o)coW6=FP8l}b4y^v@;fv4nnx_Z25{E$8wP9*lr1-cRNBx%
z+qs0D40i>7zx>i+4+ZE~=N<~|N1DByCf%5P@>rE_%sLr!hkKC&8Osai81z17uX)k*
zp;Y|QTLr-SQ)2Udo%*9E^@Ii~MM9<@&N{hI8sqF-MK
zEBa-HO~IvgzscSdJTCh;*-@jdj@o=#9e%|qczfLgeYOPdse3$obMOxccN)vm{*b*T
zNWYS?6&zlG-!c8L?qan-(YPGLGGBt(G%mFaqkkBF0aewv1-1kR)Njb?G)B}fP+I~M
z>aWe&%QFtYNeaqFmc1>ir2f&IEoyQ7?*U`=f6Unx_+kB6wUwoMd+?I_S3&vF@OKcq
zr+&f6E$T_cZc(q+e>>nM^Fc?2OC?JUdb`YAx?6Rf*;P7{V
z4=lBF*BKX0&&+)`_)g@Uz)tha$c$W+uzYgHPV>9S@wq$A)OrSSb-JJ_f14;f0HA2T4SFU;rrR`YtR_-nyudt%uyVzws
zx~d>!7ms*Y(XU*D75#R|E?zYZi}L=MSB)R@szLL*J^jZRk#VUxfj1Tn%SyJ6oG~CT
z8Q;23$$OU9+%19m4Vif~zL|Lkkn%%wAin+k$>1o$_!VKmp@RqxACzod(aNtu-McF|WA*!ki8BYrT*fWGOt<{Y$d{nV8k)cA+c8_z4Xa5*KDat}Y_dVx
zDINXoo1bn;_~X_1DygC`*mW9dQTlD&u~GW%Us~7J;p?AG`S~X4w@%}z=T@l!jrCE?ag)BZo^H|?)}zKxnL^)CPdDk?=}}`l
zQ|OE9=_Y+?eXDv1wXZXtFPxn53+~Y`xJO|{zrpeg-J|a!zs%1^`|<5K^NcCi=YM68
z<+GXPe4}yL8q(E+*E~4xE5Ikl<)HmUAscCnI&uxk4E5zJj5}VzvRzb&(yCGj?ooGf
zy?5z)>6c*c;(E73mhg*d9D9N0^D8T+6ov&A@T?HL6N
zEb3{<8kK!^!4kmr&?NI49?woUZd*Iqh#GgVB~A4QKw6{e3sHYv`&dD~xeR(QY8Z_q
zGs~9lFCh4O!A>Kk@$KUF1;>&m6dB_hTSug;Fbja4mM|1MoF504AXnb%I>4a|>nv*-NQ=5_}Z?rCG>OXmly1r?w
z+RZ%Q%{<@D+&&O|V^MYPbxglbj}-kX&~+TUiN|rP@y4QCC+|}&3vP#HJ%09rz&
z!4|Z6vay4Ev_toZexYaw_lPv%8HJB>?4um}DAPX$9~QH=96NQZ^>t2OaEm&oSqi?E+M#>fUd-Y5ht
zF^&hEYn%&MW;_Wv-{@=i!#-;);9_GT;4)(|;0j|MV7;*eaJBIVz((V1z*eJwQa{yh
zWCLz6W&oaU%mzHuSPS@L<0ioKj01od7$bZ2Qx_XefR`E90bXhB1pI~ZC%|isl;nQu
zI%6^5O~yrlJB&Smw;P`V-em-P_fz*7hXd|5RsrrYt_FP6*bn$S<8#0#jkLr1sb`D^
zz7%;rCQA#z;<&q;0Ch*@N{!B;F)Hie=qf8hW{}0
z2J}+ja(WfW>DOEJ3QQdU9tJW7_EI+msGJ?3_fmIp_&yHr4vg;CPxT5uHV9k|b_@nr
zgBu3-!nZ%EmXCrth&|pqETy-aZ>6R5Q$c&!P^7o>0sGihfCKENp}kazeIMXl`vJfm
zHs!tD&gnN1JI?xP6S1HC72tDfH{i``Cg3aTF~B?3$$*!tN2X51KK4t%ZEDiAe6tw6
z2$}QDt!YsXZ%6pnv`5Tpb9dTXfL3~O@R2~@%z#yGuF4z*xOiAG;ETh~0<6p)l~iq}
zjLc7>a*7fDc4UadbqFsX73J`zqR)Z{9lLEnwfTDfTYwYBjT%^OwvQ_wNG+^m
zxM|=#^X!q^0Z|v=6(bJ}q>_^d5zHSn&%AMDh{I8Y?-{v?!`BYlW}cD09h4_V?m_t3
z^hX9!nR_|*4W=AG?6NF1m|~L$Q)$^8&L2F_d}U+^@Pm<2rf*`no#9@F2M~K}T3|@E
znKwRp2=#Fk!fVFo521335x#MJ@etdFG3G`GD`|g#bUx+XT2jb6a|~Ii_$s!hvCrq;p@=sjjy;
zd;s*aVaXZu%-Lh|0q2hi0WKXA1^hB|6X2RL+cK)n9~W-Vpj>-Fxi#%AQ1%oaU`ikp
z5?Gj=Npg~($t7n}ErDT>-YJ`g%`-QT-G=ZpQ??^~!`MfLaT^de^A7-~4@=IXT${4y
znHl4@1Llp}3wZ9hx3a3unNtrSe95@v;q%OE#*G?&r@CxvKEgZ3g@#kE}4iJu1mF^|R(Kl1@+3=0944T}PfAGT>6rOz%HY^}@MR6uFA7jOv(f0=mz
z@XV=iZ#t~cuzrueL-4Pu->3FU%S)S?Hb1R4?cB7P>2>KxWGu>9nbDlFKI62E^E0l@
z*p_i?#=RMjXFQqlR))$<&CJRinOTxqles)|cjg~5|CqUL*geB?vc_Z`ne|lGn^_}<
zw+#PcxIH3e#Fi2FjQHJ%cSj^;56zyGU6Q>e`-bct+0SMFIr~8N-?G2V{ysZ7XJF2V
zoPwP4oN!Ka&RIEE=G>HXU(SO$ALVq6TsZ23QGXlNH#aYLT<(#%%X6>Gy(RbI+*fkn
z&;2|%DQ{HXw7g^Tit<8vSLUUS&KW&!^o-G^qaPjphtc_CjvsUHnB8L@8S~7T7smW)
z%v)prG6u`n*u%yaj6HVjePh$}56>^jUz*>Le_H;f`8Vg^p1&)9?YL*g?Hl*nxcA2W
zW!&fEtb%?8sRh{u1qCw;8VXtq))!n*a96?o1y2>cQ}9JW@9}BlM~weq{6EGInQ+8}
zSrcxYaLa^yCp<7AFtN|XQ4=RjESXq6arMNbCWR(lIO(!Uznk>tr1vI$Iw^hf(#b0)
zw@uzW`Krm=Cf_&tg~@MB{&4aaldZ!3g&Bnng{_6_3#U(+HD%tEnkmbt?3i-*ln19g
zF=fEiw5d5$Crv$K>V;E(J@wA1({M_JugPIY5WrUtlBbm!erO^VFCuYU#exSiNgbwo
z!IJ3>uWKK8Bm2TH+Yg?^f$%VC^@UTvVhjo%#3D0VingZ|YG_@WrISo0^M2-v8(dw6KhWZtDv)kY~y-ppcZosbQ
zMsJ@Agi0BEBWE7#`83@Q6mSa;;S_!(aOfN_|Z=!}Hk!zi+F0Q=OvT
zhUe*B)NnxkP<^1zRv#&R{ZE~*K7-%(@2K%}d|&kod+^L2c_o)%aZ`4@hQGAl@F;!qZt|k~ys7c0N
zSVT{$V~wX_4Lt)-$+K#f@kiK1&#O}7Pil_wIxM4iRE6=bT4=ndPBh+Ei;M&CEqtI(
zGCovGjlaS+QmP_#A;xBDDy}#EH(`IuU8$EN{iD8I5_@VI{V2y7X;kI~Y5M_>Oz)3c
zj!P%{?DQd2V>-p2&6Ic2=@U>=jz8RyNomf>EHv>2&CDZQDD;uTDK=@qGobJ3{Q}^T
z!(Rp5mHsARDaS4z{w~5%hNm!;(oRjHyw7A`3Xyy{o5Fu%_#IP{a)>g7;aG-K86KB&
z1=1IDxRT+?IaES@4)LvtVc|&XV_n|lpi(V)M*yCgHv@2U9?^f9M;JXO_X23^)l2^+4Qz6yz
z9>Y%DwU)z@
z_cRVm3DO3s_d=%sf}y_+{uYXye3bkaTJ;gvmDcwggcnbzdSw&$%W*m1
zx=>0G&GSB|`O6&Q>K6?E$xw9E+PPHbaXGa^;@jzOgM?=X9zz<@lU1SLBfLEH3}7@w
zC5x1PHg6xoX4&EtrE2@03^=HaVjVqM4@yqiT0ki?Q9sLQeq2uFd{It$dsWaHA>1pg
z{1|zcSAGV#rjpXg%$jE(HdHCe``mn@A2DPHC_BgA0eC?gL203AHqm>cuSCm9dlGx?
zA5#e*moqn2DdC><>z!(9XYU$<6KiNKD61i^u4BqIHKdmgu8ZQwVgt&T(G;DQ*ed^g
zmsnYS96nPUq)b_lWF?Zh;9p<-D}}5hqD!Uro_OM?`_~aEnQG~!b{Qtl&wm3bmfQgK
zMJK;pmYxZ_Z7|?uSbQeV
zk5d7U#ObmL`z#aIVhJoiQx!8TRU;6djZWjU>r7abwSXU>U8ed_)uDusRRrOW7=ErA5dH$zsj0q%eQK(&
z&|Xu03)|Fyg}Dx4gJEwYhHxLF1N6fHF&4%t2=@gvRezkB8n8kM4l+&yWgwsdd-Mkg
z4+b>UP~1x}VV%;iaHJU<5l&^8Zkz>52E$>-*`Q|v8fv(4F2Y$1M;MzB&NhAmm}C4D
za3pRq7-|$CzRX~3MmP@;@?cyFIL5dfl(B#&?A|L79tUWuDX^OjRmgCf@pDk7GCbV4
z8uTLoAv4A`fHRD(pd7>SSYsO~$1$9V+YttA=IcQzg4J!pZr%<`32sb4x&RGW(6<0q
z8@B=07&`$M!WK7RMc)m$$ha3NPcwEQd^(`1eqh`W_(S6XP|g4})w#H9VX95I4`8bE
zjYj}4fc0*up8!IBV8KIvV8cUljQ;}tB8HodKY(%xpaC!A(+FS6@N!u9rnlogE{eY>i2Q=WJd=udt8Qx~R1980sE|_ZuIBzMJ6#*iV@1LE}@v-x{9*
z?lC?`%IAzP5#Gn}dE+aDUogG_e9`zP;C|zKq=A@1i+pboG|Yejxdk*;z_bvy%p`<^
zfQCvklM%KV_A(CxrMKA^lw?3d^)dS+d>F&N=0H&T0YbLT!GHtI6u^OID(FMabc9m?
zA<1SY!l{6eVKWQibcUJc2vD-j98iV<8ft_&3gO`lv&}qEMw(+l$zeFk%ttuaEC4+Z
z5Rz<8032gZ0%a`2aVE~oR6fH3b1LZL8BR102Ymv=N#>CVPd29`wh$09Z_Yq?x_KSnVE;T;TbHCsTr1<+Ktnd<;|nlVsr2ZYp_9SGmS@GkQdQ0``U
zuh|LuJ%A?8`%gpoK8C+Be*nt;fQH&_o`LWKfQEX|+=%dR8SXL9Lii!`Y`}-ja{(VQ
zHzCcV3?Dat0?K0y-!OlQ@B#B8#C`y1s!z<#2!G1(GxJhV{>Jd{=H;M&4hVS*T!C=k
zz!rr2FzgrjIVk-Z4h&ok`T&N50@r{(7|>Kh0$UMIVVD}&2Fg%CL!}3vgPM&L$J
zG8ty!q#JU`aCqQm&_^)L3ETpDHp7vD+YlZV*ooL&KvU%f?gTt0a5rF4;9kI4fn9)e
z1NQ@l0uKOI27U`z6L<)4N#GIWJqZx2Vc;>qaNr5R#=u_Cn;5nP{tJ|5Ktr_${(x`{
z&`|3GPb1vH@RY!_plkp%aa#Wz;7W4G2p(y
zUjd&Fdz<0fvKPkY-gdAK?hYHNgT<)&?hl
z(g+CaB{&J;CWb!<79xB>a4O(WgNGybLWUOyj|Al+Kv*on=?GuK@Uq|xP%dY9MetbA
ze+Fo%t-+ZHUkivYZv=}F{uRUPg2f15A1npDAvg!IH!|EF41sbJ!(RvIfxaVH4$94d
z&;!9rgmFR)__ts+;Ag>wfL{j}0e%x)0%%xE0ZnT;AZ|7wS8qUQbt?=wz^VhpT>-!h
zs{t^}iXzQ$KvQK~YXNhtCcu$a3+VaQI)ukDEU;n-kGDDiCs?NdPP94!=US%$&a-}i
z^yStW2$wNjY;6Q(2_Wo7>ny-J>ukV!>s-J!)+WGK>nDKgte+xf8z3wJ>mtC5t<8X&
ztxEwfvo1&M<$zeztt$Ypw6*|lv3?GCy>&HWZvey^ZC!)#O@OA_Zf!;Q*MQ)jwGH7N
zfTp^|x*p+M0Wn9c8xg)85PH?x4)`1EW>D@21fQ*20DouQ2DsPS3HY>iC*bqe-GHxH
z_X56a?LzwZ08RD2bwA(%>j6+c0EGQ%{TAVm0H08!dk0|4j_r+a{it!hlK{u}P6nLV
z`!K-Cz54=A>D?c2T5q~pdPMKRfJgPF8>UD1P6a%scRJv4y)yxi@0|rWtM>@NlHNJk
z2V|%m^;zoTw97M&%$b=pJLiWZAISZ$+&6OnlKW|{%Ih3+=9qKGTs&sWm}|#uA9MSd
zA^8tZethzClY?i{+XM^yG3UQR?3CbKaQ`#Z0_-g*6&yM4f2T7oK3x!dN=oOI*IU&w
zEk0d4c5_|pI4PmLtA>4m@6^eEuzA#vnw44sUjv12LU=g#H6!pZ8~>)lYkdOt56|G{
zE&X?#I+e@oYslaJ`tLyfcd-7OqW`AqzYF!>Mfz`p{)<~6T;5v!cOCx?!Xg#=MFIJ{
zS^vFM|J|bh{#^gvs{cNq|Nd70eMtX(TK|1k|9wvXeO~{4QUA>kN_{Q*@7msiH|f7E
z`frE+dy4*h8vb4xI6LDi{JRAIF2=tL@$Xvvdl3Kj;NL#{`y>914W6B`%6Mw>3kWy%
zK09MQ{yl{-*n3QQOMORUg8lDkAL@OTz8p@^EWwq-|n-W1|Yybhbw3hMVgf
zBW>NM@+F9=S>ag3M^F_Vjg8@zjgjhTb3
zM;bc2ZwWWMzPcSrC~<6JLbmEiW2COVsI4vB=@wNLiFGu#BX3EhI?@&mH%3qGsjI~;
z&8wmf9cV+erFo*48ZC^=T+-PbZi?2$(Goe}^sjhzxXssb6_OUsiL|$)A*Ib7P5#(f
zo$V3sfS;(dxP9uDxe4r%dfZHc7B_}tF_#vqUe{Q>I@(y@J;%E+WL@J#-F1b0HIWVN
zV2to$ez*-o@-LP$v9wV}l8XyBh|C|1$ZKEJI6Qrg~Gv_2eVAyZD}98K(v8-WrG
zetRU26hgDYO`x__3%9%Ap{7<$0rW*?M7PbSw(01qmQ$#b1_+??g;x}+l4u>tOt`Jn
zM^~Y;@Tr}%!*%T~Z9RxI`naJ}%?~$3n^9MHwAHKiLObsg=I()Ab)
zq=_k?9L4h{mcYSKtSl0X)vOLT$E6g(afYK?CQXc&6v;tthF)-+>XzV+0#Y1GasKpN
zVo6JrjLNJI$nGIcXXZmuV>FD(+?_Iv?|>x4G(r1)41}!IK`6T~L87W6>pCK_c0o$p
z+FIIBayw0x%9U%NoZP85za`c_E81L-|0_Lc<&pN)Etra323vK-Mbf)cMfuH%G(*eP
zktDfQgjlWd67;fmGi8r2{#;c>F83fr#>d?Yft2cyNXOO7}b?2_lq2~6fQ~W|)jY$q=HMfPQ
zPTU}g*s^4`u{L&P$eq$IB}5V|a^casn_682H8!!EjDEG{$dqTQly0btw2}~XFTZXy
zE!1EbaOkjx9_DFW3NmQo2sClx2+~6=Nsewz9A-a71Q;q^FFcOYiyz$>i%=Y`I9#_n
z0(&hIzp7P7u|~0F%lWej+8K86T}X^b8Xv1FhIt
zk7eN&(GSJ=Z(JXpMXOt;B(TiCbUDjgO|&Ue-5PH8%d?24*i*csJC+yOQvQUP357@a
z2_>^Ash?8Z5o>RWGstKSC!x@a)oDn`>4Q5g-7YJMvaeN>o2|W-CY4^%~Cv^nCk8zh8dSVcwUu1jxwg}I5(Oc9iHtRhG_}C)y
z6UT#)RW+iWkpYt)>MXuV$u908ft($W}-pY34y5!3u>(R_%o
zUer`kM|%sQ&Q4MmPff*sLd|cBHo>4+AFuWu33V+Vr|F`9^$P#5=tb7s-j2ncZrY%L
zTsaGhXlqveisV$9T+Y_W#6GKY^|pW
zfDU1Ny-{a%=rhMWG4Ky7Gzip1dpyZEB*o#z#+Bi^wOR*ZI9em#zFlb(MURlvA~Z$M
zOHBBL;m}p;1*VJr-y7|sVMC$I^
zW8qf(d7=-${KYnmoRF?ps;3;)7J9HYld5$f^i@2Xzrw8I-hiz@_Bx06H6Q
z!g|WyZL+J*q^${(46C1LJ_+)+gmD~p3yP;YgMv|vi%8sxbcsgAiBgx?M`uvbKxZO*
zo{xA1+NFYoY?LSDV=^$(^as0oU^>mtyN
zBtw-Y7z~NK2}h-rV8|owVkrBSpx>}`RgE@ToV<<((q!-$j+&-eT}xYIbfv29jKK-1
zJEzKF;zaAh*f==ep&FmPO(n$bT!b)DdwqCU6Yl|%(&1Ba)=BJZNYle~a7ijeo+3x~3a8WR1?+oY=34S_Mh}pon}uB+Tn0u!cx`Z7Ak#h!jlz6T^)iky)J;@bdZ4
zP;-4`1CKHhsdu!`ku`5NO2Nm_MAf7Kp&BDwe6x*dKmZfaEc
zSAqQ;lq*(CaXhQqI`%QkKASoutPj%$pHQjFM-&1WTZdh{s*NRX2W#tH=cB6(Ya9Lk
zpW1L2qo|gRyxM4N(duYB?Wdr9Yhk#HuT(nD?%f!g!~tqs$e)}DF5_Z~68cci6PMl>
zSyW#yKIht2Y!@Q%f7N3B;1dXH1o@F`>&PjMATtGdiKy$KAlI%lGg*g;K3A7TbSEs$
zr#X%4JheI}(#|bG@mkVoEOm7{wQ|ZJz1$@~Iv_r3-5`xfi!_3vV>fn!Mwqy;J=zFM
zG!mOADk?_XsFjhnm@2BH(QavTlo2(bWWr@4^TLxAk6v3JmrVMt=O0${HaMBptO(rA
zY+k}O&FUxC(#U5Xvg<2uY>7p%OgC#IofJW|JuU+^rn;pA`!nvj52e2QP~Ic)0upnk
zB4cD(Fr}+eL@h3Bsq>UZC5Ft`n2@*hs|6jAw$9mDzT64ml2~0j@u=*tNvucF!zygiA-0=P6d&ObY@gWEB5maehK?N2(Ww
z1o2fN;hG~7k1xs8sm&PgQ_%QC_{BDYD-9Oy2C&%E%L6W<&vpzFjUY3-&i
zXzr4hIzEylp9&ue`n`!=Ip8I7l!cqCsJVVoxV>(*g4V;x#BGGAMO|n-C*0|bNXi$7
z&xy2qTNXrm2o>i~Dtg?FhgyN+B~hT6D1lI{o8HH>t(yc1ZH}+iS7WGoeal*Kt|->o
zTqktJVRwtj%19?GZHCuJGE_&}ov~8I>;eoHX$JmYKY
zI@)Nh@CeOtXLwjsml5!0jdYrh;v&!}r-We&QJ7}8st&J$yR0En)50|T0Ry={V!3v7
zDtJd+8l@H^L{eboSRZZaz^O$;#9MwOZg#XS#!XanTH0GEgm>PQS>7#V?;&5fOsi%eOX32^2#VRzotvOZGOt^*|6?cr#1Oclcu
zgF6Dmb(lzyC0*t0=mzZWX-K3$)fnp4*x7+1Ns3!Kuw=7i6Q#9wf`62f(p9yzv=cLZ
zt1qMkhZmHfSjJM7qdn9wX1;Kh*WzwC8j5+`r0#OF;&=wfsphB0BDi84_V`%C+@J!T
z?!or-cTKwG_QGjxZGD%$w5O##^DKsqLf4B5(6>a?7BPuZ*Yw@dL~h-b6YCsv6#Cn_
zDZ$n;vpkMML+xmxv+=oaf&YymQhX}Bx-S46?2j+)M28F8<7jrL84Z4GdPs9J36Iz
zI?8;egmDC^$CDbuWn8#Pgw74~`H@((T$3wU6y2p>Zf;i^rNeTTFziIfwi(hW6386z
z;aIGghQkF{DB_0NH?Df1oI&c+HExJg
z79-WZIq2hL92dJ30=H5kZ~T1mb-FgJ?_+UgF2RKA5ZhNWxc#L))Ze!-a(cx@G{Whgb
z6eqRYPnS*^onFcm@)bo~kd+-WS=rIv+TkTu>=gIfObfjaV~#Nwg?H$=FV+ikSG|tK
zb!vW9<^0mBnkBWRWu@h%6*aZFm&A%6Vd_q_nC!F^aN;D&{0c_{t+;b<1=MtBof+1;tZKN@o`>EUT%V
z9V#oux?3?jBvmOV!f6^;ph_xh6cymBTxY7P)KMC*F0H9SyQ|&iR7)MyPA)>HbIPw~
zqGn;JG!9+DaZZV~MI|Lnm{V3cs|eFnhQybLdC5trowJIniP6I0cq&C#S1zn7mL}-}
zYnIF}Eh-BYNgI5`xkVKvWl#sif$9Zi;3x+j&blm!FQBTl8XR^Kvr;LAQgH~?HBd1m
zN>VK3s#t=difTxjj|x#^Y~g&gTUuO#qDxOMYfzMODRfYrD39iEcY}1DNP_rKqN=b|Luc=Jf=yT2W-N*MREU(u$&4
zWu+w?fk_df_B$MOO2SN_u7}XZ%K0^+^3X}(G;G_%!(G`!K}EpJiEClr(&Vg*ev{Fm
zg`f+Z4W2`*ZRm!!9*Zx08FWYur7YWOMOuSx1uR<5l0xdwQySW$NvMNTbyGEw%}Zosjvb@!c927Z^T{?i`c@psH!Ai75oK6#Hl=8LSikb+_JF$ZVLO{#1pH9
zq7%R$=XvlwnqxU=9lAaWhcVrDT8S<*g3S>Iz{R8$a=1^686wD~2rjxdzS9Qw)uJz0
zK%G-eF3Y>s2G2ojYh$N-Zv>Zi;o#?DsnR)(Ei1!~KHlqdT=)?A76?}$Yk{+lP+q3E
zz5=O&1~$g-Xbh6(FV{_4ADQ4ub(3KCyDGXt@;UwPHj?t8b6w-A6Q!*i$#BQbFMqYo
zXs5OVcwwfp#VVx$V-V)rxci^pehgNI|6-`;gdnz%L!%WAZ{LAAhFP-`b?Tcn@JDu_
z39@H|P11(D$>7m!?6t8qYK9qu^%T*3)sLIT?DLgM4eXBQ2?(Xo&P*{%ymnBOuURx(
zuyyvgfm0-sxZS>8haaaboEy1q*17u(ma{Kk`p}gs$DjI=sFPHC
zO1h0>n^aqld?DV+1m-!np(JCtz8+>Xr%`R}`*Km?44uvS?hjF~VfxB
zxZgh9$2RZGUsZ*pv54*b4zw8G-_CBypd(ea5==4l46OcbQx>1OuEM3Oj#xd|MCHf69xxYJV1
z1cyRRkEc-gqOqb?un&~;7n=w?fPo@nwmX(6Pe&Ii!4it2@Y!wQ26{-SN?LI8{O`<3?qwol3k3RVk-c`felB-l6n_U(QBYoXT$co|OAyT!gh)>dK32Tod(_=hG
zq*4AW0uo8xDQjt2+kxFgy}yeM7))uL6zmU|RTjg0Q(anJjXl4+b70O?!%d65MyuXx
z!jKeGKsK4~Nx7zacr%P`q-lp>sakkbB|UA8`AD36w4l10mg?foA1Z+Sx_a8Z0zj!f
zCvqiT1U2zv-dfm_zKy!%Zfu<0*3wiGZgE;mm%nur-I^#V4*MZ<5FEO%u(mQHs_D1t7zIm1j@{kT_g7h&<*&?Uml
z;R=$M)+JG@h22RMrR_FC=WqwiWsayuV5H7zqwL($g;da~l
zC|p-qR8HhuYPjwyH=*b*LX;l%lMp*5FnQw|Wh=p(AlZpDdk4+fTsdzEyVU4-Hu)wT
zJOgrNlQDMhLEFOJ2S<`4>(#P=z#9N-0V;wQO}gN@rlVOd*73;ua1s*aj*sVT9K#{X
zLwDYIUUI;ng9-2usa9AZifk}?9Zc&{+{0t>wk0@0T%)T5c8oL;w?`9$MeW$Ht;92O
zC``U<6RQgo-%)X0l-`aizyDVG9k-%fC=+$by%ti<1u%(2)JvFIx-_DD7{$2_^qNA6
zx*^A<=1Sc}+!nCLaWpG#jx@!q&Q0!B<&uc8ZtjYOWo2=<4v6!$9f@yq_+~;8y){P)
zHXmrYcCLn@NW4K>PZo)fT7^rQxDmlOiSgX0%WEIxp~PG!wTYL1oZ@-J+7>>1gLWXd
zAg%i1q@blszs6|*1B)GmxalHppqhL|;#2gt^L1jB>Y_Ck=PS}?t4rg;C6`O%+WjT@
z5=qfrOVPN~CI5p3p;3`>?-+zk1@}O9_aOLUgYW%=j3wBk`<9tcyEA#<}VXeHqvdqSj54_aNv8jAgM)>@LD=IfD4K&bN%v#N0T}O)hTab
zm@g36ZKSD#G
zb~PNNbqPdw
z!jj%sykznbCiZxTyGwsPDWxz@)0r)wk7`b5TtoHlK8Cl3oG-+jYhPT)j>sm@n#NCM{2X3JUJ
zpl+Ol<>DfofQRtGUnfvoj$_i${IU?8`_=IkKB}`U(%gW}AaqX^pKf7Bk+RohnA5aE
z`R_y1f*2#!hK)9#7`XS!DaN^Dj+nSi@Fh0K$ls2&hN><0k`n4qOXG)Vrw-B@^dT61
zZ4@YdAc3l;O`SU%baXsTCn~BBw~{KB8AeH5iq{N(6MWTcr?8`ZTOD5()*CvlLZ7`e
zF=&8w^sx}$TEU9J6RnkQ18K032?gK<36vEsLAJS(&Yf7N^ce1}(lMLUTWPtQoT8zK
z<+-nurWE4cfmO&&MKwD2C`1G5=O(ZWUE7!h2sorH;bkn>5R2(^!&2wlK5!+=ad)T!
z=j=FdCiPRdmTIFFwYGBB33SHJ$78I39JW9Y;CTulHe4~hPW_aV>vJbPWsIkA>G2hE
z>D`gsCOYeXOh@+#SejI|y9zw{I+jQ-Y
z=HnS=Gg^dpg&m_55)OJDw~jg6NI
zM}>so9e`uCBx8xUT;2j%@99YG67y4dweYD?NkSv%C(1s-R}g2@>b9Qr8;zMC_va?p
zf$|d^Ma?-qM>ZGgvX+bVFuJuQr)_+t2lub4YpNC&*Hl*37FEqz=w3l82~`(Yg~}_6
z5F?j=7S5u}O7iWfhS`l_NOMuelG+nP)uCCTGOXdas*Q_46}U!)-JQ?Og^qQ7Me^v6
z_=4U-7gL{vMm_IJWB$bzMXBO!Xj&NfF&#M?81e3S>gCGWq&w$SY(=nu$u0rkOVTeo
zD_6Pu21p`Z4b|T+>Dn;Ie9^|r5*RBEX>L*V++y6gf;CC+b6Xpuw0^91E&3S{NF19}hy1t0^;$=h&Ury7D;O^+bTI(-D>mqK
zQQdjP3ayG)tlI0~-CT-IbP_-%<3X(dF+_KXsi7007P>8oBju$=k9lc13rF#yqsJ6%
zdE$}BK@z~KZ0|X~0n*`rI?-c6lF(fRdrXHDN$C8ZE0lP=TIsO_u8AJF^q7J~njd|1
zm%Ju;fAtc1Q?0;Hv2szw$C*7rGDL5ql``)|sTu@J3i{lBs@#(Gz
zU!s4lmu?T|h{?dVjBBxg$ON1Y>K&InUS;1PRt(HW{@M|wJi<;wq9K#kBd|94wgTO(
z2G!B@j%|!>y`!w~UM+@axs9F0&?2}{=UbX}1dOM89BsF)O^hN@fkC(0zo6?}&>;1=
z0N-66oB=j>dJ)BC)o2&=R~Vmkbc`UkStsHmAa+TK5qNfvFFf#P(-I?VqIkCNk*R!q
zWRtdARguQ<1`fr%c-+DuuPh}))Jl4{>}z0?c7D{uB&4YfJ?r;IxyBbeF({F1y(l+M
zTrlaWSj80V425x0`ZUq`aD@I805-UiNj|;moRTVBkiuBQx^;F}V#CmWqfHvO
z*155SHQc#A2_eus7H(zy6$y7;Qq8ouVLyT^p7Mr2;aMz>dK4{z^gK2uej}HUzN18!
zrs#}On>n)89!+$jS=8w4E!5DAV@9tCkX*zKP(t#Vc!Y45SHThxAW@P(Aj~=&=(A*Al+GgYTT6JMgJ^9IbbrN0WI*
zw-8yh(L+p(B08>g&ygT_at#uuR9kzDwq+!33)>pw(}Cuc6(0d^%L8n;e^QM;Lw2^t
zZ1m9Ca;zM0PwB*(uL2N-k8fZxQMjf>o?~lCtXWMufhJ20CPbU(2&Vy(dia7joBSjo
z<+xD`_L8=N7nH_Hk^1vr*KMZlfjg$8cYGf$@V#`cgxO*bADn-QD*`>b=wqEJ$oa~M
zl5Vp^pf4T2Tky;q{`gFU^?2
z(Rw&WVRB%F^2a9c>NuX908fw_ND1i+%He%+r=y2=bnt0X)A`l2
zC}WI>z7Zpw&?{J7W0=N(+lsRd=WYg41EX6S%wJ4c*&XU>i)g549NEUJ6ObL9kPv|v
z9PuB+R#I(l+rtQTj&alcc+4uAPlH?9^zrpOoZ^&7tB;~
zddK*J6_v-8ok$WS(nDYNc9b4U)z3!|64Q&M7|e<}FHRtE%(xiZ?v=tMH#hQ#cY-U8
zIbSZ40(r?5!zqlr(q0*S+tz6bzQIg(AH*uAv`mm~Eu$+28I3U&=IR`8Yrq5T(zyXH
z=DuuU4|xr~CxNYNO^aUSIVbKFN7_&_-%*n>i96(=zWZ!F8b*v){2ESa5{S?WP0;e*
z6{}Ksf<^Pt#)AsNWw*%6js|DOFrp(Ch1>95A@VraD+<%P7cXC202;!Lhl1j#JaJ8z
zDx6ZB3i+$5R2)X51NVN3wa)5^l@(SqyDhLKqi%(q8tS~m2Of-i`FOvIt!tbm{?Mr7
zzUK=DP%^%2k6_1uuB_wAm5^j`pV%!#>m5V+T
z=-D3R6_KvQX!pwVQ1-i0c$7YJ1G|e}R}xdg*vHU(#~w!tMXze5fF14HkNY_9^S!_CoO^GGGd;X=E0*dxdHfZhFU5O_pwGomkR2ALK;8hU
z%T`!4<1Lrtim39*0SUl?e?JbYw*u`T&0fG=j0NAnP|KJFQ90Tc4rF+miC&1A@LrUM
z8GElYmi??QOHCOuGxseJb=C;crwJg20~>3o6Tvpz7f{hy
z!TYM!^RUboNU*bt6xX+RR9J+0pp3x!kiQEqlnm+b?SG4?0->y1=qlYv$DXeV*o(th
z@HgXl20cOnQbVxh6H@=Qit|vIc_aV>u$0|`!qFi5BW~TuFrLPxvt^}!6thhgre%s1
zrt?HHSjvV>*k&LgNw%(-Uzm)57y$xq+rXfJcfMNhC||y12MN*?W5y!Nzqc((wyb1F
zZXBV!M_4k{h?fK}bZ}vIc80G<49E~cB%$K>mK8KxGWv{)HlQSm
zy*>ushAm%&n3cEnz~K28V{G#B=@E9D>97u_hix-VGz#
zVXcmEDp66DqB2Ehq_Vq&VG}DZyYQ0#jL2^mLa#Vqf@?c!0)Ri4ap`j{+WT
z>T3Xidsts0E4Y&k4jG~|sw}zr5Qd5hLZizgh!_PHh}HDt-d^tSSvV@1fiHXW-UsCK
zMxodbDeFH?E@Vf~FZ>Lw4^0v|EM-tFzcYd>;1FS=?vusfJBMpZNxo?tF_ZXCI7q~p
zm171b6O`<LM(VQEDPuZD(CUbpK)C_rjN&|L%qotc
zh!TDNxI1T25)LxHVm>B4AX4V%uBpxS#(N7#Yv&NCu_~DEm0iO$;2a}76sQF#Wyf(p
zjem}S^E1h#9Dmz9?vG*|NV%^L9d{t$I^BfuV9z
zi%sHMK&zU@k>D%{?m4gbYSb)k^aSRDfG`idn^H@#`K91|2Zk^%bTA}@hld)_WHjER
zOI#o3XF$YL=y%>kw@UQnff|D65YChMJt`x6u1<|AK)dgKlb|5cQr0PR<8XETGUZfadH-{t7??vTdcQgeG%?UHA;iM6>e;9oZ$hCK5PhBEgG6vikyV`Ez;vs
z=GQ=vBR4*`pxF^Qt3~=)>TIsr$20ZkvD7}O`qZqeqP9iaUJ7j!8+F^>7|huzR8MZO
z9H87)z_?)0ZR{~i{WZylNk@rwFicf4`~AT7Ier-YM5CJgM#-XlPtK;XOC5Pa_?hNk
z9``h!hdsSc&J4;8nwjKEYXB<^vp+Q?WF*-U+y`~8X`wOA{!RNRWYLhl>**8IdIUBk
zB@xYR+8yEAlo|8*#Y-SicL7%{wcfkzF;Vg(qRdtQb_PlUNsms@qOmR1A(vx9%f?5GyFQ0%60q(vi
z0Qn=W1DJzL0gO-hzOiIc5JZxIdVBpAcLop|gklKrcThAFZWN7J{l+omXRQh6KOu0S
z`Z3$|T4Ap+?nUi!5Q2q&O>1q6FR8yaC{CzU!#&IF9^>p(9E3^HLb@7@b>Kc$A4*Hb
z_~P`XM0~m*ld!ytxHEniBt?01RPHR-GLKrD;18l_qKYt8cd9$c)_kIlF?xJmf$P6
zB2sDU8E9)-0W@@qaBV5lx{Wo@29RTM1`NAzA3-J+Jk>mQj-nxw6q_XxFQ5@d$*lA}
zh8&f=!A>a~o=1&2iBeIPSqW;xa3pp5F9hM7MA(#c)u)+8&b6n8;qKo95UDa$1sVir
zI0UG^8?}X1tDGl683+-rDF&i~K@^(JR!Z8Lj|(bD)Qr}tgt4|H$m_fHTH0JwwmQXZ
z(h*s^**C=Yp*M~mfofb4z36Ej=b)0<58)OO{`HB6q^E7tSU83e2cwq^yl~`jQ|09x_iGliG{(VPjf$fogUk)jUuQD@$yI79o|dkl$c{RIwkX
z4)lG|U|aB0LM=S0LYvgO9zCg-PRw%_!(g@`V^~2-jD{I8OgRv-cdEEsWb6;sA3G_8
zk&7ZkoV6f&D`{q1HMGK%Wpx(0(6(b9uiu;PA*|zqeTQ?*`s)6pTQKfl_JcI6Sw;{u
zG)mKpBxBja4maEh8O=H@dGiP6$7YN93C_NLoWS(dkFYIud$Nkc!+I{Pxz($w<%wM1
z;nKG6krHI@KD4TYPsi=YW*c(M1NDIy%pu5v_vV2?%#`LJTdig|E1wAuWf?1G41`K`
z8spJ$X>W^ST`zAtSv3m6>L}vr2!XqezY`0#$Gm}_UUvjNsLt?vp}@7PJW^^PO2<^=
zmhBM3*X;8lRUWm1D=KhCmtE-xf_#{>r3#r8#X;+aqp<5ns-6Smc^vU*M0g07V@
zNEP;jVr#3(TuX#(f=xku2gUzph)A{&Uv*ux=~;-)
zeu&s!h}*sJz@Nn|4?*BQ0l~{0yyyZv(+knu4^95(L3RyBK!QdFJt50*R!1MGnwIZK
zQ%47x*O#`cNhwFwyC6y?#k=4YB|eR}W5SMH%(Mvd0SY46WKrbn2O2Iab*o2Zdg>#~
z%6ng1)Bv-E+K~)n+`s>(0Tq@+%HIk)>#X@;u!fO!)`%Q(L-hn`MF$Z{-q6^K8dkPG
zL(bNQq>C2|i}6P2VlbecIi(=>{Z6B%6t?oJDWQ=mTKf?b>9o{h={Gn&lU4EI>wA+T
ztz&V!BUr9tnzsk3$*i)};agfJBpfyas8$nLt?utYomMKnR?VzdxvAo;R(Z8EtF2k-V{3S3wI#I=
zZdOoB)~u_Z2c?G1ZLD3=6Kiu_zP8<9Zl&ECtOa|29Bru&Bv@Njn`b(@VVnBn)f#3=
zP~f%?m3NS3HBboVRz|y|cFCoL9}SDzc7wTdWBJT#R9zXc5>FSV}wm$^jF^&pv
z`?hMIo;2y@t@EQO_199({xB8QgBIJZmlvX_Z972cN^hK>Ms##Fx*mkhTH?X3ea{L$
z#&K_Tuu#kf(v;q8%@_`q*Oh+J&VH>%jX_4>-S-^^ss`Aj-YF
zpT*(a`06|uPR_$|v0Huo
zh?6n`#x?Uz_ej#P1||9{e$)NgH76=t!jGhI`rGQ1a_9t5G+IT|7{rNhYYa1pLfCy~
z=y!eC(yQhlS{ekC8Mbml*AnW>BFc7>Q~@lc%Y4fH+)7bPu-0P2NPc2_sBbfciIq%1
zE6;`n>h(;rpi<^(srVGG^&_qX}Q*EQX_(7#um6-6*YN9C3|C3Sk_CE
z&%n4g?!O6!eHcoy+c)gg6sHcZ4dUx!h4}JOpZAf?}D3XOQvq^?(5a`bMDctKc
zbWzSOQ&FjNn2a8h*oPszb#pouCDG0mM_XnZ(wi}6;`>x&4YRNZ?Om&s;#*w;oeJq8
z3eOywWzHzZ_D2&*q@cQ}!WxoAnfqGR$+RJ{lD
zW`{gBu*_(l)t)W%x&&qOvN`)}>2YMAV1T%z<2ohSIw7PufzkR*PbY}XOVeBhlI1m@
zDhS~Pv_OZGYav{L!K}XfETFstQR5+;2N6Nu3+K2G_ju1O?z#PS0CxxEt{*9bD7PPR
z=4Xv56aqE5Uek|O{NSzH1?r$F1(Lo3*?G;3%(1~(+_
z!-yo9jxeep#xkd@x~p}l>nm6CZ?rq1a!p-V_NLIVvd*Uj(93v~@m=el);hP*v=Z(9
zzzMyDD=u7(A-4=+Is5>40GzRvl9anB8J;5isVi;Uc_?e0BLi%dv{RFXn%&~OIu!q{nge>_}
z^?{W-z6ztFiyb8GXqxI=j!*fW9HG{{23k~>`wLGh``MQoI+Oxv@i~rvkEDg4Aff!K
zrl_q5oCPU)E97}~nR}|r+=DXR@@o=n;abBPPHsorW}JqSQkQZMN9G%Pgm}Fm79q*;
zhanebnP3}TlKUM^vIpZZE5kHlB=|>Ma8~1JQ>6;=uoOC0O`zdLfo7XxnPZE&uMk;m
znEtSeJRSJrQ`1RVWo;409m*u1qD&fZAP`%W1GP%1$0H22COLeH+9DLCxO}pU=j$1b
zwAb<^n6TG8j@{UUU`j5L?lX@W^IX5oR}EG!pVMF^y2zZgtaRjikwZg?R$iCD=NRq?
zC&Daf4|DILHC*gmIRX&x9fN3F$%djzBW-)YM$89uZzj7_h3Rf|o}*l1T`Z(9=wU7Q
zuX|BV={gufkFt))uQX6ei?m_LTjXy(zC_+8y>XgMjiRXmq|ZujbqJ1@k_Jl%Fe^K(
zb!FuPH6pcv4R;kf~)jj!O9?@5~(v
zR_ci0LRis)y@UBfXpu6llDbmuIGavOZw9u6?lT~HnDs=}4D{kDApBH?XjJQyP*gUW
zzQxONjKNq0=T%K4W?MgIMfOpzMxmuWTkEc--;up&C%m0kEm%@U^^?IqM#8Y|#T*GY
zQit~H>r@5`eHIx61jNR1U#d0C!cTcAw^cXio28a)NQ8ZuGL0CONNOk%WWj-HdsGYL
zNdk{45To*t^^B055u;`rF#sC80fVkZ4aRAR+wiJ}SxE`jFUTR2m=504{GJb{!lc8C
zBGDgBHyuHs&TX~1G=Qk;%`MEMWTBi4)RBH{dZl!zcPddTZ#%}y{VIQqmL<$aKdlxs
zBuZ%HG9C;7M8kZ+kn20PngbGk{a~{jVGCV
zFJVJrV$EyI9#*JObE%N?#hnHQzXw-`^g&7Q8MoW_ivXZ9B+YSee30hC>pjZa{?;?J
z^;lFS#nP5_wyWFp+tJN$Xs5Ri5LTMK&XKI!fsyMo$`owmi0Y@5(U1GrgCOlmFaA1+
zDkMYud@fZl(W)w29}*z2{DMFX@NDJuD*AAPsTiE2sxd0IFA!|yjZ
zISP6zjK!X|rYZV=Wpe8Y1pCzTA{gFy2<0d{xnoM#9HLPLYS_qy0PbwDlvkfP%$=6+
z4uNRY{^ON(4B=3&wIzB%M5J*w99W9(Ev2+sW6O}#{7?ognrEnxnOaSN%DW85DBoz`
zVOK;Am#}ov@RHbA{Xu)rwq)C}c3*HrjKz_FZ4gMTN%yaacvWE6V{`qpv$IzISU^rS
zN6W=v$%?+nc6uQ#+a-F1U9xMV3{-BDW<<1)ZR$1vOfE=4oxuGdAO>!AADN`Bj%VnTDD`KnF(%8)%5DQ*>QOD=!lv}
zZ1XNq4!s}xDLxc}SP!;i?(|`%P$xC}^ayyBdc#9j6j+qdwhD&uto1~x6kL;HV1`On
z&2w61_Gug4_^igex@>g6I0y}h+E5Zh^EOmXIauAZhAaFj`x7H$gvUeDrh
z!+PF*6gbEQ(Qb4Bnln{w$ZMGMbuUw;L)Wz`@ZhPlkw4NQgsqA05F*OmibOrz+hC`I{0msT?mp8h9
zh1|PnPwv}&V6$oisajf+8Ecy%1Jfv>a5-yz`OygP8JYGujL4dz=Ar1;f@Nx3
z647xR*M7K$L(%O=d^u{fHM-SBYG4gy0pe2$#<;IrWm>R(Q2>wDUX=%5ukV#$v3MytPQ4+
zLyvey_}l5xhF8$1Te?=Ks?~j>QCot`ij1=8Qlyd)K}?$THI#3skf`eIB)ZlJ*e-3K
z8y!Q~YBR_8phc^@zb;)JHFqDu-&T)71fTx4I$aFK-_{taQ0#3#w+mslAx@R+u{H)#
zH^HnKG_e!b@3kukyM^@ZTX87PsS|58IE^k!EV6)I$p~+~Dj=OATm5P>2iE`?s{<#l
zB#bnqxgR;EJqR{Vy6g>=mJ%
zcBagt?;)I7R=qj2)E;cx+^Op)T({82>;1s|BdGg5>?WvR!mR5L35J7cgHqVOmQCSp
zHZEQ&xaeS7EFO&e$5#8+Dj98PymQ2?Ac-#U=Ptf#6x3HL<
zqjIgXk>tBdQsK}ufx=pFuowkq|Yd5HX5m>*H^$kKP;b99WoQjc&m
zO*f2y10c=dnr*lYS%&$fDfprrt4j|Gd#OLKt1y)n-Zm=$;OX2}i-pQ!Wn~*$CFOtq
zNq7E#-QThI-~N|>`1k+qFaK_ZN&n{`egBCy_g;A^{pe3FyRYp0-+$BG;q=B<8Jzm{
zv4%3}lk|cs!Ru!Ca!t#POfQb?l~m5|u7E
z(?3C_p&c~bs&f%tJy^i73lsC?XrY;;(`FLkC?QCetC!~Q5xkR(`
zNW3`{Z;mIMJDt*-Xg<@FkHs(m!}}DjCB4gJn!6+^i6mzyI&i;0?F0DFvWEkbj-x>a
zMiIk_>7DHPKoSS{3n}t6N9%qrqh*1E>@UYs2hr9+DT6fQ^x)FziOVsAq2oGxB%Mz<
zJsDhZqCMFolAg&PVIy(Y8kPodjHfd>7IH5WjJZrMoo{l+GPw-eO2`F)oyj>_0NcrG
zK2Pbkd{PTKuG6O
zmROU`NT;*NvUeTMzd~`&eVB(H0HA>XVWRIG4_k0Ih5x5Ce3I80O<70*;PV-0fdw;w2Wu4sH0OY4V(J|4%2)KRd_@w=FG}Kz
z8R8DT;)q^xoZ{hW9tr?#EO#s62;$8WZl`$R{3It>IMpUOob4(EGbC4UPy*;ct(-Hq
zBHzqvxI$`Mz6qpx8Fy|e-kc_xU5+;s{={T1O+2RsVQIyMlTD{Vwamz+Ii7S5mvJ7_
zIRTCP(=<3I-PDBw0Ojh0F|icjv)XarOdG(CeAD#a#V>x(-b#e@6_jJ&rAthDL5Lbh
zfNC{?w^{&Hy2Nx8!4W+p6GxDFi3tO|EMEbClLeiD7P&ZwT$Id#A8`bbQ2ea$#tVe!
zY60>kUZy3r#LEF*%8(Jpl=sU^+7p8!Q0%#H*WfxE2V5o!{jcPd_N*A8OWpX05&k
zSz#3qEsL8}U-%E*XKXH2?zq|2_^Y5aUKoCL)y~G7sUBF-Jlc38;mLeQS5GvtTkKF9
zW52tR7fQst&8^zh0JPhzx6Dg(6i<=W%ZPdmQq_B9<5lgHs|H!W?b@oVHOX26`b?;Y
zZku?@d?#vHv}i_6tN#$^UA4_`#=PmW_>}WV{n1&HsQ(g*M;obZn+v|f=)w98_=aTE
z>k0m-eno3zg)a9UqgG=1mFwkI^-R}I?L50cq?4>p-4gD(UNwJdVo4P!s%#{};YE01V@Yi+fS&D2
z$C4`0*JM95V3!09<(Hs`6p|Iu59$+)4Bk|)(B}Nj@cS|QutWF<*M{=GaFKdwX7}~-
zf=>rmQ54Por4VAUiMw_Es@5ymhv}25{P&L(&0SG2;btC+@kSOlI_3pPPWnE)P*}e@YGh8V|4Ya7J{tJ-w!PuZwOMb8wzo9A+R=
zVD!O$$Bp}jcYez||3VAVA{5II)(MNfR`?`HD}#lYx`$;!W}x`
z5oN^6!*x^47}FHz0gaocCLWSFNX61#9n7qZOpc{5TIjYoJ@8wAiZm{8%Hbp?aSyC*
z7RWLoO?2=I4hJUFCA{id%z=+p)q3R|i+l$rW^n
za0OG-b)Aa;f)sUN1PZe}mcF3HI^Xnr`~W+py+F-8FTNnwX2l!^pMDiSUT^xr2aOD`*U
zUlzE&Nc%hs|IMfyhH+=z_hs}i%S>M6Sa~SDjD!0DFk7MzfFs-C4XTu0V6oNGq&ft+
zAvvrD;L=X{P3J%k)AX*u3^Hd)#!VA&ZqkNc&G}3w%{%>T63l5v4q)0vhe|jXm(87>h$VDpaN!IPXn!kmV*?~Z9E3^A
zMV}8}|HEzq<_SS#c|yQE0n$2-f5tl8w|V$PvfWPvA~?b$qcjAF-Y9T5UW9mJ
ze{g}F9&O@Xu#o_{CnFIRtw$;JkMZUt;qfK>;v^6jOJa&h=16do`F<&^=)S9tDgr-U
zCW*N+n=}6M=IAG@0Pit0Ll{xm5LBF)GvLr0$2lXeaNHSSDfb#72=9^L9#<<`x=bU^JDQDquSN=Hf(hmek@wF!YFt#Wp
zoZaw70h$c2;mu-b?zvw_eD;z}m65G3w!Q?w+#2ya=GWiTS*`>a~
zk@6cZx7_jsWsTsQ+(I8cg+idYv&~&n7Og=+fSzYLAL6^zLULBEL5w4T1sEy=>FEi9
zGl_ahBn|Ccq~v4Kb~$F#7)S{s_acd1B|6ChP3fdS@i*!Gpek`G$j2GomnR6n3j$Hj
zmpF*uWk7$KT$72#GwI<||3tk&#ZZRGaLRWn;=2U#-VIMVr+igfE?*^-F*Zy<<4|2f
z9(MripAY>akKX-J9PJul4lYoQy^0VFw9Ys{G-
z5_8U$6dHJh+y&DFCycbzLBWRDBp}g&Bd$4gCJ{ItIO3Y~|CD9iPi11bL9Y9$baz&|
zTM;xkLkma^EV?&$V0$ioqJ)FBJz;;8n#w8K`tsC}tR$d(SqR)GI7;#5rUkdbaOu@$8L6;SaQ
z%TJ+&MO>saDa`9KtQ&y#r)e3qdj?~2&!kfl%!hGp;(+d%ObQ9#$Axy1u`aFh!2|Li;(ik=HBOr3zPg{Y0L~|TI74B_@wJteqw%p_TkN&3rF!y$znG@^Exrs
zJu^4HnV*=&N0A>wAKv%j8?4FspXPki2DT99FWyDzCCtG&oKBi}Jd?SJ(EFTaU|y}p
z8DL0*dm$#`2V>^(p@~8HPHA$@%>A_y#FHxP5ni
zp*WV`IWwi7mE5sVm>k7NCiU}@3v**w<~4&cGq8Az#}?*MwvjfIz{PQ~)wnv5fpwKa
z0ukxHMSSuM5x*e1zVt@6^j2#s0hdfJlPC)-2=sx)41f#b_A}P+X-UB>fyIs(e=8Oi
zTIH7J@@1@0=p8NP%ibjf{pEBDP(}lnGg4ShV%)M1_p&w!WpugOB+wfM3wrtmGfTgK
z2curx`3&IS-VXKvzqhYQHQ|JO)M{^unWjDblBkh72RO`ZO8d-$=N{6hJAh*b
zatR<9$gBi{PhS9HX=3C$GbD=At3)_1$}iyJ!I){D8!IkM&NoP3O^_W4kyY^=Q+_$zWMX*ca$#~(Kb>mW1wN&`Foh4nkK!}n(x@gF
z^DsEoex|v>IqPcPC+T;#Kl`tL
z?fff!rM3St3qa$ZwNUUYr<^1i9wrFbOBu_N;O-7cYXA&{E)u|f4dI^@;qkU}SQ>)4
z!vdYT>C{$05DnnRc^Wo1EFmfq6y)hMGST5|83xj295YzG#1;HoCSidJb`t*`KwbYk
zbKVsgcoVs}vlDEIOS#!ZbL+S$Dj5#C5;>G3$D(6q9cDv7FUADM%1GfKryh_T850d)
z_qS@g2DebKeCPi~K@8KNB9t;x%n4Fj}_!G~^)U
zg!_Sv2o^#PY4r9#f~}brXugXG^(qL1~Z18REj_);6*{4<`_SE|M=Lc2B!(l50VpR
z1wJTU%EKB*fJP?rASVW>_Az{XqQ1e_>3D#Ap)1nkW7A`EK*jx$-xs&KK|Yq=UHPK_)}B67Pe#hltn;
zFh=QbkO}K22X~M=>{4|vqmhhkar(9Ac{o;h5&Crz*mx+M22^n>j}E5KEBQN&H5HI$BbCYrz=2`cc;L>z$-1piv0)!eVJ
z=cdzhh7gTbKZrgM)fOaD1xSw$t3y%9AXdVvGJVbwIA+O=&Ux9GK
z4gZOJrLG2%k0Brkk&0(>0A%NZ2q4z)muj3#lH~auP
z7jF`z#lnvOT*A2svkjM&Kk!^f3UuA{cC>(dMTk1caXlr|;)R2g?8S$g(QfZQ()(sT
zwUYGGWUny?jG1%_j2QlkRzeEPSZPuy#`zA4F$og+2pKYG$vla>B;E055E^1hJZ!lY
zGZfW84dH&!357s?0v>@z$#lZ#XwBr%V`l;uR%Zt6)P|mIP~b7FP^dFLJU0w)c5Lnd
zgm2^eV|C1|9GRH{_QtGRud>@qw9W^8pC5SCxEg0+w}qpP+xo=V^TU%1z!>(=A#@j~
zSb6idR2z8XD`NT;5rZ(6U<8pVb~7G=Gcr0s5b2v?EqS+T-a|$L9ckJQR&EHHeC~-`
zL{(tQ{rr|x8=`Rt#lc!Rh+kMNa2`7|t)48ReiZ47SOILS!<1*hpr{u2(z;ZJc=8Zd
zPm|LPvl^s9J|JA?8B9?}<|to!4z*h-?j0)@`;RXSH_GE2`ssUtD!P`(CKrkmd!|7q
zfW5NK#LU7RbUVGJslxQa{FrxB92=Pt*NGZ@3IUQrC56E)_viSN3n+oFpqSu)H>rt;
zfPl*5oM@sC`fdcYl+H{mqNB$fcW)$xy*yb|6eFRnc()8DXm_C#>{D`yYl0-JM+SrWEON
z0DInO7h_A@s#FVvK5TfBwh*>+5Z1L%>Vy;h3gK?5{k5H
zUXl~tc!^n1aEY(yz64(n${X_PCHz4}Ayx)0fh*J@*_WRt4#iXh4I!d)mA);d4&;ZP
zTEQev`Mnlyu^4b3f@?tQ4p*MpejV~&WbOq-M^oGyfGM5h_UFv)h(+v#4y7su!5qL=
zdra)Svs)7g$I|~GU_CY1?2F(J5zoP<0LZNmL@>P%cl&e>3okgs9baV-NM2>IJ_9+(
zP%NOxKs5bm%$b)M1uruxZ&$nCiY05yNL&DAXjTzW5Uk}Fw}X=_^l}~Y3(*JY6HJ)n
zKK+QDTRT)qySUp32ab%5A}-$`#n93fv+IV8?(4uV@x<_*=uAYu^a426i?VC8Xr%SW
z%ql358(gN5E`{gN_i5Wf=}&A=ui}D;8Z8t@<_fSOhUaJI8iXgvo>J_p#ZW7iE#ekp
ziG3&r1k{F%gxVQ$Bp7B7cea#>7gw|xfKdEgetu#s-z&>pc`xVg{1du{l)tBY3%+X^
zGxzk(%$}Mnj8Dwx@7c2D{=0FwFF)j09Gp2ee*#u`e%A~d^)wpeGKC$zLwg3h_w^4M
zb9>CJsT-bnwVJ~CFkM30(OKHM*+ykZ+>!acy`~+bpOebu~~XqLlbi|CyKF0{~fol>CeC9
zb>7~E&j$kKH0RmAnYo>llLNzrX){$E!QjTaM<-#g;^+74&<+=%mw%Qaund7^2rNV3
zpA`gR<|d5iR%6`outX){HJ`QVEVmo~Pn}Jeb4`A&b4~Z+<_SE#|16Gtb&>yF1HQmW
zK4gv(7n}a!pYXVzL2O+r+cREVBtLADyQzaeJ8=_3t9+_{7xvS0r#&B)=G!~?gFR_D
z4k4Eh78jAvt@_?~0i?t`O$b_}4L%rP-;-Y3(p9Lv7-nsM@5NI9fPs10JcM-nV6r}D
zjJS*UMw;-ezluvHs@yFZPW(V4|@ZbaP_T4@HHzU~gQXlkY*)1?T{5GFJn|v#bkCUyK&wcpk
zt7Hk|A+rYMiB)}P44=W649sk)eRtyl9KMH!&Af%AS3
z27Ks=kg>Su9UqffIzt~Yd2K!RxBRmVfn^9RLtq&K%Me(Gz%m4uA+QXA|8F4hvxHfJ$f
tG|NBB5Lkx5G6a?(und7^2rNTj83M}?Scbqd1ePJN41r|`{J#l-{{y){_QU`H

diff --git a/Examples/tutorial2/External-bin/IBatisNet.DataMapper.xml b/Examples/tutorial2/External-bin/IBatisNet.DataMapper.xml
deleted file mode 100644
index 8b56091..0000000
--- a/Examples/tutorial2/External-bin/IBatisNet.DataMapper.xml
+++ /dev/null
@@ -1,9476 +0,0 @@
-
-
-    
-        IBatisNet.DataMapper
-    
-    
-        
-            
-            Summary description for BaseTypeHandler.
-            
-        
-        
-            
-            Summary description for ITypeHandler.
-            
-        
-        
-            
-            Gets a column value by the name
-            
-            
-            
-            
-        
-        
-            
-            Gets a column value by the index
-            
-            
-            
-            
-        
-        
-            
-            Retrieve ouput database value of an output parameter
-            
-            ouput database value
-            type used in EnumTypeHandler
-            
-        
-        
-            
-             Sets a parameter on a IDbCommand
-            
-            the parameter
-            the parameter value
-            the dbType of the parameter
-        
-        
-            
-            Converts the String to the type that this handler deals with
-            
-            the tyepe of the property (used only for enum conversion)
-            the String value
-            the converted value
-        
-        
-            
-             Compares two values (that this handler deals with) for equality
-            
-            one of the objects
-            the other object as a String
-            true if they are equal
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            The null value for this type
-            
-        
-        
-            
-            Gets a column value by the name
-            
-            
-            
-            
-        
-        
-            
-            Gets a column value by the index
-            
-            
-            
-            
-        
-        
-            
-            Retrieve ouput database value of an output parameter
-            
-            ouput database value
-            type used in EnumTypeHandler
-            
-        
-        
-            
-            Converts the String to the type that this handler deals with
-            
-            the tyepe of the property (used only for enum conversion)
-            the String value
-            the converted value
-        
-        
-            
-             Sets a parameter on a IDbCommand
-            
-            the parameter
-            the parameter value
-            the dbType of the parameter
-        
-        
-            
-             Compares two values (that this handler deals with) for equality
-            
-            one of the objects
-            the other object as a String
-            true if they are equal
-        
-        
-            
-            The null value for this type
-            
-        
-        
-            
-            
-            
-            
-            
-            
-        
-        
-            
-             implementation when a 'select' attribute exists
-            on a  
-            
-        
-        
-            
-             contract to get the value of an argument constructor.
-            
-        
-        
-            
-            Gets the value of an argument constructor.
-            
-            The current .
-            The result map.
-            The  with the argument infos.
-            The current .
-            The keys
-            The paremeter value.
-        
-        
-            
-            Gets the value of an argument constructor.
-            
-            The current .
-            The result map.
-            The  with the argument infos.
-            The current .
-            The keys
-            The paremeter value.
-        
-        
-            
-            Summary description for ResultMapDeSerializer.
-            
-        
-        
-            
-            Deserialize a ResultMap object
-            
-            
-            
-            
-        
-        
-            
-            Summary description for DynamicDeSerializer.
-            
-        
-        
-            
-            Summary description for IDeSerializer.
-            
-        
-        
-            
-            
-            
-            
-            
-        
-        
-            
-            Constructor
-            
-            
-        
-        
-            
-            Deserialize a Dynamic object
-            
-            
-            
-        
-        
-            
-            Description résumée de SingleTypeHandler.
-            
-        
-        
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            Allows values to be retrieved from the underlying IDataReader.
-            TypeHandlerCallback implementations use this interface to
-            get values that they can subsequently manipulate before
-            having them returned.  																																																														   * or index with these methods.
-            
-            
-            There is no need to implement this.  The implementation
-            will be passed into the TypeHandlerCallback automatically.
-            
-        
-        
-            
-            Returns the underlying IDataReader
-            
-        
-        
-            
-            Get the parameter value
-            
-        
-        
-            
-            Summary description for EnumTypeHandler.
-            
-        
-        
-            
-             Sets a parameter on a IDbCommand
-            
-            the parameter
-            the parameter value
-            the dbType of the parameter
-        
-        
-            
-            
-            
-            
-            
-            
-        
-        
-            
-            Description résumée de ByteArrayTypeHandler.
-            
-        
-        
-            
-            
-            
-            
-            
-            
-        
-        
-            
-             implementation when 
-            a 'resultClass' attribute is specified.
-            
-        
-        
-            
-             contract to process the .
-            
-        
-        
-            
-            Processes the specified .
-            
-            The request.
-            The reader.
-            The result object.
-        
-        
-            
-            Initializes a new instance of the  class.
-            
-        
-        
-            
-            Processes the specified .
-            
-            The request.
-            The reader.
-            The result object.
-        
-        
-            
-            Summary description for SqlText.
-            
-        
-        
-            
-            Summary description for ISqlChild.
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Represent an isEmpty sql tag element.
-            
-        
-        
-            
-            Summary description for BaseTag.
-            
-        
-        
-            
-            SqlTag is a children element of dynamic Sql element.
-            SqlTag represent any binary unary/conditional element (like isEmpty, isNull, iEquall...) 
-            or other element as isParameterPresent, isNotParameterPresent, iterate.
-            
-        
-        
-            
-            Summary description for DynamicParent.
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            Parent tag element
-            
-        
-        
-            
-            Prepend attribute
-            
-        
-        
-            
-            Handler for this sql tag
-            
-        
-        
-            
-            
-            
-        
-        
-            
-            Property attribute
-            
-        
-        
-            
-            Initializes a new instance of the  class.
-            
-            The accessor factory.
-        
-        
-            
-            Summary description for DynamicTag.
-            
-        
-        
-            
-            Initializes a new instance of the  class.
-            
-            The accessor factory.
-        
-        
-            
-            Summary description for IsNotNullDeSerializer.
-            
-        
-        
-            
-            
-            
-            
-        
-        
-            
-            Deserialize a IsNotNull object
-            
-            
-            
-        
-        
-            
-            Summary description for DeleteDeSerializer.
-            
-        
-        
-            
-            Deserialize a TypeHandler object
-            
-            
-            
-            
-        
-        
-            
-            A ParameterSetter implementation
-            
-        
-        
-            
-            Allows parameters to be set on the underlying prepared IDbCommand.
-            TypeHandlerCallback implementations use this interface to
-            process values before they are set on the IDbCommand.
-            
-            
-            There is no need to implement this.  The implementation
-            will be passed into the TypeHandlerCallback automatically.
-            
-        
-        
-            
-            Returns the underlying IDataParameter
-            
-        
-        
-            
-            Get the parameter value
-            
-        
-        
-            
-            Default Constructor
-            
-            
-        
-        
-            
-            Returns the underlying DataParameter
-            
-        
-        
-            
-            Set the parameter value
-            
-        
-        
-            
-            Summary description for SqlMap.
-            
-        
-        
-            
-            Contract for an 
-            
-        
-        
-            
-            Begins the transaction.
-            
-            
-        
-        
-            
-            Begins the transaction.
-            
-            if set to true [open connection].
-            
-        
-        
-            
-            Begins the transaction.
-            
-            The connection string.
-            
-        
-        
-            
-            Begins the transaction.
-            
-            if set to true [open new connection].
-            The isolation level.
-            
-        
-        
-            
-            Begins the transaction.
-            
-            The connection string.
-            if set to true [open new connection].
-            The isolation level.
-            
-        
-        
-            
-            Begins the transaction.
-            
-            The isolation level.
-            
-        
-        
-            
-            Begins the transaction.
-            
-            The connection string.
-            The isolation level.
-            
-        
-        
-            
-            Closes the connection.
-            
-        
-        
-            
-            Commits the transaction.
-            
-            if set to true [close connection].
-        
-        
-            
-            Commits the transaction.
-            
-        
-        
-            
-             Executes a Sql DELETE statement.
-             Delete returns the number of rows effected.
-            
-            The name of the statement to execute.
-            The parameter object.
-            The number of rows effected.
-        
-        
-            
-            Flushes all cached objects that belong to this SqlMap
-            
-        
-        
-            
-            Gets the data cache stats.
-            
-            
-        
-        
-            
-            Gets a MappedStatement by name
-            
-             The id of the statement
-             The MappedStatement
-        
-        
-            
-            Executes a Sql INSERT statement.
-            Insert is a bit different from other update methods, as it
-            provides facilities for returning the primary key of the
-            newly inserted row (rather than the effected rows).  This
-            functionality is of course optional.
-            

- The parameter object is generally used to supply the input - data for the INSERT values. -

- The name of the statement to execute. - The parameter object. - The primary key of the newly inserted row. - This might be automatically generated by the RDBMS, - or selected from a sequence table or other source. - -
- - - Opens the connection. - - - - - - Opens the connection. - - The connection string. - - - - - Alias to QueryForMap, .NET spirit. - Feature idea by Ted Husted. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Alias to QueryForMap, .NET spirit. - Feature idea by Ted Husted. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - - - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An Ilist object used to hold the objects. - A List of result objects. -
- - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - A List of result objects. -
- - - Executes the SQL and retuns all rows selected. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. -
- - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the entire result object. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Runs a query with a custom object that gets a chance to deal - with each row as it is processed. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. -
- - - Executes a Sql SELECT statement that returns a single object of the type of the - resultObject parameter. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An object of the type to be returned. - The single result object populated with the result set data. - - - - Executes a Sql SELECT statement that returns that returns data - to populate a single object instance. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The single result object populated with the result set data. -
- - - Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to - automatically scroll through results from a database table. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL - The maximum number of objects to store in each page - A PaginatedList of beans containing the rows - - - - Runs a query for list with a custom object that gets a chance to deal - with each row as it is processed. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - - A List of result objects. -
- - - Rolls the back transaction. - - - - - Rolls the back transaction. - - if set to true [close connection]. - - - - Executes a Sql UPDATE statement. - Update can also be used for any other update statement type, - such as inserts and deletes. Update returns the number of - rows effected. -

- The parameter object is generally used to supply the input - data for the UPDATE values as well as the WHERE clause parameter(s). -

- The name of the statement to execute. - The parameter object. - The number of rows effected. -
- - - Executes a Sql SELECT statement that returns a single object of the type of the - resultObject parameter. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An object of the type to be returned. - The single result object populated with the result set data. - - - - Executes a Sql SELECT statement that returns that returns data - to populate a single object instance. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The single result object populated with the result set data. -
- - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - A List of result objects. -
- - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An Ilist object used to hold the objects. -
- - - Executes the SQL and retuns all rows selected. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. -
- - - Runs a query for list with a custom object that gets a chance to deal - with each row as it is processed. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - - A List of result objects. -
- - - Gets a value indicating whether this instance is session started. - - - true if this instance is session started; otherwise, false. - - - - - Gets or sets the data source. - - The data source. - - - - Returns the DalSession instance - currently being used by the SqlMap. - - - - - Container session unique for each thread. - - - - - Initializes a new instance of the class. - - The object factory. - The accessor factory. - - - - Configure an SqlMap. - - An xml sql map configuration document. - the SqlMap - - - - Configure an SqlMap from default resource file named SqlMap.config. - - An SqlMap - The file path is relative to the application root. - - - - Configure an SqlMap from via a relative ressource path. - - - A relative ressource path from your Application root - or an absolue file path file:\\c:\dir\a.config - - An SqlMap - - - - Configure and monitor the default configuration file for modifications - and automatically reconfigure SqlMap. - - An SqlMap - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A relative ressource path from your Application root - or a absolue file path file:\\c:\dir\a.config - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - Open a connection - - - - - - Open a connection, on the specified connection string. - - The connection string - - - - Open a connection - - - - - Begins a database transaction. - - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - - - - Begins a database transaction on the currect session - - Open a connection. - - - - Begins a database transaction with the specified isolation level. - - - The isolation level under which the transaction should run. - - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - The transaction isolation level for this connection. - - - - Start a database transaction on the current session - with the specified isolation level. - - Open a connection. - - The isolation level under which the transaction should run. - - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - The connection string - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - Executes a Sql SELECT statement that returns that returns data - to populate a single object instance. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The single result object populated with the result set data. -
- - - Executes a Sql SELECT statement that returns a single object of the type of the - resultObject parameter. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An object of the type to be returned. - The single result object populated with the result set data. - - - - Executes a Sql SELECT statement that returns that returns data - to populate a single object instance. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The single result object populated with the result set data. -
- - - Executes a Sql SELECT statement that returns a single object of the type of the - resultObject parameter. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An object of the type to be returned. - The single result object populated with the result set data. - - - - Alias to QueryForMap, .NET spirit. - Feature idea by Ted Husted. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - - - - Alias to QueryForMap, .NET spirit. - Feature idea by Ted Husted. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the entire result object. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - A List of result objects. -
- - - Executes the SQL and retuns all rows selected. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. -
- - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An Ilist object used to hold the objects. - A List of result objects. -
- - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - A List of result objects. -
- - - Executes the SQL and retuns all rows selected. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. -
- - - Executes a Sql SELECT statement that returns data to populate - a number of result objects. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - An Ilist object used to hold the objects. -
- - - Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to - automatically scroll through results from a database table. - - The name of the sql statement to execute. - The object used to set the parameters in the SQL - The maximum number of objects to store in each page - A PaginatedList of beans containing the rows - - - - Runs a query for list with a custom object that gets a chance to deal - with each row as it is processed. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - - A List of result objects. -
- - - Runs a query for list with a custom object that gets a chance to deal - with each row as it is processed. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - - A List of result objects. -
- - - Runs a query with a custom object that gets a chance to deal - with each row as it is processed. -

- The parameter object is generally used to supply the input - data for the WHERE clause parameter(s) of the SELECT statement. -

- The name of the sql statement to execute. - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. -
- - - Executes a Sql INSERT statement. - Insert is a bit different from other update methods, as it - provides facilities for returning the primary key of the - newly inserted row (rather than the effected rows). This - functionality is of course optional. -

- The parameter object is generally used to supply the input - data for the INSERT values. -

- The name of the statement to execute. - The parameter object. - The primary key of the newly inserted row. - This might be automatically generated by the RDBMS, - or selected from a sequence table or other source. - -
- - - Executes a Sql UPDATE statement. - Update can also be used for any other update statement type, - such as inserts and deletes. Update returns the number of - rows effected. -

- The parameter object is generally used to supply the input - data for the UPDATE values as well as the WHERE clause parameter(s). -

- The name of the statement to execute. - The parameter object. - The number of rows effected. -
- - - Executes a Sql DELETE statement. - Delete returns the number of rows effected. - - The name of the statement to execute. - The parameter object. - The number of rows effected. - - - - Gets a MappedStatement by name - - The id of the statement - The MappedStatement - - - - Adds a (named) MappedStatement. - - The key name - The statement to add - - - - Get a ParameterMap by name - - The name of the ParameterMap - The ParameterMap - - - - Adds a (named) ParameterMap. - - the ParameterMap to add - - - - Gets a ResultMap by name - - The name of the result map - The ResultMap - - - - Adds a (named) ResultMap - - The ResultMap to add - - - - Flushes all cached objects that belong to this SqlMap - - - - - Adds a (named) cache. - - The cache to add - - - - Gets a cache by name - - The name of the cache to get - The cache object - - - - - - - - - - Returns the DalSession instance - currently being used by the SqlMap. - - - - - Gets a value indicating whether this instance is session started. - - - true if this instance is session started; otherwise, false. - - - - - A flag that determines whether cache models were enabled - when this SqlMap was built. - - - - - Factory for DataExchange objects - - - - - The TypeHandlerFactory - - - - - The meta factory for object factory - - - - - The factory which build - - - - - Set the flag to tell us if cache models were enabled - or not. - - - - - The MappedStatements collection - - - - - The ParameterMap collection - - - - - The ResultMap collection - - - - - The DataSource - - - - - A delegate called once per row in the QueryWithRowDelegate method - - The object currently being processed. - The optional parameter object passed into the QueryWithRowDelegate method. - The IList that will be returned to the caller. - - - - A delegate called once per row in the QueryWithRowDelegate method - - The object currently being processed. - The optional parameter object passed into the QueryWithRowDelegate method. - The IList that will be returned to the caller. - - - - A delegate called once per row in the QueryForMapWithRowDelegate method - - - - The optional parameter object passed into the QueryForMapWithRowDelegate method. - The IDictionary that will be returned to the caller. - - - - Contract of an - - - - - Create a new proxy instance. - - The mapped statement. - The param. - The target. - The set accessor. - Returns a new proxy. - - - - Summary description for PaginatedDataList. - - - - - Constructor - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Provides a view of the IList pramaeter - from the specified position - to the specified position . - - The IList elements. - Starting position for the view of elements. - Ending position for the view of elements. - A view of list. - - - The list that is returned is just a view, it is still backed - by the orignal list. Any changes you make to it will be - reflected in the orignal list. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sets the enumerator to its initial position, - which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Gets the current element in the page. - - - - - Factory to get implementation. - - - - - Initializes the class. - - - - - Finds the . - - The . - The - - - - Summary description for ExecuteEventArgs. - - - - - Set or get the statement name - - - - - Summary description for TypeHandlerDeSerializer. - - - - - Deserialize a TypeHandler object - - - - - - - - Summary description for IsNullDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Summary description for IsLessThanDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Summary description for ArgumentProperty. - - - - - Summary description for ResultProperty. - - - - - - - - - - Do not use direclty, only for serialization. - - - - - Initialize the PropertyInfo of the result property. - - - - - - - Initialize a the result property - for AutoMapper - - An . - - - - - - - - - - - - - - - - - - - Clones this instance. - - An - - - - The lazy loader factory - - - - - Sets or gets the used to fill the object property. - - - - - Sets or gets the used to fill the object property. - - - - - Specify the custom type handlers to used. - - Will be an alias to a class wchic implement ITypeHandlerCallback - - - - Tell us if we must lazy load this property.. - - - - - The typeHandler used to work with the result property. - - - - - Give an entry in the 'DbType' enumeration - - - For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... -
- For Oracle, give an OracleType Enumeration : Byte, Int16, Number... -
-
- - - Specify the CLR type of the result. - - - The type attribute is used to explicitly specify the property type of the property to be set. - Normally this can be derived from a property through reflection, but certain mappings such as - HashTable cannot provide the type to the framework. - - - - - The name of the statement to retrieve the property - - - - - The name of a nested ResultMap to set the property - - - - - The property name used to identify the property amongst the others. - - - - - Defines a field/property - - - - - Get the field/property type - - - - - Tell if a nullValue is defined. - - - - - Null value replacement. - - "no_email@provided.com" - - - - A nested ResultMap use to set a property - - - - - Indicate if we have a complex member name as [FavouriteLineItem.Id] - - - - - Column Index - - - - - Column Name - - - - - Do not use direclty, only for serialization. - - - - - Initialize the argument property. - - - - - - - - - - The argument type - - - - - - - Sets or gets the used to fill the object property. - - - - - Specify the constructor argument name. - - - - - Tell us if we must lazy load this property.. - - - - - Get the argument type - - - - - Summary description for ParameterMap. - - - - - Token for xml path to parameter elements. - - - - - Do not use direclty, only for serialization. - - - - - - Get the ParameterProperty at index. - - Index - A ParameterProperty - - - - Get a ParameterProperty by his name. - - The name of the ParameterProperty - A ParameterProperty - - - - Add a ParameterProperty to the ParameterProperty list. - - - - - - Insert a ParameterProperty ine the ParameterProperty list at the specified index.. - - - The zero-based index at which ParameterProperty should be inserted. - - The ParameterProperty to insert. - - - - Retrieve the index for array property - - - - - - - Get all Parameter Property Name - - A string array - - - - Set parameter value, replace the null value if any. - - - - - - - - Set output parameter value. - - - - - - - - Initialize the parameter properties child. - - - - - - - Build the properties - - - - - - Get the parameter properties child for the xmlNode parameter. - - - - - - The parameter class name. - - - - - The parameter type class. - - - - - Identifier used to identify the ParameterMap amongst the others. - - - - - The collection of ParameterProperty - - - - - - - - - - Extend Parametermap attribute - - The id of a ParameterMap - - - - Sets the IDataExchange - - - - - Builds SqlMapper instances from a supplied resource (e.g. XML configuration file) - - - - - - - - - - Default congig name - - - - - Default provider name - - - - - Dot representation - - - - - Token for SqlMapConfig xml root. - - - - - Token for xml path to SqlMapConfig settings element. - - - - - Token for providers config file name. - - - - - Token for xml path to SqlMapConfig providers element. - - - - - Token for xml path to properties elements. - - - - - Token for xml path to property elements. - - - - - Token for xml path to settings add elements. - - - - - Token for xml path to global properties elements. - - - - - Token for xml path to provider elements. - - - - - Token for xml path to database provider elements. - - - - - Token for xml path to database source elements. - - - - - Token for xml path to global type alias elements. - - - - - Token for xml path to global type alias elements. - - - - - Token for xml path to sqlMap elements. - - - - - Token for mapping xml root. - - - - - Token for xml path to type alias elements. - - - - - Token for xml path to resultMap elements. - - - - - Token for xml path to parameterMap elements. - - - - - Token for xml path to statement elements. - - - - - Token for xml path to select elements. - - - - - Token for xml path to insert elements. - - - - - Token for xml path to selectKey elements. - - - - - Token for xml path to update elements. - - - - - Token for xml path to delete elements. - - - - - Token for xml path to procedure elements. - - - - - Token for xml path to cacheModel elements. - - - - - Token for xml path to flushOnExecute elements. - - - - - Token for xml path to search statement elements. - - - - - Token for xml path to search parameterMap elements. - - - - - Token for xml path to search resultMap elements. - - - - - Token for useStatementNamespaces attribute. - - - - - Token for cacheModelsEnabled attribute. - - - - - Token for validateSqlMap attribute. - - - - - Token for useReflectionOptimizer attribute. - - - - - Constructs a DomSqlMapBuilder. - - - - - Constructs a DomSqlMapBuilder - with or without configuration document validation using the - SqlMapConfig schema. - - - Specify whether the configuration Xml document should be - validated with the SqlMapConfig schema. - - - - - Configure a SqlMapper from default resource file named SqlMap.config. - - An SqlMap - The file path is relative to the application root. - - - - Configure an SqlMap. - - An xml sql map configuration document. - the SqlMap - - - - Configure a SqlMapper from a file path. - - - A relative ressource path from your Application root - or a absolue file path file:\\c:\dir\a.config - - An SqlMap - - - - Configure a SqlMapper from a stream. - - A stream resource - An SqlMap - - - - Configure a SqlMapper from a FileInfo. - - A FileInfo resource - An SqlMap - - - - Configure a SqlMapper from an Uri. - - A Uri resource - - - - - Configure and monitor the default configuration file for modifications - and automatically reconfigure SqlMap. - - An SqlMap - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A relative ressource path from your Application root - or an absolue file path file:\\c:\dir\a.config - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - Configure and monitor the configuration file for modifications - and automatically reconfigure SqlMap. - - - A FileInfo to your config file. - - - Delegate called when the file has changed, to rebuild the dal. - - An SqlMap - - - - Callback called when the SqlMap.config changed. - - The state config. - - - - Build a SqlMapper instance - - An xml configuration document - A data source - - - return an a SqlMapper instance - - - - validate againts schema - - The doc to validate - schema File Name - - - - Load statement, parameters, resultmap. - - - - - - - Used by Dao - - - - Load SqlMap configuration from - from the XmlDocument passed in parameter. - - The xml sql map configuration. - - - - - Reset PreparedStatements cache - - - - - Intialize an SqlMap. - - - - - Load and initialize providers from specified file. - - - - - Parse the provider tag. - - A provider object. - - - - Load sqlMap statement. - - - - - Process the Sql Statement - - - - - - Parse dynamic tags - - - - - - - - - - - - Apply inline paremeterMap - - - - - - - Initialize the list of variables defined in the - properties file. - - - - - Generate the command text for CRUD operation - - - - - - - Build a ParameterMap - - - - - Build a ResultMap - - - - - Register under Statement Name or Fully Qualified Statement Name - - An Identity - The new Identity - - - - Gets a resource stream. - - The schema resource key. - A resource stream. - - - - Apply the dataMapper namespace prefix - - - - - - - Apply the provider namespace prefix - - - - - - - Apply the provider namespace prefix - - - - - - - Allow to set properties before configuration - - - - - Allow to set a custom set accessor factory, see - before configuration - - - - - Allow to set a custom get accessor factory, see - before configuration - - - - - Allow to set a custom object factory, see - before configuration - - - - - Enable whether or not the validation of configuration document - before configuration - - - - - TypeAlias. - - - - - Do not use direclty, only for serialization. - - - - - Constructor - - a type. - - - - Initialize the object, - try to idenfify the .Net type class from the corresponding name. - - - - - Name used to identify the typeAlias amongst the others. - - Account - - - - The type class for the typeAlias - - - - - The class name to identify the typeAlias. - - Com.Site.Domain.Product - - - - Description résumée de SByteTypeHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - Hold data during the process of a mapped statement. - - - - - - - - - - Get the error context - - - - - The factory for DataExchange objects - - - - - Initializes a new instance of the class. - - The data exchange factory. - The session. - The statement - - - - Check if the specify object is equal to the current object. - - - - - - - Get the HashCode for this RequestScope - - - - - - Check if the ResultMap is well set, process case of subMap resultMap. - - The current IDataReader - the resultMap to use - - - - Method to get a unique ID - - The new ID - - - - The current . - - - - - Gets the current . - - The statement. - - - - The current . - - - - - The to execute - - - - - Indicate if the statement have find data - - - - - The 'select' result property to process after having process the main properties. - - - - - The used by this request. - - - - - The used by this request. - - - - - The used by this request. - - - - - A factory for DataExchange objects - - - - - Get the request's error context - - - - - An error context to help us create meaningful error messages. - - - - - Clear the error context - - - - - - - - - - - The resource causing the problem - - - - - The activity that was happening when the error happened - - - - - The object ID where the problem happened - - - - - More information about the error - - - - - implementation when - no 'resultClass' attribute is specified. - - - - - Processes the specified - when YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY - - The request. - The reader. - The result object. - - - - All dataq tor retrieve 'select' - - - As ADO.NET allows one open per connection at once, we keep - all the datas to open the next after having closed the current. - - - - - Gets or sets the statement. - - The statement. - - - - Gets or sets the result property. - - The result property. - - - - Gets or sets the target. - - The target. - - - - Gets or sets the keys. - - The keys. - - - - Gets or sets the method. - - The method. - - - - Enumeration of the ExecuteQuery method. - - - - - Execute Query For Object - - - - - Execute Query For IList - - - - - Execute Query For Generic IList - - - - - Execute Query For Array List - - - - - Execute Query For Strong Typed IList - - - - - Summary description for DeleteMappedStatement. - - - - - Summary description for MappedStatement. - - - - - Summary description for IMappedStatement. - - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Execute an update statement. Also used for delete statement. - Return the number of row effected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of row effected. - - - - Execute an insert statement. Fill the parameter object with - the ouput parameters if any, also could return the insert generated key - - The session - The parameter object used to fill the statement. - Can return the insert generated key. - - - - Executes the SQL and and fill a strongly typed collection. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A strongly typed collection of result objects. - - - - Executes the SQL and retuns a subset of the rows selected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. - - - - Executes the SQL and retuns all rows selected. This is exactly the same as - calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A List of result objects. - - - - Executes the SQL and and fill a strongly typed collection. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A strongly typed collection of result objects. - - - - Executes the SQL and retuns a subset of the rows selected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. - - - - Executes the SQL and retuns all rows selected. This is exactly the same as - calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A List of result objects. - - - - Executes an SQL statement that returns a single row as an Object. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Executes an SQL statement that returns a single row as an Object. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - param> - - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - param> - - - - - Event launch on exceute query - - - - - Gets or sets the . - - The . - - - - The IPreparedCommand to use - - - - - Name used to identify the MappedStatement amongst the others. - This the name of the SQL statment by default. - - - - - The SQL statment used by this MappedStatement - - - - - The SqlMap used by this MappedStatement - - - - - Constructor - - An SqlMap - An SQL statement - - - - Retrieve the output parameter and map them on the result object. - This routine is only use is you specified a ParameterMap and some output attribute - or if you use a store procedure with output parameter... - - - The current session. - The result object. - The command sql. - - - - Executes an SQL statement that returns a single row as an Object. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The request scope. - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Executes an SQL statement that returns a single row as an Object. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The request scope. - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Executes the SQL and retuns all rows selected. This is exactly the same as - calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A List of result objects. - - - - Executes the SQL and retuns a subset of the rows selected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. - - - - Executes the SQL and retuns a List of result objects. - - The request scope. - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - - A List of result objects. - - - - Executes the SQL and and fill a strongly typed collection. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A strongly typed collection of result objects. - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - - - - - Executes the SQL and retuns all rows selected. This is exactly the same as - calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A List of result objects. - - - - Executes the SQL and retuns a subset of the rows selected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. - - - - Executes the SQL and retuns a List of result objects. - - The request scope. - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - - A List of result objects. - - - - Executes the SQL and and fill a strongly typed collection. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A strongly typed collection of result objects. - - - - Execute an update statement. Also used for delete statement. - Return the number of row effected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of row effected. - - - - Execute an insert statement. Fill the parameter object with - the ouput parameters if any, also could return the insert generated key - - The session - The parameter object used to fill the statement. - Can return the insert generated key. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The request scope. - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Executes the . - - The current . - - - - Raise an event ExecuteEventArgs - (Used when a query is executed) - - - - - ToString implementation. - - A string that describes the MappedStatement - - - - Event launch on exceute query - - - - - Gets or sets the . - - The . - - - - The IPreparedCommand to use - - - - - Name used to identify the MappedStatement amongst the others. - This the name of the SQL statement by default. - - - - - The SQL statment used by this MappedStatement - - - - - The SqlMap used by this MappedStatement - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - implementation when a 'select' attribute exists - on an and the object property is - different from an or an . - - - - - Gets the value of an argument constructor. - - The current . - The result map. - The with the argument infos. - The current . - The keys - The paremeter value. - - - - Represent a SelectKey tag element. - - - - - Summary description for Statement. - - - - - Summary description for ISql. - - - - - Create an instance of result class. - - An object. - - - - Create an instance of 'IList' class. - - An object which implement IList. - - - - Create an instance of a generic 'IList' class. - - An object which implement IList. - - - - Allow remapping of dynamic SQL - - - - - Identifier used to identify the statement amongst the others. - - - - - The type of the statement (text or procedure). - - - - - Extend statement attribute - - - - - The sql statement to execute. - - - - - The ResultMap used by the statement. - - - - - The parameterMap used by the statement. - - - - - The CacheModel used by this statement. - - - - - The CacheModel name to use. - - - - - The list class type to use for strongly typed collection. - - - - - The result class type to used. - - - - - The parameter class type to used. - - - - - Do not use direclty, only for serialization. - - - - - Initialize an statement for the sqlMap. - - The scope of the configuration - - - - Create an instance of result class. - - An object. - - - - Create an instance of 'IList' class. - - An object which implment IList. - - - - Create an instance of a generic 'IList' class. - - An object which implment IList. - - - - Allow remapping of dynamic SQL - - - - - Extend statement attribute - - - - - The CacheModel name to use. - - - - - Tell us if a cacheModel is attached to this statement. - - - - - The CacheModel used by this statement. - - - - - The list class name to use for strongly typed collection. - - - - - The list class type to use for strongly typed collection. - - - - - The result class name to used. - - - - - The result class type to used. - - - - - The parameter class name to used. - - - - - The parameter class type to used. - - - - - Name used to identify the statement amongst the others. - - - - - The sql statement - - - - - The ResultMap name used by the statement. - - - - - The ParameterMap name used by the statement. - - - - - The ResultMap used by the statement. - - - - - The parameterMap used by the statement. - - - - - The type of the statement (text or procedure) - Default Text. - - Text or StoredProcedure - - - - Do not use direclty, only for serialization. - - - - - - - The scope of the configuration - - - - Extend statement attribute - - - - - The property name object to fill with the key. - - - - - The type of the selectKey tag : 'Pre' or 'Post' - - - - - True if it is a post-generated key. - - - - - Summary description for delete. - - - - - Do not use direclty, only for serialization. - - - - - The Generate tag used by a generated delete statement. - (CRUD operation) - - - - - Summary description for IterateTagHandler. - - - - - Description résumée de BaseTagHandler. - - - - - Summary description for ISqlTagHandler. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - BODY TAG - - - - - - - - - - - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The factory which build - - - - - - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for IsParameterPresentTagHandler. - - - - - Description résumée de ConditionalTagHandler. - - - - - - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Summary description for IsNotPropertyAvailableTagHandler. - - - - - Summary description for IsPropertyAvailableTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Summary description for IsNotParameterPresentTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Summary description for IsEqualTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Summary description for DynamicTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Represent an isEmpty sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for StatementDeSerializer. - - - - - Deserialize a Procedure object - - - - - - - - Summary description for IsNotPropertyAvailableDeSerializer. - - - - - - - - - - - Deserialize a IsNotEmpty object - - - - - - - An implementation of that will copy the contents - of the an open to an in-memory if the - session doesn't allow multiple open with - the same . - - - - - Creates an InMemoryDataReader from a - - The which holds the records from the Database. - - - - Advances the data reader to the next result, when reading the results of batch SQL statements. - - - - - - Closes the IDataReader 0bject. - - - - - Advances the IDataReader to the next record. - - true if there are more rows; otherwise, false. - - - - Returns a DataTable that describes the column metadata of the IDataReader. - - - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - - - - Gets the 32-bit signed integer value of the specified field. - - The zero-based column ordinal. - The value of the column. - - - - Return the value of the specified field. - - The index of the field to find. - The object which will contain the field value upon return. - - - - Return whether the specified field is set to null. - - The zero-based column ordinal. - The value of the column. - - - - Reads a stream of bytes from the specified column offset into the buffer as an array, - starting at the given buffer offset. - - The zero-based column ordinal. - The index within the field from which to begin the read operation. - The buffer into which to read the stream of bytes. - The index for buffer to begin the read operation. - The number of bytes to read. - The actual number of bytes read. - - - - Gets the 8-bit unsigned integer value of the specified column. - - The zero-based column ordinal. - The value of the column. - - - - Gets the Type information corresponding to the type of Object that would be returned from GetValue. - - The zero-based column ordinal. - The value of the column. - - - - Gets the fixed-position numeric value of the specified field. - - The zero-based column ordinal. - The value of the column. - - - - Gets all the attribute fields in the collection for the current record. - - - - - - - Gets the name for the field to find. - - The zero-based column ordinal. - The value of the column. - - - - - - The zero-based column ordinal. - The value of the column. - - - - - - The zero-based column ordinal. - The value of the column. - - - - Gets the value of the specified column as a Boolean. - - The zero-based column ordinal. - The value of the column. - - - - Returns the GUID value of the specified field. - - The zero-based column ordinal. - The value of the column. - - - - Returns the value of the specified column as a DateTime object. - - The zero-based column ordinal. - The value of the column. - - - - Returns the column ordinal, given the name of the column. - - The name of the column. - The value of the column. - - - - Gets the database type information for the specified field. - - The index of the field to find. - The database type information for the specified field. - - - - Returns the value of the specified column as a single-precision floating point number. - - The zero-based column ordinal. - The value of the column. - - - - Gets an IDataReader to be used when the field points to more remote structured data. - - The zero-based column ordinal. - The value of the column. - - - - Reads a stream of characters from the specified column offset into the buffer as an array, - starting at the given buffer offset. - - The zero-based column ordinal. - The index within the row from which to begin the read operation. - The buffer into which to read the stream of bytes. - The index for buffer to begin the read operation. - The number of bytes to read. - The actual number of characters read. - - - - Gets the string value of the specified field. - - The zero-based column ordinal. - The value of the column. - - - - Gets the character value of the specified column. - - The zero-based column ordinal. - The value of the column. - - - - Gets the 16-bit signed integer value of the specified field. - - The zero-based column ordinal. - The value of the column. - - - - Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. - - - - - Gets a value indicating whether the data reader is closed. - - - - - Gets a value indicating the depth of nesting for the current row. - - - - - Gets the column with the specified name. - - - - - Gets the column located at the specified index. - - - - - Indicates the number of fields within the current record. This property is read-only. - - - - - Gets the current result set. - - The current result set. - - - - Represent an in-memory result set - - - - - Creates an in-memory ResultSet from a - - - true if the is already positioned on the record - to start reading from. - - The which holds the records from the Database. - - - - Get a column value in a row - - The row index - The column index - The column value - - - - Gets the type of the field. - - Index of the col. - The type of the field. - - - - Gets the name of the field. - - Index of the col. - The name of the field. - - - - Gets the ordinal. - - Name of the column. - The ordinal of the column - - - - Gets the name of the database type. - - Index of the col. - The name of the database type - - - - Gets the values. - - Index of the row. - The values. - - - - - Gets the number of columns in the current row. - - The number of columns in the current row. - - - - The number of record contained in the ResultSet. - - - - - Summary description for Int32TypeHandler. - - - - - - - - - - - - - Summary description for SessionHolder. - - - See also LocalDataStoreSlot - - - - - Token for SqlMapConfig xml root. - - - - - Constructor - - SqlMapper identifiant - - - - Store the local session on the container. - Ensure that the session is unique for each thread. - - The session to store - - - - Remove the local session from the container. - - - - - Get the local session - - - - - The ConfigurationScope maintains the state of the build process. - - - - - Default constructor - - - - - Resolves the type handler. - - The clazz. - Name of the member. - Type of the CLR. - Type of the db. - if set to true [for setter]. - - - - - XmlNamespaceManager - - - - - Set if the parser should validate the sqlMap documents - - - - - Tells us if the xml configuration file validate the schema - - - - - The current SqlMap namespace. - - - - - The SqlMapper we are building. - - - - - A factory for DataExchange objects - - - - - Tell us if we are in a DataAccess context. - - - - - Tell us if we cache model is enabled. - - - - - External data source - - - - - The current context node we are analizing - - - - - The XML SqlMap config file - - - - - A XML SqlMap file - - - - - Tell us if we use Configuration File Watcher - - - - - Tell us if we use statements namespaces - - - - - Get the request's error context - - - - - List of providers - - - - - List of global properties - - - - - Indicates if we can use reflection optimizer. - - - - - Temporary storage for mapping cache model ids (key is System.String) to statements (value is IList which contains IMappedStatements). - - - - - A singleton class to access the default SqlMapper defined by the SqlMap.Config - - - - - - - - - - - Init the 'default' SqlMapper defined by the SqlMap.Config file. - - - - - Get the instance of the SqlMapper defined by the SqlMap.Config file. - - A SqlMapper initalized via the SqlMap.Config file. - - - - Get the instance of the SqlMapper defined by the SqlMap.Config file. (Convenience form of Instance method.) - - A SqlMapper initalized via the SqlMap.Config file. - - - - implementation when - a 'resultMap' attribute is specified. - - - - - BaseStrategy. - - - - - Fills the object with reader and result map. - - The request. - The reader. - The result map. - The result object. - Indicates if we have found a row. - - - - Processes the specified - when a ResultMap is specified on the statement. - - The request. - The reader. - The result object. - - - - implementation to exceute a query for object. - - - - - contract to excute a 'select' - after the process of the main - - - - - Executes the specified . - - The . - The - - - - Executes the specified . - - The . - The - - - - - - - - - The DataMapperException is thrown when an error in the SqlMapper component occurs. - - - - - Initializes a new instance of the class. - - - This constructor initializes the Message property of the new instance - to a system-supplied message that describes the error. - - - - - Initializes a new instance of the - class with a reference to the inner exception that is the cause of this exception. - - - This constructor initializes the Message property of the new instance - using the message parameter. - - - The exception that is the cause of the current exception. - If the innerException parameter is not a null reference (Nothing in Visual Basic), - the current exception is raised in a catch block that handles the inner exception. - - - - - Initializes a new instance of the - class with a specified error message. - - - This constructor initializes the Message property of the new instance to - the Message property of the passed in exception. - - The message that describes the error. - - - - Initializes a new instance of the - class with a specified error message and a reference to the inner exception - that is the cause of this exception. - - - An exception that is thrown as a direct result of a previous exception should include a reference to the previous - exception in the InnerException property. - The InnerException property returns the same value that is passed into the constructor, or a null reference - (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - - The message that describes the error. - The exception that caused the error - - - - Initializes a new instance of the - class with serialized data. - - - This constructor is called during deserialization to reconstitute the - exception object transmitted over a stream. - - - The that holds the serialized - object data about the exception being thrown. - - - The that contains contextual - information about the source or destination. - - - - - IDataExchange implementation for IList objects - - - - - Summary description for BaseDataExchange. - - - - - Interface for exchanging data between a parameter map/result map and the related objects - - - - - Gets the data to be set into a IDataParameter. - - - - - - - Sets the value to the result property. - - - - - - - - Sets the value to the parameter property. - - Use to set value on output parameter - - - - - - - Constructor - - - - - - Gets the data to be set into a IDataParameter. - - - - - - - Sets the value to the result property. - - - - - - - - Sets the value to the parameter property. - - Use to set value on output parameter - - - - - - - Getter for the factory that created this object - - - - - Cosntructor - - - - - - Gets the data to be set into a IDataParameter. - - - - - - - Sets the value to the result property. - - - - - - - - Sets the value to the parameter property. - - Use to set value on output parameter - - - - - - - Summary description for Select. - - - - - Do not use direclty, only for serialization. - - - - - The Generate tag used by a generated select statement. - (CRUD operation) - - - - - Summary description for IsLessThanTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - IsEmptyTagHandler represent a isEmpty tag element in a dynamic mapped statement. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Represent an iterate sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Conjonction attribute - - - - - Close attribute - - - - - Open attribute - - - - - Summary description for ParameterPropertyDeSerializer. - - - - - Deserialize a ResultMap object - - - - - - - - Summary description for IsEqualDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Summary description for CacheModelDeSerializer. - - - - - Deserialize a CacheModel object - - - - - - - - implementation when - a 'resultClass' attribute is specified and - the type of the result object is primitive. - - - - - Processes the specified - when a ResultClass is specified on the statement and - the ResultClass is a SimpleType. - - The request. - The reader. - The result object. - - - - implementation when a 'select' attribute exists - on an and the object property is - different from an or an . - - - - - Gets the value of an argument constructor. - - The current . - The result map. - The with the argument infos. - The current . - The keys - The paremeter value. - - - - Indicate if the generated key by a selectKey statement - concern a pre or post-generated key. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for StaticSql. - - - - - Summary description for ISql. - - - - - Builds a new and the text to execute. - - - The parameter object (used by DynamicSql/SimpleDynamicSql). - Use to complete the sql statement. - - The current session - The . - A new . - - - - Constructor - - The statement. - - - - - Builds a new and the sql command text to execute. - - The parameter object (used in DynamicSql) - The current session - The . - A new . - - - - Build the PreparedStatement - - - - - - - Represent an isNull sql tag element. - - - - - - - - - - Represent an isNotEmpty sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for IsEmptyDeSerializer. - - - - - - - - - - - Deserialize a IsNotNull object - - - - - - - Summary description for ArgumentPropertyDeSerializer. - - - - - Deserialize a ResultProperty object - - - - - - - - Summary description for ParameterProperty. - - - - - Constructor - - - - - Initializes the parameter property - - The scope. - The parameter class. - - - - Determines whether the specified is equal to the current . - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - - Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - - - A hash code for the current . - - - - - Clones this instance. - - An - - - - Indicate if we have a complex member name as [avouriteLineItem.Id] - - - - - Specify the custom type handlers to used. - - Will be an alias to a class wchic implement ITypeHandlerCallback - - - - Specify the CLR type of the parameter. - - - The type attribute is used to explicitly specify the property type to be read. - Normally this can be derived from a property through reflection, but certain mappings such as - HashTable cannot provide the type to the framework. - - - - - The typeHandler used to work with the parameter. - - - - - Column Name for output parameter - in store proccedure. - - - - - Column size. - - - - - Column Scale. - - - - - Column Precision. - - - - - Give an entry in the 'DbType' enumeration - - - For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... -
- For Oracle, give an OracleType Enumeration : Byte, Int16, Number... -
-
- - - The direction attribute of the XML parameter. - - Input, Output, InputOutput - - - - Indicate the direction of the parameter. - - Input, Output, InputOutput - - - - Property name used to identify the property amongst the others. - - EmailAddress - - - - Tell if a nullValue is defined._nullValue!=null - - - - - Null value replacement. - - "no_email@provided.com" - - - - Defines a field/property get accessor - - - - - Not much of a suprise, this is a factory class for TypeHandler objects. - - - - - Constructor - - - - - Get a TypeHandler for a Type - - the Type you want a TypeHandler for - the handler - - - - Get a TypeHandler for a type - - the type you want a TypeHandler for - the database type - the handler - - - - Get a TypeHandler for a type and a dbType type - - the type - the dbType type - the handler - - - - Register (add) a type handler for a type - - the type - the handler instance - - - - Register (add) a type handler for a type and dbType - - the type - the dbType (optional, if dbType is null the handler will be used for all dbTypes) - the handler instance - - - - When in doubt, get the "unknown" type handler - - if I told you, it would not be unknown, would it? - - - - - - - - - - - Gets a named TypeAlias from the list of available TypeAlias - - The name of the TypeAlias. - The TypeAlias. - - - - Gets the type object from the specific class name. - - The supplied class name. - The correpsonding type. - - - - - Adds a named TypeAlias to the list of available TypeAlias. - - The key name. - The TypeAlias. - - - - Description résumée de TimespanTypeHandler. - - - - - Sets a parameter on a IDbCommand - - the parameter - the parameter value - the dbType of the parameter - - - - - - - - - - - - - - - - - - - - - - - - - - Description résumée de ResultGetterImpl. - - - - - Creates an instance for a IDataReader and column index - - The dataReader - the column index - - - - Creates an instance for a IDataReader and column name - - The dataReader - the column name - - - - Creates an instance for an output parameter - - value of an output parameter (store procedure) - - - - Returns the underlying IDataReader - - Null for an output parameter - - - - Get the parameter value - - - - - - - - - - - - - Description résumée de Int16TypeHandler. - - - - - - - - - - - - - DBNull TypeHandler. - - - - - Custom type handler for adding a TypeHandlerCallback - - - - - Performs processing on a value before it is used to set - the parameter of a IDbCommand. - - - The value to be set - Data base type - - - - /// Implementation of to create proxy for an generic IList element. - - - - - Create a new proxy instance. - - The mapped statement. - The param. - The target. - The set accessor. - Returns a new proxy. - - - - implementation when a 'select' attribute exists - on a - - - - - contract to set value object on . - - - - - Sets value of the specified on the target object. - - The request. - The result map. - The ResultProperty. - The target. - The reader. - The keys - - - - Initializes a new instance of the class. - - The mapping. - The select array strategy. - The select generic list strategy. - The select list strategy. - The select object strategy. - - - - Sets value of the specified on the target object - when a 'select' attribute exists - on the are empties. - - The request. - The result map. - The ResultProperty. - The target. - The reader. - The keys - - - - implementation to exceute a query for . - - - - - Executes the specified . - - The . - The - - - - Summary description for IsGreaterEqualTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Represent an isNotParameterPresent sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for Conditional. - - - - - CompareProperty attribute - - - - - CompareValue attribute - - - - - Summary description for SelectDeSerializer. - - - - - Deserialize a Procedure object - - - - - - - - Summary description for SubMap. - - - - - Constructor - - - - - Discriminator value - - - - - The name of the ResultMap used if the column value is = to the Discriminator Value - - - - - The resultMap used if the column value is = to the Discriminator Value - - - - - Summary description for InlineParameterMapParser. - - - - - Constructor - - - - - Parse Inline ParameterMap - - - - A new sql command text. - - - - - Parse inline parameter with syntax as - #propertyName,type=string,dbype=Varchar,direction=Input,nullValue=N/A,handler=string# - - - - - - - - - Parse inline parameter with syntax as - #propertyName:dbType:nullValue# - - - - - - - - - Resolve TypeHandler - - - - - - - - - - - Summary description for MemoryCacheLevel. - - - - - Constant for weak caching - This cache model is probably the best choice in most cases. It will increase - performance for popular results, but it will absolutely release the memory to - be used in allocating other objects, assuming that the results are not currently - in use. - References an object while still allowing it to be garbage collected. - - - - - Constant for strong caching. - This cache model will guarantee that the results stay in memory until the cache - is explicitly flushed. This is ideal for results that are: - - very small - absolutely static - used very often - - The advantage is that performance will be very good for this particular query. - The disadvantage is that if the memory used by these results is needed, then it - will not be released to make room for other objects (possibly more important - objects). - - - - - - - - - - Creates a new instance of CacheLevel - - The type of the CacheLevel. - - - - - - - - - - - - - - - - Summary description for DefaultPreparedCommand. - - - - - Summary description for IPreparedCommand. - - - - - Create an IDbCommand for the IDalSession and the current SQL Statement - and fill IDbCommand IDataParameter's with the parameterObject. - - - The IDalSession - The IStatement - - The parameter object that will fill the sql parameter - - An IDbCommand with all the IDataParameter filled. - - - - Create an IDbCommand for the IDalSession and the current SQL Statement - and fill IDbCommand IDataParameter's with the parameterObject. - - - The IDalSession - The IStatement - - The parameter object that will fill the sql parameter - - An IDbCommand with all the IDataParameter filled. - - - - Applies the parameter map. - - The session. - The command. - The request. - The statement. - The parameter object. - - - - - - - - - - - - Default implementation of the interceptor reponsible of load the lazy element - Could load collections and single objects - - - - - Static Constructor for a lazy list loader - - - - - Constructor for a lazy list loader - - The mapped statement used to build the list - The parameter object used to build the list - The proxified member accessor. - The target object which contains the property proxydied. - - - - Intercepts the specified invocation. - - The invocation. - The target arguments. - - - - - Implementation of to create proxy for an element. - - - - - Create a new proxy instance. - - The mapped statement. - The param. - The target. - The set accessor. - Returns a new proxy. - - - - implementation when a 'select' attribute exists - on a - - - - - Sets value of the specified on the target object - when a 'select' attribute exists and fills an Array property - on the are empties. - - The request. - The result map. - The ResultProperty. - The target. - The - The keys - - - - implementation to exceute a query generic list. - - - - - Executes the specified . - - The . - The - - - - DataExchange implementation for IDictionary objects - - - - - Cosntructor - - - - - - Gets the data to be set into a IDataParameter. - - - - - - - Sets the value to the result property. - - - - - - - - Sets the value to the parameter property. - - Use to set value on output parameter - - - - - - - A IDataExchange implemtation for working with .NET object - - - - - Cosntructor - - - - - - Gets the data to be set into a IDataParameter. - - - - - - - Sets the value to the result property. - - - - - - - - Sets the value to the parameter property. - - Use to set value on output parameter - - - - - - - Represent a generate tag element. - The generation would happen at the point where the - SqlMapClient instance is built. - - - - - Do not use direclty, only for serialization. - - - - - The table name used to build the SQL query. - - - Will be used to get the metadata to build the SQL if needed. - - - - - The by attribute is used to generate the where clause. - - The by="" attribute can support multiple colums. - - < delete ...> - <generate table="EMPLOYEE" by="EMPLOYEE_ID, LAST_MOD_DATE" /> - </delete> - - - - - Summary description for IsGreaterThanTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Represent an isLessEqual sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for IsGreaterThanDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Summary description for FlushInterval. - - - - - Calcul the flush interval value in ticks - - - - - Flush interval in hours - - - - - Flush interval in minutes - - - - - Flush interval in seconds - - - - - Flush interval in milliseconds - - - - - Get the flush interval value - - - - - Summary description for FifoCacheController. - - - - - Summary description for ICacheController. - - - - - Remove an object from a cache model - - the key to the object - the removed object(?) - - - - Clears all elements from the cache. - - - - - Configures the CacheController - - - - - - Adds an item with the specified key and value into cached data. - Gets a cached object with the specified key. - - The cached object or null - - - - - - - - - Remove an object from a cache model - - the key to the object - the removed object(?) - - - - Clears all elements from the cache. - - - - - Configures the cache - - - - - Adds an item with the specified key and value into cached data. - Gets a cached object with the specified key. - - The cached object or null - - - - Description résumée de CharTypeHandler. - - - - - - - - - - - - - implementation when - a 'resultClass' attribute is specified and - the type of the result object is . - - - - - Processes the specified - when a ResultClass is specified on the statement and - the ResultClass is . - - The request. - The reader. - The result object. - - - - implementation when a 'resultMapping' attribute exists - on a . - - - - - Sets value of the specified on the target object - when a 'resultMapping' attribute exists - on the . - - The request. - The result map. - The ResultProperty. - The target. - The reader. - The keys - - - - implementation to exceute a query for - strong typed list. - - - - - Executes the specified . - - The . - The - - - - Summary description for ProcedureSql. - - - - - Constructor - - The statement. - - - - - - Builds a new and the sql command text to execute. - - The parameter object (used in DynamicSql) - The current session - The . - A new . - - - - Build the PreparedStatement - - - - - - - - Summary description for IterateContext. - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp01212002.asp - http://www.microsoft.com/mspress/books/sampchap/6173.asp - http://www.dur.ac.uk/barry.cornelius/java/a.taste.of.csharp/onefile/ - - - - - Constructor - - - - - - Sets the enumerator to its initial position, - which is before the first element in the collection. - - - - - Advances the enumerator to the next element of the collection. - - - True if the enumerator was successfully advanced to the next element; - False if the enumerator has passed the end of the collection. - - - - - Removes from the underlying collection the last element returned by the iterator. - - - - - Gets the current element in the collection. - - - - - Gets the index of the current element in the collection. - - - - - Return true if the current element is the first. - - - - - Return true if the current element is the last. - - - - - Returns true if the iteration has more elements. (In other words, returns true - if next would return an element rather than throwing an exception.) - - - - - Summary description for IsLessEqualTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Summary description for SubMapDeSerializer. - - - - - Deserialize a ResultMap object - - - - - - - - Summary description for IterateSerializer. - - - - - - - - - - - Deserialize a Iterate object - - - - - - - Summary description for DeSerializerFactory. - - - - - Constructor - - - - - - - - - - - - - A ResultProperty Collection. - - - - - Constructs a ResultPropertyCollection. The list is initially empty and has a capacity - of zero. Upon adding the first element to the list the capacity is - increased to 8, and then increased in multiples of two as required. - - - - - Constructs a ResultPropertyCollection with a given initial capacity. - The list is initially empty, but will have room for the given number of elements - before any reallocations are required. - - The initial capacity of the list - - - - Add an ResultProperty - - - Index - - - - Add a list of ResultProperty to the collection - - - - - - Add a list of ResultProperty to the collection - - - - - - Indicate if a ResultProperty is in the collection - - A ResultProperty - True fi is in - - - - Insert a ResultProperty in the collection. - - Index where to insert. - A ResultProperty - - - - Remove a ResultProperty of the collection. - - - - - Removes a ResultProperty at the given index. The size of the list is - decreased by one. - - - - - - Ensures that the capacity of this collection is at least the given minimum - value. If the currect capacity of the list is less than min, the - capacity is increased to twice the current capacity. - - - - - - ead-only property describing how many elements are in the Collection. - - - - - Length of the collection - - - - - Sets or Gets the ResultProperty at the given index. - - - - - - - - - - - - - - - - - - - - - Description résumée de Int64TypeHandler. - - - - - - - - - - - - - Summary description for SqlMapSession. - - - - - - - - - - - Changes the vote to commit (true) or to abort (false) in transsaction - - - - - Holds value of connection - - - - - Holds value of transaction - - - - - Complete (commit) a transaction - - - Use in 'using' syntax. - - - - - Open the connection - - - - - Open a connection, on the specified connection string. - - The connection string - - - - Close the connection - - - - - Begins a database transaction. - - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - - - - Begins a database transaction - - Open a connection. - - - - Begins a database transaction with the specified isolation level. - - - The isolation level under which the transaction should run. - - - - - Open a connection and begin a transaction on the specified connection string. - - The connection string - The transaction isolation level for this connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - Open a connection. - - - - Begins a transaction on the current connection - with the specified IsolationLevel value. - - The transaction isolation level for this connection. - The connection string - Open a connection. - - - - Commits the database transaction. - - - Will close the connection. - - - - - Commits the database transaction. - - Close the connection - - - - Rolls back a transaction from a pending state. - - - Will close the connection. - - - - - Rolls back a transaction from a pending state. - - Close the connection - - - - Create a command object - - - - - - - Create an IDataParameter - - An IDataParameter. - - - - - - - - - - - - - - - - - Releasing, or resetting resources. - - - - - - - - - - - - - - - - - - - - - - - - - Changes the vote for transaction to commit (true) or to abort (false). - - - - - implementation used when implicit 'ResultMap'. - - - - - Auto-map the reader to the result object. - - The request. - The reader. - The result object. - - - - Processes the specified - when ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. - - The request. - The reader. - The result object. - - - - Build a dynamic instance of a ResultMap - - - - - Initializes a new instance of the class. - - The data exchange factory. - The reader. - The result object. - - - - AutoMap the the to the result object. - - The reader. - The result object. - - - - DataExchange implementation for "primitive" objects. - - - The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, - UInt32, Int64, UInt64, Char, Double, and Single + string, Guid, Decimal, DateTime - - - - - Cosntructor - - - - - - Gets the data to be set into a IDataParameter. - - - - - - - Sets the value to the result property. - - - - - - - - Sets the value to the parameter property. - - Use to set value on output parameter - - - - - - - Summary description for PreparedStatementFactory. - - - - - Constructor - - - - - - - - - Create a list of IDataParameter for the statement and build the sql string. - - - - - For store procedure, auto discover IDataParameters for stored procedures at run-time. - - The current session. - - - - Create IDataParameters for command text statement. - - - - - Create IDataParameters for procedure statement. - - - - - Parse sql command text. - - - - - Summary description for SimpleDynamicSql. - - - - - Initializes a new instance of the class. - - The scope. - The SQL statement. - The statement. - - - - - - - - - - - - - - - - - - - - - - - - - Builds a new and the sql command text to execute. - - The parameter object (used in DynamicSql) - The current session - The . - A new . - - - - Build the PreparedStatement - - - - - - - - Represent an isParameterPresent sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Represent an isLessThan sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for CacheModel. - - - - - Constant to turn off periodic cache flushes - - - - - This is used to represent null objects that are returned from the cache so - that they can be cached, too. - - - - - Constructor - - - - - - - - - - Event listener - - A MappedStatement on which we listen ExecuteEventArgs event. - - - - FlushHandler which clear the cache - - - - - - - Clears all elements from the cache. - - - - - Add a property - - The name of the property - The value of the property - - - - - - - - - - - Identifier used to identify the CacheModel amongst the others. - - - - - Cache controller implementation name. - - - - - Set the cache controller - - - - - Set or get the flushInterval (in Ticks) - - - - - Specifie how the cache content should be returned. - If true a deep copy is returned. - - - Combinaison - IsReadOnly=true/IsSerializable=false : Returned instance of cached object - IsReadOnly=false/IsSerializable=true : Returned coopy of cached object - - - - - Determines if the cache will be used as a read-only cache. - Tells the cache model that is allowed to pass back a reference to the object - existing in the cache. - - - The IsReadOnly properties works in conjonction with the IsSerializable propertie. - - - - - Adds an item with the specified key and value into cached data. - Gets a cached object with the specified key. - - The cached object or null - - A side effect of this method is that is may clear the cache - if it has not been cleared in the flushInterval. - - - - - - - - - - For which don't support M.A.R.S, wraps the current - in an . - - - - - Creates a DataReaderAdapter from a - - The which holds the records from the Database. - The databse provider - - - - Implementation of TypeHandler for dealing with unknown types - - - - - Constructor to create via a factory - - the factory to associate this with - - - - Performs processing on a value before it is used to set - the parameter of a IDbCommand. - - - The value to be set - Data base type - - - - Compares two values (that this handler deals with) for equality - - one of the objects - the other object as a String - true if they are equal - - - - implementation when a 'select' attribute exists - on a - - - - - Sets value of the specified on the target object - when a 'select' attribute exists and fills an property - on the are empties. - - The request. - The result map. - The ResultProperty. - The target. - The current - The keys - - - - Factory to get implementation. - - - - - Initializes the class. - - - - - Finds the . - - The . - The - - - - Factory for DataExchange objects - - - - - Initializes a new instance of the class. - - The type handler factory. - The object factory. - The accessor factory. - - - - Get a DataExchange object for the passed in Class - - The class to get a DataExchange object for - The IDataExchange object - - - - Determines whether [is implement generic Ilist interface] [the specified type]. - - The type. - - true if [is implement generic I list interface] [the specified type]; otherwise, false. - - - - - Getter for the type handler factory - - - - - The factory for object - - - - - The factory which build - - - - - Summary description for Update. - - - - - Do not use direclty, only for serialization. - - - - - The Generate tag used by a generated update statement. - (CRUD operation) - - - - - Summary description for SqlTagContext. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for IsNullTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Summary description for IsLessEqualDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Summary description for InsertDeSerializer. - - - - - Deserialize a TypeHandler object - - - - - - - - A simple interface for implementing custom type handlers. -

- Using this interface, you can implement a type handler that - will perform customized processing before parameters are set - on a IDbCommand and after values are retrieved from - a IDataReader. Using a custom type handler you can extend - the framework to handle types that are not supported, or - handle supported types in a different way. For example, - you might use a custom type handler to implement proprietary - BLOB support (e.g. Oracle), or you might use it to handle - booleans using "Y" and "N" instead of the more typical 0/1. -

-
- - - Performs processing on a value before it is used to set - the parameter of a IDbCommand. - - The interface for setting the value on the IDbCommand. - The value to be set - - - - Performs processing on a value before after it has been retrieved - from a IDataReader. - - The interface for getting the value from the IDataReader. - The processed value. - - - - Casts the string representation of a value into a type recognized by - this type handler. This method is used to translate nullValue values - into types that can be appropriately compared. If your custom type handler - cannot support nullValues, or if there is no reasonable string representation - for this type (e.g. File type), you can simply return the String representation - as it was passed in. It is not recommended to return null, unless null was passed - in. - - - - - - - The null value for this type - - - - - Summary description for SelectMappedStatement. - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - Factory to get implementation. - - - - - Initializes the class. - - - - - Finds the . - - The statement. - The - - - - implementation when a 'select' attribute exists - on a - - - - - Gets the value of an argument constructor. - - The current . - The result map. - The with the argument infos. - The current . - The keys - The paremeter value. - - - - Summary description for SqlGenerator. - - - - - Creates SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an select SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an insert SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an update SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Creates an delete SQL command text for a specified statement - - The statement to build the SQL command text. - The SQL command text for the statement. - - - - Construct the list of IDataParameters for the statement - and prepare the sql - - - - - The list of IDataParameter name used by the PreparedSql. - - - - - The list of IDataParameter to use for the PreparedSql. - - - - - The prepared statement. - - - - - Represent an insert statement. - - - - - Do not use direclty, only for serialization. - - - - - Extend statement attribute - - - - - The selectKey statement used by an insert statement. - - - - - The Generate tag used by a generated insert statement. - (CRUD operation) - - - - - Summary description for IsNotEqualTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Represent an isGreaterEqual sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for UpdateDeSerializer. - - - - - Deserialize a Procedure object - - - - - - - - Summary description for IsGreaterEqualDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Summary description for ResultMap. - - - - - Token for xml path to result elements. - - - - - Token for xml path to result elements. - - - - - Token for xml path to discriminator elements. - - - - - Token for xml path to subMap elements. - - - - - Token for xml path to argument constructor elements. - - - - - Do not use direclty, only for serialization. - - - - - Initialize the resultMap from an xmlNode.. - - - - - - Get the result properties and the subMap properties. - - - - - - Finds the constructor that takes the parameters. - - The to find the constructor in. - The parameters name to use to find the appropriate constructor. - - An that can be used to create the type with - the specified parameters. - - - Thrown when no constructor with the correct signature can be found. - - - - - Create an instance Of result. - - - An array of values that matches the number, order and type - of the parameters for this constructor. - - An object. - - - - Add a ResultProperty to the list of ResultProperty. - - The property to add. - - - - Set the value of an object property. - - The object to set the property. - The result property to use. - The database value to set. - - - - - - - - - - - The sqlMap namespace - - - - - The discriminator used to choose the good SubMap - - - - - The collection of ResultProperty. - - - - - The collection of constructor parameters. - - - - - Identifier used to identify the resultMap amongst the others. - - GetProduct - - - - Extend ResultMap attribute - - - - - The output type class of the resultMap. - - - - - The output class name of the resultMap. - - Com.Site.Domain.Product - - - - Sets the IDataExchange - - - - - Hash value generator for cache keys - - - - - Default constructor - - - - - Constructor that supplies an initial hashcode - - the hashcode to use - - - - Constructor that supplies an initial hashcode and multiplier - - the hashcode to use - the multiplier to use - - - - Updates this object with new information based on an object - - the object - the cachekey - - - - - - - - - - - Get the HashCode for this CacheKey - - - - - - ToString implementation. - - A string that give the CacheKey HashCode. - - - - Boolean TypeHandler. - - - - - - - - - - - - - This class is responsible of create lazy load proxies for a concrete class with virtual method. - - - - - constructor - - - - - Builds the specified lazy load proxy for a concrete class with virtual method. - - The mapped statement used to build the lazy loaded object. - The parameter object used to build lazy loaded object. - The target object which contains the property proxydied.. - The proxified member accessor. - Return a proxy object - - - - Gets the type returned by statemet. - - The mapped statement. - if set to true [is Ilist]. - The type object return by the statement. - - - - Gets instance. - - - - - Initializes a new instance of the class. - - - - - Register (add) a lazy load Proxy for a type and member type - - The target type which contains the member proxyfied - The member name the proxy must emulate - The . - - - - Get a ILazyLoadProxy for a type, member name - - The target type which contains the member proxyfied - Return the ILazyLoadProxy instance - - - - Summary description for UpdateMappedStatement. - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - - - - - - - - - - - - - - - - - - implementation when a 'select' attribute exists - on an and the object property is - different from an or an . - - - - - Sets value of the specified on the target object - when a 'select' attribute exists and fills an object property. - on the are empties. - - The request. - The result map. - The ResultProperty. - The target. - The current - The keys - - - - implementation to exceute a query for list. - - - - - Executes the specified . - - The . - The - - - - Summary description for InsertMappedStatement. - - - - - Constructor - - An SqlMap - An SQL statement - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - - - - - - - - - - - - - - - - - - Represent an isEqual sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - DynamicSql represent the root element of a dynamic sql statement - - - ... - - - - - Initializes a new instance of the class. - - The config scope. - The statement. - - - - - - - - - - Builds a new and the text to execute. - - The parameter object (used in DynamicSql) - The current session - The . - A new . - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Summary description for IsNotParameterPresentDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - - - - - - - - - - - - - - - - - Description résumée de ByteTypeHandler. - - - - - - - - - - - - - A lazy generic list - - - - - - Initializes a new instance of the class. - - The mapped satement. - The param. - The target. - The set accessor. - - - - Resolve the lazy loading. - - Name of the method. - - - - Determines the index of a specific item in the . - - The object to locate in the . - - The index of item if found in the list; otherwise, -1. - - - - - Inserts an item to the at the specified index. - - The zero-based index at which item should be inserted. - The object to insert into the . - The is read-only. - index is not a valid index in the . - - - - Removes the item at the specified index. - - The zero-based index of the item to remove. - The is read-only. - index is not a valid index in the . - - - - Adds an item to the . - - The object to add to the . - The is read-only. - - - - Removes all items from the . - - The is read-only. - - - - Determines whether the contains a specific value. - - The object to locate in the . - - true if item is found in the ; otherwise, false. - - - - - Copies the elements of the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in array at which copying begins. - arrayIndex is less than 0. - array is null. - array is multidimensional.-or-arrayIndex is equal to or greater than the length of array.-or-The number of elements in the source is greater than the available space from arrayIndex to the end of the destination array.-or-Type T cannot be cast automatically to the type of the destination array. - - - - Removes the first occurrence of a specific object from the . - - The object to remove from the . - - true if item was successfully removed from the ; otherwise, false. This method also returns false if item is not found in the original . - - The is read-only. - - - - Returns an enumerator that iterates through the collection. - - - A that can be used to iterate through the collection. - - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - - - - Adds an item to the . - - The to add to the . - - The position into which the new element was inserted. - - The is read-only.-or- The has a fixed size. - - - - Removes all items from the . - - The is read-only. - - - - Determines whether the contains a specific value. - - The to locate in the . - - true if the is found in the ; otherwise, false. - - - - - Determines the index of a specific item in the . - - The to locate in the . - - The index of value if found in the list; otherwise, -1. - - - - - Inserts an item to the at the specified index. - - The zero-based index at which value should be inserted. - The to insert into the . - index is not a valid index in the . - The is read-only.-or- The has a fixed size. - value is null reference in the . - - - - Removes the first occurrence of a specific object from the . - - The to remove from the . - The is read-only.-or- The has a fixed size. - - - - Removes the item at the specified index. - - The zero-based index of the item to remove. - The is read-only. - index is not a valid index in the . - - - - Copies the elements of the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in array at which copying begins. - array is null. - index is less than zero. - array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source is greater than the available space from index to the end of the destination array. - The type of the source cannot be cast automatically to the type of the destination array. - - - - Gets or sets the at the specified index. - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - Gets a value indicating whether the is read-only. - - - true if the is read-only; otherwise, false. - - - - Gets a value indicating whether the has a fixed size. - - - true if the has a fixed size; otherwise, false. - - - - Gets a value indicating whether the is read-only. - - - true if the is read-only; otherwise, false. - - - - Gets or sets the at the specified index. - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - Gets a value indicating whether access to the is synchronized (thread safe). - - - true if access to the is synchronized (thread safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - implementation when no 'select' or - 'resultMapping' attribute exists on a . - - - - - Sets value of the specified on the target object - when the 'select' and 'resultMap' attributes - on the are empties. - - The request. - The result map. - The ResultProperty. - The target. - The reader. - The keys - - - - Summary description for CachingStatement. - - - - - Constructor - - - - - - Executes the SQL and retuns all rows selected in a map that is keyed on the property named - in the keyProperty parameter. The value at each key will be the value of the property specified - in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Execute an update statement. Also used for delete statement. - Return the number of row effected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of row effected. - - - - Execute an insert statement. Fill the parameter object with - the ouput parameters if any, also could return the insert generated key - - The session - The parameter object used to fill the statement. - Can return the insert generated key. - - - - Executes the SQL and and fill a strongly typed collection. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A strongly typed collection of result objects. - - - - Executes the SQL and retuns a subset of the rows selected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. - - - - Executes the SQL and retuns all rows selected. This is exactly the same as - calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A List of result objects. - - - - Executes the SQL and and fill a strongly typed collection. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A strongly typed collection of result objects. - - - - Executes the SQL and retuns a subset of the rows selected. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The number of rows to skip over. - The maximum number of rows to return. - A List of result objects. - - - - Executes the SQL and retuns all rows selected. This is exactly the same as - calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). - - The session used to execute the statement. - The object used to set the parameters in the SQL. - A List of result objects. - - - - Executes an SQL statement that returns a single row as an Object. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Executes an SQL statement that returns a single row as an Object. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The object - - - - Executes an SQL statement that returns a single row as an Object of the type of - the resultObject passed in as a parameter. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - The result object. - The object - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement. - The object used to set the parameters in the SQL. - - - - - Runs a query with a custom object that gets a chance - to deal with each row as it is processed. - - The session used to execute the statement - The object used to set the parameters in the SQL. - The property of the result object to be used as the key. - The property of the result object to be used as the value (or null) - - A hashtable of object containing the rows keyed by keyProperty. - If a transaction is not in progress, or the database throws an exception. - - - - Gets a percentage of successful cache hits achieved - - The percentage of hits (0-1), or -1 if cache is disabled. - - - - Gets the cache key. - - The request. - the cache key - - - - Event launch on exceute query - - - - - Gets or sets the . - - The . - - - - The IPreparedCommand to use - - - - - Name used to identify the MappedStatement amongst the others. - This the name of the SQL statment by default. - - - - - The SQL statment used by this MappedStatement - - - - - The SqlMap used by this MappedStatement - - - - - implementation when a 'resultMapping' attribute exists - on a . - - - - - Gets the value of an argument constructor. - - The current . - The result map. - The with the argument infos. - The current . - The keys - The paremeter value. - - - - implementation when no 'select' or - 'resultMapping' attribute exists on a . - - - - - Gets the value of an argument constructor. - - The current . - The result map. - The with the argument infos. - The current . - The keys - The paremeter value. - - - - Summary description for IsNotEmptyTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Represent an isGreaterThan sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - A ParameterProperty Collection. - - - - - Constructs a ParameterProperty collection. The list is initially empty and has a capacity - of zero. Upon adding the first element to the list the capacity is - increased to 8, and then increased in multiples of two as required. - - - - - Constructs a ParameterPropertyCollection with a given initial capacity. - The list is initially empty, but will have room for the given number of elements - before any reallocations are required. - - The initial capacity of the list - - - - Add an ParameterProperty - - - Index - - - - Add a list of ParameterProperty to the collection - - - - - - Add a list of ParameterProperty to the collection - - - - - - Indicate if a ParameterProperty is in the collection - - A ParameterProperty - True fi is in - - - - Insert a ParameterProperty in the collection. - - Index where to insert. - A ParameterProperty - - - - Remove a ParameterProperty of the collection. - - - - - Removes a ParameterProperty at the given index. The size of the list is - decreased by one. - - - - - - Ensures that the capacity of this collection is at least the given minimum - value. If the currect capacity of the list is less than min, the - capacity is increased to twice the current capacity. - - - - - - Read-only property describing how many elements are in the Collection. - - - - - Length of the collection - - - - - Sets or Gets the ParameterProperty at the given index. - - - - - Summary description for MemoryCacheControler. - - - - - Constructor - - - - - Remove an object from a cache model - - the key to the object - the removed object(?) - - - - Clears all elements from the cache. - - - - - Configures the cache - - - - - Adds an item with the specified key and value into cached data. - Gets a cached object with the specified key. - - The cached object or null - - - - Class to implement a strong (permanent) reference. - - - - - Gets the object (the target) referenced by this instance. - - - - - - - - - - - - - Summary description for Int32TypeHandler. - - - - - - - - - - - - - implementation when - a 'resultClass' attribute is specified and - the type of the result object is . - - - - - Processes the specified - when a 'resultClass' attribute is specified on the statement and - the 'resultClass' attribute is a . - - The request. - The reader. - The result object. - - - - implementation when a 'select' attribute exists - on a - - - - - Sets value of the specified on the target object - when a 'select' attribute exists and fills an property - on the are empties. - - The request. - The result map. - The ResultProperty. - The target. - The current - The keys - - - - Represent a store Procedure. - - - - - Do not use direclty, only for serialization. - - - - - - - The scope of the configuration - - - - The type of the statement StoredProcedure. - - - - - Extend statement attribute - - - - - Summary description for IsNotNullTagHandler. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - - - - - - - - - - Represent an isNotNull sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Represent an isNotEqual sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for TypeAliasDeSerializer. - - - - - Deserialize a TypeAlias object - - - - - - - - Summary description for ProcedureDeSerializer. - - - - - Deserialize a Procedure object - - - - - - - - Summary description for ParameterMapDeSerializer. - - - - - Deserialize a ParameterMap object - - - - - - - - Summary description for IsParameterPresentDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Summary description for IsNotEqualDeSerializer. - - - - - - - - - - - Deserialize a Dynamic object - - - - - - - Description résumée de Double. - - - - - - - - - - - - - A lazy list - - - - - Resolve the lazy loading. - - Name of the method. - - - - Initializes a new instance of the class. - - The mapped satement. - The param. - The target. - The set accessor. - - - - Adds an item to the . - - The to add to the . - - The position into which the new element was inserted. - - The is read-only.-or- The has a fixed size. - - - - Removes all items from the . - - The is read-only. - - - - Determines whether the contains a specific value. - - The to locate in the . - - true if the is found in the ; otherwise, false. - - - - - Determines the index of a specific item in the . - - The to locate in the . - - The index of value if found in the list; otherwise, -1. - - - - - Inserts an item to the at the specified index. - - The zero-based index at which value should be inserted. - The to insert into the . - index is not a valid index in the . - The is read-only.-or- The has a fixed size. - value is null reference in the . - - - - Removes the first occurrence of a specific object from the . - - The to remove from the . - The is read-only.-or- The has a fixed size. - - - - Removes the item at the specified index. - - The zero-based index of the item to remove. - index is not a valid index in the . - The is read-only.-or- The has a fixed size. - - - - Copies the elements of the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in array at which copying begins. - array is null. - index is less than zero. - array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source is greater than the available space from index to the end of the destination array. - The type of the source cannot be cast automatically to the type of the destination array. - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - - - - Gets a value indicating whether the has a fixed size. - - - true if the has a fixed size; otherwise, false. - - - - Gets a value indicating whether the is read-only. - - - true if the is read-only; otherwise, false. - - - - Gets or sets the at the specified index. - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - Gets a value indicating whether access to the is synchronized (thread safe). - - - true if access to the is synchronized (thread safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - Represent an isPropertyAvailable sql tag element. - - - - - Initializes a new instance of the class. - - The accessor factory. - - - - Summary description for ResultPropertyDeSerializer. - - - - - Deserialize a ResultProperty object - - - - - - - - Summary description for IsPropertyAvailableDeSerializer. - - - - - - - - - - - Deserialize a IsNotEmpty object - - - - - - - Summary description for IsNotEmptyDeSerializer. - - - - - - - - - - - Deserialize a IsNotEmpty object - - - - - - - Summary description for DiscriminatorDeSerializer. - - - - - Deserialize a ResultMap object - - - - - - - - Summary description for Discriminator. - - - - - (discriminatorValue (string), ResultMap) - - - - - The subMaps name who used this discriminator - - - - - Constructor - - - - - Initilaize the underlying mapping - - - - - - - Initialize the Discriminator - - - - - - Add a subMap that the discrimator must treat - - A subMap - - - - Find the SubMap to use. - - the discriminator value - The find ResultMap - - - - Specify the custom type handlers to used. - - Will be an alias to a class wchic implement ITypeHandlerCallback - - - - Give an entry in the 'DbType' enumeration - - - For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... -
- For Oracle, give an OracleType Enumeration : Byte, Int16, Number... -
-
- - - Specify the CLR type of the result. - - - The type attribute is used to explicitly specify the property type of the property to be set. - Normally this can be derived from a property through reflection, but certain mappings such as - HashTable cannot provide the type to the framework. - - - - - Column Index - - - - - Column Name - - - - - Null value replacement. - - "no_email@provided.com" - - - - Th underlying ResultProperty - - - - - Summary description for LruCacheController. - - - - - - - - - - Remove an object from a cache model - - the key to the object - the removed object(?) - - - - Clears all elements from the cache. - - - - - Configures the cache - - - - - Adds an item with the specified key and value into cached data. - Gets a cached object with the specified key. - - The cached object or null - - - - Description résumée de ObjectTypeHandler. - - - - - - - - - - - - - - - - - - - - - Description résumée de GuidTypeHandler. - - - - - - - - - - - - - DecimalTypeHandler. - - - - - - - - - - - - - Description résumée de DateTimeTypeHandler. - - - - - - - - - - - - - Factory to get implementation. - - - - - Initializes the class. - - - - - Gets the . - - The . - The - - - - implementation when a 'select' attribute exists - on a - - - - - Initializes a new instance of the class. - - The mapping. - The select array strategy. - The select generic list strategy. - The select list strategy. - The select object strategy. - - - - Gets the value of an argument constructor. - - The current . - The result map. - The with the argument infos. - The current . - The keys - The paremeter value. - - - - IDataExchange implementation for .NET object - - - - - Cosntructor - - - - - - - Gets the data to be set into a IDataParameter. - - - - - - - Sets the value to the result property. - - - - - - - - Sets the value to the parameter property. - - Use to set value on output parameter - - - - - - - Summary description for TypeHandler. - - - - - Do not use direclty, only for serialization. - - - - - Initialize the object, - try to idenfify the .Net type class from the corresponding name. - - - - - CLR type - - - - - The type class for the TypeName - - - - - dbType name - - - - - callback alias name - - - - - Summary description for PreparedCommandFactory. - - - - - Get an IPreparedCommand. - - - - - - Summary description for IPreparedCommandProxy. - - - - - Constructor for a connection proxy - - The connection which been proxified. - - - - Static constructor - - The connection which been proxified. - A proxy - - - - - - - - - -
-
diff --git a/Examples/tutorial2/Files/Blogs.mdb b/Examples/tutorial2/Files/Blogs.mdb deleted file mode 100644 index 9089724aa5a8a861727efc78a429fdfbe4e773a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 241664 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 diff --git a/Examples/tutorial2/Files/Maps/Access/Author.xml b/Examples/tutorial2/Files/Maps/Access/Author.xml deleted file mode 100644 index b0937fc..0000000 --- a/Examples/tutorial2/Files/Maps/Access/Author.xml +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO [Authors] ( - [Name], - [Login], - [Password] - ) VALUES ( - #Name#, - #Login#, - #Password# - ) - - - select @@IDENTITY - - - - - UPDATE [Authors] SET - [Name] = #Name#, - [Login] = #Login#, - [Password] = #Password# - WHERE - ([ID] = #Id#) - - - - DELETE FROM [Authors] - WHERE - ([ID] = #Id#) - - - \ No newline at end of file diff --git a/Examples/tutorial2/Files/Maps/Access/Blog.xml b/Examples/tutorial2/Files/Maps/Access/Blog.xml deleted file mode 100644 index 2fb19d1..0000000 --- a/Examples/tutorial2/Files/Maps/Access/Blog.xml +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - INSERT INTO [Blogs] ( - [UserId], - [Name], - [Description] - ) VALUES ( - #Author.Id#, - #Name#, - #Description# - ) - - - select @@IDENTITY - - - - - - UPDATE [Blogs] SET - [Name] = #Name#, - [Description] = #Description# - WHERE - ([ID] = #Id#) - - - - - DELETE FROM [Blogs] - WHERE - ([ID] = #Id#) - - - \ No newline at end of file diff --git a/Examples/tutorial2/Files/Maps/Access/Post.xml b/Examples/tutorial2/Files/Maps/Access/Post.xml deleted file mode 100644 index 9ec145a..0000000 --- a/Examples/tutorial2/Files/Maps/Access/Post.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - INSERT INTO [Posts] ( - [BlogID], - [Title], - [Content], - [Date] - ) VALUES ( - #Blog.Id#, - #Title#, - #Content#, - #Date:Date# - ) - - - select @@IDENTITY - - - - - - UPDATE [Posts] SET - [Title] = #Title#, - [Content] = #Content#, - [Date] = #Date:Date# - WHERE - ([ID] = #Id#) - - - - DELETE FROM [Posts] - WHERE - ([ID] = #Id#) - - - \ No newline at end of file diff --git a/Examples/tutorial2/Files/dao.config b/Examples/tutorial2/Files/dao.config deleted file mode 100644 index de1e75f..0000000 --- a/Examples/tutorial2/Files/dao.config +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Files/properties.config b/Examples/tutorial2/Files/properties.config deleted file mode 100644 index 4fd9702..0000000 --- a/Examples/tutorial2/Files/properties.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/Examples/tutorial2/Files/providers.config b/Examples/tutorial2/Files/providers.config deleted file mode 100644 index 8162c35..0000000 --- a/Examples/tutorial2/Files/providers.config +++ /dev/null @@ -1,277 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/tutorial2/Files/sqlMap.config b/Examples/tutorial2/Files/sqlMap.config deleted file mode 100644 index 913ceb2..0000000 --- a/Examples/tutorial2/Files/sqlMap.config +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Examples/tutorial2/Tutorial2.Application/BlogPresenter.cs b/Examples/tutorial2/Tutorial2.Application/BlogPresenter.cs deleted file mode 100644 index a61132d..0000000 --- a/Examples/tutorial2/Tutorial2.Application/BlogPresenter.cs +++ /dev/null @@ -1,72 +0,0 @@ -using System.ComponentModel; -using Tutorial2.Domain; -using Tutorial2.Service; - -namespace Tutorial2.Application -{ - public class BlogPresenter - { - private readonly IBlogService _service = null; - private readonly IBlogView _view = null; - - - /// - /// Initializes a new instance of the class. - /// - /// The view. - /// The service. - /// - /// Use "Dependency Injection" to attach the dependencies for the view and service. - /// - public BlogPresenter(IBlogView view, IBlogService service) - { - _view = view; - _service = service; - } - - /// - /// Check for User. - /// - /// The login. - /// The password. - public void Verify(string login, string password) - { - _view.Author = _service.Verify(login, password); - } - - - - /// - /// Creates the blog. - /// - /// The name. - /// The description. - public void CreateBlog(string name, string description) - { - Blog blog = new Blog(); - blog.Name = name; - blog.Description = description; - - _service.SaveBlog(blog); - - _view.Blog = blog; - } - - /// - /// Creates the post. - /// - /// The title. - /// The text. - public void CreatePost(string title, string text) - { - Post post = new Post(); - post.Title = title; - post.Content = text; - post.Blog = _view.Blog; - - _service.SavePost(post); - - _view.Blog.Posts.Add(post); - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Application/IBlogView.cs b/Examples/tutorial2/Tutorial2.Application/IBlogView.cs deleted file mode 100644 index 1cb2540..0000000 --- a/Examples/tutorial2/Tutorial2.Application/IBlogView.cs +++ /dev/null @@ -1,18 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Text; -using Tutorial2.Domain; - -namespace Tutorial2.Application -{ - public interface IBlogView - { - Author Author { set; get;} - - Blog Blog { set; get;} - - BindingList Posts { set; get;} - - } -} diff --git a/Examples/tutorial2/Tutorial2.Application/Properties/AssemblyInfo.cs b/Examples/tutorial2/Tutorial2.Application/Properties/AssemblyInfo.cs deleted file mode 100644 index d54ee75..0000000 --- a/Examples/tutorial2/Tutorial2.Application/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Tutorial2.Application")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("NoName.Org")] -[assembly: AssemblyProduct("Tutorial2.Application")] -[assembly: AssemblyCopyright("Copyright © NoName.Org 2006")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("76dfe974-7748-4bbf-8460-da19486e098e")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Examples/tutorial2/Tutorial2.Application/Tutorial2.Application.csproj b/Examples/tutorial2/Tutorial2.Application/Tutorial2.Application.csproj deleted file mode 100644 index 7c871a9..0000000 --- a/Examples/tutorial2/Tutorial2.Application/Tutorial2.Application.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {063AA034-BD5A-4792-8539-C0A066D7E4FD} - Library - Properties - Tutorial2.Application - Tutorial2.Application - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - {8F74B099-C14F-4DE8-8F3F-30846C931EA8} - Tutorial2.Domain - - - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320} - Tutorial2.Service - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.Domain/Author.cs b/Examples/tutorial2/Tutorial2.Domain/Author.cs deleted file mode 100644 index 13e7ea6..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/Author.cs +++ /dev/null @@ -1,43 +0,0 @@ -namespace Tutorial2.Domain -{ - public class Author : EntityBase - { - private string _name = string.Empty; - private string _login = string.Empty; - private string _password = string.Empty; - private Blog _blog = null; - - public Author() - { - } - - public Author(string name) - { - _name = name; - } - - public string Name - { - get { return _name; } - set { _name = value; } - } - - public Blog Blog - { - get { return _blog; } - set { _blog = value; } - } - - public string Login - { - get { return _login; } - set { _login = value; } - } - - public string Password - { - get { return _password; } - set { _password = value; } - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Domain/Blog.cs b/Examples/tutorial2/Tutorial2.Domain/Blog.cs deleted file mode 100644 index 2407413..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/Blog.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Tutorial2.Domain -{ - public class Blog : EntityBase - { - private string _name = string.Empty; - protected string _description = string.Empty; - private Author _author = null; - private IList _posts = new List(); - - public string Name - { - get { return _name; } - set { _name = value; } - } - - public string Description - { - get { return _description; } - set { _description = value; } - } - - public Author Author - { - get { return _author; } - set { _author = value; } - } - - public IList Posts - { - get { return _posts; } - set { _posts = value; } - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Domain/Comment.cs b/Examples/tutorial2/Tutorial2.Domain/Comment.cs deleted file mode 100644 index aca1045..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/Comment.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace Tutorial2.Domain -{ - public class Comment : EntityBase - { - private string _text = string.Empty; - - public string Text - { - get { return _text; } - set { _text = value; } - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Domain/DomainDiagram.cd b/Examples/tutorial2/Tutorial2.Domain/DomainDiagram.cd deleted file mode 100644 index 499fa40..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/DomainDiagram.cd +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - EntityBase.cs - AAACAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - - - Blog.cs - AAABIAAAAAAgAAQEBAAAAAQAAAAAAIAAAAAAAAAAAAA= - - - - - - - - - - - - - - - Post.cs - AAAIAAAAEoAAAEABBAAAAAAAAAAAAAABAAAAAAAIIAA= - - - - - - - - - - - - User.cs - AAQAIAAAAAAAAAAAAAAAAAQAAEAAAAACAAAQIAAIAAA= - - - - - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.Domain/EntityBase.cs b/Examples/tutorial2/Tutorial2.Domain/EntityBase.cs deleted file mode 100644 index 89519ad..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/EntityBase.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Tutorial2.Domain -{ - public abstract class EntityBase - { - protected System.Nullable _id = null; - - public System.Nullable Id - { - get { return _id; } - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Domain/Post.cs b/Examples/tutorial2/Tutorial2.Domain/Post.cs deleted file mode 100644 index e4569c8..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/Post.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Tutorial2.Domain -{ - public class Post : EntityBase - { - private IList _comments = new List(); - private string _title = string.Empty; - private string _content = string.Empty; - private Blog _blog = null; - private DateTime _date = DateTime.Now; - - public IList Comments - { - get { return _comments; } - set { _comments = value; } - } - - public string Title - { - get { return _title; } - set { _title = value; } - } - - public string Content - { - get { return _content; } - set { _content = value; } - } - - public Blog Blog - { - get { return _blog; } - set { _blog = value; } - } - - public DateTime Date - { - get { return _date; } - set { _date = value; } - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Domain/Properties/AssemblyInfo.cs b/Examples/tutorial2/Tutorial2.Domain/Properties/AssemblyInfo.cs deleted file mode 100644 index ba91062..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Tutorial2.Domain")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("NoName.Org")] -[assembly: AssemblyProduct("Tutorial2.Domain")] -[assembly: AssemblyCopyright("Copyright © NoName.Org 2006")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a5f7d6cd-8452-4dae-8e3b-46810ddd51c9")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Examples/tutorial2/Tutorial2.Domain/Tutorial2.Domain.csproj b/Examples/tutorial2/Tutorial2.Domain/Tutorial2.Domain.csproj deleted file mode 100644 index 5175f99..0000000 --- a/Examples/tutorial2/Tutorial2.Domain/Tutorial2.Domain.csproj +++ /dev/null @@ -1,54 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {8F74B099-C14F-4DE8-8F3F-30846C931EA8} - Library - Properties - Tutorial2.Domain - Tutorial2.Domain - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.Service/BlogService.cs b/Examples/tutorial2/Tutorial2.Service/BlogService.cs deleted file mode 100644 index 9aed7f5..0000000 --- a/Examples/tutorial2/Tutorial2.Service/BlogService.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System; -using System.Collections; -using IBatisNet.DataMapper; -using Tutorial2.Domain; - -namespace Tutorial2.Service -{ - public class BlogService : IBlogService - { - private ISqlMapper _mapper = null; - - - - /// - /// Initializes a new instance of the class. - /// - /// The mapper. - public BlogService(ISqlMapper mapper) - { - _mapper = mapper; - } - - #region IBlogService Members - - /// - /// Check for Author. - /// - /// The login. - /// The password. - /// - public Author Verify(string login, string password) - { - Hashtable map = new Hashtable(); - map.Add("Login", login); - map.Add("Password", password); - - return _mapper.QueryForObject("Author-Verify", map); ; - } - - /// - /// Saves the blog. - /// - /// The blog. - public void SaveBlog(Blog blog) - { - } - - /// - /// Saves the post. - /// - /// The post. - public void SavePost(Post post) - { - _mapper.Insert("Post-Insert", post); - } - #endregion - } -} diff --git a/Examples/tutorial2/Tutorial2.Service/IBlogService.cs b/Examples/tutorial2/Tutorial2.Service/IBlogService.cs deleted file mode 100644 index f9b5e1d..0000000 --- a/Examples/tutorial2/Tutorial2.Service/IBlogService.cs +++ /dev/null @@ -1,28 +0,0 @@ -using Tutorial2.Domain; - -namespace Tutorial2.Service -{ - public interface IBlogService - { - - /// - /// Check for Author. - /// - /// The login. - /// The password. - /// - Author Verify(string login, string password); - - /// - /// Saves the blog. - /// - /// The blog. - void SaveBlog(Blog blog); - - /// - /// Saves the post. - /// - /// The post. - void SavePost(Post post); - } -} diff --git a/Examples/tutorial2/Tutorial2.Service/Properties/AssemblyInfo.cs b/Examples/tutorial2/Tutorial2.Service/Properties/AssemblyInfo.cs deleted file mode 100644 index a305caa..0000000 --- a/Examples/tutorial2/Tutorial2.Service/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Tutorial2.Service")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("NoName.Org")] -[assembly: AssemblyProduct("Tutorial2.Service")] -[assembly: AssemblyCopyright("Copyright © NoName.Org 2006")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("b436368b-9666-405c-9e65-eff946663908")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Examples/tutorial2/Tutorial2.Service/Tutorial2.Service.csproj b/Examples/tutorial2/Tutorial2.Service/Tutorial2.Service.csproj deleted file mode 100644 index b0c9f87..0000000 --- a/Examples/tutorial2/Tutorial2.Service/Tutorial2.Service.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320} - Library - Properties - Tutorial2.Service - Tutorial2.Service - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\External-bin\IBatisNet.DataMapper.dll - - - - - - - - - - - - - {8F74B099-C14F-4DE8-8F3F-30846C931EA8} - Tutorial2.Domain - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.Test/App.config b/Examples/tutorial2/Tutorial2.Test/App.config deleted file mode 100644 index c48e295..0000000 --- a/Examples/tutorial2/Tutorial2.Test/App.config +++ /dev/null @@ -1,27 +0,0 @@ - - - - -
- - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.Test/ManualMock/BlogServiceMock.cs b/Examples/tutorial2/Tutorial2.Test/ManualMock/BlogServiceMock.cs deleted file mode 100644 index 4c3f3ef..0000000 --- a/Examples/tutorial2/Tutorial2.Test/ManualMock/BlogServiceMock.cs +++ /dev/null @@ -1,55 +0,0 @@ -using Tutorial2.Domain; -using Tutorial2.Service; - -namespace Tutorial2.Test -{ - public class BlogServiceMock : IBlogService - { - #region IBlogService Members - - /// - /// Check for Author. - /// - /// The login. - /// The password. - /// - public Author Verify(string login, string password) - { - Author author = new Author("Gilles"); - author.Login = "ibatis"; - author.Password = "rock"; - - Blog blog = new Blog(); - blog.Name = "iBATIS Blog"; - - Post post = new Post(); - post.Title = "iBATSI Drives MySpace :-)"; - post.Content = "..."; - - blog.Posts.Add(post); - - author.Blog = blog; - - return author; - } - - /// - /// Saves the blog. - /// - /// The blog. - public void SaveBlog(Blog blog) - { - } - - /// - /// Saves the post. - /// - /// The post. - public void SavePost(Post post) - { - - } - - #endregion - } -} diff --git a/Examples/tutorial2/Tutorial2.Test/ManualMock/BlogViewMock.cs b/Examples/tutorial2/Tutorial2.Test/ManualMock/BlogViewMock.cs deleted file mode 100644 index 78c46f5..0000000 --- a/Examples/tutorial2/Tutorial2.Test/ManualMock/BlogViewMock.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.ComponentModel; -using Tutorial2.Application; -using Tutorial2.Domain; - -namespace Tutorial2.Test -{ - public class BlogViewMock : IBlogView - { - private Author _author = null; - private Blog _blog= null; - private BindingList _posts = new BindingList(); - - #region IBlogView Members - - public Author Author - { - get { return _author; } - set { _author = value; } - } - - public Blog Blog - { - get { return _blog; } - set { _blog = value; } - } - - public BindingList Posts - { - get { return _posts; } - set { _posts = value; } - } - - #endregion - } -} diff --git a/Examples/tutorial2/Tutorial2.Test/ManualMock/DaoManagerMock.cs b/Examples/tutorial2/Tutorial2.Test/ManualMock/DaoManagerMock.cs deleted file mode 100644 index ebc7b80..0000000 --- a/Examples/tutorial2/Tutorial2.Test/ManualMock/DaoManagerMock.cs +++ /dev/null @@ -1,81 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using IBatisNet.Common; -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Interfaces; - -namespace Tutorial2.Test -{ - public class DaoManagerMock : IDaoManager - { - #region IDaoManager Members - - public IDalSession BeginTransaction() - { - throw new Exception("The method or operation is not implemented."); - } - - public IDalSession BeginTransaction(System.Data.IsolationLevel isolationLevel) - { - throw new Exception("The method or operation is not implemented."); - } - - public void CloseConnection() - { - throw new Exception("The method or operation is not implemented."); - } - - public void CommitTransaction() - { - throw new Exception("The method or operation is not implemented."); - } - - public IBatisNet.DataAccess.Interfaces.IDao GetDao(Type daoInterface) - { - throw new Exception("The method or operation is not implemented."); - } - - public DaoSession GetDaoSession() - { - throw new Exception("The method or operation is not implemented."); - } - - public bool IsDaoSessionStarted() - { - throw new Exception("The method or operation is not implemented."); - } - - public IDalSession LocalDaoSession - { - get { throw new Exception("The method or operation is not implemented."); } - } - - public DataSource LocalDataSource - { - get { throw new Exception("The method or operation is not implemented."); } - } - - public IDalSession OpenConnection() - { - throw new Exception("The method or operation is not implemented."); - } - - public IDalSession OpenConnection(string connectionString) - { - throw new Exception("The method or operation is not implemented."); - } - - public void RollBackTransaction() - { - throw new Exception("The method or operation is not implemented."); - } - - public IDao this[Type daoInterface] - { - get { throw new Exception("The method or operation is not implemented."); } - } - - #endregion - } -} diff --git a/Examples/tutorial2/Tutorial2.Test/Properties/AssemblyInfo.cs b/Examples/tutorial2/Tutorial2.Test/Properties/AssemblyInfo.cs deleted file mode 100644 index b7ae56e..0000000 --- a/Examples/tutorial2/Tutorial2.Test/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Tutorial2.Test")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("NoName.Org")] -[assembly: AssemblyProduct("Tutorial2.Test")] -[assembly: AssemblyCopyright("Copyright © NoName.Org 2006")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("37885e4b-280e-46b7-96fe-c22ba954d293")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Examples/tutorial2/Tutorial2.Test/TestBlogService.cs b/Examples/tutorial2/Tutorial2.Test/TestBlogService.cs deleted file mode 100644 index db1af16..0000000 --- a/Examples/tutorial2/Tutorial2.Test/TestBlogService.cs +++ /dev/null @@ -1,36 +0,0 @@ -using IBatisNet.DataMapper; -using IBatisNet.DataMapper.Configuration; -using NUnit.Framework; -using Tutorial2.Domain; -using Tutorial2.Service; - -namespace Tutorial2.Test -{ - [TestFixture] - public class TestBlogService - { - private IBlogService blogService = null; - [SetUp] - public void SetUp() - { - DomSqlMapBuilder builder = new DomSqlMapBuilder(); - ISqlMapper mapper = builder.Configure(@"../../../Files/sqlMap.config"); - - blogService = new BlogService(mapper); - } - - [Test] - public void SelectVerify() - { - Author gilles = blogService.Verify("gilles","test"); - - Assert.IsNotNull(gilles,"gilles is null !"); - Assert.IsTrue(gilles.Login == "gilles"); - Assert.IsNotNull(gilles.Blog, "Gilles blog is null"); - Assert.IsTrue(gilles.Blog.Name == "Gilles Weblog", "Gilles blog is not 'Gilles Weblog' "); - - Assert.IsTrue(gilles.Blog.Posts.Count > 0); - - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Test/TestDataMapper.cs b/Examples/tutorial2/Tutorial2.Test/TestDataMapper.cs deleted file mode 100644 index 86458d5..0000000 --- a/Examples/tutorial2/Tutorial2.Test/TestDataMapper.cs +++ /dev/null @@ -1,81 +0,0 @@ -using IBatisNet.DataMapper.Configuration; -using NUnit.Framework; -using IBatisNet.DataMapper; - -using System; -using System.Collections.Generic; -using System.Text; -using Tutorial2.Domain; - -namespace Tutorial2.Test -{ - [TestFixture] - public class TestDataMapper - { - private ISqlMapper mapper = null; - private Author gilles = null; - - [SetUp] - public void SetUp() - { - DomSqlMapBuilder builder = new DomSqlMapBuilder(); - mapper = builder.Configure(@"../../../Files/sqlMap.config"); - } - - [Test] - public void SelectBasicAuthor() - { - gilles = mapper.QueryForObject("Author-Select-Basic", 2); - Assert.IsTrue(gilles.Login=="gilles"); - } - - /// - /// Shows lazy loading + resultMap usage on a result property - /// - [Test] - public void SelectAuthorAndBlogAndLazyPost() - { - gilles = mapper.QueryForObject("Author-Select", 2); - - Assert.IsTrue(gilles.Login == "gilles"); - Assert.IsNotNull(gilles.Blog, "Gilles blog is null"); - Assert.IsTrue(gilles.Blog.Name == "Gilles Weblog", "Gilles blog is not 'Gilles Weblog' "); - - Assert.IsTrue(gilles.Blog.Posts.Count > 0); - } - - [Test] - public void InsertAuthor() - { - Author author = new Author(); - author.Name = "test" + DateTime.Now.ToShortDateString(); - author.Login = "Login"; - author.Password = "Password"; - - Assert.IsNull(author.Id); - mapper.Insert("Author-Insert", author); - Assert.IsNotNull(author.Id); - - mapper.Delete("Author-Delete", author.Id); - } - - [Test] - public void UpdateAuthor() - { - gilles = mapper.QueryForObject("Author-Select-Basic", 2); - string newPassword= DateTime.Now.ToShortDateString(); - gilles.Password = newPassword; - - mapper.Update("Author-Update", gilles); - gilles = mapper.QueryForObject("Author-Select-Basic", 2); - - Assert.IsTrue(gilles.Password == newPassword); - - gilles.Password = "test"; - - mapper.Update("Author-Update", gilles); - - } - - } -} diff --git a/Examples/tutorial2/Tutorial2.Test/TestManualPresenterMock.cs b/Examples/tutorial2/Tutorial2.Test/TestManualPresenterMock.cs deleted file mode 100644 index 52ba887..0000000 --- a/Examples/tutorial2/Tutorial2.Test/TestManualPresenterMock.cs +++ /dev/null @@ -1,47 +0,0 @@ -using NUnit.Framework; -using Tutorial2.Application; -using Tutorial2.Domain; -using Tutorial2.Service; - -namespace Tutorial2.Test -{ - [TestFixture] - public class TestManualPresenterMock - { - protected IBlogService service = null; - protected BlogPresenter presenter = null; - protected IBlogView view = null; - - [SetUp] - public void SetUp() - { - view = new BlogViewMock(); - service = new BlogServiceMock(); - presenter = new BlogPresenter(view, service); - } - - [Test] - public void Verify() - { - presenter.Verify("ibatis","rock") ; - - Assert.IsTrue(view.Author.Name == "Gilles"); - } - - - [Test] - public void CreatePost() - { - view.Author = new Author("Gilles"); - Blog blog = new Blog(); - blog.Name = "iBATIS Rock"; - blog.Posts.Add(new Post()); - view.Author.Blog = blog; - view.Blog = blog; - - presenter.CreatePost("MySpace - Powered by iBATIS", "MySpace.com is now running iBATIS for a good portion of its data access abstraction layer."); - - Assert.IsTrue(view.Blog.Posts.Count == 2); - } - } -} diff --git a/Examples/tutorial2/Tutorial2.Test/Tutorial2.Test.csproj b/Examples/tutorial2/Tutorial2.Test/Tutorial2.Test.csproj deleted file mode 100644 index 127364b..0000000 --- a/Examples/tutorial2/Tutorial2.Test/Tutorial2.Test.csproj +++ /dev/null @@ -1,73 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {13A64291-3A95-4D23-8579-AFB2091012D1} - Library - Properties - Tutorial2.Test - Tutorial2.Test - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - False - ..\External-bin\IBatisNet.DataMapper.dll - - - - - - - - - - - - - - - - - {063AA034-BD5A-4792-8539-C0A066D7E4FD} - Tutorial2.Application - - - {8F74B099-C14F-4DE8-8F3F-30846C931EA8} - Tutorial2.Domain - - - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320} - Tutorial2.Service - - - - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.WinUI/Login.Designer.cs b/Examples/tutorial2/Tutorial2.WinUI/Login.Designer.cs deleted file mode 100644 index c24cfb5..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Login.Designer.cs +++ /dev/null @@ -1,118 +0,0 @@ -namespace Tutorial2.WinUI -{ - partial class Login - { - /// - /// Required designer variable. - /// - private System.ComponentModel.IContainer components = null; - - /// - /// Clean up any resources being used. - /// - /// true if managed resources should be disposed; otherwise, false. - protected override void Dispose(bool disposing) - { - if (disposing && (components != null)) - { - components.Dispose(); - } - base.Dispose(disposing); - } - - #region Windows Form Designer generated code - - /// - /// Required method for Designer support - do not modify - /// the contents of this method with the code editor. - /// - private void InitializeComponent() - { - this.components = new System.ComponentModel.Container(); - this.textBoxLogin = new System.Windows.Forms.TextBox(); - this.bindingSourceUser = new System.Windows.Forms.BindingSource(this.components); - this.textBoxPassword = new System.Windows.Forms.TextBox(); - this.label1 = new System.Windows.Forms.Label(); - this.label2 = new System.Windows.Forms.Label(); - this.buttonLogin = new System.Windows.Forms.Button(); - ((System.ComponentModel.ISupportInitialize)(this.bindingSourceUser)).BeginInit(); - this.SuspendLayout(); - // - // textBoxLogin - // - this.textBoxLogin.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSourceUser, "Login", true)); - this.textBoxLogin.Location = new System.Drawing.Point(161, 24); - this.textBoxLogin.Name = "textBoxLogin"; - this.textBoxLogin.Size = new System.Drawing.Size(100, 20); - this.textBoxLogin.TabIndex = 0; - // - // bindingSourceUser - // - this.bindingSourceUser.DataSource = typeof(Tutorial2.Domain.User); - // - // textBoxPassword - // - this.textBoxPassword.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.bindingSourceUser, "Password", true)); - this.textBoxPassword.Location = new System.Drawing.Point(161, 50); - this.textBoxPassword.Name = "textBoxPassword"; - this.textBoxPassword.Size = new System.Drawing.Size(100, 20); - this.textBoxPassword.TabIndex = 1; - // - // label1 - // - this.label1.AutoSize = true; - this.label1.Location = new System.Drawing.Point(24, 30); - this.label1.Name = "label1"; - this.label1.Size = new System.Drawing.Size(33, 13); - this.label1.TabIndex = 2; - this.label1.Text = "Login"; - // - // label2 - // - this.label2.AutoSize = true; - this.label2.Location = new System.Drawing.Point(24, 53); - this.label2.Name = "label2"; - this.label2.Size = new System.Drawing.Size(53, 13); - this.label2.TabIndex = 3; - this.label2.Text = "Password"; - // - // buttonLogin - // - this.buttonLogin.Location = new System.Drawing.Point(186, 91); - this.buttonLogin.Name = "buttonLogin"; - this.buttonLogin.Size = new System.Drawing.Size(75, 23); - this.buttonLogin.TabIndex = 4; - this.buttonLogin.Text = "Login"; - this.buttonLogin.UseVisualStyleBackColor = true; - this.buttonLogin.Click += new System.EventHandler(this.buttonLogin_Click); - // - // Login - // - this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); - this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; - this.ClientSize = new System.Drawing.Size(292, 273); - this.Controls.Add(this.buttonLogin); - this.Controls.Add(this.label2); - this.Controls.Add(this.label1); - this.Controls.Add(this.textBoxPassword); - this.Controls.Add(this.textBoxLogin); - this.Name = "Login"; - this.Text = "Tutorial2"; - this.Load += new System.EventHandler(this.Login_Load); - ((System.ComponentModel.ISupportInitialize)(this.bindingSourceUser)).EndInit(); - this.ResumeLayout(false); - this.PerformLayout(); - - } - - #endregion - - private System.Windows.Forms.TextBox textBoxLogin; - private System.Windows.Forms.TextBox textBoxPassword; - private System.Windows.Forms.Label label1; - private System.Windows.Forms.Label label2; - private System.Windows.Forms.Button buttonLogin; - private System.Windows.Forms.BindingSource bindingSourceUser; - } -} - diff --git a/Examples/tutorial2/Tutorial2.WinUI/Login.cs b/Examples/tutorial2/Tutorial2.WinUI/Login.cs deleted file mode 100644 index 5ed48d3..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Login.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Text; -using System.Windows.Forms; -using Tutorial2.Application; -using Tutorial2.Domain; -using Tutorial2.Test; - -namespace Tutorial2.WinUI -{ - public partial class Login : Form, IBlogView - { - public BlogPresenter presenter = null; - - public Login() - { - InitializeComponent(); - } - - private void Login_Load(object sender, EventArgs e) - { - this.presenter = new BlogPresenter(this, new BlogServiceMock()); - } - - - private void buttonLogin_Click(object sender, EventArgs e) - { - presenter.Verify(this.textBoxLogin.Text, this.textBoxPassword.Text); - } - - #region IBlogView Members - - public User User - { - get - { - return this.bindingSourceUser.DataSource as User; - } - set - { - this.bindingSourceUser.SuspendBinding(); - this.bindingSourceUser.DataSource = value; - this.bindingSourceUser.ResumeBinding(); - } - } - - public Blog Blog - { - get - { - throw new Exception("The method or operation is not implemented."); - } - set - { - throw new Exception("The method or operation is not implemented."); - } - } - - public BindingList Posts - { - get - { - throw new Exception("The method or operation is not implemented."); - } - set - { - throw new Exception("The method or operation is not implemented."); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.WinUI/Login.resx b/Examples/tutorial2/Tutorial2.WinUI/Login.resx deleted file mode 100644 index 75eaeb8..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Login.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 17, 17 - - - 17, 17 - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.WinUI/Program.cs b/Examples/tutorial2/Tutorial2.WinUI/Program.cs deleted file mode 100644 index 7735307..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Program.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Windows.Forms; - -namespace Tutorial2.WinUI -{ - static class Program - { - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main() - { - System.Windows.Forms.Application.EnableVisualStyles(); - System.Windows.Forms.Application.SetCompatibleTextRenderingDefault(false); - System.Windows.Forms.Application.Run(new Login()); - } - } -} \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.WinUI/Properties/AssemblyInfo.cs b/Examples/tutorial2/Tutorial2.WinUI/Properties/AssemblyInfo.cs deleted file mode 100644 index 4ae01da..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,33 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Tutorial2.WinUI")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("NoName.Org")] -[assembly: AssemblyProduct("Tutorial2.WinUI")] -[assembly: AssemblyCopyright("Copyright © NoName.Org 2006")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("11615885-cdcd-435a-a501-79f98d12cf45")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Examples/tutorial2/Tutorial2.WinUI/Properties/DataSources/Tutorial2.Domain.User.datasource b/Examples/tutorial2/Tutorial2.WinUI/Properties/DataSources/Tutorial2.Domain.User.datasource deleted file mode 100644 index fc89f3c..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Properties/DataSources/Tutorial2.Domain.User.datasource +++ /dev/null @@ -1,10 +0,0 @@ - - - - Tutorial2.Domain.User, Tutorial2.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.Designer.cs b/Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.Designer.cs deleted file mode 100644 index 67d06bd..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.Designer.cs +++ /dev/null @@ -1,71 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.42 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Tutorial2.WinUI.Properties -{ - - - /// - /// A strongly-typed resource class, for looking up localized strings, etc. - /// - // This class was auto-generated by the StronglyTypedResourceBuilder - // class via a tool like ResGen or Visual Studio. - // To add or remove a member, edit your .ResX file then rerun ResGen - // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] - [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources - { - - private static global::System.Resources.ResourceManager resourceMan; - - private static global::System.Globalization.CultureInfo resourceCulture; - - [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] - internal Resources() - { - } - - /// - /// Returns the cached ResourceManager instance used by this class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager - { - get - { - if ((resourceMan == null)) - { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Tutorial2.WinUI.Properties.Resources", typeof(Resources).Assembly); - resourceMan = temp; - } - return resourceMan; - } - } - - /// - /// Overrides the current thread's CurrentUICulture property for all - /// resource lookups using this strongly typed resource class. - /// - [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture - { - get - { - return resourceCulture; - } - set - { - resourceCulture = value; - } - } - } -} diff --git a/Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.resx b/Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.resx deleted file mode 100644 index af7dbeb..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Properties/Resources.resx +++ /dev/null @@ -1,117 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.Designer.cs b/Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.Designer.cs deleted file mode 100644 index 94995c0..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.Designer.cs +++ /dev/null @@ -1,30 +0,0 @@ -//------------------------------------------------------------------------------ -// -// This code was generated by a tool. -// Runtime Version:2.0.50727.42 -// -// Changes to this file may cause incorrect behavior and will be lost if -// the code is regenerated. -// -//------------------------------------------------------------------------------ - -namespace Tutorial2.WinUI.Properties -{ - - - [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "8.0.0.0")] - internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase - { - - private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); - - public static Settings Default - { - get - { - return defaultInstance; - } - } - } -} diff --git a/Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.settings b/Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.settings deleted file mode 100644 index 3964565..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Properties/Settings.settings +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/Examples/tutorial2/Tutorial2.WinUI/Tutorial2.WinUI.csproj b/Examples/tutorial2/Tutorial2.WinUI/Tutorial2.WinUI.csproj deleted file mode 100644 index 3af486c..0000000 --- a/Examples/tutorial2/Tutorial2.WinUI/Tutorial2.WinUI.csproj +++ /dev/null @@ -1,97 +0,0 @@ - - - Debug - AnyCPU - 8.0.50727 - 2.0 - {692233FA-A826-4F1E-9790-D01D980F0210} - WinExe - Properties - Tutorial2.WinUI - Tutorial2.WinUI - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - Form - - - Login.cs - - - - - Designer - Login.cs - - - ResXFileCodeGenerator - Resources.Designer.cs - Designer - - - True - Resources.resx - - - - SettingsSingleFileGenerator - Settings.Designer.cs - - - True - Settings.settings - True - - - - - {063AA034-BD5A-4792-8539-C0A066D7E4FD} - Tutorial2.Application - - - {8F74B099-C14F-4DE8-8F3F-30846C931EA8} - Tutorial2.Domain - - - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320} - Tutorial2.Service - - - {13A64291-3A95-4D23-8579-AFB2091012D1} - Tutorial2.Test - - - - - \ No newline at end of file diff --git a/Examples/tutorial2/Tutorial2.sln b/Examples/tutorial2/Tutorial2.sln deleted file mode 100644 index e7d3c98..0000000 --- a/Examples/tutorial2/Tutorial2.sln +++ /dev/null @@ -1,55 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tutorial2.Domain", "Tutorial2.Domain\Tutorial2.Domain.csproj", "{8F74B099-C14F-4DE8-8F3F-30846C931EA8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tutorial2.Test", "Tutorial2.Test\Tutorial2.Test.csproj", "{13A64291-3A95-4D23-8579-AFB2091012D1}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tutorial2.Application", "Tutorial2.Application\Tutorial2.Application.csproj", "{063AA034-BD5A-4792-8539-C0A066D7E4FD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tutorial2.Service", "Tutorial2.Service\Tutorial2.Service.csproj", "{767A1F9F-FBF4-4F73-A8F1-9531DC69C320}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tutorial2.WinUI", "Tutorial2.WinUI\Tutorial2.WinUI.csproj", "{692233FA-A826-4F1E-9790-D01D980F0210}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{919C21FD-F97A-4731-B21A-8E9C1C5D85D6}" - ProjectSection(SolutionItems) = preProject - Files\Maps\Access\Author.xml = Files\Maps\Access\Author.xml - Files\Maps\Access\Blog.xml = Files\Maps\Access\Blog.xml - Files\Blogs.mdb = Files\Blogs.mdb - Files\dao.config = Files\dao.config - Files\Maps\Access\Post.xml = Files\Maps\Access\Post.xml - Files\properties.config = Files\properties.config - Files\sqlMap.config = Files\sqlMap.config - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {8F74B099-C14F-4DE8-8F3F-30846C931EA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8F74B099-C14F-4DE8-8F3F-30846C931EA8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8F74B099-C14F-4DE8-8F3F-30846C931EA8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8F74B099-C14F-4DE8-8F3F-30846C931EA8}.Release|Any CPU.Build.0 = Release|Any CPU - {13A64291-3A95-4D23-8579-AFB2091012D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {13A64291-3A95-4D23-8579-AFB2091012D1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {13A64291-3A95-4D23-8579-AFB2091012D1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {13A64291-3A95-4D23-8579-AFB2091012D1}.Release|Any CPU.Build.0 = Release|Any CPU - {063AA034-BD5A-4792-8539-C0A066D7E4FD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {063AA034-BD5A-4792-8539-C0A066D7E4FD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {063AA034-BD5A-4792-8539-C0A066D7E4FD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {063AA034-BD5A-4792-8539-C0A066D7E4FD}.Release|Any CPU.Build.0 = Release|Any CPU - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320}.Debug|Any CPU.Build.0 = Debug|Any CPU - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320}.Release|Any CPU.ActiveCfg = Release|Any CPU - {767A1F9F-FBF4-4F73-A8F1-9531DC69C320}.Release|Any CPU.Build.0 = Release|Any CPU - {692233FA-A826-4F1E-9790-D01D980F0210}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {692233FA-A826-4F1E-9790-D01D980F0210}.Debug|Any CPU.Build.0 = Debug|Any CPU - {692233FA-A826-4F1E-9790-D01D980F0210}.Release|Any CPU.ActiveCfg = Release|Any CPU - {692233FA-A826-4F1E-9790-D01D980F0210}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/src/IBatisNet.Common.Test/bin/Debug/test.config b/ORBatis.Common/AssemblyInfo.cs similarity index 100% rename from src/IBatisNet.Common.Test/bin/Debug/test.config rename to ORBatis.Common/AssemblyInfo.cs diff --git a/src/AssemblyKey.snk b/ORBatis.Common/AssemblyKey.snk similarity index 100% rename from src/AssemblyKey.snk rename to ORBatis.Common/AssemblyKey.snk diff --git a/src/IBatisNet.Common/ChangeLog.txt b/ORBatis.Common/ChangeLog.txt similarity index 100% rename from src/IBatisNet.Common/ChangeLog.txt rename to ORBatis.Common/ChangeLog.txt diff --git a/ORBatis.Common/DataSource.cs b/ORBatis.Common/DataSource.cs new file mode 100644 index 0000000..321e058 --- /dev/null +++ b/ORBatis.Common/DataSource.cs @@ -0,0 +1,111 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 638571 $ + * $LastChangedDate: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Xml.Serialization; +#endregion + +namespace IBatisNet.Common +{ + /// + /// Information about a data source. + /// + [Serializable] + [XmlRoot("dataSource", Namespace = "http://ibatis.apache.org/dataMapper")] + public class DataSource : IDataSource + { + #region Constructor (s) / Destructor + /// + /// Constructor + /// + public DataSource() { } + #endregion + #region Fields + [NonSerialized] private string _connectionString = string.Empty; + [NonSerialized] private IDbProvider _provider; + [NonSerialized] private string _name = string.Empty; + #endregion + + #region Properties + /// + /// The connection string. + /// + [XmlAttribute("connectionString")] + public virtual string ConnectionString + { + get => _connectionString; + set + { + CheckPropertyString("ConnectionString", value); + _connectionString = value; + } + } + + /// + /// DataSource Name + /// + [XmlAttribute("name")] + public string Name + { + get => _name; + set + { + CheckPropertyString("Name", value); + _name = value; + } + } + + /// + /// The provider to use for this data source. + /// + [XmlIgnore] + public virtual IDbProvider DbProvider + { + get => _provider; + set => _provider = value; + } + #endregion + + #region Methods + private void CheckPropertyString(string propertyName, string value) + { + if (value == null || value.Trim().Length == 0) + throw new ArgumentException( + "The " + propertyName + " property cannot be " + + "set to a null or empty string value.", propertyName); + } + + /// + /// ToString implementation. + /// + /// A string that describes the data source + public override string ToString() + { + return "Source: ConnectionString : " + ConnectionString; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/DataSourceDeSerializer.cs b/ORBatis.Common/DataSourceDeSerializer.cs new file mode 100644 index 0000000..a5ff0b7 --- /dev/null +++ b/ORBatis.Common/DataSourceDeSerializer.cs @@ -0,0 +1,54 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 512878 $ + * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Xml; +using IBatisNet.Common.Xml; +#endregion + +namespace IBatisNet.Common +{ + /// + /// Summary description for DataSourceDeSerializer. + /// + public sealed class DataSourceDeSerializer + { + /// + /// Deserialize a DataSource object + /// + /// + /// + public static DataSource Deserialize(XmlNode node) + { + var dataSource = new DataSource(); + var prop = NodeUtils.ParseAttributes(node); + + dataSource.ConnectionString = prop["connectionString"]; + dataSource.Name = prop["name"]; + + return dataSource; + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/DbProvider.cs b/ORBatis.Common/DbProvider.cs new file mode 100644 index 0000000..7295b22 --- /dev/null +++ b/ORBatis.Common/DbProvider.cs @@ -0,0 +1,629 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408099 $ + * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using System.Reflection; +using System.Xml.Serialization; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Utilities; +#endregion + +namespace IBatisNet.Common +{ + /// + /// Information about a data provider. + /// + [Serializable] + [XmlRoot("provider", Namespace = "http://ibatis.apache.org/providers")] + public class DbProvider : IDbProvider + { + private const string SQLPARAMETER = "?"; + + #region Fields + [NonSerialized] private bool _allowMARS; + [NonSerialized] private string _assemblyName = string.Empty; + [NonSerialized] private string _commandBuilderClass = string.Empty; + [NonSerialized] private Type _commandBuilderType; + [NonSerialized] private string _commandClass = string.Empty; + [NonSerialized] private string _connectionClass = string.Empty; + + [NonSerialized] private string _dataAdapterClass = string.Empty; + [NonSerialized] private int _dbCommandTimeOut; + [NonSerialized] private string _description = string.Empty; + [NonSerialized] private bool _isDefault; + [NonSerialized] private bool _isEnabled = true; + [NonSerialized] private string _name = string.Empty; + [NonSerialized] private Type _parameterDbType; + [NonSerialized] private string _parameterDbTypeClass = string.Empty; + [NonSerialized] private string _parameterDbTypeProperty = string.Empty; + [NonSerialized] private string _parameterPrefix = string.Empty; + [NonSerialized] private bool _setDbParameterPrecision = true; + [NonSerialized] private bool _setDbParameterScale = true; + [NonSerialized] private bool _setDbParameterSize = true; + [NonSerialized] private IDbConnection _templateConnection; + [NonSerialized] private bool _templateConnectionIsICloneable; + [NonSerialized] private IDbDataAdapter _templateDataAdapter; + [NonSerialized] private bool _templateDataAdapterIsICloneable; + [NonSerialized] private bool _useDeriveParameters = true; + [NonSerialized] private bool _useParameterPrefixInParameter = true; + [NonSerialized] private bool _useParameterPrefixInSql = true; + [NonSerialized] private bool _usePositionalParameters; + + [NonSerialized] private string _connectionAdapterClass = string.Empty; + + [NonSerialized] private IConnectionAdapter _connectionAdapter; + + // private static readonly ILog _connectionLogger = LogManager.GetLogger("System.Data.IDbConnection"); + #endregion + + #region Properties + /// + /// An optional property to specify the DBCommand Timeout for + /// the specified provider. + /// + /// The DB command timeout. + public int DbCommandTimeout + { + get => _dbCommandTimeOut; + set => _dbCommandTimeOut = value; + } + + /// + /// The name of the assembly which conatins the definition of the provider. + /// + /// Examples : "System.Data", "Microsoft.Data.Odbc" + [XmlAttribute("assemblyName")] + public string AssemblyName + { + get => _assemblyName; + set + { + CheckPropertyString("AssemblyName", value); + _assemblyName = value; + } + } + + + /// + /// Tell us if it is the default data source. + /// Default false. + /// + [XmlAttribute("default")] + public bool IsDefault + { + get => _isDefault; + set => _isDefault = value; + } + + + /// + /// Tell us if this provider is enabled. + /// Default true. + /// + [XmlAttribute("enabled")] + public bool IsEnabled + { + get => _isEnabled; + set => _isEnabled = value; + } + + /// + /// Tell us if this provider allows having multiple open with + /// the same . + /// + /// + /// It's a new feature in ADO.NET 2.0 and Sql Server 2005 that allows for multiple forward only read only result sets + /// (MARS). + /// Some databases have supported this functionality for a long time : + /// Not Supported : DB2, MySql.Data, OLE DB provider [except Sql Server 2005 when using MDAC 9], SQLite, Obdc + /// Supported : Sql Server 2005, Npgsql + /// + [XmlAttribute("allowMARS")] + public bool AllowMARS + { + get => _allowMARS; + set => _allowMARS = value; + } + + /// + /// The connection class name to use. + /// + /// + /// "System.Data.OleDb.OleDbConnection", + /// "System.Data.SqlClient.SqlConnection", + /// "Microsoft.Data.Odbc.OdbcConnection" + /// + [XmlAttribute("connectionClass")] + public string DbConnectionClass + { + get => _connectionClass; + set + { + CheckPropertyString("DbConnectionClass", value); + _connectionClass = value; + } + } + + /// + /// The connection adapter class name to use, if any. + /// + [XmlAttribute("connectionAdapterClass")] + public string ConnectionAdapterClass + { + get => _connectionAdapterClass; + set => _connectionAdapterClass = value; + } + + + /// + /// Does this ConnectionProvider require the use of a Named Prefix in the SQL + /// statement. + /// + /// + /// The OLE DB/ODBC .NET Provider does not support named parameters for + /// passing parameters to an SQL Statement or a stored procedure called + /// by an IDbCommand when CommandType is set to Text. + /// For example, SqlClient requires select * from simple where simple_id = @simple_id + /// If this is false, like with the OleDb or Obdc provider, then it is assumed that + /// the ? can be a placeholder for the parameter in the SQL statement when CommandType + /// is set to Text. + /// + [XmlAttribute("useParameterPrefixInSql")] + public bool UseParameterPrefixInSql + { + get => _useParameterPrefixInSql; + set => _useParameterPrefixInSql = value; + } + + /// + /// Does this ConnectionProvider require the use of the Named Prefix when trying + /// to reference the Parameter in the Command's Parameter collection. + /// + /// + /// This is really only useful when the UseParameterPrefixInSql = true. + /// When this is true the code will look like IDbParameter param = cmd.Parameters["@paramName"], + /// if this is false the code will be IDbParameter param = cmd.Parameters["paramName"] - ie - Oracle. + /// + [XmlAttribute("useParameterPrefixInParameter")] + public bool UseParameterPrefixInParameter + { + get => _useParameterPrefixInParameter; + set => _useParameterPrefixInParameter = value; + } + + /// + /// The OLE DB/OBDC .NET Provider uses positional parameters that are marked with a + /// question mark (?) instead of named parameters. + /// + [XmlAttribute("usePositionalParameters")] + public bool UsePositionalParameters + { + get => _usePositionalParameters; + set => _usePositionalParameters = value; + } + + /// + /// Used to indicate whether or not the provider + /// supports parameter size. + /// + /// + /// See JIRA-49 about SQLite.Net provider not supporting parameter size. + /// + [XmlAttribute("setDbParameterSize")] + public bool SetDbParameterSize + { + get => _setDbParameterSize; + set => _setDbParameterSize = value; + } + + /// + /// Used to indicate whether or not the provider + /// supports parameter precision. + /// + /// + /// See JIRA-49 about SQLite.Net provider not supporting parameter precision. + /// + [XmlAttribute("setDbParameterPrecision")] + public bool SetDbParameterPrecision + { + get => _setDbParameterPrecision; + set => _setDbParameterPrecision = value; + } + + /// + /// Used to indicate whether or not the provider + /// supports a parameter scale. + /// + /// + /// See JIRA-49 about SQLite.Net provider not supporting parameter scale. + /// + [XmlAttribute("setDbParameterScale")] + public bool SetDbParameterScale + { + get => _setDbParameterScale; + set => _setDbParameterScale = value; + } + + /// + /// Used to indicate whether or not the provider + /// supports DeriveParameters method for procedure. + /// + [XmlAttribute("useDeriveParameters")] + public bool UseDeriveParameters + { + get => _useDeriveParameters; + set => _useDeriveParameters = value; + } + + /// + /// The command class name to use. + /// + /// + /// "System.Data.SqlClient.SqlCommand" + /// + [XmlAttribute("commandClass")] + public string DbCommandClass + { + get => _commandClass; + set + { + CheckPropertyString("DbCommandClass", value); + _commandClass = value; + } + } + + + /// + /// The ParameterDbType class name to use. + /// + /// + /// "System.Data.SqlDbType" + /// + [XmlAttribute("parameterDbTypeClass")] + public string ParameterDbTypeClass + { + get => _parameterDbTypeClass; + set + { + CheckPropertyString("ParameterDbTypeClass", value); + _parameterDbTypeClass = value; + } + } + + + /// + /// The ParameterDbTypeProperty class name to use. + /// + /// + /// SqlDbType in SqlParamater.SqlDbType, + /// OracleType in OracleParameter.OracleType. + /// + [XmlAttribute("parameterDbTypeProperty")] + public string ParameterDbTypeProperty + { + get => _parameterDbTypeProperty; + set + { + CheckPropertyString("ParameterDbTypeProperty", value); + _parameterDbTypeProperty = value; + } + } + + /// + /// The dataAdapter class name to use. + /// + /// + /// "System.Data.SqlDbType" + /// + [XmlAttribute("dataAdapterClass")] + public string DataAdapterClass + { + get => _dataAdapterClass; + set + { + CheckPropertyString("DataAdapterClass", value); + _dataAdapterClass = value; + } + } + + /// + /// The commandBuilder class name to use. + /// + /// + /// "System.Data.OleDb.OleDbCommandBuilder", + /// "System.Data.SqlClient.SqlCommandBuilder", + /// "Microsoft.Data.Odbc.OdbcCommandBuilder" + /// + [XmlAttribute("commandBuilderClass")] + public string CommandBuilderClass + { + get => _commandBuilderClass; + set + { + CheckPropertyString("CommandBuilderClass", value); + _commandBuilderClass = value; + } + } + + + /// + /// Name used to identify the provider amongst the others. + /// + [XmlAttribute("name")] + public string Name + { + get => _name; + set + { + CheckPropertyString("Name", value); + _name = value; + } + } + + /// + /// Description. + /// + [XmlAttribute("description")] + public string Description + { + get => _description; + set => _description = value; + } + + /// + /// Parameter prefix use in store procedure. + /// + /// @ for Sql Server. + [XmlAttribute("parameterPrefix")] + public string ParameterPrefix + { + get => _parameterPrefix; + set + { + if (value == null || value.Length < 1) + _parameterPrefix = ""; + else + _parameterPrefix = value; + } + } + + /// + /// Check if this provider is Odbc ? + /// + [XmlIgnore] + public bool IsObdc => _connectionClass.IndexOf(".Odbc.") > 0; + + /// + /// Get the CommandBuilder Type for this provider. + /// + /// An object. + public Type CommandBuilderType => _commandBuilderType; + + /// + /// Get the ParameterDb Type for this provider. + /// + /// An object. + [XmlIgnore] + public Type ParameterDbType => _parameterDbType; + #endregion + + #region Methods + /// + /// Init the provider. + /// + public void Initialize() + { + Assembly assembly = null; + Type type = null; + + try + { + assembly = Assembly.Load(_assemblyName); + + // Build the DataAdapter template + type = assembly.GetType(_dataAdapterClass, true); + CheckPropertyType("DataAdapterClass", typeof(IDbDataAdapter), type); + _templateDataAdapter = (IDbDataAdapter)type.GetConstructor(Type.EmptyTypes).Invoke(null); + + // Build the connection template + type = assembly.GetType(_connectionClass, true); + CheckPropertyType("DbConnectionClass", typeof(IDbConnection), type); + _templateConnection = (IDbConnection)type.GetConstructor(Type.EmptyTypes).Invoke(null); + + // Get the CommandBuilder Type + _commandBuilderType = assembly.GetType(_commandBuilderClass, true); + if (_parameterDbTypeClass.IndexOf(',') > 0) + _parameterDbType = TypeUtils.ResolveType(_parameterDbTypeClass); + else + _parameterDbType = assembly.GetType(_parameterDbTypeClass, true); + + _templateConnectionIsICloneable = _templateConnection is ICloneable; + _templateDataAdapterIsICloneable = _templateDataAdapter is ICloneable; + + if (!string.IsNullOrWhiteSpace(_connectionAdapterClass)) + { + Type connectionAdapterType; + + if (_connectionAdapterClass.IndexOf(',') > 0) + connectionAdapterType = TypeUtils.ResolveType(_connectionAdapterClass); + else + connectionAdapterType = assembly.GetType(_connectionAdapterClass, true); + + _connectionAdapter = (IConnectionAdapter)Activator.CreateInstance(connectionAdapterType); + } + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format( + "Could not configure providers. Unable to load provider named \"{0}\" not found, failed. Cause: {1}", + _name, e.Message), e + ); + } + } + + + /// + /// Create a connection object for this provider. + /// + /// An 'IDbConnection' object. + public virtual IDbConnection CreateConnection() + { + // Cannot do that because on + // IDbCommand.Connection = cmdConnection + // .NET cast the cmdConnection to the real type (as SqlConnection) + // and we pass a proxy --> exception invalid cast ! + // if (_connectionLogger.IsDebugEnabled) + // { + // connection = (IDbConnection)IDbConnectionProxy.NewInstance(connection, this); + // } + + IDbConnection cn; + + if (_templateConnectionIsICloneable) + cn = (IDbConnection)((ICloneable)_templateConnection).Clone(); + else + cn = (IDbConnection)Activator.CreateInstance(_templateConnection.GetType()); + + if (_connectionAdapter != null) + cn = _connectionAdapter.Adapt(cn); + + return cn; + } + + + /// + /// Create a command object for this provider. + /// + /// An 'IDbCommand' object. + public virtual IDbCommand CreateCommand() + { + return _templateConnection.CreateCommand(); + } + + /// + /// Create a dataAdapter object for this provider. + /// + /// An 'IDbDataAdapter' object. + public virtual IDbDataAdapter CreateDataAdapter() + { + if (_templateDataAdapterIsICloneable) return (IDbDataAdapter)((ICloneable)_templateDataAdapter).Clone(); + return (IDbDataAdapter)Activator.CreateInstance(_templateDataAdapter.GetType()); + } + + + /// + /// Create a IDbDataParameter object for this provider. + /// + /// An 'IDbDataParameter' object. + public virtual IDbDataParameter CreateDataParameter() + { + return _templateConnection.CreateCommand().CreateParameter(); + } + + /// + /// Change the parameterName into the correct format IDbCommand.CommandText + /// for the ConnectionProvider + /// + /// The unformatted name of the parameter + /// A parameter formatted for an IDbCommand.CommandText + public virtual string FormatNameForSql(string parameterName) + { + return _useParameterPrefixInSql ? _parameterPrefix + parameterName : SQLPARAMETER; + } + + /// + /// Changes the parameterName into the correct format for an IDbParameter + /// for the Driver. + /// + /// + /// For SqlServerConnectionProvider it will change id to @id + /// + /// The unformatted name of the parameter + /// A parameter formatted for an IDbParameter. + public virtual string FormatNameForParameter(string parameterName) + { + return _useParameterPrefixInParameter ? _parameterPrefix + parameterName : parameterName; + } + + /// + /// Equals implemantation. + /// + /// The test object. + /// A boolean. + public override bool Equals(object obj) + { + if (obj != null && obj is IDbProvider) + { + var that = (IDbProvider)obj; + return _name == that.Name && + _assemblyName == that.AssemblyName && + _connectionClass == that.DbConnectionClass; + } + + return false; + } + + /// + /// A hashcode for the provider. + /// + /// An integer. + public override int GetHashCode() + { + return _name.GetHashCode() ^ _assemblyName.GetHashCode() ^ _connectionClass.GetHashCode(); + } + + /// + /// ToString implementation. + /// + /// A string that describes the provider. + public override string ToString() + { + return "Provider " + _name; + } + + private void CheckPropertyString(string propertyName, string value) + { + if (value == null || value.Trim().Length == 0) + throw new ArgumentException( + "The " + propertyName + " property cannot be " + + "set to a null or empty string value.", propertyName); + } + + private void CheckPropertyType(string propertyName, Type expectedType, Type value) + { + if (value == null) + throw new ArgumentNullException( + propertyName, "The " + propertyName + " property cannot be null."); + if (!expectedType.IsAssignableFrom(value)) + throw new ArgumentException( + "The Type passed to the " + propertyName + " property must be an " + expectedType.Name + + " implementation."); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Exceptions/ConfigurationException.cs b/ORBatis.Common/Exceptions/ConfigurationException.cs new file mode 100644 index 0000000..7deb743 --- /dev/null +++ b/ORBatis.Common/Exceptions/ConfigurationException.cs @@ -0,0 +1,110 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Runtime.Serialization; +#endregion + + +namespace IBatisNet.Common.Exceptions +{ + /// + /// A ConfigurationException is thrown when an error has occured in the configuration process. + /// + /// + /// When this exception occurs check the .xml or .config file. + /// + [Serializable] + public class ConfigurationException : IBatisNetException + { + /// + /// Initializes a new instance of the class. + /// + /// + /// This constructor initializes the Message property of the new instance to a system-supplied message + /// that describes the error. + /// + public ConfigurationException() : base("Could not configure the iBatis.NET framework.") { } + + /// + /// Initializes a new instance of the + /// class with a reference to the inner exception that is the cause of this exception. + /// + /// + /// This constructor initializes the Message property of the new instance to the Message property + /// of the passed in exception. + /// + /// + /// The exception that is the cause of the current exception. + /// If the innerException parameter is not a null reference (Nothing in Visual Basic), + /// the current exception is raised in a catch block that handles the inner exception. + /// + public ConfigurationException(Exception ex) : base(ex.Message, ex) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message. + /// + /// + /// This constructor initializes the Message property of the new instance using + /// the message parameter. + /// + /// The message that describes the error. + public ConfigurationException(string message) : base(message) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// + /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous + /// exception in the InnerException property. + /// The InnerException property returns the same value that is passed into the constructor, or a null reference + /// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the + /// constructor. + /// + /// The message that describes the error. + /// The exception that caused the error + public ConfigurationException(string message, Exception inner) : base(message, inner) { } + + /// + /// Initializes a new instance of the Exception class with serialized data. + /// + /// + /// This constructor is called during deserialization to reconstitute the exception + /// object transmitted over a stream. + /// + /// + /// The that holds the serialized object data about the + /// exception being thrown. + /// + /// + /// The that contains contextual information about the + /// source or destination. + /// + protected ConfigurationException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Exceptions/ForeignKeyException.cs b/ORBatis.Common/Exceptions/ForeignKeyException.cs new file mode 100644 index 0000000..35e5c94 --- /dev/null +++ b/ORBatis.Common/Exceptions/ForeignKeyException.cs @@ -0,0 +1,109 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace IBatisNet.Common.Exceptions +{ + /// + /// A DALForeignKeyException is thrown when foreign key error occured in a sql statement. + /// + /// + /// This exception is not used by the framework. + /// + [Serializable] + public class ForeignKeyException : IBatisNetException + { + /// + /// Initializes a new instance of the DalException class. + /// + /// + /// This constructor initializes the + /// Message + /// property of the new instance + /// to a system-supplied message that describes the error. + /// + public ForeignKeyException() : base("A foreign key conflict has occurred.") { } + + /// + /// Initializes a new instance of the + /// class with a reference to the inner exception that is the cause of this exception. + /// + /// + /// This constructor initializes the Message property of the new instance to the Message property + /// of the passed in exception. + /// + /// + /// The exception that is the cause of the current exception. + /// If the innerException parameter is not a null reference (Nothing in Visual Basic), + /// the current exception is raised in a catch block that handles the inner exception. + /// + public ForeignKeyException(Exception ex) : base(ex.Message, ex) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message. + /// + /// + /// This constructor initializes the Message property of the new instance using + /// the message parameter. + /// + /// The message that describes the error. + public ForeignKeyException(string message) : base(message) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// + /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous + /// exception in the InnerException property. + /// The InnerException property returns the same value that is passed into the constructor, or a null reference + /// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the + /// constructor. + /// + /// The message that describes the error. + /// The exception that caused the error + public ForeignKeyException(string message, Exception inner) : base(message, inner) { } + + /// + /// Initializes a new instance of the Exception class with serialized data. + /// + /// + /// This constructor is called during deserialization to reconstitute the exception + /// object transmitted over a stream. + /// + /// + /// The that holds the serialized object data about the + /// exception being thrown. + /// + /// + /// The that contains contextual information about the + /// source or destination. + /// + protected ForeignKeyException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Exceptions/IBatisNetException.cs b/ORBatis.Common/Exceptions/IBatisNetException.cs new file mode 100644 index 0000000..ba5b6a9 --- /dev/null +++ b/ORBatis.Common/Exceptions/IBatisNetException.cs @@ -0,0 +1,112 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace IBatisNet.Common.Exceptions +{ + /// + /// The DalException is thrown when an error in the Dal occurs. + /// + /// + /// This is the base exception for all exceptions thrown in the framework. + /// + [Serializable] + public class IBatisNetException : ApplicationException + { + /// + /// Initializes a new instance of the class. + /// + /// + /// This constructor initializes the + /// Message + /// property of the new instance + /// to a system-supplied message that describes the error. + /// + public IBatisNetException() : base("iBatis.NET framework caused an exception.") { } + + /// + /// Initializes a new instance of the + /// class with a reference to the inner exception that is the cause of this exception. + /// + /// + /// This constructor initializes the Message property of the new instance + /// using the message parameter. + /// + /// + /// The exception that is the cause of the current exception. + /// If the innerException parameter is not a null reference (Nothing in Visual Basic), + /// the current exception is raised in a catch block that handles the inner exception. + /// + public IBatisNetException(Exception ex) : base("iBatis.NET framework caused an exception.", ex) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message. + /// + /// + /// This constructor initializes the Message property of the new instance to + /// the Message property of the passed in exception. + /// + /// The message that describes the error. + public IBatisNetException(string message) : base(message) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message and a reference to the inner exception + /// that is the cause of this exception. + /// + /// + /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous + /// exception in the InnerException property. + /// The InnerException property returns the same value that is passed into the constructor, or a null reference + /// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the + /// constructor. + /// + /// The message that describes the error. + /// The exception that caused the error + public IBatisNetException(string message, Exception inner) : base(message, inner) { } + + + /// + /// Initializes a new instance of the + /// class with serialized data. + /// + /// + /// This constructor is called during deserialization to reconstitute the + /// exception object transmitted over a stream. + /// + /// + /// The that holds the serialized + /// object data about the exception being thrown. + /// + /// + /// The that contains contextual + /// information about the source or destination. + /// + protected IBatisNetException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Exceptions/ProbeException.cs b/ORBatis.Common/Exceptions/ProbeException.cs new file mode 100644 index 0000000..8d46073 --- /dev/null +++ b/ORBatis.Common/Exceptions/ProbeException.cs @@ -0,0 +1,106 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 512878 $ + * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Runtime.Serialization; + +namespace IBatisNet.Common.Exceptions +{ + /// + /// Summary description for ProbeException. + /// + [Serializable] + public class ProbeException : IBatisNetException + { + /// + /// Initializes a new instance of the ProbeException class. + /// + /// + /// This constructor initializes the + /// Message + /// property of the new instance + /// to a system-supplied message that describes the error. + /// + public ProbeException() : base("A foreign key conflict has occurred.") { } + + /// + /// Initializes a new instance of the + /// class with a reference to the inner exception that is the cause of this exception. + /// + /// + /// This constructor initializes the Message property of the new instance to the Message property + /// of the passed in exception. + /// + /// + /// The exception that is the cause of the current exception. + /// If the innerException parameter is not a null reference (Nothing in Visual Basic), + /// the current exception is raised in a catch block that handles the inner exception. + /// + public ProbeException(Exception ex) : base(ex.Message, ex) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message. + /// + /// + /// This constructor initializes the Message property of the new instance using + /// the message parameter. + /// + /// The message that describes the error. + public ProbeException(string message) : base(message) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message and a reference to the inner exception that is the cause of this exception. + /// + /// + /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous + /// exception in the InnerException property. + /// The InnerException property returns the same value that is passed into the constructor, or a null reference + /// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the + /// constructor. + /// + /// The message that describes the error. + /// The exception that caused the error + public ProbeException(string message, Exception inner) : base(message, inner) { } + + /// + /// Initializes a new instance of the Exception class with serialized data. + /// + /// + /// This constructor is called during deserialization to reconstitute the exception + /// object transmitted over a stream. + /// + /// + /// The that holds the serialized object data about the + /// exception being thrown. + /// + /// + /// The that contains contextual information about the + /// source or destination. + /// + protected ProbeException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/src/IBatisNet.Common/IBatisNet.Common.2005.csproj b/ORBatis.Common/IBatisNet.Common.2005.csproj similarity index 100% rename from src/IBatisNet.Common/IBatisNet.Common.2005.csproj rename to ORBatis.Common/IBatisNet.Common.2005.csproj diff --git a/src/IBatisNet.Common/IBatisNet.Common.2010.csproj b/ORBatis.Common/IBatisNet.Common.2010.csproj similarity index 97% rename from src/IBatisNet.Common/IBatisNet.Common.2010.csproj rename to ORBatis.Common/IBatisNet.Common.2010.csproj index 5598b6f..16c9c55 100644 --- a/src/IBatisNet.Common/IBatisNet.Common.2010.csproj +++ b/ORBatis.Common/IBatisNet.Common.2010.csproj @@ -1,341 +1,341 @@ - - - - Local - 9.0.21022 - 2.0 - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - Debug - AnyCPU - - - - - IBatisNet.Common - AssemblyKey.snk - JScript - Grid - IE50 - false - Library - IBatisNet.Common - OnBuildSuccess - - - - - - - 3.5 - false - v4.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - IBatisNet.Common.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - IBatisNet.Common.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - false - - - - False - ..\External-Bin\Net\4.0\Castle.Core.dll - - - - - System.Data - - - System.EnterpriseServices - - - System.Web - - - System.XML - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - Code - - - Code - - - - Code - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - - - - - - - - - - + + + + Local + 9.0.21022 + 2.0 + {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} + Debug + AnyCPU + + + + + IBatisNet.Common + AssemblyKey.snk + JScript + Grid + IE50 + false + Library + IBatisNet.Common + OnBuildSuccess + + + + + + + 3.5 + false + v4.0 + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + + bin\Debug\ + false + 285212672 + false + + + TRACE;DEBUG;dotnet2 + IBatisNet.Common.xml + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE;dotnet2 + IBatisNet.Common.xml + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + false + + + + False + ..\External-Bin\Net\4.0\Castle.Core.dll + + + + + System.Data + + + System.EnterpriseServices + + + System.Web + + + System.XML + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + Code + + + Code + + + + Code + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/IBatisNet.Common/IBatisNet.Common.Net35.2010.csproj b/ORBatis.Common/IBatisNet.Common.Net35.2010.csproj similarity index 97% rename from src/IBatisNet.Common/IBatisNet.Common.Net35.2010.csproj rename to ORBatis.Common/IBatisNet.Common.Net35.2010.csproj index 5fe8ebc..eca3257 100644 --- a/src/IBatisNet.Common/IBatisNet.Common.Net35.2010.csproj +++ b/ORBatis.Common/IBatisNet.Common.Net35.2010.csproj @@ -1,344 +1,344 @@ - - - - Local - 9.0.21022 - 2.0 - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - Debug - AnyCPU - - - - - IBatisNet.Common - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common - OnBuildSuccess - - - - - - - 3.5 - false - v3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - IBatisNet.Common.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - IBatisNet.Common.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - - False - ..\External-Bin\Net\2.0\Castle.DynamicProxy.dll - - - - - System.Data - - - System.EnterpriseServices - - - System.Web - - - System.XML - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - Code - - - Code - - - - Code - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - - - - - - - - - + + + + Local + 9.0.21022 + 2.0 + {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} + Debug + AnyCPU + + + + + IBatisNet.Common + + + JScript + Grid + IE50 + false + Library + IBatisNet.Common + OnBuildSuccess + + + + + + + 3.5 + false + v3.5 + + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + + + bin\Debug\ + false + 285212672 + false + + + TRACE;DEBUG;dotnet2 + IBatisNet.Common.xml + true + 4096 + false + + + false + false + false + false + 4 + full + prompt + AllRules.ruleset + + + bin\Release\ + false + 285212672 + false + + + TRACE;dotnet2 + IBatisNet.Common.xml + false + 4096 + false + + + true + false + false + false + 4 + none + prompt + AllRules.ruleset + + + + False + ..\External-Bin\Net\2.0\Castle.DynamicProxy.dll + + + + + System.Data + + + System.EnterpriseServices + + + System.Web + + + System.XML + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + Code + + + + Code + + + Code + + + + Code + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/IBatisNet.Common/IBatisNet.Common.Net45.2012.csproj b/ORBatis.Common/IBatisNet.Common.Net45.2012.csproj similarity index 97% rename from src/IBatisNet.Common/IBatisNet.Common.Net45.2012.csproj rename to ORBatis.Common/IBatisNet.Common.Net45.2012.csproj index 6d7f11d..7c83f76 100644 --- a/src/IBatisNet.Common/IBatisNet.Common.Net45.2012.csproj +++ b/ORBatis.Common/IBatisNet.Common.Net45.2012.csproj @@ -1,149 +1,149 @@ - - - Local - - - IBatisNet.Common - AssemblyKey.snk - JScript - Grid - IE50 - false - Library - IBatisNet.Common - OnBuildSuccess - - - false - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - true - 10.0 - - - 285212672 - - - TRACE;DEBUG;dotnet2 - IBatisNet.Common.xml - 4096 - false - - - false - false - AllRules.ruleset - - - 285212672 - - - TRACE;dotnet2 - IBatisNet.Common.xml - 4096 - false - - - false - false - none - AllRules.ruleset - - - true - - - - - - - - - System.XML - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 2.0 %28x86%29 - true - - - False - .NET Framework 3.0 %28x86%29 - false - - - False - .NET Framework 3.5 - false - - - False - .NET Framework 3.5 SP1 - false - - - - - - - - - - - - - - net6.0 - false - http://ibatis.apache.org/ - iBATIS.NET - Copyright 2007,2005 The Apache Software Foundation - iBATIS.Common - Common object used by DataAccess and DataMapper component in iBATIS.Net - 1.6.2 - - - - - - - - - - - - - - - - - - + + + Local + + + IBatisNet.Common + AssemblyKey.snk + JScript + Grid + IE50 + false + Library + IBatisNet.Common + OnBuildSuccess + + + false + publish\ + true + Disk + false + Foreground + 7 + Days + false + false + true + 0 + 1.0.0.%2a + false + true + 10.0 + + + 285212672 + + + TRACE;DEBUG;dotnet2 + IBatisNet.Common.xml + 4096 + false + + + false + false + AllRules.ruleset + + + 285212672 + + + TRACE;dotnet2 + IBatisNet.Common.xml + 4096 + false + + + false + false + none + AllRules.ruleset + + + true + + + + + + + + + System.XML + + + + + + + + + + + + + + False + .NET Framework 3.5 SP1 Client Profile + false + + + False + .NET Framework 2.0 %28x86%29 + true + + + False + .NET Framework 3.0 %28x86%29 + false + + + False + .NET Framework 3.5 + false + + + False + .NET Framework 3.5 SP1 + false + + + + + + + + + + + + + + net8.0 + false + http://ibatis.apache.org/ + iBATIS.NET + Copyright 2007,2005 The Apache Software Foundation + iBATIS.Common + Common object used by DataAccess and DataMapper component in iBATIS.Net + 1.6.2 + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/IBatisNet.Common/IBatisNet.Common.csproj b/ORBatis.Common/IBatisNet.Common.csproj similarity index 100% rename from src/IBatisNet.Common/IBatisNet.Common.csproj rename to ORBatis.Common/IBatisNet.Common.csproj diff --git a/ORBatis.Common/IConnectionAdapter.cs b/ORBatis.Common/IConnectionAdapter.cs new file mode 100644 index 0000000..61807e2 --- /dev/null +++ b/ORBatis.Common/IConnectionAdapter.cs @@ -0,0 +1,9 @@ +using System.Data; + +namespace IBatisNet.Common +{ + public interface IConnectionAdapter + { + IDbConnection Adapt(IDbConnection cn); + } +} \ No newline at end of file diff --git a/ORBatis.Common/IDalSession.cs b/ORBatis.Common/IDalSession.cs new file mode 100644 index 0000000..f037aa2 --- /dev/null +++ b/ORBatis.Common/IDalSession.cs @@ -0,0 +1,181 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 513043 $ + * $Date: 2007-02-28 15:56:03 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Data; +#endregion + + +namespace IBatisNet.Common +{ + /// + /// A template for a session in the iBATIS.NET framwork. + /// Holds the connection, the transaction ... + /// + public interface IDalSession : IDisposable + { + /// + /// The data source use by the session. + /// + IDataSource DataSource { get; } + + /// + /// The Connection use by the session. + /// + IDbConnection Connection { get; } + + /// + /// The Transaction use by the session. + /// + IDbTransaction Transaction { get; } + + /// + /// Indicates if a transaction is open on + /// the session. + /// + bool IsTransactionStart { get; } + + /// + /// Complete (commit) a transsaction + /// + void Complete(); + + /// + /// Open a connection. + /// + void OpenConnection(); + + /// + /// Open a connection, on the specified connection string. + /// + /// The connection string + void OpenConnection(string connectionString); + + /// + /// close a connection + /// + void CloseConnection(); + + /// + /// Open a connection and begin a transaction + /// + void BeginTransaction(); + + /// + /// Open a connection and begin a transaction on the specified connection string. + /// + /// The connection string + void BeginTransaction(string connectionString); + + /// + /// Begins a database transaction + /// + /// Open a connection. + void BeginTransaction(bool openConnection); + + /// + /// Open a connection and begin a transaction on the specified connection string. + /// + /// The connection string + /// The transaction isolation level for this connection. + void BeginTransaction(string connectionString, IsolationLevel isolationLevel); + + /// + /// Open a connection and begin a transaction at the data source + /// with the specified IsolationLevel value. + /// + /// The transaction isolation level for this connection. + void BeginTransaction(IsolationLevel isolationLevel); + + /// + /// Begins a transaction on the current connection + /// with the specified IsolationLevel value. + /// + /// The transaction isolation level for this connection. + /// The connection string + /// Open a connection. + void BeginTransaction(string connectionString, bool openConnection, IsolationLevel isolationLevel); + + /// + /// Begins a transaction on the current connection + /// with the specified IsolationLevel value. + /// + /// The transaction isolation level for this connection. + /// Open a connection. + void BeginTransaction(bool openConnection, IsolationLevel isolationLevel); + + /// + /// Commit a transaction and close the associated connection + /// + void CommitTransaction(); + + /// + /// Commits the database transaction. + /// + /// Close the connection + void CommitTransaction(bool closeConnection); + + /// + /// Rollbak a transaction and close the associated connection + /// + void RollBackTransaction(); + + /// + /// Rolls back a transaction from a pending state. + /// + /// Close the connection + void RollBackTransaction(bool closeConnection); + + /// + /// Create a command + /// + /// The type of the command + /// An IDbCommand. + IDbCommand CreateCommand(CommandType commandType); + + /// + /// Create an DataParameter + /// + /// An IDbDataParameter. + IDbDataParameter CreateDataParameter(); + + /// + /// Create a DataAdapter + /// + /// + /// The statement or stored procedure + /// used to select records in the data source. + /// + /// An IDbDataAdapter. + IDbDataAdapter CreateDataAdapter(IDbCommand command); + + /// + /// Create a DataAdapter + /// + /// An IDbDataAdapter. + IDbDataAdapter CreateDataAdapter(); + } +} \ No newline at end of file diff --git a/ORBatis.Common/IDataSource.cs b/ORBatis.Common/IDataSource.cs new file mode 100644 index 0000000..fa9b17b --- /dev/null +++ b/ORBatis.Common/IDataSource.cs @@ -0,0 +1,86 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006 - Apache Fondation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.Common +{ + /// + /// IDataSource + /// + public interface IDataSource + { + /// + /// DataSource Name. + /// + string Name { set; get; } + + /// + /// Connection string used to create connections. + /// + string ConnectionString { set; get; } + + /// + /// The data provider. + /// + IDbProvider DbProvider { set; get; } + +/* + /// + /// Create a connection + /// + /// An IDbConnection + IDbConnection CreateConnection(); + + /// + /// Create a command object + /// + /// An IdbCommand + IDbCommand CreateCommand(); + IDbCommand GetCommand(string cmdText); + IDbCommand GetCommand(string cmdText, IDbConnection connection); + IDbCommand GetCommand(string cmdText, IDbConnection connection, IDbTransaction transaction); + + /// + /// Create a parameter object + /// + /// An IDataParameter + IDataParameter CreateParameter(); + // ou return IDbParameter ??? + + IDataParameter GetParameter(string name, DbType dataType); + IDataParameter GetParameter(string name, object value); + IDataParameter GetParameter(string name, DbType dataType, int size); + IDataParameter GetParameter(string name, DbType dataType, int size, string srcColumn); + + /// + /// Create a DataAdapter object + /// + /// An IDataAdapter + IDataAdapter CreateDataAdapter(); + IDataAdapter GetDataAdapter(IDbCommand selectCommand); + IDataAdapter GetDataAdapter(string selectCommandText, string selectConnectionString); + IDataAdapter GetDataAdapter(string selectCommandText, IDbConnection selectConnection); + */ + } +} \ No newline at end of file diff --git a/ORBatis.Common/IDbProvider.cs b/ORBatis.Common/IDbProvider.cs new file mode 100644 index 0000000..d2a5fd1 --- /dev/null +++ b/ORBatis.Common/IDbProvider.cs @@ -0,0 +1,270 @@ +using System; +using System.Data; +using System.Xml.Serialization; + +namespace IBatisNet.Common +{ + /// + /// Factory interface to create provider specific ado.net objects. + /// + public interface IDbProvider + { + /// + /// The name of the assembly which conatins the definition of the provider. + /// + /// Examples : "System.Data", "Microsoft.Data.Odbc" + [XmlAttribute("assemblyName")] + string AssemblyName { get; set; } + + /// + /// Tell us if it is the default data source. + /// Default false. + /// + [XmlAttribute("default")] + bool IsDefault { get; set; } + + /// + /// Tell us if this provider is enabled. + /// Default true. + /// + [XmlAttribute("enabled")] + bool IsEnabled { get; set; } + + /// + /// Tell us if this provider allows having multiple open with + /// the same . + /// + [XmlAttribute("allowMultipleActiveDataReaders")] + bool AllowMARS { get; set; } + + /// + /// An optional property to specify the DBCommand Timeout for + /// the specified provider. + /// + [XmlAttribute("commandTimeout")] + int DbCommandTimeout { get; set; } + + /// + /// The connection class name to use. + /// + /// + /// "System.Data.OleDb.OleDbConnection", + /// "System.Data.SqlClient.SqlConnection", + /// "Microsoft.Data.Odbc.OdbcConnection" + /// + [XmlAttribute("connectionClass")] + string DbConnectionClass { get; set; } + + /// + /// The connection adapter class name to use, if any. + /// + [XmlAttribute("connectionAdapterClass")] + string ConnectionAdapterClass { get; set; } + + /// + /// Does this ConnectionProvider require the use of a Named Prefix in the SQL + /// statement. + /// + /// + /// The OLE DB/ODBC .NET Provider does not support named parameters for + /// passing parameters to an SQL Statement or a stored procedure called + /// by an IDbCommand when CommandType is set to Text. + /// For example, SqlClient requires select * from simple where simple_id = @simple_id + /// If this is false, like with the OleDb or Obdc provider, then it is assumed that + /// the ? can be a placeholder for the parameter in the SQL statement when CommandType + /// is set to Text. + /// + [XmlAttribute("useParameterPrefixInSql")] + bool UseParameterPrefixInSql { get; set; } + + /// + /// Does this ConnectionProvider require the use of the Named Prefix when trying + /// to reference the Parameter in the Command's Parameter collection. + /// + /// + /// This is really only useful when the UseParameterPrefixInSql = true. + /// When this is true the code will look like IDbParameter param = cmd.Parameters["@paramName"], + /// if this is false the code will be IDbParameter param = cmd.Parameters["paramName"] - ie - Oracle. + /// + [XmlAttribute("useParameterPrefixInParameter")] + bool UseParameterPrefixInParameter { get; set; } + + /// + /// The OLE DB/OBDC .NET Provider uses positional parameters that are marked with a + /// question mark (?) instead of named parameters. + /// + [XmlAttribute("usePositionalParameters")] + bool UsePositionalParameters { get; set; } + + /// + /// Used to indicate whether or not the provider + /// supports parameter size. + /// + /// + /// See JIRA-49 about SQLite.Net provider not supporting parameter size. + /// + [XmlAttribute("setDbParameterSize")] + bool SetDbParameterSize { get; set; } + + /// + /// Used to indicate whether or not the provider + /// supports parameter precision. + /// + /// + /// See JIRA-49 about SQLite.Net provider not supporting parameter precision. + /// + [XmlAttribute("setDbParameterPrecision")] + bool SetDbParameterPrecision { get; set; } + + /// + /// Used to indicate whether or not the provider + /// supports a parameter scale. + /// + /// + /// See JIRA-49 about SQLite.Net provider not supporting parameter scale. + /// + [XmlAttribute("setDbParameterScale")] + bool SetDbParameterScale { get; set; } + + /// + /// Used to indicate whether or not the provider + /// supports DeriveParameters method for procedure. + /// + [XmlAttribute("useDeriveParameters")] + bool UseDeriveParameters { get; set; } + + /// + /// The command class name to use. + /// + /// + /// "System.Data.SqlClient.SqlCommand" + /// + [XmlAttribute("commandClass")] + string DbCommandClass { get; set; } + + /// + /// The ParameterDbType class name to use. + /// + /// + /// "System.Data.SqlDbType" + /// + [XmlAttribute("parameterDbTypeClass")] + string ParameterDbTypeClass { get; set; } + + /// + /// The ParameterDbTypeProperty class name to use. + /// + /// + /// SqlDbType in SqlParamater.SqlDbType, + /// OracleType in OracleParameter.OracleType. + /// + [XmlAttribute("parameterDbTypeProperty")] + string ParameterDbTypeProperty { get; set; } + + /// + /// The dataAdapter class name to use. + /// + /// + /// "System.Data.SqlDbType" + /// + [XmlAttribute("dataAdapterClass")] + string DataAdapterClass { get; set; } + + /// + /// The commandBuilder class name to use. + /// + /// + /// "System.Data.OleDb.OleDbCommandBuilder", + /// "System.Data.SqlClient.SqlCommandBuilder", + /// "Microsoft.Data.Odbc.OdbcCommandBuilder" + /// + [XmlAttribute("commandBuilderClass")] + string CommandBuilderClass { get; set; } + + /// + /// Name used to identify the provider amongst the others. + /// + [XmlAttribute("name")] + string Name { get; set; } + + /// + /// Description. + /// + [XmlAttribute("description")] + string Description { get; set; } + + /// + /// Parameter prefix use in store procedure. + /// + /// @ for Sql Server. + [XmlAttribute("parameterPrefix")] + string ParameterPrefix { get; set; } + + /// + /// Check if this provider is Odbc ? + /// + [XmlIgnore] + bool IsObdc { get; } + + /// + /// Create the CommandBuilder Type for this provider. + /// + /// An object. + Type CommandBuilderType { get; } + + /// + /// Get the ParameterDb Type for this provider. + /// + /// An object. + Type ParameterDbType { get; } + + /// + /// Create a connection object for this provider. + /// + /// An 'IDbConnection' object. + IDbConnection CreateConnection(); + + /// + /// Create a command object for this provider. + /// + /// An 'IDbCommand' object. + IDbCommand CreateCommand(); + + /// + /// Create a dataAdapter object for this provider. + /// + /// An 'IDbDataAdapter' object. + IDbDataAdapter CreateDataAdapter(); + + /// + /// Create a IDataParameter object for this provider. + /// + /// An 'IDbDataParameter' object. + IDbDataParameter CreateDataParameter(); + + + /// + /// Change the parameterName into the correct format IDbCommand.CommandText + /// for the ConnectionProvider + /// + /// The unformatted name of the parameter + /// A parameter formatted for an IDbCommand.CommandText + string FormatNameForSql(string parameterName); + + /// + /// Changes the parameterName into the correct format for an IDbParameter + /// for the Driver. + /// + /// + /// For SqlServerConnectionProvider it will change id to @id + /// + /// The unformatted name of the parameter + /// A parameter formatted for an IDbParameter. + string FormatNameForParameter(string parameterName); + + /// + /// Init the provider. + /// + void Initialize(); + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/ILog.cs b/ORBatis.Common/Logging/ILog.cs new file mode 100644 index 0000000..265f005 --- /dev/null +++ b/ORBatis.Common/Logging/ILog.cs @@ -0,0 +1,245 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; + +namespace IBatisNet.Common.Logging +{ + /// + /// The 7 logging levels used by Log are (in order): + /// + public enum LogLevel + { + /// + /// + All = 0, + + /// + /// + Debug = 1, + + /// + /// + Info = 2, + + /// + /// + Warn = 3, + + /// + /// + Error = 4, + + /// + /// + Fatal = 5, + + /// + /// Do not log anything. + /// + Off = 6 + } + + /// + /// A simple logging interface abstracting logging APIs. Inspired by log4net. + /// + public interface ILog + { +// /// +// /// Logs a formatted message string with the level. +// /// +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void WarnFormat(string format, params object[] args); +// +// /// +// /// Logs a formatted message string with the level. +// /// +// /// An that supplies culture-specific formatting information +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void WarnFormat(IFormatProvider provider, string format, params object[] args); + +/// +/// Checks if this logger is enabled for the level. +/// +bool IsDebugEnabled { get; } + +/// +/// Checks if this logger is enabled for the level. +/// +bool IsErrorEnabled { get; } + +/// +/// Checks if this logger is enabled for the level. +/// +bool IsFatalEnabled { get; } + +/// +/// Checks if this logger is enabled for the level. +/// +bool IsInfoEnabled { get; } + +/// +/// Checks if this logger is enabled for the level. +/// +bool IsWarnEnabled { get; } + +/// +/// Log a message object with the level. +/// +/// The message object to log. +void Debug(object message); + +/// +/// Log a message object with the level including +/// the stack trace of the passed +/// as a parameter. +/// +/// The message object to log. +/// The exception to log, including its stack trace. +void Debug(object message, Exception exception); + +// /// +// /// Logs a formatted message string with the level. +// /// +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void DebugFormat(string format, params object[] args); +// +// /// +// /// Logs a formatted message string with the level. +// /// +// /// An that supplies culture-specific formatting information +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void DebugFormat(IFormatProvider provider, string format, params object[] args); + +/// +/// Log a message object with the level. +/// +/// The message object to log. +void Error(object message); + +/// +/// Log a message object with the level including +/// the stack trace of the passed +/// as a parameter. +/// +/// The message object to log. +/// The exception to log, including its stack trace. +void Error(object message, Exception exception); + +// /// +// /// Logs a formatted message string with the level. +// /// +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void ErrorFormat(string format, params object[] args); +// +// /// +// /// Logs a formatted message string with the level. +// /// +// /// An that supplies culture-specific formatting information +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void ErrorFormat(IFormatProvider provider, string format, params object[] args); + +/// +/// Log a message object with the level. +/// +/// The message object to log. +void Fatal(object message); + +/// +/// Log a message object with the level including +/// the stack trace of the passed +/// as a parameter. +/// +/// The message object to log. +/// The exception to log, including its stack trace. +void Fatal(object message, Exception exception); + +// /// +// /// Logs a formatted message string with the level. +// /// +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void FatalFormat(string format, params object[] args); +// +// /// +// /// Logs a formatted message string with the level. +// /// +// /// An that supplies culture-specific formatting information +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void FatalFormat(IFormatProvider provider, string format, params object[] args); + +/// +/// Log a message object with the level. +/// +/// The message object to log. +void Info(object message); + +/// +/// Log a message object with the level including +/// the stack trace of the passed +/// as a parameter. +/// +/// The message object to log. +/// The exception to log, including its stack trace. +void Info(object message, Exception exception); + +// /// +// /// Logs a formatted message string with the level. +// /// +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void InfoFormat(string format, params object[] args); +// +// /// +// /// Logs a formatted message string with the level. +// /// +// /// An that supplies culture-specific formatting information +// /// A String containing zero or more format items +// /// An Object array containing zero or more objects to format +// void InfoFormat(IFormatProvider provider, string format, params object[] args); + +/// +/// Log a message object with the level. +/// +/// The message object to log. +void Warn(object message); + +/// +/// Log a message object with the level including +/// the stack trace of the passed +/// as a parameter. +/// +/// The message object to log. +/// The exception to log, including its stack trace. +void Warn(object message, Exception exception); + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/ILoggerFactoryAdapter.cs b/ORBatis.Common/Logging/ILoggerFactoryAdapter.cs new file mode 100644 index 0000000..930fffa --- /dev/null +++ b/ORBatis.Common/Logging/ILoggerFactoryAdapter.cs @@ -0,0 +1,80 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections.Specialized; +using IBatisNet.Common.Logging.Impl; + +namespace IBatisNet.Common.Logging +{ + /// + /// Defines the members that logging implementations must implement. + /// + /// + /// Classes that implement this interface may optional implement a constructor that accepts + /// a which will contain zero or more user supplied configuration + /// properties. + /// + /// The IBatisNet.Common assembly ships with the following built-in + /// implementations: + /// + /// + /// + /// + /// + /// + /// Writes output to Console.Out + /// + /// + /// + /// + /// + /// Writes output to the System.Diagnostics.Trace sub-system + /// + /// + /// + /// + /// + /// Ignores all messages + /// + /// + /// + public interface ILoggerFactoryAdapter + { + /// + /// Get a instance by type. + /// + /// + /// + ILog GetLogger(Type type); + + /// + /// Get a instance by name. + /// + /// + /// + ILog GetLogger(string name); + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/Impl/AbstractLogger.cs b/ORBatis.Common/Logging/Impl/AbstractLogger.cs new file mode 100644 index 0000000..66c2e41 --- /dev/null +++ b/ORBatis.Common/Logging/Impl/AbstractLogger.cs @@ -0,0 +1,200 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 23:43:37 -0500 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; + +namespace IBatisNet.Common.Logging.Impl +{ + /// + /// Base class that implements the ILog interface. + /// + public abstract class AbstractLogger : ILog + { + /// + /// Concrete classes should override this method to perform the actual logging. + /// + /// + /// + /// + protected abstract void Write(LogLevel logLevel, object message, Exception e); + + /// + /// Concrete classes should override this method to determine if a particular + /// is enabled. + /// + /// + /// + protected abstract bool IsLevelEnabled(LogLevel logLevel); + + #region ILog Members + /// + /// Log a message. + /// + /// The message to log. + public void Debug(object message) + { + Debug(message, null); + } + + /// + /// Log a message with an optional . + /// + /// The message to log. + /// + /// The associated with the message. If there isn't any + /// associated with the message, pass . + /// + public void Debug(object message, Exception e) + { + if (IsLevelEnabled(LogLevel.Debug)) Write(LogLevel.Debug, message, e); + } + + /// + /// Log a message. + /// + /// The message to log. + public void Error(object message) + { + Error(message, null); + } + + /// + /// Log a message with an optional . + /// + /// The message to log. + /// + /// The associated with the message. If there isn't any + /// associated with the message, pass . + /// + public void Error(object message, Exception e) + { + if (IsLevelEnabled(LogLevel.Error)) Write(LogLevel.Error, message, e); + } + + /// + /// Log a message. + /// + /// The message to log. + public void Fatal(object message) + { + Fatal(message, null); + } + + /// + /// Log a message with an optional . + /// + /// The message to log. + /// + /// The associated with the message. If there isn't any + /// associated with the message, pass . + /// + public void Fatal(object message, Exception e) + { + if (IsLevelEnabled(LogLevel.Fatal)) Write(LogLevel.Fatal, message, e); + } + + /// + /// Log a message. + /// + /// The message to log. + public void Info(object message) + { + Info(message, null); + } + + /// + /// Log a message with an optional . + /// + /// The message to log. + /// + /// The associated with the message. If there isn't any + /// associated with the message, pass . + /// + public void Info(object message, Exception e) + { + if (IsLevelEnabled(LogLevel.Info)) Write(LogLevel.Info, message, e); + } + + /// + /// Log a message. + /// + /// The message to log. + public void Warn(object message) + { + Warn(message, null); + } + + /// + /// Log a message with an optional . + /// + /// The message to log. + /// + /// The associated with the message. If there isn't any + /// associated with the message, pass . + /// + public void Warn(object message, Exception e) + { + if (IsLevelEnabled(LogLevel.Warn)) Write(LogLevel.Warn, message, e); + } + + /// + /// Returns if the current is greater than or + /// equal to . If it is, all messages will be sent to . + /// + public bool IsDebugEnabled => IsLevelEnabled(LogLevel.Debug); + + /// + /// Returns if the current is greater than or + /// equal to . If it is, only messages with a of + /// and will be sent to . + /// + public bool IsErrorEnabled => IsLevelEnabled(LogLevel.Error); + + /// + /// Returns if the current is greater than or + /// equal to . If it is, only messages with a of + /// will be sent to . + /// + public bool IsFatalEnabled => IsLevelEnabled(LogLevel.Fatal); + + /// + /// Returns if the current is greater than or + /// equal to . If it is, only messages with a of + /// , , , and + /// will be sent to . + /// + public bool IsInfoEnabled => IsLevelEnabled(LogLevel.Info); + + + /// + /// Returns if the current is greater than or + /// equal to . If it is, only messages with a of + /// , , and + /// will be sent to . + /// + public bool IsWarnEnabled => IsLevelEnabled(LogLevel.Warn); + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/Impl/ConsoleOutLogger.cs b/ORBatis.Common/Logging/Impl/ConsoleOutLogger.cs new file mode 100644 index 0000000..cba4ca9 --- /dev/null +++ b/ORBatis.Common/Logging/Impl/ConsoleOutLogger.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Globalization; +using System.Text; + +namespace IBatisNet.Common.Logging.Impl +{ + /// + /// Sends log messages to . + /// + public class ConsoleOutLogger : AbstractLogger + { + private readonly LogLevel _currentLogLevel = LogLevel.All; + private readonly string _dateTimeFormat = string.Empty; + private readonly bool _hasDateTimeFormat; + private readonly string _logName = string.Empty; + private readonly bool _showDateTime; + private readonly bool _showLogName; + + /// + /// Creates and initializes a logger that writes messages to . + /// + /// The name, usually type name of the calling class, of the logger. + /// + /// The current logging threshold. Messages recieved that are beneath this threshold will not be + /// logged. + /// + /// Include the current time in the log message. + /// Include the instance name in the log message. + /// The date and time format to use in the log message. + public ConsoleOutLogger(string logName, LogLevel logLevel + , bool showDateTime, bool showLogName, string dateTimeFormat) + { + _logName = logName; + _currentLogLevel = logLevel; + _showDateTime = showDateTime; + _showLogName = showLogName; + _dateTimeFormat = dateTimeFormat; + + if (_dateTimeFormat != null && _dateTimeFormat.Length > 0) _hasDateTimeFormat = true; + } + + /// + /// Do the actual logging by constructing the log message using a then + /// sending the output to . + /// + /// The of the message. + /// The log message. + /// An optional associated with the message. + protected override void Write(LogLevel level, object message, Exception e) + { + // Use a StringBuilder for better performance + var sb = new StringBuilder(); + // Append date-time if so configured + if (_showDateTime) + { + if (_hasDateTimeFormat) + sb.Append(DateTime.Now.ToString(_dateTimeFormat, CultureInfo.InvariantCulture)); + else + sb.Append(DateTime.Now); + + sb.Append(" "); + } + + // Append a readable representation of the log level + sb.Append(string.Format("[{0}]", level.ToString().ToUpper()).PadRight(8)); + + // Append the name of the log instance if so configured + if (_showLogName) sb.Append(_logName).Append(" - "); + + // Append the message + sb.Append(message); + + // Append stack trace if not null + if (e != null) sb.Append(Environment.NewLine).Append(e); + + // Print to the appropriate destination + Console.Out.WriteLine(sb.ToString()); + } + + /// + /// Determines if the given log level is currently enabled. + /// + /// + /// + protected override bool IsLevelEnabled(LogLevel level) + { + var iLevel = (int)level; + var iCurrentLogLevel = (int)_currentLogLevel; + + // return iLevel.CompareTo(iCurrentLogLevel); better ??? + return iLevel >= iCurrentLogLevel; + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/Impl/ConsoleOutLoggerFA.cs b/ORBatis.Common/Logging/Impl/ConsoleOutLoggerFA.cs new file mode 100644 index 0000000..62a0121 --- /dev/null +++ b/ORBatis.Common/Logging/Impl/ConsoleOutLoggerFA.cs @@ -0,0 +1,109 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 471478 $ + * $Date: 2006-11-05 10:53:41 -0700 (Sun, 05 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; + +namespace IBatisNet.Common.Logging.Impl +{ + /// + /// Factory for creating instances that write data to . + /// + public class ConsoleOutLoggerFA : ILoggerFactoryAdapter + { + private readonly string _dateTimeFormat = string.Empty; + private readonly LogLevel _Level = LogLevel.All; + private readonly Hashtable _logs = Hashtable.Synchronized(new Hashtable()); + private readonly bool _showDateTime = true; + private readonly bool _showLogName = true; + + /// + /// Looks for level, showDateTime, showLogName, dateTimeFormat items from + /// for use when the GetLogger methods are called. + /// + /// Contains user supplied configuration information. + public ConsoleOutLoggerFA(NameValueCollection properties) + { + try + { + _Level = (LogLevel)Enum.Parse(typeof(LogLevel), properties["level"], true); + } + catch (Exception) + { + _Level = LogLevel.All; + } + + try + { + _showDateTime = bool.Parse(properties["showDateTime"]); + } + catch (Exception) + { + _showDateTime = true; + } + + try + { + _showLogName = bool.Parse(properties["showLogName"]); + } + catch (Exception) + { + _showLogName = true; + } + + _dateTimeFormat = properties["dateTimeFormat"]; + } + + #region ILoggerFactoryAdapter Members + /// + /// Get a ILog instance by . + /// + /// Usually the of the current class. + /// An ILog instance that will write data to . + public ILog GetLogger(Type type) + { + return GetLogger(type.FullName); + } + + /// + /// Get a ILog instance by name. + /// + /// Usually a 's Name or FullName property. + /// An ILog instance that will write data to . + public ILog GetLogger(string name) + { + var log = _logs[name] as ILog; + if (log == null) + { + log = new ConsoleOutLogger(name, _Level, _showDateTime, _showLogName, _dateTimeFormat); + _logs.Add(name, log); + } + + return log; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/Impl/NoOpLogger.cs b/ORBatis.Common/Logging/Impl/NoOpLogger.cs new file mode 100644 index 0000000..c2242e4 --- /dev/null +++ b/ORBatis.Common/Logging/Impl/NoOpLogger.cs @@ -0,0 +1,158 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 471478 $ + * $Date: 2006-11-05 10:53:41 -0700 (Sun, 05 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; + +namespace IBatisNet.Common.Logging.Impl +{ + /// + /// Silently ignores all log messages. + /// + public sealed class NoOpLogger : ILog + { + #region Members of ILog + /// + /// Ignores message. + /// + /// + public void Debug(object message) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + /// + public void Debug(object message, Exception e) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + public void Error(object message) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + /// + public void Error(object message, Exception e) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + public void Fatal(object message) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + /// + public void Fatal(object message, Exception e) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + public void Info(object message) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + /// + public void Info(object message, Exception e) + { + // NOP - no operation + } + + /// + /// Ignores message. + /// + /// + public void Warn(object message) + { + // NOP - no operation + } + + + /// + /// Ignores message. + /// + /// + /// + public void Warn(object message, Exception e) + { + // NOP - no operation + } + + /// + /// Always returns . + /// + public bool IsDebugEnabled => false; + + /// + /// Always returns . + /// + public bool IsErrorEnabled => false; + + /// + /// Always returns . + /// + public bool IsFatalEnabled => false; + + /// + /// Always returns . + /// + public bool IsInfoEnabled => false; + + /// + /// Always returns . + /// + public bool IsWarnEnabled => false; + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/Impl/NoOpLoggerFA.cs b/ORBatis.Common/Logging/Impl/NoOpLoggerFA.cs new file mode 100644 index 0000000..c73c890 --- /dev/null +++ b/ORBatis.Common/Logging/Impl/NoOpLoggerFA.cs @@ -0,0 +1,81 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections.Specialized; + +namespace IBatisNet.Common.Logging.Impl +{ + /// + /// Factory for creating "no operation" loggers that do nothing and whose Is*Enabled properties always + /// return false. + /// + /// + /// This factory creates a single instance of and always returns that + /// instance whenever an instance is requested. + /// + public sealed class NoOpLoggerFA : ILoggerFactoryAdapter + { + private readonly ILog _nopLogger = new NoOpLogger(); + + /// + /// Constructor + /// + public NoOpLoggerFA() + { + // empty + } + + /// + /// Constructor + /// + public NoOpLoggerFA(NameValueCollection properties) + { + // empty + } + + #region ILoggerFactoryAdapter Members + /// + /// Get a ILog instance by type + /// + /// + /// + public ILog GetLogger(Type type) + { + return _nopLogger; + } + + /// + /// Get a ILog instance by type name + /// + /// + /// + ILog ILoggerFactoryAdapter.GetLogger(string name) + { + return _nopLogger; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/Impl/TraceLogger.cs b/ORBatis.Common/Logging/Impl/TraceLogger.cs new file mode 100644 index 0000000..58f3964 --- /dev/null +++ b/ORBatis.Common/Logging/Impl/TraceLogger.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Diagnostics; +using System.Globalization; +using System.Text; + +namespace IBatisNet.Common.Logging.Impl +{ + /// + /// Logger that sends output to the sub-system. + /// + public class TraceLogger : AbstractLogger + { + private readonly LogLevel _currentLogLevel = LogLevel.All; + private readonly string _dateTimeFormat = string.Empty; + private readonly bool _hasDateTimeFormat; + private readonly string _logName = string.Empty; + private readonly bool _showDateTime; + private readonly bool _showLogName; + + /// + /// Creates a new instance of the TraceLogger. + /// + /// The name for this instance (usually the fully qualified class name). + /// + /// The logging threshold. Log messages created with a + /// beneath this threshold will not be logged. + /// + /// Include the current time in the log message + /// Include the instance name in the log message + /// The date and time format to use in the log message + public TraceLogger(string logName, LogLevel logLevel + , bool showDateTime, bool showLogName, string dateTimeFormat) + { + _logName = logName; + _currentLogLevel = logLevel; + _showDateTime = showDateTime; + _showLogName = showLogName; + _dateTimeFormat = dateTimeFormat; + + if (_dateTimeFormat != null && _dateTimeFormat.Length > 0) _hasDateTimeFormat = true; + } + + /// + /// Responsible for assembling and writing the log message to the tracing sub-system. + /// + /// + /// + /// + protected override void Write(LogLevel level, object message, Exception e) + { + // Use a StringBuilder for better performance + var sb = new StringBuilder(); + + // Append date-time if so configured + if (_showDateTime) + { + if (_hasDateTimeFormat) + sb.Append(DateTime.Now.ToString(_dateTimeFormat, CultureInfo.InvariantCulture)); + else + sb.Append(DateTime.Now); + + sb.Append(" "); + } + + // Append a readable representation of the log level + sb.Append(string.Format("[{0}]", level.ToString().ToUpper()).PadRight(8)); + + // Append the name of the log instance if so configured + if (_showLogName) sb.Append(_logName).Append(" - "); + + // Append the message + sb.Append(message); + + // Append stack trace if not null + if (e != null) sb.Append(Environment.NewLine).Append(e); + + // Print to the appropriate destination + Trace.WriteLine(sb.ToString()); + } + + /// + /// Is the given log level currently enabled ? + /// + /// + /// + protected override bool IsLevelEnabled(LogLevel level) + { + var iLevel = (int)level; + var iCurrentLogLevel = (int)_currentLogLevel; + + return iLevel >= iCurrentLogLevel; + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/Impl/TraceLoggerFA.cs b/ORBatis.Common/Logging/Impl/TraceLoggerFA.cs new file mode 100644 index 0000000..89c5f93 --- /dev/null +++ b/ORBatis.Common/Logging/Impl/TraceLoggerFA.cs @@ -0,0 +1,108 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; + +namespace IBatisNet.Common.Logging.Impl +{ + /// + /// Summary description for TraceLoggerFA. + /// + public class TraceLoggerFA : ILoggerFactoryAdapter + { + private readonly string _dateTimeFormat = string.Empty; + private readonly LogLevel _Level = LogLevel.All; + private readonly Hashtable _logs = Hashtable.Synchronized(new Hashtable()); + private readonly bool _showDateTime = true; + private readonly bool _showLogName = true; + + /// + /// Constructor + /// + /// + public TraceLoggerFA(NameValueCollection properties) + { + try + { + _Level = (LogLevel)Enum.Parse(typeof(LogLevel), properties["level"], true); + } + catch (Exception) + { + _Level = LogLevel.All; + } + + try + { + _showDateTime = bool.Parse(properties["showDateTime"]); + } + catch (Exception) + { + _showDateTime = true; + } + + try + { + _showLogName = bool.Parse(properties["showLogName"]); + } + catch (Exception) + { + _showLogName = true; + } + + _dateTimeFormat = properties["dateTimeFormat"]; + } + + #region ILoggerFactoryAdapter Members + /// + /// Get a ILog instance by type + /// + /// + /// + public ILog GetLogger(Type type) + { + return GetLogger(type.FullName); + } + + /// + /// Get a ILog instance by type name + /// + /// + /// + public ILog GetLogger(string name) + { + var log = _logs[name] as ILog; + if (log == null) + { + log = new TraceLogger(name, _Level, _showDateTime, _showLogName, _dateTimeFormat); + _logs.Add(name, log); + } + + return log; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Logging/LogSetting.cs b/ORBatis.Common/Logging/LogSetting.cs new file mode 100644 index 0000000..c636830 --- /dev/null +++ b/ORBatis.Common/Logging/LogSetting.cs @@ -0,0 +1,63 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 471480 $ + * $Date: 2006-11-05 11:00:23 -0700 (Sun, 05 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections.Specialized; + +namespace IBatisNet.Common.Logging +{ + /// + /// Container used to hold configuration information from config file. + /// + public class LogSetting + { + /// + /// + /// + /// The type + /// that will be used for creating + /// + /// + /// Additional user supplied properties that are passed to the + /// 's constructor. + /// + public LogSetting(Type factoryAdapterType, NameValueCollection properties) + { + FactoryAdapterType = factoryAdapterType; + Properties = properties; + } + + /// + /// The type that will be used for creating + /// instances. + /// + public Type FactoryAdapterType { get; } + + /// + /// Additional user supplied properties that are passed to the 's constructor. + /// + public NameValueCollection Properties { get; } + } +} \ No newline at end of file diff --git a/ORBatis.Common/ORBatis.Common.csproj b/ORBatis.Common/ORBatis.Common.csproj new file mode 100644 index 0000000..252726f --- /dev/null +++ b/ORBatis.Common/ORBatis.Common.csproj @@ -0,0 +1,7 @@ + + + + netstandard2.0 + IBatisNet.Common + + diff --git a/ORBatis.Common/Pagination/IPaginatedList.cs b/ORBatis.Common/Pagination/IPaginatedList.cs new file mode 100644 index 0000000..67f620c --- /dev/null +++ b/ORBatis.Common/Pagination/IPaginatedList.cs @@ -0,0 +1,113 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; + +namespace IBatisNet.Common.Pagination +{ + /// + /// Summary description for IPaginatedList. + /// + public interface IPaginatedList : IList, IEnumerator + { + /// + /// The maximum number of items per page. + /// + int PageSize { get; } + + + /// + /// Is the current page the first page ? + /// True if the current page is the first page or if only + /// a single page exists. + /// + bool IsFirstPage { get; } + + + /// + /// Is the current page a middle page (i.e. not first or last) ? + /// Return True if the current page is not the first or last page, + /// and more than one page exists (always returns false if only a + /// single page exists). + /// + bool IsMiddlePage { get; } + + + /// + /// Is the current page the last page ? + /// Return True if the current page is the last page or if only + /// a single page exists. + /// + bool IsLastPage { get; } + + + /// + /// Is a page available after the current page ? + /// Return True if the next page is available + /// + bool IsNextPageAvailable { get; } + + + /// + /// Is a page available before the current page ? + /// Return True if the previous page is available + /// + bool IsPreviousPageAvailable { get; } + + + /// + /// Returns the current page index, which is a zero based integer. + /// All paginated list implementations should know what index they are + /// on, even if they don't know the ultimate boundaries (min/max) + /// + int PageIndex { get; } + + + /// + /// Moves to the next page after the current page. If the current + /// page is the last page, wrap to the first page. + /// + /// + bool NextPage(); + + + /// + /// Moves to the page before the current page. If the current + /// page is the first page, wrap to the last page. + /// + /// + bool PreviousPage(); + + + /// + /// Moves to a specified page. If the specified + /// page is beyond the last page, wrap to the first page. + /// If the specified page is before the first page, wrap + /// to the last page. + /// + /// The index of the specified page. + void GotoPage(int pageIndex); + } +} \ No newline at end of file diff --git a/ORBatis.Common/Pagination/PaginatedArrayList.cs b/ORBatis.Common/Pagination/PaginatedArrayList.cs new file mode 100644 index 0000000..ef2e812 --- /dev/null +++ b/ORBatis.Common/Pagination/PaginatedArrayList.cs @@ -0,0 +1,361 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Collections; +#endregion + + +namespace IBatisNet.Common.Pagination +{ + /// + /// Summary description for PaginatedArrayList. + /// + public class PaginatedArrayList : IPaginatedList + { + #region Properties + /// + /// + public bool IsEmpty => _page.Count == 0; + #endregion + + #region IEnumerable Members + /// + /// + /// + public IEnumerator GetEnumerator() + { + return _page.GetEnumerator(); + } + #endregion + + #region Fields + private static readonly ArrayList _emptyList = new ArrayList(); + + private readonly IList _list; + private IList _page; + #endregion + + #region Constructor (s) / Destructor + /// + /// + /// + public PaginatedArrayList(int pageSize) + { + PageSize = pageSize; + PageIndex = 0; + _list = new ArrayList(); + Repaginate(); + } + + /// + /// + /// + /// + public PaginatedArrayList(int initialCapacity, int pageSize) + { + PageSize = pageSize; + PageIndex = 0; + _list = new ArrayList(initialCapacity); + Repaginate(); + } + + /// + /// + /// + /// + public PaginatedArrayList(ICollection c, int pageSize) + { + PageSize = pageSize; + PageIndex = 0; + _list = new ArrayList(c); + Repaginate(); + } + #endregion + + #region Methods + /// + /// + private void Repaginate() + { + if (_list.Count == 0) + { + _page = _emptyList; + } + else + { + var start = PageIndex * PageSize; + var end = start + PageSize - 1; + if (end >= _list.Count) end = _list.Count - 1; + if (start >= _list.Count) + { + PageIndex = 0; + Repaginate(); + } + else if (start < 0) + { + PageIndex = _list.Count / PageSize; + if (_list.Count % PageSize == 0) PageIndex--; + Repaginate(); + } + else + { + _page = SubList(_list, start, end + 1); + } + } + } + + + /// + /// Provides a view of the IList pramaeter + /// from the specified position + /// to the specified position . + /// + /// The IList elements. + /// Starting position for the view of elements. + /// Ending position for the view of elements. + /// + /// A view of list. + /// + /// + /// The list that is returned is just a view, it is still backed + /// by the orignal list. Any changes you make to it will be + /// reflected in the orignal list. + /// + private IList SubList(IList list, int fromIndex, int toIndex) + { + return ((ArrayList)list).GetRange(fromIndex, toIndex - fromIndex); + } + #endregion + + #region IPaginatedList Members + /// + /// + public int PageSize { get; } + + /// + /// + public bool IsFirstPage => PageIndex == 0; + + /// + /// + public bool IsMiddlePage => !(IsFirstPage || IsLastPage); + + /// + /// + public bool IsLastPage => _list.Count - (PageIndex + 1) * PageSize < 1; + + /// + /// + public bool IsNextPageAvailable => !IsLastPage; + + /// + /// + public bool IsPreviousPageAvailable => !IsFirstPage; + + /// + /// + /// + public bool NextPage() + { + if (IsNextPageAvailable) + { + PageIndex++; + Repaginate(); + return true; + } + + return false; + } + + /// + /// + /// + public bool PreviousPage() + { + if (IsPreviousPageAvailable) + { + PageIndex--; + Repaginate(); + return true; + } + + return false; + } + + /// + /// + /// + public void GotoPage(int pageIndex) + { + PageIndex = pageIndex; + Repaginate(); + } + + /// + /// + public int PageIndex { get; private set; } + #endregion + + #region IList Members + /// + /// + public bool IsReadOnly => _list.IsReadOnly; + + /// + /// + public object this[int index] + { + get => _page[index]; + set + { + _list[index] = value; + Repaginate(); + } + } + + /// + /// + /// + public void RemoveAt(int index) + { + _list.RemoveAt(index); + Repaginate(); + } + + /// + /// + /// + /// + public void Insert(int index, object value) + { + _list.Insert(index, value); + Repaginate(); + } + + /// + /// + /// + public void Remove(object value) + { + _list.Remove(value); + Repaginate(); + } + + /// + /// + /// + /// + public bool Contains(object value) + { + return _page.Contains(value); + } + + /// + /// + public void Clear() + { + _list.Clear(); + Repaginate(); + } + + /// + /// + /// + /// + public int IndexOf(object value) + { + return _page.IndexOf(value); + } + + /// + /// + /// + /// + public int Add(object value) + { + var i = _list.Add(value); + Repaginate(); + return i; + } + + /// + /// + public bool IsFixedSize => _list.IsFixedSize; + #endregion + + #region ICollection Members + /// + /// + public bool IsSynchronized => _page.IsSynchronized; + + /// + /// + public int Count => _page.Count; + + /// + /// + /// + /// + public void CopyTo(Array array, int index) + { + _page.CopyTo(array, index); + } + + /// + /// + public object SyncRoot => _page.SyncRoot; + #endregion + + #region IEnumerator Members + /// + /// Sets the enumerator to its initial position, + /// which is before the first element in the collection. + /// + public void Reset() + { + _page.GetEnumerator().Reset(); + } + + /// + /// Gets the current element in the page. + /// + public object Current => _page.GetEnumerator().Current; + + /// + /// Advances the enumerator to the next element of the collection. + /// + /// + /// true if the enumerator was successfully advanced to the next element; + /// false if the enumerator has passed the end of the collection. + /// + public bool MoveNext() + { + return _page.GetEnumerator().MoveNext(); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/ProviderDeSerializer.cs b/ORBatis.Common/ProviderDeSerializer.cs new file mode 100644 index 0000000..8811a29 --- /dev/null +++ b/ORBatis.Common/ProviderDeSerializer.cs @@ -0,0 +1,74 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 512878 $ + * $LastChangedDate: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Xml; +using IBatisNet.Common.Xml; +#endregion + +namespace IBatisNet.Common +{ + /// + /// Summary description for ProviderDeSerializer. + /// + public sealed class ProviderDeSerializer + { + /// + /// Deserializes the specified node in a . + /// + /// The node. + /// The + public static IDbProvider Deserialize(XmlNode node) + { + IDbProvider provider = new DbProvider(); + var prop = NodeUtils.ParseAttributes(node); + + provider.AssemblyName = prop["assemblyName"]; + provider.CommandBuilderClass = prop["commandBuilderClass"]; + provider.DbCommandClass = prop["commandClass"]; + provider.DbCommandTimeout = NodeUtils.GetIntAttribute(prop, "commandTimeout", 30); + provider.DbConnectionClass = prop["connectionClass"]; + provider.ConnectionAdapterClass = prop["connectionAdapterClass"]; + provider.DataAdapterClass = prop["dataAdapterClass"]; + provider.Description = prop["description"]; + provider.IsDefault = NodeUtils.GetBooleanAttribute(prop, "default", false); + provider.IsEnabled = NodeUtils.GetBooleanAttribute(prop, "enabled", true); + provider.Name = prop["name"]; + provider.ParameterDbTypeClass = prop["parameterDbTypeClass"]; + provider.ParameterDbTypeProperty = prop["parameterDbTypeProperty"]; + provider.ParameterPrefix = prop["parameterPrefix"]; + provider.SetDbParameterPrecision = NodeUtils.GetBooleanAttribute(prop, "setDbParameterPrecision", true); + provider.SetDbParameterScale = NodeUtils.GetBooleanAttribute(prop, "setDbParameterScale", true); + provider.SetDbParameterSize = NodeUtils.GetBooleanAttribute(prop, "setDbParameterSize", true); + provider.UseDeriveParameters = NodeUtils.GetBooleanAttribute(prop, "useDeriveParameters", true); + provider.UseParameterPrefixInParameter = NodeUtils.GetBooleanAttribute(prop, "useParameterPrefixInParameter", true); + provider.UseParameterPrefixInSql = NodeUtils.GetBooleanAttribute(prop, "useParameterPrefixInSql", true); + provider.UsePositionalParameters = NodeUtils.GetBooleanAttribute(prop, "usePositionalParameters", false); + provider.AllowMARS = NodeUtils.GetBooleanAttribute(prop, "allowMARS", false); + + return provider; + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/DBHelperParameterCache.cs b/ORBatis.Common/Utilities/DBHelperParameterCache.cs new file mode 100644 index 0000000..a0fa027 --- /dev/null +++ b/ORBatis.Common/Utilities/DBHelperParameterCache.cs @@ -0,0 +1,242 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 591621 $ + * $Date: 2007-11-03 07:44:57 -0600 (Sat, 03 Nov 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Data; +using System.Reflection; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities +{ + /// + /// DBHelperParameterCache provides functions to leverage a + /// static cache of procedure parameters, and the + /// ability to discover parameters for stored procedures at run-time. + /// + public sealed class DBHelperParameterCache + { + private readonly Hashtable _paramCache = Hashtable.Synchronized(new Hashtable()); + + /// + /// Initializes a new instance of the class. + /// + public DBHelperParameterCache() { } + + #region private methods + /// + /// Resolve at run time the appropriate set of Parameters for a stored procedure + /// + /// An IDalSession object + /// the name of the stored procedure + /// whether or not to include their return value parameter + /// + private IDataParameter[] DiscoverSpParameterSet(IDalSession session, string spName, bool includeReturnValueParameter) + { + return InternalDiscoverSpParameterSet( + session, + spName, + includeReturnValueParameter); + } + + + /// + /// Discover at run time the appropriate set of Parameters for a stored procedure + /// + /// An IDalSession object + /// Name of the stored procedure. + /// if set to true [include return value parameter]. + /// The stored procedure parameters. + private IDataParameter[] InternalDiscoverSpParameterSet(IDalSession session, string spName, + bool includeReturnValueParameter) + { + // SqlCommandBuilder.DeriveParameters() does not support transactions. + // If the command is within a transaction, you will get the following error: + // �SqlCommandBuilder Execute requires the command to have a transaction object + // when the connection assigned to the command is in a pending local transaction� + // even when the command object does in fact have a transaction object. + using (var connection = session.DataSource.DbProvider.CreateConnection()) + { + connection.ConnectionString = session.DataSource.ConnectionString; + connection.Open(); + using (var cmd = connection.CreateCommand()) + { + cmd.CommandType = CommandType.StoredProcedure; + cmd.CommandText = spName; + + // The session connection object is always created but the connection is not alwys open + // so we try to open it in case. + session.OpenConnection(); + + DeriveParameters(session.DataSource.DbProvider, cmd); + + if (cmd.Parameters.Count > 0) + { + var firstParameter = (IDataParameter)cmd.Parameters[0]; + if (firstParameter.Direction == ParameterDirection.ReturnValue) + if (!includeReturnValueParameter) + cmd.Parameters.RemoveAt(0); + } + + + var discoveredParameters = new IDataParameter[cmd.Parameters.Count]; + cmd.Parameters.CopyTo(discoveredParameters, 0); + return discoveredParameters; + } + } + } + + private void DeriveParameters(IDbProvider provider, IDbCommand command) + { + Type commandBuilderType; + + // Find the CommandBuilder + if (provider == null) + throw new ArgumentNullException("provider"); + if (provider.CommandBuilderClass == null || provider.CommandBuilderClass.Length < 1) + throw new Exception(string.Format( + "CommandBuilderClass not defined for provider \"{0}\".", + provider.Name)); + commandBuilderType = provider.CommandBuilderType; + + // Invoke the static DeriveParameter method on the CommandBuilder class + // NOTE: OracleCommandBuilder has no DeriveParameter method + try + { + commandBuilderType.InvokeMember("DeriveParameters", + BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, null, + new object[] { command }); + } + catch (Exception ex) + { + throw new IBatisNetException("Could not retrieve parameters for the store procedure named " + command.CommandText, ex); + } + } + + /// + /// Deep copy of cached IDataParameter array. + /// + /// + /// + private IDataParameter[] CloneParameters(IDataParameter[] originalParameters) + { + var clonedParameters = new IDataParameter[originalParameters.Length]; + + var length = originalParameters.Length; + for (int i = 0, j = length; i < j; i++) clonedParameters[i] = (IDataParameter)((ICloneable)originalParameters[i]).Clone(); + + return clonedParameters; + } + #endregion private methods, variables, and constructors + + #region caching functions + /// + /// Add parameter array to the cache + /// + /// a valid connection string for an IDbConnection + /// the stored procedure name or SQL command + /// an array of IDataParameters to be cached + public void CacheParameterSet(string connectionString, string commandText, params IDataParameter[] commandParameters) + { + var hashKey = connectionString + ":" + commandText; + + _paramCache[hashKey] = commandParameters; + } + + + /// + /// Clear the parameter cache. + /// + public void Clear() + { + _paramCache.Clear(); + } + + /// + /// retrieve a parameter array from the cache + /// + /// a valid connection string for an IDbConnection + /// the stored procedure name or SQL command + /// an array of IDataParameters + public IDataParameter[] GetCachedParameterSet(string connectionString, string commandText) + { + var hashKey = connectionString + ":" + commandText; + + var cachedParameters = (IDataParameter[])_paramCache[hashKey]; + + if (cachedParameters == null) return null; + + return CloneParameters(cachedParameters); + } + #endregion caching functions + + #region Parameter Discovery Functions + /// + /// Retrieves the set of IDataParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid session + /// the name of the stored procedure + /// an array of IDataParameters + public IDataParameter[] GetSpParameterSet(IDalSession session, string spName) + { + return GetSpParameterSet(session, spName, false); + } + + /// + /// Retrieves the set of IDataParameters appropriate for the stored procedure + /// + /// + /// This method will query the database for this information, and then store it in a cache for future requests. + /// + /// a valid session + /// the name of the stored procedure + /// + /// a bool value indicating whether the return value parameter should be included + /// in the results + /// + /// an array of IDataParameters + public IDataParameter[] GetSpParameterSet(IDalSession session, + string spName, bool includeReturnValueParameter) + { + var hashKey = session.DataSource.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter" : ""); + + IDataParameter[] cachedParameters; + + cachedParameters = (IDataParameter[])_paramCache[hashKey]; + + if (cachedParameters == null) + { + _paramCache[hashKey] = DiscoverSpParameterSet(session, spName, includeReturnValueParameter); + cachedParameters = (IDataParameter[])_paramCache[hashKey]; + } + + return CloneParameters(cachedParameters); + } + #endregion Parameter Discovery Functions + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/HashCodeProvider.cs b/ORBatis.Common/Utilities/HashCodeProvider.cs new file mode 100644 index 0000000..825cf25 --- /dev/null +++ b/ORBatis.Common/Utilities/HashCodeProvider.cs @@ -0,0 +1,62 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 512878 $ + * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Reflection; +#endregion + +namespace IBatisNet.Common.Utilities +{ + /// + /// Summary description for HashCodeProvider. + /// + public sealed class HashCodeProvider + { + private static readonly MethodInfo getHashCodeMethodInfo; + + static HashCodeProvider() + { + var type = typeof(object); + getHashCodeMethodInfo = type.GetMethod("GetHashCode"); + } + + /// + /// Supplies a hash code for an object. + /// + /// The object. + /// A hash code + /// + /// Buggy in .NET V1.0 + /// .NET Fx v1.1 Update: + /// As of v1.1 of the framework, there is a method System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(object) + /// that does this as well. + /// I will not use to Keep compatiblity with .NET V1.0 + /// + public static int GetIdentityHashCode(object obj) + { + return (int)getHashCodeMethodInfo.Invoke(obj, null); + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/AbstractFactory.cs b/ORBatis.Common/Utilities/Objects/AbstractFactory.cs new file mode 100644 index 0000000..63f4b30 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/AbstractFactory.cs @@ -0,0 +1,67 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-31 11:40:07 -0600 (Wed, 31 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A implementation that for abstract type + /// + public class AbstractFactory : IFactory + { + private readonly Type _typeToCreate; + + /// + /// Initializes a new instance of the class. + /// + /// The type to create. + public AbstractFactory(Type typeToCreate) + { + _typeToCreate = typeToCreate; + } + + #region IFactory Members + /// + /// Create a new instance with the specified parameters + /// + /// + /// An array of values that matches the number, order and type + /// of the parameters for this constructor. + /// + /// A new instance + /// + /// If you call a constructor with no parameters, pass null. + /// Anyway, what you pass will be ignore. + /// + public object CreateInstance(object[] parameters) + { + throw new ProbeException( + string.Format("Unable to optimize create instance. Cause : Could not find public constructor on the abstract type \"{0}\".", _typeToCreate.Name)); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/ActivatorFactory.cs b/ORBatis.Common/Utilities/Objects/ActivatorFactory.cs new file mode 100644 index 0000000..af2b7f3 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/ActivatorFactory.cs @@ -0,0 +1,64 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// Create objects via Activator.CreateInstance + /// + public sealed class ActivatorFactory : IFactory + { + private readonly Type _typeToCreate; + + /// + /// + /// + public ActivatorFactory(Type typeToCreate) + { + _typeToCreate = typeToCreate; + } + + #region IFactory members + /// + /// Create a new instance with the specified parameters + /// + /// + /// An array of values that matches the number, order and type + /// of the parameters for this constructor. + /// + /// + /// If you call a constructor with no parameters, pass null. + /// Anyway, what you pass will be ignore. + /// + /// A new instance + public object CreateInstance(object[] parameters) + { + return Activator.CreateInstance(_typeToCreate, parameters); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/ActivatorObjectFactory.cs b/ORBatis.Common/Utilities/Objects/ActivatorObjectFactory.cs new file mode 100644 index 0000000..a0b1bca --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/ActivatorObjectFactory.cs @@ -0,0 +1,49 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A implementation that can create objects + /// via Activator.CreateInstance + /// + public class ActivatorObjectFactory : IObjectFactory + { + #region IObjectFactory members + /// + /// Create a new see instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new instance. + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + return new ActivatorFactory(typeToCreate); + } + #endregion + } +} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/Objects/BoxingOpCodes.cs b/ORBatis.Common/Utilities/Objects/BoxingOpCodes.cs similarity index 82% rename from src/IBatisNet.Common/Utilities/Objects/BoxingOpCodes.cs rename to ORBatis.Common/Utilities/Objects/BoxingOpCodes.cs index 10a7f69..6888c24 100644 --- a/src/IBatisNet.Common/Utilities/Objects/BoxingOpCodes.cs +++ b/ORBatis.Common/Utilities/Objects/BoxingOpCodes.cs @@ -3,44 +3,42 @@ * $Revision: 374175 $ * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ * $LastChangedBy: gbayon $ - * + * * iBATIS.NET Data Mapper * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * ********************************************************************************/ #endregion using System; using System.Collections; -using System.Reflection; using System.Reflection.Emit; -using IBatisNet.Common.Exceptions; namespace IBatisNet.Common.Utilities.Objects { - /// - /// Helper class that returns appropriate boxing opcode based on type - /// + /// + /// Helper class that returns appropriate boxing opcode based on type + /// /// From Spring.NET public sealed class BoxingOpCodes { - private static IDictionary boxingOpCodes; + private static readonly IDictionary boxingOpCodes; /// - /// Initializes the class. + /// Initializes the class. /// static BoxingOpCodes() { @@ -60,18 +58,14 @@ static BoxingOpCodes() } /// - /// Gets the . + /// Gets the . /// /// The type. /// public static OpCode GetOpCode(Type type) { - if (type.IsEnum) - { - type = Enum.GetUnderlyingType(type); - } + if (type.IsEnum) type = Enum.GetUnderlyingType(type); return (OpCode)boxingOpCodes[type]; } - } -} +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/IFactory.cs b/ORBatis.Common/Utilities/Objects/IFactory.cs new file mode 100644 index 0000000..0ce64f6 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/IFactory.cs @@ -0,0 +1,47 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// Factory to create object for a given type + /// + public interface IFactory + { + /// + /// Create a new instance with the specified parameters + /// + /// + /// An array of values that matches the number, order and type + /// of the parameters for this constructor. + /// + /// + /// If you call a constructor with no parameters, pass null. + /// Anyway, what you pass will be ignore. + /// + /// A new instance + object CreateInstance(object[] parameters); + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/IObjectFactory.cs b/ORBatis.Common/Utilities/Objects/IObjectFactory.cs new file mode 100644 index 0000000..9fce316 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/IObjectFactory.cs @@ -0,0 +1,43 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A factory that can create objects + /// + public interface IObjectFactory + { + /// + /// Create a new instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new see cref="IFactory"/> instance + IFactory CreateFactory(Type typeToCreate, Type[] types); + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/AccessorFactory.cs b/ORBatis.Common/Utilities/Objects/Members/AccessorFactory.cs new file mode 100644 index 0000000..e750ad9 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/AccessorFactory.cs @@ -0,0 +1,55 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// Accessor factory + /// + public class AccessorFactory + { + /// + /// Initializes a new instance of the class. + /// + /// The set accessor factory. + /// The get accessor factory. + public AccessorFactory(ISetAccessorFactory setAccessorFactory, + IGetAccessorFactory getAccessorFactory) + { + SetAccessorFactory = setAccessorFactory; + GetAccessorFactory = getAccessorFactory; + } + + /// + /// The factory which build + /// + public ISetAccessorFactory SetAccessorFactory { get; } + + /// + /// The factory which build + /// + public IGetAccessorFactory GetAccessorFactory { get; } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/BaseAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/BaseAccessor.cs new file mode 100644 index 0000000..465b45a --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/BaseAccessor.cs @@ -0,0 +1,155 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// Abstract base class for member accessor + /// + public abstract class BaseAccessor + { + /// + /// List of type-opCode + /// + protected static IDictionary typeToOpcode = new HybridDictionary(); + + /// + /// The null internal value used by this member type + /// + protected object nullInternal = null; + + /// + /// The property name + /// + protected string propertyName = string.Empty; + + /// + /// The target type + /// + protected Type targetType = null; + + /// + /// Static constructor + /// "Initialize a private IDictionary with type-opCode pairs + /// + static BaseAccessor() + { + typeToOpcode[typeof(sbyte)] = OpCodes.Ldind_I1; + typeToOpcode[typeof(byte)] = OpCodes.Ldind_U1; + typeToOpcode[typeof(char)] = OpCodes.Ldind_U2; + typeToOpcode[typeof(short)] = OpCodes.Ldind_I2; + typeToOpcode[typeof(ushort)] = OpCodes.Ldind_U2; + typeToOpcode[typeof(int)] = OpCodes.Ldind_I4; + typeToOpcode[typeof(uint)] = OpCodes.Ldind_U4; + typeToOpcode[typeof(long)] = OpCodes.Ldind_I8; + typeToOpcode[typeof(ulong)] = OpCodes.Ldind_I8; + typeToOpcode[typeof(bool)] = OpCodes.Ldind_I1; + typeToOpcode[typeof(double)] = OpCodes.Ldind_R8; + typeToOpcode[typeof(float)] = OpCodes.Ldind_R4; + } + + + /// + /// Gets the property info. + /// + /// The target type. + /// + protected PropertyInfo GetPropertyInfo(Type target) + { + PropertyInfo propertyInfo = null; + + propertyInfo = target.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (propertyInfo == null) + { + if (target.IsInterface) + // JIRA 210 + // Fix for interface inheriting + // Loop through interfaces of the type + foreach (var interfaceType in target.GetInterfaces()) + { + // Get propertyinfo and if found the break out of loop + propertyInfo = GetPropertyInfo(interfaceType); + if (propertyInfo != null) break; + } + else + // deals with Overriding a property using new and reflection + // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx + propertyInfo = target.GetProperty(propertyName); + } + + return propertyInfo; + } + + /// + /// Get the null value for a given type + /// + /// + /// + protected object GetNullInternal(Type type) + { + if (type.IsValueType) + { + if (type.IsEnum) return GetNullInternal(Enum.GetUnderlyingType(type)); + + if (type.IsPrimitive) + { + if (type == typeof(int)) return 0; + if (type == typeof(double)) return (double)0; + if (type == typeof(short)) return (short)0; + if (type == typeof(sbyte)) return (sbyte)0; + if (type == typeof(long)) return (long)0; + if (type == typeof(byte)) return (byte)0; + if (type == typeof(ushort)) return (ushort)0; + if (type == typeof(uint)) return (uint)0; + if (type == typeof(ulong)) return (ulong)0; + if (type == typeof(ulong)) return (ulong)0; + if (type == typeof(float)) return (float)0; + if (type == typeof(bool)) return false; + if (type == typeof(char)) return '\0'; + } + else + { + //DateTime : 01/01/0001 00:00:00 + //TimeSpan : 00:00:00 + //Guid : 00000000-0000-0000-0000-000000000000 + //Decimal : 0 + + if (type == typeof(DateTime)) return DateTime.MinValue; + if (type == typeof(decimal)) return 0m; + if (type == typeof(Guid)) return Guid.Empty; + if (type == typeof(TimeSpan)) return new TimeSpan(0, 0, 0); + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/IAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/IAccessor.cs similarity index 85% rename from src/IBatisNet.Common/Utilities/Objects/Members/IAccessor.cs rename to ORBatis.Common/Utilities/Objects/Members/IAccessor.cs index 566a0ae..322525d 100644 --- a/src/IBatisNet.Common/Utilities/Objects/Members/IAccessor.cs +++ b/ORBatis.Common/Utilities/Objects/Members/IAccessor.cs @@ -3,23 +3,23 @@ * $Revision: 374175 $ * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ * $LastChangedBy: gbayon $ - * + * * iBATIS.NET Data Mapper * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * ********************************************************************************/ #endregion @@ -28,18 +28,18 @@ namespace IBatisNet.Common.Utilities.Objects.Members { /// - /// The interface defines a field/property contract. + /// The interface defines a field/property contract. /// public interface IAccessor { /// - /// Gets the member name. + /// Gets the member name. /// string Name { get; } /// - /// Gets the type of this member (field or property). + /// Gets the type of this member (field or property). /// Type MemberType { get; } } -} +} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/IGet.cs b/ORBatis.Common/Utilities/Objects/Members/IGet.cs similarity index 84% rename from src/IBatisNet.Common/Utilities/Objects/Members/IGet.cs rename to ORBatis.Common/Utilities/Objects/Members/IGet.cs index fb539db..ffebf1f 100644 --- a/src/IBatisNet.Common/Utilities/Objects/Members/IGet.cs +++ b/ORBatis.Common/Utilities/Objects/Members/IGet.cs @@ -3,23 +3,23 @@ * $Revision: 374175 $ * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ * $LastChangedBy: gbayon $ - * + * * iBATIS.NET Data Mapper * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * ********************************************************************************/ #endregion @@ -27,16 +27,16 @@ namespace IBatisNet.Common.Utilities.Objects.Members { /// - /// The interface defines a field/property get contrat to get the - /// value of a field or a property. + /// The interface defines a field/property get contrat to get the + /// value of a field or a property. /// public interface IGet { /// - /// Gets the value stored in the field/property for the specified target. + /// Gets the value stored in the field/property for the specified target. /// /// Object to retrieve the field/property from. /// The value. object Get(object target); } -} +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/IGetAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/IGetAccessor.cs new file mode 100644 index 0000000..1451f40 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/IGetAccessor.cs @@ -0,0 +1,36 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The interface defines a field/property get accessor. + /// provides Reflection.Emit-generated + /// implementations for drastically improved performance over default late-bind + /// invoke. + /// + public interface IGetAccessor : IAccessor, IGet { } +} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/IGetAccessorFactory.cs b/ORBatis.Common/Utilities/Objects/Members/IGetAccessorFactory.cs similarity index 89% rename from src/IBatisNet.Common/Utilities/Objects/Members/IGetAccessorFactory.cs rename to ORBatis.Common/Utilities/Objects/Members/IGetAccessorFactory.cs index 364f383..043de7f 100644 --- a/src/IBatisNet.Common/Utilities/Objects/Members/IGetAccessorFactory.cs +++ b/ORBatis.Common/Utilities/Objects/Members/IGetAccessorFactory.cs @@ -3,23 +3,23 @@ * $Revision: 374175 $ * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ * $LastChangedBy: gbayon $ - * + * * iBATIS.NET Data Mapper * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * ********************************************************************************/ #endregion @@ -28,16 +28,16 @@ namespace IBatisNet.Common.Utilities.Objects.Members { /// - /// Factory contact to build for a type. + /// Factory contact to build for a type. /// public interface IGetAccessorFactory { /// - /// Generate an instance. + /// Generate an instance. /// /// Target object type. /// Field or Property name. /// null if the generation fail IGetAccessor CreateGetAccessor(Type targetType, string name); } -} +} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/ISet.cs b/ORBatis.Common/Utilities/Objects/Members/ISet.cs similarity index 84% rename from src/IBatisNet.Common/Utilities/Objects/Members/ISet.cs rename to ORBatis.Common/Utilities/Objects/Members/ISet.cs index 9302885..758c7ee 100644 --- a/src/IBatisNet.Common/Utilities/Objects/Members/ISet.cs +++ b/ORBatis.Common/Utilities/Objects/Members/ISet.cs @@ -3,23 +3,23 @@ * $Revision: 374175 $ * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ * $LastChangedBy: gbayon $ - * + * * iBATIS.NET Data Mapper * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * ********************************************************************************/ #endregion @@ -27,16 +27,16 @@ namespace IBatisNet.Common.Utilities.Objects.Members { /// - /// The interface defines a field/property set contrat to set the - /// value on a field or property. + /// The interface defines a field/property set contrat to set the + /// value on a field or property. /// public interface ISet { /// - /// Sets the value for the field/property of the specified target. + /// Sets the value for the field/property of the specified target. /// /// Object to set the field/property on. /// Value. void Set(object target, object value); } -} +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/ISetAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/ISetAccessor.cs new file mode 100644 index 0000000..db3cc30 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/ISetAccessor.cs @@ -0,0 +1,36 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The interface defines a field/property set accessor. + /// provides Reflection.Emit-generated + /// implementations for drastically improved performance over default late-bind + /// invoke. + /// + public interface ISetAccessor : IAccessor, ISet { } +} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/ISetAccessorFactory.cs b/ORBatis.Common/Utilities/Objects/Members/ISetAccessorFactory.cs similarity index 89% rename from src/IBatisNet.Common/Utilities/Objects/Members/ISetAccessorFactory.cs rename to ORBatis.Common/Utilities/Objects/Members/ISetAccessorFactory.cs index bbb1765..e9f27c5 100644 --- a/src/IBatisNet.Common/Utilities/Objects/Members/ISetAccessorFactory.cs +++ b/ORBatis.Common/Utilities/Objects/Members/ISetAccessorFactory.cs @@ -3,23 +3,23 @@ * $Revision: 374175 $ * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ * $LastChangedBy: gbayon $ - * + * * iBATIS.NET Data Mapper * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * ********************************************************************************/ #endregion @@ -28,16 +28,16 @@ namespace IBatisNet.Common.Utilities.Objects.Members { /// - /// Factory contact to build for a type. + /// Factory contact to build for a type. /// public interface ISetAccessorFactory { /// - /// Generate an instance. + /// Generate an instance. /// /// Target object type. /// Field or Property name. /// null if the generation fail ISetAccessor CreateSetAccessor(Type targetType, string name); } -} +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs new file mode 100644 index 0000000..cd0cac0 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs @@ -0,0 +1,72 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-05 22:23:27 +0200 (mer., 05 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an reflection get access + /// to a field of a specified target class. + /// + public sealed class ReflectionFieldGetAccessor : IGetAccessor + { + private readonly FieldInfo _fieldInfo; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target. + /// Name of the field. + public ReflectionFieldGetAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + _fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); + } + + #region IGetAccessor Members + /// + /// Gets the member name. + /// + public string Name => _fieldInfo.Name; + + /// + /// Gets the type of this member, such as field, property. + /// + public Type MemberType => _fieldInfo.FieldType; + + /// + /// Gets the value stored in the field for the specified target. + /// + /// Object to retrieve the field/property from. + /// The field alue. + public object Get(object target) + { + return _fieldInfo.GetValue(target); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs new file mode 100644 index 0000000..e1044bb --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs @@ -0,0 +1,72 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-05 22:23:27 +0200 (mer., 05 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an reflection set access + /// to a field of a specified target class. + /// + public sealed class ReflectionFieldSetAccessor : ISetAccessor + { + private readonly FieldInfo _fieldInfo; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target. + /// Name of the field. + public ReflectionFieldSetAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + _fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); + } + + #region ISetAccessor Members + /// + /// Gets the member name. + /// + public string Name => _fieldInfo.Name; + + /// + /// Gets the type of this member, such as field, property. + /// + public Type MemberType => _fieldInfo.FieldType; + + /// + /// Sets the value for the field of the specified target. + /// + /// Object to set the property on. + /// Property value. + public void Set(object target, object value) + { + _fieldInfo.SetValue(target, value); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs new file mode 100644 index 0000000..fc20b6e --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs @@ -0,0 +1,85 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-05 22:23:27 +0200 (mer., 05 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an reflection get access + /// to a property of a specified target class. + /// + public sealed class ReflectionPropertyGetAccessor : IGetAccessor + { + private readonly PropertyInfo _propertyInfo; + private readonly string _propertyName = string.Empty; + private readonly Type _targetType; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target. + /// Name of the property. + public ReflectionPropertyGetAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + _propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); + + _targetType = targetType; + _propertyName = propertyName; + } + + #region IGet Members + /// + /// Gets the value stored in the property for + /// the specified target. + /// + /// Object to retrieve the property from. + /// Property value. + public object Get(object target) + { + if (_propertyInfo.CanRead) return _propertyInfo.GetValue(target, null); + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a get method.", _propertyName, _targetType)); + } + #endregion + + + #region IAccessor Members + /// + /// Gets the property name. + /// + public string Name => _propertyInfo.Name; + + /// + /// Gets the type of this property. + /// + public Type MemberType => _propertyInfo.PropertyType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs b/ORBatis.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs new file mode 100644 index 0000000..e6f32a1 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs @@ -0,0 +1,84 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 10:41:07 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an reflection set access + /// to a property of a specified target class. + /// + public sealed class ReflectionPropertySetAccessor : ISetAccessor + { + private readonly PropertyInfo _propertyInfo; + private readonly string _propertyName = string.Empty; + private readonly Type _targetType; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target. + /// Name of the property. + public ReflectionPropertySetAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + _propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); + + _targetType = targetType; + _propertyName = propertyName; + } + + #region ISet Members + /// + /// Sets the value for the property of the specified target. + /// + /// Object to set the property on. + /// Property value. + public void Set(object target, object value) + { + if (_propertyInfo.CanWrite) + _propertyInfo.SetValue(target, value, null); + else + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a set method.", _propertyName, _targetType)); + } + #endregion + + #region IAccessor Members + /// + /// Gets the property name. + /// + public string Name => _propertyInfo.Name; + + /// + /// Gets the type of this property. + /// + public Type MemberType => _propertyInfo.PropertyType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/ObjectProbe.cs b/ORBatis.Common/Utilities/Objects/ObjectProbe.cs new file mode 100644 index 0000000..15e8b12 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/ObjectProbe.cs @@ -0,0 +1,692 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 513429 $ + * $Date: 2007-03-01 11:32:25 -0700 (Thu, 01 Mar 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Reflection; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Utilities.Objects.Members; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// Description r�sum�e de ObjectProbe. + /// + public sealed class ObjectProbe + { + private static readonly ArrayList _simpleTypeMap = new ArrayList(); + + static ObjectProbe() + { + _simpleTypeMap.Add(typeof(string)); + _simpleTypeMap.Add(typeof(byte)); + _simpleTypeMap.Add(typeof(short)); + _simpleTypeMap.Add(typeof(char)); + _simpleTypeMap.Add(typeof(int)); + _simpleTypeMap.Add(typeof(long)); + _simpleTypeMap.Add(typeof(float)); + _simpleTypeMap.Add(typeof(double)); + _simpleTypeMap.Add(typeof(bool)); + _simpleTypeMap.Add(typeof(DateTime)); + _simpleTypeMap.Add(typeof(decimal)); + + // _simpleTypeMap.Add(typeof(Hashtable)); + // _simpleTypeMap.Add(typeof(SortedList)); + // _simpleTypeMap.Add(typeof(ArrayList)); + // _simpleTypeMap.Add(typeof(Array)); + + // simpleTypeMap.Add(LinkedList.class); + // simpleTypeMap.Add(HashSet.class); + // simpleTypeMap.Add(TreeSet.class); + // simpleTypeMap.Add(Vector.class); + // simpleTypeMap.Add(Hashtable.class); + _simpleTypeMap.Add(typeof(sbyte)); + _simpleTypeMap.Add(typeof(ushort)); + _simpleTypeMap.Add(typeof(uint)); + _simpleTypeMap.Add(typeof(ulong)); + _simpleTypeMap.Add(typeof(IEnumerator)); + } + + + /// + /// Returns an array of the readable properties names exposed by an object + /// + /// The object + /// The properties name + public static string[] GetReadablePropertyNames(object obj) + { + return ReflectionInfo.GetInstance(obj.GetType()).GetReadableMemberNames(); + } + + + /// + /// Returns an array of the writeable members name exposed by a object + /// + /// The object + /// The members name + public static string[] GetWriteableMemberNames(object obj) + { + return ReflectionInfo.GetInstance(obj.GetType()).GetWriteableMemberNames(); + } + + + /// + /// Returns the type that the set expects to receive as a parameter when + /// setting a member value. + /// + /// The object to check + /// The name of the member + /// The type of the member + public static Type GetMemberTypeForSetter(object obj, string memberName) + { + var type = obj.GetType(); + + if (obj is IDictionary) + { + var map = (IDictionary)obj; + var value = map[memberName]; + if (value == null) + type = typeof(object); + else + type = value.GetType(); + } + else + { + if (memberName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(memberName, "."); + var enumerator = parser.GetEnumerator(); + + while (enumerator.MoveNext()) + { + memberName = (string)enumerator.Current; + type = ReflectionInfo.GetInstance(type).GetSetterType(memberName); + } + } + else + { + type = ReflectionInfo.GetInstance(type).GetSetterType(memberName); + } + } + + return type; + } + + + /// + /// Returns the type that the set expects to receive as a parameter when + /// setting a member value. + /// + /// The class type to check + /// The name of the member + /// The type of the member + public static Type GetMemberTypeForSetter(Type type, string memberName) + { + var memberType = type; + if (memberName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(memberName, "."); + var enumerator = parser.GetEnumerator(); + + while (enumerator.MoveNext()) + { + memberName = (string)enumerator.Current; + memberType = ReflectionInfo.GetInstance(memberType).GetSetterType(memberName); + } + } + else + { + memberType = ReflectionInfo.GetInstance(type).GetSetterType(memberName); + } + + return memberType; + } + + /// + /// Returns the type that the get expects to receive as a parameter when + /// setting a member value. + /// + /// The object to check + /// The name of the member + /// The type of the member + public static Type GetMemberTypeForGetter(object obj, string memberName) + { + var type = obj.GetType(); + + if (obj is IDictionary) + { + var map = (IDictionary)obj; + var value = map[memberName]; + if (value == null) + type = typeof(object); + else + type = value.GetType(); + } + else + { + if (memberName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(memberName, "."); + var enumerator = parser.GetEnumerator(); + + while (enumerator.MoveNext()) + { + memberName = (string)enumerator.Current; + type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); + } + } + else + { + type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); + } + } + + return type; + } + + + /// + /// Returns the type that the get expects to receive as a parameter when + /// setting a member value. + /// + /// The type to check + /// The name of the member + /// The type of the member + public static Type GetMemberTypeForGetter(Type type, string memberName) + { + if (memberName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(memberName, "."); + var enumerator = parser.GetEnumerator(); + + while (enumerator.MoveNext()) + { + memberName = (string)enumerator.Current; + type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); + } + } + else + { + type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); + } + + return type; + } + + + /// + /// Returns the MemberInfo of the set member on the specified type. + /// + /// The type to check + /// The name of the member + /// The type of the member + public static MemberInfo GetMemberInfoForSetter(Type type, string memberName) + { + MemberInfo memberInfo = null; + if (memberName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(memberName, "."); + var enumerator = parser.GetEnumerator(); + Type parentType = null; + + while (enumerator.MoveNext()) + { + memberName = (string)enumerator.Current; + parentType = type; + type = ReflectionInfo.GetInstance(type).GetSetterType(memberName); + } + + memberInfo = ReflectionInfo.GetInstance(parentType).GetSetter(memberName); + } + else + { + memberInfo = ReflectionInfo.GetInstance(type).GetSetter(memberName); + } + + return memberInfo; + } + + + /// + /// Gets the value of an array member on the specified object. + /// + /// The obj. + /// The array index. + /// The accessor factory. + /// The member value. + private static object GetArrayMember(object obj, string indexedName, + AccessorFactory accessorFactory) + { + object value = null; + + try + { + var startIndex = indexedName.IndexOf("["); + var length = indexedName.IndexOf("]"); + var name = indexedName.Substring(0, startIndex); + var index = indexedName.Substring(startIndex + 1, length - (startIndex + 1)); + var i = Convert.ToInt32(index); + + if (name.Length > 0) + value = GetMember(obj, name, accessorFactory); + else + value = obj; + + if (value is IList) + value = ((IList)value)[i]; + else + throw new ProbeException("The '" + name + "' member of the " + obj.GetType().Name + " class is not a List or Array."); + } + catch (ProbeException pe) + { + throw pe; + } + catch (Exception e) + { + throw new ProbeException("Error getting ordinal value from .net object. Cause" + e.Message, e); + } + + return value; + } + + /// + /// Sets the array member. + /// + /// The obj. + /// Name of the indexed. + /// The value. + /// The accessor factory. + private static void SetArrayMember(object obj, string indexedName, object value, + AccessorFactory accessorFactory) + { + try + { + var startIndex = indexedName.IndexOf("["); + var length = indexedName.IndexOf("]"); + var name = indexedName.Substring(0, startIndex); + var index = indexedName.Substring(startIndex + 1, length - (startIndex + 1)); + var i = Convert.ToInt32(index); + + object list = null; + if (name.Length > 0) + list = GetMember(obj, name, accessorFactory); + else + list = obj; + + if (list is IList) + ((IList)list)[i] = value; + else + throw new ProbeException("The '" + name + "' member of the " + obj.GetType().Name + " class is not a List or Array."); + } + catch (ProbeException pe) + { + throw pe; + } + catch (Exception e) + { + throw new ProbeException("Error getting ordinal value from .net object. Cause" + e.Message, e); + } + } + + + /// + /// Return the specified member on an object. + /// + /// The Object on which to invoke the specified property. + /// Name of the member. + /// The accessor factory. + /// An Object representing the return value of the invoked property. + public static object GetMemberValue(object obj, string memberName, + AccessorFactory accessorFactory) + { + if (memberName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(memberName, "."); + var enumerator = parser.GetEnumerator(); + var value = obj; + string token = null; + + while (enumerator.MoveNext()) + { + token = (string)enumerator.Current; + value = GetMember(value, token, accessorFactory); + + if (value == null) break; + } + + return value; + } + + return GetMember(obj, memberName, accessorFactory); + } + + + /// + /// Gets the member's value on the specified object. + /// + /// The obj. + /// Name of the member. + /// The accessor factory. + /// The member's value + public static object GetMember(object obj, string memberName, + AccessorFactory accessorFactory) + { + try + { + object value = null; + + if (memberName.IndexOf("[") > -1) + { + value = GetArrayMember(obj, memberName, accessorFactory); + } + else + { + if (obj is IDictionary) + { + value = ((IDictionary)obj)[memberName]; + } + else + { + var targetType = obj.GetType(); + var getAccessorFactory = accessorFactory.GetAccessorFactory; + var getAccessor = getAccessorFactory.CreateGetAccessor(targetType, memberName); + + if (getAccessor == null) throw new ProbeException("No Get method for member " + memberName + " on instance of " + obj.GetType().Name); + try + { + value = getAccessor.Get(obj); + } + catch (Exception ae) + { + throw new ProbeException(ae); + } + } + } + + return value; + } + catch (ProbeException pe) + { + throw pe; + } + catch (Exception e) + { + throw new ProbeException("Could not Set property '" + memberName + "' for " + obj.GetType().Name + ". Cause: " + e.Message, e); + } + } + + /// + /// Sets the member value. + /// + /// he Object on which to invoke the specified mmber. + /// Name of the member. + /// The member value. + /// The object factory. + /// The accessor factory. + public static void SetMemberValue(object obj, string memberName, object memberValue, + IObjectFactory objectFactory, + AccessorFactory accessorFactory) + { + if (memberName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(memberName, "."); + var enumerator = parser.GetEnumerator(); + enumerator.MoveNext(); + + var currentPropertyName = (string)enumerator.Current; + var child = obj; + + while (enumerator.MoveNext()) + { + var type = GetMemberTypeForSetter(child, currentPropertyName); + var parent = child; + child = GetMember(parent, currentPropertyName, accessorFactory); + if (child == null) + try + { + var factory = objectFactory.CreateFactory(type, Type.EmptyTypes); + child = factory.CreateInstance(Type.EmptyTypes); + + SetMemberValue(parent, currentPropertyName, child, objectFactory, accessorFactory); + } + catch (Exception e) + { + throw new ProbeException("Cannot set value of property '" + memberName + "' because '" + currentPropertyName + "' is null and cannot be instantiated on instance of " + type.Name + ". Cause:" + e.Message, e); + } + + currentPropertyName = (string)enumerator.Current; + } + + SetMember(child, currentPropertyName, memberValue, accessorFactory); + } + else + { + SetMember(obj, memberName, memberValue, accessorFactory); + } + } + + + /// + /// Sets the member. + /// + /// The obj. + /// Name of the member. + /// The member value. + /// The accessor factory. + public static void SetMember(object obj, string memberName, object memberValue, + AccessorFactory accessorFactory) + { + try + { + if (memberName.IndexOf("[") > -1) + { + SetArrayMember(obj, memberName, memberValue, accessorFactory); + } + else + { + if (obj is IDictionary) + { + ((IDictionary)obj)[memberName] = memberValue; + } + else + { + var targetType = obj.GetType(); + var setAccessorFactory = accessorFactory.SetAccessorFactory; + var setAccessor = setAccessorFactory.CreateSetAccessor(targetType, memberName); + + if (setAccessor == null) throw new ProbeException("No Set method for member " + memberName + " on instance of " + obj.GetType().Name); + try + { + setAccessorFactory.CreateSetAccessor(targetType, memberName).Set(obj, memberValue); + } + catch (Exception ex) + { + throw new ProbeException(ex); + } + } + } + } + catch (ProbeException pe) + { + throw pe; + } + catch (Exception e) + { + throw new ProbeException("Could not Get property '" + memberName + "' for " + obj.GetType().Name + ". Cause: " + e.Message, e); + } + } + + + /// + /// Checks to see if a Object has a writable property/field be a given name + /// + /// The object to check + /// The property to check for + /// True if the property exists and is writable + public static bool HasWritableProperty(object obj, string propertyName) + { + var hasProperty = false; + if (obj is IDictionary) + { + hasProperty = ((IDictionary)obj).Contains(propertyName); + } + else + { + if (propertyName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(propertyName, "."); + var enumerator = parser.GetEnumerator(); + var type = obj.GetType(); + + while (enumerator.MoveNext()) + { + propertyName = (string)enumerator.Current; + type = ReflectionInfo.GetInstance(type).GetGetterType(propertyName); + hasProperty = ReflectionInfo.GetInstance(type).HasWritableMember(propertyName); + } + } + else + { + hasProperty = ReflectionInfo.GetInstance(obj.GetType()).HasWritableMember(propertyName); + } + } + + return hasProperty; + } + + + /// + /// Checks to see if the Object have a property/field be a given name. + /// + /// The Object on which to invoke the specified property. + /// The name of the property to check for. + /// + /// True or false if the property exists and is readable. + /// + public static bool HasReadableProperty(object obj, string propertyName) + { + var hasProperty = false; + + if (obj is IDictionary) + { + hasProperty = ((IDictionary)obj).Contains(propertyName); + } + else + { + if (propertyName.IndexOf('.') > -1) + { + var parser = new StringTokenizer(propertyName, "."); + var enumerator = parser.GetEnumerator(); + var type = obj.GetType(); + + while (enumerator.MoveNext()) + { + propertyName = (string)enumerator.Current; + type = ReflectionInfo.GetInstance(type).GetGetterType(propertyName); + hasProperty = ReflectionInfo.GetInstance(type).HasReadableMember(propertyName); + } + } + else + { + hasProperty = ReflectionInfo.GetInstance(obj.GetType()).HasReadableMember(propertyName); + } + } + + return hasProperty; + } + + /// + /// + /// + /// + public static bool IsSimpleType(Type type) + { + if (_simpleTypeMap.Contains(type)) return true; + + if (typeof(ICollection).IsAssignableFrom(type)) return true; + + if (typeof(IDictionary).IsAssignableFrom(type)) return true; + + if (typeof(IList).IsAssignableFrom(type)) return true; + + if (typeof(IEnumerable).IsAssignableFrom(type)) return true; + + return false; + } + + +// /// +// /// Calculates a hash code for all readable properties of a object. +// /// +// /// The object to calculate the hash code for. +// /// The hash code. +// public static int ObjectHashCode(object obj) +// { +// return ObjectHashCode(obj, GetReadablePropertyNames(obj)); +// } +// +// +// /// +// /// Calculates a hash code for a subset of the readable properties of a object. +// /// +// /// The object to calculate the hash code for. +// /// A list of the properties to hash. +// /// The hash code. +// public static int ObjectHashCode(object obj, string[] properties ) +// { +// ArrayList alreadyDigested = new ArrayList(); +// +// int hashcode = obj.GetType().FullName.GetHashCode(); +// int length = properties.Length; +// for (int i = 0; i < length; i++) +// { +// object value = GetProperty(obj, properties[i]); +// if (value != null) +// { +// if (IsSimpleType(value.GetType())) +// { +// hashcode += value.GetHashCode(); +// hashcode += value.ToString().GetHashCode()*37; +// } +// else +// { +// // It's a Object +// // Check to avoid endless loop (circular dependency) +// if (value != obj) +// { +// if (!alreadyDigested.Contains(value)) +// { +// alreadyDigested.Add(value); +// hashcode += ObjectHashCode(value); +// } +// } +// } +// hashcode *= 29; +// } +// } +// return hashcode; +// } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/Objects/ReflectionInfo.cs b/ORBatis.Common/Utilities/Objects/ReflectionInfo.cs new file mode 100644 index 0000000..0785514 --- /dev/null +++ b/ORBatis.Common/Utilities/Objects/ReflectionInfo.cs @@ -0,0 +1,296 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 511513 $ + * $Date: 2007-02-25 06:46:57 -0700 (Sun, 25 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// This class represents a cached set of class definition information that + /// allows for easy mapping between property names and get/set methods. + /// + public sealed class ReflectionInfo + { + /// + /// + public static BindingFlags BINDING_FLAGS_PROPERTY + = BindingFlags.Public + | BindingFlags.NonPublic + | BindingFlags.Instance; + + + /// + /// + public static BindingFlags BINDING_FLAGS_FIELD + = BindingFlags.Public + | BindingFlags.NonPublic + | BindingFlags.Instance; + + private static readonly string[] _emptyStringArray = new string[0]; + private static readonly ArrayList _simleTypeMap = new ArrayList(); + private static readonly Hashtable _reflectionInfoMap = Hashtable.Synchronized(new Hashtable()); + + // (memberName, MemberInfo) + private readonly Hashtable _getMembers = new Hashtable(); + + // (memberName, member type) + private readonly Hashtable _getTypes = new Hashtable(); + + private readonly string[] _readableMemberNames = _emptyStringArray; + + // (memberName, MemberInfo) + private readonly Hashtable _setMembers = new Hashtable(); + + // (memberName, member type) + private readonly Hashtable _setTypes = new Hashtable(); + private readonly string[] _writeableMemberNames = _emptyStringArray; + + /// + /// + static ReflectionInfo() + { + _simleTypeMap.Add(typeof(string)); + _simleTypeMap.Add(typeof(byte)); + _simleTypeMap.Add(typeof(char)); + _simleTypeMap.Add(typeof(bool)); + _simleTypeMap.Add(typeof(Guid)); + _simleTypeMap.Add(typeof(short)); + _simleTypeMap.Add(typeof(int)); + _simleTypeMap.Add(typeof(long)); + _simleTypeMap.Add(typeof(float)); + _simleTypeMap.Add(typeof(double)); + _simleTypeMap.Add(typeof(decimal)); + _simleTypeMap.Add(typeof(DateTime)); + _simleTypeMap.Add(typeof(TimeSpan)); + _simleTypeMap.Add(typeof(Hashtable)); + _simleTypeMap.Add(typeof(SortedList)); + _simleTypeMap.Add(typeof(ListDictionary)); + _simleTypeMap.Add(typeof(HybridDictionary)); + + + // _simleTypeMap.Add(Class.class); + // _simleTypeMap.Add(Collection.class); + // _simleTypeMap.Add(HashMap.class); + // _simleTypeMap.Add(TreeMap.class); + _simleTypeMap.Add(typeof(ArrayList)); + // _simleTypeMap.Add(HashSet.class); + // _simleTypeMap.Add(TreeSet.class); + // _simleTypeMap.Add(Vector.class); + _simleTypeMap.Add(typeof(IEnumerator)); + } + + /// + /// + /// + private ReflectionInfo(Type type) + { + ClassName = type.Name; + AddMembers(type); + + var getArray = new string[_getMembers.Count]; + _getMembers.Keys.CopyTo(getArray, 0); + _readableMemberNames = getArray; + + var setArray = new string[_setMembers.Count]; + _setMembers.Keys.CopyTo(setArray, 0); + _writeableMemberNames = setArray; + } + + /// + /// + public string ClassName { get; } = string.Empty; + + /// + /// + /// + private void AddMembers(Type type) + { + #region Properties + var properties = type.GetProperties(BINDING_FLAGS_PROPERTY); + for (var i = 0; i < properties.Length; i++) + { + if (properties[i].CanWrite) + { + var name = properties[i].Name; + _setMembers[name] = properties[i]; + _setTypes[name] = properties[i].PropertyType; + } + + if (properties[i].CanRead) + { + var name = properties[i].Name; + _getMembers[name] = properties[i]; + _getTypes[name] = properties[i].PropertyType; + } + } + #endregion + + #region Fields + var fields = type.GetFields(BINDING_FLAGS_FIELD); + for (var i = 0; i < fields.Length; i++) + { + var name = fields[i].Name; + _setMembers[name] = fields[i]; + _setTypes[name] = fields[i].FieldType; + _getMembers[name] = fields[i]; + _getTypes[name] = fields[i].FieldType; + } + #endregion + + // Fix for problem with interfaces inheriting other interfaces + if (type.IsInterface) + // Loop through interfaces for the type and add members from + // these types too + foreach (var interf in type.GetInterfaces()) + AddMembers(interf); + } + + /// + /// + /// + /// + public MemberInfo GetSetter(string memberName) + { + var memberInfo = (MemberInfo)_setMembers[memberName]; + + if (memberInfo == null) throw new ProbeException("There is no Set member named '" + memberName + "' in class '" + ClassName + "'"); + + return memberInfo; + } + + + /// + /// Gets the . + /// + /// Member's name. + /// The + public MemberInfo GetGetter(string memberName) + { + var memberInfo = _getMembers[memberName] as MemberInfo; + if (memberInfo == null) throw new ProbeException("There is no Get member named '" + memberName + "' in class '" + ClassName + "'"); + return memberInfo; + } + + + /// + /// Gets the type of the member. + /// + /// Member's name. + /// + public Type GetSetterType(string memberName) + { + var type = (Type)_setTypes[memberName]; + if (type == null) throw new ProbeException("There is no Set member named '" + memberName + "' in class '" + ClassName + "'"); + return type; + } + + /// + /// + /// + /// + public Type GetGetterType(string memberName) + { + var type = (Type)_getTypes[memberName]; + if (type == null) throw new ProbeException("There is no Get member named '" + memberName + "' in class '" + ClassName + "'"); + return type; + } + + /// + /// + /// + public string[] GetReadableMemberNames() + { + return _readableMemberNames; + } + + /// + /// + /// + public string[] GetWriteableMemberNames() + { + return _writeableMemberNames; + } + + /// + /// + /// + /// + public bool HasWritableMember(string memberName) + { + return _setMembers.ContainsKey(memberName); + } + + /// + /// + /// + /// + public bool HasReadableMember(string memberName) + { + return _getMembers.ContainsKey(memberName); + } + + /// + /// + /// + /// + public static bool IsKnownType(Type type) + { + if (_simleTypeMap.Contains(type)) return true; + + if (typeof(IList).IsAssignableFrom(type)) return true; + + if (typeof(IDictionary).IsAssignableFrom(type)) return true; + + if (typeof(IEnumerator).IsAssignableFrom(type)) return true; + + return false; + } + + /// + /// Gets an instance of ReflectionInfo for the specified type. + /// + /// summary> + /// The type for which to lookup the method cache. + /// The properties cache for the type + public static ReflectionInfo GetInstance(Type type) + { + lock (type) + { + var cache = (ReflectionInfo)_reflectionInfoMap[type]; + if (cache == null) + { + cache = new ReflectionInfo(type); + _reflectionInfoMap.Add(type, cache); + } + + return cache; + } + } + } +} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/Proxy/IProxyGenerator.cs b/ORBatis.Common/Utilities/Proxy/IProxyGenerator.cs similarity index 88% rename from src/IBatisNet.Common/Utilities/Proxy/IProxyGenerator.cs rename to ORBatis.Common/Utilities/Proxy/IProxyGenerator.cs index 966d667..ff79e8c 100644 --- a/src/IBatisNet.Common/Utilities/Proxy/IProxyGenerator.cs +++ b/ORBatis.Common/Utilities/Proxy/IProxyGenerator.cs @@ -3,35 +3,30 @@ * $Revision: 383115 $ * $LastChangedDate: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ * $LastChangedBy: gbayon $ - * + * * iBATIS.NET Data Mapper * Copyright (C) 2004 - Gilles Bayon - * - * + * + * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at - * + * * http://www.apache.org/licenses/LICENSE-2.0 - * + * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. - * + * ********************************************************************************/ #endregion -using System; - namespace IBatisNet.Common.Utilities.Proxy { /// - /// Description rsume de IProxyGenerator. + /// Description r�sum�e de IProxyGenerator. /// - public interface IProxyGenerator - { - - } -} + public interface IProxyGenerator { } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/ScriptRunner.cs b/ORBatis.Common/Utilities/ScriptRunner.cs new file mode 100644 index 0000000..3215c15 --- /dev/null +++ b/ORBatis.Common/Utilities/ScriptRunner.cs @@ -0,0 +1,187 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 408164 $ + * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.IO; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities +{ + /// + /// Description r�sum�e de ScriptRunner. + /// + public class ScriptRunner + { + /// + /// Constructor + /// + public ScriptRunner() { } + + /// + /// Run an sql script + /// + /// The dataSouce that will be used to run the script. + /// a path to an sql script file. + public void RunScript(IDataSource dataSource, string sqlScriptPath) + { + RunScript(dataSource, sqlScriptPath, true); + } + + /// + /// Run an sql script + /// + /// The dataSouce that will be used to run the script. + /// a path to an sql script file. + /// parse out the statements in the sql script file. + public void RunScript(IDataSource dataSource, string sqlScriptPath, bool doParse) + { + // Get script file + var fi = new FileInfo(sqlScriptPath); + var script = fi.OpenText().ReadToEnd(); + + var sqlStatements = new ArrayList(); + + if (doParse) + switch (dataSource.DbProvider.Name) + { + case "oracle9.2": + case "oracle10.1": + case "oracleClient1.0": + case "ByteFx": + case "MySql": + sqlStatements = ParseScript(script); + break; + case "OleDb1.1": + if (dataSource.ConnectionString.IndexOf("Microsoft.Jet.OLEDB") > 0) + // Access + sqlStatements = ParseScript(script); + else + sqlStatements.Add(script); + break; + default: + sqlStatements.Add(script); + break; + } + else + switch (dataSource.DbProvider.Name) + { + case "oracle9.2": + case "oracle10.1": + case "oracleClient1.0": + case "ByteFx": + case "MySql": + script = script.Replace("\r\n", " "); + script = script.Replace("\t", " "); + sqlStatements.Add(script); + break; + case "OleDb1.1": + if (dataSource.ConnectionString.IndexOf("Microsoft.Jet.OLEDB") > 0) + { + // Access + script = script.Replace("\r\n", " "); + script = script.Replace("\t", " "); + sqlStatements.Add(script); + } + else + { + sqlStatements.Add(script); + } + + break; + default: + sqlStatements.Add(script); + break; + } + + try + { + ExecuteStatements(dataSource, sqlStatements); + } + catch (Exception e) + { + throw new IBatisNetException("Unable to execute the sql: " + fi.Name, e); + } + } + + /// + /// Execute the given sql statements + /// + /// The dataSouce that will be used. + /// An ArrayList of sql statements to execute. + private void ExecuteStatements(IDataSource dataSource, ArrayList sqlStatements) + { + var connection = dataSource.DbProvider.CreateConnection(); + connection.ConnectionString = dataSource.ConnectionString; + connection.Open(); + var transaction = connection.BeginTransaction(); + + var command = connection.CreateCommand(); + + command.Connection = connection; + command.Transaction = transaction; + + try + { + foreach (string sqlStatement in sqlStatements) + { + command.CommandText = sqlStatement; + command.ExecuteNonQuery(); + } + + transaction.Commit(); + } + catch (Exception e) + { + transaction.Rollback(); + throw e; + } + finally + { + connection.Close(); + } + } + + /// + /// Parse and tokenize the sql script into multiple statements + /// + /// the script to parse + private ArrayList ParseScript(string script) + { + var statements = new ArrayList(); + var parser = new StringTokenizer(script, ";"); + var enumerator = parser.GetEnumerator(); + + while (enumerator.MoveNext()) + { + var statement = ((string)enumerator.Current).Replace("\r\n", " "); + statement = statement.Trim(); + if (statement != string.Empty) statements.Add(statement); + } + + return statements; + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/StringTokenizer.cs b/ORBatis.Common/Utilities/StringTokenizer.cs new file mode 100644 index 0000000..52d4242 --- /dev/null +++ b/ORBatis.Common/Utilities/StringTokenizer.cs @@ -0,0 +1,182 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; + +namespace IBatisNet.Common.Utilities +{ + /// + /// A StringTokenizer java like object + /// + public class StringTokenizer : IEnumerable + { + private static readonly string _defaultDelim = " \t\n\r\f"; + private readonly string _delimiters = string.Empty; + private readonly string _origin = string.Empty; + private readonly bool _returnDelimiters; + + /// + /// Constructs a StringTokenizer on the specified String, using the + /// default delimiter set (which is " \t\n\r\f"). + /// + /// The input String + public StringTokenizer(string str) + { + _origin = str; + _delimiters = _defaultDelim; + _returnDelimiters = false; + } + + + /// + /// Constructs a StringTokenizer on the specified String, + /// using the specified delimiter set. + /// + /// The input String + /// The delimiter String + public StringTokenizer(string str, string delimiters) + { + _origin = str; + _delimiters = delimiters; + _returnDelimiters = false; + } + + + /// + /// Constructs a StringTokenizer on the specified String, + /// using the specified delimiter set. + /// + /// The input String + /// The delimiter String + /// Returns delimiters as tokens or skip them + public StringTokenizer(string str, string delimiters, bool returnDelimiters) + { + _origin = str; + _delimiters = delimiters; + _returnDelimiters = returnDelimiters; + } + + + /// + /// Returns the number of tokens in the String using + /// the current deliminter set. This is the number of times + /// nextToken() can return before it will generate an exception. + /// Use of this routine to count the number of tokens is faster + /// than repeatedly calling nextToken() because the substrings + /// are not constructed and returned for each token. + /// + public int TokenNumber + { + get + { + var count = 0; + var currpos = 0; + var maxPosition = _origin.Length; + + while (currpos < maxPosition) + { + while (!_returnDelimiters && + currpos < maxPosition && + _delimiters.IndexOf(_origin[currpos]) >= 0) + currpos++; + + if (currpos >= maxPosition) break; + + var start = currpos; + while (currpos < maxPosition && + _delimiters.IndexOf(_origin[currpos]) < 0) + currpos++; + if (_returnDelimiters && start == currpos && + _delimiters.IndexOf(_origin[currpos]) >= 0) + currpos++; + count++; + } + + return count; + } + } + + + /// + /// + /// + public IEnumerator GetEnumerator() + { + return new StringTokenizerEnumerator(this); + } + + + private class StringTokenizerEnumerator : IEnumerator + { + private readonly StringTokenizer _stokenizer; + private int _cursor; + private string _next; + + public StringTokenizerEnumerator(StringTokenizer stok) + { + _stokenizer = stok; + } + + public bool MoveNext() + { + _next = GetNext(); + return _next != null; + } + + public void Reset() + { + _cursor = 0; + } + + public object Current => _next; + + private string GetNext() + { + char c; + bool isDelim; + + if (_cursor >= _stokenizer._origin.Length) + return null; + + c = _stokenizer._origin[_cursor]; + isDelim = _stokenizer._delimiters.IndexOf(c) != -1; + + if (isDelim) + { + _cursor++; + if (_stokenizer._returnDelimiters) return c.ToString(); + return GetNext(); + } + + var nextDelimPos = _stokenizer._origin.IndexOfAny(_stokenizer._delimiters.ToCharArray(), _cursor); + if (nextDelimPos == -1) nextDelimPos = _stokenizer._origin.Length; + + var nextToken = _stokenizer._origin.Substring(_cursor, nextDelimPos - _cursor); + _cursor = nextDelimPos; + return nextToken; + } + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/TypeUtils.cs b/ORBatis.Common/Utilities/TypeUtils.cs new file mode 100644 index 0000000..e97c7bc --- /dev/null +++ b/ORBatis.Common/Utilities/TypeUtils.cs @@ -0,0 +1,206 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections.Generic; +using IBatisNet.Common.Utilities.TypesResolver; + +namespace IBatisNet.Common.Utilities +{ + /// + /// Helper methods with regard to type. + /// + /// + ///

+ /// Mainly for internal use within the framework. + ///

+ ///
+ public sealed class TypeUtils + { + #region Fields + private static readonly ITypeResolver _internalTypeResolver = new CachedTypeResolver(new TypeResolver()); + #endregion + + #region Constructor (s) / Destructor + /// + /// Creates a new instance of the class. + /// + /// + ///

+ /// This is a utility class, and as such exposes no public constructors. + ///

+ ///
+ private TypeUtils() { } + #endregion + + /// + /// Resolves the supplied type name into a + /// instance. + /// + /// + /// The (possibly partially assembly qualified) name of a + /// . + /// + /// + /// A resolved instance. + /// + /// + /// If the type cannot be resolved. + /// + public static Type ResolveType(string typeName) + { + var type = TypeRegistry.ResolveType(typeName); + if (type == null) type = _internalTypeResolver.Resolve(typeName); + return type; + } + + /// + /// Instantiate a 'Primitive' Type. + /// + /// a typeCode. + /// An object. + public static object InstantiatePrimitiveType(TypeCode typeCode) + { + object resultObject = null; + + switch (typeCode) + { + case TypeCode.Boolean: + resultObject = new bool(); + break; + case TypeCode.Byte: + resultObject = new byte(); + break; + case TypeCode.Char: + resultObject = new char(); + break; + case TypeCode.DateTime: + resultObject = new DateTime(); + break; + case TypeCode.Decimal: + resultObject = new decimal(); + break; + case TypeCode.Double: + resultObject = new double(); + break; + case TypeCode.Int16: + resultObject = new short(); + break; + case TypeCode.Int32: + resultObject = new int(); + break; + case TypeCode.Int64: + resultObject = new long(); + break; + case TypeCode.SByte: + resultObject = new sbyte(); + break; + case TypeCode.Single: + resultObject = new float(); + break; + case TypeCode.String: + resultObject = ""; + break; + case TypeCode.UInt16: + resultObject = new ushort(); + break; + case TypeCode.UInt32: + resultObject = new uint(); + break; + case TypeCode.UInt64: + resultObject = new ulong(); + break; + } + + return resultObject; + } + + /// + /// Instantiate a Nullable Type. + /// + /// The nullable type. + /// An object. + public static object InstantiateNullableType(Type type) + { + object resultObject = null; + + if (type == typeof(bool?)) + resultObject = false; + else if (type == typeof(byte?)) + resultObject = byte.MinValue; + else if (type == typeof(char?)) + resultObject = char.MinValue; + else if (type == typeof(DateTime?)) + resultObject = DateTime.MinValue; + else if (type == typeof(decimal?)) + resultObject = decimal.MinValue; + else if (type == typeof(double?)) + resultObject = double.MinValue; + else if (type == typeof(short?)) + resultObject = short.MinValue; + else if (type == typeof(int?)) + resultObject = int.MinValue; + else if (type == typeof(long?)) + resultObject = long.MinValue; + else if (type == typeof(sbyte?)) + resultObject = sbyte.MinValue; + else if (type == typeof(float?)) + resultObject = float.MinValue; + else if (type == typeof(ushort?)) + resultObject = ushort.MinValue; + else if (type == typeof(uint?)) + resultObject = uint.MinValue; + else if (type == typeof(ulong?)) resultObject = ulong.MinValue; + + return resultObject; + } + + /// + /// Determines whether the specified type is implement generic Ilist interface. + /// + /// The type. + /// + /// true if the specified type is implement generic Ilist interface; otherwise, false. + /// + public static bool IsImplementGenericIListInterface(Type type) + { + var ret = false; + + if (!type.IsGenericType) ret = false; + + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>)) return true; + + // check if one of the derived interfaces is IList<> + var interfaceTypes = type.GetInterfaces(); + foreach (var interfaceType in interfaceTypes) + { + ret = IsImplementGenericIListInterface(interfaceType); + if (ret) break; + } + + return ret; + } + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/TypesResolver/CachedTypeResolver.cs b/ORBatis.Common/Utilities/TypesResolver/CachedTypeResolver.cs new file mode 100644 index 0000000..645dab6 --- /dev/null +++ b/ORBatis.Common/Utilities/TypesResolver/CachedTypeResolver.cs @@ -0,0 +1,112 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408099 $ + * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Remarks +// Inpspired from Spring.NET +#endregion + +#region Imports +using System; +using System.Collections; +using System.Collections.Specialized; +#endregion + +namespace IBatisNet.Common.Utilities.TypesResolver +{ + /// + /// Resolves (instantiates) a by it's (possibly + /// assembly qualified) name, and caches the + /// instance against the type name. + /// + public class CachedTypeResolver : ITypeResolver + { + #region Constructor (s) / Destructor + /// + /// Creates a new instance of the class. + /// + /// + /// The that this instance will delegate + /// actual resolution to if a + /// cannot be found in this instance's cache. + /// + /// + /// If the supplied is . + /// + public CachedTypeResolver(ITypeResolver typeResolver) + { + _typeResolver = typeResolver; + } + #endregion + + #region ITypeResolver Members + /// + /// Resolves the supplied to a + /// + /// instance. + /// + /// + /// The (possibly partially assembly qualified) name of a + /// . + /// + /// + /// A resolved instance. + /// + /// + /// If the supplied could not be resolved + /// to a . + /// + public Type Resolve(string typeName) + { + if (typeName == null || typeName.Trim().Length == 0) throw new TypeLoadException("Could not load type from string value '" + typeName + "'."); + Type type = null; + try + { + type = _typeCache[typeName] as Type; + if (type == null) + { + type = _typeResolver.Resolve(typeName); + _typeCache[typeName] = type; + } + } + catch (Exception ex) + { + if (ex is TypeLoadException) throw; + throw new TypeLoadException("Could not load type from string value '" + typeName + "'.", ex); + } + + return type; + } + #endregion + #region Fields + /// + /// The cache, mapping type names ( instances) against + /// instances. + /// + private readonly IDictionary _typeCache = new HybridDictionary(); + + private readonly ITypeResolver _typeResolver; + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/TypesResolver/ITypeResolver.cs b/ORBatis.Common/Utilities/TypesResolver/ITypeResolver.cs new file mode 100644 index 0000000..cdb9273 --- /dev/null +++ b/ORBatis.Common/Utilities/TypesResolver/ITypeResolver.cs @@ -0,0 +1,65 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Remarks +// Inpspired from Spring.NET +#endregion + +using System; + +namespace IBatisNet.Common.Utilities.TypesResolver +{ + /// + /// Resolves a by name. + /// + /// + ///

+ /// The rationale behind the creation of this interface is to centralise + /// the resolution of type names to instances + /// beyond that offered by the plain vanilla + /// method call. + ///

+ ///
+ public interface ITypeResolver + { + /// + /// Resolves the supplied to a + /// + /// instance. + /// + /// + /// The (possibly partially assembly qualified) name of a + /// . + /// + /// + /// A resolved instance. + /// + /// + /// If the supplied could not be resolved + /// to a . + /// + Type Resolve(string typeName); + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/TypesResolver/TypeRegistry.cs b/ORBatis.Common/Utilities/TypesResolver/TypeRegistry.cs new file mode 100644 index 0000000..da10f13 --- /dev/null +++ b/ORBatis.Common/Utilities/TypesResolver/TypeRegistry.cs @@ -0,0 +1,454 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Collections; +#endregion + +namespace IBatisNet.Common.Utilities.TypesResolver +{ + /// + /// Provides access to a central registry of aliased s. + /// + /// + ///

+ /// Simplifies configuration by allowing aliases to be used instead of + /// fully qualified type names. + ///

+ ///

+ /// Comes 'pre-loaded' with a number of convenience alias' for the more + /// common types; an example would be the 'int' (or 'Integer' + /// for Visual Basic.NET developers) alias for the + /// type. + ///

+ ///
+ public class TypeRegistry + { + #region Fields + private static readonly IDictionary _types = new Hashtable(); + #endregion + + #region Methods + /// + /// Resolves the supplied to a . + /// + /// + /// The alias to resolve. + /// + /// + /// The the supplied was + /// associated with, or if no + /// was previously registered for the supplied . + /// + /// The alis name will be convert in lower character before the resolution. + /// + /// If the supplied is or + /// contains only whitespace character(s). + /// + public static Type ResolveType(string alias) + { + return (Type)_types[alias.ToLower()]; + } + #endregion + #region Constants + /// + /// The alias around the 'list' type. + /// + public const string ArrayListAlias1 = "arraylist"; + + /// + /// Another alias around the 'list' type. + /// + public const string ArrayListAlias2 = "list"; + + /// + /// Another alias around the 'bool' type. + /// + public const string BoolAlias = "bool"; + + /// + /// The alias around the 'bool' type. + /// + public const string BooleanAlias = "boolean"; + + /// + /// The alias around the 'byte' type. + /// + public const string ByteAlias = "byte"; + + /// + /// The alias around the 'char' type. + /// + public const string CharAlias = "char"; + + /// + /// The alias around the 'DateTime' type. + /// + public const string DateAlias1 = "datetime"; + + /// + /// Another alias around the 'DateTime' type. + /// + public const string DateAlias2 = "date"; + + /// + /// The alias around the 'decimal' type. + /// + public const string DecimalAlias = "decimal"; + + /// + /// The alias around the 'double' type. + /// + public const string DoubleAlias = "double"; + + + /// + /// The alias around the 'float' type. + /// + public const string FloatAlias = "float"; + + /// + /// Another alias around the 'float' type. + /// + public const string SingleAlias = "single"; + + /// + /// The alias around the 'guid' type. + /// + public const string GuidAlias = "guid"; + + /// + /// The alias around the 'Hashtable' type. + /// + public const string HashtableAlias1 = "hashtable"; + + /// + /// Another alias around the 'Hashtable' type. + /// + public const string HashtableAlias2 = "map"; + + /// + /// Another alias around the 'Hashtable' type. + /// + public const string HashtableAlias3 = "hashmap"; + + /// + /// The alias around the 'short' type. + /// + public const string Int16Alias1 = "int16"; + + /// + /// Another alias around the 'short' type. + /// + public const string Int16Alias2 = "short"; + + + /// + /// The alias around the 'int' type. + /// + public const string Int32Alias1 = "int32"; + + /// + /// Another alias around the 'int' type. + /// + public const string Int32Alias2 = "int"; + + /// + /// Another alias around the 'int' type. + /// + public const string Int32Alias3 = "integer"; + + /// + /// The alias around the 'long' type. + /// + public const string Int64Alias1 = "int64"; + + /// + /// Another alias around the 'long' type. + /// + public const string Int64Alias2 = "long"; + + /// + /// The alias around the 'unsigned short' type. + /// + public const string UInt16Alias1 = "uint16"; + + /// + /// Another alias around the 'unsigned short' type. + /// + public const string UInt16Alias2 = "ushort"; + + /// + /// The alias around the 'unsigned int' type. + /// + public const string UInt32Alias1 = "uint32"; + + /// + /// Another alias around the 'unsigned int' type. + /// + public const string UInt32Alias2 = "uint"; + + /// + /// The alias around the 'unsigned long' type. + /// + public const string UInt64Alias1 = "uint64"; + + /// + /// Another alias around the 'unsigned long' type. + /// + public const string UInt64Alias2 = "ulong"; + + /// + /// The alias around the 'SByte' type. + /// + public const string SByteAlias = "sbyte"; + + /// + /// The alias around the 'string' type. + /// + public const string StringAlias = "string"; + + /// + /// The alias around the 'TimeSpan' type. + /// + public const string TimeSpanAlias = "timespan"; + + /// + /// The alias around the 'int?' type. + /// + public const string NullableInt32Alias = "int?"; + + /// + /// The alias around the 'int?[]' array type. + /// + public const string NullableInt32ArrayAlias = "int?[]"; + + /// + /// The alias around the 'decimal?' type. + /// + public const string NullableDecimalAlias = "decimal?"; + + /// + /// The alias around the 'decimal?[]' array type. + /// + public const string NullableDecimalArrayAlias = "decimal?[]"; + + /// + /// The alias around the 'char?' type. + /// + public const string NullableCharAlias = "char?"; + + /// + /// The alias around the 'char?[]' array type. + /// + public const string NullableCharArrayAlias = "char?[]"; + + /// + /// The alias around the 'long?' type. + /// + public const string NullableInt64Alias = "long?"; + + /// + /// The alias around the 'long?[]' array type. + /// + public const string NullableInt64ArrayAlias = "long?[]"; + + /// + /// The alias around the 'short?' type. + /// + public const string NullableInt16Alias = "short?"; + + /// + /// The alias around the 'short?[]' array type. + /// + public const string NullableInt16ArrayAlias = "short?[]"; + + /// + /// The alias around the 'unsigned int?' type. + /// + public const string NullableUInt32Alias = "uint?"; + + /// + /// The alias around the 'unsigned long?' type. + /// + public const string NullableUInt64Alias = "ulong?"; + + /// + /// The alias around the 'ulong?[]' array type. + /// + public const string NullableUInt64ArrayAlias = "ulong?[]"; + + /// + /// The alias around the 'uint?[]' array type. + /// + public const string NullableUInt32ArrayAlias = "uint?[]"; + + /// + /// The alias around the 'unsigned short?' type. + /// + public const string NullableUInt16Alias = "ushort?"; + + /// + /// The alias around the 'ushort?[]' array type. + /// + public const string NullableUInt16ArrayAlias = "ushort?[]"; + + /// + /// The alias around the 'double?' type. + /// + public const string NullableDoubleAlias = "double?"; + + /// + /// The alias around the 'double?[]' array type. + /// + public const string NullableDoubleArrayAlias = "double?[]"; + + /// + /// The alias around the 'float?' type. + /// + public const string NullableFloatAlias = "float?"; + + /// + /// The alias around the 'float?[]' array type. + /// + public const string NullableFloatArrayAlias = "float?[]"; + + /// + /// The alias around the 'bool?' type. + /// + public const string NullableBoolAlias = "bool?"; + + /// + /// The alias around the 'bool?[]' array type. + /// + public const string NullableBoolArrayAlias = "bool?[]"; + #endregion + + #region Constructor (s) / Destructor + /// + /// Creates a new instance of the class. + /// + /// + ///

+ /// This is a utility class, and as such has no publicly visible + /// constructors. + ///

+ ///
+ private TypeRegistry() { } + + /// + /// Initialises the static properties of the TypeAliasResolver class. + /// + static TypeRegistry() + { + // Initialize a dictionary with some fully qualifiaed name + _types[ArrayListAlias1] = typeof(ArrayList); + _types[ArrayListAlias2] = typeof(ArrayList); + + _types[BoolAlias] = typeof(bool); + _types[BooleanAlias] = typeof(bool); + + _types[ByteAlias] = typeof(byte); + + _types[CharAlias] = typeof(char); + + _types[DateAlias1] = typeof(DateTime); + _types[DateAlias2] = typeof(DateTime); + + _types[DecimalAlias] = typeof(decimal); + + _types[DoubleAlias] = typeof(double); + + _types[FloatAlias] = typeof(float); + _types[SingleAlias] = typeof(float); + + _types[GuidAlias] = typeof(Guid); + + _types[HashtableAlias1] = typeof(Hashtable); + _types[HashtableAlias2] = typeof(Hashtable); + _types[HashtableAlias3] = typeof(Hashtable); + + _types[Int16Alias1] = typeof(short); + _types[Int16Alias2] = typeof(short); + + _types[Int32Alias1] = typeof(int); + _types[Int32Alias2] = typeof(int); + _types[Int32Alias3] = typeof(int); + + _types[Int64Alias1] = typeof(long); + _types[Int64Alias2] = typeof(long); + + _types[UInt16Alias1] = typeof(ushort); + _types[UInt16Alias2] = typeof(ushort); + + _types[UInt32Alias1] = typeof(uint); + _types[UInt32Alias2] = typeof(uint); + + _types[UInt64Alias1] = typeof(ulong); + _types[UInt64Alias2] = typeof(ulong); + + _types[SByteAlias] = typeof(sbyte); + + _types[StringAlias] = typeof(string); + + _types[TimeSpanAlias] = typeof(string); + + _types[NullableInt32Alias] = typeof(int?); + _types[NullableInt32ArrayAlias] = typeof(int?[]); + + _types[NullableDecimalAlias] = typeof(decimal?); + _types[NullableDecimalArrayAlias] = typeof(decimal?[]); + + _types[NullableCharAlias] = typeof(char?); + _types[NullableCharArrayAlias] = typeof(char?[]); + + _types[NullableInt64Alias] = typeof(long?); + _types[NullableInt64ArrayAlias] = typeof(long?[]); + + _types[NullableInt16Alias] = typeof(short?); + _types[NullableInt16ArrayAlias] = typeof(short?[]); + + _types[NullableUInt32Alias] = typeof(uint?); + _types[NullableUInt32ArrayAlias] = typeof(uint?[]); + + _types[NullableUInt64Alias] = typeof(ulong?); + _types[NullableUInt64ArrayAlias] = typeof(ulong?[]); + + _types[NullableUInt16Alias] = typeof(ushort?); + _types[NullableUInt16ArrayAlias] = typeof(ushort?[]); + + _types[NullableDoubleAlias] = typeof(double?); + _types[NullableDoubleArrayAlias] = typeof(double?[]); + + _types[NullableFloatAlias] = typeof(float?); + _types[NullableFloatArrayAlias] = typeof(float?[]); + + _types[NullableBoolAlias] = typeof(bool?); + _types[NullableBoolArrayAlias] = typeof(bool?[]); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Utilities/TypesResolver/TypeResolver.cs b/ORBatis.Common/Utilities/TypesResolver/TypeResolver.cs new file mode 100644 index 0000000..affd338 --- /dev/null +++ b/ORBatis.Common/Utilities/TypesResolver/TypeResolver.cs @@ -0,0 +1,517 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 663728 $ + * $LastChangedDate: 2008-06-05 14:40:05 -0600 (Thu, 05 Jun 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Remarks +// Inpspired from Spring.NET +#endregion + +#region Using +using System; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using System.Text; +using System.Text.RegularExpressions; +#endregion + +namespace IBatisNet.Common.Utilities.TypesResolver +{ + /// + /// Resolves a by name. + /// + /// + ///

+ /// The rationale behind the creation of this class is to centralise the + /// resolution of type names to instances beyond that + /// offered by the plain vanilla System.Type.GetType method call. + ///

+ ///
+ /// $Id: TypeResolver.cs,v 1.5 2004/09/28 07:51:47 springboy Exp $ + public class TypeResolver : ITypeResolver + { + private const string NULLABLE_TYPE = "System.Nullable"; + + #region ITypeResolver Members + /// + /// Resolves the supplied to a + /// instance. + /// + /// + /// The unresolved name of a . + /// + /// + /// A resolved instance. + /// + /// + /// If the supplied could not be resolved + /// to a . + /// + public virtual Type Resolve(string typeName) + { + var type = ResolveGenericType(typeName.Replace(" ", string.Empty)); + if (type == null) type = ResolveType(typeName.Replace(" ", string.Empty)); + return type; + } + #endregion + + /// + /// Resolves the supplied generic , + /// substituting recursively all its type parameters., + /// to a instance. + /// + /// + /// The (possibly generic) name of a . + /// + /// + /// A resolved instance. + /// + /// + /// If the supplied could not be resolved + /// to a . + /// + private Type ResolveGenericType(string typeName) + { + #region Sanity Check + if (typeName == null || typeName.Trim().Length == 0) throw BuildTypeLoadException(typeName); + #endregion + + if (typeName.StartsWith(NULLABLE_TYPE)) return null; + + var genericInfo = new GenericArgumentsInfo(typeName); + Type type = null; + try + { + if (genericInfo.ContainsGenericArguments) + { + type = TypeUtils.ResolveType(genericInfo.GenericTypeName); + if (!genericInfo.IsGenericDefinition) + { + var unresolvedGenericArgs = genericInfo.GetGenericArguments(); + var genericArgs = new Type[unresolvedGenericArgs.Length]; + for (var i = 0; i < unresolvedGenericArgs.Length; i++) genericArgs[i] = TypeUtils.ResolveType(unresolvedGenericArgs[i]); + type = type.MakeGenericType(genericArgs); + } + } + } + catch (Exception ex) + { + if (ex is TypeLoadException) throw; + throw BuildTypeLoadException(typeName, ex); + } + + return type; + } + + /// + /// Resolves the supplied to a + /// + /// instance. + /// + /// + /// The (possibly partially assembly qualified) name of a + /// . + /// + /// + /// A resolved instance. + /// + /// + /// If the supplied could not be resolved + /// to a . + /// + private Type ResolveType(string typeName) + { + #region Sanity Check + if (typeName == null || typeName.Trim().Length == 0) throw BuildTypeLoadException(typeName); + #endregion + + var typeInfo = new TypeAssemblyInfo(typeName); + Type type = null; + try + { + type = typeInfo.IsAssemblyQualified ? LoadTypeDirectlyFromAssembly(typeInfo) : LoadTypeByIteratingOverAllLoadedAssemblies(typeInfo); + } + catch (Exception ex) + { + throw BuildTypeLoadException(typeName, ex); + } + + if (type == null) throw BuildTypeLoadException(typeName); + return type; + } + + /// + /// Uses + /// to load an and then the attendant + /// referred to by the + /// parameter. + /// + /// + ///

+ /// is + /// deprecated in .NET 2.0, but is still used here (even when this class is + /// compiled for .NET 2.0); + /// will + /// still resolve (non-.NET Framework) local assemblies when given only the + /// display name of an assembly (the behaviour for .NET Framework assemblies + /// and strongly named assemblies is documented in the docs for the + /// method). + ///

+ ///
+ /// + /// The assembly and type to be loaded. + /// + /// + /// A , or . + /// + /// + /// + /// + private static Type LoadTypeDirectlyFromAssembly(TypeAssemblyInfo typeInfo) + { + Type type = null; + // assembly qualified... load the assembly, then the Type + Assembly assembly = null; + + assembly = Assembly.Load(typeInfo.AssemblyName); + + if (assembly != null) type = assembly.GetType(typeInfo.TypeName, true, true); + return type; + } + + /// + /// Check all assembly + /// to load the attendant referred to by + /// the parameter. + /// + /// + /// The type to be loaded. + /// + /// + /// A , or . + /// + private static Type LoadTypeByIteratingOverAllLoadedAssemblies(TypeAssemblyInfo typeInfo) + { + Type type = null; + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + type = assembly.GetType(typeInfo.TypeName, false, false); + if (type != null) break; + } + + return type; + } + + private static TypeLoadException BuildTypeLoadException(string typeName) + { + return new TypeLoadException("Could not load type from string value '" + typeName + "'."); + } + + private static TypeLoadException BuildTypeLoadException(string typeName, Exception ex) + { + return new TypeLoadException("Could not load type from string value '" + typeName + "'.", ex); + } + + #region Inner Class : GenericArgumentsInfo + /// + /// Holder for the generic arguments when using type parameters. + /// + /// + ///

+ /// Type parameters can be applied to classes, interfaces, + /// structures, methods, delegates, etc... + ///

+ ///
+ internal class GenericArgumentsInfo + { + #region Constructor (s) / Destructor + /// + /// Creates a new instance of the GenericArgumentsInfo class. + /// + /// + /// The string value to parse looking for a generic definition + /// and retrieving its generic arguments. + /// + public GenericArgumentsInfo(string value) + { + ParseGenericArguments(value); + } + #endregion + #region Constants + /// + /// The generic arguments prefix. + /// + public const string GENERIC_ARGUMENTS_PREFIX = "[["; + + /// + /// The generic arguments suffix. + /// + public const string GENERIC_ARGUMENTS_SUFFIX = "]]"; + + /// + /// The character that separates a list of generic arguments. + /// + public const string GENERIC_ARGUMENTS_SEPARATOR = "],["; + #endregion + + #region Fields + private string[] _unresolvedGenericArguments; + private static readonly Regex generic = new Regex(@"`\d*\[\[", RegexOptions.Compiled); + #endregion + + #region Properties + /// + /// The (unresolved) generic type name portion + /// of the original value when parsing a generic type. + /// + public string GenericTypeName { get; private set; } = string.Empty; + + + /// + /// Is the string value contains generic arguments ? + /// + /// + ///

+ /// A generic argument can be a type parameter or a type argument. + ///

+ ///
+ public bool ContainsGenericArguments => + _unresolvedGenericArguments != null && + _unresolvedGenericArguments.Length > 0; + + /// + /// Is generic arguments only contains type parameters ? + /// + public bool IsGenericDefinition + { + get + { + if (_unresolvedGenericArguments == null) + return false; + + foreach (var arg in _unresolvedGenericArguments) + if (arg.Length > 0) + return false; + return true; + } + } + #endregion + + #region Methods + /// + /// Returns an array of unresolved generic arguments types. + /// + /// + ///

+ /// A empty string represents a type parameter that + /// did not have been substituted by a specific type. + ///

+ ///
+ /// + /// An array of strings that represents the unresolved generic + /// arguments types or an empty array if not generic. + /// + public string[] GetGenericArguments() + { + if (_unresolvedGenericArguments == null) return new string[] { }; + + return _unresolvedGenericArguments; + } + + private void ParseGenericArguments(string originalString) + { + // Check for match + var isMatch = generic.IsMatch(originalString); + if (!isMatch) + { + GenericTypeName = originalString; + } + else + { + var argsStartIndex = originalString.IndexOf(GENERIC_ARGUMENTS_PREFIX); + var argsEndIndex = originalString.LastIndexOf(GENERIC_ARGUMENTS_SUFFIX); + if (argsEndIndex != -1) + { + SplitGenericArguments(originalString.Substring( + argsStartIndex + 1, argsEndIndex - argsStartIndex)); + + GenericTypeName = originalString.Remove(argsStartIndex, argsEndIndex - argsStartIndex + 2); + } + } + } + + private void SplitGenericArguments(string originalArgs) + { + IList arguments = new List(); + + if (originalArgs.Contains(GENERIC_ARGUMENTS_SEPARATOR)) + { + arguments = Parse(originalArgs); + } + else + { + var argument = originalArgs.Substring(1, originalArgs.Length - 2).Trim(); + arguments.Add(argument); + } + + _unresolvedGenericArguments = new string[arguments.Count]; + arguments.CopyTo(_unresolvedGenericArguments, 0); + } + + private IList Parse(string args) + { + var argument = new StringBuilder(); + IList arguments = new List(); + + TextReader input = new StringReader(args); + var nbrOfRightDelimiter = 0; + var findRight = false; + do + { + var ch = (char)input.Read(); + if (ch == '[') + { + nbrOfRightDelimiter++; + findRight = true; + } + else if (ch == ']') + { + nbrOfRightDelimiter--; + } + + argument.Append(ch); + + //Find one argument + if (findRight && nbrOfRightDelimiter == 0) + { + var arg = argument.ToString(); + arg = arg.Substring(1, arg.Length - 2); + arguments.Add(arg); + input.Read(); + argument = new StringBuilder(); + } + } while (input.Peek() != -1); + + return arguments; + } + #endregion + } + #endregion + + #region Inner Class : TypeAssemblyInfo + /// + /// Holds data about a and it's + /// attendant . + /// + internal class TypeAssemblyInfo + { + #region Constructor (s) / Destructor + /// + /// Creates a new instance of the TypeAssemblyInfo class. + /// + /// + /// The unresolved name of a . + /// + public TypeAssemblyInfo(string unresolvedTypeName) + { + SplitTypeAndAssemblyNames(unresolvedTypeName); + } + #endregion + #region Constants + /// + /// The string that separates a name + /// from the name of it's attendant + /// in an assembly qualified type name. + /// + public const string TYPE_ASSEMBLY_SEPARATOR = ","; + + public const string NULLABLE_TYPE = "System.Nullable"; + public const string NULLABLE_TYPE_ASSEMBLY_SEPARATOR = "]],"; + #endregion + + #region Properties + /// + /// The (unresolved) type name portion of the original type name. + /// + public string TypeName { get; private set; } = string.Empty; + + /// + /// The (unresolved, possibly partial) name of the attandant assembly. + /// + public string AssemblyName { get; private set; } = string.Empty; + + /// + /// Is the type name being resolved assembly qualified? + /// + public bool IsAssemblyQualified => HasText(AssemblyName); + #endregion + + #region Methods + private bool HasText(string target) + { + if (target == null) return false; + + return HasLength(target.Trim()); + } + + private bool HasLength(string target) + { + return target != null && target.Length > 0; + } + + private void SplitTypeAndAssemblyNames(string originalTypeName) + { + if (originalTypeName.StartsWith(NULLABLE_TYPE)) + { + var typeAssemblyIndex = originalTypeName.IndexOf(NULLABLE_TYPE_ASSEMBLY_SEPARATOR); + if (typeAssemblyIndex < 0) + { + TypeName = originalTypeName; + } + else + { + TypeName = originalTypeName.Substring(0, typeAssemblyIndex + 2).Trim(); + AssemblyName = originalTypeName.Substring(typeAssemblyIndex + 3).Trim(); + } + } + else + { + var typeAssemblyIndex = originalTypeName.IndexOf(TYPE_ASSEMBLY_SEPARATOR); + if (typeAssemblyIndex < 0) + { + TypeName = originalTypeName; + } + else + { + TypeName = originalTypeName.Substring(0, typeAssemblyIndex).Trim(); + AssemblyName = originalTypeName.Substring(typeAssemblyIndex + 1).Trim(); + } + } + } + #endregion + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatis.Common/Xml/NodeUtils.cs b/ORBatis.Common/Xml/NodeUtils.cs new file mode 100644 index 0000000..45b40c0 --- /dev/null +++ b/ORBatis.Common/Xml/NodeUtils.cs @@ -0,0 +1,151 @@ +using System.Collections.Specialized; +using System.Xml; + +namespace IBatisNet.Common.Xml +{ + /// + /// Summary description for NodeUtils. + /// + public sealed class NodeUtils + { + /// + /// Searches for the attribute with the specified name in this attributes list. + /// + /// + /// The key + /// + public static string GetStringAttribute(NameValueCollection attributes, string name) + { + var value = attributes[name]; + if (value == null) return string.Empty; + + return value; + } + + /// + /// Searches for the attribute with the specified name in this attributes list. + /// + /// + /// The key + /// The default value to be returned if the attribute is not found. + /// + public static string GetStringAttribute(NameValueCollection attributes, string name, string def) + { + var value = attributes[name]; + if (value == null) return def; + + return value; + } + + /// + /// Searches for the attribute with the specified name in this attributes list. + /// + /// + /// The key + /// The default value to be returned if the attribute is not found. + /// + public static byte GetByteAttribute(NameValueCollection attributes, string name, byte def) + { + var value = attributes[name]; + if (value == null) return def; + + return XmlConvert.ToByte(value); + } + + /// + /// Searches for the attribute with the specified name in this attributes list. + /// + /// + /// The key + /// The default value to be returned if the attribute is not found. + /// + public static int GetIntAttribute(NameValueCollection attributes, string name, int def) + { + var value = attributes[name]; + if (value == null) return def; + + return XmlConvert.ToInt32(value); + } + + /// + /// Searches for the attribute with the specified name in this attributes list. + /// + /// + /// The key + /// The default value to be returned if the attribute is not found. + /// + public static bool GetBooleanAttribute(NameValueCollection attributes, string name, bool def) + { + var value = attributes[name]; + if (value == null) return def; + + return XmlConvert.ToBoolean(value); + } + + /// + /// + /// + /// + public static NameValueCollection ParseAttributes(XmlNode node) + { + return ParseAttributes(node, null); + } + + /// + /// + /// + /// + /// + public static NameValueCollection ParseAttributes(XmlNode node, NameValueCollection variables) + { + var attributes = new NameValueCollection(); + var count = node.Attributes.Count; + for (var i = 0; i < count; i++) + { + var attribute = node.Attributes[i]; + var value = ParsePropertyTokens(attribute.Value, variables); + attributes.Add(attribute.Name, value); + } + + return attributes; + } + + + /// + /// Replace properties by their values in the given string + /// + /// + /// + /// + public static string ParsePropertyTokens(string str, NameValueCollection properties) + { + var OPEN = "${"; + var CLOSE = "}"; + + var newString = str; + if (newString != null && properties != null) + { + var start = newString.IndexOf(OPEN); + var end = newString.IndexOf(CLOSE); + + while (start > -1 && end > start) + { + var prepend = newString.Substring(0, start); + var append = newString.Substring(end + CLOSE.Length); + + var index = start + OPEN.Length; + var propName = newString.Substring(index, end - index); + var propValue = properties.Get(propName); + if (propValue == null) + newString = prepend + propName + append; + else + newString = prepend + propValue + append; + start = newString.IndexOf(OPEN); + end = newString.IndexOf(CLOSE); + } + } + + return newString; + } + } +} \ No newline at end of file diff --git a/ORBatis.sln b/ORBatis.sln new file mode 100644 index 0000000..9e62d9f --- /dev/null +++ b/ORBatis.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatisCore", "ORBatisCore\ORBatisCore.csproj", "{2882B001-EDFD-4946-9460-858542F5BEAF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Common", "ORBatis.Common\ORBatis.Common.csproj", "{1EC66731-5437-4F55-9617-22E822772864}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatisFramework", "ORBatisFramework\ORBatisFramework.csproj", "{3C780CE6-4AAC-4439-8334-8DFE3B091CA3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {2882B001-EDFD-4946-9460-858542F5BEAF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2882B001-EDFD-4946-9460-858542F5BEAF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2882B001-EDFD-4946-9460-858542F5BEAF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2882B001-EDFD-4946-9460-858542F5BEAF}.Release|Any CPU.Build.0 = Release|Any CPU + {1EC66731-5437-4F55-9617-22E822772864}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1EC66731-5437-4F55-9617-22E822772864}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1EC66731-5437-4F55-9617-22E822772864}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1EC66731-5437-4F55-9617-22E822772864}.Release|Any CPU.Build.0 = Release|Any CPU + {3C780CE6-4AAC-4439-8334-8DFE3B091CA3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3C780CE6-4AAC-4439-8334-8DFE3B091CA3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3C780CE6-4AAC-4439-8334-8DFE3B091CA3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3C780CE6-4AAC-4439-8334-8DFE3B091CA3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/ORBatisCore/Commands/DataReaderDecorator.cs b/ORBatisCore/Commands/DataReaderDecorator.cs new file mode 100644 index 0000000..2a37e92 --- /dev/null +++ b/ORBatisCore/Commands/DataReaderDecorator.cs @@ -0,0 +1,489 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 383115 $ + * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Configuration; +using System.Data; +using System.Globalization; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.Commands; + +/// +/// Decorate an +/// to auto move to next ResultMap on NextResult call. +/// +public class DataReaderDecorator : IDataReader +{ + private readonly IDataReader _innerDataReader; + private readonly RequestScope _request; + + /// + /// Initializes a new instance of the class. + /// + /// The data reader. + /// The request scope + public DataReaderDecorator(IDataReader dataReader, RequestScope request) + { + _innerDataReader = dataReader; + _request = request; + } + + #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + void IDisposable.Dispose() + { + _innerDataReader.Dispose(); + } + #endregion + + #region IDataReader Members + /// + /// Closes the 0bject. + /// + void IDataReader.Close() + { + _innerDataReader.Close(); + } + + /// + /// Gets a value indicating the depth of nesting for the current row. + /// + /// + /// The level of nesting. + int IDataReader.Depth => _innerDataReader.Depth; + + /// + /// Returns a that describes the column metadata of the + /// . + /// + /// + /// A that describes the column metadata. + /// + /// The is closed. + DataTable IDataReader.GetSchemaTable() + { + return _innerDataReader.GetSchemaTable(); + } + + /// + /// Gets a value indicating whether the data reader is closed. + /// + /// + /// true if the data reader is closed; otherwise, false. + bool IDataReader.IsClosed => _innerDataReader.IsClosed; + + /// + /// Advances the data reader to the next result, when reading the results of batch SQL statements. + /// + /// + /// true if there are more rows; otherwise, false. + /// + bool IDataReader.NextResult() + { + _request.MoveNextResultMap(); + return _innerDataReader.NextResult(); + } + + /// + /// Advances the to the next record. + /// + /// + /// true if there are more rows; otherwise, false. + /// + bool IDataReader.Read() + { + return _innerDataReader.Read(); + } + + int IDataReader.RecordsAffected => _innerDataReader.RecordsAffected; + #endregion + + #region IDataRecord Members + /// + /// Gets the number of columns in the current row. + /// + /// + /// + /// When not positioned in a valid recordset, 0; otherwise the number of columns in the current record. The + /// default is -1. + /// + int IDataRecord.FieldCount => _innerDataReader.FieldCount; + + /// + /// Gets the value of the specified column as a Boolean. + /// + /// The zero-based column ordinal. + /// The value of the column. + /// + /// The index passed was outside the range of 0 through + /// . + /// + bool IDataRecord.GetBoolean(int i) + { + return _innerDataReader.GetBoolean(i); + } + + /// + /// Gets the 8-bit unsigned integer value of the specified column. + /// + /// The zero-based column ordinal. + /// + /// The 8-bit unsigned integer value of the specified column. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + byte IDataRecord.GetByte(int i) + { + return _innerDataReader.GetByte(i); + } + + /// + /// Reads a stream of bytes from the specified column offset into the buffer as an array, starting at the given buffer + /// offset. + /// + /// The zero-based column ordinal. + /// The index within the field from which to start the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to start the read operation. + /// The number of bytes to read. + /// The actual number of bytes read. + /// + /// The index passed was outside the range of 0 through + /// . + /// + long IDataRecord.GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) + { + return _innerDataReader.GetBytes(i, fieldOffset, buffer, bufferoffset, length); + } + + /// + /// Gets the character value of the specified column. + /// + /// The zero-based column ordinal. + /// + /// The character value of the specified column. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + char IDataRecord.GetChar(int i) + { + return _innerDataReader.GetChar(i); + } + + /// + /// Reads a stream of characters from the specified column offset into the buffer as an array, starting at the given + /// buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the row from which to start the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to start the read operation. + /// The number of bytes to read. + /// The actual number of characters read. + /// + /// The index passed was outside the range of 0 through + /// . + /// + long IDataRecord.GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) + { + return _innerDataReader.GetChars(i, fieldoffset, buffer, bufferoffset, length); + } + + /// + /// Gets an to be used when the field points to more remote structured data. + /// + /// The index of the field to find. + /// + /// An to be used when the field points to more remote structured data. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + IDataReader IDataRecord.GetData(int i) + { + return _innerDataReader.GetData(i); + } + + /// + /// Gets the data type information for the specified field. + /// + /// The index of the field to find. + /// + /// The data type information for the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + string IDataRecord.GetDataTypeName(int i) + { + return _innerDataReader.GetDataTypeName(i); + } + + /// + /// Gets the date and time data value of the specified field. + /// + /// The index of the field to find. + /// + /// The date and time data value of the spcified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + DateTime IDataRecord.GetDateTime(int i) + { + var dateTimeFormat = ConfigurationManager.AppSettings["dateTimeFormat"]; + + if (!string.IsNullOrWhiteSpace(dateTimeFormat) && _innerDataReader.GetFieldType(i) == typeof(string)) return DateTime.ParseExact(_innerDataReader.GetString(i), dateTimeFormat, CultureInfo.InvariantCulture); + + return _innerDataReader.GetDateTime(i); + } + + /// + /// Gets the fixed-position numeric value of the specified field. + /// + /// The index of the field to find. + /// + /// The fixed-position numeric value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + decimal IDataRecord.GetDecimal(int i) + { + return _innerDataReader.GetDecimal(i); + } + + /// + /// Gets the double-precision floating point number of the specified field. + /// + /// The index of the field to find. + /// + /// The double-precision floating point number of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + double IDataRecord.GetDouble(int i) + { + return _innerDataReader.GetDouble(i); + } + + /// + /// Gets the information corresponding to the type of + /// that would be returned from . + /// + /// The index of the field to find. + /// + /// The information corresponding to the type of that + /// would be returned from . + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + Type IDataRecord.GetFieldType(int i) + { + return _innerDataReader.GetFieldType(i); + } + + /// + /// Gets the single-precision floating point number of the specified field. + /// + /// The index of the field to find. + /// + /// The single-precision floating point number of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + float IDataRecord.GetFloat(int i) + { + return _innerDataReader.GetFloat(i); + } + + /// + /// Returns the GUID value of the specified field. + /// + /// The index of the field to find. + /// The GUID value of the specified field. + /// + /// The index passed was outside the range of 0 through + /// . + /// + Guid IDataRecord.GetGuid(int i) + { + return _innerDataReader.GetGuid(i); + } + + /// + /// Gets the 16-bit signed integer value of the specified field. + /// + /// The index of the field to find. + /// + /// The 16-bit signed integer value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + short IDataRecord.GetInt16(int i) + { + return _innerDataReader.GetInt16(i); + } + + /// + /// Gets the 32-bit signed integer value of the specified field. + /// + /// The index of the field to find. + /// + /// The 32-bit signed integer value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + int IDataRecord.GetInt32(int i) + { + return _innerDataReader.GetInt32(i); + } + + /// + /// Gets the 64-bit signed integer value of the specified field. + /// + /// The index of the field to find. + /// + /// The 64-bit signed integer value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + long IDataRecord.GetInt64(int i) + { + return _innerDataReader.GetInt64(i); + } + + /// + /// Gets the name for the field to find. + /// + /// The index of the field to find. + /// + /// The name of the field or the empty string (""), if there is no value to return. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + string IDataRecord.GetName(int i) + { + return _innerDataReader.GetName(i); + } + + /// + /// Return the index of the named field. + /// + /// The name of the field to find. + /// The index of the named field. + int IDataRecord.GetOrdinal(string name) + { + return _innerDataReader.GetOrdinal(name); + } + + /// + /// Gets the string value of the specified field. + /// + /// The index of the field to find. + /// The string value of the specified field. + /// + /// The index passed was outside the range of 0 through + /// . + /// + string IDataRecord.GetString(int i) + { + return _innerDataReader.GetString(i); + } + + /// + /// Return the value of the specified field. + /// + /// The index of the field to find. + /// + /// The which will contain the field value upon return. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + object IDataRecord.GetValue(int i) + { + return _innerDataReader.GetValue(i); + } + + int IDataRecord.GetValues(object[] values) + { + return _innerDataReader.GetValues(values); + } + + /// + /// Return whether the specified field is set to null. + /// + /// The index of the field to find. + /// + /// true if the specified field is set to null. Otherwise, false. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + bool IDataRecord.IsDBNull(int i) + { + return _innerDataReader.IsDBNull(i); + } + + /// + /// Gets the with the specified name. + /// + /// + object IDataRecord.this[string name] => _innerDataReader[name]; + + /// + /// Gets the with the specified i. + /// + /// + object IDataRecord.this[int i] => _innerDataReader[i]; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Commands/DataReaderTransformer.cs b/ORBatisCore/Commands/DataReaderTransformer.cs new file mode 100644 index 0000000..ae20ed3 --- /dev/null +++ b/ORBatisCore/Commands/DataReaderTransformer.cs @@ -0,0 +1,50 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.Common; + +namespace IBatisNet.DataMapper.Commands; + +/// +/// For which don't support M.A.R.S, wraps the current +/// in an . +/// +public sealed class DataReaderTransformer +{ + /// + /// Creates a DataReaderAdapter from a + /// + /// The which holds the records from the Database. + /// The databse provider + public static IDataReader Transform(IDataReader reader, IDbProvider dbProvider) + { + if (!dbProvider.AllowMARS && !(reader is InMemoryDataReader)) + // The underlying reader will be closed. + return new InMemoryDataReader(reader); + + return reader; + } +} \ No newline at end of file diff --git a/ORBatisCore/Commands/DbCommandDecorator.cs b/ORBatisCore/Commands/DbCommandDecorator.cs new file mode 100644 index 0000000..c906d36 --- /dev/null +++ b/ORBatisCore/Commands/DbCommandDecorator.cs @@ -0,0 +1,231 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 383115 $ + * $Date: 2006-11-15 13:22:00 -0700 (Wed, 15 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.Commands; + +/// +/// Decorate an +/// to auto move to next ResultMap on ExecuteReader call. +/// +public class DbCommandDecorator : IDbCommand +{ + private readonly IDbCommand _innerDbCommand; + private readonly RequestScope _request; + + /// + /// Initializes a new instance of the class. + /// + /// The db command. + /// The request scope + public DbCommandDecorator(IDbCommand dbCommand, RequestScope request) + { + _request = request; + _innerDbCommand = dbCommand; + } + + #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + void IDisposable.Dispose() + { + _innerDbCommand.Dispose(); + } + #endregion + + + #region IDbCommand Members + /// + /// Attempts to cancels the execution of an . + /// + void IDbCommand.Cancel() + { + _innerDbCommand.Cancel(); + } + + /// + /// Gets or sets the text command to run against the data source. + /// + /// + /// The text command to execute. The default value is an empty string (""). + string IDbCommand.CommandText + { + get => _innerDbCommand.CommandText; + set => _innerDbCommand.CommandText = value; + } + + /// + /// Gets or sets the wait time before terminating the attempt to execute a command and generating an error. + /// + /// + /// The time (in seconds) to wait for the command to execute. The default value is 30 seconds. + /// The property value assigned is less than 0. + int IDbCommand.CommandTimeout + { + get => _innerDbCommand.CommandTimeout; + set => _innerDbCommand.CommandTimeout = value; + } + + /// + /// Indicates or specifies how the property is interpreted. + /// + /// + /// One of the values. The default is Text. + CommandType IDbCommand.CommandType + { + get => _innerDbCommand.CommandType; + set => _innerDbCommand.CommandType = value; + } + + /// + /// Gets or sets the used by this instance of the + /// . + /// + /// + /// The connection to the data source. + IDbConnection IDbCommand.Connection + { + get => _innerDbCommand.Connection; + set => _innerDbCommand.Connection = value; + } + + /// + /// Creates a new instance of an object. + /// + /// An IDbDataParameter object. + IDbDataParameter IDbCommand.CreateParameter() + { + return _innerDbCommand.CreateParameter(); + } + + /// + /// Executes an SQL statement against the Connection object of a .NET Framework data provider, and returns the number + /// of rows affected. + /// + /// The number of rows affected. + /// The connection does not exist.-or- The connection is not open. + int IDbCommand.ExecuteNonQuery() + { + _request.Session.OpenConnection(); + return _innerDbCommand.ExecuteNonQuery(); + } + + /// + /// Executes the against the + /// , and builds an + /// using one of the values. + /// + /// One of the values. + /// + /// An object. + /// + IDataReader IDbCommand.ExecuteReader(CommandBehavior behavior) + { + _request.Session.OpenConnection(); + return _innerDbCommand.ExecuteReader(behavior); + } + + /// + /// Executes the against the + /// and builds an . + /// + /// + /// An object. + /// + IDataReader IDbCommand.ExecuteReader() + { + _request.Session.OpenConnection(); + _request.MoveNextResultMap(); + return new DataReaderDecorator(_innerDbCommand.ExecuteReader(), _request); + } + + /// + /// Executes the query, and returns the first column of the first row in the resultset returned by the query. Extra + /// columns or rows are ignored. + /// + /// + /// The first column of the first row in the resultset. + /// + object IDbCommand.ExecuteScalar() + { + _request.Session.OpenConnection(); + return _innerDbCommand.ExecuteScalar(); + } + + /// + /// Gets the . + /// + /// + /// The parameters of the SQL statement or stored procedure. + IDataParameterCollection IDbCommand.Parameters => _innerDbCommand.Parameters; + + /// + /// Creates a prepared (or compiled) version of the command on the data source. + /// + /// + /// The + /// is not set.-or- The is not + /// . + /// + void IDbCommand.Prepare() + { + _innerDbCommand.Prepare(); + } + + /// + /// Gets or sets the transaction within which the Command object of a .NET Framework data provider executes. + /// + /// + /// the Command object of a .NET Framework data provider executes. The default value is null. + IDbTransaction IDbCommand.Transaction + { + get => _innerDbCommand.Transaction; + set => _innerDbCommand.Transaction = value; + } + + /// + /// Gets or sets how command results are applied to the when used by the + /// method of a + /// . + /// + /// + /// + /// One of the values. The default is Both unless the command is + /// automatically generated. Then the default is None. + /// + /// + /// The value entered was not one of the + /// values. + /// + UpdateRowSource IDbCommand.UpdatedRowSource + { + get => _innerDbCommand.UpdatedRowSource; + set => _innerDbCommand.UpdatedRowSource = value; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Commands/DefaultPreparedCommand.cs b/ORBatisCore/Commands/DefaultPreparedCommand.cs new file mode 100644 index 0000000..af3d998 --- /dev/null +++ b/ORBatisCore/Commands/DefaultPreparedCommand.cs @@ -0,0 +1,201 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 591573 $ + * $Date: 2007-11-03 04:17:59 -0600 (Sat, 03 Nov 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using System.Reflection; +using System.Text; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.Commands; + +/// +/// Summary description for DefaultPreparedCommand. +/// +internal class DefaultPreparedCommand : IPreparedCommand +{ + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + #region IPreparedCommand Members + /// + /// Create an IDbCommand for the SqlMapSession and the current SQL Statement + /// and fill IDbCommand IDataParameter's with the parameterObject. + /// + /// + /// The SqlMapSession + /// The IStatement + /// + /// The parameter object that will fill the sql parameter + /// + /// An IDbCommand with all the IDataParameter filled. + public void Create(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject) + { + // the IDbConnection & the IDbTransaction are assign in the CreateCommand + request.IDbCommand = new DbCommandDecorator(session.CreateCommand(statement.CommandType), request); + + request.IDbCommand.CommandText = request.PreparedStatement.PreparedSql; + + if (_logger.IsDebugEnabled) _logger.Debug("Statement Id: [" + statement.Id + "] PreparedStatement : [" + request.IDbCommand.CommandText + "]"); + + ApplyParameterMap(session, request.IDbCommand, request, statement, parameterObject); + } + + + /// + /// Applies the parameter map. + /// + /// The session. + /// The command. + /// The request. + /// The statement. + /// The parameter object. + protected virtual void ApplyParameterMap + (ISqlMapSession session, IDbCommand command, + RequestScope request, IStatement statement, object parameterObject) + { + var properties = request.PreparedStatement.DbParametersName; + var parameters = request.PreparedStatement.DbParameters; + var paramLogList = new StringBuilder(); // Log info + var typeLogList = new StringBuilder(); // Log info + + var count = properties.Count; + + for (var i = 0; i < count; ++i) + { + var sqlParameter = parameters[i]; + var parameterCopy = command.CreateParameter(); + var property = request.ParameterMap.GetProperty(i); + + #region Logging + if (_logger.IsDebugEnabled) + { + paramLogList.Append(sqlParameter.ParameterName); + paramLogList.Append("=["); + typeLogList.Append(sqlParameter.ParameterName); + typeLogList.Append("=["); + } + #endregion + + if (command.CommandType == CommandType.StoredProcedure) + { + #region store procedure command + // A store procedure must always use a ParameterMap + // to indicate the mapping order of the properties to the columns + if (request.ParameterMap == null) // Inline Parameters + throw new DataMapperException("A procedure statement tag must alway have a parameterMap attribute, which is not the case for the procedure '" + statement.Id + "'."); + + // Parameters via ParameterMap + if (property.DirectionAttribute.Length == 0) property.Direction = sqlParameter.Direction; + + sqlParameter.Direction = property.Direction; + #endregion + } + + #region Logging + if (_logger.IsDebugEnabled) + { + paramLogList.Append(property.PropertyName); + paramLogList.Append(","); + } + #endregion + + request.ParameterMap.SetParameter(property, parameterCopy, parameterObject); + + parameterCopy.Direction = sqlParameter.Direction; + + // With a ParameterMap, we could specify the ParameterDbTypeProperty + if (request.ParameterMap != null) + if (property.DbType != null && property.DbType.Length > 0) + { + var dbTypePropertyName = session.DataSource.DbProvider.ParameterDbTypeProperty; + var propertyValue = ObjectProbe.GetMemberValue(sqlParameter, dbTypePropertyName, request.DataExchangeFactory.AccessorFactory); + ObjectProbe.SetMemberValue(parameterCopy, dbTypePropertyName, propertyValue, + request.DataExchangeFactory.ObjectFactory, request.DataExchangeFactory.AccessorFactory); + } + //parameterCopy.DbType = sqlParameter.DbType; + + //parameterCopy.DbType = sqlParameter.DbType; + #region Logging + if (_logger.IsDebugEnabled) + { + if (parameterCopy.Value == DBNull.Value || parameterCopy.Value == null) + { + paramLogList.Append("null"); + paramLogList.Append("], "); + + if (parameterCopy.Value == null) + typeLogList.Append("null, null"); + else + typeLogList.Append("System.DBNull, null"); + typeLogList.Append("], "); + } + else + { + paramLogList.Append(parameterCopy.Value); + paramLogList.Append("], "); + + // sqlParameter.DbType could be null (as with Npgsql) + // if PreparedStatementFactory did not find a dbType for the parameter in: + // line 225: "if (property.DbType.Length >0)" + // Use parameterCopy.DbType + + //typeLogList.Append( sqlParameter.DbType.ToString() ); + typeLogList.Append(parameterCopy.DbType.ToString()); + typeLogList.Append(", "); + typeLogList.Append(parameterCopy.Value.GetType()); + typeLogList.Append("], "); + } + } + #endregion + + // JIRA-49 Fixes (size, precision, and scale) + if (session.DataSource.DbProvider.SetDbParameterSize) + if (sqlParameter.Size > 0) + parameterCopy.Size = sqlParameter.Size; + + if (session.DataSource.DbProvider.SetDbParameterPrecision) parameterCopy.Precision = sqlParameter.Precision; + + if (session.DataSource.DbProvider.SetDbParameterScale) parameterCopy.Scale = sqlParameter.Scale; + + parameterCopy.ParameterName = sqlParameter.ParameterName; + + command.Parameters.Add(parameterCopy); + } + + #region Logging + if (_logger.IsDebugEnabled && properties.Count > 0) + { + _logger.Debug("Statement Id: [" + statement.Id + "] Parameters: [" + paramLogList.ToString(0, paramLogList.Length - 2) + "]"); + _logger.Debug("Statement Id: [" + statement.Id + "] Types: [" + typeLogList.ToString(0, typeLogList.Length - 2) + "]"); + } + #endregion + } + #endregion +} \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/Commands/IDbDataParameterCollection.cs b/ORBatisCore/Commands/IDbDataParameterCollection.cs similarity index 100% rename from src/IBatisNet.DataMapper/Commands/IDbDataParameterCollection.cs rename to ORBatisCore/Commands/IDbDataParameterCollection.cs diff --git a/ORBatisCore/Commands/IPreparedCommand.cs b/ORBatisCore/Commands/IPreparedCommand.cs new file mode 100644 index 0000000..8e19700 --- /dev/null +++ b/ORBatisCore/Commands/IPreparedCommand.cs @@ -0,0 +1,50 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.Commands; + +/// +/// Summary description for IPreparedCommand. +/// +public interface IPreparedCommand +{ + /// + /// Create an IDbCommand for the SqlMapSession and the current SQL Statement + /// and fill IDbCommand IDataParameter's with the parameterObject. + /// + /// + /// The SqlMapSession + /// The IStatement + /// + /// The parameter object that will fill the sql parameter + /// + /// An IDbCommand with all the IDataParameter filled. + void Create(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject); +} \ No newline at end of file diff --git a/ORBatisCore/Commands/InMemoryDataReader.cs b/ORBatisCore/Commands/InMemoryDataReader.cs new file mode 100644 index 0000000..dfca35d --- /dev/null +++ b/ORBatisCore/Commands/InMemoryDataReader.cs @@ -0,0 +1,579 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-26 14:12:57 -0600 (Wed, 26 Apr 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; +using System.Data; +using IBatisNet.Common; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.Commands; + +/// +/// An implementation of that will copy the contents +/// of the an open to an in-memory if the +/// session doesn't allow multiple open with +/// the same . +/// +public class InMemoryDataReader : IDataReader +{ + private int _currentRowIndex; + + private InMemoryResultSet[] _results; + + + /// + /// Creates an InMemoryDataReader from a + /// + /// The which holds the records from the Database. + public InMemoryDataReader(IDataReader reader) + { + var resultList = new ArrayList(); + + try + { + Depth = 0; + _currentRowIndex = 0; + + resultList.Add(new InMemoryResultSet(reader, true)); + + while (reader.NextResult()) resultList.Add(new InMemoryResultSet(reader, false)); + + _results = (InMemoryResultSet[])resultList.ToArray(typeof(InMemoryResultSet)); + } + catch (Exception e) + { + throw new DataMapperException("There was a problem converting an IDataReader to an InMemoryDataReader", e); + } + finally + { + reader.Close(); + reader.Dispose(); + } + } + + + /// + /// Gets the current result set. + /// + /// The current result set. + private InMemoryResultSet CurrentResultSet => _results[Depth]; + + #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + IsClosed = true; + _results = null; + } + #endregion + + /// + /// Represent an in-memory result set + /// + private class InMemoryResultSet + { + private readonly string[] _dataTypeName; + + private readonly string[] _fieldsName; + private readonly StringDictionary _fieldsNameLookup = new(); + + private readonly Type[] _fieldsType; + + // [row][column] + private readonly object[][] _records; + + /// + /// Creates an in-memory ResultSet from a + /// + /// + /// true if the is already positioned on the record + /// to start reading from. + /// + /// The which holds the records from the Database. + public InMemoryResultSet(IDataReader reader, bool isMidstream) + { + // [record index][ columns values=object[ ] ] + var recordsList = new ArrayList(); + + FieldCount = reader.FieldCount; + _fieldsName = new string[FieldCount]; + _fieldsType = new Type[FieldCount]; + _dataTypeName = new string[FieldCount]; + + + var firstRow = true; + + // if we are in the middle of processing the reader then don't bother + // to move to the next record - just use the current one. + // Copy the records in memory + while (isMidstream || reader.Read()) + { + if (firstRow) + for (var fieldIndex = 0; fieldIndex < reader.FieldCount; fieldIndex++) + { + var fieldName = reader.GetName(fieldIndex); + + _fieldsName[fieldIndex] = fieldName; + if (!_fieldsNameLookup.ContainsKey(fieldName)) _fieldsNameLookup.Add(fieldName, fieldIndex.ToString()); + + _fieldsType[fieldIndex] = reader.GetFieldType(fieldIndex); + _dataTypeName[fieldIndex] = reader.GetDataTypeName(fieldIndex); + } + + firstRow = false; + + var columnsValues = new object[FieldCount]; + reader.GetValues(columnsValues); + recordsList.Add(columnsValues); + + isMidstream = false; + } + + _records = (object[][])recordsList.ToArray(typeof(object[])); + } + + /// + /// Gets the number of columns in the current row. + /// + /// The number of columns in the current row. + public int FieldCount { get; } + + /// + /// The number of record contained in the ResultSet. + /// + public int RecordCount => _records.Length; + + /// + /// Get a column value in a row + /// + /// The row index + /// The column index + /// The column value + public object GetValue(int rowIndex, int colIndex) + { + return _records[rowIndex][colIndex]; + } + + + /// + /// Gets the type of the field. + /// + /// Index of the col. + /// The type of the field. + public Type GetFieldType(int colIndex) + { + return _fieldsType[colIndex]; + } + + /// + /// Gets the name of the field. + /// + /// Index of the col. + /// The name of the field. + public string GetName(int colIndex) + { + return _fieldsName[colIndex]; + } + + /// + /// Gets the ordinal. + /// + /// Name of the column. + /// The ordinal of the column + public int GetOrdinal(string colName) + { + if (_fieldsNameLookup.ContainsKey(colName)) return Convert.ToInt32(_fieldsNameLookup[colName]); + + throw new IndexOutOfRangeException(string.Format("No column with the specified name was found: {0}.", colName)); + } + + /// + /// Gets the name of the database type. + /// + /// Index of the col. + /// The name of the database type + public string GetDataTypeName(int colIndex) + { + return _dataTypeName[colIndex]; + } + + + /// + /// Gets the values. + /// + /// Index of the row. + /// The values. + /// + public int GetValues(int rowIndex, object[] values) + { + Array.Copy(_records[rowIndex], 0, values, 0, FieldCount); + return FieldCount; + } + } + + + #region IDataReader Members + /// + /// Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. + /// + public int RecordsAffected => throw new NotImplementedException("InMemoryDataReader only used for select IList statements !"); + + /// + /// Gets a value indicating whether the data reader is closed. + /// + public bool IsClosed { get; private set; } + + /// + /// Advances the data reader to the next result, when reading the results of batch SQL statements. + /// + /// + public bool NextResult() + { + Depth++; + if (Depth >= _results.Length) + { + Depth--; + return false; + } + + return true; + } + + /// + /// Closes the IDataReader 0bject. + /// + public void Close() + { + IsClosed = true; + } + + /// + /// Advances the IDataReader to the next record. + /// + /// true if there are more rows; otherwise, false. + public bool Read() + { + _currentRowIndex++; + if (_currentRowIndex >= _results[Depth].RecordCount) + { + _currentRowIndex--; + return false; + } + + return true; + } + + /// + /// Gets a value indicating the depth of nesting for the current row. + /// + public int Depth { get; private set; } + + /// + /// Returns a DataTable that describes the column metadata of the IDataReader. + /// + /// + public DataTable GetSchemaTable() + { + throw new NotImplementedException("GetSchemaTable() is not implemented, cause not use."); + } + #endregion + + #region IDataRecord Members + /// + /// Gets the 32-bit signed integer value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public int GetInt32(int fieldIndex) + { + return (int)GetValue(fieldIndex); + } + + /// + /// Gets the column with the specified name. + /// + public object this[string name] => this[GetOrdinal(name)]; + + /// + /// Gets the column located at the specified index. + /// + public object this[int fieldIndex] => GetValue(fieldIndex); + + /// + /// Return the value of the specified field. + /// + /// The index of the field to find. + /// The object which will contain the field value upon return. + public object GetValue(int fieldIndex) + { + return CurrentResultSet.GetValue(_currentRowIndex, fieldIndex); + } + + /// + /// Return whether the specified field is set to null. + /// + /// The zero-based column ordinal. + /// The value of the column. + public bool IsDBNull(int fieldIndex) + { + return GetValue(fieldIndex) == DBNull.Value; + } + + /// + /// Reads a stream of bytes from the specified column offset into the buffer as an array, + /// starting at the given buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the field from which to begin the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to begin the read operation. + /// The number of bytes to read. + /// The actual number of bytes read. + public long GetBytes(int fieldIndex, long dataIndex, byte[] buffer, int bufferIndex, int length) + { + var value = GetValue(fieldIndex); + if (!(value is byte[])) throw new InvalidCastException("Type is " + value.GetType()); + + if (buffer == null) + // Return length of data + return ((byte[])value).Length; + + // Copy data into buffer + var availableLength = (int)(((byte[])value).Length - dataIndex); + if (availableLength < length) length = availableLength; + + Array.Copy((byte[])value, (int)dataIndex, buffer, bufferIndex, length); + return length; + } + + + /// + /// Gets the 8-bit unsigned integer value of the specified column. + /// + /// The zero-based column ordinal. + /// The value of the column. + public byte GetByte(int fieldIndex) + { + return (byte)GetValue(fieldIndex); + } + + /// + /// Gets the Type information corresponding to the type of Object that would be returned from GetValue. + /// + /// The zero-based column ordinal. + /// The value of the column. + public Type GetFieldType(int fieldIndex) + { + return CurrentResultSet.GetFieldType(fieldIndex); + } + + /// + /// Gets the fixed-position numeric value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public decimal GetDecimal(int fieldIndex) + { + return (decimal)GetValue(fieldIndex); + } + + /// + /// Gets all the attribute fields in the collection for the current record. + /// + /// + /// + public int GetValues(object[] values) + { + return CurrentResultSet.GetValues(_currentRowIndex, values); + } + + /// + /// Gets the name for the field to find. + /// + /// The zero-based column ordinal. + /// The value of the column. + public string GetName(int fieldIndex) + { + return CurrentResultSet.GetName(fieldIndex); + } + + /// + /// Indicates the number of fields within the current record. This property is read-only. + /// + public int FieldCount => CurrentResultSet.FieldCount; + + /// + /// + /// The zero-based column ordinal. + /// The value of the column. + public long GetInt64(int fieldIndex) + { + return (long)GetValue(fieldIndex); + } + + /// + /// + /// The zero-based column ordinal. + /// The value of the column. + public double GetDouble(int fieldIndex) + { + return (double)GetValue(fieldIndex); + } + + /// + /// Gets the value of the specified column as a Boolean. + /// + /// The zero-based column ordinal. + /// The value of the column. + public bool GetBoolean(int fieldIndex) + { + return (bool)GetValue(fieldIndex); + } + + /// + /// Returns the GUID value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public Guid GetGuid(int fieldIndex) + { + return (Guid)GetValue(fieldIndex); + } + + /// + /// Returns the value of the specified column as a DateTime object. + /// + /// The zero-based column ordinal. + /// The value of the column. + public DateTime GetDateTime(int fieldIndex) + { + return (DateTime)GetValue(fieldIndex); + } + + /// + /// Returns the column ordinal, given the name of the column. + /// + /// The name of the column. + /// The value of the column. + public int GetOrdinal(string colName) + { + return CurrentResultSet.GetOrdinal(colName); + } + + /// + /// Gets the database type information for the specified field. + /// + /// The index of the field to find. + /// The database type information for the specified field. + public string GetDataTypeName(int fieldIndex) + { + return CurrentResultSet.GetDataTypeName(fieldIndex); + } + + /// + /// Returns the value of the specified column as a single-precision floating point number. + /// + /// The zero-based column ordinal. + /// The value of the column. + public float GetFloat(int fieldIndex) + { + return (float)GetValue(fieldIndex); + } + + /// + /// Gets an IDataReader to be used when the field points to more remote structured data. + /// + /// The zero-based column ordinal. + /// The value of the column. + public IDataReader GetData(int fieldIndex) + { + throw new NotImplementedException("GetData(int) is not implemented, cause not use."); + } + + /// + /// Reads a stream of characters from the specified column offset into the buffer as an array, + /// starting at the given buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the row from which to begin the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to begin the read operation. + /// The number of bytes to read. + /// The actual number of characters read. + public long GetChars(int fieldIndex, long dataIndex, char[] buffer, int bufferIndex, int length) + { + var value = GetValue(fieldIndex); + char[] valueBuffer = null; + + if (value is char[]) + valueBuffer = (char[])value; + else if (value is string) + valueBuffer = ((string)value).ToCharArray(); + else + throw new InvalidCastException("Type is " + value.GetType()); + + if (buffer == null) + // Return length of data + return valueBuffer.Length; + + // Copy data into buffer + Array.Copy(valueBuffer, (int)dataIndex, buffer, bufferIndex, length); + return valueBuffer.Length - dataIndex; + } + + /// + /// Gets the string value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public string GetString(int fieldIndex) + { + return (string)GetValue(fieldIndex); + } + + /// + /// Gets the character value of the specified column. + /// + /// The zero-based column ordinal. + /// The value of the column. + public char GetChar(int fieldIndex) + { + return (char)GetValue(fieldIndex); + } + + /// + /// Gets the 16-bit signed integer value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public short GetInt16(int fieldIndex) + { + return (short)GetValue(fieldIndex); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Commands/PreparedCommandFactory.cs b/ORBatisCore/Commands/PreparedCommandFactory.cs new file mode 100644 index 0000000..a38a8fb --- /dev/null +++ b/ORBatisCore/Commands/PreparedCommandFactory.cs @@ -0,0 +1,51 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 512878 $ + * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.Commands; + +/// +/// Summary description for PreparedCommandFactory. +/// +internal sealed class PreparedCommandFactory +{ + /// + /// Get an IPreparedCommand. + /// + /// + public static IPreparedCommand GetPreparedCommand(bool isEmbedStatementParams) + { + IPreparedCommand preparedCommand = null; + +// if (isEmbedStatementParams) +// { +// preparedCommand = new EmbedParamsPreparedCommand(); +// } +// else +// { + preparedCommand = new DefaultPreparedCommand(); +// } + + return preparedCommand; + } +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Alias/TypeAlias.cs b/ORBatisCore/Configuration/Alias/TypeAlias.cs new file mode 100644 index 0000000..58c5b95 --- /dev/null +++ b/ORBatisCore/Configuration/Alias/TypeAlias.cs @@ -0,0 +1,114 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 408099 $ + * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Xml.Serialization; +using IBatisNet.Common.Utilities; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Alias; + +/// +/// TypeAlias. +/// +[Serializable] +[XmlRoot("typeAlias", Namespace = "http://ibatis.apache.org/dataMapper")] +public class TypeAlias +{ + #region Methods + /// + /// Initialize the object, + /// try to idenfify the .Net type class from the corresponding name. + /// + public void Initialize() + { + _class = TypeUtils.ResolveType(_className); + } + #endregion + + #region Fields + [NonSerialized] private string _name = string.Empty; + + [NonSerialized] private string _className = string.Empty; + + [NonSerialized] private Type _class; + #endregion + + #region Properties + /// + /// Name used to identify the typeAlias amongst the others. + /// + /// Account + [XmlAttribute("alias")] + public string Name + { + get => _name; + set + { + if (value == null || value.Length < 1) throw new ArgumentNullException("The name attribute is mandatory in the typeAlias "); + _name = value; + } + } + + + /// + /// The type class for the typeAlias + /// + [XmlIgnore] + public Type Class => _class; + + + /// + /// The class name to identify the typeAlias. + /// + /// Com.Site.Domain.Product + [XmlAttribute("type")] + public string ClassName + { + get => _className; + set + { + if (value == null || value.Length < 1) throw new ArgumentNullException("The class attribute is mandatory in the typeAlias " + _name); + _className = value; + } + } + #endregion + + #region Constructor (s) / Destructor + /// + /// Do not use direclty, only for serialization. + /// + public TypeAlias() { } + + /// + /// Constructor + /// + /// a type. + public TypeAlias(Type type) + { + _class = type; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Alias/TypeHandler.cs b/ORBatisCore/Configuration/Alias/TypeHandler.cs new file mode 100644 index 0000000..580da46 --- /dev/null +++ b/ORBatisCore/Configuration/Alias/TypeHandler.cs @@ -0,0 +1,105 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 408099 $ + * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Xml.Serialization; +using IBatisNet.Common.Utilities; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Alias; + +/// +/// Summary description for TypeHandler. +/// +[Serializable] +[XmlRoot("typeHandler", Namespace = "http://ibatis.apache.org/dataMapper")] +public class TypeHandler +{ + #region Constructors + /// + /// Do not use direclty, only for serialization. + /// + public TypeHandler() { } + #endregion + + #region Methods + /// + /// Initialize the object, + /// try to idenfify the .Net type class from the corresponding name. + /// + public void Initialize() + { + _class = TypeUtils.ResolveType(_className); + } + #endregion + #region Fields + [NonSerialized] private string _className = string.Empty; + + [NonSerialized] private Type _class; + + [NonSerialized] private string _dbType = string.Empty; + + [NonSerialized] private string _callBackName = string.Empty; + #endregion + + #region Properties + /// + /// CLR type + /// + [XmlAttribute("type")] + public string ClassName + { + get => _className; + set => _className = value; + } + + /// + /// The type class for the TypeName + /// + [XmlIgnore] + public Type Class => _class; + + /// + /// dbType name + /// + [XmlAttribute("dbType")] + public string DbType + { + get => _dbType; + set => _dbType = value; + } + + + /// + /// callback alias name + /// + [XmlAttribute("callback")] + public string CallBackName + { + get => _callBackName; + set => _callBackName = value; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/CacheKey.cs b/ORBatisCore/Configuration/Cache/CacheKey.cs new file mode 100644 index 0000000..25c7358 --- /dev/null +++ b/ORBatisCore/Configuration/Cache/CacheKey.cs @@ -0,0 +1,149 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 451064 $ + * $Date: 2006-09-28 17:53:56 -0600 (Thu, 28 Sep 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - iBATIS Team + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Text; +using IBatisNet.Common.Utilities; + +namespace IBatisNet.DataMapper.Configuration.Cache; + +/// +/// Hash value generator for cache keys +/// +public class CacheKey +{ + private const int DEFAULT_MULTIPLYER = 37; + private const int DEFAULT_HASHCODE = 17; + + private readonly int _multiplier = DEFAULT_MULTIPLYER; + private readonly IList _paramList = new ArrayList(); + private long _checksum = long.MinValue; + private int _count; + private int _hashCode = DEFAULT_HASHCODE; + + /// + /// Default constructor + /// + public CacheKey() + { + _hashCode = DEFAULT_HASHCODE; + _multiplier = DEFAULT_MULTIPLYER; + _count = 0; + } + + /// + /// Constructor that supplies an initial hashcode + /// + /// the hashcode to use + public CacheKey(int initialNonZeroOddNumber) + { + _hashCode = initialNonZeroOddNumber; + _multiplier = DEFAULT_MULTIPLYER; + _count = 0; + } + + /// + /// Constructor that supplies an initial hashcode and multiplier + /// + /// the hashcode to use + /// the multiplier to use + public CacheKey(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber) + { + _hashCode = initialNonZeroOddNumber; + _multiplier = multiplierNonZeroOddNumber; + _count = 0; + } + + /// + /// Updates this object with new information based on an object + /// + /// the object + /// the cachekey + public CacheKey Update(object obj) + { + var baseHashCode = HashCodeProvider.GetIdentityHashCode(obj); + + _count++; + _checksum += baseHashCode; + baseHashCode *= _count; + + _hashCode = _multiplier * _hashCode + baseHashCode; + + _paramList.Add(obj); + + return this; + } + + /// + /// + /// + /// + public override bool Equals(object obj) + { + if (this == obj) return true; + if (!(obj is CacheKey)) return false; + + var cacheKey = (CacheKey)obj; + + if (_hashCode != cacheKey._hashCode) return false; + if (_checksum != cacheKey._checksum) return false; + if (_count != cacheKey._count) return false; + + var count = _paramList.Count; + for (var i = 0; i < count; i++) + { + var thisParam = _paramList[i]; + var thatParam = cacheKey._paramList[i]; + if (thisParam == null) + { + if (thatParam != null) return false; + } + else + { + if (!thisParam.Equals(thatParam)) return false; + } + } + + return true; + } + + /// + /// Get the HashCode for this CacheKey + /// + /// + public override int GetHashCode() + { + return _hashCode; + } + + /// + /// ToString implementation. + /// + /// A string that give the CacheKey HashCode. + public override string ToString() + { + return new StringBuilder().Append(_hashCode).Append('|').Append(_checksum).ToString(); + } +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/CacheModel.cs b/ORBatisCore/Configuration/Cache/CacheModel.cs new file mode 100644 index 0000000..bbaf691 --- /dev/null +++ b/ORBatisCore/Configuration/Cache/CacheModel.cs @@ -0,0 +1,368 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 575913 $ + * $LastChangedDate: 2007-09-15 06:43:08 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Xml.Serialization; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache; + +/// +/// Summary description for CacheModel. +/// +[Serializable] +[XmlRoot("cacheModel", Namespace = "http://ibatis.apache.org/mapping")] +public class CacheModel +{ + #region Constructor (s) / Destructor + /// + /// Constructor + /// + public CacheModel() + { + _lastFlush = DateTime.Now.Ticks; + } + #endregion + + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.Synchronized)] + public object GetLock(CacheKey key) + { + var controllerId = HashCodeProvider.GetIdentityHashCode(_controller); + var keyHash = key.GetHashCode(); + var lockKey = 29 * controllerId + keyHash; + var lok = _lockMap[lockKey]; + if (lok == null) + { + lok = lockKey; //might as well use the same object + _lockMap[lockKey] = lok; + } + + return lok; + } + + #region Fields + private static IDictionary _lockMap = new HybridDictionary(); + + [NonSerialized] private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// This is used to represent null objects that are returned from the cache so + /// that they can be cached, too. + /// + [NonSerialized] public static readonly object NULL_OBJECT = new(); + + /// + /// Constant to turn off periodic cache flushes + /// + [NonSerialized] public const long NO_FLUSH_INTERVAL = -99999; + + [NonSerialized] private object _statLock = new(); + + [NonSerialized] private int _requests; + + [NonSerialized] private int _hits; + + [NonSerialized] private string _id = string.Empty; + + [NonSerialized] private ICacheController _controller; + + [NonSerialized] private FlushInterval _flushInterval; + + [NonSerialized] private long _lastFlush; + + [NonSerialized] private HybridDictionary _properties = new(); + + [NonSerialized] private string _implementation = string.Empty; + + [NonSerialized] private bool _isReadOnly = true; + + [NonSerialized] private bool _isSerializable; + #endregion + + #region Properties + /// + /// Identifier used to identify the CacheModel amongst the others. + /// + [XmlAttribute("id")] + public string Id + { + get => _id; + set + { + if (value == null || value.Length < 1) + throw new ArgumentNullException("The id attribute is mandatory in a cacheModel tag."); + + _id = value; + } + } + + /// + /// Cache controller implementation name. + /// + [XmlAttribute("implementation")] + public string Implementation + { + get => _implementation; + set + { + if (value == null || value.Length < 1) + throw new ArgumentNullException("The implementation attribute is mandatory in a cacheModel tag."); + + _implementation = value; + } + } + + /// + /// Set the cache controller + /// + public ICacheController CacheController + { + set => _controller = value; + } + + /// + /// Set or get the flushInterval (in Ticks) + /// + [XmlElement("flushInterval", typeof(FlushInterval))] + public FlushInterval FlushInterval + { + get => _flushInterval; + set => _flushInterval = value; + } + + /// + /// Specifie how the cache content should be returned. + /// If true a deep copy is returned. + /// + /// + /// Combinaison + /// IsReadOnly=true/IsSerializable=false : Returned instance of cached object + /// IsReadOnly=false/IsSerializable=true : Returned coopy of cached object + /// + public bool IsSerializable + { + get => _isSerializable; + set => _isSerializable = value; + } + + /// + /// Determines if the cache will be used as a read-only cache. + /// Tells the cache model that is allowed to pass back a reference to the object + /// existing in the cache. + /// + /// + /// The IsReadOnly properties works in conjonction with the IsSerializable propertie. + /// + public bool IsReadOnly + { + get => _isReadOnly; + set => _isReadOnly = value; + } + #endregion + + #region Methods + /// + /// + public void Initialize() + { + // Initialize FlushInterval + _flushInterval.Initialize(); + + try + { + if (_implementation == null) throw new DataMapperException("Error instantiating cache controller for cache named '" + _id + "'. Cause: The class for name '" + _implementation + "' could not be found."); + + // Build the CacheController + var type = TypeUtils.ResolveType(_implementation); + var arguments = new object[0]; + + _controller = (ICacheController)Activator.CreateInstance(type, arguments); + } + catch (Exception e) + { + throw new ConfigurationException("Error instantiating cache controller for cache named '" + _id + ". Cause: " + e.Message, e); + } + + //------------ configure Controller--------------------- + try + { + _controller.Configure(_properties); + } + catch (Exception e) + { + throw new ConfigurationException("Error configuring controller named '" + _id + "'. Cause: " + e.Message, e); + } + } + + + /// + /// Event listener + /// + /// A MappedStatement on which we listen ExecuteEventArgs event. + public void RegisterTriggerStatement(IMappedStatement mappedStatement) + { + mappedStatement.Execute += FlushHandler; + } + + + /// + /// FlushHandler which clear the cache + /// + /// + /// + private void FlushHandler(object sender, ExecuteEventArgs e) + { + if (_logger.IsDebugEnabled) _logger.Debug("Flush cacheModel named " + _id + " for statement '" + e.StatementName + "'"); + + Flush(); + } + + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + _lastFlush = DateTime.Now.Ticks; + _controller.Flush(); + } + + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + /// + /// A side effect of this method is that is may clear the cache + /// if it has not been cleared in the flushInterval. + /// + public object this[CacheKey key] + { + get + { + lock (this) + { + if (_lastFlush != NO_FLUSH_INTERVAL + && DateTime.Now.Ticks - _lastFlush > _flushInterval.Interval) + Flush(); + } + + object value = null; + lock (GetLock(key)) + { + value = _controller[key]; + } + + // No longer supported in Net8.0++. Strictly forbidden by microsoft. + // if (_isSerializable && !_isReadOnly && + // value != NULL_OBJECT && value != null) + // try + // { + // var stream = new MemoryStream((byte[])value); + // stream.Position = 0; + // var formatter = new BinaryFormatter(); + // value = formatter.Deserialize(stream); + // } + // catch (Exception ex) + // { + // throw new IBatisNetException("Error caching serializable object. Be sure you're not attempting to use " + + // "a serialized cache for an object that may be taking advantage of lazy loading. Cause: " + ex.Message, ex); + // } + + lock (_statLock) + { + _requests++; + if (value != null) _hits++; + } + + if (_logger.IsDebugEnabled) + { + if (value != null) + _logger.Debug(string.Format("Retrieved cached object '{0}' using key '{1}' ", value, key)); + else + _logger.Debug(string.Format("Cache miss using key '{0}' ", key)); + } + + return value; + } + set + { + // No longer supported in Net8.0++. Strictly forbidden by microsoft. + // if (null == value) value = NULL_OBJECT; + // if (_isSerializable && !_isReadOnly && value != NULL_OBJECT) + // try + // { + // var stream = new MemoryStream(); + // var formatter = new BinaryFormatter(); + // formatter.Serialize(stream, value); + // value = stream.ToArray(); + // } + // catch (Exception ex) + // { + // throw new IBatisNetException("Error caching serializable object. Cause: " + ex.Message, ex); + // } + _controller[key] = value; + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Cache object '{0}' using key '{1}' ", value, key)); + } + } + + /// + /// + public double HitRatio + { + get + { + if (_requests != 0) return _hits / (double)_requests; + + return 0; + } + } + + + /// + /// Add a property + /// + /// The name of the property + /// The value of the property + public void AddProperty(string name, string value) + { + _properties.Add(name, value); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/Fifo/FifoCacheController.cs b/ORBatisCore/Configuration/Cache/Fifo/FifoCacheController.cs new file mode 100644 index 0000000..a503c7a --- /dev/null +++ b/ORBatisCore/Configuration/Cache/Fifo/FifoCacheController.cs @@ -0,0 +1,110 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Fifo; + +/// +/// Summary description for FifoCacheController. +/// +public class FifoCacheController : ICacheController +{ + #region Constructor (s) / Destructor + /// + /// + public FifoCacheController() + { + _cacheSize = 100; + _cache = Hashtable.Synchronized(new Hashtable()); + _keyList = ArrayList.Synchronized(new ArrayList()); + } + #endregion + #region Fields + private int _cacheSize; + private readonly Hashtable _cache; + private readonly IList _keyList; + #endregion + + #region ICacheController Members + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + public object Remove(object key) + { + var o = this[key]; + + _keyList.Remove(key); + _cache.Remove(key); + return o; + } + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + _cache.Clear(); + _keyList.Clear(); + } + + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + public object this[object key] + { + get => _cache[key]; + set + { + _cache[key] = value; + _keyList.Add(key); + if (_keyList.Count > _cacheSize) + { + var oldestKey = _keyList[0]; + _keyList.Remove(0); + _cache.Remove(oldestKey); + } + } + } + + + /// + /// Configures the cache + /// + public void Configure(IDictionary properties) + { + var size = (string)properties["CacheSize"]; + ; + if (size != null) _cacheSize = Convert.ToInt32(size); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/FlushInterval.cs b/ORBatisCore/Configuration/Cache/FlushInterval.cs new file mode 100644 index 0000000..81be3eb --- /dev/null +++ b/ORBatisCore/Configuration/Cache/FlushInterval.cs @@ -0,0 +1,114 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 707150 $ + * $Date: 2008-10-22 11:54:18 -0600 (Wed, 22 Oct 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Xml.Serialization; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache; + +/// +/// Summary description for FlushInterval. +/// +[Serializable] +[XmlRoot("flushInterval")] +public class FlushInterval +{ + #region Methods + /// + /// Calcul the flush interval value in ticks + /// + public void Initialize() + { + long interval = 0; + if (_milliseconds != 0) interval += _milliseconds * TimeSpan.TicksPerMillisecond; + if (_seconds != 0) interval += _seconds * TimeSpan.TicksPerSecond; + if (_minutes != 0) interval += _minutes * TimeSpan.TicksPerMinute; + if (_hours != 0) interval += _hours * TimeSpan.TicksPerHour; + + if (interval == 0) interval = CacheModel.NO_FLUSH_INTERVAL; + Interval = interval; + } + #endregion + + #region Fields + private int _hours; + private int _minutes; + private int _seconds; + private int _milliseconds; + #endregion + + #region Properties + /// + /// Flush interval in hours + /// + [XmlAttribute("hours")] + public int Hours + { + get => _hours; + set => _hours = value; + } + + + /// + /// Flush interval in minutes + /// + [XmlAttribute("minutes")] + public int Minutes + { + get => _minutes; + set => _minutes = value; + } + + + /// + /// Flush interval in seconds + /// + [XmlAttribute("seconds")] + public int Seconds + { + get => _seconds; + set => _seconds = value; + } + + + /// + /// Flush interval in milliseconds + /// + [XmlAttribute("milliseconds")] + public int Milliseconds + { + get => _milliseconds; + set => _milliseconds = value; + } + + + /// + /// Get the flush interval value + /// + [XmlIgnoreAttribute] + public long Interval { get; private set; } = CacheModel.NO_FLUSH_INTERVAL; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/ICacheController.cs b/ORBatisCore/Configuration/Cache/ICacheController.cs new file mode 100644 index 0000000..2c5f59e --- /dev/null +++ b/ORBatisCore/Configuration/Cache/ICacheController.cs @@ -0,0 +1,65 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache; + +/// +/// Summary description for ICacheController. +/// +public interface ICacheController +{ + #region Properties + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + object this[object key] { get; set; } + #endregion + + #region Methods + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + object Remove(object key); + + /// + /// Clears all elements from the cache. + /// + void Flush(); + + /// + /// Configures the CacheController + /// + /// + void Configure(IDictionary properties); + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/Lru/LruCacheController.cs b/ORBatisCore/Configuration/Cache/Lru/LruCacheController.cs new file mode 100644 index 0000000..d8a8faf --- /dev/null +++ b/ORBatisCore/Configuration/Cache/Lru/LruCacheController.cs @@ -0,0 +1,115 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Lru; + +/// +/// Summary description for LruCacheController. +/// +public class LruCacheController : ICacheController +{ + #region Constructor (s) / Destructor + /// + /// + public LruCacheController() + { + _cacheSize = 100; + _cache = Hashtable.Synchronized(new Hashtable()); + _keyList = ArrayList.Synchronized(new ArrayList()); + } + #endregion + #region Fields + private int _cacheSize; + private readonly Hashtable _cache; + private readonly IList _keyList; + #endregion + + #region ICacheController Members + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + public object Remove(object key) + { + var o = this[key]; + + _keyList.Remove(key); + _cache.Remove(key); + return o; + } + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + _cache.Clear(); + _keyList.Clear(); + } + + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + public object this[object key] + { + get + { + _keyList.Remove(key); + _keyList.Add(key); + return _cache[key]; + } + set + { + _cache[key] = value; + _keyList.Add(key); + if (_keyList.Count > _cacheSize) + { + var oldestKey = _keyList[0]; + _keyList.Remove(0); + _cache.Remove(oldestKey); + } + } + } + + + /// + /// Configures the cache + /// + public void Configure(IDictionary properties) + { + var size = (string)properties["CacheSize"]; + ; + if (size != null) _cacheSize = Convert.ToInt32(size); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/Memory/MemoryCacheControler.cs b/ORBatisCore/Configuration/Cache/Memory/MemoryCacheControler.cs new file mode 100644 index 0000000..69db7c1 --- /dev/null +++ b/ORBatisCore/Configuration/Cache/Memory/MemoryCacheControler.cs @@ -0,0 +1,142 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Memory; + +/// +/// Summary description for MemoryCacheControler. +/// +public class MemoryCacheControler : ICacheController +{ + #region Constructor (s) / Destructor + /// + /// Constructor + /// + public MemoryCacheControler() + { + _cache = Hashtable.Synchronized(new Hashtable()); + } + #endregion + + /// + /// Class to implement a strong (permanent) reference. + /// + private class StrongReference + { + public StrongReference(object obj) + { + Target = obj; + } + + /// + /// Gets the object (the target) referenced by this instance. + /// + public object Target { get; } + } + + #region Fields + private MemoryCacheLevel _cacheLevel = MemoryCacheLevel.Weak; + private readonly Hashtable _cache; + #endregion + + #region ICacheController Members + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + public object Remove(object key) + { + object value = null; + var reference = this[key]; + _cache.Remove(key); + if (reference != null) + { + if (reference is StrongReference) + value = ((StrongReference)reference).Target; + else if (reference is WeakReference) value = ((WeakReference)reference).Target; + } + + return value; + } + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + public object this[object key] + { + get + { + object value = null; + var reference = _cache[key]; + if (reference != null) + { + if (reference is StrongReference) + value = ((StrongReference)reference).Target; + else if (reference is WeakReference) value = ((WeakReference)reference).Target; + } + + return value; + } + set + { + object reference = null; + if (_cacheLevel.Equals(MemoryCacheLevel.Weak)) + reference = new WeakReference(value); + else if (_cacheLevel.Equals(MemoryCacheLevel.Strong)) reference = new StrongReference(value); + _cache[key] = reference; + } + } + + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + lock (this) + { + _cache.Clear(); + } + } + + + /// + /// Configures the cache + /// + public void Configure(IDictionary properties) + { + var referenceType = (string)properties["Type"]; + ; + if (referenceType != null) _cacheLevel = MemoryCacheLevel.GetByRefenceType(referenceType.ToUpper()); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Cache/Memory/MemoryCacheLevel.cs b/ORBatisCore/Configuration/Cache/Memory/MemoryCacheLevel.cs new file mode 100644 index 0000000..23f2b99 --- /dev/null +++ b/ORBatisCore/Configuration/Cache/Memory/MemoryCacheLevel.cs @@ -0,0 +1,105 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +using IBatisNet.DataMapper.Exceptions; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Memory; + +/// +/// Summary description for MemoryCacheLevel. +/// +public class MemoryCacheLevel +{ + #region Constructor (s) / Destructor + /// + /// + static MemoryCacheLevel() + { + Weak = new MemoryCacheLevel("WEAK"); + Strong = new MemoryCacheLevel("STRONG"); + + _cacheLevelMap[Weak.ReferenceType] = Weak; + _cacheLevelMap[Strong.ReferenceType] = Strong; + } + #endregion + #region Fields + private static readonly Hashtable _cacheLevelMap = new(); + + /// + /// Constant for weak caching + /// This cache model is probably the best choice in most cases. It will increase + /// performance for popular results, but it will absolutely release the memory to + /// be used in allocating other objects, assuming that the results are not currently + /// in use. + /// References an object while still allowing it to be garbage collected. + /// + public static MemoryCacheLevel Weak; + + /// + /// Constant for strong caching. + /// This cache model will guarantee that the results stay in memory until the cache + /// is explicitly flushed. This is ideal for results that are: + /// + /// very small + /// absolutely static + /// used very often + /// + /// The advantage is that performance will be very good for this particular query. + /// The disadvantage is that if the memory used by these results is needed, then it + /// will not be released to make room for other objects (possibly more important + /// objects). + /// + public static MemoryCacheLevel Strong; + #endregion + + #region Methods + /// + /// Creates a new instance of CacheLevel + /// + /// The type of the CacheLevel. + private MemoryCacheLevel(string type) + { + ReferenceType = type; + } + + /// + /// + public string ReferenceType { get; } + + /// + /// + /// + /// + public static MemoryCacheLevel GetByRefenceType(string referenceType) + { + var cacheLevel = (MemoryCacheLevel)_cacheLevelMap[referenceType]; + if (cacheLevel == null) throw new DataMapperException("Error getting CacheLevel (reference type) for name: '" + referenceType + "'."); + return cacheLevel; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/DomSqlMapBuilder.cs b/ORBatisCore/Configuration/DomSqlMapBuilder.cs new file mode 100644 index 0000000..3fd12df --- /dev/null +++ b/ORBatisCore/Configuration/DomSqlMapBuilder.cs @@ -0,0 +1,1786 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638539 $ + * $Date: 2008-03-18 13:53:02 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Text; +using System.Xml; +using System.Xml.Schema; +using IBatisNet.Common; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.Common.Xml; +using IBatisNet.DataMapper.Configuration.Alias; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.Cache.Fifo; +using IBatisNet.DataMapper.Configuration.Cache.Lru; +using IBatisNet.DataMapper.Configuration.Cache.Memory; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Serializers; +using IBatisNet.DataMapper.Configuration.Sql; +using IBatisNet.DataMapper.Configuration.Sql.Dynamic; +using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; +using IBatisNet.DataMapper.Configuration.Sql.SimpleDynamic; +using IBatisNet.DataMapper.Configuration.Sql.Static; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.MappedStatements; +using IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +using IBatisNet.DataMapper.Scope; +using IBatisNet.DataMapper.TypeHandlers; +#endregion + +namespace IBatisNet.DataMapper.Configuration; + +/// +/// Builds an ISqlMapper instance from the supplied resources (e.g. XML configuration files). +/// +public class DomSqlMapBuilder +{ + #region Constructor + /// + /// Constructs a DomSqlMapBuilder. + /// + public DomSqlMapBuilder() + { + _configScope = new ConfigurationScope(); + _paramParser = new InlineParameterMapParser(); + _deSerializerFactory = new DeSerializerFactory(_configScope); + } + #endregion + #region Embedded resource + // Which files must we allow to be used as Embedded Resources ? + // - slqMap.config [Yes] + // - providers.config [Yes] + // - sqlMap files [Yes] + // - properties file (like Database.config) [Yes] + // see contribution, NHibernate usage, + // see http://www.codeproject.com/csharp/EmbeddedResourceStrings.asp + // see http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=75 + #endregion + + #region Constant + private const string PROPERTY_ELEMENT_KEY_ATTRIB = "key"; + private const string PROPERTY_ELEMENT_VALUE_ATTRIB = "value"; + + /// + /// + private const string DATAMAPPER_NAMESPACE_PREFIX = "mapper"; + + private const string PROVIDERS_NAMESPACE_PREFIX = "provider"; + private const string MAPPING_NAMESPACE_PREFIX = "mapping"; + private const string MODULE_NAMESPACE_PREFIX = "module"; + private const string DATAMAPPER_XML_NAMESPACE = "http://ibatis.apache.org/dataMapper"; + private const string PROVIDER_XML_NAMESPACE = "http://ibatis.apache.org/providers"; + private const string MAPPING_XML_NAMESPACE = "http://ibatis.apache.org/mapping"; + private const string MODULE_XML_NAMESPACE = "http://ibatis.apache.org/module"; + + /// + /// Default filename of main configuration file. + /// + public const string DEFAULT_FILE_CONFIG_NAME = "SqlMap.config"; + + /// + /// Default provider name + /// + private const string DEFAULT_PROVIDER_NAME = "_DEFAULT_PROVIDER_NAME"; + + /// + /// Dot representation. + /// + public const string DOT = "."; + + /// + /// Token for SqlMapConfig xml root element. + /// + private const string XML_DATAMAPPER_CONFIG_ROOT = "sqlMapConfig"; + + /// + /// Token for xml path to SqlMapConfig settings element. + /// + private const string XML_CONFIG_SETTINGS = "sqlMapConfig/settings/setting"; + + /// + /// Token for default providers config file name. + /// + private const string PROVIDERS_FILE_NAME = "providers.config"; + + /// + /// Token for xml path to SqlMapConfig providers element. + /// + private const string XML_CONFIG_PROVIDERS = "sqlMapConfig/providers"; + + /// + /// Token for xml path to properties elements. + /// + private const string XML_PROPERTIES = "properties"; + + /// + /// Token for xml path to property elements. + /// + private const string XML_PROPERTY = "property"; + + /// + /// Token for xml path to settings add elements. + /// + private const string XML_SETTINGS_ADD = "/*/add"; + + /// + /// Token for xml path to global properties elements. + /// + private const string XML_GLOBAL_PROPERTIES = "*/add"; + + /// + /// Token for xml path to provider elements. + /// + private const string XML_PROVIDER = "providers/provider"; + + /// + /// Token for xml path to database provider elements. + /// + private const string XML_DATABASE_PROVIDER = "sqlMapConfig/database/provider"; + + /// + /// Token for xml path to database source elements. + /// + private const string XML_DATABASE_DATASOURCE = "sqlMapConfig/database/dataSource"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_TYPEALIAS = "sqlMapConfig/alias/typeAlias"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_TYPEHANDLER = "sqlMapConfig/typeHandlers/typeHandler"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_MAPMODULE = "sqlMapConfig/sqlMapModules/sqlMapModule"; + + /// + /// Token for xml path to sqlMap elements. + /// + private const string XML_SQLMAP = "sqlMapConfig/sqlMaps/sqlMap"; + + /// + /// Token for xml path to module sqlMap elements. + /// + private const string XML_MODULE_MAP = "sqlMapModule/sqlMaps/sqlMap"; + + /// + /// Token for mapping xml root. + /// + private const string XML_MAPPING_ROOT = "sqlMap"; + + /// + /// Token for xml path to type alias elements. + /// + private const string XML_TYPEALIAS = "sqlMap/alias/typeAlias"; + + /// + /// Token for xml path to resultMap elements. + /// + private const string XML_RESULTMAP = "sqlMap/resultMaps/resultMap"; + + /// + /// Token for xml path to parameterMap elements. + /// + private const string XML_PARAMETERMAP = "sqlMap/parameterMaps/parameterMap"; + + /// + /// Token for xml path to sql elements. + /// + private const string SQL_STATEMENT = "sqlMap/statements/sql"; + + /// + /// Token for xml path to statement elements. + /// + private const string XML_STATEMENT = "sqlMap/statements/statement"; + + /// + /// Token for xml path to select elements. + /// + private const string XML_SELECT = "sqlMap/statements/select"; + + /// + /// Token for xml path to insert elements. + /// + private const string XML_INSERT = "sqlMap/statements/insert"; + + /// + /// Token for xml path to selectKey elements. + /// + private const string XML_SELECTKEY = "selectKey"; + + /// + /// Token for xml path to update elements. + /// + private const string XML_UPDATE = "sqlMap/statements/update"; + + /// + /// Token for xml path to delete elements. + /// + private const string XML_DELETE = "sqlMap/statements/delete"; + + /// + /// Token for xml path to procedure elements. + /// + private const string XML_PROCEDURE = "sqlMap/statements/procedure"; + + /// + /// Token for xml path to cacheModel elements. + /// + private const string XML_CACHE_MODEL = "sqlMap/cacheModels/cacheModel"; + + /// + /// Token for xml path to flushOnExecute elements. + /// + private const string XML_FLUSH_ON_EXECUTE = "flushOnExecute"; + + /// + /// Token for xml path to search statement elements. + /// + private const string XML_SEARCH_STATEMENT = "sqlMap/statements"; + + /// + /// Token for xml path to search parameterMap elements. + /// + private const string XML_SEARCH_PARAMETER = "sqlMap/parameterMaps/parameterMap[@id='"; + + /// + /// Token for xml path to search resultMap elements. + /// + private const string XML_SEARCH_RESULTMAP = "sqlMap/resultMaps/resultMap[@id='"; + + /// + /// Token for useStatementNamespaces attribute. + /// + private const string ATR_USE_STATEMENT_NAMESPACES = "useStatementNamespaces"; + + /// + /// Token for cacheModelsEnabled attribute. + /// + private const string ATR_CACHE_MODELS_ENABLED = "cacheModelsEnabled"; + + /// + /// Token for validateSqlMap attribute. + /// + private const string ATR_VALIDATE_SQLMAP = "validateSqlMap"; + + /// + /// Token for useReflectionOptimizer attribute. + /// + private const string ATR_USE_REFLECTION_OPTIMIZER = "useReflectionOptimizer"; + #endregion + + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private readonly ConfigurationScope _configScope; + private readonly DeSerializerFactory _deSerializerFactory; + private readonly InlineParameterMapParser _paramParser; + private IObjectFactory _objectFactory; + private ISetAccessorFactory _setAccessorFactory; + private IGetAccessorFactory _getAccessorFactory; + private ISqlMapper _sqlMapper; + private bool _validateSqlMapConfig = true; + #endregion + + #region Properties + /// + /// Allow properties to be set before configuration. + /// + public NameValueCollection Properties + { + set => _configScope.Properties.Add(value); + } + + /// + /// Allow a custom to be set before configuration. + /// + public ISetAccessorFactory SetAccessorFactory + { + set => _setAccessorFactory = value; + } + + /// + /// Allow a custom to be set before configuration. + /// + public IGetAccessorFactory GetAccessorFactory + { + set => _getAccessorFactory = value; + } + + /// + /// Allow a custom to be set before configuration. + /// + public IObjectFactory ObjectFactory + { + set => _objectFactory = value; + } + + /// + /// Allow a custom to be set before configuration. + /// + public ISqlMapper SqlMapper + { + set => _sqlMapper = value; + } + + /// + /// Enable validation of SqlMap document. This property must be set before configuration. + /// + public bool ValidateSqlMapConfig + { + set => _validateSqlMapConfig = value; + } + #endregion + + #region Configure + /// + /// Configure a SqlMapper from default resource file named 'SqlMap.config'. + /// + /// An ISqlMapper instance. + /// + /// The file path is relative to the application root. For ASP.Net applications + /// this would be the same directory as the Web.config file. For other .Net + /// applications the SqlMap.config file should be placed in the same folder + /// as the executable. + /// + public ISqlMapper Configure() + { + return Configure(Resources.GetConfigAsXmlDocument(DEFAULT_FILE_CONFIG_NAME)); + } + + /// + /// Configure and returns an ISqlMapper instance. + /// + /// An xml sql map configuration document. + /// An ISqlMapper instance. + public ISqlMapper Configure(XmlDocument document) + { + return Build(document, false); + } + + + /// + /// Configure an ISqlMapper object from a file path. + /// + /// + /// A relative ressource path from your Application root + /// or a absolue file path file:\\c:\dir\a.config + /// + /// An ISqlMapper instance. + public ISqlMapper Configure(string resource) + { + XmlDocument document; + if (resource.StartsWith("file://")) + document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); + else + document = Resources.GetResourceAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure an ISqlMapper object from a stream. + /// + /// A Stream resource. + /// An SqlMap + public ISqlMapper Configure(Stream resource) + { + var document = Resources.GetStreamAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure an ISqlMapper object from a FileInfo. + /// + /// A FileInfo resource. + /// An ISqlMapper instance. + public ISqlMapper Configure(FileInfo resource) + { + var document = Resources.GetFileInfoAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure an ISqlMapper object from an Uri. + /// + /// A Uri resource. + /// An ISqlMapper instance. + public ISqlMapper Configure(Uri resource) + { + var document = Resources.GetUriAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure and monitor the default configuration file (SqlMap.config) for modifications + /// and automatically reconfigure SqlMap. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(ConfigureHandler configureDelegate) + { + return ConfigureAndWatch(DEFAULT_FILE_CONFIG_NAME, configureDelegate); + } + + /// + /// Configure and monitor the configuration file for modifications + /// and automatically reconfigure the ISqlMapper instance. + /// + /// + /// A relative ressource path from your Application root + /// or an absolue file path file:\\c:\dir\a.config + /// + /// + /// Delegate called when the file has changed. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(string resource, ConfigureHandler configureDelegate) + { + XmlDocument document = null; + if (resource.StartsWith("file://")) + document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); + else + document = Resources.GetResourceAsXmlDocument(resource); + + ConfigWatcherHandler.ClearFilesMonitored(); + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(resource)); + + var callBakDelegate = new TimerCallback(OnConfigFileChange); + + var state = new StateConfig(); + state.FileName = resource; + state.ConfigureHandler = configureDelegate; + + var sqlMapper = Build(document, true); + + new ConfigWatcherHandler(callBakDelegate, state); + + return sqlMapper; + } + + /// + /// Configure and monitor the configuration file for modifications + /// and automatically reconfigure the ISqlMapper instance. + /// + /// + /// A FileInfo to a SqlMap.config file. + /// + /// + /// Delegate called when the file has changed. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(FileInfo resource, ConfigureHandler configureDelegate) + { + var document = Resources.GetFileInfoAsXmlDocument(resource); + + ConfigWatcherHandler.ClearFilesMonitored(); + ConfigWatcherHandler.AddFileToWatch(resource); + + var callBakDelegate = new TimerCallback(OnConfigFileChange); + + var state = new StateConfig(); + state.FileName = resource.FullName; + state.ConfigureHandler = configureDelegate; + + var sqlMapper = Build(document, true); + + new ConfigWatcherHandler(callBakDelegate, state); + + return sqlMapper; + } + + /// + /// Callback called when the SqlMap.config file has changed. + /// + /// The object. + public static void OnConfigFileChange(object obj) + { + var state = (StateConfig)obj; + state.ConfigureHandler(null); + } + #endregion + + #region Methods + /// + /// Build an ISqlMapper instance. + /// + /// An xml configuration document. + /// A data source. + /// + /// + /// Returns an ISqlMapper instance. + private ISqlMapper Build(XmlDocument document, DataSource dataSource, + bool useConfigFileWatcher, bool isCallFromDao) + { + _configScope.SqlMapConfigDocument = document; + _configScope.DataSource = dataSource; + _configScope.IsCallFromDao = isCallFromDao; + _configScope.UseConfigFileWatcher = useConfigFileWatcher; + + _configScope.XmlNamespaceManager = new XmlNamespaceManager(_configScope.SqlMapConfigDocument.NameTable); + _configScope.XmlNamespaceManager.AddNamespace(DATAMAPPER_NAMESPACE_PREFIX, DATAMAPPER_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(PROVIDERS_NAMESPACE_PREFIX, PROVIDER_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(MAPPING_NAMESPACE_PREFIX, MAPPING_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(MODULE_NAMESPACE_PREFIX, MODULE_XML_NAMESPACE); + + try + { + if (_validateSqlMapConfig) ValidateSchema(document.ChildNodes[1], "SqlMapConfig.xsd"); + Initialize(); + return _configScope.SqlMapper; + } + catch (Exception e) + { + throw new ConfigurationException(_configScope.ErrorContext.ToString(), e); + } + } + + /// + /// Validates an XmlNode against a schema file. + /// + /// The doc to validate. + /// Schema file name. + private void ValidateSchema(XmlNode section, string schemaFileName) + { + XmlReader validatingReader = null; + Stream xsdFile = null; + + _configScope.ErrorContext.Activity = "Validate SqlMap config"; + try + { + //Validate the document using a schema + xsdFile = GetStream(schemaFileName); + + if (xsdFile == null) + // TODO: avoid using hard-coded value "IBatisNet.DataMapper" + throw new ConfigurationException("Unable to locate embedded resource [IBatisNet.DataMapper." + schemaFileName + "]. If you are building from source, verfiy the file is marked as an embedded resource."); + + var schema = XmlSchema.Read(xsdFile, ValidationCallBack); + + var settings = new XmlReaderSettings(); + settings.ValidationType = ValidationType.Schema; + + // Create the XmlSchemaSet class. + var schemas = new XmlSchemaSet(); + schemas.Add(schema); + + settings.Schemas = schemas; + validatingReader = XmlReader.Create(new XmlNodeReader(section), settings); + + // Wire up the call back. The ValidationEvent is fired when the + // XmlValidatingReader hits an issue validating a section of the xml + settings.ValidationEventHandler += ValidationCallBack; + // Validate the document + while (validatingReader.Read()) { } + + if (!_configScope.IsXmlValid) throw new ConfigurationException("Invalid SqlMap.config document. cause :" + _configScope.ErrorContext.Resource); + } + finally + { + if (validatingReader != null) validatingReader.Close(); + if (xsdFile != null) xsdFile.Close(); + } + } + + private void ValidationCallBack(object sender, ValidationEventArgs args) + { + _configScope.IsXmlValid = false; + _configScope.ErrorContext.Resource += args.Message + Environment.NewLine; + } + + /// + /// Load statements (select, insert, update, delete), parameters, and resultMaps. + /// + /// + /// + /// + /// + /// + /// Used by Dao + public ISqlMapper Build(XmlDocument document, DataSource dataSource, bool useConfigFileWatcher, NameValueCollection properties) + { + _configScope.Properties.Add(properties); + return Build(document, dataSource, useConfigFileWatcher, true); + } + + /// + /// Load SqlMap configuration from + /// from the XmlDocument passed in parameter. + /// + /// The xml sql map configuration. + /// + public ISqlMapper Build(XmlDocument document, bool useConfigFileWatcher) + { + return Build(document, null, useConfigFileWatcher, false); + } + + /// + /// Reset PreparedStatements cache + /// + private void Reset() { } + + /// + /// Intialize the internal ISqlMapper instance. + /// + private void Initialize() + { + Reset(); + + #region Load Global Properties + if (_configScope.IsCallFromDao == false) + { + _configScope.NodeContext = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATAMAPPER_CONFIG_ROOT), _configScope.XmlNamespaceManager); + + ParseGlobalProperties(); + } + #endregion + + #region Load settings + _configScope.ErrorContext.Activity = "loading global settings"; + + var settings = _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_CONFIG_SETTINGS), _configScope.XmlNamespaceManager); + + if (settings != null) + foreach (XmlNode setting in settings) + { + if (setting.Attributes[ATR_USE_STATEMENT_NAMESPACES] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_STATEMENT_NAMESPACES].Value, _configScope.Properties); + _configScope.UseStatementNamespaces = Convert.ToBoolean(value); + } + + if (setting.Attributes[ATR_CACHE_MODELS_ENABLED] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_CACHE_MODELS_ENABLED].Value, _configScope.Properties); + _configScope.IsCacheModelsEnabled = Convert.ToBoolean(value); + } + + if (setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER].Value, _configScope.Properties); + _configScope.UseReflectionOptimizer = Convert.ToBoolean(value); + } + + if (setting.Attributes[ATR_VALIDATE_SQLMAP] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_VALIDATE_SQLMAP].Value, _configScope.Properties); + _configScope.ValidateSqlMap = Convert.ToBoolean(value); + } + } + #endregion + + if (_objectFactory == null) _objectFactory = new ObjectFactory(_configScope.UseReflectionOptimizer); + if (_setAccessorFactory == null) _setAccessorFactory = new SetAccessorFactory(_configScope.UseReflectionOptimizer); + if (_getAccessorFactory == null) _getAccessorFactory = new GetAccessorFactory(_configScope.UseReflectionOptimizer); + if (_sqlMapper == null) + { + var accessorFactory = new AccessorFactory(_setAccessorFactory, _getAccessorFactory); + _configScope.SqlMapper = new SqlMapper(_objectFactory, accessorFactory); + } + else + { + _configScope.SqlMapper = _sqlMapper; + } + + var emptyParameterMap = new ParameterMap(_configScope.DataExchangeFactory); + emptyParameterMap.Id = ConfigurationScope.EMPTY_PARAMETER_MAP; + _configScope.SqlMapper.AddParameterMap(emptyParameterMap); + + _configScope.SqlMapper.IsCacheModelsEnabled = _configScope.IsCacheModelsEnabled; + + #region Cache Alias + var cacheAlias = new TypeAlias(typeof(MemoryCacheControler)); + cacheAlias.Name = "MEMORY"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(LruCacheController)); + cacheAlias.Name = "LRU"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(FifoCacheController)); + cacheAlias.Name = "FIFO"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(AnsiStringTypeHandler)); + cacheAlias.Name = "AnsiStringTypeHandler"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + #endregion + + #region Load providers + if (_configScope.IsCallFromDao == false) GetProviders(); + #endregion + + #region Load DataBase + #region Choose the provider + IDbProvider provider = null; + if (_configScope.IsCallFromDao == false) + { + provider = ParseProvider(); + _configScope.ErrorContext.Reset(); + } + #endregion + + #region Load the DataSources + _configScope.ErrorContext.Activity = "loading Database DataSource"; + var nodeDataSource = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_DATASOURCE), _configScope.XmlNamespaceManager); + + if (nodeDataSource == null) + { + if (_configScope.IsCallFromDao == false) throw new ConfigurationException("There's no dataSource tag in SqlMap.config."); + + // patch from Luke Yang + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } + else + { + if (_configScope.IsCallFromDao == false) + { + _configScope.ErrorContext.Resource = nodeDataSource.OuterXml; + _configScope.ErrorContext.MoreInfo = "parse DataSource"; + + var dataSource = DataSourceDeSerializer.Deserialize(nodeDataSource); + + dataSource.DbProvider = provider; + dataSource.ConnectionString = NodeUtils.ParsePropertyTokens(dataSource.ConnectionString, _configScope.Properties); + + _configScope.DataSource = dataSource; + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } + else + { + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } + + _configScope.ErrorContext.Reset(); + } + #endregion + #endregion + + #region Load Global TypeAlias + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEALIAS), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.Activity = "loading global Type alias"; + TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Load TypeHandlers + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEHANDLER), _configScope.XmlNamespaceManager)) + try + { + _configScope.ErrorContext.Activity = "loading typeHandler"; + TypeHandlerDeSerializer.Deserialize(xmlNode, _configScope); + } + catch (Exception e) + { + var prop = NodeUtils.ParseAttributes(xmlNode, _configScope.Properties); + + throw new ConfigurationException( + string.Format("Error registering TypeHandler class \"{0}\" for handling .Net type \"{1}\" and dbType \"{2}\". Cause: {3}", + NodeUtils.GetStringAttribute(prop, "callback"), + NodeUtils.GetStringAttribute(prop, "type"), + NodeUtils.GetStringAttribute(prop, "dbType"), + e.Message), e); + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Load sqlMap mapping files + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager)) + { + _configScope.NodeContext = xmlNode; + ConfigureSqlMap(); + } + #endregion + + #region Load sqlMap Modules + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_MAPMODULE), _configScope.XmlNamespaceManager)) + { + _configScope.NodeContext = xmlNode; + ConfigureSqlMapModule(); + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Attach CacheModel to statement + if (_configScope.IsCacheModelsEnabled) + foreach (DictionaryEntry entry in _configScope.SqlMapper.MappedStatements) + { + _configScope.ErrorContext.Activity = "Set CacheModel to statement"; + + var mappedStatement = (IMappedStatement)entry.Value; + if (mappedStatement.Statement.CacheModelName.Length > 0) + { + _configScope.ErrorContext.MoreInfo = "statement : " + mappedStatement.Statement.Id; + _configScope.ErrorContext.Resource = "cacheModel : " + mappedStatement.Statement.CacheModelName; + mappedStatement.Statement.CacheModel = _configScope.SqlMapper.GetCache(mappedStatement.Statement.CacheModelName); + } + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Register Trigger Statements for Cache Models + foreach (DictionaryEntry entry in _configScope.CacheModelFlushOnExecuteStatements) + { + var cacheModelId = (string)entry.Key; + var statementsToRegister = (IList)entry.Value; + + if (statementsToRegister != null && statementsToRegister.Count > 0) + foreach (string statementName in statementsToRegister) + { + var mappedStatement = _configScope.SqlMapper.MappedStatements[statementName] as IMappedStatement; + + if (mappedStatement != null) + { + var cacheModel = _configScope.SqlMapper.GetCache(cacheModelId); + + if (_logger.IsDebugEnabled) _logger.Debug("Registering trigger statement [" + mappedStatement.Id + "] to cache model [" + cacheModel.Id + "]"); + + cacheModel.RegisterTriggerStatement(mappedStatement); + } + else + { + if (_logger.IsWarnEnabled) _logger.Warn("Unable to register trigger statement [" + statementName + "] to cache model [" + cacheModelId + "]. Statement does not exist."); + } + } + } + #endregion + + #region Resolve resultMap / Discriminator / PropertyStategy attributes on Result/Argument Property + foreach (DictionaryEntry entry in _configScope.SqlMapper.ResultMaps) + { + _configScope.ErrorContext.Activity = "Resolve 'resultMap' attribute on Result Property"; + + var resultMap = (ResultMap)entry.Value; + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var result = resultMap.Properties[index]; + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + result.PropertyStrategy = PropertyStrategyFactory.Get(result); + } + + for (var index = 0; index < resultMap.Parameters.Count; index++) + { + var result = resultMap.Parameters[index]; + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + result.ArgumentStrategy = ArgumentStrategyFactory.Get((ArgumentProperty)result); + } + + if (resultMap.Discriminator != null) resultMap.Discriminator.Initialize(_configScope); + } + + _configScope.ErrorContext.Reset(); + #endregion + } + + /// + /// Load and initialize providers from specified file. + /// + private void GetProviders() + { + IDbProvider provider; + XmlDocument xmlProviders; + + _configScope.ErrorContext.Activity = "loading Providers"; + + XmlNode providersNode; + providersNode = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_CONFIG_PROVIDERS), _configScope.XmlNamespaceManager); + + if (providersNode != null) + xmlProviders = Resources.GetAsXmlDocument(providersNode, _configScope.Properties); + else + xmlProviders = Resources.GetConfigAsXmlDocument(PROVIDERS_FILE_NAME); + + foreach (XmlNode node in xmlProviders.SelectNodes(ApplyProviderNamespacePrefix(XML_PROVIDER), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.Resource = node.InnerXml; + provider = ProviderDeSerializer.Deserialize(node); + + if (provider.IsEnabled) + { + _configScope.ErrorContext.ObjectId = provider.Name; + _configScope.ErrorContext.MoreInfo = "initialize provider"; + + provider.Initialize(); + _configScope.Providers.Add(provider.Name, provider); + + if (provider.IsDefault) + { + if (_configScope.Providers[DEFAULT_PROVIDER_NAME] == null) + _configScope.Providers.Add(DEFAULT_PROVIDER_NAME, provider); + else + throw new ConfigurationException( + string.Format("Error while configuring the Provider named \"{0}\" There can be only one default Provider.", provider.Name)); + } + } + } + + _configScope.ErrorContext.Reset(); + } + + + /// + /// Parse the provider tag. + /// + /// A provider object. + private IDbProvider ParseProvider() + { + _configScope.ErrorContext.Activity = "load DataBase Provider"; + var node = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_PROVIDER), _configScope.XmlNamespaceManager); + + if (node != null) + { + _configScope.ErrorContext.Resource = node.OuterXml; + var providerName = NodeUtils.ParsePropertyTokens(node.Attributes["name"].Value, _configScope.Properties); + + _configScope.ErrorContext.ObjectId = providerName; + + if (_configScope.Providers.Contains(providerName)) return (IDbProvider)_configScope.Providers[providerName]; + + throw new ConfigurationException( + string.Format("Error while configuring the Provider named \"{0}\". Cause : The provider is not in 'providers.config' or is not enabled.", + providerName)); + } + + if (_configScope.Providers.Contains(DEFAULT_PROVIDER_NAME)) return (IDbProvider)_configScope.Providers[DEFAULT_PROVIDER_NAME]; + + throw new ConfigurationException( + "Error while configuring the SqlMap. There is no provider marked default in 'providers.config' file."); + } + + private void ConfigureSqlMapModule() + { + var sqlModuleNode = _configScope.NodeContext; + + _configScope.ErrorContext.Activity = "loading SqlMap Module"; + _configScope.ErrorContext.Resource = sqlModuleNode.OuterXml; + if (_configScope.UseConfigFileWatcher) + if (sqlModuleNode.Attributes["resource"] != null || sqlModuleNode.Attributes["url"] != null) + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlModuleNode, _configScope.Properties))); + + _configScope.SqlMapModuleDocument = Resources.GetAsXmlDocument(sqlModuleNode, _configScope.Properties); + + if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapModuleDocument.ChildNodes[1], "SqlMapModule.xsd"); + foreach (XmlNode xmlNode in _configScope.SqlMapModuleDocument.SelectNodes(ApplyModuleNamespacePrefix(XML_MODULE_MAP), _configScope.XmlNamespaceManager)) + { + _configScope.NodeContext = xmlNode; + ConfigureSqlMap(); + _configScope.NodeContext = sqlModuleNode; + } + } + + /// + /// Load sqlMap statement. + /// + private void ConfigureSqlMap() + { + var sqlMapNode = _configScope.NodeContext; + + _configScope.ErrorContext.Activity = "loading SqlMap"; + _configScope.ErrorContext.Resource = sqlMapNode.OuterXml; + + if (_configScope.UseConfigFileWatcher) + if (sqlMapNode.Attributes["resource"] != null || sqlMapNode.Attributes["url"] != null) + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlMapNode, _configScope.Properties))); + + // Load the file + _configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, _configScope.Properties); + + if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); + + _configScope.SqlMapNamespace = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), _configScope.XmlNamespaceManager).Attributes["namespace"].Value; + + #region Load TypeAlias + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), _configScope.XmlNamespaceManager)) TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); + _configScope.ErrorContext.MoreInfo = string.Empty; + _configScope.ErrorContext.ObjectId = string.Empty; + #endregion + + #region Load resultMap + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_RESULTMAP), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading ResultMap tag"; + _configScope.NodeContext = xmlNode; // A ResultMap node + + BuildResultMap(); + } + #endregion + + #region Load parameterMaps + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PARAMETERMAP), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading ParameterMap tag"; + _configScope.NodeContext = xmlNode; // A ParameterMap node + + BuildParameterMap(); + } + #endregion + + #region Load statements + #region Sql tag + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(SQL_STATEMENT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading sql tag"; + _configScope.NodeContext = xmlNode; // A sql tag + + SqlDeSerializer.Deserialize(xmlNode, _configScope); + } + #endregion + + #region Statement tag + Statement statement; + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_STATEMENT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading statement tag"; + _configScope.NodeContext = xmlNode; // A statement tag + + statement = StatementDeSerializer.Deserialize(xmlNode, _configScope); + statement.CacheModelName = _configScope.ApplyNamespace(statement.CacheModelName); + statement.ParameterMapName = _configScope.ApplyNamespace(statement.ParameterMapName); + //statement.ResultMapName = ApplyNamespace( statement.ResultMapName ); + + if (_configScope.UseStatementNamespaces) statement.Id = _configScope.ApplyNamespace(statement.Id); + _configScope.ErrorContext.ObjectId = statement.Id; + statement.Initialize(_configScope); + + // Build ISql (analyse sql statement) + ProcessSqlStatement(statement); + + // Build MappedStatement + var mappedStatement = new MappedStatement(_configScope.SqlMapper, statement); + IMappedStatement mapStatement = mappedStatement; + if (statement.CacheModelName != null && statement.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + + _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + } + #endregion + + #region Select tag + Select select; + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_SELECT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading select tag"; + _configScope.NodeContext = xmlNode; // A select node + + select = SelectDeSerializer.Deserialize(xmlNode, _configScope); + select.CacheModelName = _configScope.ApplyNamespace(select.CacheModelName); + select.ParameterMapName = _configScope.ApplyNamespace(select.ParameterMapName); + //select.ResultMapName = ApplyNamespace( select.ResultMapName ); + + if (_configScope.UseStatementNamespaces) select.Id = _configScope.ApplyNamespace(select.Id); + _configScope.ErrorContext.ObjectId = select.Id; + + select.Initialize(_configScope); + + if (select.Generate != null) + GenerateCommandText(_configScope, select); + else + // Build ISql (analyse sql statement) + ProcessSqlStatement(select); + + // Build MappedStatement + MappedStatement mappedStatement = new SelectMappedStatement(_configScope.SqlMapper, select); + IMappedStatement mapStatement = mappedStatement; + if (select.CacheModelName != null && select.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + + _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + } + #endregion + + #region Insert tag + Insert insert; + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_INSERT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading insert tag"; + _configScope.NodeContext = xmlNode; // A insert tag + + MappedStatement mappedStatement; + + insert = InsertDeSerializer.Deserialize(xmlNode, _configScope); + insert.CacheModelName = _configScope.ApplyNamespace(insert.CacheModelName); + insert.ParameterMapName = _configScope.ApplyNamespace(insert.ParameterMapName); + //insert.ResultMapName = ApplyNamespace( insert.ResultMapName ); + + if (_configScope.UseStatementNamespaces) insert.Id = _configScope.ApplyNamespace(insert.Id); + _configScope.ErrorContext.ObjectId = insert.Id; + insert.Initialize(_configScope); + + // Build ISql (analyse sql command text) + if (insert.Generate != null) + GenerateCommandText(_configScope, insert); + else + ProcessSqlStatement(insert); + + // Build MappedStatement + mappedStatement = new InsertMappedStatement(_configScope.SqlMapper, insert); + + _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); + + #region statement SelectKey + // Set sql statement SelectKey + if (insert.SelectKey != null) + { + _configScope.ErrorContext.MoreInfo = "loading selectKey tag"; + _configScope.NodeContext = xmlNode.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SELECTKEY), _configScope.XmlNamespaceManager); + + insert.SelectKey.Id = insert.Id; + insert.SelectKey.Initialize(_configScope); + insert.SelectKey.Id += DOT + "SelectKey"; + + // Initialize can also use _configScope.ErrorContext.ObjectId to get the id + // of the parent node's "id" attribute + var insert = configurationScope.SqlMapper.GetMappedStatement(Id); + + var insertParameterClass = insert.Statement.ParameterClass; + + // make sure the PropertyName is a valid settable property of the node's parameterClass + if (insertParameterClass != null && + ObjectProbe.IsSimpleType(insertParameterClass) == false) + { + configurationScope.ErrorContext.MoreInfo = string.Format("Looking for settable property named '{0}' on type '{1}' for selectKey node of statement id '{2}'.", + PropertyName, // 0 + insert.Statement.ParameterClass.Name, // 1 + Id); // 2 + + // we expect this to throw an exception if the property cannot be found; GetSetter is + // called instead of HasWriteableProperty becuase we want the same wording for + // property not found exceptions; GetSetter and HasWritableProperty both use the + // same internal cache for looking up the ProperyInfo object + ReflectionInfo.GetInstance(insert.Statement.ParameterClass).GetSetter(PropertyName); + } + } + + base.Initialize(configurationScope); + } + #endregion + + #region Fields + [NonSerialized] private SelectKeyType _selectKeyType = SelectKeyType.post; + + [NonSerialized] private string _property = string.Empty; + #endregion + + #region Properties + /// + /// Extend statement attribute + /// + [XmlIgnore] + public override string ExtendStatement + { + get => string.Empty; + set { } + } + + /// + /// The property name object to fill with the key. + /// + [XmlAttribute("property")] + public string PropertyName + { + get => _property; + set => _property = value; + } + + /// + /// The type of the selectKey tag : 'Pre' or 'Post' + /// + [XmlAttribute("type")] + public SelectKeyType SelectKeyType + { + get => _selectKeyType; + set => _selectKeyType = value; + } + + + /// + /// True if it is a post-generated key. + /// + [XmlIgnore] + public bool isAfter => _selectKeyType == SelectKeyType.post; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Statements/SqlGenerator.cs b/ORBatisCore/Configuration/Statements/SqlGenerator.cs new file mode 100644 index 0000000..3e8a711 --- /dev/null +++ b/ORBatisCore/Configuration/Statements/SqlGenerator.cs @@ -0,0 +1,242 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 512878 $ + * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Text; + +namespace IBatisNet.DataMapper.Configuration.Statements; + +/// +/// Summary description for SqlGenerator. +/// +public sealed class SqlGenerator +{ + /// + /// Creates SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + public static string BuildQuery(IStatement statement) + { + var sqlText = string.Empty; + + if (statement is Select) + sqlText = BuildSelectQuery(statement); + else if (statement is Insert) + sqlText = BuildInsertQuery(statement); + else if (statement is Update) + sqlText = BuildUpdateQuery(statement); + else if (statement is Delete) sqlText = BuildDeleteQuery(statement); + + return sqlText; + } + + + /// + /// Creates an select SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildSelectQuery(IStatement statement) + { + var output = new StringBuilder(); + var select = (Select)statement; + var columnCount = statement.ParameterMap.PropertiesList.Count; + + output.Append("SELECT "); + + // Create the list of columns + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + if (i < columnCount - 1) + output.Append("\t" + property.ColumnName + " as " + property.PropertyName + ","); + else + output.Append("\t" + property.ColumnName + " as " + property.PropertyName); + } + + output.Append(" FROM "); + output.Append("\t" + select.Generate.Table + ""); + + // Create the where clause + + var compositeKeyList = select.Generate.By.Split(','); + if (compositeKeyList.Length > 0 && select.Generate.By.Length > 0) + { + output.Append(" WHERE "); + var length = compositeKeyList.Length; + for (var i = 0; i < length; i++) + { + var columnName = compositeKeyList[i]; + + if (i > 0) + output.Append("\tAND " + columnName + " = ?"); + else + output.Append("\t" + columnName + " = ?"); + } + } + + // 'Select All' case + if (statement.ParameterClass == null) + // The ParameterMap is just used to build the query + // to avoid problems later, we set it to null + statement.ParameterMap = null; + + return output.ToString(); + } + + + /// + /// Creates an insert SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildInsertQuery(IStatement statement) + { + var output = new StringBuilder(); + var insert = (Insert)statement; + var columnCount = statement.ParameterMap.PropertiesList.Count; + + output.Append("INSERT INTO " + insert.Generate.Table + " ("); + + // Create the parameter list + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + // Append the column name as a parameter of the insert statement + if (i < columnCount - 1) + output.Append("\t" + property.ColumnName + ","); + else + output.Append("\t" + property.ColumnName + ""); + } + + output.Append(") VALUES ("); + + // Create the values list + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + // Append the necessary line breaks and commas + if (i < columnCount - 1) + output.Append("\t?,"); + else + output.Append("\t?"); + } + + output.Append(")"); + + return output.ToString(); + } + + + /// + /// Creates an update SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildUpdateQuery(IStatement statement) + { + var output = new StringBuilder(); + var update = (Update)statement; + var columnCount = statement.ParameterMap.PropertiesList.Count; + var keysList = update.Generate.By.Split(','); + + output.Append("UPDATE "); + output.Append("\t" + update.Generate.Table + " "); + output.Append("SET "); + + // Create the set statement + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + // Ignore key columns + if (update.Generate.By.IndexOf(property.ColumnName) < 0) + { + if (i < columnCount - keysList.Length - 1) + output.Append("\t" + property.ColumnName + " = ?,"); + else + output.Append("\t" + property.ColumnName + " = ? "); + } + } + + output.Append(" WHERE "); + + // Create the where clause + var length = keysList.Length; + for (var i = 0; i < length; i++) + { + var columnName = keysList[i]; + + if (i > 0) + output.Append("\tAND " + columnName + " = ?"); + else + output.Append("\t " + columnName + " = ?"); + } + + if (!string.IsNullOrWhiteSpace(update.Generate.RowVersion)) + { + if (keysList.Length > 0) + output.Append("\tAND " + update.Generate.RowVersion + " = #" + update.Generate.RowVersion + "# - 1"); + else + output.Append("\t " + update.Generate.RowVersion + " = #" + update.Generate.RowVersion + "# - 1"); + } + + return output.ToString(); + } + + /// + /// Creates an delete SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildDeleteQuery(IStatement statement) + { + var output = new StringBuilder(); + var delete = (Delete)statement; + var keysList = delete.Generate.By.Split(','); + + output.Append("DELETE FROM"); + output.Append("\t" + delete.Generate.Table + ""); + output.Append(" WHERE "); + + // Create the where clause + var length = keysList.Length; + for (var i = 0; i < keysList.Length; i++) + { + var columnName = keysList[i].Trim(); + + if (i > 0) + output.Append("\tAND " + columnName + " = ?"); + else + output.Append("\t " + columnName + " = ?"); + } + + return output.ToString(); + } +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Statements/Statement.cs b/ORBatisCore/Configuration/Statements/Statement.cs new file mode 100644 index 0000000..770bb78 --- /dev/null +++ b/ORBatisCore/Configuration/Statements/Statement.cs @@ -0,0 +1,323 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 469233 $ + * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Data; +using System.Xml.Serialization; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Sql; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Statements; + +/// +/// Summary description for Statement. +/// +[Serializable] +[XmlRoot("statement", Namespace = "http://ibatis.apache.org/mapping")] +public class Statement : IStatement +{ + #region Fields + [NonSerialized] private bool _allowRemapping; + + [NonSerialized] private string _id = string.Empty; + + // ResultMap + [NonSerialized] private string _resultMapName = string.Empty; + + [NonSerialized] private ResultMapCollection _resultsMap = new(); + + // ParameterMap + [NonSerialized] private string _parameterMapName = string.Empty; + + [NonSerialized] private ParameterMap _parameterMap; + + // Result Class + [NonSerialized] private string _resultClassName = string.Empty; + + [NonSerialized] private Type _resultClass; + + // Parameter Class + [NonSerialized] private string _parameterClassName = string.Empty; + + [NonSerialized] private Type _parameterClass; + + // List Class + [NonSerialized] private string _listClassName = string.Empty; + + [NonSerialized] private Type _listClass; + + // CacheModel + [NonSerialized] private string _cacheModelName = string.Empty; + [NonSerialized] private CacheModel _cacheModel; + [NonSerialized] private ISql _sql; + [NonSerialized] private string _extendStatement = string.Empty; + [NonSerialized] private IFactory _listClassFactory; + #endregion + + #region Properties + /// + /// Allow remapping of dynamic SQL + /// + [XmlAttribute("remapResults")] + public bool AllowRemapping + { + get => _allowRemapping; + set => _allowRemapping = value; + } + + /// + /// Extend statement attribute + /// + [XmlAttribute("extends")] + public virtual string ExtendStatement + { + get => _extendStatement; + set => _extendStatement = value; + } + + /// + /// The CacheModel name to use. + /// + [XmlAttribute("cacheModel")] + public string CacheModelName + { + get => _cacheModelName; + set => _cacheModelName = value; + } + + /// + /// Tell us if a cacheModel is attached to this statement. + /// + [XmlIgnore] + public bool HasCacheModel => _cacheModelName.Length > 0; + + /// + /// The CacheModel used by this statement. + /// + [XmlIgnore] + public CacheModel CacheModel + { + get => _cacheModel; + set => _cacheModel = value; + } + + /// + /// The list class name to use for strongly typed collection. + /// + [XmlAttribute("listClass")] + public string ListClassName + { + get => _listClassName; + set => _listClassName = value; + } + + + /// + /// The list class type to use for strongly typed collection. + /// + [XmlIgnore] + public Type ListClass => _listClass; + + /// + /// The result class name to used. + /// + [XmlAttribute("resultClass")] + public string ResultClassName + { + get => _resultClassName; + set => _resultClassName = value; + } + + /// + /// The result class type to used. + /// + [XmlIgnore] + public Type ResultClass => _resultClass; + + /// + /// The parameter class name to used. + /// + [XmlAttribute("parameterClass")] + public string ParameterClassName + { + get => _parameterClassName; + set => _parameterClassName = value; + } + + /// + /// The parameter class type to used. + /// + [XmlIgnore] + public Type ParameterClass => _parameterClass; + + /// + /// Name used to identify the statement amongst the others. + /// + [XmlAttribute("id")] + public string Id + { + get => _id; + set + { + if (value == null || value.Length < 1) + throw new DataMapperException("The id attribute is required in a statement tag."); + + _id = value; + } + } + + + /// + /// The sql statement + /// + [XmlIgnore] + public ISql Sql + { + get => _sql; + set + { + if (value == null) + throw new DataMapperException("The sql statement query text is required in the statement tag " + _id); + + _sql = value; + } + } + + + /// + /// The ResultMaps name used by the statement. + /// + [XmlAttribute("resultMap")] + public string ResultMapName + { + get => _resultMapName; + set => _resultMapName = value; + } + + /// + /// The ParameterMap name used by the statement. + /// + [XmlAttribute("parameterMap")] + public string ParameterMapName + { + get => _parameterMapName; + set => _parameterMapName = value; + } + + /// + /// The ResultMap used by the statement. + /// + [XmlIgnore] + public ResultMapCollection ResultsMap => _resultsMap; + + /// + /// The parameterMap used by the statement. + /// + [XmlIgnore] + public ParameterMap ParameterMap + { + get => _parameterMap; + set => _parameterMap = value; + } + + /// + /// The type of the statement (text or procedure) + /// Default Text. + /// + /// Text or StoredProcedure + [XmlIgnore] + public virtual CommandType CommandType => CommandType.Text; + #endregion + + + #region Methods + /// + /// Initialize an statement for the sqlMap. + /// + /// The scope of the configuration + internal virtual void Initialize(ConfigurationScope configurationScope) + { + if (_resultMapName.Length > 0) + { + var names = _resultMapName.Split(','); + for (var i = 0; i < names.Length; i++) + { + var name = configurationScope.ApplyNamespace(names[i].Trim()); + _resultsMap.Add(configurationScope.SqlMapper.GetResultMap(name)); + } + } + + if (_parameterMapName.Length > 0) _parameterMap = configurationScope.SqlMapper.GetParameterMap(_parameterMapName); + if (_resultClassName.Length > 0) + { + var classNames = _resultClassName.Split(','); + for (var i = 0; i < classNames.Length; i++) + { + _resultClass = configurationScope.SqlMapper.TypeHandlerFactory.GetType(classNames[i].Trim()); + IFactory resultClassFactory = null; + if (Type.GetTypeCode(_resultClass) == TypeCode.Object && + _resultClass.IsValueType == false) + resultClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_resultClass, Type.EmptyTypes); + var dataExchange = configurationScope.DataExchangeFactory.GetDataExchangeForClass(_resultClass); + IResultMap autoMap = new AutoResultMap(_resultClass, resultClassFactory, dataExchange); + _resultsMap.Add(autoMap); + } + } + + if (_parameterClassName.Length > 0) _parameterClass = configurationScope.SqlMapper.TypeHandlerFactory.GetType(_parameterClassName); + if (_listClassName.Length > 0) + { + _listClass = configurationScope.SqlMapper.TypeHandlerFactory.GetType(_listClassName); + _listClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_listClass, Type.EmptyTypes); + } + } + + + /// + /// Create an instance of 'IList' class. + /// + /// An object which implment IList. + public IList CreateInstanceOfListClass() + { + return (IList)_listClassFactory.CreateInstance(null); + } + + /// + /// Create an instance of a generic 'IList' class. + /// + /// An object which implment IList. + public IList CreateInstanceOfGenericListClass() + { + return (IList)_listClassFactory.CreateInstance(null); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Configuration/Statements/Update.cs b/ORBatisCore/Configuration/Statements/Update.cs new file mode 100644 index 0000000..f2da161 --- /dev/null +++ b/ORBatisCore/Configuration/Statements/Update.cs @@ -0,0 +1,56 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Xml.Serialization; + +namespace IBatisNet.DataMapper.Configuration.Statements; + +/// +/// Summary description for Update. +/// +[Serializable] +[XmlRoot("update", Namespace = "http://ibatis.apache.org/mapping")] +public class Update : Statement +{ + #region Fields + [NonSerialized] private Generate _generate; + #endregion + + /// + /// Do not use direclty, only for serialization. + /// + public Update() { } + + /// + /// The Generate tag used by a generated update statement. + /// (CRUD operation) + /// + [XmlElement("generate", typeof(Generate))] + public Generate Generate + { + get => _generate; + set => _generate = value; + } +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/BaseDataExchange.cs b/ORBatisCore/DataExchange/BaseDataExchange.cs new file mode 100644 index 0000000..d559c3c --- /dev/null +++ b/ORBatisCore/DataExchange/BaseDataExchange.cs @@ -0,0 +1,75 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-01 11:53:15 -0700 (Sat, 01 Apr 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// Summary description for BaseDataExchange. +/// +public abstract class BaseDataExchange : IDataExchange +{ + /// + /// Constructor + /// + /// + public BaseDataExchange(DataExchangeFactory dataExchangeFactory) + { + DataExchangeFactory = dataExchangeFactory; + } + + /// + /// Getter for the factory that created this object + /// + public DataExchangeFactory DataExchangeFactory { get; } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public abstract object GetData(ParameterProperty mapping, object parameterObject); + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public abstract void SetData(ref object target, ResultProperty mapping, object dataBaseValue); + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public abstract void SetData(ref object target, ParameterProperty mapping, object dataBaseValue); + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/ComplexDataExchange.cs b/ORBatisCore/DataExchange/ComplexDataExchange.cs new file mode 100644 index 0000000..e253e33 --- /dev/null +++ b/ORBatisCore/DataExchange/ComplexDataExchange.cs @@ -0,0 +1,88 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-23 14:42:23 -0600 (Tue, 23 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// A IDataExchange implemtation for working with .NET object +/// +public sealed class ComplexDataExchange : BaseDataExchange +{ + /// + /// Cosntructor + /// + /// + public ComplexDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + if (parameterObject != null) + { + if (DataExchangeFactory.TypeHandlerFactory.IsSimpleType(parameterObject.GetType())) return parameterObject; + + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, DataExchangeFactory.AccessorFactory); + } + + return null; + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/DataExchangeFactory.cs b/ORBatisCore/DataExchange/DataExchangeFactory.cs new file mode 100644 index 0000000..1f48326 --- /dev/null +++ b/ORBatisCore/DataExchange/DataExchangeFactory.cs @@ -0,0 +1,101 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-11-12 10:00:49 -0700 (Sun, 12 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.TypeHandlers; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// Factory for DataExchange objects +/// +public class DataExchangeFactory +{ + private readonly IDataExchange _complexDataExchange; + private readonly IDataExchange _dictionaryDataExchange; + private readonly IDataExchange _listDataExchange; + + private readonly IDataExchange _primitiveDataExchange; + + + /// + /// Initializes a new instance of the class. + /// + /// The type handler factory. + /// The object factory. + /// The accessor factory. + public DataExchangeFactory(TypeHandlerFactory typeHandlerFactory, + IObjectFactory objectFactory, + AccessorFactory accessorFactory) + { + ObjectFactory = objectFactory; + TypeHandlerFactory = typeHandlerFactory; + AccessorFactory = accessorFactory; + + _primitiveDataExchange = new PrimitiveDataExchange(this); + _complexDataExchange = new ComplexDataExchange(this); + _listDataExchange = new ListDataExchange(this); + _dictionaryDataExchange = new DictionaryDataExchange(this); + } + + /// + /// Getter for the type handler factory + /// + public TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The factory for object + /// + public IObjectFactory ObjectFactory { get; } + + /// + /// The factory which build + /// + public AccessorFactory AccessorFactory { get; } + + /// + /// Get a DataExchange object for the passed in Class + /// + /// The class to get a DataExchange object for + /// The IDataExchange object + public IDataExchange GetDataExchangeForClass(Type clazz) + { + IDataExchange dataExchange = null; + if (clazz == null) + dataExchange = _complexDataExchange; + else if (typeof(IList).IsAssignableFrom(clazz)) + dataExchange = _listDataExchange; + else if (typeof(IDictionary).IsAssignableFrom(clazz)) + dataExchange = _dictionaryDataExchange; + else if (TypeHandlerFactory.GetTypeHandler(clazz) != null) + dataExchange = _primitiveDataExchange; + else + dataExchange = new DotNetObjectDataExchange(clazz, this); + + return dataExchange; + } +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/DictionaryDataExchange.cs b/ORBatisCore/DataExchange/DictionaryDataExchange.cs new file mode 100644 index 0000000..23f74a3 --- /dev/null +++ b/ORBatisCore/DataExchange/DictionaryDataExchange.cs @@ -0,0 +1,81 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// DataExchange implementation for IDictionary objects +/// +public sealed class DictionaryDataExchange : BaseDataExchange +{ + /// + /// Cosntructor + /// + /// + public DictionaryDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + ((IDictionary)target).Add(mapping.PropertyName, dataBaseValue); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/DotNetObjectDataExchange.cs b/ORBatisCore/DataExchange/DotNetObjectDataExchange.cs new file mode 100644 index 0000000..65100ba --- /dev/null +++ b/ORBatisCore/DataExchange/DotNetObjectDataExchange.cs @@ -0,0 +1,110 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2008-10-11 15:26:43 -0600 (Sat, 11 Oct 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// IDataExchange implementation for .NET object +/// +public sealed class DotNetObjectDataExchange : BaseDataExchange +{ + private readonly Type _parameterClass; + + /// + /// Cosntructor + /// + /// + /// + public DotNetObjectDataExchange(Type parameterClass, DataExchangeFactory dataExchangeFactory) + : base(dataExchangeFactory) + { + _parameterClass = parameterClass; + } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + if (mapping.IsComplexMemberName || _parameterClass != parameterObject.GetType()) + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + + return mapping.GetAccessor.Get(parameterObject); + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + var targetType = target.GetType(); + if (targetType != _parameterClass + && !targetType.IsSubclassOf(_parameterClass) + && !_parameterClass.IsAssignableFrom(targetType)) + throw new ArgumentException("Could not set value in class '" + target.GetType() + "' for property '" + mapping.PropertyName + "' of type '" + mapping.MemberType + "'"); + if (mapping.IsComplexMemberName) + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + else + mapping.SetAccessor.Set(target, dataBaseValue); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + if (mapping.IsComplexMemberName) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + else + { + var setAccessorFactory = DataExchangeFactory.AccessorFactory.SetAccessorFactory; + var _setAccessor = setAccessorFactory.CreateSetAccessor(_parameterClass, mapping.PropertyName); + + _setAccessor.Set(target, dataBaseValue); + } + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/IDataExchange.cs b/ORBatisCore/DataExchange/IDataExchange.cs new file mode 100644 index 0000000..c0760b6 --- /dev/null +++ b/ORBatisCore/DataExchange/IDataExchange.cs @@ -0,0 +1,59 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-01 11:53:15 -0700 (Sat, 01 Apr 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// Interface for exchanging data between a parameter map/result map and the related objects +/// +public interface IDataExchange +{ + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + object GetData(ParameterProperty mapping, object parameterObject); + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + void SetData(ref object target, ResultProperty mapping, object dataBaseValue); + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + void SetData(ref object target, ParameterProperty mapping, object dataBaseValue); +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/ListDataExchange.cs b/ORBatisCore/DataExchange/ListDataExchange.cs new file mode 100644 index 0000000..c19ed9d --- /dev/null +++ b/ORBatisCore/DataExchange/ListDataExchange.cs @@ -0,0 +1,82 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// IDataExchange implementation for IList objects +/// +public sealed class ListDataExchange : BaseDataExchange +{ + /// + /// Cosntructor + /// + /// + public ListDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/DataExchange/PrimitiveDataExchange.cs b/ORBatisCore/DataExchange/PrimitiveDataExchange.cs new file mode 100644 index 0000000..66ad814 --- /dev/null +++ b/ORBatisCore/DataExchange/PrimitiveDataExchange.cs @@ -0,0 +1,85 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange; + +/// +/// DataExchange implementation for "primitive" objects. +/// +/// +/// The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, +/// UInt32, Int64, UInt64, Char, Double, and Single + string, Guid, Decimal, DateTime +/// +public sealed class PrimitiveDataExchange : BaseDataExchange +{ + /// + /// Cosntructor + /// + /// + public PrimitiveDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + if (mapping.IsComplexMemberName) + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + + return parameterObject; + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + target = dataBaseValue; + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + target = dataBaseValue; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Delegates.cs b/ORBatisCore/Delegates.cs new file mode 100644 index 0000000..cdfeca1 --- /dev/null +++ b/ORBatisCore/Delegates.cs @@ -0,0 +1,62 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 430536 $ + * $LastChangedDate: 2006-08-10 23:24:45 +0200 (jeu., 10 ao�t 2006) $ + * $LastChangedBy: rgrabowski $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; + +namespace IBatisNet.DataMapper; + +/// +/// A delegate called once per row in the QueryWithRowDelegate method +/// +/// The object currently being processed. +/// The optional parameter object passed into the QueryWithRowDelegate method. +/// The IList that will be returned to the caller. +public delegate void RowDelegate(object obj, object parameterObject, IList list); + +/// +/// A delegate called once per row in the QueryWithRowDelegate method +/// +/// The object currently being processed. +/// The optional parameter object passed into the QueryWithRowDelegate method. +/// The IList that will be returned to the caller. +public delegate void RowDelegate(object obj, object parameterObject, IList list); + +/// +/// A delegate called once per row in the QueryForMapWithRowDelegate method +/// +/// +/// +/// The optional parameter object passed into the QueryForMapWithRowDelegate method. +/// The IDictionary that will be returned to the caller. +public delegate void DictionaryRowDelegate(K key, V value, object parameterObject, IDictionary dictionary); + +/// +/// A delegate called once per row in the QueryForMapWithRowDelegate method +/// +/// +/// +/// The optional parameter object passed into the QueryForMapWithRowDelegate method. +/// The IDictionary that will be returned to the caller. +public delegate void DictionaryRowDelegate(object key, object value, object parameterObject, IDictionary dictionary); \ No newline at end of file diff --git a/ORBatisCore/Enumeration.cs b/ORBatisCore/Enumeration.cs new file mode 100644 index 0000000..92f17cf --- /dev/null +++ b/ORBatisCore/Enumeration.cs @@ -0,0 +1,58 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper; + +/// +/// Indicate if the generated key by a selectKey statement +/// concern a pre or post-generated key. +/// +public enum SelectKeyType +{ + /// + /// + pre = 1, + + /// + /// + post = 2 +} + +/// +/// +public enum CacheKeyType +{ + /// + /// + Object = 1, + + /// + /// + List = 2, + + /// + /// + Map = 3 +} \ No newline at end of file diff --git a/ORBatisCore/Exceptions/DataMapperException.cs b/ORBatisCore/Exceptions/DataMapperException.cs new file mode 100644 index 0000000..f9a164c --- /dev/null +++ b/ORBatisCore/Exceptions/DataMapperException.cs @@ -0,0 +1,108 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Runtime.Serialization; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.DataMapper.Exceptions; + +/// +/// The DataMapperException is thrown when an error in the SqlMapper component occurs. +/// +[Serializable] +public class DataMapperException : IBatisNetException +{ + /// + /// Initializes a new instance of the class. + /// + /// + /// This constructor initializes the + /// Message + /// property of the new instance + /// to a system-supplied message that describes the error. + /// + public DataMapperException() : base("iBATIS.NET DataMapper component caused an exception.") { } + + /// + /// Initializes a new instance of the + /// class with a reference to the inner exception that is the cause of this exception. + /// + /// + /// This constructor initializes the Message property of the new instance + /// using the message parameter. + /// + /// + /// The exception that is the cause of the current exception. + /// If the innerException parameter is not a null reference (Nothing in Visual Basic), + /// the current exception is raised in a catch block that handles the inner exception. + /// + public DataMapperException(Exception ex) : base("iBATIS.NET DataMapper component caused an exception.", ex) { } + + + /// + /// Initializes a new instance of the + /// class with a specified error message. + /// + /// + /// This constructor initializes the Message property of the new instance to + /// the Message property of the passed in exception. + /// + /// The message that describes the error. + public DataMapperException(string message) : base(message) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message and a reference to the inner exception + /// that is the cause of this exception. + /// + /// + /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous + /// exception in the InnerException property. + /// The InnerException property returns the same value that is passed into the constructor, or a null reference + /// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the + /// constructor. + /// + /// The message that describes the error. + /// The exception that caused the error + public DataMapperException(string message, Exception inner) : base(message, inner) { } + + /// + /// Initializes a new instance of the + /// class with serialized data. + /// + /// + /// This constructor is called during deserialization to reconstitute the + /// exception object transmitted over a stream. + /// + /// + /// The that holds the serialized + /// object data about the exception being thrown. + /// + /// + /// The that contains contextual + /// information about the source or destination. + /// + protected DataMapperException(SerializationInfo info, StreamingContext context) : base(info, context) { } +} \ No newline at end of file diff --git a/ORBatisCore/ExecuteEventArgs.cs b/ORBatisCore/ExecuteEventArgs.cs new file mode 100644 index 0000000..f32db2a --- /dev/null +++ b/ORBatisCore/ExecuteEventArgs.cs @@ -0,0 +1,37 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper; + +/// +/// Summary description for ExecuteEventArgs. +/// +public class ExecuteEventArgs : EventArgs +{ + /// + /// Set or get the statement name + /// + public string StatementName { get; set; } = string.Empty; +} \ No newline at end of file diff --git a/ORBatisCore/ISqlMapSession.cs b/ORBatisCore/ISqlMapSession.cs new file mode 100644 index 0000000..0cd1d32 --- /dev/null +++ b/ORBatisCore/ISqlMapSession.cs @@ -0,0 +1,50 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 474910 $ + * $LastChangedDate: 2006-11-14 19:33:12 +0100 (mar., 14 nov. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common; + +namespace IBatisNet.DataMapper; + +/// +/// SqlMap Session contract +/// +public interface ISqlMapSession : IDalSession +{ + /// + /// Gets the SQL mapper. + /// + /// The SQL mapper. + ISqlMapper SqlMapper { get; } + + /// + /// Create the connection + /// + void CreateConnection(); + + /// + /// Create the connection + /// + void CreateConnection(string connectionString); +} \ No newline at end of file diff --git a/ORBatisCore/ISqlMapper.cs b/ORBatisCore/ISqlMapper.cs new file mode 100644 index 0000000..56e9bd6 --- /dev/null +++ b/ORBatisCore/ISqlMapper.cs @@ -0,0 +1,603 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region using +using System.Collections; +using System.Collections.Specialized; +using System.Data; +using IBatisNet.Common; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements; +using IBatisNet.DataMapper.TypeHandlers; + +//using IBatisNet.DataMapper.SessionStore; +#endregion + +namespace IBatisNet.DataMapper; + +/// +/// Contract for an +/// +public interface ISqlMapper +{ + /// + /// Name used to identify the the + /// + string Id { get; } + + /// + /// Allow to set a custom session store like the + /// + /// Set it after the configuration and before use of the + /// + /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); + /// + //ISessionStore SessionStore { set; } + + /// + /// Gets a value indicating whether this instance is session started. + /// + /// + /// true if this instance is session started; otherwise, false. + /// + //bool IsSessionStarted { get; } + + /// + /// Returns the DalSession instance + /// currently being used by the SqlMap. + /// + //ISqlMapSession LocalSession { get; } + + /// + /// Gets the DB helper parameter cache. + /// + /// The DB helper parameter cache. + DBHelperParameterCache DBHelperParameterCache { get; } + + /// + /// A flag that determines whether cache models were enabled + /// when this SqlMap was built. + /// + bool IsCacheModelsEnabled { get; set; } + + /// + /// Factory for DataExchange objects + /// + DataExchangeFactory DataExchangeFactory { get; } + + /// + /// The TypeHandlerFactory + /// + TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The meta factory for object factory + /// + IObjectFactory ObjectFactory { get; } + + /// + /// The factory which build + /// + AccessorFactory AccessorFactory { get; } + + /// + /// The ParameterMap collection + /// + HybridDictionary ParameterMaps { get; } + + /// + /// The ResultMap collection + /// + HybridDictionary ResultMaps { get; } + + /// + /// The MappedStatements collection + /// + HybridDictionary MappedStatements { get; } + + ///// + ///// Begins the transaction. + ///// + ///// + //ISqlMapSession BeginTransaction(); + + ///// + ///// Begins the transaction. + ///// + ///// if set to true [open connection]. + ///// + //ISqlMapSession BeginTransaction(bool openConnection); + + ///// + ///// Begins the transaction. + ///// + ///// The connection string. + ///// + //ISqlMapSession BeginTransaction(string connectionString); + + ///// + ///// Begins the transaction. + ///// + ///// if set to true [open new connection]. + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel); + + ///// + ///// Begins the transaction. + ///// + ///// The connection string. + ///// if set to true [open new connection]. + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel); + + ///// + ///// Begins the transaction. + ///// + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(IsolationLevel isolationLevel); + + ///// + ///// Begins the transaction. + ///// + ///// The connection string. + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel); + + ///// + ///// Closes the connection. + ///// + //void CloseConnection(); + + ///// + ///// Commits the transaction. + ///// + ///// if set to true [close connection]. + //void CommitTransaction(bool closeConnection); + + ///// + ///// Commits the transaction. + ///// + //void CommitTransaction(); + + /// + /// Gets or sets the data source. + /// + /// The data source. + IDataSource DataSource { get; set; } + + /// + /// Creates a new SqlMapSession that will be used to query the data source. + /// + /// A new session + ISqlMapSession CreateSqlMapSession(); + + /// + /// Get a ParameterMap by name + /// + /// The name of the ParameterMap + /// The ParameterMap + ParameterMap GetParameterMap(string name); + + /// + /// Adds a (named) ParameterMap. + /// + /// the ParameterMap to add + void AddParameterMap(ParameterMap parameterMap); + + /// + /// Gets a ResultMap by name + /// + /// The name of the result map + /// The ResultMap + IResultMap GetResultMap(string name); + + /// + /// Adds a (named) ResultMap + /// + /// The ResultMap to add + void AddResultMap(IResultMap resultMap); + + /// + /// Gets a cache by name + /// + /// The name of the cache to get + /// The cache object + CacheModel GetCache(string name); + + /// + /// Adds a (named) cache. + /// + /// The cache to add + void AddCache(CacheModel cache); + + /// + /// Adds a (named) MappedStatement. + /// + /// The key name + /// The statement to add + void AddMappedStatement(string key, IMappedStatement mappedStatement); + + /// + /// Executes a Sql DELETE statement. + /// Delete returns the number of rows effected. + /// + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + int Delete(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Flushes all cached objects that belong to this SqlMap + /// + void FlushCaches(); + + /// + /// Gets the data cache stats. + /// + /// + string GetDataCacheStats(); + + /// + /// Gets a MappedStatement by name + /// + /// The id of the statement + /// The MappedStatement + IMappedStatement GetMappedStatement(string id); + + /// + /// Executes a Sql INSERT statement. + /// Insert is a bit different from other update methods, as it + /// provides facilities for returning the primary key of the + /// newly inserted row (rather than the effected rows). This + /// functionality is of course optional. + ///

+ /// The parameter object is generally used to supply the input + /// data for the INSERT values. + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// + /// The primary key of the newly inserted row. + /// This might be automatically generated by the RDBMS, + /// or selected from a sequence table or other source. + /// + object Insert(string statementName, object parameterObject, ISqlMapSession session); + + ///// + ///// Opens the connection. + ///// + ///// + //ISqlMapSession OpenConnection(); + + ///// + ///// Opens the connection. + ///// + ///// The connection string. + ///// + //ISqlMapSession OpenConnection(string connectionString); + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + /// A List of result objects. + void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + object QueryForObject(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to + /// automatically scroll through results from a database table. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL + /// The maximum number of objects to store in each page + /// A PaginatedList of beans containing the rows + [Obsolete("This method will be remove in future version.", false)] + PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session); + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); + + ///// + ///// Rolls the back transaction. + ///// + //void RollBackTransaction(); + + ///// + ///// Rolls the back transaction. + ///// + ///// if set to true [close connection]. + //void RollBackTransaction(bool closeConnection); + + /// + /// Executes a Sql UPDATE statement. + /// Update can also be used for any other update statement type, + /// such as inserts and deletes. Update returns the number of + /// rows effected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the UPDATE values as well as the WHERE clause parameter(s). + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + int Update(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary of object containing the rows keyed by keyProperty. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method> + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + T QueryForObject(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ ///

+ /// Name of the statement. + /// The parameter object. + /// + DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session); +} \ No newline at end of file diff --git a/ORBatisCore/Logging/ConfigurationSectionHandler.cs b/ORBatisCore/Logging/ConfigurationSectionHandler.cs new file mode 100644 index 0000000..c01fd91 --- /dev/null +++ b/ORBatisCore/Logging/ConfigurationSectionHandler.cs @@ -0,0 +1,196 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; +using System.Configuration; +using System.Xml; +using IBatisNet.Common.Logging.Impl; +using ConfigurationException = IBatisNet.Common.Exceptions.ConfigurationException; + +namespace IBatisNet.Common.Logging; + +/// +/// Used in an application's configuration file (App.Config or Web.Config) to configure the logging subsystem. +/// +/// +/// +/// An example configuration section that writes IBatisNet messages to the Console using the built-in Console +/// Logger. +/// +/// +/// +/// +///
+/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// +/// The following aliases are recognized for the type attribute of logFactoryAdapter: +/// +/// +/// +/// CONSOLE +/// Alias for IBatisNet.Common.Logging.Impl.ConsoleOutLoggerFA, IBatisNet.Common +/// +/// +/// TRACE +/// Alias for IBatisNet.Common.Logging.Impl.TraceLoggerFA, IBatisNet.Common +/// +/// +/// NOOP +/// Alias IBatisNet.Common.Logging.Impl.NoOpLoggerFA, IBatisNet.Common +/// +/// +/// +public class ConfigurationSectionHandler : IConfigurationSectionHandler +{ + /// + /// Constructor + /// + public ConfigurationSectionHandler() { } + + #region IConfigurationSectionHandler Members + /// + /// Verifies that the logFactoryAdapter element appears once in the configuration section. + /// + /// The parent of the current item. + /// Additional information about the configuration process. + /// The configuration section to apply an XPath query too. + /// + /// A object containing the specified logFactoryAdapter type + /// along with user supplied configuration properties. + /// + public object Create(object parent, object configContext, XmlNode section) + { + var logFactoryElementsCount = section.SelectNodes(LOGFACTORYADAPTER_ELEMENT).Count; + + if (logFactoryElementsCount > 1) throw new ConfigurationException("Only one element allowed"); + + if (logFactoryElementsCount == 1) return ReadConfiguration(section); + + return null; + } + #endregion + + /// + /// Retrieves the of the logger the use by looking at the logFactoryAdapter element + /// of the logging configuration element. + /// + /// + /// + /// A object containing the specified type that implements + /// along with zero or more properties that will be + /// passed to the logger factory adapter's constructor as an . + /// + private LogSetting ReadConfiguration(XmlNode section) + { + var logFactoryElement = section.SelectSingleNode(LOGFACTORYADAPTER_ELEMENT); + + var factoryTypeString = string.Empty; + if (logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB] != null) + factoryTypeString = logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB].Value; + + if (factoryTypeString == string.Empty) + throw new ConfigurationException + ("Required Attribute '" + + LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB + + "' not found in element '" + + LOGFACTORYADAPTER_ELEMENT + + "'" + ); + + Type factoryType = null; + try + { + if (string.Compare(factoryTypeString, "CONSOLE", true) == 0) + factoryType = typeof(ConsoleOutLoggerFA); + else if (string.Compare(factoryTypeString, "TRACE", true) == 0) + factoryType = typeof(TraceLoggerFA); + else if (string.Compare(factoryTypeString, "NOOP", true) == 0) + factoryType = typeof(NoOpLoggerFA); + else + factoryType = Type.GetType(factoryTypeString, true, false); + } + catch (Exception e) + { + throw new ConfigurationException + ("Unable to create type '" + factoryTypeString + "'" + , e + ); + } + + var propertyNodes = logFactoryElement.SelectNodes(ARGUMENT_ELEMENT); + + NameValueCollection properties = null; + properties = new NameValueCollection(StringComparer.InvariantCultureIgnoreCase); + foreach (XmlNode propertyNode in propertyNodes) + { + var key = string.Empty; + var itsValue = string.Empty; + + var keyAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_KEY_ATTRIB]; + var valueAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_VALUE_ATTRIB]; + + if (keyAttrib == null) + throw new ConfigurationException + ("Required Attribute '" + + ARGUMENT_ELEMENT_KEY_ATTRIB + + "' not found in element '" + + ARGUMENT_ELEMENT + + "'" + ); + + key = keyAttrib.Value; + + if (valueAttrib != null) itsValue = valueAttrib.Value; + + properties.Add(key, itsValue); + } + + return new LogSetting(factoryType, properties); + } + + #region Fields + private static readonly string LOGFACTORYADAPTER_ELEMENT = "logFactoryAdapter"; + private static readonly string LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB = "type"; + private static readonly string ARGUMENT_ELEMENT = "arg"; + private static readonly string ARGUMENT_ELEMENT_KEY_ATTRIB = "key"; + private static readonly string ARGUMENT_ELEMENT_VALUE_ATTRIB = "value"; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Logging/LogManager.cs b/ORBatisCore/Logging/LogManager.cs new file mode 100644 index 0000000..9dee4c6 --- /dev/null +++ b/ORBatisCore/Logging/LogManager.cs @@ -0,0 +1,202 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Configuration; +using IBatisNet.Common.Logging.Impl; + +namespace IBatisNet.Common.Logging; + +/// +/// Uses the specified to create instances +/// that are used to log messages. Inspired by log4net. +/// +public sealed class LogManager +{ + private static ILoggerFactoryAdapter _adapter; + private static readonly object _loadLock = new(); + private static readonly string IBATIS_SECTION_LOGGING = "iBATIS/logging"; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Uses a private access modifier to prevent instantiation of this class. + /// + private LogManager() { } + + + /// + /// Gets or sets the adapter. + /// + /// + /// + /// The IBatisNet.Common assembly ships with the following built-in + /// implementations: + /// + /// + /// + /// + /// + /// + /// Writes output to Console.Out + /// + /// + /// + /// + /// + /// Writes output to the System.Diagnostics.Trace sub-system + /// + /// + /// + /// + /// + /// Ignores all messages + /// + /// + /// + /// The adapter. + public static ILoggerFactoryAdapter Adapter + { + get + { + if (_adapter == null) + lock (_loadLock) + { + if (_adapter == null) _adapter = BuildLoggerFactoryAdapter(); + } + + return _adapter; + } + set + { + lock (_loadLock) + { + _adapter = value; + } + } + } + + + /// + /// Gets the logger. + /// + /// The type. + /// + public static ILog GetLogger(Type type) + { + return Adapter.GetLogger(type); + } + + + /// + /// Gets the logger. + /// + /// The name. + /// + public static ILog GetLogger(string name) + { + return Adapter.GetLogger(name); + } + + + /// + /// Builds the logger factory adapter. + /// + /// + private static ILoggerFactoryAdapter BuildLoggerFactoryAdapter() + { + LogSetting setting = null; + try + { + setting = (LogSetting)ConfigurationManager.GetSection(IBATIS_SECTION_LOGGING); + } + catch (Exception ex) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to read configuration. Using default logger.", ex); + return defaultFactory; + } + + if (setting != null && !typeof(ILoggerFactoryAdapter).IsAssignableFrom(setting.FactoryAdapterType)) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Type " + setting.FactoryAdapterType.FullName + " does not implement ILoggerFactoryAdapter. Using default logger"); + return defaultFactory; + } + + ILoggerFactoryAdapter instance = null; + + if (setting != null) + { + if (setting.Properties.Count > 0) + try + { + object[] args = { setting.Properties }; + + instance = (ILoggerFactoryAdapter)Activator.CreateInstance(setting.FactoryAdapterType, args); + } + catch (Exception ex) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to create instance of type " + setting.FactoryAdapterType.FullName + ". Using default logger.", ex); + return defaultFactory; + } + else + try + { + instance = (ILoggerFactoryAdapter)Activator.CreateInstance(setting.FactoryAdapterType); + } + catch (Exception ex) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to create instance of type " + setting.FactoryAdapterType.FullName + ". Using default logger.", ex); + return defaultFactory; + } + } + else + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to read configuration IBatisNet/logging. Using default logger."); + return defaultFactory; + } + + return instance; + } + + + /// + /// Builds the default logger factory adapter. + /// + /// + private static ILoggerFactoryAdapter BuildDefaultLoggerFactoryAdapter() + { + return new NoOpLoggerFA(); + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs new file mode 100644 index 0000000..99d6383 --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs @@ -0,0 +1,78 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// Factory to get implementation. +/// +public sealed class ArgumentStrategyFactory +{ + private static readonly IArgumentStrategy _defaultStrategy; + private static readonly IArgumentStrategy _resultMapStrategy; + private static readonly IArgumentStrategy _selectArrayStrategy; + private static readonly IArgumentStrategy _selectGenericListStrategy; + private static readonly IArgumentStrategy _selectListStrategy; + private static readonly IArgumentStrategy _selectObjectStrategy; + + /// + /// Initializes the class. + /// + static ArgumentStrategyFactory() + { + _defaultStrategy = new DefaultStrategy(); + _resultMapStrategy = new ResultMapStrategy(); + + _selectArrayStrategy = new SelectArrayStrategy(); + _selectListStrategy = new SelectListStrategy(); + _selectObjectStrategy = new SelectObjectStrategy(); + _selectGenericListStrategy = new SelectGenericListStrategy(); + } + + /// + /// Finds the . + /// + /// The . + /// The + public static IArgumentStrategy Get(ArgumentProperty mapping) + { + // no 'select' or 'resultMap' attributes + if (mapping.Select.Length == 0 && mapping.NestedResultMap == null) + // We have a 'normal' ResultMap + return _defaultStrategy; + + if (mapping.NestedResultMap != null) // 'resultMap' attribut + return _resultMapStrategy; + + //'select' ResultProperty + return new SelectStrategy(mapping, + _selectArrayStrategy, + _selectGenericListStrategy, + _selectListStrategy, + _selectObjectStrategy); + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/DefaultStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/DefaultStrategy.cs new file mode 100644 index 0000000..2bf1c5c --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/DefaultStrategy.cs @@ -0,0 +1,74 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; +using IBatisNet.DataMapper.TypeHandlers; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// implementation when no 'select' or +/// 'resultMapping' attribute exists on a . +/// +public sealed class DefaultStrategy : IArgumentStrategy +{ + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + if (mapping.TypeHandler == null || + mapping.TypeHandler is UnknownTypeHandler) // Find the TypeHandler + lock (mapping) + { + if (mapping.TypeHandler == null || mapping.TypeHandler is UnknownTypeHandler) + { + var columnIndex = 0; + if (mapping.ColumnIndex == ResultProperty.UNKNOWN_COLUMN_INDEX) + columnIndex = reader.GetOrdinal(mapping.ColumnName); + else + columnIndex = mapping.ColumnIndex; + var systemType = reader.GetFieldType(columnIndex); + + mapping.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(systemType); + } + } + + var dataBaseValue = mapping.GetDataBaseValue(reader); + request.IsRowDataFound = request.IsRowDataFound || dataBaseValue != null; + + return dataBaseValue; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs new file mode 100644 index 0000000..2f2138b --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs @@ -0,0 +1,46 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// contract to get the value of an argument constructor. +/// +public interface IArgumentStrategy +{ + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + object GetValue(RequestScope request, ResultProperty mapping, ref IDataReader reader, object keys); +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs new file mode 100644 index 0000000..bd35757 --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs @@ -0,0 +1,83 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// implementation when a 'resultMapping' attribute exists +/// on a . +/// +public sealed class ResultMapStrategy : BaseStrategy, IArgumentStrategy +{ + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + object[] parameters = null; + var isParameterFound = false; + + var resultMapping = mapping.NestedResultMap.ResolveSubMap(reader); + + if (resultMapping.Parameters.Count > 0) + { + parameters = new object[resultMapping.Parameters.Count]; + // Fill parameters array + for (var index = 0; index < resultMapping.Parameters.Count; index++) + { + var property = resultMapping.Parameters[index]; + parameters[index] = property.ArgumentStrategy.GetValue(request, property, ref reader, null); + request.IsRowDataFound = request.IsRowDataFound || parameters[index] != null; + isParameterFound = isParameterFound || parameters[index] != null; + } + } + + object obj = null; + // If I have a constructor tag and all argumments values are null, the obj is null + if (resultMapping.Parameters.Count > 0 && isParameterFound == false) + { + obj = null; + } + else + { + obj = resultMapping.CreateInstanceOfResult(parameters); + if (FillObjectWithReaderAndResultMap(request, reader, resultMapping, ref obj) == false) obj = null; + } + + return obj; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs new file mode 100644 index 0000000..e4c7d9f --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs @@ -0,0 +1,64 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on a +/// +public sealed class SelectArrayStrategy : IArgumentStrategy +{ + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + var values = selectStatement.ExecuteQueryForList(request.Session, keys); + + var elementType = mapping.MemberType.GetElementType(); + var array = Array.CreateInstance(elementType, values.Count); + var count = values.Count; + for (var i = 0; i < count; i++) array.SetValue(values[i], i); + return array; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs new file mode 100644 index 0000000..a704551 --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs @@ -0,0 +1,88 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using System.Reflection; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on an and the object property is +/// different from an or an . +/// +public sealed class SelectGenericListStrategy : IArgumentStrategy +{ + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + + var typeArgs = mapping.MemberType.GetGenericArguments(); + var genericList = typeof(IList<>); + var constructedType = genericList.MakeGenericType(typeArgs); + var elementType = mapping.MemberType.GetGenericArguments()[0]; + + var mappedStatementType = selectStatement.GetType(); + + Type[] typeArguments = { typeof(SqlMapSession), typeof(object) }; + + var mis = mappedStatementType.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance); + MethodInfo mi = null; + foreach (var m in mis) + if (m.IsGenericMethod && + m.Name == "ExecuteQueryForList" && + m.GetParameters().Length == 2) + { + mi = m; + break; + } + + var miConstructed = mi.MakeGenericMethod(elementType); + + // Invoke the method. + object[] args = { request.Session, keys }; + var values = miConstructed.Invoke(selectStatement, args); + + return values; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/SelectListStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectListStrategy.cs new file mode 100644 index 0000000..4dc369a --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectListStrategy.cs @@ -0,0 +1,69 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on a +/// +public sealed class SelectListStrategy : IArgumentStrategy +{ + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + if (mapping.MemberType == typeof(IList)) + { + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + return selectStatement.ExecuteQueryForList(request.Session, keys); + } + + // Strongly typed List + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + var factory = request.DataExchangeFactory.ObjectFactory.CreateFactory(mapping.MemberType, Type.EmptyTypes); + var values = factory.CreateInstance(null); + selectStatement.ExecuteQueryForList(request.Session, keys, (IList)values); + return values; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs new file mode 100644 index 0000000..a764a78 --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs @@ -0,0 +1,60 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on an and the object property is +/// different from an or an . +/// +public sealed class SelectObjectStrategy : IArgumentStrategy +{ + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + return selectStatement.ExecuteQueryForObject(request.Session, keys); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ArgumentStrategy/SelectStrategy.cs b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectStrategy.cs new file mode 100644 index 0000000..d6180ec --- /dev/null +++ b/ORBatisCore/MappedStatements/ArgumentStrategy/SelectStrategy.cs @@ -0,0 +1,127 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; + +//using System.Reflection; +//using IBatisNet.Common; +//using IBatisNet.DataMapper.Commands; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on a +/// +public class SelectStrategy : IArgumentStrategy +{ + private readonly IArgumentStrategy _selectStrategy; + + /// + /// Initializes a new instance of the class. + /// + /// The mapping. + /// The select array strategy. + /// The select generic list strategy. + /// The select list strategy. + /// The select object strategy. + public SelectStrategy(ResultProperty mapping, + IArgumentStrategy selectArrayStrategy, + IArgumentStrategy selectGenericListStrategy, + IArgumentStrategy selectListStrategy, + IArgumentStrategy selectObjectStrategy) + { + // Collection object or .NET object + if (mapping.MemberType.BaseType == typeof(Array)) + _selectStrategy = selectArrayStrategy; + else if (mapping.MemberType.IsGenericType && + typeof(IList<>).IsAssignableFrom(mapping.MemberType.GetGenericTypeDefinition())) + _selectStrategy = selectGenericListStrategy; + // Check if the object to Map implement 'IList' or is IList type + // If yes the ResultProperty is map to a IList object + else if (typeof(IList).IsAssignableFrom(mapping.MemberType)) + _selectStrategy = selectListStrategy; + + else // The ResultProperty is map to a .Net object + _selectStrategy = selectObjectStrategy; + } + + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object selectKeys) + { + var paramString = mapping.ColumnName; + object keys = null; + var wasNull = false; + + #region Finds the select keys. + if (paramString.IndexOf(',') > 0 || paramString.IndexOf('=') > 0) // composite parameters key + { + IDictionary keyMap = new Hashtable(); + keys = keyMap; + // define which character is seperating fields + char[] splitter = { '=', ',' }; + + var paramTab = paramString.Split(splitter); + if (paramTab.Length % 2 != 0) throw new DataMapperException("Invalid composite key string format in '" + mapping.PropertyName + ". It must be: property1=column1,property2=column2,..."); + var enumerator = paramTab.GetEnumerator(); + while (!wasNull && enumerator.MoveNext()) + { + var hashKey = ((string)enumerator.Current).Trim(); + if (paramString.Contains("=")) // old 1.x style multiple params + enumerator.MoveNext(); + var hashValue = reader.GetValue(reader.GetOrdinal(((string)enumerator.Current).Trim())); + + keyMap.Add(hashKey, hashValue); + wasNull = hashValue == DBNull.Value; + } + } + else // single parameter key + { + keys = reader.GetValue(reader.GetOrdinal(paramString)); + wasNull = reader.IsDBNull(reader.GetOrdinal(paramString)); + } + #endregion + + if (wasNull) return null; + + // Collection object or .Net object + // lazyLoading is not permit for argument constructor + return _selectStrategy.GetValue(request, mapping, ref reader, keys); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/BaseStrategy.cs b/ORBatisCore/MappedStatements/BaseStrategy.cs new file mode 100644 index 0000000..7920c30 --- /dev/null +++ b/ORBatisCore/MappedStatements/BaseStrategy.cs @@ -0,0 +1,109 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using System.Text; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// BaseStrategy. +/// +public abstract class BaseStrategy +{ + private const string KEY_SEPARATOR = "\002"; + + /// + /// Used by N+1 Select solution + /// + public static object SKIP = new(); + + + /// + /// Calculte a unique key which identify the resukt object build by this + /// + /// + /// + /// + /// + protected string GetUniqueKey(IResultMap resultMap, RequestScope request, IDataReader reader) + { + if (resultMap.GroupByProperties.Count > 0) + { + var keyBuffer = new StringBuilder(); + + for (var i = 0; i < resultMap.GroupByProperties.Count; i++) + { + var resultProperty = resultMap.GroupByProperties[i]; + keyBuffer.Append(resultProperty.GetDataBaseValue(reader)); + keyBuffer.Append('-'); + } + + if (keyBuffer.Length < 1) + // we should never go here + return null; + + // separator value not likely to appear in a database + keyBuffer.Append(KEY_SEPARATOR); + return keyBuffer.ToString(); + } + + // we should never go here + return null; + } + + /// + /// Fills the object with reader and result map. + /// + /// The request. + /// The reader. + /// The result map. + /// The result object. + /// Indicates if we have found a row. + protected bool FillObjectWithReaderAndResultMap(RequestScope request, IDataReader reader, + IResultMap resultMap, ref object resultObject) + { + var dataFound = false; + + if (resultMap.Properties.Count > 0) + { + // For each Property in the ResultMap, set the property in the object + for (var index = 0; index < resultMap.Properties.Count; index++) + { + request.IsRowDataFound = false; + var property = resultMap.Properties[index]; + property.PropertyStrategy.Set(request, resultMap, property, ref resultObject, reader, null); + dataFound = dataFound || request.IsRowDataFound; + } + + request.IsRowDataFound = dataFound; + return dataFound; + } + + return true; + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/CachingStatement.cs b/ORBatisCore/MappedStatements/CachingStatement.cs new file mode 100644 index 0000000..fda6171 --- /dev/null +++ b/ORBatisCore/MappedStatements/CachingStatement.cs @@ -0,0 +1,486 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 602985 $ + * $Date: 2007-12-10 11:25:11 -0700 (Mon, 10 Dec 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Summary description for CachingStatement. +/// +public sealed class CachingStatement : IMappedStatement +{ + private readonly MappedStatement _mappedStatement; + + /// + /// Constructor + /// + /// + public CachingStatement(MappedStatement statement) + { + _mappedStatement = statement; + } + + /// + /// Event launch on exceute query + /// + public event ExecuteEventHandler Execute; + + /// + /// Gets a percentage of successful cache hits achieved + /// + /// The percentage of hits (0-1), or -1 if cache is disabled. + public double GetDataCacheHitRatio() + { + if (_mappedStatement.Statement.CacheModel != null) return _mappedStatement.Statement.CacheModel.HitRatio; + + return -1; + } + + /// + /// Gets the cache key. + /// + /// The request. + /// the cache key + private CacheKey GetCacheKey(RequestScope request) + { + var cacheKey = new CacheKey(); + var count = request.IDbCommand.Parameters.Count; + for (var i = 0; i < count; i++) + { + var dataParameter = (IDataParameter)request.IDbCommand.Parameters[i]; + if (dataParameter.Value != null) cacheKey.Update(dataParameter.Value); + } + + cacheKey.Update(_mappedStatement.Id); + cacheKey.Update(_mappedStatement.SqlMap.DataSource.ConnectionString); + cacheKey.Update(request.IDbCommand.CommandText); + + var cacheModel = _mappedStatement.Statement.CacheModel; + if (!cacheModel.IsReadOnly && !cacheModel.IsSerializable) + // read/write, nonserializable cache models need to use per-session caching + cacheKey.Update(request.Session); + return cacheKey; + } + + #region IMappedStatement Members + /// + /// The IPreparedCommand to use + /// + public IPreparedCommand PreparedCommand => _mappedStatement.PreparedCommand; + + /// + /// Name used to identify the MappedStatement amongst the others. + /// This the name of the SQL statment by default. + /// + public string Id => _mappedStatement.Id; + + /// + /// The SQL statment used by this MappedStatement + /// + public IStatement Statement => _mappedStatement.Statement; + + /// + /// The SqlMap used by this MappedStatement + /// + public ISqlMapper SqlMap => _mappedStatement.SqlMap; + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + IDictionary map = new Hashtable(); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForMap"); + if (keyProperty != null) cacheKey.Update(keyProperty); + if (valueProperty != null) cacheKey.Update(valueProperty); + + map = Statement.CacheModel[cacheKey] as IDictionary; + if (map == null) + { + map = _mappedStatement.RunQueryForMap(request, session, parameterObject, keyProperty, valueProperty, null); + Statement.CacheModel[cacheKey] = map; + } + + return map; + } + + #region ExecuteQueryForMap .NET 2.0 + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + IDictionary map = new Dictionary(); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForMap"); + if (keyProperty != null) cacheKey.Update(keyProperty); + if (valueProperty != null) cacheKey.Update(valueProperty); + + map = Statement.CacheModel[cacheKey] as IDictionary; + if (map == null) + { + map = _mappedStatement.RunQueryForDictionary(request, session, parameterObject, keyProperty, valueProperty, null); + Statement.CacheModel[cacheKey] = map; + } + + return map; + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + #endregion + + /// + /// Execute an update statement. Also used for delete statement. + /// Return the number of row effected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of row effected. + public int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + return _mappedStatement.ExecuteUpdate(session, parameterObject); + } + + /// + /// Execute an insert statement. Fill the parameter object with + /// the ouput parameters if any, also could return the insert generated key + /// + /// The session + /// The parameter object used to fill the statement. + /// Can return the insert generated key. + public object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + return _mappedStatement.ExecuteInsert(session, parameterObject); + } + + #region ExecuteQueryForList + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + _mappedStatement.ExecuteQueryForList(session, parameterObject, resultObject); + } + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForList"); + cacheKey.Update(skipResults); + cacheKey.Update(maxResults); + + list = Statement.CacheModel[cacheKey] as IList; + if (list == null) + { + list = _mappedStatement.RunQueryForList(request, session, parameterObject, skipResults, maxResults); + Statement.CacheModel[cacheKey] = list; + } + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForList(session, parameterObject, MappedStatement.NO_SKIPPED_RESULTS, MappedStatement.NO_MAXIMUM_RESULTS); + } + #endregion + + #region ExecuteQueryForList .NET 2.0 + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + _mappedStatement.ExecuteQueryForList(session, parameterObject, resultObject); + } + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForList"); + cacheKey.Update(skipResults); + cacheKey.Update(maxResults); + + list = Statement.CacheModel[cacheKey] as IList; + if (list == null) + { + list = _mappedStatement.RunQueryForList(request, session, parameterObject, skipResults, maxResults); + Statement.CacheModel[cacheKey] = list; + } + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForList(session, parameterObject, MappedStatement.NO_SKIPPED_RESULTS, MappedStatement.NO_MAXIMUM_RESULTS); + } + #endregion + + #region ExecuteQueryForObject + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, null); + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + object obj = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForObject"); + + obj = Statement.CacheModel[cacheKey]; + // check if this query has alreay been run + if (obj == CacheModel.NULL_OBJECT) + { + // convert the marker object back into a null value + obj = null; + } + else if (obj == null) + { + obj = _mappedStatement.RunQueryForObject(request, session, parameterObject, resultObject); + Statement.CacheModel[cacheKey] = obj; + } + + return obj; + } + + + #region ExecuteQueryForObject .NET 2.0 + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public T ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, default); + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public T ExecuteQueryForObject(ISqlMapSession session, object parameterObject, T resultObject) + { + var obj = default(T); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForObject"); + + var cacheObjet = Statement.CacheModel[cacheKey]; + // check if this query has alreay been run + if (cacheObjet is T) + { + obj = (T)cacheObjet; + } + else if (cacheObjet == CacheModel.NULL_OBJECT) + { + // convert the marker object back into a null value + obj = default; + } + else + { + obj = (T)_mappedStatement.RunQueryForObject(request, session, parameterObject, resultObject); + Statement.CacheModel[cacheKey] = obj; + } + + return obj; + } + #endregion + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForMapWithRowDelegate(session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + #endregion + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/DeleteMappedStatement.cs b/ORBatisCore/MappedStatements/DeleteMappedStatement.cs new file mode 100644 index 0000000..13a7b03 --- /dev/null +++ b/ORBatisCore/MappedStatements/DeleteMappedStatement.cs @@ -0,0 +1,140 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Collections; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Summary description for DeleteMappedStatement. +/// +public sealed class DeleteMappedStatement : MappedStatement +{ + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal DeleteMappedStatement(ISqlMapper sqlMap, IStatement statement) + : base(sqlMap, statement) { } + + #region ExecuteQueryForMap + /// + /// + /// + /// + /// + /// + /// + public override IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + throw new DataMapperException("Delete statements cannot be executed as a query for map."); + } + #endregion + + #region ExecuteInsert + /// + /// + /// + /// + /// + public override object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query insert."); + } + #endregion + + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + throw new DataMapperException("Delete statements cannot be executed as a query for row delegate."); + } + + #region ExecuteQueryForList + /// + /// + /// + /// + /// + public override void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + throw new DataMapperException("Delete statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for list."); + } + #endregion + + + #region ExecuteForObject + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for object."); + } + + /// + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for object."); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/IMappedStatement.cs b/ORBatisCore/MappedStatements/IMappedStatement.cs new file mode 100644 index 0000000..cdf689f --- /dev/null +++ b/ORBatisCore/MappedStatements/IMappedStatement.cs @@ -0,0 +1,289 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.Statements; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// +public delegate void ExecuteEventHandler(object sender, ExecuteEventArgs e); + +/// +/// Summary description for IMappedStatement. +/// +public interface IMappedStatement +{ + #region Event + /// + /// Event launch on exceute query + /// + event ExecuteEventHandler Execute; + #endregion + + #region ExecuteQueryForMap + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty); + #endregion + + #region ExecuteUpdate + /// + /// Execute an update statement. Also used for delete statement. + /// Return the number of row effected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of row effected. + int ExecuteUpdate(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteInsert + /// + /// Execute an insert statement. Fill the parameter object with + /// the ouput parameters if any, also could return the insert generated key + /// + /// The session + /// The parameter object used to fill the statement. + /// Can return the insert generated key. + object ExecuteInsert(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteQueryForRowDelegate .NET 2.0 + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + /// param> + /// + IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate); + #endregion + + #region Properties + /// + /// The IPreparedCommand to use + /// + IPreparedCommand PreparedCommand { get; } + + /// + /// Name used to identify the MappedStatement amongst the others. + /// This the name of the SQL statment by default. + /// + string Id { get; } + + /// + /// The SQL statment used by this MappedStatement + /// + IStatement Statement { get; } + + + /// + /// The SqlMap used by this MappedStatement + /// + ISqlMapper SqlMap { get; } + #endregion + + #region ExecuteQueryForMap .NET 2.0 + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty); + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate); + #endregion + + #region ExecuteQueryForList + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject); + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults); + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteQueryForList .NET 2.0 + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject); + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults); + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteForObject + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + object ExecuteQueryForObject(ISqlMapSession session, object parameterObject); + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject); + #endregion + + + #region ExecuteForObject .NET 2.0 + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + T ExecuteQueryForObject(ISqlMapSession session, object parameterObject); + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + T ExecuteQueryForObject(ISqlMapSession session, object parameterObject, T resultObject); + #endregion + + #region Delegate + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + /// param> + /// + IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate); + + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate); + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/InsertMappedStatement.cs b/ORBatisCore/MappedStatements/InsertMappedStatement.cs new file mode 100644 index 0000000..bd3eb2c --- /dev/null +++ b/ORBatisCore/MappedStatements/InsertMappedStatement.cs @@ -0,0 +1,156 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Collections; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Summary description for InsertMappedStatement. +/// +public sealed class InsertMappedStatement : MappedStatement +{ + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal InsertMappedStatement(ISqlMapper sqlMap, IStatement statement) : base(sqlMap, statement) { } + + #region ExecuteQueryForMap + /// + /// + /// + /// + /// + /// + /// + public override IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + throw new DataMapperException("Insert statements cannot be executed as a query for map."); + } + #endregion + + #region ExecuteUpdate + /// + /// + /// + /// + /// + public override int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a update query."); + } + #endregion + + #region ExecuteQueryForList + /// + /// + /// + /// + /// + public override void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + throw new DataMapperException("Insert statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for list."); + } + #endregion + + #region Delegate + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + throw new DataMapperException("Insert statements cannot be executed as a query for row delegate."); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public override IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + throw new DataMapperException("Insert statements cannot be executed as a query for row delegate."); + } + #endregion + + #region ExecuteForObject + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for object."); + } + + /// + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for object."); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/MappedStatement.cs b/ORBatisCore/MappedStatements/MappedStatement.cs new file mode 100644 index 0000000..fd84738 --- /dev/null +++ b/ORBatisCore/MappedStatements/MappedStatement.cs @@ -0,0 +1,1100 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 575902 $ + * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Data; +using System.Text; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; +using IBatisNet.DataMapper.MappedStatements.ResultStrategy; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Summary description for MappedStatement. +/// +public class MappedStatement : IMappedStatement +{ + #region Constructor (s) / Destructor + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal MappedStatement(ISqlMapper sqlMap, IStatement statement) + { + SqlMap = sqlMap; + Statement = statement; + PreparedCommand = PreparedCommandFactory.GetPreparedCommand(false); + _resultStrategy = ResultStrategyFactory.Get(Statement); + } + #endregion + + /// + /// Event launch on exceute query + /// + public event ExecuteEventHandler Execute; + + #region Fields + // Magic number used to set the the maximum number of rows returned to 'all'. + internal const int NO_MAXIMUM_RESULTS = -1; + + // Magic number used to set the the number of rows skipped to 'none'. + internal const int NO_SKIPPED_RESULTS = -1; + + private readonly IResultStrategy _resultStrategy; + #endregion + + #region Properties + /// + /// The IPreparedCommand to use + /// + public IPreparedCommand PreparedCommand { get; } + + /// + /// Name used to identify the MappedStatement amongst the others. + /// This the name of the SQL statement by default. + /// + public string Id => Statement.Id; + + /// + /// The SQL statment used by this MappedStatement + /// + public IStatement Statement { get; } + + /// + /// The SqlMap used by this MappedStatement + /// + public ISqlMapper SqlMap { get; } + #endregion + + #region Methods + /// + /// Retrieve the output parameter and map them on the result object. + /// This routine is only use is you specified a ParameterMap and some output attribute + /// or if you use a store procedure with output parameter... + /// + /// + /// The current session. + /// The result object. + /// The command sql. + private void RetrieveOutputParameters(RequestScope request, ISqlMapSession session, IDbCommand command, object result) + { + if (request.ParameterMap != null) + { + var count = request.ParameterMap.PropertiesList.Count; + for (var i = 0; i < count; i++) + { + var mapping = request.ParameterMap.GetProperty(i); + if (mapping.Direction == ParameterDirection.Output || + mapping.Direction == ParameterDirection.InputOutput) + { + var parameterName = string.Empty; + if (session.DataSource.DbProvider.UseParameterPrefixInParameter == false) + parameterName = mapping.ColumnName; + else + parameterName = session.DataSource.DbProvider.ParameterPrefix + + mapping.ColumnName; + + if (mapping.TypeHandler == null) // Find the TypeHandler + lock (mapping) + { + if (mapping.TypeHandler == null) + { + var propertyType = ObjectProbe.GetMemberTypeForGetter(result, mapping.PropertyName); + + mapping.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(propertyType); + } + } + + // Fix IBATISNET-239 + //"Normalize" System.DBNull parameters + var dataParameter = (IDataParameter)command.Parameters[parameterName]; + var dbValue = dataParameter.Value; + + object value = null; + + var wasNull = dbValue == DBNull.Value; + if (wasNull) + { + if (mapping.HasNullValue) + value = mapping.TypeHandler.ValueOf(mapping.GetAccessor.MemberType, mapping.NullValue); + else + value = mapping.TypeHandler.NullValue; + } + else + { + value = mapping.TypeHandler.GetDataBaseValue(dataParameter.Value, result.GetType()); + } + + request.IsRowDataFound = request.IsRowDataFound || value != null; + + request.ParameterMap.SetOutputParameter(ref result, mapping, value); + } + } + } + } + + + #region ExecuteForObject + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public virtual object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, null); + } + + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public virtual object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + object obj = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + obj = RunQueryForObject(request, session, parameterObject, resultObject); + + return obj; + } + + public dynamic ExecuteQueryForDynamicObject(ISqlMapSession session, object parameterObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + var obj = RunQueryForDynamicObject(request, session, parameterObject); + + return obj; + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + internal dynamic RunQueryForDynamicObject(RequestScope request, ISqlMapSession session, object parameterObject) + { + var resultObject = default(dynamic); + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + while (reader.Read()) + { + object obj = _resultStrategy.Process(request, ref reader, resultObject); + if (obj != BaseStrategy.SKIP) resultObject = obj; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + #region remark + // If you are using the OleDb data provider (as you are), you need to close the + // DataReader before output parameters are visible. + #endregion + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return resultObject; + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + internal object RunQueryForObject(RequestScope request, ISqlMapSession session, object parameterObject, object resultObject) + { + var result = resultObject; + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, resultObject); + if (obj != BaseStrategy.SKIP) result = obj; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + #region remark + // If you are using the OleDb data provider (as you are), you need to close the + // DataReader before output parameters are visible. + #endregion + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return result; + } + #endregion + + #region ExecuteForObject .NET 2.0 + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public virtual T ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, default(T)); + } + + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public virtual T ExecuteQueryForObject(ISqlMapSession session, object parameterObject, T resultObject) + { + var obj = default(T); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + obj = RunQueryForObject(request, session, parameterObject, resultObject); + + return obj; + } + + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + internal T RunQueryForObject(RequestScope request, ISqlMapSession session, object parameterObject, T resultObject) + { + var result = resultObject; + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, resultObject); + if (obj != BaseStrategy.SKIP) result = (T)obj; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + #region remark + // If you are using the OleDb data provider, you need to close the + // DataReader before output parameters are visible. + #endregion + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return result; + } + #endregion + + #region ExecuteQueryForList + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public virtual IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + if (rowDelegate == null) throw new DataMapperException("A null RowDelegate was passed to QueryForRowDelegate."); + + return RunQueryForList(request, session, parameterObject, null, rowDelegate); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public virtual IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + if (rowDelegate == null) throw new DataMapperException("A null DictionaryRowDelegate was passed to QueryForMapWithRowDelegate."); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForMap(request, session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, null, null); + } + + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, skipResults, maxResults); + } + + /// + /// Runs the query for list. + /// + /// The request. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + + using (var command = request.IDbCommand) + { + if (Statement.ListClass == null) + list = new ArrayList(); + else + list = Statement.CreateInstanceOfListClass(); + + var reader = command.ExecuteReader(); + + try + { + // skip results + for (var i = 0; i < skipResults; i++) + if (!reader.Read()) + break; + + // Get Results + var resultsFetched = 0; + while ((maxResults == NO_MAXIMUM_RESULTS || resultsFetched < maxResults) + && reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add(obj); + resultsFetched++; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + /// + /// Executes the SQL and retuns a List of result objects. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + /// + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, object parameterObject, IList resultObject, RowDelegate rowDelegate) + { + var list = resultObject; + + using (var command = request.IDbCommand) + { + if (resultObject == null) + { + if (Statement.ListClass == null) + list = new ArrayList(); + else + list = Statement.CreateInstanceOfListClass(); + } + + var reader = command.ExecuteReader(); + + try + { + do + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add(obj); + } + else + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + rowDelegate(obj, parameterObject, list); + } + } while (reader.NextResult()); + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public virtual void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + RunQueryForList(request, session, parameterObject, resultObject, null); + } + #endregion + + #region ExecuteQueryForList .NET 2.0 + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public virtual IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + if (rowDelegate == null) throw new DataMapperException("A null RowDelegate was passed to QueryForRowDelegate."); + return RunQueryForList(request, session, parameterObject, null, rowDelegate); + } + + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, null, null); + } + + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, skipResults, maxResults); + } + + + /// + /// Executes the SQL and retuns a List of result objects. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + + using (var command = request.IDbCommand) + { + if (Statement.ListClass == null) + list = new List(); + else + list = Statement.CreateInstanceOfGenericListClass(); + + var reader = command.ExecuteReader(); + try + { + // skip results + for (var i = 0; i < skipResults; i++) + if (!reader.Read()) + break; + + var resultsFetched = 0; + while ((maxResults == NO_MAXIMUM_RESULTS || resultsFetched < maxResults) + && reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add((T)obj); + resultsFetched++; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + /// + /// Executes the SQL and retuns a List of result objects. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object + /// + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, + object parameterObject, IList resultObject, RowDelegate rowDelegate) + { + var list = resultObject; + + using (var command = request.IDbCommand) + { + if (resultObject == null) + { + if (Statement.ListClass == null) + list = new List(); + else + list = Statement.CreateInstanceOfGenericListClass(); + } + + var reader = command.ExecuteReader(); + try + { + do + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add((T)obj); + } + else + while (reader.Read()) + { + var obj = (T)_resultStrategy.Process(request, ref reader, null); + rowDelegate(obj, parameterObject, list); + } + } while (reader.NextResult()); + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public virtual void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + RunQueryForList(request, session, parameterObject, resultObject, null); + } + #endregion + + #region ExecuteUpdate, ExecuteInsert + /// + /// Execute an update statement. Also used for delete statement. + /// Return the number of row effected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of row effected. + public virtual int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + var rows = 0; // the number of rows affected + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + using (var command = request.IDbCommand) + { + rows = command.ExecuteNonQuery(); + + //ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return rows; + } + + + /// + /// Execute an insert statement. Fill the parameter object with + /// the ouput parameters if any, also could return the insert generated key + /// + /// The session + /// The parameter object used to fill the statement. + /// Can return the insert generated key. + public virtual object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + object generatedKey = null; + SelectKey selectKeyStatement = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + if (Statement is Insert) selectKeyStatement = ((Insert)Statement).SelectKey; + + if (selectKeyStatement != null && !selectKeyStatement.isAfter) + { + var mappedStatement = SqlMap.GetMappedStatement(selectKeyStatement.Id); + generatedKey = mappedStatement.ExecuteQueryForObject(session, parameterObject); + + ObjectProbe.SetMemberValue(parameterObject, selectKeyStatement.PropertyName, generatedKey, + request.DataExchangeFactory.ObjectFactory, + request.DataExchangeFactory.AccessorFactory); + } + + PreparedCommand.Create(request, session, Statement, parameterObject); + using (var command = request.IDbCommand) + { + if (Statement is Insert) + { + command.ExecuteNonQuery(); + } + // Retrieve output parameter if the result class is specified + else if (Statement is Procedure && Statement.ResultClass != null && + SqlMap.TypeHandlerFactory.IsSimpleType(Statement.ResultClass)) + { + IDataParameter returnValueParameter = command.CreateParameter(); + returnValueParameter.Direction = ParameterDirection.ReturnValue; + command.Parameters.Add(returnValueParameter); + + command.ExecuteNonQuery(); + generatedKey = returnValueParameter.Value; + + var typeHandler = SqlMap.TypeHandlerFactory.GetTypeHandler(Statement.ResultClass); + generatedKey = typeHandler.GetDataBaseValue(generatedKey, Statement.ResultClass); + } + else + { + generatedKey = command.ExecuteScalar(); + if (Statement.ResultClass != null && + SqlMap.TypeHandlerFactory.IsSimpleType(Statement.ResultClass)) + { + var typeHandler = SqlMap.TypeHandlerFactory.GetTypeHandler(Statement.ResultClass); + generatedKey = typeHandler.GetDataBaseValue(generatedKey, Statement.ResultClass); + } + } + + if (selectKeyStatement != null && selectKeyStatement.isAfter) + { + var mappedStatement = SqlMap.GetMappedStatement(selectKeyStatement.Id); + generatedKey = mappedStatement.ExecuteQueryForObject(session, parameterObject); + + ObjectProbe.SetMemberValue(parameterObject, selectKeyStatement.PropertyName, generatedKey, + request.DataExchangeFactory.ObjectFactory, + request.DataExchangeFactory.AccessorFactory); + } + + //ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return generatedKey; + } + #endregion + + #region ExecuteQueryForMap + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public virtual IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForMap(request, session, parameterObject, keyProperty, valueProperty, null); + } + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The request scope. + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForMapWithRowDelegate method + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + internal IDictionary RunQueryForMap(RequestScope request, + ISqlMapSession session, + object parameterObject, + string keyProperty, + string valueProperty, + DictionaryRowDelegate rowDelegate) + { + IDictionary map = new Hashtable(); + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = obj; + if (valueProperty != null) value = ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + map.Add(key, value); + } + else + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = obj; + if (valueProperty != null) value = ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + rowDelegate(key, value, parameterObject, map); + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + } + + return map; + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public virtual IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForDictionary(request, session, parameterObject, keyProperty, valueProperty, null); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public virtual IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + if (rowDelegate == null) throw new DataMapperException("A null DictionaryRowDelegate was passed to QueryForDictionary."); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForDictionary(request, session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The request scope. + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForMapWithRowDelegate method + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + internal IDictionary RunQueryForDictionary(RequestScope request, + ISqlMapSession session, + object parameterObject, + string keyProperty, + string valueProperty, + DictionaryRowDelegate rowDelegate) + { + IDictionary map = new Dictionary(); + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = (K)ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = default(V); + if (valueProperty != null) + value = (V)ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + else + value = (V)obj; + map.Add(key, value); + } + else + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = (K)ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = default(V); + if (valueProperty != null) + value = (V)ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + else + value = (V)obj; + rowDelegate(key, value, parameterObject, map); + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + } + + return map; + } + #endregion + + + /// + /// Executes the . + /// + /// The current . + private void ExecutePostSelect(RequestScope request) + { + while (request.QueueSelect.Count > 0) + { + var postSelect = request.QueueSelect.Dequeue() as PostBindind; + + PostSelectStrategyFactory.Get(postSelect.Method).Execute(postSelect, request); + } + } + + + /// + /// Raise an event ExecuteEventArgs + /// (Used when a query is executed) + /// + private void RaiseExecuteEvent() + { + var e = new ExecuteEventArgs(); + e.StatementName = Statement.Id; + if (Execute != null) Execute(this, e); + } + + /// + /// ToString implementation. + /// + /// A string that describes the MappedStatement + public override string ToString() + { + var buffer = new StringBuilder(); + buffer.Append("\tMappedStatement: " + Id); + buffer.Append(Environment.NewLine); + if (Statement.ParameterMap != null) buffer.Append(Statement.ParameterMap.Id); + + return buffer.ToString(); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PaginatedList.cs b/ORBatisCore/MappedStatements/PaginatedList.cs new file mode 100644 index 0000000..581b30b --- /dev/null +++ b/ORBatisCore/MappedStatements/PaginatedList.cs @@ -0,0 +1,423 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.Common.Pagination; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Summary description for PaginatedDataList. +/// +public class PaginatedList : IPaginatedList +{ + private readonly ISqlMapSession _session; + + /// + /// Constructor + /// + /// + /// + /// + public PaginatedList(IMappedStatement mappedStatement, object parameterObject, int pageSize, ISqlMapSession session) + { + _mappedStatement = mappedStatement; + _parameterObject = parameterObject; + PageSize = pageSize; + PageIndex = 0; + _session = session; + PageTo(0); + } + + + /// + /// + public bool IsEmpty => _currentPageList.Count == 0; + + #region IEnumerable Members + /// + /// + /// + public IEnumerator GetEnumerator() + { + return _currentPageList.GetEnumerator(); + } + #endregion + + + /// + /// + private void PageForward() + { + try + { + _prevPageList = _currentPageList; + _currentPageList = _nextPageList; + _nextPageList = GetList(PageIndex + 1, PageSize); + } + catch (DataMapperException e) + { + throw new DataMapperException("Unexpected error while repaginating paged list. Cause: " + e.Message, e); + } + } + + /// + /// + private void PageBack() + { + try + { + _nextPageList = _currentPageList; + _currentPageList = _prevPageList; + if (PageIndex > 0) + _prevPageList = GetList(PageIndex - 1, PageSize); + else + _prevPageList = new ArrayList(); + } + catch (DataMapperException e) + { + throw new DataMapperException("Unexpected error while repaginating paged list. Cause: " + e.Message, e); + } + } + + /// + /// + /// + private void SafePageTo(int index) + { + try + { + PageTo(index); + } + catch (DataMapperException e) + { + throw new DataMapperException("Unexpected error while repaginating paged list. Cause: " + e.Message, e); + } + } + + + /// + /// + /// + public void PageTo(int index) + { + PageIndex = index; + IList list = null; + + if (index < 1) + list = GetList(PageIndex, PageSize * 2); + else + list = GetList(index - 1, PageSize * 3); + + if (list.Count < 1) + { + _prevPageList = new ArrayList(); + _currentPageList = new ArrayList(); + _nextPageList = new ArrayList(); + } + else + { + if (index < 1) + { + _prevPageList = new ArrayList(); + if (list.Count <= PageSize) + { + _currentPageList = SubList(list, 0, list.Count); + _nextPageList = new ArrayList(); + } + else + { + _currentPageList = SubList(list, 0, PageSize); + _nextPageList = SubList(list, PageSize, list.Count); + } + } + else + { + if (list.Count <= PageSize) + { + _prevPageList = SubList(list, 0, list.Count); + _currentPageList = new ArrayList(); + _nextPageList = new ArrayList(); + } + else if (list.Count <= PageSize * 2) + { + _prevPageList = SubList(list, 0, PageSize); + _currentPageList = SubList(list, PageSize, list.Count); + _nextPageList = new ArrayList(); + } + else + { + _prevPageList = SubList(list, 0, PageSize); + _currentPageList = SubList(list, PageSize, PageSize * 2); + _nextPageList = SubList(list, PageSize * 2, list.Count); + } + } + } + } + + + /// + /// + /// + /// + /// + private IList GetList(int index, int localPageSize) + { + var isSessionLocal = false; + + + var list = _mappedStatement.ExecuteQueryForList(_session, _parameterObject, index * PageSize, localPageSize); + + return list; + } + + + /// + /// Provides a view of the IList pramaeter + /// from the specified position + /// to the specified position . + /// + /// The IList elements. + /// Starting position for the view of elements. + /// Ending position for the view of elements. + /// + /// A view of list. + /// + /// + /// The list that is returned is just a view, it is still backed + /// by the orignal list. Any changes you make to it will be + /// reflected in the orignal list. + /// + private IList SubList(IList list, int fromIndex, int toIndex) + { + return ((ArrayList)list).GetRange(fromIndex, toIndex - fromIndex); + } + + #region Fields + private IList _prevPageList; + private IList _currentPageList; + private IList _nextPageList; + + private readonly IMappedStatement _mappedStatement; + private readonly object _parameterObject; + #endregion + + #region IPaginatedList Members + /// + /// + public int PageIndex { get; private set; } + + /// + /// + public bool IsPreviousPageAvailable => _prevPageList.Count > 0; + + /// + /// + public bool IsFirstPage => PageIndex == 0; + + /// + /// + /// + public void GotoPage(int pageIndex) + { + SafePageTo(pageIndex); + } + + /// + /// + public int PageSize { get; } + + /// + /// + /// + public bool NextPage() + { + if (IsNextPageAvailable) + { + PageIndex++; + PageForward(); + return true; + } + + return false; + } + + /// + /// + public bool IsMiddlePage => !(IsFirstPage || IsLastPage); + + /// + /// + /// + public bool PreviousPage() + { + if (IsPreviousPageAvailable) + { + PageIndex--; + PageBack(); + return true; + } + + return false; + } + + /// + /// + public bool IsNextPageAvailable => _nextPageList.Count > 0; + + /// + /// + public bool IsLastPage => _nextPageList.Count < 1; + #endregion + + #region IList Members + /// + /// + public bool IsReadOnly => _currentPageList.IsReadOnly; + + /// + /// + public object this[int index] + { + get => _currentPageList[index]; + set => _currentPageList[index] = value; + } + + /// + /// + /// + public void RemoveAt(int index) + { + _currentPageList.RemoveAt(index); + } + + /// + /// + /// + /// + public void Insert(int index, object value) + { + _currentPageList.Insert(index, value); + } + + /// + /// + /// + public void Remove(object value) + { + _currentPageList.Remove(value); + } + + /// + /// + /// + /// + public bool Contains(object value) + { + return _currentPageList.Contains(value); + } + + /// + /// + public void Clear() + { + _currentPageList.Clear(); + } + + /// + /// + /// + /// + public int IndexOf(object value) + { + return _currentPageList.IndexOf(value); + } + + /// + /// + /// + /// + public int Add(object value) + { + return _currentPageList.Add(value); + } + + /// + /// + public bool IsFixedSize => _currentPageList.IsFixedSize; + #endregion + + #region ICollection Members + /// + /// + public bool IsSynchronized => _currentPageList.IsSynchronized; + + /// + /// + public int Count => _currentPageList.Count; + + /// + /// + /// + /// + public void CopyTo(Array array, int index) + { + _currentPageList.CopyTo(array, index); + } + + /// + /// + public object SyncRoot => _currentPageList.SyncRoot; + #endregion + + #region IEnumerator Members + /// + /// Sets the enumerator to its initial position, + /// which is before the first element in the collection. + /// + public void Reset() + { + _currentPageList.GetEnumerator().Reset(); + } + + /// + /// Gets the current element in the page. + /// + public object Current => _currentPageList.GetEnumerator().Current; + + /// + /// Advances the enumerator to the next element of the collection. + /// + /// + /// true if the enumerator was successfully advanced to the next element; + /// false if the enumerator has passed the end of the collection. + /// + public bool MoveNext() + { + return _currentPageList.GetEnumerator().MoveNext(); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostBindind.cs b/ORBatisCore/MappedStatements/PostBindind.cs new file mode 100644 index 0000000..e060eb6 --- /dev/null +++ b/ORBatisCore/MappedStatements/PostBindind.cs @@ -0,0 +1,106 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// All dataq tor retrieve 'select' +/// +/// +/// As ADO.NET allows one open per connection at once, we keep +/// all the datas to open the next after having closed the current. +/// +public sealed class PostBindind +{ + /// + /// Enumeration of the ExecuteQuery method. + /// + public enum ExecuteMethod + { + /// + /// Execute Query For Object + /// + ExecuteQueryForObject = 1, + + /// + /// Execute Query For IList + /// + ExecuteQueryForIList, + + /// + /// Execute Query For Generic IList + /// + ExecuteQueryForGenericIList, + + /// + /// Execute Query For Array List + /// + ExecuteQueryForArrayList, + + /// + /// Execute Query For Strong Typed IList + /// + ExecuteQueryForStrongTypedIList + } + + #region Properties + /// + /// Gets or sets the statement. + /// + /// The statement. + public IMappedStatement Statement { set; get; } + + + /// + /// Gets or sets the result property. + /// + /// The result property. + public ResultProperty ResultProperty { set; get; } + + + /// + /// Gets or sets the target. + /// + /// The target. + public object Target { set; get; } + + + /// + /// Gets or sets the keys. + /// + /// The keys. + public object Keys { set; get; } + + + /// + /// Gets or sets the method. + /// + /// The method. + public ExecuteMethod Method { set; get; } = ExecuteMethod.ExecuteQueryForIList; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostSelectStrategy/ArrayStrategy.cs b/ORBatisCore/MappedStatements/PostSelectStrategy/ArrayStrategy.cs new file mode 100644 index 0000000..c187b9e --- /dev/null +++ b/ORBatisCore/MappedStatements/PostSelectStrategy/ArrayStrategy.cs @@ -0,0 +1,53 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; + +/// +/// implementation to exceute a query for . +/// +public sealed class ArrayStrategy : IPostSelectStrategy +{ + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + var values = postSelect.Statement.ExecuteQueryForList(request.Session, postSelect.Keys); + var elementType = postSelect.ResultProperty.SetAccessor.MemberType.GetElementType(); + + var array = Array.CreateInstance(elementType, values.Count); + var count = values.Count; + for (var i = 0; i < count; i++) array.SetValue(values[i], i); + + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, array); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostSelectStrategy/GenericListStrategy.cs b/ORBatisCore/MappedStatements/PostSelectStrategy/GenericListStrategy.cs new file mode 100644 index 0000000..b59c7b4 --- /dev/null +++ b/ORBatisCore/MappedStatements/PostSelectStrategy/GenericListStrategy.cs @@ -0,0 +1,76 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; + +/// +/// implementation to exceute a query generic list. +/// +public sealed class GenericListStrategy : IPostSelectStrategy +{ + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + // How to: Examine and Instantiate Generic Types with Reflection + // http://msdn2.microsoft.com/en-us/library/b8ytshk6.aspx + + var typeArgs = postSelect.ResultProperty.SetAccessor.MemberType.GetGenericArguments(); + var genericList = typeof(IList<>); + var constructedType = genericList.MakeGenericType(typeArgs); + var elementType = postSelect.ResultProperty.SetAccessor.MemberType.GetGenericArguments()[0]; + + var mappedStatementType = postSelect.Statement.GetType(); + + Type[] typeArguments = { typeof(SqlMapSession), typeof(object) }; + + var mis = mappedStatementType.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance); + MethodInfo mi = null; + foreach (var m in mis) + if (m.IsGenericMethod && + m.Name == "ExecuteQueryForList" && + m.GetParameters().Length == 2) + { + mi = m; + break; + } + + var miConstructed = mi.MakeGenericMethod(elementType); + + // Invoke the method. + object[] args = { request.Session, postSelect.Keys }; + var values = miConstructed.Invoke(postSelect.Statement, args); + + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, values); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs b/ORBatisCore/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs new file mode 100644 index 0000000..d989916 --- /dev/null +++ b/ORBatisCore/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs @@ -0,0 +1,44 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; + +/// +/// contract to excute a 'select' +/// after the process of the main +/// +public interface IPostSelectStrategy +{ + /// + /// Executes the specified . + /// + /// The . + /// The + void Execute(PostBindind postSelect, RequestScope request); +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostSelectStrategy/ListStrategy.cs b/ORBatisCore/MappedStatements/PostSelectStrategy/ListStrategy.cs new file mode 100644 index 0000000..f82edaf --- /dev/null +++ b/ORBatisCore/MappedStatements/PostSelectStrategy/ListStrategy.cs @@ -0,0 +1,47 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; + +/// +/// implementation to exceute a query for list. +/// +public sealed class ListStrategy : IPostSelectStrategy +{ + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + object values = postSelect.Statement.ExecuteQueryForList(request.Session, postSelect.Keys); + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, values); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostSelectStrategy/ObjectStrategy.cs b/ORBatisCore/MappedStatements/PostSelectStrategy/ObjectStrategy.cs new file mode 100644 index 0000000..99dec94 --- /dev/null +++ b/ORBatisCore/MappedStatements/PostSelectStrategy/ObjectStrategy.cs @@ -0,0 +1,47 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; + +/// +/// implementation to exceute a query for object. +/// +public sealed class ObjectStrategy : IPostSelectStrategy +{ + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + var value = postSelect.Statement.ExecuteQueryForObject(request.Session, postSelect.Keys); + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, value); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs b/ORBatisCore/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs new file mode 100644 index 0000000..dc1cd8c --- /dev/null +++ b/ORBatisCore/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs @@ -0,0 +1,60 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; + +/// +/// Factory to get implementation. +/// +public sealed class PostSelectStrategyFactory +{ + private static readonly IDictionary _strategies = new HybridDictionary(); + + /// + /// Initializes the class. + /// + static PostSelectStrategyFactory() + { + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForArrayList, new ArrayStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForIList, new ListStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForObject, new ObjectStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForStrongTypedIList, new StrongTypedListStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForGenericIList, new GenericListStrategy()); + } + + + /// + /// Gets the . + /// + /// The . + /// The + public static IPostSelectStrategy Get(PostBindind.ExecuteMethod method) + { + return (IPostSelectStrategy)_strategies[method]; + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs b/ORBatisCore/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs new file mode 100644 index 0000000..d094367 --- /dev/null +++ b/ORBatisCore/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs @@ -0,0 +1,51 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; + +/// +/// implementation to exceute a query for +/// strong typed list. +/// +public sealed class StrongTypedListStrategy : IPostSelectStrategy +{ + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + var factory = request.DataExchangeFactory.ObjectFactory.CreateFactory(postSelect.ResultProperty.SetAccessor.MemberType, Type.EmptyTypes); + var values = factory.CreateInstance(null); + postSelect.Statement.ExecuteQueryForList(request.Session, postSelect.Keys, (IList)values); + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, values); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/DefaultStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/DefaultStrategy.cs new file mode 100644 index 0000000..2777a85 --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/DefaultStrategy.cs @@ -0,0 +1,89 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; +using IBatisNet.DataMapper.TypeHandlers; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// implementation when no 'select' or +/// 'resultMapping' attribute exists on a . +/// +public sealed class DefaultStrategy : IPropertyStrategy +{ + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when the 'select' and 'resultMap' attributes + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + var obj = Get(request, resultMap, mapping, ref target, reader); + resultMap.SetValueOfProperty(ref target, mapping, obj); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + if (mapping.TypeHandler == null || mapping.TypeHandler is UnknownTypeHandler) // Find the TypeHandler + lock (mapping) + { + if (mapping.TypeHandler == null || mapping.TypeHandler is UnknownTypeHandler) + { + var columnIndex = 0; + if (mapping.ColumnIndex == ResultProperty.UNKNOWN_COLUMN_INDEX) + columnIndex = reader.GetOrdinal(mapping.ColumnName); + else + columnIndex = mapping.ColumnIndex; + var systemType = reader.GetFieldType(columnIndex); + + mapping.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(systemType); + } + } + + var dataBaseValue = mapping.GetDataBaseValue(reader); + request.IsRowDataFound = request.IsRowDataFound || dataBaseValue != null; + return dataBaseValue; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/GroupByStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/GroupByStrategy.cs new file mode 100644 index 0000000..e25f77b --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/GroupByStrategy.cs @@ -0,0 +1,146 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-09-15 08:29:07 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertStrategy; + +/// +/// implementation when a 'resultMapping' attribute exists +/// on a ant the resulMap have a groupBy attribute. +/// +public sealed class GroupByStrategy : BaseStrategy, IPropertyStrategy +{ + private static readonly IPropertyStrategy _resultMapStrategy; + + /// + /// Initializes the class. + /// + static GroupByStrategy() + { + _resultMapStrategy = new ResultMapStrategy(); + } + + #region IPropertyStrategy Members + /// + /// Sets value of the specified on the target object + /// when a 'resultMapping' attribute exists + /// on the . + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + Get(request, resultMap, mapping, ref target, reader); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + // The property is a IList + IList list = null; + + // Get the IList property + var property = ObjectProbe.GetMemberValue(target, mapping.PropertyName, + request.DataExchangeFactory.AccessorFactory); + + if (property == null) // Create the list if need + { + property = mapping.ListFactory.CreateInstance(null); + mapping.SetAccessor.Set(target, property); + } + + list = (IList)property; + + object result = null; + var propertyRresultMap = mapping.NestedResultMap.ResolveSubMap(reader); + + if (propertyRresultMap.GroupByProperties.Count > 0) + { + var uniqueKey = GetUniqueKey(propertyRresultMap, request, reader); + + // Gets the [key, result object] already build + var buildObjects = request.GetUniqueKeys(propertyRresultMap); + + if (buildObjects != null && buildObjects.Contains(uniqueKey)) + { + // Unique key is already known, so get the existing result object and process additional results. + result = buildObjects[uniqueKey]; + + //In some cases (nested groupings) our object may be null, so there is + //no point in going on + if (result != null) + // process resulMapping attribute which point to a groupBy attribute + for (var index = 0; index < propertyRresultMap.Properties.Count; index++) + { + var resultProperty = propertyRresultMap.Properties[index]; + if (resultProperty.PropertyStrategy is GroupByStrategy) resultProperty.PropertyStrategy.Set(request, propertyRresultMap, resultProperty, ref result, reader, null); + } + + result = SKIP; + } + else if (uniqueKey == null || buildObjects == null || !buildObjects.Contains(uniqueKey)) + { + // Unique key is NOT known, so create a new result object and then process additional results. + result = _resultMapStrategy.Get(request, resultMap, mapping, ref target, reader); + + if (buildObjects == null) + { + buildObjects = new Hashtable(); + request.SetUniqueKeys(propertyRresultMap, buildObjects); + } + + buildObjects[uniqueKey] = result; + } + } + else // Last resultMap have no groupBy attribute + { + result = _resultMapStrategy.Get(request, resultMap, mapping, ref target, reader); + } + + + if (result != null && result != SKIP) list.Add(result); + + return result; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/IPropertyStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/IPropertyStrategy.cs new file mode 100644 index 0000000..96a9d85 --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/IPropertyStrategy.cs @@ -0,0 +1,60 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// contract to set value object on . +/// +public interface IPropertyStrategy +{ + /// + /// Sets value of the specified on the target object. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, + IDataReader reader, object keys); + + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target. + object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader); +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs b/ORBatisCore/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs new file mode 100644 index 0000000..116f6f7 --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs @@ -0,0 +1,92 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.MappedStatements.PropertStrategy; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// Factory to get implementation. +/// +public sealed class PropertyStrategyFactory +{ + private static readonly IPropertyStrategy _defaultStrategy; + private static readonly IPropertyStrategy _resultMapStrategy; + private static readonly IPropertyStrategy _groupByStrategy; + + private static readonly IPropertyStrategy _selectArrayStrategy; + private static readonly IPropertyStrategy _selectGenericListStrategy; + private static readonly IPropertyStrategy _selectListStrategy; + private static readonly IPropertyStrategy _selectObjectStrategy; + + /// + /// Initializes the class. + /// + static PropertyStrategyFactory() + { + _defaultStrategy = new DefaultStrategy(); + _resultMapStrategy = new ResultMapStrategy(); + _groupByStrategy = new GroupByStrategy(); + + _selectArrayStrategy = new SelectArrayStrategy(); + _selectListStrategy = new SelectListStrategy(); + _selectObjectStrategy = new SelectObjectStrategy(); + _selectGenericListStrategy = new SelectGenericListStrategy(); + } + + /// + /// Finds the . + /// + /// The . + /// The + public static IPropertyStrategy Get(ResultProperty mapping) + { + // no 'select' or 'resultMap' attributes + if (mapping.Select.Length == 0 && mapping.NestedResultMap == null) + // We have a 'normal' ResultMap + return _defaultStrategy; + + if (mapping.NestedResultMap != null) // 'resultMap' attribute + { + if (mapping.NestedResultMap.GroupByPropertyNames.Count > 0) return _groupByStrategy; + if (mapping.MemberType.IsGenericType && + typeof(IList<>).IsAssignableFrom(mapping.MemberType.GetGenericTypeDefinition())) + return _groupByStrategy; + + if (typeof(IList).IsAssignableFrom(mapping.MemberType)) return _groupByStrategy; + + return _resultMapStrategy; + } + + //'select' ResultProperty + return new SelectStrategy(mapping, + _selectArrayStrategy, + _selectGenericListStrategy, + _selectListStrategy, + _selectObjectStrategy); + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/ResultMapStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/ResultMapStrategy.cs new file mode 100644 index 0000000..95e8a9c --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/ResultMapStrategy.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// implementation when a 'resultMapping' attribute exists +/// on a . +/// +public sealed class ResultMapStrategy : BaseStrategy, IPropertyStrategy +{ + #region IPropertyStrategy Members + /// + /// Sets value of the specified on the target object + /// when a 'resultMapping' attribute exists + /// on the . + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + var obj = Get(request, resultMap, mapping, ref target, reader); + // Sets created object on the property + resultMap.SetValueOfProperty(ref target, mapping, obj); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + object[] parameters = null; + var isParameterFound = false; + + var resultMapping = mapping.NestedResultMap.ResolveSubMap(reader); + + if (resultMapping.Parameters.Count > 0) + { + parameters = new object[resultMapping.Parameters.Count]; + // Fill parameters array + for (var index = 0; index < resultMapping.Parameters.Count; index++) + { + var resultProperty = resultMapping.Parameters[index]; + parameters[index] = resultProperty.ArgumentStrategy.GetValue(request, resultProperty, ref reader, null); + request.IsRowDataFound = request.IsRowDataFound || parameters[index] != null; + isParameterFound = isParameterFound || parameters[index] != null; + } + } + + object obj = null; + // If I have a constructor tag and all argumments values are null, the obj is null + if (resultMapping.Parameters.Count > 0 && isParameterFound == false) + { + obj = null; + } + else + { + obj = resultMapping.CreateInstanceOfResult(parameters); + + // Fills properties on the new object + if (FillObjectWithReaderAndResultMap(request, reader, resultMapping, ref obj) == false) obj = null; + } + + return obj; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/SelectArrayStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/SelectArrayStrategy.cs new file mode 100644 index 0000000..2f8200e --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/SelectArrayStrategy.cs @@ -0,0 +1,80 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on a +/// +public sealed class SelectArrayStrategy : IPropertyStrategy +{ + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an Array property + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) throw new NotImplementedException("Lazy load no supported for System.Array property:" + mapping.SetAccessor.Name); + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForArrayList; + request.QueueSelect.Enqueue(postSelect); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs new file mode 100644 index 0000000..8a2aa56 --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs @@ -0,0 +1,88 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on a +/// +public sealed class SelectGenericListStrategy : IPropertyStrategy +{ + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an property + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The current + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) + { + var values = mapping.LazyFactory.CreateProxy(selectStatement, keys, target, mapping.SetAccessor); + mapping.SetAccessor.Set(target, values); + } + else + { + if (mapping.SetAccessor.MemberType.GetGenericTypeDefinition() == typeof(IList<>)) postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForGenericIList; + request.QueueSelect.Enqueue(postSelect); + } + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/SelectListStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/SelectListStrategy.cs new file mode 100644 index 0000000..1092306 --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/SelectListStrategy.cs @@ -0,0 +1,91 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on a +/// +public sealed class SelectListStrategy : IPropertyStrategy +{ + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an property + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The current + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) + { + var values = mapping.LazyFactory.CreateProxy(selectStatement, keys, target, mapping.SetAccessor); + mapping.SetAccessor.Set(target, values); + } + else + { + if (mapping.SetAccessor.MemberType == typeof(IList)) + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForIList; + else + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForStrongTypedIList; + request.QueueSelect.Enqueue(postSelect); + } + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/SelectObjectStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/SelectObjectStrategy.cs new file mode 100644 index 0000000..1fd3df6 --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/SelectObjectStrategy.cs @@ -0,0 +1,89 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on an and the object property is +/// different from an or an . +/// +public sealed class SelectObjectStrategy : IPropertyStrategy +{ + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an object property. + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The current + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) + { + var values = mapping.LazyFactory.CreateProxy(selectStatement, keys, target, mapping.SetAccessor); + mapping.SetAccessor.Set(target, values); + } + else + { + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForObject; + request.QueueSelect.Enqueue(postSelect); + } + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/PropertStrategy/SelectStrategy.cs b/ORBatisCore/MappedStatements/PropertStrategy/SelectStrategy.cs new file mode 100644 index 0000000..53e7876 --- /dev/null +++ b/ORBatisCore/MappedStatements/PropertStrategy/SelectStrategy.cs @@ -0,0 +1,140 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy; + +/// +/// implementation when a 'select' attribute exists +/// on a +/// +public class SelectStrategy : IPropertyStrategy +{ + private readonly IPropertyStrategy _selectStrategy; + + + /// + /// Initializes a new instance of the class. + /// + /// The mapping. + /// The select array strategy. + /// The select generic list strategy. + /// The select list strategy. + /// The select object strategy. + public SelectStrategy(ResultProperty mapping, + IPropertyStrategy selectArrayStrategy, + IPropertyStrategy selectGenericListStrategy, + IPropertyStrategy selectListStrategy, + IPropertyStrategy selectObjectStrategy) + { + // Collection object or .NET object + if (mapping.SetAccessor.MemberType.BaseType == typeof(Array)) + _selectStrategy = selectArrayStrategy; + else if (mapping.SetAccessor.MemberType.IsGenericType && + typeof(IList<>).IsAssignableFrom(mapping.SetAccessor.MemberType.GetGenericTypeDefinition())) + _selectStrategy = selectGenericListStrategy; + // Check if the object to Map implement 'IList' or is IList type + // If yes the ResultProperty is map to a IList object + else if (typeof(IList).IsAssignableFrom(mapping.SetAccessor.MemberType)) + _selectStrategy = selectListStrategy; + + else // The ResultProperty is map to a .Net object + _selectStrategy = selectObjectStrategy; + } + + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object selectKeys) + { + var paramString = mapping.ColumnName; + object keys = null; + var wasNull = false; + + #region Finds the select keys. + if (paramString.IndexOf(',') > 0 || paramString.IndexOf('=') > 0) // composite parameters key + { + IDictionary keyMap = new Hashtable(); + keys = keyMap; + // define which character is seperating fields + char[] splitter = { '=', ',' }; + + var paramTab = paramString.Split(splitter); + if (paramTab.Length % 2 != 0) throw new DataMapperException("Invalid composite key string format in '" + mapping.PropertyName + ". It must be: property1=column1,property2=column2,..."); + var enumerator = paramTab.GetEnumerator(); + while (!wasNull && enumerator.MoveNext()) + { + var hashKey = ((string)enumerator.Current).Trim(); + if (paramString.Contains("=")) // old 1.x style multiple params + enumerator.MoveNext(); + var hashValue = reader.GetValue(reader.GetOrdinal(((string)enumerator.Current).Trim())); + + keyMap.Add(hashKey, hashValue); + wasNull = hashValue == DBNull.Value; + } + } + else // single parameter key + { + keys = reader.GetValue(reader.GetOrdinal(paramString)); + wasNull = reader.IsDBNull(reader.GetOrdinal(paramString)); + } + #endregion + + if (wasNull) + // set the value of an object property to null + mapping.SetAccessor.Set(target, null); + else // Collection object or .Net object + _selectStrategy.Set(request, resultMap, mapping, ref target, reader, keys); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ReaderAutoMapper.cs b/ORBatisCore/MappedStatements/ReaderAutoMapper.cs new file mode 100644 index 0000000..eccf135 --- /dev/null +++ b/ORBatisCore/MappedStatements/ReaderAutoMapper.cs @@ -0,0 +1,129 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 397590 $ + * $Date: 2006-04-29 11:39:42 +0200 (Sat, 29 Apr 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Data; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Build a dynamic instance of a +/// +public sealed class ReaderAutoMapper +{ + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Builds a for an . + /// + /// The data exchange factory. + /// The reader. + /// The result object. + public static ResultPropertyCollection Build(DataExchangeFactory dataExchangeFactory, + IDataReader reader, + ref object resultObject) + { + var targetType = resultObject.GetType(); + var properties = new ResultPropertyCollection(); + + try + { + // Get all PropertyInfo from the resultObject properties + var reflectionInfo = ReflectionInfo.GetInstance(targetType); + var membersName = reflectionInfo.GetWriteableMemberNames(); + + var propertyMap = new Hashtable(); + var length = membersName.Length; + for (var i = 0; i < length; i++) + { + var setAccessorFactory = dataExchangeFactory.AccessorFactory.SetAccessorFactory; + var setAccessor = setAccessorFactory.CreateSetAccessor(targetType, membersName[i]); + propertyMap.Add(membersName[i], setAccessor); + } + + // Get all column Name from the reader + // and build a resultMap from with the help of the PropertyInfo[]. + var dataColumn = reader.GetSchemaTable(); + var count = dataColumn.Rows.Count; + for (var i = 0; i < count; i++) + { + var columnName = dataColumn.Rows[i][0].ToString(); + var matchedSetAccessor = propertyMap[columnName] as ISetAccessor; + + var property = new ResultProperty(); + property.ColumnName = columnName; + property.ColumnIndex = i; + + if (resultObject is Hashtable) + { + property.PropertyName = columnName; + properties.Add(property); + } + + Type propertyType = null; + + if (matchedSetAccessor == null) + try + { + propertyType = ObjectProbe.GetMemberTypeForSetter(resultObject, columnName); + } + catch + { + _logger.Error("The column [" + columnName + "] could not be auto mapped to a property on [" + resultObject + "]"); + } + else + propertyType = matchedSetAccessor.MemberType; + + if (propertyType != null || matchedSetAccessor != null) + { + property.PropertyName = matchedSetAccessor != null ? matchedSetAccessor.Name : columnName; + if (matchedSetAccessor != null) + property.Initialize(dataExchangeFactory.TypeHandlerFactory, matchedSetAccessor); + else + property.TypeHandler = dataExchangeFactory.TypeHandlerFactory.GetTypeHandler(propertyType); + + property.PropertyStrategy = PropertyStrategyFactory.Get(property); + properties.Add(property); + } + } + } + catch (Exception e) + { + throw new DataMapperException("Error automapping columns. Cause: " + e.Message, e); + } + + return properties; + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/AutoMapStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/AutoMapStrategy.cs new file mode 100644 index 0000000..f042e9a --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/AutoMapStrategy.cs @@ -0,0 +1,112 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation used when implicit 'ResultMap'. +/// +public sealed class AutoMapStrategy : IResultStrategy +{ + #region IResultStrategy Members + /// + /// Processes the specified + /// a an auto result map is used. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + if (outObject == null) outObject = (request.CurrentResultMap as AutoResultMap).CreateInstanceOfResultClass(); + + var resultMap = InitializeAutoResultMap(request, ref reader, ref outObject); + + // En configuration initialiser des AutoResultMap (IResultMap) avec uniquement leur class name et class et les mettres + // ds Statement.ResultsMap puis ds AutoMapStrategy faire comme AutoResultMap ds Java + // tester si la request.CurrentResultMap [AutoResultMap (IResultMap)] est initialis�e + // [if (allowRemapping || getResultMappings() == null) {initialize(rs);] java + // si ( request.Statement.AllowRemapping || (request.CurrentResultMap as AutoResultMap).IsInitalized) .... + + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var property = resultMap.Properties[index]; + resultMap.SetValueOfProperty(ref outObject, property, + property.GetDataBaseValue(reader)); + } + + return outObject; + } + #endregion + + /// + /// Auto-map the reader to the result object. + /// + /// The request. + /// The reader. + /// The result object. + /// The AutoResultMap use to map the resultset. + private AutoResultMap InitializeAutoResultMap(RequestScope request, ref IDataReader reader, ref object resultObject) + { + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (request.Statement.AllowRemapping) + { + resultMap = resultMap.Clone(); + + var properties = ReaderAutoMapper.Build( + request.DataExchangeFactory, + reader, + ref resultObject); + + resultMap.Properties.AddRange(properties); + } + else + { + if (!resultMap.IsInitalized) + lock (resultMap) + { + if (!resultMap.IsInitalized) + { + var properties = ReaderAutoMapper.Build( + request.DataExchangeFactory, + reader, + ref resultObject); + + resultMap.Properties.AddRange(properties); + resultMap.IsInitalized = true; + } + } + } + + return resultMap; + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/BaseResultStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/BaseResultStrategy.cs new file mode 100644 index 0000000..c6c48b8 --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/BaseResultStrategy.cs @@ -0,0 +1,26 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/ClassDiagram.cd b/ORBatisCore/MappedStatements/ResultStrategy/ClassDiagram.cd similarity index 100% rename from src/IBatisNet.DataMapper/MappedStatements/ResultStrategy/ClassDiagram.cd rename to ORBatisCore/MappedStatements/ResultStrategy/ClassDiagram.cd diff --git a/ORBatisCore/MappedStatements/ResultStrategy/DictionaryStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/DictionaryStrategy.cs new file mode 100644 index 0000000..692522b --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/DictionaryStrategy.cs @@ -0,0 +1,72 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation when +/// a 'resultClass' attribute is specified and +/// the type of the result object is . +/// +public sealed class DictionaryStrategy : IResultStrategy +{ + #region IResultStrategy Members + /// + /// Processes the specified + /// when a 'resultClass' attribute is specified on the statement and + /// the 'resultClass' attribute is a . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (outObject == null) outObject = resultMap.CreateInstanceOfResultClass(); + + var count = reader.FieldCount; + var dictionary = (IDictionary)outObject; + for (var i = 0; i < count; i++) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = i; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(i)); + dictionary.Add( + reader.GetName(i), + property.GetDataBaseValue(reader)); + } + + return outObject; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/DynamicMapStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/DynamicMapStrategy.cs new file mode 100644 index 0000000..742f565 --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/DynamicMapStrategy.cs @@ -0,0 +1,121 @@ +//#region Apache Notice +///***************************************************************************** +// * $Revision: 374175 $ +// * $LastChangedDate: 2013-05-31 19:40:27 +0200 (mar., 25 avr. 2006) $ +// * $LastChangedBy: mmccurrey $ +// * +// * MyBATIS.NET Data Mapper +// * +// * +// * +// * Licensed under the Apache License, Version 2.0 (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// * +// ********************************************************************************/ +//#endregion + +//using System.Data; +//using IBatisNet.DataMapper.Configuration.ResultMapping; +//using IBatisNet.DataMapper.Scope; + +//namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +//{ +// public class DynamicMapStrategy +// { +// /// +// /// Auto-map the reader to the result object. +// /// +// /// The request. +// /// The reader. +// /// The result object. +// /// The AutoResultMap use to map the resultset. +// private DynamicResultMap InitializeAutoResultMap(RequestScope request, ref IDataReader reader, ref object resultObject) +// { +// //In the case of Dynamic, we set the AutoResultMap as an expando object +// DynamicResultMap resultMap = request.CurrentResultMap as DynamicResultMap; + +// if (request.Statement.AllowRemapping) +// { +// resultMap = resultMap.Clone(); + +// ResultPropertyCollection properties = ReaderAutoMapper.Build( +// request.DataExchangeFactory, +// reader, +// ref resultObject); + +// resultMap.Properties.AddRange(properties); +// } +// else +// { +// if (!resultMap.IsInitalized) +// { +// lock (resultMap) +// { +// if (!resultMap.IsInitalized) +// { +// ResultPropertyCollection properties = ReaderAutoMapper.Build( +// request.DataExchangeFactory, +// reader, +// ref resultObject); + +// resultMap.Properties.AddRange(properties); +// resultMap.IsInitalized = true; +// } +// } +// } + +// } + +// return resultMap; +// } + + +// #region IResultStrategy Members + +// /// +// /// Processes the specified +// /// a an auto result map is used. +// /// +// /// The request. +// /// The reader. +// /// The result object. +// public object Process(RequestScope request, ref IDataReader reader, object resultObject) +// { +// object outObject = resultObject; + +// if (outObject == null) +// { +// outObject = (request.CurrentResultMap as AutoResultMap).CreateInstanceOfResultClass(); +// } + +// AutoResultMap resultMap = InitializeAutoResultMap(request, ref reader, ref outObject); + +// // En configuration initialiser des AutoResultMap (IResultMap) avec uniquement leur class name et class et les mettres +// // ds Statement.ResultsMap puis ds AutoMapStrategy faire comme AutoResultMap ds Java +// // tester si la request.CurrentResultMap [AutoResultMap (IResultMap)] est initialisée +// // [if (allowRemapping || getResultMappings() == null) {initialize(rs);] java +// // si ( request.Statement.AllowRemapping || (request.CurrentResultMap as AutoResultMap).IsInitalized) .... + +// for (int index = 0; index < resultMap.Properties.Count; index++) +// { +// ResultProperty property = resultMap.Properties[index]; +// resultMap.SetValueOfProperty(ref outObject, property, +// property.GetDataBaseValue(reader)); +// } + +// return outObject; +// } + +// #endregion +// } +//} + diff --git a/ORBatisCore/MappedStatements/ResultStrategy/GroupByStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/GroupByStrategy.cs new file mode 100644 index 0000000..0c8b8d3 --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/GroupByStrategy.cs @@ -0,0 +1,97 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-09-15 06:03:39 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation when +/// a 'groupBy' attribute is specified on the resultMap tag. +/// +/// N+1 Select solution +public sealed class GroupByStrategy : BaseStrategy, IResultStrategy +{ + #region IResultStrategy Members + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + /// The result object + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + var resultMap = request.CurrentResultMap.ResolveSubMap(reader); + + var uniqueKey = GetUniqueKey(resultMap, request, reader); + // Gets the [key, result object] already build + var buildObjects = request.GetUniqueKeys(resultMap); + + if (buildObjects != null && buildObjects.Contains(uniqueKey)) + { + // Unique key is already known, so get the existing result object and process additional results. + outObject = buildObjects[uniqueKey]; + // process resulMapping attribute wich point to a groupBy attribute + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var resultProperty = resultMap.Properties[index]; + if (resultProperty.PropertyStrategy is PropertStrategy.GroupByStrategy) resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null); + } + + outObject = SKIP; + } + else if (uniqueKey == null || buildObjects == null || !buildObjects.Contains(uniqueKey)) + { + // Unique key is NOT known, so create a new result object and process additional results. + + // Fix IBATISNET-241 + if (outObject == null) + // temp ?, we don't support constructor tag with groupBy attribute + outObject = resultMap.CreateInstanceOfResult(null); + + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var resultProperty = resultMap.Properties[index]; + resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null); + } + + if (buildObjects == null) + { + buildObjects = new Hashtable(); + request.SetUniqueKeys(resultMap, buildObjects); + } + + buildObjects[uniqueKey] = outObject; + } + + return outObject; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/IResultStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/IResultStrategy.cs new file mode 100644 index 0000000..851e9eb --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/IResultStrategy.cs @@ -0,0 +1,43 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// contract to process the . +/// +public interface IResultStrategy +{ + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + object Process(RequestScope request, ref IDataReader reader, object resultObject); +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/ListStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/ListStrategy.cs new file mode 100644 index 0000000..e6126f6 --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/ListStrategy.cs @@ -0,0 +1,69 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation when +/// a 'resultClass' attribute is specified and +/// the type of the result object is . +/// +public sealed class ListStrategy : IResultStrategy +{ + #region IResultStrategy Members + /// + /// Processes the specified + /// when a ResultClass is specified on the statement and + /// the ResultClass is . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (outObject == null) outObject = resultMap.CreateInstanceOfResultClass(); + + var count = reader.FieldCount; + for (var i = 0; i < count; i++) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = i; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(i)); + ((IList)outObject).Add(property.GetDataBaseValue(reader)); + } + + return outObject; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/MapStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/MapStrategy.cs new file mode 100644 index 0000000..26227dd --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/MapStrategy.cs @@ -0,0 +1,65 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// Delegates on the or on the +/// implementation if a grouBy attribute is specify on the resultMap tag. +/// +public sealed class MapStrategy : IResultStrategy +{ + private static readonly IResultStrategy _resultMapStrategy; + private static readonly IResultStrategy _groupByStrategy; + + /// + /// Initializes the class. + /// + static MapStrategy() + { + _resultMapStrategy = new ResultMapStrategy(); + _groupByStrategy = new GroupByStrategy(); + } + + #region IResultStrategy Members + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var resultMap = request.CurrentResultMap.ResolveSubMap(reader); + + if (resultMap.GroupByPropertyNames.Count > 0) return _groupByStrategy.Process(request, ref reader, resultObject); + + return _resultMapStrategy.Process(request, ref reader, resultObject); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/ObjectStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/ObjectStrategy.cs new file mode 100644 index 0000000..29bd8eb --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/ObjectStrategy.cs @@ -0,0 +1,78 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation when +/// no 'resultClass' attribute is specified. +/// +public sealed class ObjectStrategy : IResultStrategy +{ + #region IResultStrategy Members + /// + /// Processes the specified + /// when no resultClass or resultMap attribute are specified. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + if (reader.FieldCount == 1) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = 0; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(0)); + outObject = property.GetDataBaseValue(reader); + } + else if (reader.FieldCount > 1) + { + var newOutObject = new object[reader.FieldCount]; + var count = reader.FieldCount; + for (var i = 0; i < count; i++) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = i; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(i)); + newOutObject[i] = property.GetDataBaseValue(reader); + } + + outObject = newOutObject; + } + + // do nothing if 0 fields + return outObject; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/ResultClassStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/ResultClassStrategy.cs new file mode 100644 index 0000000..931020e --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/ResultClassStrategy.cs @@ -0,0 +1,73 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation when +/// a 'resultClass' attribute is specified. +/// +public sealed class ResultClassStrategy : IResultStrategy +{ + private static IResultStrategy _simpleTypeStrategy; + private static IResultStrategy _dictionaryStrategy; + private static IResultStrategy _listStrategy; + private static IResultStrategy _autoMapStrategy; + + /// + /// Initializes a new instance of the class. + /// + public ResultClassStrategy() + { + _simpleTypeStrategy = new SimpleTypeStrategy(); + _dictionaryStrategy = new DictionaryStrategy(); + _listStrategy = new ListStrategy(); + _autoMapStrategy = new AutoMapStrategy(); + } + + #region IResultStrategy Members + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + // Check if the ResultClass is a 'primitive' Type + if (request.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(request.CurrentResultMap.Class)) return _simpleTypeStrategy.Process(request, ref reader, resultObject); + + if (typeof(IDictionary).IsAssignableFrom(request.CurrentResultMap.Class)) return _dictionaryStrategy.Process(request, ref reader, resultObject); + + if (typeof(IList).IsAssignableFrom(request.CurrentResultMap.Class)) return _listStrategy.Process(request, ref reader, resultObject); + + return _autoMapStrategy.Process(request, ref reader, resultObject); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/ResultMapStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/ResultMapStrategy.cs new file mode 100644 index 0000000..c915730 --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/ResultMapStrategy.cs @@ -0,0 +1,78 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation when +/// a 'resultMap' attribute is specified. +/// +public sealed class ResultMapStrategy : BaseStrategy, IResultStrategy +{ + #region IResultStrategy Members + /// + /// Processes the specified + /// when a ResultMap is specified on the statement. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + var resultMap = request.CurrentResultMap.ResolveSubMap(reader); + + if (outObject == null) + { + object[] parameters = null; + if (resultMap.Parameters.Count > 0) + { + parameters = new object[resultMap.Parameters.Count]; + // Fill parameters array + for (var index = 0; index < resultMap.Parameters.Count; index++) + { + var resultProperty = resultMap.Parameters[index]; + parameters[index] = resultProperty.ArgumentStrategy.GetValue(request, resultProperty, ref reader, null); + } + } + + outObject = resultMap.CreateInstanceOfResult(parameters); + } + + // For each Property in the ResultMap, set the property in the object + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var property = resultMap.Properties[index]; + property.PropertyStrategy.Set(request, resultMap, property, ref outObject, reader, null); + } + + return outObject; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/ResultStrategyFactory.cs b/ORBatisCore/MappedStatements/ResultStrategy/ResultStrategyFactory.cs new file mode 100644 index 0000000..b2c0d12 --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/ResultStrategyFactory.cs @@ -0,0 +1,68 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Statements; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// Factory to get implementation. +/// +public sealed class ResultStrategyFactory +{ + private static readonly IResultStrategy _resultClassStrategy; + private static readonly IResultStrategy _mapStrategy; + private static readonly IResultStrategy _objectStrategy; + + /// + /// Initializes the class. + /// + static ResultStrategyFactory() + { + _mapStrategy = new MapStrategy(); + _resultClassStrategy = new ResultClassStrategy(); + _objectStrategy = new ObjectStrategy(); + } + + /// + /// Finds the . + /// + /// The statement. + /// The + public static IResultStrategy Get(IStatement statement) + { + // If there's an IResultMap, use it + if (statement.ResultsMap.Count > 0) + { + if (statement.ResultsMap[0] is ResultMap) return _mapStrategy; + + // it is an AutoResultMap + return _resultClassStrategy; + } + + return _objectStrategy; + } +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs b/ORBatisCore/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs new file mode 100644 index 0000000..6b17509 --- /dev/null +++ b/ORBatisCore/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs @@ -0,0 +1,79 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy; + +/// +/// implementation when +/// a 'resultClass' attribute is specified and +/// the type of the result object is primitive. +/// +public sealed class SimpleTypeStrategy : IResultStrategy +{ + #region IResultStrategy Members + /// + /// Processes the specified + /// when a ResultClass is specified on the statement and + /// the ResultClass is a SimpleType. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (outObject == null) outObject = resultMap.CreateInstanceOfResultClass(); + + if (!resultMap.IsInitalized) + lock (resultMap) + { + if (!resultMap.IsInitalized) + { + // Create a ResultProperty + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = 0; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(outObject.GetType()); + property.PropertyStrategy = PropertyStrategyFactory.Get(property); + + resultMap.Properties.Add(property); + resultMap.DataExchange = request.DataExchangeFactory.GetDataExchangeForClass(typeof(int)); // set the PrimitiveDataExchange + resultMap.IsInitalized = true; + } + } + + resultMap.Properties[0].PropertyStrategy.Set(request, resultMap, resultMap.Properties[0], ref outObject, reader, null); + + return outObject; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/SelectMappedStatement.cs b/ORBatisCore/MappedStatements/SelectMappedStatement.cs new file mode 100644 index 0000000..c16ea80 --- /dev/null +++ b/ORBatisCore/MappedStatements/SelectMappedStatement.cs @@ -0,0 +1,69 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Summary description for SelectMappedStatement. +/// +public sealed class SelectMappedStatement : MappedStatement +{ + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal SelectMappedStatement(ISqlMapper sqlMap, IStatement statement) + : base(sqlMap, statement) { } + + + #region ExecuteInsert + /// + /// + /// + /// + /// + public override object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query insert."); + } + #endregion + + #region ExecuteUpdate + /// + /// + /// + /// + /// + public override int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a update query."); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/MappedStatements/UpdateMappedStatement.cs b/ORBatisCore/MappedStatements/UpdateMappedStatement.cs new file mode 100644 index 0000000..e51ffa1 --- /dev/null +++ b/ORBatisCore/MappedStatements/UpdateMappedStatement.cs @@ -0,0 +1,157 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Collections; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements; + +/// +/// Summary description for UpdateMappedStatement. +/// +public sealed class UpdateMappedStatement : MappedStatement +{ + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal UpdateMappedStatement(ISqlMapper sqlMap, IStatement statement) + : base(sqlMap, statement) { } + + #region ExecuteQueryForMap + /// + /// + /// + /// + /// + /// + /// + public override IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + throw new DataMapperException("Update statements cannot be executed as a query for map."); + } + #endregion + + #region ExecuteInsert + /// + /// + /// + /// + /// + public override object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query insert."); + } + #endregion + + #region ExecuteQueryForList + /// + /// + /// + /// + /// + public override void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + throw new DataMapperException("Update statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for list."); + } + #endregion + + #region Delegate + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + throw new DataMapperException("Update statement cannot be executed as a query for row delegate."); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public override IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + throw new DataMapperException("Update statement cannot be executed as a query for row delegate."); + } + #endregion + + #region ExecuteForObject + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for object."); + } + + /// + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for object."); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Mapper.cs b/ORBatisCore/Mapper.cs new file mode 100644 index 0000000..ec246fb --- /dev/null +++ b/ORBatisCore/Mapper.cs @@ -0,0 +1,82 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 513429 $ + * $Date: 2007-03-01 11:32:25 -0700 (Thu, 01 Mar 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities; +using IBatisNet.DataMapper.Configuration; + +namespace IBatisNet.DataMapper; + +/// +/// A singleton class to access the default SqlMapper defined by the SqlMap.Config +/// +public sealed class Mapper +{ + #region Fields + private static volatile ISqlMapper _mapper; + #endregion + + /// + /// + /// + public static void Configure(object obj) + { + _mapper = null; + } + + /// + /// Init the 'default' SqlMapper defined by the SqlMap.Config file. + /// + public static void InitMapper() + { + var handler = new ConfigureHandler(Configure); + var builder = new DomSqlMapBuilder(); + _mapper = builder.ConfigureAndWatch(handler); + } + + /// + /// Get the instance of the SqlMapper defined by the SqlMap.Config file. + /// + /// A SqlMapper initalized via the SqlMap.Config file. + public static ISqlMapper Instance() + { + if (_mapper == null) + lock (typeof(SqlMapper)) + { + if (_mapper == null) // double-check + InitMapper(); + } + + return _mapper; + } + + /// + /// Get the instance of the SqlMapper defined by the SqlMap.Config file. (Convenience form of Instance method.) + /// + /// A SqlMapper initalized via the SqlMap.Config file. + public static ISqlMapper Get() + { + return Instance(); + } +} \ No newline at end of file diff --git a/ORBatisCore/ORBatisCore.csproj b/ORBatisCore/ORBatisCore.csproj new file mode 100644 index 0000000..7527047 --- /dev/null +++ b/ORBatisCore/ORBatisCore.csproj @@ -0,0 +1,30 @@ + + + + net9.0 + enable + enable + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatisCore/Proxy/ILazyFactory.cs b/ORBatisCore/Proxy/ILazyFactory.cs new file mode 100644 index 0000000..333c43b --- /dev/null +++ b/ORBatisCore/Proxy/ILazyFactory.cs @@ -0,0 +1,46 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-18 14:25:03 -0600 (Thu, 18 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// Contract of an +/// +public interface ILazyFactory +{ + /// + /// Create a new proxy instance. + /// + /// The mapped statement. + /// The param. + /// The target. + /// The set accessor. + /// Returns a new proxy. + object CreateProxy(IMappedStatement mappedStatement, object param, + object target, ISetAccessor setAccessor); +} \ No newline at end of file diff --git a/ORBatisCore/Proxy/LazyFactoryBuilder.cs b/ORBatisCore/Proxy/LazyFactoryBuilder.cs new file mode 100644 index 0000000..385dab9 --- /dev/null +++ b/ORBatisCore/Proxy/LazyFactoryBuilder.cs @@ -0,0 +1,82 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-01-04 14:28:10 -0700 (Thu, 04 Jan 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// Gets instance. +/// +public class LazyFactoryBuilder +{ + private readonly IDictionary _factory = new HybridDictionary(); + + /// + /// Initializes a new instance of the class. + /// + public LazyFactoryBuilder() + { + _factory[typeof(IList)] = new LazyListFactory(); + _factory[typeof(IList<>)] = new LazyListGenericFactory(); + } + + + /// + /// Register (add) a lazy load Proxy for a type and member type + /// + /// The target type which contains the member proxyfied + /// The member name the proxy must emulate + /// The . + public void Register(Type type, string memberName, ILazyFactory factory) + { + // To use for further used, support for custom proxy + } + + /// + /// Get a ILazyLoadProxy for a type, member name + /// + /// The target type which contains the member proxyfied + /// Return the ILazyLoadProxy instance + public ILazyFactory GetLazyFactory(Type type) + { + if (type.IsInterface) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>)) return _factory[type.GetGenericTypeDefinition()] as ILazyFactory; + + if (type == typeof(IList)) return _factory[type] as ILazyFactory; + + throw new DataMapperException("Cannot proxy others interfaces than IList or IList<>."); + } + + // if you want to proxy concrete classes, there are also two requirements: + // the class can not be sealed and only virtual methods can be intercepted. + // The reason is that DynamicProxy will create a subclass of your class overriding all methods + // so it can dispatch the invocations to the interceptor. + return new LazyLoadProxyFactory(); + } +} \ No newline at end of file diff --git a/ORBatisCore/Proxy/LazyList.cs b/ORBatisCore/Proxy/LazyList.cs new file mode 100644 index 0000000..e4ad164 --- /dev/null +++ b/ORBatisCore/Proxy/LazyList.cs @@ -0,0 +1,325 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-08-15 12:36:48 -0600 (Tue, 15 Aug 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// A lazy list +/// +[Serializable] +public class LazyList : IList +{ + /// + /// Initializes a new instance of the class. + /// + /// The mapped satement. + /// The param. + /// The target. + /// The set accessor. + public LazyList(IMappedStatement mappedSatement, object param, + object target, ISetAccessor setAccessor) + { + _list = new ArrayList(); + _param = param; + _statementId = mappedSatement.Id; + _sqlMap = mappedSatement.SqlMap; + _target = target; + _setAccessor = setAccessor; + } + + #region IEnumerable Members + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + public IEnumerator GetEnumerator() + { + Load("Add"); + return _list.GetEnumerator(); + } + #endregion + + /// + /// Resolve the lazy loading. + /// + /// Name of the method. + private void Load(string methodName) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call to " + methodName); + + lock (_loadLock) + { + if (_loaded == false) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call, query statement " + _statementId); + throw new InvalidOperationException("todo: find session"); + + _list = _sqlMap.QueryForList(_statementId, _param, null); + _loaded = true; + _setAccessor.Set(_target, _list); + } + } + + if (_logger.IsDebugEnabled) _logger.Debug("End of proxyfied call to " + methodName); + } + + #region Fields + private object _param; + private object _target; + private ISetAccessor _setAccessor; + private ISqlMapper _sqlMap; + private string _statementId = string.Empty; + private bool _loaded; + private object _loadLock = new(); + private IList _list; + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + + #region IList Members + /// + /// Adds an item to the . + /// + /// The to add to the . + /// + /// The position into which the new element was inserted. + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + public int Add(object value) + { + Load("Add"); + return _list.Add(value); + } + + /// + /// Removes all items from the . + /// + /// The is read-only. + public void Clear() + { + Load("Clear"); + _list.Clear(); + } + + /// + /// Determines whether the contains a specific value. + /// + /// + /// The to locate in the + /// . + /// + /// + /// true if the is found in the ; + /// otherwise, false. + /// + public bool Contains(object value) + { + Load("Contains"); + return _list.Contains(value); + } + + /// + /// Determines the index of a specific item in the . + /// + /// + /// The to locate in the + /// . + /// + /// + /// The index of value if found in the list; otherwise, -1. + /// + public int IndexOf(object value) + { + Load("IndexOf"); + return _list.IndexOf(value); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which value should be inserted. + /// + /// The to insert into the + /// . + /// + /// + /// index is not a valid index in the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + /// + /// value is null reference in the + /// . + /// + public void Insert(int index, object value) + { + Load("Insert"); + _list.Insert(index, value); + } + + /// + /// Gets a value indicating whether the has a fixed size. + /// + /// + /// true if the has a fixed size; otherwise, false. + public bool IsFixedSize => false; + + /// + /// Gets a value indicating whether the is read-only. + /// + /// + /// true if the is read-only; otherwise, false. + public bool IsReadOnly => false; + + /// + /// Removes the first occurrence of a specific object from the . + /// + /// + /// The to remove from the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + public void Remove(object value) + { + Load("Remove"); + _list.Remove(value); + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + /// + /// index is not a valid index in the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + public void RemoveAt(int index) + { + Load("RemoveAt"); + _list.RemoveAt(index); + } + + /// + /// Gets or sets the at the specified index. + /// + /// + public object this[int index] + { + get + { + Load("this"); + return _list[index]; + } + set + { + Load("this"); + _list[index] = value; + } + } + #endregion + + #region ICollection Members + /// + /// Copies the elements of the to an + /// , starting at a particular index. + /// + /// + /// The one-dimensional that is the destination of the elements + /// copied from . The must have + /// zero-based indexing. + /// + /// The zero-based index in array at which copying begins. + /// array is null. + /// index is less than zero. + /// + /// array is multidimensional.-or- index is equal to or greater than the + /// length of array.-or- The number of elements in the source is + /// greater than the available space from index to the end of the destination array. + /// + /// + /// The type of the source + /// cannot be cast automatically to the type of the destination + /// array. + /// + public void CopyTo(Array array, int index) + { + Load("CopyTo"); + _list.CopyTo(array, index); + } + + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + public int Count + { + get + { + Load("Count"); + return _list.Count; + } + } + + /// + /// Gets a value indicating whether access to the is synchronized + /// (thread safe). + /// + /// + /// + /// true if access to the is synchronized (thread safe); + /// otherwise, false. + /// + public bool IsSynchronized => false; + + /// + /// Gets an object that can be used to synchronize access to the . + /// + /// + /// An object that can be used to synchronize access to the . + public object SyncRoot => this; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Proxy/LazyListFactory.cs b/ORBatisCore/Proxy/LazyListFactory.cs new file mode 100644 index 0000000..f700115 --- /dev/null +++ b/ORBatisCore/Proxy/LazyListFactory.cs @@ -0,0 +1,52 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-18 14:25:03 -0600 (Thu, 18 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// Implementation of to create proxy for an element. +/// +public class LazyListFactory : ILazyFactory +{ + #region ILazyFactory Members + /// + /// Create a new proxy instance. + /// + /// The mapped statement. + /// The param. + /// The target. + /// The set accessor. + /// Returns a new proxy. + public object CreateProxy(IMappedStatement mappedStatement, object param, + object target, ISetAccessor setAccessor) + { + return new LazyList(mappedStatement, param, target, setAccessor); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Proxy/LazyListGeneric.cs b/ORBatisCore/Proxy/LazyListGeneric.cs new file mode 100644 index 0000000..8a9945b --- /dev/null +++ b/ORBatisCore/Proxy/LazyListGeneric.cs @@ -0,0 +1,513 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-11-09 13:02:26 -0700 (Thu, 09 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// A lazy generic list +/// +/// +[Serializable] +public class LazyListGeneric : IList, IList where T : class + +{ + /// + /// Initializes a new instance of the LazyListGeneric class. + /// + /// The mapped satement. + /// The param. + /// The target. + /// The set accessor. + public LazyListGeneric(IMappedStatement mappedSatement, object param, + object target, ISetAccessor setAccessor) + { + _param = param; + _statementId = mappedSatement.Id; + _sqlMap = mappedSatement.SqlMap; + _target = target; + _setAccessor = setAccessor; + _list = new List(); + } + + #region IEnumerable Members + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + public IEnumerator GetEnumerator() + { + Load("GetEnumerator"); + return _list.GetEnumerator(); + } + #endregion + + #region IEnumerable Members + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + Load("GetEnumerator"); + return _list.GetEnumerator(); + } + #endregion + + /// + /// Resolve the lazy loading. + /// + /// Name of the method. + private void Load(string methodName) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call to " + methodName); + + lock (_loadLock) + { + if (_loaded == false) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call, query statement " + _statementId); + + throw new InvalidOperationException("todo: find session"); + _list = _sqlMap.QueryForList(_statementId, _param, null); + _loaded = true; + _setAccessor.Set(_target, _list); + } + } + + if (_logger.IsDebugEnabled) _logger.Debug("End of proxyfied call to " + methodName); + } + + #region Fields + private object _param; + private object _target; + private ISetAccessor _setAccessor; + private ISqlMapper _sqlMap; + private string _statementId = string.Empty; + private bool _loaded; + private object _loadLock = new(); + private IList _list; + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + + #region IList Members + /// + /// Determines the index of a specific item in the . + /// + /// The object to locate in the . + /// + /// The index of item if found in the list; otherwise, -1. + /// + public int IndexOf(T item) + { + Load("IndexOf"); + return _list.IndexOf(item); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which item should be inserted. + /// The object to insert into the . + /// + /// The is + /// read-only. + /// + /// + /// index is not a valid index in the + /// . + /// + public void Insert(int index, T item) + { + Load("Insert"); + _list.Insert(index, item); + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + /// + /// The is + /// read-only. + /// + /// + /// index is not a valid index in the + /// . + /// + public void RemoveAt(int index) + { + Load("RemoveAt"); + _list.RemoveAt(index); + } + + /// + /// Gets or sets the object at the specified index. + /// + /// + public T this[int index] + { + get + { + Load("this"); + return _list[index]; + } + set + { + Load("this"); + _list[index] = value; + } + } + #endregion + + #region ICollection Members + /// + /// Adds an item to the . + /// + /// The object to add to the . + /// + /// The is + /// read-only. + /// + public void Add(T item) + { + Load("Add"); + _list.Add(item); + } + + /// + /// Removes all items from the . + /// + /// + /// The is + /// read-only. + /// + public void Clear() + { + Load("Clear"); + _list.Clear(); + } + + /// + /// Determines whether the contains a specific value. + /// + /// The object to locate in the . + /// + /// true if item is found in the ; otherwise, false. + /// + public bool Contains(T item) + { + Load("Contains"); + return _list.Contains(item); + } + + /// + /// Copies the elements of the to an + /// , starting at a particular index. + /// + /// + /// The one-dimensional that is the destination of the elements + /// copied from . The + /// must have zero-based indexing. + /// + /// The zero-based index in array at which copying begins. + /// arrayIndex is less than 0. + /// array is null. + /// + /// array is multidimensional.-or-arrayIndex is equal to or greater than the + /// length of array.-or-The number of elements in the source + /// is greater than the available space from arrayIndex + /// to the end of the destination array.-or-Type T cannot be cast automatically to the type of the destination array. + /// + public void CopyTo(T[] array, int arrayIndex) + { + Load("CopyTo"); + _list.CopyTo(array, arrayIndex); + } + + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + public int Count + { + get + { + Load("Count"); + return _list.Count; + } + } + + /// + /// Gets a value indicating whether the is read-only. + /// + /// + /// true if the is read-only; otherwise, false. + public bool IsReadOnly => false; + + /// + /// Removes the first occurrence of a specific object from the + /// . + /// + /// The object to remove from the . + /// + /// true if item was successfully removed from the ; + /// otherwise, false. This method also returns false if item is not found in the original + /// . + /// + /// + /// The is + /// read-only. + /// + public bool Remove(T item) + { + Load("Remove"); + return _list.Remove(item); + } + #endregion + + #region IList Members + /// + /// Adds an item to the . + /// + /// The to add to the . + /// + /// The position into which the new element was inserted. + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + int IList.Add(object value) + { + Load("Add"); + return ((IList)_list).Add(value); + } + + /// + /// Removes all items from the . + /// + /// + /// The is + /// read-only. + /// + void IList.Clear() + { + Clear(); + } + + /// + /// Determines whether the contains a specific value. + /// + /// + /// The to locate in the + /// . + /// + /// + /// true if the is found in the ; + /// otherwise, false. + /// + bool IList.Contains(object value) + { + Load("Contains"); + return ((IList)_list).Contains(value); + } + + /// + /// Determines the index of a specific item in the . + /// + /// + /// The to locate in the + /// . + /// + /// + /// The index of value if found in the list; otherwise, -1. + /// + int IList.IndexOf(object value) + { + Load("IndexOf"); + return ((IList)_list).IndexOf(value); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which value should be inserted. + /// + /// The to insert into the + /// . + /// + /// + /// index is not a valid index in the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + /// + /// value is null reference in the + /// . + /// + void IList.Insert(int index, object value) + { + Load("IndexOf"); + ((IList)_list).Insert(index, value); + } + + /// + /// Gets a value indicating whether the has a fixed size. + /// + /// + /// true if the has a fixed size; otherwise, false. + bool IList.IsFixedSize => false; + + /// + /// Gets a value indicating whether the is read-only. + /// + /// + /// true if the is read-only; otherwise, false. + bool IList.IsReadOnly => false; + + + /// + /// Removes the first occurrence of a specific object from the . + /// + /// + /// The to remove from the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + void IList.Remove(object value) + { + Load("Remove"); + ((IList)_list).Remove(value); + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + /// + /// The is + /// read-only. + /// + /// + /// index is not a valid index in the + /// . + /// + void IList.RemoveAt(int index) + { + RemoveAt(index); + } + + /// + /// Gets or sets the at the specified index. + /// + /// + object IList.this[int index] + { + get + { + Load("this"); + return this[index]; + } + set + { + Load("this"); + ((IList)_list)[index] = value; + } + } + #endregion + + #region ICollection Members + /// + /// Copies the elements of the to an , + /// starting at a particular index. + /// + /// + /// The one-dimensional that is the destination of the elements + /// copied from . The must have + /// zero-based indexing. + /// + /// The zero-based index in array at which copying begins. + /// array is null. + /// index is less than zero. + /// + /// array is multidimensional.-or- index is equal to or greater than the + /// length of array.-or- The number of elements in the source is + /// greater than the available space from index to the end of the destination array. + /// + /// + /// The type of the source + /// cannot be cast automatically to the type of the destination + /// array. + /// + void ICollection.CopyTo(Array array, int index) + { + Load("CopyTo"); + ((IList)_list).CopyTo(array, index); + } + + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + int ICollection.Count => Count; + + /// + /// Gets a value indicating whether access to the is synchronized + /// (thread safe). + /// + /// + /// + /// true if access to the is synchronized (thread safe); + /// otherwise, false. + /// + bool ICollection.IsSynchronized => false; + + /// + /// Gets an object that can be used to synchronize access to the . + /// + /// + /// An object that can be used to synchronize access to the . + object ICollection.SyncRoot => this; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Proxy/LazyListGenericFactory.cs b/ORBatisCore/Proxy/LazyListGenericFactory.cs new file mode 100644 index 0000000..70e36bf --- /dev/null +++ b/ORBatisCore/Proxy/LazyListGenericFactory.cs @@ -0,0 +1,60 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-18 14:25:03 -0600 (Thu, 18 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// /// Implementation of to create proxy for an generic IList element. +/// +public class LazyListGenericFactory : ILazyFactory +{ + #region ILazyFactory Members + /// + /// Create a new proxy instance. + /// + /// The mapped statement. + /// The param. + /// The target. + /// The set accessor. + /// Returns a new proxy. + public object CreateProxy(IMappedStatement mappedStatement, object param, + object target, ISetAccessor setAccessor) + { + var elementType = setAccessor.MemberType.GetGenericArguments()[0]; + var lazyType = typeof(LazyListGeneric<>); + var lazyGenericType = lazyType.MakeGenericType(elementType); + + Type[] parametersType = { typeof(IMappedStatement), typeof(object), typeof(object), typeof(ISetAccessor) }; + + var factory = mappedStatement.SqlMap.DataExchangeFactory.ObjectFactory.CreateFactory(lazyGenericType, parametersType); + + object[] parameters = { mappedStatement, param, target, setAccessor }; + return factory.CreateInstance(parameters); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Proxy/LazyLoadInterceptor.cs b/ORBatisCore/Proxy/LazyLoadInterceptor.cs new file mode 100644 index 0000000..f0d9f33 --- /dev/null +++ b/ORBatisCore/Proxy/LazyLoadInterceptor.cs @@ -0,0 +1,136 @@ +#region Apache Notice +/***************************************************************************** + * $LastChangedDate: 2013-07-11 $ + * $LastChangedBy: mmccurrey $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2008/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Reflection; +using Castle.DynamicProxy; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; +#endregion + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// Default implementation of the interceptor reponsible of load the lazy element +/// Could load collections and single objects +/// +[Serializable] +public class LazyLoadInterceptor : IInterceptor +{ + #region IInterceptor member + /// + /// Intercepts the specified invocation., params object[] arguments + /// + /// The invocation. + /// + public virtual void Intercept(IInvocation invocation) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call to " + invocation.Method.Name); + + lock (syncLock) + { + if (loaded == false && !passthroughMethods.Contains(invocation.Method.Name)) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call, query statement " + statementName); + + //Perform load + throw new InvalidOperationException("todo: find session"); + + if (typeof(IList).IsAssignableFrom(setAccessor.MemberType)) + lazyLoadedItem = sqlMapper.QueryForList(statementName, param, null); + else + lazyLoadedItem = sqlMapper.QueryForObject(statementName, param, null); + + loaded = true; + setAccessor.Set(target, lazyLoadedItem); + } + } + + try + { + invocation.ReturnValue = invocation.Method.Invoke(lazyLoadedItem, invocation.Arguments); + } + catch (TargetInvocationException exception) + { + PreserveStackTrace(exception); + throw; + } + + if (_logger.IsDebugEnabled) _logger.Debug("End of proxyfied call to " + invocation.Method.Name); + } + #endregion + + private void PreserveStackTrace(Exception exception) + { + var preserveStackTrace = typeof(Exception).GetMethod("InternalPreserveStackTrace", + BindingFlags.Instance | BindingFlags.NonPublic); + preserveStackTrace.Invoke(exception, null); + } + + #region Fields + private readonly object param; + private readonly object target; + private readonly ISetAccessor setAccessor; + private readonly ISqlMapper sqlMapper; + private readonly string statementName = string.Empty; + private bool loaded; + private object lazyLoadedItem; + private readonly object syncLock = new(); + private static readonly ArrayList passthroughMethods = new(); + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + + #region Constructor (s) / Destructor + /// + /// Static Constructor for a lazy list loader + /// + static LazyLoadInterceptor() + { + passthroughMethods.Add("GetType"); + } + + /// + /// Constructor for a lazy list loader + /// + /// The data mapper. + /// The mapped statement used to build the list + /// The parameter object used to build the list + /// The target object which contains the property proxydied. + /// The proxified member accessor. + public LazyLoadInterceptor( + ISqlMapper sqlMapper, + IMappedStatement mappedSatement, object param, + object target, ISetAccessor setAccessor) + { + this.param = param; + statementName = mappedSatement.Id; + this.sqlMapper = sqlMapper; + this.target = target; + this.setAccessor = setAccessor; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Proxy/LazyLoadProxyFactory.cs b/ORBatisCore/Proxy/LazyLoadProxyFactory.cs new file mode 100644 index 0000000..0f8a170 --- /dev/null +++ b/ORBatisCore/Proxy/LazyLoadProxyFactory.cs @@ -0,0 +1,76 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2008-06-28 09:26:16 -0600 (Sat, 28 Jun 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2008/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using Castle.DynamicProxy; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy; + +/// +/// Proxy Factory for Lazy Load +/// +public class LazyLoadProxyFactory : ILazyFactory +{ + #region ILazyFactory Members + /// + /// Builds the specified lazy load proxy for a concrete class with virtual method. + /// + /// The mapped statement used to build the lazy loaded object. + /// The parameter object used to build lazy loaded object. + /// The target object which contains the property proxydied.. + /// The proxified member accessor. + /// + /// Return a proxy object + /// + public object CreateProxy( + IMappedStatement selectStatement, object param, + object target, ISetAccessor setAccessor) + { + var typeProxified = setAccessor.MemberType; + + if (logger.IsDebugEnabled) logger.Debug(string.Format("Statement '{0}', create proxy for member {1}.", selectStatement.Id, setAccessor.MemberType)); + + // Build the proxy + var interceptor = new LazyLoadInterceptor(selectStatement.SqlMap, selectStatement, param, target, setAccessor); + + // if you want to proxy concrete classes, there are also 2 main requirements : + // the class can not be sealed and only virtual methods can be intercepted. + // The reason is that DynamicProxy will create a subclass of your class overriding all methods + // so it can dispatch the invocations to the interceptor. + + // The proxified type must also have an empty constructor + var generatedProxy = proxyGenerator.CreateClassProxy(typeProxified, Type.EmptyTypes, interceptor); + + return generatedProxy; + } + #endregion + #region Fields + private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ProxyGenerator proxyGenerator = new(); + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Scope/ConfigurationScope.cs b/ORBatisCore/Scope/ConfigurationScope.cs new file mode 100644 index 0000000..c1e7c32 --- /dev/null +++ b/ORBatisCore/Scope/ConfigurationScope.cs @@ -0,0 +1,254 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 576082 $ + * $Date: 2007-09-16 06:04:01 -0600 (Sun, 16 Sep 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Collections.Specialized; +using System.Configuration; +using System.Xml; +using IBatisNet.Common; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.TypeHandlers; +#endregion + +namespace IBatisNet.DataMapper.Scope; + +/// +/// The ConfigurationScope maintains the state of the build process. +/// +public class ConfigurationScope : IScope +{ + /// + /// Empty parameter map + /// + public const string EMPTY_PARAMETER_MAP = "iBATIS.Empty.ParameterMap"; + + #region Constructors + /// + /// Default constructor + /// + public ConfigurationScope() + { + ErrorContext = new ErrorContext(); + + Providers.Clear(); + } + #endregion + + /// + /// Register under Statement Name or Fully Qualified Statement Name + /// + /// An Identity + /// The new Identity + public string ApplyNamespace(string id) + { + var newId = id; + + if (SqlMapNamespace != null && SqlMapNamespace.Length > 0 + && id != null && id.Length > 0 && id.IndexOf(".") < 0) + newId = SqlMapNamespace + DomSqlMapBuilder.DOT + id; + return newId; + } + + /// + /// Resolves the type handler. + /// + /// The clazz. + /// Name of the member. + /// Type of the CLR. + /// Type of the db. + /// if set to true [for setter]. + /// + public ITypeHandler ResolveTypeHandler(Type clazz, string memberName, string clrType, string dbType, bool forSetter) + { + ITypeHandler handler = null; + if (clazz == null) + { + handler = DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); + } + else if (typeof(IDictionary).IsAssignableFrom(clazz)) + { + // IDictionary + if (clrType == null || clrType.Length == 0) + handler = DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); + else + try + { + var type = TypeUtils.ResolveType(clrType); + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); + } + catch (Exception e) + { + throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); + } + } + else if (DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(clazz, dbType) != null) + { + // Primitive + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(clazz, dbType); + } + else + { + // .NET object + if (clrType == null || clrType.Length == 0) + { + Type type = null; + if (forSetter) + type = ObjectProbe.GetMemberTypeForSetter(clazz, memberName); + else + type = ObjectProbe.GetMemberTypeForGetter(clazz, memberName); + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); + } + else + { + try + { + var type = TypeUtils.ResolveType(clrType); + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); + } + catch (Exception e) + { + throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); + } + } + } + + return handler; + } + + + #region Properties + /// + /// The list of sql fragment + /// + public HybridDictionary SqlIncludes { get; } = new(); + + /// + /// XmlNamespaceManager + /// + public XmlNamespaceManager XmlNamespaceManager { set; get; } + + /// + /// Set if the parser should validate the sqlMap documents + /// + public bool ValidateSqlMap { set; get; } + + /// + /// Tells us if the xml configuration file validate the schema + /// + public bool IsXmlValid { set; get; } = true; + + + /// + /// The current SqlMap namespace. + /// + public string SqlMapNamespace { set; get; } + + /// + /// The SqlMapper we are building. + /// + public ISqlMapper SqlMapper { set; get; } + + + /// + /// A factory for DataExchange objects + /// + public DataExchangeFactory DataExchangeFactory => SqlMapper.DataExchangeFactory; + + /// + /// Tell us if we are in a DataAccess context. + /// + public bool IsCallFromDao { set; get; } + + /// + /// Tell us if we cache model is enabled. + /// + public bool IsCacheModelsEnabled { set; get; } + + /// + /// External data source + /// + public DataSource DataSource { set; get; } + + /// + /// The current context node we are analizing + /// + public XmlNode NodeContext { set; get; } + + /// + /// The XML SqlMap config file + /// + public XmlDocument SqlMapConfigDocument { set; get; } + + /// + /// A XML SqlMap file + /// + public XmlDocument SqlMapDocument { set; get; } + + /// + /// A XML SqlMap file + /// + public XmlDocument SqlMapModuleDocument { set; get; } + + /// + /// Tell us if we use Configuration File Watcher + /// + public bool UseConfigFileWatcher { set; get; } + + /// + /// Tell us if we use statements namespaces + /// + public bool UseStatementNamespaces { set; get; } + + /// + /// Get the request's error context + /// + public ErrorContext ErrorContext { get; } + + /// + /// List of providers + /// + public HybridDictionary Providers { get; } = new(); + + /// + /// List of global properties + /// + public NameValueCollection Properties { get; } = new(); + + /// + /// Indicates if we can use reflection optimizer. + /// + public bool UseReflectionOptimizer { get; set; } = true; + + /// + /// Temporary storage for mapping cache model ids (key is System.String) to statements (value is IList which contains + /// IMappedStatements). + /// + public HybridDictionary CacheModelFlushOnExecuteStatements { get; set; } = new(); + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Scope/ErrorContext.cs b/ORBatisCore/Scope/ErrorContext.cs new file mode 100644 index 0000000..6395c75 --- /dev/null +++ b/ORBatisCore/Scope/ErrorContext.cs @@ -0,0 +1,117 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Text; +#endregion + +namespace IBatisNet.DataMapper.Scope; + +/// +/// An error context to help us create meaningful error messages. +/// +public class ErrorContext +{ + #region Properties + /// + /// The resource causing the problem + /// + public string Resource { get; set; } = string.Empty; + + /// + /// The activity that was happening when the error happened + /// + public string Activity { get; set; } = string.Empty; + + /// + /// The object ID where the problem happened + /// + public string ObjectId { get; set; } = string.Empty; + + /// + /// More information about the error + /// + public string MoreInfo { get; set; } = string.Empty; + #endregion + + #region Methods + /// + /// Clear the error context + /// + public void Reset() + { + Resource = string.Empty; + Activity = string.Empty; + ObjectId = string.Empty; + MoreInfo = string.Empty; + } + + /// + /// + /// + public override string ToString() + { + var message = new StringBuilder(); + + // activity + if (Activity != null && Activity.Length > 0) + { + message.Append(Environment.NewLine); + message.Append("- The error occurred while "); + message.Append(Activity); + message.Append("."); + } + + // more info + if (MoreInfo != null && MoreInfo.Length > 0) + { + message.Append(Environment.NewLine); + message.Append("- "); + message.Append(MoreInfo); + } + + // resource + if (Resource != null && Resource.Length > 0) + { + message.Append(Environment.NewLine); + message.Append("- The error occurred in "); + message.Append(Resource); + message.Append("."); + } + + // object + if (ObjectId != null && ObjectId.Length > 0) + { + message.Append(" "); + message.Append(Environment.NewLine); + message.Append("- Check the "); + message.Append(ObjectId); + message.Append("."); + } + + return message.ToString(); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Scope/IScope.cs b/ORBatisCore/Scope/IScope.cs new file mode 100644 index 0000000..8ddc77a --- /dev/null +++ b/ORBatisCore/Scope/IScope.cs @@ -0,0 +1,43 @@ +using IBatisNet.DataMapper.DataExchange; + +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.Scope; + +/// +/// +public interface IScope +{ + /// + /// Get the error context + /// + ErrorContext ErrorContext { get; } + + /// + /// The factory for DataExchange objects + /// + DataExchangeFactory DataExchangeFactory { get; } +} \ No newline at end of file diff --git a/ORBatisCore/Scope/RequestScope.cs b/ORBatisCore/Scope/RequestScope.cs new file mode 100644 index 0000000..d8ee98c --- /dev/null +++ b/ORBatisCore/Scope/RequestScope.cs @@ -0,0 +1,214 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Data; +using System.Runtime.CompilerServices; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.MappedStatements; +#endregion + +namespace IBatisNet.DataMapper.Scope; + +/// +/// Hold data during the process of a mapped statement. +/// +public class RequestScope : IScope +{ + #region Constructors + /// + /// Initializes a new instance of the class. + /// + /// The data exchange factory. + /// The session. + /// The statement + public RequestScope( + DataExchangeFactory dataExchangeFactory, + ISqlMapSession session, + IStatement statement + ) + { + ErrorContext = new ErrorContext(); + + Statement = statement; + ParameterMap = statement.ParameterMap; + Session = session; + DataExchangeFactory = dataExchangeFactory; + _id = GetNextId(); + } + #endregion + #region Fields + private static long _nextId; + private readonly long _id; + + private int _currentResultMapIndex = -1; + + // Used by N+1 Select solution + // Holds [IResultMap, IDictionary] couple where the IDictionary holds [key, result object] + private IDictionary _uniqueKeys; + #endregion + + #region Properties + /// + /// Gets the unique keys. + /// + /// The ResultMap. + /// + /// Returns [key, result object] which holds the result objects that have + /// already been build during this request with this + /// + public IDictionary GetUniqueKeys(IResultMap map) + { + if (_uniqueKeys == null) return null; + return (IDictionary)_uniqueKeys[map]; + } + + /// + /// Sets the unique keys. + /// + /// The map. + /// The keys. + public void SetUniqueKeys(IResultMap map, IDictionary keys) + { + if (_uniqueKeys == null) _uniqueKeys = new Hashtable(); + _uniqueKeys.Add(map, keys); + } + + /// + /// The current . + /// + public IMappedStatement MappedStatement { set; get; } + + /// + /// Gets the current . + /// + /// The statement. + public IStatement Statement { get; } + + /// + /// The current . + /// + public ISqlMapSession Session { get; } + + /// + /// The to execute + /// + public IDbCommand IDbCommand { set; get; } + + /// + /// Indicate if the statement have find data + /// + public bool IsRowDataFound { set; get; } + + /// + /// The 'select' result property to process after having process the main properties. + /// + public Queue QueueSelect { get; set; } = new(); + + /// + /// The current used by this request. + /// + public IResultMap CurrentResultMap => Statement.ResultsMap[_currentResultMapIndex]; + + /// + /// Moves to the next result map. + /// + /// + public bool MoveNextResultMap() + { + if (_currentResultMapIndex < Statement.ResultsMap.Count - 1) + { + _currentResultMapIndex++; + return true; + } + + return false; + } + + /// + /// The used by this request. + /// + public ParameterMap ParameterMap { set; get; } + + /// + /// The used by this request. + /// + public PreparedStatement PreparedStatement { get; set; } + #endregion + + #region Method + /// + /// Check if the specify object is equal to the current object. + /// + /// + /// + public override bool Equals(object obj) + { + if (this == obj) return true; + if (!(obj is RequestScope)) return false; + + var scope = (RequestScope)obj; + + if (_id != scope._id) return false; + + return true; + } + + /// + /// Get the HashCode for this RequestScope + /// + /// + public override int GetHashCode() + { + return (int)(_id ^ (_id >> 32)); + } + + /// + /// Method to get a unique ID + /// + /// The new ID + [MethodImpl(MethodImplOptions.Synchronized)] + public static long GetNextId() + { + return _nextId++; + } + #endregion + + #region IScope Members + /// + /// A factory for DataExchange objects + /// + public DataExchangeFactory DataExchangeFactory { get; } + + /// + /// Get the request's error context + /// + public ErrorContext ErrorContext { get; } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/SqlMap.xsd b/ORBatisCore/SqlMap.xsd new file mode 100644 index 0000000..1a9f7a3 --- /dev/null +++ b/ORBatisCore/SqlMap.xsd @@ -0,0 +1,853 @@ + + + + + + Mapping XML Schema Definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatisCore/SqlMapConfig.xsd b/ORBatisCore/SqlMapConfig.xsd new file mode 100644 index 0000000..1f6abdf --- /dev/null +++ b/ORBatisCore/SqlMapConfig.xsd @@ -0,0 +1,154 @@ + + + + + + DataMapper XML Schema Definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The document root. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatisCore/SqlMapSession.cs b/ORBatisCore/SqlMapSession.cs new file mode 100644 index 0000000..bcf4dcf --- /dev/null +++ b/ORBatisCore/SqlMapSession.cs @@ -0,0 +1,473 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 515691 $ + * $Date: 2007-03-07 11:39:07 -0700 (Wed, 07 Mar 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Data; +using System.Reflection; +using IBatisNet.Common; +using IBatisNet.Common.Logging; +using IBatisNet.DataMapper.Exceptions; +#endregion + + +namespace IBatisNet.DataMapper; + +/// +/// Summary description for SqlMapSession. +/// +[Serializable] +public class SqlMapSession : ISqlMapSession +{ + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + #region Constructor (s) / Destructor + /// + /// + /// + public SqlMapSession(ISqlMapper sqlMapper) + { + DataSource = sqlMapper.DataSource; + SqlMapper = sqlMapper; + } + #endregion + + #region IDisposable Members + /// + /// Releasing, or resetting resources. + /// + public void Dispose() + { + if (_logger.IsDebugEnabled) _logger.Debug("Dispose SqlMapSession"); + if (IsTransactionStart == false) + { + if (_connection.State != ConnectionState.Closed) CloseConnection(); + } + else + { + if (_consistent) + { + CommitTransaction(); + IsTransactionStart = false; + } + else + { + if (_connection.State != ConnectionState.Closed) + { + RollBackTransaction(); + IsTransactionStart = false; + } + } + } + } + #endregion + + #region IDalSession Members + #region Fields + /// + /// Changes the vote to commit (true) or to abort (false) in transsaction + /// + private bool _consistent; + + /// + /// Holds value of connection + /// + private IDbConnection _connection; + + /// + /// Holds value of transaction + /// + private IDbTransaction _transaction; + #endregion + + #region Properties + /// + /// Gets the SQL mapper. + /// + /// The SQL mapper. + public ISqlMapper SqlMapper { get; } + + + /// + /// The data source use by the session. + /// + /// + public IDataSource DataSource { get; } + + + /// + /// The Connection use by the session. + /// + /// + public IDbConnection Connection => _connection; + + + /// + /// The Transaction use by the session. + /// + /// + public IDbTransaction Transaction => _transaction; + + /// + /// Indicates if a transaction is open on + /// the session. + /// + public bool IsTransactionStart { get; private set; } + + /// + /// Changes the vote for transaction to commit (true) or to abort (false). + /// + private bool Consistent + { + set => _consistent = value; + } + #endregion + + #region Methods + /// + /// Complete (commit) a transaction + /// + /// + /// Use in 'using' syntax. + /// + public void Complete() + { + Consistent = true; + } + + /// + /// Open the connection + /// + public void OpenConnection() + { + OpenConnection(DataSource.ConnectionString); + } + + /// + /// Create the connection + /// + public void CreateConnection() + { + CreateConnection(DataSource.ConnectionString); + } + + /// + /// Create the connection + /// + public void CreateConnection(string connectionString) + { + _connection = DataSource.DbProvider.CreateConnection(); + _connection.ConnectionString = connectionString; + } + + /// + /// Open a connection, on the specified connection string. + /// + /// The connection string + public void OpenConnection(string connectionString) + { + if (_connection == null) + { + CreateConnection(connectionString); + try + { + _connection.Open(); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Open Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), DataSource.DbProvider.Description)); + } + catch (Exception ex) + { + throw new DataMapperException(string.Format("Unable to open connection to \"{0}\".", DataSource.DbProvider.Description), ex); + } + } + else if (_connection.State != ConnectionState.Open) + { + try + { + _connection.Open(); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Open Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), DataSource.DbProvider.Description)); + } + catch (Exception ex) + { + throw new DataMapperException(string.Format("Unable to open connection to \"{0}\".", DataSource.DbProvider.Description), ex); + } + } + } + + /// + /// Close the connection + /// + public void CloseConnection() + { + if (_connection != null && _connection.State != ConnectionState.Closed) + { + _connection.Close(); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Close Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), DataSource.DbProvider.Description)); + _connection.Dispose(); + } + + _connection = null; + } + + /// + /// Begins a database transaction. + /// + public void BeginTransaction() + { + BeginTransaction(DataSource.ConnectionString); + } + + /// + /// Open a connection and begin a transaction on the specified connection string. + /// + /// The connection string + public void BeginTransaction(string connectionString) + { + if (_connection == null || _connection.State != ConnectionState.Open) OpenConnection(connectionString); + _transaction = _connection.BeginTransaction(); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + + /// + /// Begins a database transaction + /// + /// Open a connection. + public void BeginTransaction(bool openConnection) + { + if (openConnection) + { + BeginTransaction(); + } + else + { + if (_connection == null || _connection.State != ConnectionState.Open) OpenConnection(); + _transaction = _connection.BeginTransaction(); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + } + + /// + /// Begins a database transaction with the specified isolation level. + /// + /// + /// The isolation level under which the transaction should run. + /// + public void BeginTransaction(IsolationLevel isolationLevel) + { + BeginTransaction(DataSource.ConnectionString, isolationLevel); + } + + /// + /// Open a connection and begin a transaction on the specified connection string. + /// + /// The connection string + /// The transaction isolation level for this connection. + public void BeginTransaction(string connectionString, IsolationLevel isolationLevel) + { + if (_connection == null || _connection.State != ConnectionState.Open) OpenConnection(connectionString); + _transaction = _connection.BeginTransaction(isolationLevel); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + + /// + /// Begins a transaction on the current connection + /// with the specified IsolationLevel value. + /// + /// The transaction isolation level for this connection. + /// Open a connection. + public void BeginTransaction(bool openConnection, IsolationLevel isolationLevel) + { + BeginTransaction(DataSource.ConnectionString, openConnection, isolationLevel); + } + + /// + /// Begins a transaction on the current connection + /// with the specified IsolationLevel value. + /// + /// The transaction isolation level for this connection. + /// The connection string + /// Open a connection. + public void BeginTransaction(string connectionString, bool openConnection, IsolationLevel isolationLevel) + { + if (openConnection) + { + BeginTransaction(connectionString, isolationLevel); + } + else + { + if (_connection == null || _connection.State != ConnectionState.Open) throw new DataMapperException("SqlMapSession could not invoke StartTransaction(). A Connection must be started. Call OpenConnection() first."); + _transaction = _connection.BeginTransaction(isolationLevel); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + } + + /// + /// Commits the database transaction. + /// + /// + /// Will close the connection. + /// + public void CommitTransaction() + { + if (_logger.IsDebugEnabled) _logger.Debug("Commit Transaction."); + _transaction.Commit(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + + if (_connection.State != ConnectionState.Closed) CloseConnection(); + } + + /// + /// Commits the database transaction. + /// + /// Close the connection + public void CommitTransaction(bool closeConnection) + { + if (closeConnection) + { + CommitTransaction(); + } + else + { + if (_logger.IsDebugEnabled) _logger.Debug("Commit Transaction."); + _transaction.Commit(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + } + } + + /// + /// Rolls back a transaction from a pending state. + /// + /// + /// Will close the connection. + /// + public void RollBackTransaction() + { + if (_logger.IsDebugEnabled) _logger.Debug("RollBack Transaction."); + _transaction.Rollback(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + if (_connection.State != ConnectionState.Closed) CloseConnection(); + } + + /// + /// Rolls back a transaction from a pending state. + /// + /// Close the connection + public void RollBackTransaction(bool closeConnection) + { + if (closeConnection) + { + RollBackTransaction(); + } + else + { + if (_logger.IsDebugEnabled) _logger.Debug("RollBack Transaction."); + _transaction.Rollback(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + } + } + + /// + /// Create a command object + /// + /// + /// + public IDbCommand CreateCommand(CommandType commandType) + { + var command = _connection.CreateCommand(); //_dataSource.DbProvider.CreateCommand(); + command.CommandTimeout = DataSource.DbProvider.DbCommandTimeout; + command.CommandType = commandType; + //command.Connection = _connection; + + // Assign transaction + if (_transaction != null) + try + { + command.Transaction = _transaction; + } + catch { } + + // Assign connection timeout + if (_connection != null) + try // MySql provider doesn't suppport it ! + { + command.CommandTimeout = _connection.ConnectionTimeout; + } + catch (NotSupportedException e) + { + if (_logger.IsInfoEnabled) _logger.Info(e.Message); + } + + // if (_logger.IsDebugEnabled) +// { +// command = IDbCommandProxy.NewInstance(command); +// } + + return command; + } + + /// + /// Create an IDataParameter + /// + /// An IDataParameter. + public IDbDataParameter CreateDataParameter() + { + return DataSource.DbProvider.CreateDataParameter(); + } + + /// + /// + /// + public IDbDataAdapter CreateDataAdapter() + { + return DataSource.DbProvider.CreateDataAdapter(); + } + + /// + /// + /// + /// + public IDbDataAdapter CreateDataAdapter(IDbCommand command) + { + IDbDataAdapter dataAdapter = null; + + dataAdapter = DataSource.DbProvider.CreateDataAdapter(); + dataAdapter.SelectCommand = command; + + return dataAdapter; + } + #endregion + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/SqlMapper.cs b/ORBatisCore/SqlMapper.cs new file mode 100644 index 0000000..0a51e24 --- /dev/null +++ b/ORBatisCore/SqlMapper.cs @@ -0,0 +1,1115 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 591621 $ + * $LastChangedDate: 2007-11-03 07:44:57 -0600 (Sat, 03 Nov 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Collections.Specialized; +using System.Data; +using System.Text; +using IBatisNet.Common; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements; +using IBatisNet.DataMapper.TypeHandlers; + +//using IBatisNet.DataMapper.SessionStore; +#endregion + +namespace IBatisNet.DataMapper; + +/// +/// Summary description for SqlMap. +/// +public class SqlMapper : ISqlMapper +{ + #region Constructor (s) / Destructor + /// + /// Initializes a new instance of the class. + /// + /// The object factory. + /// The accessor factory. + public SqlMapper(IObjectFactory objectFactory, + AccessorFactory accessorFactory) + { + TypeHandlerFactory = new TypeHandlerFactory(); + DBHelperParameterCache = new DBHelperParameterCache(); + _objectFactory = objectFactory; + AccessorFactory = accessorFactory; + + DataExchangeFactory = new DataExchangeFactory(TypeHandlerFactory, _objectFactory, accessorFactory); + Id = HashCodeProvider.GetIdentityHashCode(this).ToString(); + //_sessionStore = SessionStoreFactory.GetSessionStore(_id); + } + #endregion + + #region QueryForDataTable + /// + /// Executes the SQL and retuns all rows selected. + ///

+ ///

+ /// Name of the statement. + /// The parameter object. + /// + public DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var dataTable = new DataTable(statementName); + var request = statement.Statement.Sql.GetRequestScope(statement, parameterObject, session); + statement.PreparedCommand.Create(request, session, statement.Statement, parameterObject); + + using (request.IDbCommand) + { + dataTable.Load(request.IDbCommand.ExecuteReader()); + } + + + return dataTable; + } + #endregion + #region QueryForPaginatedList + /// + /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to + /// automatically scroll through results from a database table. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL + /// The maximum number of objects to store in each page + /// A PaginatedList of beans containing the rows + [Obsolete("This method will be remove in future version.", false)] + public PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + return new PaginatedList(statement, parameterObject, pageSize, session); + } + #endregion + + + /// + /// Creates a new SqlMapSession that will be used to query the data source. + /// + /// A new session + public ISqlMapSession CreateSqlMapSession() + { + ISqlMapSession session = new SqlMapSession(this); + session.CreateConnection(); + + return session; + } + + + /// + /// Creates the SQL map session. + /// + /// The connection string. + /// A new session + public ISqlMapSession CreateSqlMapSession(string connectionString) + { + ISqlMapSession session = new SqlMapSession(this); + session.CreateConnection(connectionString); + + return session; + } + + #region Fields + //(MappedStatement Name, MappedStatement) + //(ResultMap name, ResultMap) + //(ParameterMap name, ParameterMap) + // DataSource + //(CacheModel name, cache)) + private readonly HybridDictionary _cacheMaps = new(); + + // An identifiant + + /// + /// Container session unique for each thread. + /// + //private ISessionStore _sessionStore = null; + private readonly IObjectFactory _objectFactory; + #endregion + + #region Properties + /// + /// Name used to identify the the + /// + public string Id { get; } = string.Empty; + + /// + /// Allow to set a custom session store like the + /// + /// Set it after the configuration and before use of the + /// + /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); + /// + //public ISessionStore SessionStore + //{ + // set { _sessionStore = value; } + //} + + /// + /// Returns the DalSession instance + /// currently being used by the SqlMap. + /// + //public ISqlMapSession LocalSession + //{ + // get { return _sessionStore.LocalSession; } + //} + + // /// + // /// Gets a value indicating whether this instance is session started. + // /// + // /// + // /// true if this instance is session started; otherwise, false. + // /// + //public bool IsSessionStarted + //{ + // get { return (_sessionStore.LocalSession != null); } + //} + + /// + /// Gets the DB helper parameter cache. + /// + /// The DB helper parameter cache. + public DBHelperParameterCache DBHelperParameterCache { get; } + + /// + /// Factory for DataExchange objects + /// + public DataExchangeFactory DataExchangeFactory { get; } + + /// + /// The TypeHandlerFactory + /// + public TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The meta factory for object factory + /// + public IObjectFactory ObjectFactory => _objectFactory; + + /// + /// The factory which build + /// + public AccessorFactory AccessorFactory { get; } + + /// + /// A flag that determines whether cache models were enabled + /// when this SqlMap was built. + /// + public bool IsCacheModelsEnabled { set; get; } + #endregion + + #region Methods + #region Manage Connection, Transaction + ///// + ///// Open a connection + ///// + ///// + //public ISqlMapSession OpenConnection() + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // return session; + //} + + ///// + ///// Open a connection, on the specified connection string. + ///// + ///// The connection string + //public ISqlMapSession OpenConnection(string connectionString) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // return session; + //} + + ///// + ///// Open a connection + ///// + //public void CloseConnection() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CloseConnection(). No connection was started. Call OpenConnection() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CloseConnection(); + // } + // catch(Exception ex) + // { + // throw new DataMapperException("SqlMapper could not CloseConnection(). Cause :"+ex.Message, ex); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + + ///// + ///// Begins a database transaction. + ///// + //public ISqlMapSession BeginTransaction() + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // session.BeginTransaction(); + // return session ; + //} + + ///// + ///// Open a connection and begin a transaction on the specified connection string. + ///// + ///// The connection string + //public ISqlMapSession BeginTransaction(string connectionString) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // session.BeginTransaction( connectionString ); + // return session ; + //} + + ///// + ///// Begins a database transaction on the currect session + ///// + ///// Open a connection. + //public ISqlMapSession BeginTransaction(bool openConnection) + //{ + // ISqlMapSession session = null; + + // if (openConnection) + // { + // session = this.BeginTransaction(); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(openConnection); + // } + + // return session; + //} + + ///// + ///// Begins a database transaction with the specified isolation level. + ///// + ///// + ///// The isolation level under which the transaction should run. + ///// + //public ISqlMapSession BeginTransaction(IsolationLevel isolationLevel) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // session.BeginTransaction(isolationLevel); + // return session; + //} + + ///// + ///// Open a connection and begin a transaction on the specified connection string. + ///// + ///// The connection string + ///// The transaction isolation level for this connection. + //public ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // session.BeginTransaction( connectionString, isolationLevel); + // return session; + //} + + ///// + ///// Start a database transaction on the current session + ///// with the specified isolation level. + ///// + ///// Open a connection. + ///// + ///// The isolation level under which the transaction should run. + ///// + //public ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel) + //{ + // ISqlMapSession session = null; + + // if (openNewConnection) + // { + // session = this.BeginTransaction(isolationLevel); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(openNewConnection, isolationLevel); + // } + // return session; + //} + + ///// + ///// Begins a transaction on the current connection + ///// with the specified IsolationLevel value. + ///// + ///// The transaction isolation level for this connection. + ///// The connection string + ///// Open a connection. + //public ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel) + //{ + // ISqlMapSession session = null; + + // if (openNewConnection) + // { + // session = this.BeginTransaction(connectionString, isolationLevel); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(connectionString, openNewConnection, isolationLevel); + // } + // return session; + //} + + ///// + ///// Commits the database transaction. + ///// + ///// + ///// Will close the connection. + ///// + //public void CommitTransaction() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CommitTransaction(); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + ///// + ///// Commits the database transaction. + ///// + ///// Close the connection + //public void CommitTransaction(bool closeConnection) + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CommitTransaction(closeConnection); + // } + // finally + // { + // if (closeConnection) + // { + // _sessionStore.Dispose(); + // } + // } + //} + + ///// + ///// Rolls back a transaction from a pending state. + ///// + ///// + ///// Will close the connection. + ///// + //public void RollBackTransaction() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.RollBackTransaction(); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + ///// + ///// Rolls back a transaction from a pending state. + ///// + ///// Close the connection + //public void RollBackTransaction(bool closeConnection) + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.RollBackTransaction(closeConnection); + // } + // finally + // { + // if (closeConnection) + // { + // _sessionStore.Dispose(); + // } + // } + //} + #endregion + + #region QueryForObject + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + public object QueryForObject(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject); + return result; + } + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + public object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject, resultObject); + + return result; + } + #endregion + #endregion + #region QueryForObject .NET 2.0 + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + public T QueryForObject(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject); + + return result; + } + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + public T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject, instanceObject); + + return result; + } + #endregion + + #region QueryForMap, QueryForDictionary + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, session); + } + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, valueProperty, session); + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, null, session); + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForMap(session, parameterObject, keyProperty, valueProperty); + + return map; + } + #endregion + + #region QueryForList + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject); + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + + return list; + } + + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + /// A List of result objects. + public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + statement.ExecuteQueryForList(session, parameterObject, resultObject); + } + #endregion + + #region QueryForList .NET 2.0 + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty); + + + return map; + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary of object containing the rows keyed by keyProperty. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForDictionary(statementName, parameterObject, keyProperty, null); + } + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method> + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty, rowDelegate); + + + return map; + } + + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject); + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + + return list; + } + + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + statement.ExecuteQueryForList(session, parameterObject, resultObject); + } + #endregion + + #region QueryWithRowDelegate + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + + return list; + } + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + + return list; + } + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForMapWithRowDelegate(session, parameterObject, keyProperty, valueProperty, rowDelegate); + + return map; + } + #endregion + + #region Query Insert, Update, Delete + /// + /// Executes a Sql INSERT statement. + /// Insert is a bit different from other update methods, as it + /// provides facilities for returning the primary key of the + /// newly inserted row (rather than the effected rows). This + /// functionality is of course optional. + ///

+ /// The parameter object is generally used to supply the input + /// data for the INSERT values. + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// + /// The primary key of the newly inserted row. + /// This might be automatically generated by the RDBMS, + /// or selected from a sequence table or other source. + /// + public object Insert(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var generatedKey = statement.ExecuteInsert(session, parameterObject); + + return generatedKey; + } + + /// + /// Executes a Sql UPDATE statement. + /// Update can also be used for any other update statement type, + /// such as inserts and deletes. Update returns the number of + /// rows effected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the UPDATE values as well as the WHERE clause parameter(s). + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + public int Update(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var rows = statement.ExecuteUpdate(session, parameterObject); + + return rows; + } + + /// + /// Executes a Sql DELETE statement. + /// Delete returns the number of rows effected. + /// + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + public int Delete(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var rows = statement.ExecuteUpdate(session, parameterObject); + + return rows; + } + #endregion + + #region Get/Add ParemeterMap, ResultMap, MappedStatement, TypeAlias, DataSource, CacheModel + /// + /// Gets a MappedStatement by name + /// + /// The id of the statement + /// The MappedStatement + public IMappedStatement GetMappedStatement(string id) + { + if (MappedStatements.Contains(id) == false) throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); + return (IMappedStatement)MappedStatements[id]; + } + + /// + /// Adds a (named) MappedStatement. + /// + /// The key name + /// The statement to add + public void AddMappedStatement(string key, IMappedStatement mappedStatement) + { + if (MappedStatements.Contains(key)) throw new DataMapperException("This SQL map already contains a MappedStatement named " + mappedStatement.Id); + MappedStatements.Add(key, mappedStatement); + } + + /// + /// The MappedStatements collection + /// + public HybridDictionary MappedStatements { get; } = new(); + + /// + /// Get a ParameterMap by name + /// + /// The name of the ParameterMap + /// The ParameterMap + public ParameterMap GetParameterMap(string name) + { + if (!ParameterMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an ParameterMap named " + name + ". "); + return (ParameterMap)ParameterMaps[name]; + } + + /// + /// Adds a (named) ParameterMap. + /// + /// the ParameterMap to add + public void AddParameterMap(ParameterMap parameterMap) + { + if (ParameterMaps.Contains(parameterMap.Id)) throw new DataMapperException("This SQL map already contains an ParameterMap named " + parameterMap.Id); + ParameterMaps.Add(parameterMap.Id, parameterMap); + } + + /// + /// Gets a ResultMap by name + /// + /// The name of the result map + /// The ResultMap + public IResultMap GetResultMap(string name) + { + if (ResultMaps.Contains(name) == false) throw new DataMapperException("This SQL map does not contain an ResultMap named " + name); + return (ResultMap)ResultMaps[name]; + } + + /// + /// Adds a (named) ResultMap + /// + /// The ResultMap to add + public void AddResultMap(IResultMap resultMap) + { + if (ResultMaps.Contains(resultMap.Id)) throw new DataMapperException("This SQL map already contains an ResultMap named " + resultMap.Id); + ResultMaps.Add(resultMap.Id, resultMap); + } + + /// + /// The ParameterMap collection + /// + public HybridDictionary ParameterMaps { get; } = new(); + + /// + /// The ResultMap collection + /// + public HybridDictionary ResultMaps { get; } = new(); + + /// + /// The DataSource + /// + public IDataSource DataSource { get; set; } + + /// + /// Flushes all cached objects that belong to this SqlMap + /// + public void FlushCaches() + { + var enumerator = _cacheMaps.GetEnumerator(); + while (enumerator.MoveNext()) ((CacheModel)enumerator.Value).Flush(); + } + + /// + /// Adds a (named) cache. + /// + /// The cache to add + public void AddCache(CacheModel cache) + { + if (_cacheMaps.Contains(cache.Id)) throw new DataMapperException("This SQL map already contains an Cache named " + cache.Id); + _cacheMaps.Add(cache.Id, cache); + } + + /// + /// Gets a cache by name + /// + /// The name of the cache to get + /// The cache object + public CacheModel GetCache(string name) + { + if (!_cacheMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an Cache named " + name); + return (CacheModel)_cacheMaps[name]; + } + + /// + /// + /// + public string GetDataCacheStats() + { + var buffer = new StringBuilder(); + buffer.Append(Environment.NewLine); + buffer.Append("Cache Data Statistics"); + buffer.Append(Environment.NewLine); + buffer.Append("====================="); + buffer.Append(Environment.NewLine); + + var enumerator = MappedStatements.GetEnumerator(); + while (enumerator.MoveNext()) + { + var mappedStatement = (IMappedStatement)enumerator.Value; + + buffer.Append(mappedStatement.Id); + buffer.Append(": "); + + if (mappedStatement is CachingStatement) + { + var hitRatio = ((CachingStatement)mappedStatement).GetDataCacheHitRatio(); + if (hitRatio != -1) + { + buffer.Append(Math.Round(hitRatio * 100)); + buffer.Append("%"); + } + else + { + // this statement has a cache but it hasn't been accessed yet + // buffer.Append("Cache has not been accessed."); ??? + buffer.Append("No Cache."); + } + } + else + { + buffer.Append("No Cache."); + } + + buffer.Append(Environment.NewLine); + } + + return buffer.ToString(); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/AnsiStringTypeHandler.cs b/ORBatisCore/TypeHandlers/AnsiStringTypeHandler.cs new file mode 100644 index 0000000..af6bfb8 --- /dev/null +++ b/ORBatisCore/TypeHandlers/AnsiStringTypeHandler.cs @@ -0,0 +1,109 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 474910 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// TypeHandler for AnsiString dbType +/// +public class AnsiStringTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + dataParameter.DbType = DbType.AnsiString; + base.SetParameter(dataParameter, parameterValue, dbType); + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/BaseTypeHandler.cs b/ORBatisCore/TypeHandlers/BaseTypeHandler.cs new file mode 100644 index 0000000..fb15504 --- /dev/null +++ b/ORBatisCore/TypeHandlers/BaseTypeHandler.cs @@ -0,0 +1,112 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 595821 $ + * $LastChangedDate: 2007-11-16 14:00:04 -0700 (Fri, 16 Nov 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Summary description for BaseTypeHandler. +/// +public abstract class BaseTypeHandler : ITypeHandler +{ + /// + /// Gets a column value by the name + /// + /// + /// + /// + public abstract object GetValueByName(ResultProperty mapping, IDataReader dataReader); + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public abstract object GetValueByIndex(ResultProperty mapping, IDataReader dataReader); + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public abstract object GetDataBaseValue(object outputValue, Type parameterType); + + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public abstract bool IsSimpleType { get; } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public abstract object ValueOf(Type type, string s); + + /// + /// The null value for this type + /// + public virtual object NullValue => null; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public virtual void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + if (parameterValue != null) + dataParameter.Value = parameterValue; + else + // When sending a null parameter value to the server, + // the user must specify DBNull, not null. + dataParameter.Value = DBNull.Value; + } + + /// + /// Compares two values (that this handler deals with) for equality + /// + /// one of the objects + /// the other object as a String + /// true if they are equal + public virtual bool Equals(object obj, string str) + { + if (obj == null || str == null) return (string)obj == str; + + var castedObject = ValueOf(obj.GetType(), str); + return obj.Equals(castedObject); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/BooleanTypeHandler.cs b/ORBatisCore/TypeHandlers/BooleanTypeHandler.cs new file mode 100644 index 0000000..f32d93d --- /dev/null +++ b/ORBatisCore/TypeHandlers/BooleanTypeHandler.cs @@ -0,0 +1,100 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Boolean TypeHandler. +/// +public sealed class BooleanTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToBoolean(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToBoolean(dataReader.GetValue(mapping.ColumnIndex)); + } + + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToBoolean(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToBoolean(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("BooleanTypeHandler could not cast a null value in bool field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/ByteArrayTypeHandler.cs b/ORBatisCore/TypeHandlers/ByteArrayTypeHandler.cs new file mode 100644 index 0000000..539f89d --- /dev/null +++ b/ORBatisCore/TypeHandlers/ByteArrayTypeHandler.cs @@ -0,0 +1,123 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 652259 $ + * $LastChangedDate: 2008-04-29 22:53:42 -0600 (Tue, 29 Apr 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region using +using System.Data; +using System.Text; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Exceptions; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de ByteArrayTypeHandler. +/// +public sealed class ByteArrayTypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index) || dataReader.GetBytes(index, 0, null, 0, 0) == 0) return DBNull.Value; + + return GetValueByIndex(index, dataReader); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex) || dataReader.GetBytes(mapping.ColumnIndex, 0, null, 0, 0) == 0) return DBNull.Value; + + return GetValueByIndex(mapping.ColumnIndex, dataReader); + } + + + /// + /// Gets the index of the value by. + /// + /// Index of the column. + /// The data reader. + /// + private byte[] GetValueByIndex(int columnIndex, IDataReader dataReader) + { + // determine the buffer size + var bufferLength = (int)dataReader.GetBytes(columnIndex, 0, null, 0, 0); + + // initialize it + var byteArray = new byte[bufferLength]; + + // fill it + dataReader.GetBytes(columnIndex, 0, byteArray, 0, bufferLength); + + return byteArray; + } + + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Encoding.Default.GetBytes(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + throw new DataMapperException("NotSupportedException"); + } + + //public override object NullValue + //{ + // get { return null; } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/ByteTypeHandler.cs b/ORBatisCore/TypeHandlers/ByteTypeHandler.cs new file mode 100644 index 0000000..4ea2ccf --- /dev/null +++ b/ORBatisCore/TypeHandlers/ByteTypeHandler.cs @@ -0,0 +1,106 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 697594 $ + * $LastChangedDate: 2008-09-21 13:27:05 -0600 (Sun, 21 Sep 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de ByteTypeHandler. +/// +public sealed class ByteTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToByte(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToByte(outputValue); + } + + /// + /// The null value for this type + /// + /// + //public override object NullValue + //{ + // get { throw new InvalidCastException("ByteTypeHandler, could not cast a null value in byte field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/CharTypeHandler.cs b/ORBatisCore/TypeHandlers/CharTypeHandler.cs new file mode 100644 index 0000000..7e3a72a --- /dev/null +++ b/ORBatisCore/TypeHandlers/CharTypeHandler.cs @@ -0,0 +1,100 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de CharTypeHandler. +/// +public sealed class CharTypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index)[0]; + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex)[0]; + //GetChar(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToChar(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToChar(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("CharTypeHandler, could not cast a null value in char field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/CustomTypeHandler.cs b/ORBatisCore/TypeHandlers/CustomTypeHandler.cs new file mode 100644 index 0000000..a88b8aa --- /dev/null +++ b/ORBatisCore/TypeHandlers/CustomTypeHandler.cs @@ -0,0 +1,135 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Custom type handler for adding a TypeHandlerCallback +/// +public sealed class CustomTypeHandler : BaseTypeHandler +{ + private readonly ITypeHandlerCallback _callback; + + /// + /// Initializes a new instance of the class. + /// + /// The callback. + public CustomTypeHandler(ITypeHandlerCallback callback) + { + _callback = callback; + } + + /// + /// Gets or sets the callback. + /// + /// The callback. + public ITypeHandlerCallback Callback + { + get => _callback; + set + { + /* nop */ + } + } + + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// The null value for this type + /// + /// + public override object NullValue => _callback.NullValue; + + /// + /// Performs processing on a value before it is used to set + /// the parameter of a IDbCommand. + /// + /// + /// The value to be set + /// Data base type + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + IParameterSetter setter = new ParameterSetterImpl(dataParameter); + _callback.SetParameter(setter, parameterValue); + } + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + IResultGetter getter = new ResultGetterImpl(dataReader, mapping.ColumnName); + return _callback.GetResult(getter); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + IResultGetter getter = new ResultGetterImpl(dataReader, mapping.ColumnIndex); + return _callback.GetResult(getter); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return _callback.ValueOf(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + IResultGetter getter = new ResultGetterImpl(outputValue); + return _callback.GetResult(getter); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/DBNullTypeHandler.cs b/ORBatisCore/TypeHandlers/DBNullTypeHandler.cs new file mode 100644 index 0000000..7735574 --- /dev/null +++ b/ORBatisCore/TypeHandlers/DBNullTypeHandler.cs @@ -0,0 +1,105 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (dim., 19 f�vr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// DBNull TypeHandler. +/// +public sealed class DBNullTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => false; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + return DBNull.Value; + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + return DBNull.Value; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return DBNull.Value; + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return DBNull.Value; + } + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + dataParameter.Value = DBNull.Value; + } + + //public override object NullValue + //{ + // get { return null; } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/DateTimeTypeHandler.cs b/ORBatisCore/TypeHandlers/DateTimeTypeHandler.cs new file mode 100644 index 0000000..2271d56 --- /dev/null +++ b/ORBatisCore/TypeHandlers/DateTimeTypeHandler.cs @@ -0,0 +1,100 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de DateTimeTypeHandler. +/// +public sealed class DateTimeTypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDateTime(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDateTime(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDateTime(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDateTime(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("DateTimeTypeHandler could not cast a null value in DateTime field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/DecimalTypeHandler.cs b/ORBatisCore/TypeHandlers/DecimalTypeHandler.cs new file mode 100644 index 0000000..78bdebe --- /dev/null +++ b/ORBatisCore/TypeHandlers/DecimalTypeHandler.cs @@ -0,0 +1,105 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using System.Globalization; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// DecimalTypeHandler. +/// +public sealed class DecimalTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDecimal(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDecimal(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + /// + /// value decimal must be in format ######.## + /// where . is separator for decimal + /// + public override object ValueOf(Type type, string s) + { + var culture = new CultureInfo("en-US"); + return decimal.Parse(s, culture); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDecimal(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("DecimalTypeHandler could not cast a null value in decimal field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/DoubleTypeHandler.cs b/ORBatisCore/TypeHandlers/DoubleTypeHandler.cs new file mode 100644 index 0000000..b49472d --- /dev/null +++ b/ORBatisCore/TypeHandlers/DoubleTypeHandler.cs @@ -0,0 +1,100 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de Double. +/// +public sealed class DoubleTypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDouble(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDouble(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDouble(s); + } + + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDouble(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("DoubleTypeHandler, could not cast a null value in double field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/EnumTypeHandler.cs b/ORBatisCore/TypeHandlers/EnumTypeHandler.cs new file mode 100644 index 0000000..9722d68 --- /dev/null +++ b/ORBatisCore/TypeHandlers/EnumTypeHandler.cs @@ -0,0 +1,116 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 575902 $ + * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Summary description for EnumTypeHandler. +/// +public sealed class EnumTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + if (parameterValue != null) + dataParameter.Value = Convert.ChangeType(parameterValue, Enum.GetUnderlyingType(parameterValue.GetType())); + else + // When sending a null parameter value to the server, + // the user must specify DBNull, not null. + dataParameter.Value = DBNull.Value; + } + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Enum.Parse(mapping.MemberType, dataReader.GetValue(index).ToString()); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Enum.Parse(mapping.MemberType, dataReader.GetValue(mapping.ColumnIndex).ToString()); + } + + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Enum.Parse(type, s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Enum.Parse(parameterType, outputValue.ToString()); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("EnumTypeHandler, could not cast a null value in Enum field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/GuidTypeHandler.cs b/ORBatisCore/TypeHandlers/GuidTypeHandler.cs new file mode 100644 index 0000000..29006d2 --- /dev/null +++ b/ORBatisCore/TypeHandlers/GuidTypeHandler.cs @@ -0,0 +1,99 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de GuidTypeHandler. +/// +public sealed class GuidTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return new Guid(dataReader.GetGuid(index).ToString()); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return new Guid(dataReader.GetValue(mapping.ColumnIndex).ToString()); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return new Guid(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new Guid(outputValue.ToString()); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("GuidTypeHandler could not cast a null value in Guid field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/IParameterSetter.cs b/ORBatisCore/TypeHandlers/IParameterSetter.cs new file mode 100644 index 0000000..f44c36d --- /dev/null +++ b/ORBatisCore/TypeHandlers/IParameterSetter.cs @@ -0,0 +1,52 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Allows parameters to be set on the underlying prepared IDbCommand. +/// TypeHandlerCallback implementations use this interface to +/// process values before they are set on the IDbCommand. +/// +/// +/// There is no need to implement this. The implementation +/// will be passed into the TypeHandlerCallback automatically. +/// +public interface IParameterSetter +{ + /// + /// Returns the underlying IDataParameter + /// + IDataParameter DataParameter { get; } + + /// + /// Get the parameter value + /// + object Value { set; } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/IResultGetter.cs b/ORBatisCore/TypeHandlers/IResultGetter.cs new file mode 100644 index 0000000..b4c49ec --- /dev/null +++ b/ORBatisCore/TypeHandlers/IResultGetter.cs @@ -0,0 +1,54 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Allows values to be retrieved from the underlying IDataReader. +/// TypeHandlerCallback implementations use this interface to +/// get values that they can subsequently manipulate before +/// having them returned. * or index with these +/// methods. +/// +/// +/// There is no need to implement this. The implementation +/// will be passed into the TypeHandlerCallback automatically. +/// +public interface IResultGetter +{ + /// + /// Returns the underlying IDataReader + /// + IDataReader DataReader { get; } + + /// + /// Get the parameter value + /// + object Value { get; } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/ITypeHandler.cs b/ORBatisCore/TypeHandlers/ITypeHandler.cs new file mode 100644 index 0000000..7c2bb83 --- /dev/null +++ b/ORBatisCore/TypeHandlers/ITypeHandler.cs @@ -0,0 +1,95 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 389819 $ + * $LastChangedDate: 2006-03-29 09:15:54 -0700 (Wed, 29 Mar 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Summary description for ITypeHandler. +/// +public interface ITypeHandler +{ + /// + /// + /// + bool IsSimpleType { get; } + + /// + /// The null value for this type + /// + object NullValue { get; } + + /// + /// Gets a column value by the name + /// + /// + /// + /// + object GetValueByName(ResultProperty mapping, IDataReader dataReader); + + /// + /// Gets a column value by the index + /// + /// + /// + /// + object GetValueByIndex(ResultProperty mapping, IDataReader dataReader); + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + object GetDataBaseValue(object outputValue, Type parameterType); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType); + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + object ValueOf(Type type, string s); + + /// + /// Compares two values (that this handler deals with) for equality + /// + /// one of the objects + /// the other object as a String + /// true if they are equal + bool Equals(object obj, string str); +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/ITypeHandlerCallback.cs b/ORBatisCore/TypeHandlers/ITypeHandlerCallback.cs new file mode 100644 index 0000000..5f4d9bf --- /dev/null +++ b/ORBatisCore/TypeHandlers/ITypeHandlerCallback.cs @@ -0,0 +1,78 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 383115 $ + * $LastChangedDate: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// A simple interface for implementing custom type handlers. +///

+/// Using this interface, you can implement a type handler that +/// will perform customized processing before parameters are set +/// on a IDbCommand and after values are retrieved from +/// a IDataReader. Using a custom type handler you can extend +/// the framework to handle types that are not supported, or +/// handle supported types in a different way. For example, +/// you might use a custom type handler to implement proprietary +/// BLOB support (e.g. Oracle), or you might use it to handle +/// booleans using "Y" and "N" instead of the more typical 0/1. +///

+public interface ITypeHandlerCallback +{ + /// + /// The null value for this type + /// + object NullValue { get; } + + /// + /// Performs processing on a value before it is used to set + /// the parameter of a IDbCommand. + /// + /// The interface for setting the value on the IDbCommand. + /// The value to be set + void SetParameter(IParameterSetter setter, object parameter); + + + /// + /// Performs processing on a value before after it has been retrieved + /// from a IDataReader. + /// + /// The interface for getting the value from the IDataReader. + /// The processed value. + object GetResult(IResultGetter getter); + + + /// + /// Casts the string representation of a value into a type recognized by + /// this type handler. This method is used to translate nullValue values + /// into types that can be appropriately compared. If your custom type handler + /// cannot support nullValues, or if there is no reasonable string representation + /// for this type (e.g. File type), you can simply return the String representation + /// as it was passed in. It is not recommended to return null, unless null was passed + /// in. + /// + /// + /// + object ValueOf(string s); +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Int16TypeHandler.cs b/ORBatisCore/TypeHandlers/Int16TypeHandler.cs new file mode 100644 index 0000000..428ed66 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Int16TypeHandler.cs @@ -0,0 +1,101 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de Int16TypeHandler. +/// +public sealed class Int16TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToInt16(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int16TypeHandler could not cast a null value in int16 field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Int32TypeHandler.cs b/ORBatisCore/TypeHandlers/Int32TypeHandler.cs new file mode 100644 index 0000000..a87e7a3 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Int32TypeHandler.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Summary description for Int32TypeHandler. +/// +public sealed class Int32TypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToInt32(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int32TypeHandler could not cast a null value in int32 field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Int64TypeHandler.cs b/ORBatisCore/TypeHandlers/Int64TypeHandler.cs new file mode 100644 index 0000000..a2e3622 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Int64TypeHandler.cs @@ -0,0 +1,101 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de Int64TypeHandler. +/// +public sealed class Int64TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToInt64(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int64TypeHandler could not cast a null value in int64 field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs new file mode 100644 index 0000000..18b092f --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs @@ -0,0 +1,120 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable Boolean Type +/// +public sealed class NullableBooleanTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new bool?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (bool?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToBoolean(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToBoolean(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToBoolean(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToBoolean(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableByteTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableByteTypeHandler.cs new file mode 100644 index 0000000..6b5215f --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableByteTypeHandler.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable Byte Type +/// +public sealed class NullableByteTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new byte?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (byte?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToByte(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToByte(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableCharTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableCharTypeHandler.cs new file mode 100644 index 0000000..10690c6 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableCharTypeHandler.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable char Type +/// +public sealed class NullableCharTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new char?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (char?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index)[0]; + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex)[0]; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToChar(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToChar(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs new file mode 100644 index 0000000..0af934f --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs @@ -0,0 +1,117 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// +/// System.TimeSpan is map to DbType.Int64 +public sealed class NullableDateTimeTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new DateTime?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (DateTime?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDateTime(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDateTime(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDateTime(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDateTime(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs new file mode 100644 index 0000000..555fb40 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs @@ -0,0 +1,125 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using System.Globalization; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable decimal Type +/// +public class NullableDecimalTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new decimal?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public sealed override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (decimal?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDecimal(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDecimal(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToChar(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + /// + /// value decimal must be in format ######.## + /// where . is separator for decimal + /// + public override object ValueOf(Type type, string s) + { + var culture = new CultureInfo("en-US"); + return decimal.Parse(s, culture); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs new file mode 100644 index 0000000..732351f --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable double Type +/// +public sealed class NullableDoubleTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new double?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (double?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDouble(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDouble(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDouble(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDouble(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableGuidTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableGuidTypeHandler.cs new file mode 100644 index 0000000..741c860 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableGuidTypeHandler.cs @@ -0,0 +1,118 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable Guid type +/// +public sealed class NullableGuidTypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new Guid?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (Guid?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetGuid(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetGuid(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new Guid(outputValue.ToString()); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return new Guid(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableInt16TypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableInt16TypeHandler.cs new file mode 100644 index 0000000..4167a51 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableInt16TypeHandler.cs @@ -0,0 +1,127 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable UInt16 Type +/// +public sealed class NullableInt16TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new short?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (short?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return short.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int16? xTyped = (Int16?)x; + // return xTyped.Equals(y); + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableInt32TypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableInt32TypeHandler.cs new file mode 100644 index 0000000..e61b9e3 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableInt32TypeHandler.cs @@ -0,0 +1,125 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable Int32 Type +/// +public sealed class NullableInt32TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new int?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (int?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return int.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int32? xTyped = (Int32?)x; + // return xTyped.Equals(y); + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableInt64TypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableInt64TypeHandler.cs new file mode 100644 index 0000000..efc5f6c --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableInt64TypeHandler.cs @@ -0,0 +1,126 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable Int64 Type +/// +public sealed class NullableInt64TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new long?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (long?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value + /// + /// ouput database value + /// type used + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return long.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int64? xTyped = (Int64?)x; + // return xTyped.Equals(y); + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableSByteTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableSByteTypeHandler.cs new file mode 100644 index 0000000..8fc4d78 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableSByteTypeHandler.cs @@ -0,0 +1,120 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for SByte TimeSpan Type +/// +public sealed class NullableSByteTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new sbyte?(); + + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (byte?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSByte(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSByte(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableSingleTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableSingleTypeHandler.cs new file mode 100644 index 0000000..664df7e --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableSingleTypeHandler.cs @@ -0,0 +1,118 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable Single type +/// +public sealed class NullableSingleTypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new float?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (float?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetFloat(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetFloat(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSingle(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSingle(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs new file mode 100644 index 0000000..b499b8e --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable TimeSpan Type +/// +public sealed class NullableTimeSpanTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// The null value for this type + /// + /// + public override object NullValue => new TimeSpan?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (TimeSpan?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value.Ticks; //nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(index))); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex))); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new TimeSpan(Convert.ToInt64(outputValue)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return TimeSpan.Parse(s); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs new file mode 100644 index 0000000..4fed997 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs @@ -0,0 +1,126 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable Int16 type +/// +public sealed class NullableUInt16TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new ushort?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (ushort?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return ushort.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int16? xTyped = (Int16?)x; + // return xTyped.Equals(y); + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs new file mode 100644 index 0000000..b630c09 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs @@ -0,0 +1,126 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// Summary description for Int32TypeHandler. +/// +public sealed class NullableUInt32TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new uint?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (uint?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return uint.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int32? xTyped = (Int32?)x; + // return xTyped.Equals(y); + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs b/ORBatisCore/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs new file mode 100644 index 0000000..93d6536 --- /dev/null +++ b/ORBatisCore/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs @@ -0,0 +1,126 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables; + +/// +/// TypeHandler for Nullable UInt64 Type +/// +public sealed class NullableUInt64TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new ulong?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (ulong?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return ulong.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int64? xTyped = (Int64?)x; + // return xTyped.Equals(y); + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/ObjectTypeHandler.cs b/ORBatisCore/TypeHandlers/ObjectTypeHandler.cs new file mode 100644 index 0000000..96dea27 --- /dev/null +++ b/ORBatisCore/TypeHandlers/ObjectTypeHandler.cs @@ -0,0 +1,99 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de ObjectTypeHandler. +/// +public sealed class ObjectTypeHandler : BaseTypeHandler +{ + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => false; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetValue(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetValue(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + //public override object NullValue + //{ + // get { return null; } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/ParameterSetterImpl.cs b/ORBatisCore/TypeHandlers/ParameterSetterImpl.cs new file mode 100644 index 0000000..093ee77 --- /dev/null +++ b/ORBatisCore/TypeHandlers/ParameterSetterImpl.cs @@ -0,0 +1,62 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// A ParameterSetter implementation +/// +public sealed class ParameterSetterImpl : IParameterSetter +{ + #region Constructor + /// + /// Default Constructor + /// + /// + public ParameterSetterImpl(IDataParameter dataParameter) + { + DataParameter = dataParameter; + } + #endregion + + #region IParameterSetter members + /// + /// Returns the underlying DataParameter + /// + public IDataParameter DataParameter { get; } + + /// + /// Set the parameter value + /// + public object Value + { + set => DataParameter.Value = value; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/ResultGetterImpl.cs b/ORBatisCore/TypeHandlers/ResultGetterImpl.cs new file mode 100644 index 0000000..fb0182e --- /dev/null +++ b/ORBatisCore/TypeHandlers/ResultGetterImpl.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de ResultGetterImpl. +/// +public sealed class ResultGetterImpl : IResultGetter +{ + #region Fields + private readonly int _columnIndex = int.MinValue; + private readonly string _columnName = string.Empty; + private readonly object _outputValue; + #endregion + + #region Constructors + /// + /// Creates an instance for a IDataReader and column index + /// + /// The dataReader + /// the column index + public ResultGetterImpl(IDataReader dataReader, int columnIndex) + { + _columnIndex = columnIndex; + DataReader = dataReader; + } + + /// + /// Creates an instance for a IDataReader and column name + /// + /// The dataReader + /// the column name + public ResultGetterImpl(IDataReader dataReader, string columnName) + { + _columnName = columnName; + DataReader = dataReader; + } + + /// + /// Creates an instance for an output parameter + /// + /// value of an output parameter (store procedure) + public ResultGetterImpl(object outputValue) + { + _outputValue = outputValue; + } + #endregion + + #region IResultGetter members + /// + /// Returns the underlying IDataReader + /// + /// Null for an output parameter + public IDataReader DataReader { get; } + + /// + /// Get the parameter value + /// + public object Value + { + get + { + if (_columnName.Length > 0) + { + var index = DataReader.GetOrdinal(_columnName); + return DataReader.GetValue(index); + } + + if (_columnIndex >= 0) return DataReader.GetValue(_columnIndex); + + return _outputValue; + } + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/SByteTypeHandler.cs b/ORBatisCore/TypeHandlers/SByteTypeHandler.cs new file mode 100644 index 0000000..a7c80b5 --- /dev/null +++ b/ORBatisCore/TypeHandlers/SByteTypeHandler.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// SByteTypeHandler. +/// +public sealed class SByteTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// The null value for this type + /// + /// + public override object NullValue => throw new InvalidCastException("SByteTypeHandler, could not cast a null value in sbyte field."); + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSByte(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSByte(outputValue); + } +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/SingleTypeHandler.cs b/ORBatisCore/TypeHandlers/SingleTypeHandler.cs new file mode 100644 index 0000000..a71ca5d --- /dev/null +++ b/ORBatisCore/TypeHandlers/SingleTypeHandler.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de SingleTypeHandler. +/// +public sealed class SingleTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetFloat(index); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetFloat(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSingle(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSingle(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("SingleTypeHandler could not cast a null value in single field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/StringTypeHandler.cs b/ORBatisCore/TypeHandlers/StringTypeHandler.cs new file mode 100644 index 0000000..ef097c5 --- /dev/null +++ b/ORBatisCore/TypeHandlers/StringTypeHandler.cs @@ -0,0 +1,101 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de SByteTypeHandler. +/// +public sealed class StringTypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } + + //public override object NullValue + //{ + // get { return null; } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/TimeSpanTypeHandler.cs b/ORBatisCore/TypeHandlers/TimeSpanTypeHandler.cs new file mode 100644 index 0000000..b14ea47 --- /dev/null +++ b/ORBatisCore/TypeHandlers/TimeSpanTypeHandler.cs @@ -0,0 +1,110 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 474910 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Description r�sum�e de TimespanTypeHandler. +/// +public sealed class TimeSpanTypeHandler : BaseTypeHandler +{ + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + dataParameter.Value = ((TimeSpan)parameterValue).Ticks; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(index))); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex))); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new TimeSpan(Convert.ToInt64(outputValue)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return TimeSpan.Parse(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("TimeSpanTypeHandler could not cast a null value in TimeSpan field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/TypeHandlerFactory.cs b/ORBatisCore/TypeHandlers/TypeHandlerFactory.cs new file mode 100644 index 0000000..6003e57 --- /dev/null +++ b/ORBatisCore/TypeHandlers/TypeHandlerFactory.cs @@ -0,0 +1,358 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 501527 $ + * $Date: 2007-01-30 12:32:11 -0700 (Tue, 30 Jan 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities; +using IBatisNet.DataMapper.Configuration.Alias; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.TypeHandlers.Nullables; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Not much of a suprise, this is a factory class for TypeHandler objects. +/// +public class TypeHandlerFactory +{ + #region Constructor + /// + /// Constructor + /// + public TypeHandlerFactory() + { + ITypeHandler handler = null; + + handler = new DBNullTypeHandler(); + Register(typeof(DBNull), handler); + + handler = new BooleanTypeHandler(); + Register(typeof(bool), handler); // key= "System.Boolean" + + handler = new ByteTypeHandler(); + Register(typeof(byte), handler); + + handler = new CharTypeHandler(); + Register(typeof(char), handler); + + handler = new DateTimeTypeHandler(); + Register(typeof(DateTime), handler); + + handler = new DecimalTypeHandler(); + Register(typeof(decimal), handler); + + handler = new DoubleTypeHandler(); + Register(typeof(double), handler); + + handler = new Int16TypeHandler(); + Register(typeof(short), handler); + + handler = new Int32TypeHandler(); + Register(typeof(int), handler); + + handler = new Int64TypeHandler(); + Register(typeof(long), handler); + + handler = new SingleTypeHandler(); + Register(typeof(float), handler); + + handler = new StringTypeHandler(); + Register(typeof(string), handler); + + handler = new GuidTypeHandler(); + Register(typeof(Guid), handler); + + handler = new TimeSpanTypeHandler(); + Register(typeof(TimeSpan), handler); + + handler = new ByteArrayTypeHandler(); + Register(typeof(byte[]), handler); + + handler = new ObjectTypeHandler(); + Register(typeof(object), handler); + + handler = new EnumTypeHandler(); + Register(typeof(Enum), handler); + + handler = new UInt16TypeHandler(); + Register(typeof(ushort), handler); + + handler = new UInt32TypeHandler(); + Register(typeof(uint), handler); + + handler = new UInt64TypeHandler(); + Register(typeof(ulong), handler); + + handler = new SByteTypeHandler(); + Register(typeof(sbyte), handler); + + handler = new NullableBooleanTypeHandler(); + Register(typeof(bool?), handler); + + handler = new NullableByteTypeHandler(); + Register(typeof(byte?), handler); + + handler = new NullableCharTypeHandler(); + Register(typeof(char?), handler); + + handler = new NullableDateTimeTypeHandler(); + Register(typeof(DateTime?), handler); + + handler = new NullableDecimalTypeHandler(); + Register(typeof(decimal?), handler); + + handler = new NullableDoubleTypeHandler(); + Register(typeof(double?), handler); + + handler = new NullableGuidTypeHandler(); + Register(typeof(Guid?), handler); + + handler = new NullableInt16TypeHandler(); + Register(typeof(short?), handler); + + handler = new NullableInt32TypeHandler(); + Register(typeof(int?), handler); + + handler = new NullableInt64TypeHandler(); + Register(typeof(long?), handler); + + handler = new NullableSingleTypeHandler(); + Register(typeof(float?), handler); + + handler = new NullableUInt16TypeHandler(); + Register(typeof(ushort?), handler); + + handler = new NullableUInt32TypeHandler(); + Register(typeof(uint?), handler); + + handler = new NullableUInt64TypeHandler(); + Register(typeof(ulong?), handler); + + handler = new NullableSByteTypeHandler(); + Register(typeof(sbyte?), handler); + + handler = new NullableTimeSpanTypeHandler(); + Register(typeof(TimeSpan?), handler); + + _unknownTypeHandler = new UnknownTypeHandler(this); + } + #endregion + + /// + /// Gets a named TypeAlias from the list of available TypeAlias + /// + /// The name of the TypeAlias. + /// The TypeAlias. + internal TypeAlias GetTypeAlias(string name) + { + if (_typeAliasMaps.Contains(name)) return (TypeAlias)_typeAliasMaps[name]; + + return null; + } + + /// + /// Gets the type object from the specific class name. + /// + /// The supplied class name. + /// + /// The correpsonding type. + /// + internal Type GetType(string className) + { + Type type = null; + var typeAlias = GetTypeAlias(className); + + if (typeAlias != null) + type = typeAlias.Class; + else + type = TypeUtils.ResolveType(className); + + return type; + } + + /// + /// Adds a named TypeAlias to the list of available TypeAlias. + /// + /// The key name. + /// The TypeAlias. + internal void AddTypeAlias(string key, TypeAlias typeAlias) + { + if (_typeAliasMaps.Contains(key)) throw new DataMapperException(" Alias name conflict occurred. The type alias '" + key + "' is already mapped to the value '" + typeAlias.ClassName + "'."); + _typeAliasMaps.Add(key, typeAlias); + } + + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IDictionary _typeHandlerMap = new HybridDictionary(); + private readonly ITypeHandler _unknownTypeHandler; + + private const string NULL = "_NULL_TYPE_"; + + //(typeAlias name, type alias) + private readonly IDictionary _typeAliasMaps = new HybridDictionary(); + #endregion + + #region Methods + /// + /// Get a TypeHandler for a Type + /// + /// the Type you want a TypeHandler for + /// the handler + public ITypeHandler GetTypeHandler(Type type) + { + return GetTypeHandler(type, null); + } + + /// + /// Get a TypeHandler for a type + /// + /// the type you want a TypeHandler for + /// the database type + /// the handler + public ITypeHandler GetTypeHandler(Type type, string dbType) + { + if (type.IsEnum) return GetPrivateTypeHandler(typeof(Enum), dbType); + + return GetPrivateTypeHandler(type, dbType); + } + + /// + /// Get a TypeHandler for a type and a dbType type + /// + /// the type + /// the dbType type + /// the handler + private ITypeHandler GetPrivateTypeHandler(Type type, string dbType) + { + var dbTypeHandlerMap = (IDictionary)_typeHandlerMap[type]; + ITypeHandler handler = null; + + if (dbTypeHandlerMap != null) + { + if (dbType == null) + { + handler = (ITypeHandler)dbTypeHandlerMap[NULL]; + } + else + { + handler = (ITypeHandler)dbTypeHandlerMap[dbType]; + if (handler == null) handler = (ITypeHandler)dbTypeHandlerMap[NULL]; + } + + if (handler == null) throw new DataMapperException(string.Format("Type handler for {0} not registered.", type.Name)); + } + + return handler; + } + + + /// + /// Register (add) a type handler for a type + /// + /// the type + /// the handler instance + public void Register(Type type, ITypeHandler handler) + { + Register(type, null, handler); + } + + /// + /// Register (add) a type handler for a type and dbType + /// + /// the type + /// the dbType (optional, if dbType is null the handler will be used for all dbTypes) + /// the handler instance + public void Register(Type type, string dbType, ITypeHandler handler) + { + var map = (HybridDictionary)_typeHandlerMap[type]; + if (map == null) + { + map = new HybridDictionary(); + _typeHandlerMap.Add(type, map); + } + + if (dbType == null) + { + if (_logger.IsInfoEnabled) + { + // notify the user that they are no longer using one of the built-in type handlers + var oldTypeHandler = (ITypeHandler)map[NULL]; + + if (oldTypeHandler != null) + { + // the replacement will always(?) be a CustomTypeHandler + var customTypeHandler = handler as CustomTypeHandler; + + var replacement = string.Empty; + + if (customTypeHandler != null) + // report the underlying type + replacement = customTypeHandler.Callback.ToString(); + else + replacement = handler.ToString(); + + // should oldTypeHandler be checked if its a CustomTypeHandler and if so report the Callback property ??? + _logger.Info("Replacing type handler [" + oldTypeHandler + "] with [" + replacement + "]."); + } + } + + map[NULL] = handler; + } + else + { + map.Add(dbType, handler); + } + } + + /// + /// When in doubt, get the "unknown" type handler + /// + /// if I told you, it would not be unknown, would it? + public ITypeHandler GetUnkownTypeHandler() + { + return _unknownTypeHandler; + } + + /// + /// + /// + /// + public bool IsSimpleType(Type type) + { + var result = false; + if (type != null) + { + var handler = GetTypeHandler(type, null); + if (handler != null) result = handler.IsSimpleType; + } + + return result; + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/UInt16TypeHandler.cs b/ORBatisCore/TypeHandlers/UInt16TypeHandler.cs new file mode 100644 index 0000000..e948b0e --- /dev/null +++ b/ORBatisCore/TypeHandlers/UInt16TypeHandler.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// TypeHandler for UInt16 Type +/// +public sealed class UInt16TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToUInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToUInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToUInt16(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int16TypeHandler could not cast a null value in int16 field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/UInt32TypeHandler.cs b/ORBatisCore/TypeHandlers/UInt32TypeHandler.cs new file mode 100644 index 0000000..f16d161 --- /dev/null +++ b/ORBatisCore/TypeHandlers/UInt32TypeHandler.cs @@ -0,0 +1,101 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// UInt32TypeHandler +/// +public sealed class UInt32TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToUInt32(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int32TypeHandler could not cast a null value in int32 field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/UInt64TypeHandler.cs b/ORBatisCore/TypeHandlers/UInt64TypeHandler.cs new file mode 100644 index 0000000..03a914c --- /dev/null +++ b/ORBatisCore/TypeHandlers/UInt64TypeHandler.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Summary description for UInt64TypeHandler. +/// +public sealed class UInt64TypeHandler : BaseTypeHandler +{ + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToUInt64(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int64TypeHandler could not cast a null value in int64 field."); } + //} +} \ No newline at end of file diff --git a/ORBatisCore/TypeHandlers/UnknownTypeHandler.cs b/ORBatisCore/TypeHandlers/UnknownTypeHandler.cs new file mode 100644 index 0000000..2211f15 --- /dev/null +++ b/ORBatisCore/TypeHandlers/UnknownTypeHandler.cs @@ -0,0 +1,149 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 595821 $ + * $LastChangedDate: 2007-11-16 14:00:04 -0700 (Fri, 16 Nov 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers; + +/// +/// Implementation of TypeHandler for dealing with unknown types +/// +public sealed class UnknownTypeHandler : BaseTypeHandler +{ + private readonly TypeHandlerFactory _factory; + + /// + /// Constructor to create via a factory + /// + /// the factory to associate this with + public UnknownTypeHandler(TypeHandlerFactory factory) + { + _factory = factory; + } + + + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// Performs processing on a value before it is used to set + /// the parameter of a IDbCommand. + /// + /// + /// The value to be set + /// Data base type + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + if (parameterValue != null) + { + var handler = _factory.GetTypeHandler(parameterValue.GetType(), dbType); + handler.SetParameter(dataParameter, parameterValue, dbType); + } + else + { + // When sending a null parameter value to the server, + // the user must specify DBNull, not null. + dataParameter.Value = DBNull.Value; + } + } + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetValue(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetValue(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("UnknownTypeHandler could not cast a null value in unknown type field."); } + //} + + /// + /// Compares two values (that this handler deals with) for equality + /// + /// one of the objects + /// the other object as a String + /// true if they are equal + public override bool Equals(object obj, string str) + { + if (obj == null || str == null) return (string)obj == str; + + var handler = _factory.GetTypeHandler(obj.GetType()); + var castedObject = handler.ValueOf(obj.GetType(), str); + return obj.Equals(castedObject); + } +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/ConfigWatcherHandler.cs b/ORBatisCore/Utilities/ConfigWatcherHandler.cs new file mode 100644 index 0000000..d438cc9 --- /dev/null +++ b/ORBatisCore/Utilities/ConfigWatcherHandler.cs @@ -0,0 +1,208 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 452570 $ + * $Date: 2006-10-03 11:00:01 -0600 (Tue, 03 Oct 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Reflection; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities; + +/// +/// Represents the method that handles calls from Configure. +/// +/// +/// obj is a null object in a DaoManager context. +/// obj is the reconfigured sqlMap in a SqlMap context. +/// +public delegate void ConfigureHandler(object obj); + +/// +/// +public struct StateConfig +{ + /// + /// Master Config File name. + /// + public string FileName; + + /// + /// Delegate called when a file is changed, use it to rebuild. + /// + public ConfigureHandler ConfigureHandler; +} + +/// +/// Class used to watch config files. +/// +/// +/// Uses the to monitor +/// changes to a specified file. Because multiple change notifications +/// may be raised when the file is modified, a timer is used to +/// compress the notifications into a single event. The timer +/// waits for the specified time before delivering +/// the event notification. If any further +/// change notifications arrive while the timer is waiting it +/// is reset and waits again for the specified time to +/// elapse. +/// +public sealed class ConfigWatcherHandler +{ + #region Constructor (s) / Destructor + /// + /// - + /// + /// + /// Represent the call context of the SqlMap or DaoManager ConfigureAndWatch method call. + /// + /// + public ConfigWatcherHandler(TimerCallback onWhatchedFileChange, StateConfig state) + { + for (var index = 0; index < _filesToWatch.Count; index++) + { + var configFile = (FileInfo)_filesToWatch[index]; + + AttachWatcher(configFile); + + // Create the timer that will be used to deliver events. Set as disabled + // callback : A TimerCallback delegate representing a method to be executed. + // state : An object containing information to be used by the callback method, or a null reference + // dueTime : The amount of time to delay before callback is invoked, in milliseconds. Specify Timeout.Infinite to prevent the timer from starting. Specify zero (0) to start the timer immediately + // period : The time interval between invocations of callback, in milliseconds. Specify Timeout.Infinite to disable periodic signaling + _timer = new Timer(onWhatchedFileChange, state, Timeout.Infinite, Timeout.Infinite); + } + } + #endregion + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// The timer used to compress the notification events. + /// + private readonly Timer _timer; + + /// + /// A list of configuration files to watch. + /// + private static readonly ArrayList _filesToWatch = new(); + + /// + /// The list of FileSystemWatcher. + /// + private static readonly ArrayList _filesWatcher = new(); + + /// + /// The default amount of time to wait after receiving notification + /// before reloading the config file. + /// + private const int TIMEOUT_MILLISECONDS = 500; + #endregion + + #region Methods + private void AttachWatcher(FileInfo configFile) + { + // Create a new FileSystemWatcher and set its properties. + var watcher = new FileSystemWatcher(); + + watcher.Path = configFile.DirectoryName; + watcher.Filter = configFile.Name; + + // Set the notification filters + watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.FileName; + + // Add event handlers. OnChanged will do for all event handlers that fire a FileSystemEventArgs + watcher.Changed += ConfigWatcherHandler_OnChanged; + watcher.Created += ConfigWatcherHandler_OnChanged; + watcher.Deleted += ConfigWatcherHandler_OnChanged; + watcher.Renamed += ConfigWatcherHandler_OnRenamed; + + // Begin watching. + watcher.EnableRaisingEvents = true; + + _filesWatcher.Add(watcher); + } + + /// + /// Add a file to be monitored. + /// + /// + public static void AddFileToWatch(FileInfo configFile) + { + if (_logger.IsDebugEnabled) + // TODO: remove Path.GetFileName? + _logger.Debug("Adding file [" + Path.GetFileName(configFile.FullName) + "] to list of watched files."); + + _filesToWatch.Add(configFile); + } + + /// + /// Reset the list of files being monitored. + /// + public static void ClearFilesMonitored() + { + _filesToWatch.Clear(); + + // Kill all FileSystemWatcher + for (var index = 0; index < _filesWatcher.Count; index++) + { + var fileWatcher = (FileSystemWatcher)_filesWatcher[index]; + + fileWatcher.EnableRaisingEvents = false; + fileWatcher.Dispose(); + } + } + + /// + /// Event handler used by . + /// + /// The firing the event. + /// The argument indicates the file that caused the event to be fired. + /// + /// This handler reloads the configuration from the file when the event is fired. + /// + private void ConfigWatcherHandler_OnChanged(object source, FileSystemEventArgs e) + { + if (_logger.IsDebugEnabled) _logger.Debug("ConfigWatcherHandler : " + e.ChangeType + " [" + e.Name + "]"); + + // timer will fire only once + _timer.Change(TIMEOUT_MILLISECONDS, Timeout.Infinite); + } + + /// + /// Event handler used by . + /// + /// The firing the event. + /// The argument indicates the file that caused the event to be fired. + /// + /// This handler reloads the configuration from the file when the event is fired. + /// + private void ConfigWatcherHandler_OnRenamed(object source, RenamedEventArgs e) + { + if (_logger.IsDebugEnabled) _logger.Debug("ConfigWatcherHandler : " + e.ChangeType + " [" + e.OldName + "/" + e.Name + "]"); + + // timer will fire only once + _timer.Change(TIMEOUT_MILLISECONDS, Timeout.Infinite); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/DelegateFactory.cs b/ORBatisCore/Utilities/Objects/DelegateFactory.cs new file mode 100644 index 0000000..9e456b8 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/DelegateFactory.cs @@ -0,0 +1,120 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects; + +/// +/// A implementation that builds object via DynamicMethod. +/// +public sealed class DelegateFactory : IFactory +{ + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + private readonly Create _create; + + /// + /// Initializes a new instance of the class. + /// + /// The instance type to create. + /// The types argument. + public DelegateFactory(Type typeToCreate, Type[] argumentTypes) + { + var dynamicMethod = new DynamicMethod("CreateImplementation", typeof(object), new[] { typeof(object[]) }, GetType().Module, false); + var generatorIL = dynamicMethod.GetILGenerator(); + + // Emit the IL for Create method. + // Add test if contructeur not public + var constructorInfo = typeToCreate.GetConstructor(VISIBILITY, null, argumentTypes, null); + if (constructorInfo == null || !constructorInfo.IsPublic) + throw new ProbeException( + string.Format("Unable to optimize create instance. Cause : Could not find public constructor matching specified arguments for type \"{0}\".", typeToCreate.Name)); + // new typeToCreate() or new typeToCreate(... arguments ...) + EmitArgsIL(generatorIL, argumentTypes); + generatorIL.Emit(OpCodes.Newobj, constructorInfo); + generatorIL.Emit(OpCodes.Ret); + + _create = (Create)dynamicMethod.CreateDelegate(typeof(Create)); + } + + #region IFactory members + /// + /// Create a new instance with the specified parameters + /// + /// + /// An array of values that matches the number, order and type + /// of the parameters for this constructor. + /// + /// + /// If you call a constructor with no parameters, pass null. + /// Anyway, what you pass will be ignore. + /// + /// A new instance + public object CreateInstance(object[] parameters) + { + return _create(parameters); + } + #endregion + + /// + /// Emit parameter IL for a method call. + /// + /// IL generator. + /// Arguments type defined for a the constructor. + private void EmitArgsIL(ILGenerator il, Type[] argumentTypes) + { + // Add args. Since all args are objects, value types are unboxed. + // Refs to value types are to be converted to values themselves. + for (var i = 0; i < argumentTypes.Length; i++) + { + // Push args array reference on the stack , followed by the index. + // Ldelem will resolve them to args[i]. + il.Emit(OpCodes.Ldarg_0); // Argument 1 is argument array. + il.Emit(OpCodes.Ldc_I4, i); + il.Emit(OpCodes.Ldelem_Ref); + + // If param is a primitive/value type then we need to unbox it. + var paramType = argumentTypes[i]; + if (paramType.IsValueType) + { + if (paramType.IsPrimitive || paramType.IsEnum) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(BoxingOpCodes.GetOpCode(paramType)); + } + else if (paramType.IsValueType) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(OpCodes.Ldobj, paramType); + } + } + } + } + + private delegate object Create(object[] parameters); +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/DelegateObjectFactory.cs b/ORBatisCore/Utilities/Objects/DelegateObjectFactory.cs new file mode 100644 index 0000000..c47b6d2 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/DelegateObjectFactory.cs @@ -0,0 +1,98 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Text; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects; + +/// +/// A implementation that can create objects via DynamicMethod. +/// +public sealed class DelegateObjectFactory : IObjectFactory +{ + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IDictionary _cachedfactories = new HybridDictionary(); + private readonly object _padlock = new(); + + #region IObjectFactory members + /// + /// Create a new instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new see instance. + [MethodImpl(MethodImplOptions.Synchronized)] + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + var key = GenerateKey(typeToCreate, types); + + var factory = _cachedfactories[key] as IFactory; + if (factory == null) + lock (_padlock) + { + factory = _cachedfactories[key] as IFactory; + if (factory == null) // double-check + { + if (typeToCreate.IsAbstract) + { + if (_logger.IsInfoEnabled) _logger.Info("Create a stub IFactory for abstract type " + typeToCreate.Name); + factory = new AbstractFactory(typeToCreate); + } + else + { + factory = new DelegateFactory(typeToCreate, types); + } + + _cachedfactories[key] = factory; + } + } + + return factory; + } + + /// + /// Generates the key for a cache entry. + /// + /// The type instance to build. + /// The types of the constructor arguments + /// The key for a cache entry. + private string GenerateKey(Type typeToCreate, object[] arguments) + { + var cacheKey = new StringBuilder(); + cacheKey.Append(typeToCreate); + cacheKey.Append("."); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + cacheKey.Append(".").Append(arguments[i]); + + return cacheKey.ToString(); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/EmitObjectFactory.cs b/ORBatisCore/Utilities/Objects/EmitObjectFactory.cs new file mode 100644 index 0000000..f56ad3d --- /dev/null +++ b/ORBatisCore/Utilities/Objects/EmitObjectFactory.cs @@ -0,0 +1,93 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; +using System.Text; + +namespace IBatisNet.Common.Utilities.Objects; + +/// +/// A implementation that can create objects via IL code +/// +public sealed class EmitObjectFactory : IObjectFactory +{ + private readonly IDictionary _cachedfactories = new HybridDictionary(); + private readonly FactoryBuilder _factoryBuilder; + private readonly object _padlock = new(); + + /// + /// Initializes a new instance of the class. + /// + public EmitObjectFactory() + { + _factoryBuilder = new FactoryBuilder(); + } + + #region IObjectFactory members + /// + /// Create a new instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new instance. + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + var key = GenerateKey(typeToCreate, types); + + var factory = _cachedfactories[key] as IFactory; + if (factory == null) + lock (_padlock) + { + factory = _cachedfactories[key] as IFactory; + if (factory == null) // double-check + { + factory = _factoryBuilder.CreateFactory(typeToCreate, types); + _cachedfactories[key] = factory; + } + } + + return factory; + } + + /// + /// Generates the key for a cache entry. + /// + /// The type instance to build. + /// The types of the constructor arguments + /// The key for a cache entry. + private string GenerateKey(Type typeToCreate, object[] arguments) + { + var cacheKey = new StringBuilder(); + cacheKey.Append(typeToCreate); + cacheKey.Append("."); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + cacheKey.Append(".").Append(arguments[i]); + + return cacheKey.ToString(); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/FactoryBuilder.cs b/ORBatisCore/Utilities/Objects/FactoryBuilder.cs new file mode 100644 index 0000000..e948b5e --- /dev/null +++ b/ORBatisCore/Utilities/Objects/FactoryBuilder.cs @@ -0,0 +1,151 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects; + +/// +/// Build IFactory object via IL +/// +public class FactoryBuilder +{ + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + private const MethodAttributes CREATE_METHOD_ATTRIBUTES = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final; + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private readonly ModuleBuilder _moduleBuilder; + + /// + /// constructor + /// + public FactoryBuilder() + { + var assemblyName = new AssemblyName(); + assemblyName.Name = "iBATIS.EmitFactory" + HashCodeProvider.GetIdentityHashCode(this); + + // Create a new assembly with one module + var _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); + } + + + /// + /// Create a factory which build class of type typeToCreate + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new instance. + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + if (typeToCreate.IsAbstract) + { + if (_logger.IsInfoEnabled) _logger.Info("Create a stub IFactory for abstract type " + typeToCreate.Name); + return new AbstractFactory(typeToCreate); + } + + var innerType = CreateFactoryType(typeToCreate, types); + var ctor = innerType.GetConstructor(Type.EmptyTypes); + return (IFactory)ctor.Invoke(new object[] { }); + } + + + /// + /// Creates a . + /// + /// The type instance to create. + /// The types. + /// The + private Type CreateFactoryType(Type typeToCreate, Type[] types) + { + var typesName = string.Empty; + for (var i = 0; i < types.Length; i++) typesName += types[i].Name.Replace("[]", string.Empty) + i; + var typeBuilder = _moduleBuilder.DefineType("EmitFactoryFor" + typeToCreate.FullName + typesName, TypeAttributes.Public); + typeBuilder.AddInterfaceImplementation(typeof(IFactory)); + ImplementCreateInstance(typeBuilder, typeToCreate, types); + return typeBuilder.CreateType(); + } + + /// + /// Implements the create instance. + /// + /// The type builder. + /// The type to create. + /// The argument types. + private void ImplementCreateInstance(TypeBuilder typeBuilder, Type typeToCreate, Type[] argumentTypes) + { + // object CreateInstance(object[] parameters); + var meth = typeBuilder.DefineMethod("CreateInstance", CREATE_METHOD_ATTRIBUTES, typeof(object), new[] { typeof(object[]) }); + var il = meth.GetILGenerator(); + + // Add test if contructeur not public + var ctor = typeToCreate.GetConstructor(VISIBILITY, null, argumentTypes, null); + if (ctor == null || !ctor.IsPublic) + throw new ProbeException( + string.Format("Unable to optimize create instance. Cause : Could not find public constructor matching specified arguments for type \"{0}\".", typeToCreate.Name)); + // new typeToCreate() or new typeToCreate(... arguments ...) + EmitArgsIL(il, argumentTypes); + il.Emit(OpCodes.Newobj, ctor); + il.Emit(OpCodes.Ret); + } + + /// + /// Emit parameter IL for a method call. + /// + /// IL generator. + /// Arguments type defined for a the constructor. + private void EmitArgsIL(ILGenerator il, Type[] argumentTypes) + { + // Add args. Since all args are objects, value types are unboxed. + // Refs to value types are to be converted to values themselves. + for (var i = 0; i < argumentTypes.Length; i++) + { + // Push args array reference on the stack , followed by the index. + // Ldelem will resolve them to args[i]. + il.Emit(OpCodes.Ldarg_1); // Argument 1 is argument array. + il.Emit(OpCodes.Ldc_I4, i); + il.Emit(OpCodes.Ldelem_Ref); + + // If param is a primitive/value type then we need to unbox it. + var paramType = argumentTypes[i]; + if (paramType.IsValueType) + { + if (paramType.IsPrimitive || paramType.IsEnum) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(BoxingOpCodes.GetOpCode(paramType)); + } + else if (paramType.IsValueType) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(OpCodes.Ldobj, paramType); + } + } + } + } +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/FactoryLogAdapter.cs b/ORBatisCore/Utilities/Objects/FactoryLogAdapter.cs new file mode 100644 index 0000000..82ee2c2 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/FactoryLogAdapter.cs @@ -0,0 +1,121 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-11-09 11:44:07 -0700 (Thu, 09 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Text; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects; + +/// +/// A wrapper arround an implementation which logs argument type and value +/// when CreateInstance is called. +/// +public class FactoryLogAdapter : IFactory +{ + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IFactory _factory; + private readonly string _parametersTypeName = string.Empty; + private readonly string _typeName = string.Empty; + + /// + /// Initializes a new instance of the class. + /// + /// The type. + /// The paramters types. + /// The factory. + public FactoryLogAdapter(Type type, Type[] paramtersTypes, IFactory factory) + { + _factory = factory; + _typeName = type.FullName; + _parametersTypeName = GenerateParametersName(paramtersTypes); + } + + #region IFactory Members + /// + /// Create a new instance with the specified parameters + /// + /// + /// An array of values that matches the number, order and type + /// of the parameters for this constructor. + /// + /// A new instance + /// + /// If you call a constructor with no parameters, pass null. + /// Anyway, what you pass will be ignore. + /// + public object CreateInstance(object[] parameters) + { + object newObject = null; + + try + { + newObject = _factory.CreateInstance(parameters); + } + catch + { + _logger.Debug("Enabled to create instance for type '" + _typeName); + _logger.Debug(" using parameters type : " + _parametersTypeName); + _logger.Debug(" using parameters value : " + GenerateLogInfoForParameterValue(parameters)); + throw; + } + + return newObject; + } + #endregion + + /// + /// Generates the a string containing all parameter type names. + /// + /// The types of the constructor arguments + /// The string. + private string GenerateParametersName(object[] arguments) + { + var names = new StringBuilder(); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + names.Append("[").Append(arguments[i]).Append("] "); + + return names.ToString(); + } + + /// + /// Generates the a string containing all parameters value. + /// + /// The arguments + /// The string. + private string GenerateLogInfoForParameterValue(object[] arguments) + { + var values = new StringBuilder(); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + if (arguments[i] != null) + values.Append("[").Append(arguments[i]).Append("] "); + else + values.Append("[null] "); + + return values.ToString(); + } +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/DelegateGetFieldAccessor.cs b/ORBatisCore/Utilities/Objects/Members/DelegateGetFieldAccessor.cs new file mode 100644 index 0000000..5c8c892 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/DelegateGetFieldAccessor.cs @@ -0,0 +1,116 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class defines a field get accessor and +/// provides Reflection.Emit-generated +/// via the new DynamicMethod (.NET V2). +/// +public sealed class DelegateFieldGetAccessor : BaseAccessor, IGetAccessor +{ + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly GetValue _get; + + /// + /// Initializes a new instance of the class + /// for field get access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the field. + public DelegateFieldGetAccessor(Type targetObjectType, string fieldName) + { + // this.targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = targetObjectType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + nullInternal = GetNullInternal(_fieldType); + + var dynamicMethodGet = new DynamicMethod("GetImplementation", typeof(object), new[] { typeof(object) }, GetType().Module, false); + var ilgen = dynamicMethodGet.GetILGenerator(); + + // Emit the IL for get access. + + // We need a reference to the current instance (stored in local argument index 0) + // so Ldfld can load from the correct instance (this one). + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldfld, fieldInfo); + if (_fieldType.IsValueType) + // Now, we execute the box opcode, which pops the value of field 'x', + // returning a reference to the filed value boxed as an object. + ilgen.Emit(OpCodes.Box, fieldInfo.FieldType); + ilgen.Emit(OpCodes.Ret); + _get = (GetValue)dynamicMethodGet.CreateDelegate(typeof(GetValue)); + } + + #region IGet Members + /// + /// Gets the field value from the specified target. + /// + /// Target object. + /// Property value. + public object Get(object target) + { + return _get(target); + } + #endregion + + private delegate object GetValue(object instance); + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs b/ORBatisCore/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs new file mode 100644 index 0000000..a0530a3 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs @@ -0,0 +1,124 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class defines a get property accessor and +/// provides Reflection.Emit-generated +/// via the new DynamicMethod (.NET V2). +/// +public sealed class DelegatePropertyGetAccessor : BaseAccessor, IGetAccessor +{ + private readonly bool _canRead; + + private readonly GetValue _get; + + /// + /// The property type + /// + private readonly Type _propertyType; + + /// + /// Initializes a new instance of the class + /// for get property access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the property. + public DelegatePropertyGetAccessor(Type targetObjectType, string propertyName) + { + targetType = targetObjectType; + this.propertyName = propertyName; + + var propertyInfo = GetPropertyInfo(targetObjectType); + + if (propertyInfo == null) propertyInfo = targetType.GetProperty(propertyName); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, targetType)); + + _propertyType = propertyInfo.PropertyType; + _canRead = propertyInfo.CanRead; + + nullInternal = GetNullInternal(_propertyType); + + if (propertyInfo.CanRead) + { + var dynamicMethod = new DynamicMethod("GetImplementation", typeof(object), new[] { typeof(object) }, GetType().Module, true); + var ilgen = dynamicMethod.GetILGenerator(); + + // Emit the IL for get access. + var targetGetMethod = propertyInfo.GetGetMethod(); + + ilgen.DeclareLocal(typeof(object)); + ilgen.Emit(OpCodes.Ldarg_0); //Load the first argument,(target object) + ilgen.Emit(OpCodes.Castclass, targetObjectType); //Cast to the source type + ilgen.EmitCall(OpCodes.Callvirt, targetGetMethod, null); //Get the property value + if (targetGetMethod.ReturnType.IsValueType) ilgen.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box if necessary + ilgen.Emit(OpCodes.Stloc_0); //Store it + ilgen.Emit(OpCodes.Ldloc_0); + ilgen.Emit(OpCodes.Ret); + + _get = (GetValue)dynamicMethod.CreateDelegate(typeof(GetValue)); + } + } + + #region IGet Members + /// + /// Gets the field value from the specified target. + /// + /// Target object. + /// Property value. + public object Get(object target) + { + if (_canRead) return _get(target); + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a get method.", propertyName, targetType)); + } + #endregion + + private delegate object GetValue(object instance); + + #region IAccessor Members + /// + /// Gets the property's name. + /// + /// + public string Name => propertyName; + + /// + /// Gets the property's type. + /// + /// + public Type MemberType => _propertyType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/DelegatePropertySetAccessor.cs b/ORBatisCore/Utilities/Objects/Members/DelegatePropertySetAccessor.cs new file mode 100644 index 0000000..ee7a160 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/DelegatePropertySetAccessor.cs @@ -0,0 +1,149 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class defines a set property accessor and +/// provides Reflection.Emit-generated +/// via the new DynamicMethod (.NET V2). +/// +public sealed class DelegatePropertySetAccessor : BaseAccessor, ISetAccessor +{ + private readonly bool _canWrite; + + /// + /// The property type + /// + private readonly Type _propertyType; + + private readonly SetValue _set; + + /// + /// Initializes a new instance of the class + /// for set property access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the property. + public DelegatePropertySetAccessor(Type targetObjectType, string propName) + { + targetType = targetObjectType; + propertyName = propName; + + var propertyInfo = GetPropertyInfo(targetObjectType); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, targetType)); + + _propertyType = propertyInfo.PropertyType; + _canWrite = propertyInfo.CanWrite; + + nullInternal = GetNullInternal(_propertyType); + + if (propertyInfo.CanWrite) + { + var dynamicMethod = new DynamicMethod("SetImplementation", null, new[] { typeof(object), typeof(object) }, GetType().Module, true); + var ilgen = dynamicMethod.GetILGenerator(); + + // Emit the IL for set access. + var targetSetMethod = propertyInfo.GetSetMethod(); + + var paramType = targetSetMethod.GetParameters()[0].ParameterType; + ilgen.DeclareLocal(paramType); + ilgen.Emit(OpCodes.Ldarg_0); //Load the first argument (target object) + ilgen.Emit(OpCodes.Castclass, targetType); //Cast to the source type + ilgen.Emit(OpCodes.Ldarg_1); //Load the second argument (value object) + if (paramType.IsValueType) + { + ilgen.Emit(OpCodes.Unbox, paramType); //Unbox it + if (typeToOpcode[paramType] != null) + { + var load = (OpCode)typeToOpcode[paramType]; + ilgen.Emit(load); //and load + } + else + { + ilgen.Emit(OpCodes.Ldobj, paramType); + } + } + else + { + ilgen.Emit(OpCodes.Castclass, paramType); //Cast class + } + + ilgen.EmitCall(OpCodes.Callvirt, targetSetMethod, null); //Set the property value + ilgen.Emit(OpCodes.Ret); + + _set = (SetValue)dynamicMethod.CreateDelegate(typeof(SetValue)); + } + } + + #region ISet Members + /// + /// Sets the field for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + if (_canWrite) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + + _set(target, newValue); + } + else + { + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a set method.", propertyName, targetType)); + } + } + #endregion + + private delegate void SetValue(object instance, object value); + + #region IAccessor Members + /// + /// Gets the property's name. + /// + /// + public string Name => propertyName; + + /// + /// Gets the property's type. + /// + /// + public Type MemberType => _propertyType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/DelegateSetFieldAccessor.cs b/ORBatisCore/Utilities/Objects/Members/DelegateSetFieldAccessor.cs new file mode 100644 index 0000000..77bb5d6 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/DelegateSetFieldAccessor.cs @@ -0,0 +1,123 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class defines a field get accessor and +/// provides Reflection.Emit-generated +/// via the new DynamicMethod (.NET V2). +/// +public sealed class DelegateFieldSetAccessor : BaseAccessor, ISetAccessor +{ + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly SetValue _set; + + /// + /// Initializes a new instance of the class + /// for field get access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the field. + public DelegateFieldSetAccessor(Type targetObjectType, string fieldName) + { + // this.targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = targetObjectType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + nullInternal = GetNullInternal(_fieldType); + + // Emit the IL for set access. + var dynamicMethodSet = new DynamicMethod("SetImplementation", null, new[] { typeof(object), typeof(object) }, GetType().Module, false); + var ilgen = dynamicMethodSet.GetILGenerator(); + + ilgen = dynamicMethodSet.GetILGenerator(); + + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldarg_1); + UnboxIfNeeded(fieldInfo.FieldType, ilgen); + ilgen.Emit(OpCodes.Stfld, fieldInfo); + ilgen.Emit(OpCodes.Ret); + + _set = (SetValue)dynamicMethodSet.CreateDelegate(typeof(SetValue)); + } + + #region ISet Members + /// + /// Sets the field for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + _set(target, newValue); + } + #endregion + + private static void UnboxIfNeeded(Type type, ILGenerator generator) + { + if (type.IsValueType) generator.Emit(OpCodes.Unbox_Any, type); + } + + private delegate void SetValue(object instance, object value); + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/EmitFieldGetAccessor.cs b/ORBatisCore/Utilities/Objects/Members/EmitFieldGetAccessor.cs new file mode 100644 index 0000000..b3bc22c --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/EmitFieldGetAccessor.cs @@ -0,0 +1,183 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class provides an IL-based get access +/// to a field of a specified target class. +/// +/// Will Throw FieldAccessException on private field +public sealed class EmitFieldGetAccessor : BaseAccessor, IGetAccessor +{ + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly Type _targetType; + + /// + /// The IL emitted IGet + /// + private IGet _emittedGet; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target object. + /// Name of the field. + /// The assembly builder. + /// The module builder. + public EmitFieldGetAccessor(Type targetObjectType, string fieldName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = _targetType.GetField(fieldName, VISIBILITY); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region IGet Members + /// + /// Gets the value stored in the field for the specified target. + /// + /// Object to retrieve the field from. + /// The value. + public object Get(object target) + { + return _emittedGet.Get(target); + } + #endregion + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedGet = assemblyBuilder.CreateInstance("GetFor" + _targetType.FullName + _fieldName) as IGet; + + nullInternal = GetNullInternal(_fieldType); + + if (_emittedGet == null) + throw new NotSupportedException( + string.Format("Unable to create a get field accessor for '{0}' field on class '{0}'.", _fieldName, _fieldType)); + } + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "GetFor.FullTagetTypeName.FieldName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("GetFor" + _targetType.FullName + _fieldName, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing IMemberAccessor. + typeBuilder.AddInterfaceImplementation(typeof(IGet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Get + // Define a method named "Get" for the get operation (IMemberAccessor). + var getParamTypes = new[] { typeof(object) }; + var getMethod = typeBuilder.DefineMethod("Get", + MethodAttributes.Public | MethodAttributes.Virtual, + typeof(object), + getParamTypes); + + // Get an ILGenerator and used it to emit the IL that we want. + var getIL = getMethod.GetILGenerator(); + + var targetField = _targetType.GetField(_fieldName, VISIBILITY); + + // Emit the IL for get access. + if (targetField != null) + { + // We need a reference to the current instance (stored in local argument index 1) + // so Ldfld can load from the correct instance (this one). + getIL.Emit(OpCodes.Ldarg_1); + getIL.Emit(OpCodes.Ldfld, targetField); + if (_fieldType.IsValueType) + // Now, we execute the box opcode, which pops the value of field 'x', + // returning a reference to the filed value boxed as an object. + getIL.Emit(OpCodes.Box, targetField.FieldType); + getIL.Emit(OpCodes.Ret); + } + else + { + getIL.ThrowException(typeof(MissingMethodException)); + } + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/EmitFieldSetAccessor.cs b/ORBatisCore/Utilities/Objects/Members/EmitFieldSetAccessor.cs new file mode 100644 index 0000000..b8eab11 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/EmitFieldSetAccessor.cs @@ -0,0 +1,202 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class provides an IL-based set access +/// to a field of a specified target class. +/// +/// Will Throw FieldAccessException on private field +public sealed class EmitFieldSetAccessor : BaseAccessor, ISetAccessor +{ + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly Type _targetType; + + /// + /// The IL emitted ISet + /// + private ISet _emittedSet; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target object. + /// Name of the field. + /// The assembly builder. + /// The module builder. + public EmitFieldSetAccessor(Type targetObjectType, string fieldName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = _targetType.GetField(fieldName, VISIBILITY); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region ISet Members + /// + /// Sets the field for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + _emittedSet.Set(target, newValue); + } + #endregion + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedSet = assemblyBuilder.CreateInstance("SetFor" + _targetType.FullName + _fieldName) as ISet; + + nullInternal = GetNullInternal(_fieldType); + + if (_emittedSet == null) + throw new NotSupportedException( + string.Format("Unable to create a set field accessor for '{0}' field on class '{0}'.", _fieldName, _fieldType)); + } + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "SetFor.FullTargetTypeName.FieldName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("SetFor" + _targetType.FullName + _fieldName, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing ISet. + typeBuilder.AddInterfaceImplementation(typeof(ISet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Set + // Define a method named "Set" for the set operation (IMemberAccessor). + var setParamTypes = new[] { typeof(object), typeof(object) }; + var setMethod = typeBuilder.DefineMethod("Set", + MethodAttributes.Public | MethodAttributes.Virtual, + null, + setParamTypes); + + // Get an ILGenerator and used to emit the IL that we want. + var setIL = setMethod.GetILGenerator(); + + var targetField = _targetType.GetField(_fieldName, VISIBILITY); + + // Emit the IL for the set access. + if (targetField != null) + { + setIL.Emit(OpCodes.Ldarg_1); //Load the first argument (target object) + setIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type + setIL.Emit(OpCodes.Ldarg_2); //Load the second argument (value object) + if (_fieldType.IsValueType) + { + setIL.Emit(OpCodes.Unbox, _fieldType); //Unbox it + if (typeToOpcode[_fieldType] != null) + { + var load = (OpCode)typeToOpcode[_fieldType]; + setIL.Emit(load); //and load + } + else + { + setIL.Emit(OpCodes.Ldobj, _fieldType); + } + + setIL.Emit(OpCodes.Stfld, targetField); //Set the field value + } + else + { + // setIL.Emit(OpCodes.Castclass, _fieldType); //Cast class + setIL.Emit(OpCodes.Stfld, targetField); + } + } + else + { + setIL.ThrowException(typeof(MissingMethodException)); + } + + setIL.Emit(OpCodes.Ret); + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/EmitPropertyGetAccessor.cs b/ORBatisCore/Utilities/Objects/Members/EmitPropertyGetAccessor.cs new file mode 100644 index 0000000..d1ce870 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/EmitPropertyGetAccessor.cs @@ -0,0 +1,191 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class provides an IL-based get access +/// to a property of a specified target class. +/// +public sealed class EmitPropertyGetAccessor : BaseAccessor, IGetAccessor +{ + private readonly bool _canRead; + + /// + /// The property name + /// + private readonly string _propertyName = string.Empty; + + /// + /// The property type + /// + private readonly Type _propertyType; + + /// + /// The class parent type + /// + private readonly Type _targetType; + + /// + /// The IL emitted IGet + /// + private IGet _emittedGet; + + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target object. + /// Name of the property. + /// The . + /// The . + public EmitPropertyGetAccessor(Type targetObjectType, string propertyName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _propertyName = propertyName; + + // deals with Overriding a property using new and reflection + // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx + var propertyInfo = _targetType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (propertyInfo == null) propertyInfo = _targetType.GetProperty(propertyName); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, _targetType)); + + _propertyType = propertyInfo.PropertyType; + _canRead = propertyInfo.CanRead; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region IGet Members + /// + /// Gets the property value from the specified target. + /// + /// Target object. + /// Property value. + public object Get(object target) + { + if (_canRead) return _emittedGet.Get(target); + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a get method.", _propertyName, _targetType)); + } + #endregion + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedGet = assemblyBuilder.CreateInstance("GetFor" + _targetType.FullName + _propertyName) as IGet; + + nullInternal = GetNullInternal(_propertyType); + + if (_emittedGet == null) + throw new NotSupportedException( + string.Format("Unable to create a get property accessor for \"{0}\".", _propertyType)); + } + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "PropertyAccessorFor.FullTagetTypeName.PropertyName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("GetFor" + _targetType.FullName + _propertyName, + TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing IMemberAccessor. + typeBuilder.AddInterfaceImplementation(typeof(IGet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Get + // Define a method named "Get" for the get operation (IGet). + var getParamTypes = new[] { typeof(object) }; + var methodBuilder = typeBuilder.DefineMethod("Get", + MethodAttributes.Public | MethodAttributes.Virtual, typeof(object), getParamTypes); + // Get an ILGenerator and used it to emit the IL that we want. + var generatorIL = methodBuilder.GetILGenerator(); + + if (_canRead) + { + // Emit the IL for get access. + var targetGetMethod = _targetType.GetMethod("get_" + _propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (targetGetMethod == null) targetGetMethod = _targetType.GetMethod("get_" + _propertyName); + + generatorIL.DeclareLocal(typeof(object)); + generatorIL.Emit(OpCodes.Ldarg_1); //Load the first argument,(target object) + generatorIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type + generatorIL.EmitCall(OpCodes.Call, targetGetMethod, null); //Get the property value + if (targetGetMethod.ReturnType.IsValueType) generatorIL.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box if necessary + generatorIL.Emit(OpCodes.Stloc_0); //Store it + generatorIL.Emit(OpCodes.Ldloc_0); + generatorIL.Emit(OpCodes.Ret); + } + else + { + generatorIL.ThrowException(typeof(MissingMethodException)); + } + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + #region IAccessor Members + /// + /// Gets the property's name. + /// + /// + public string Name => _propertyName; + + /// + /// Gets the property's type. + /// + /// + public Type MemberType => _propertyType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/EmitPropertySetAccessor.cs b/ORBatisCore/Utilities/Objects/Members/EmitPropertySetAccessor.cs new file mode 100644 index 0000000..76094c6 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/EmitPropertySetAccessor.cs @@ -0,0 +1,223 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// The class provides an IL-based set access +/// to a property of a specified target class. +/// +public sealed class EmitPropertySetAccessor : BaseAccessor, ISetAccessor +{ + private readonly bool _canWrite; + + /// + /// The property name + /// + private readonly string _propertyName = string.Empty; + + /// + /// The property type + /// + private readonly Type _propertyType; + + /// + /// The class parent type + /// + private readonly Type _targetType; + + /// + /// The IL emitted ISet + /// + private ISet _emittedSet; + + /// + /// Initializes a new instance of the class. + /// Generates the implementation for setter methods. + /// + /// Type of the target object. + /// Name of the property. + /// The . + /// The . + public EmitPropertySetAccessor(Type targetObjectType, string propertyName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _propertyName = propertyName; + + // deals with Overriding a property using new and reflection + // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx + var propertyInfo = _targetType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (propertyInfo == null) propertyInfo = _targetType.GetProperty(propertyName); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, _targetType)); + + _propertyType = propertyInfo.PropertyType; + _canWrite = propertyInfo.CanWrite; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region ISet Members + /// + /// Sets the property for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + if (_canWrite) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + + _emittedSet.Set(target, newValue); + } + else + { + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a set method.", _propertyName, _targetType)); + } + } + #endregion + + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedSet = assemblyBuilder.CreateInstance("SetFor" + _targetType.FullName + _propertyName) as ISet; + + nullInternal = GetNullInternal(_propertyType); + + if (_emittedSet == null) + throw new NotSupportedException( + string.Format("Unable to create a get propert accessor for '{0}' property on class '{1}'.", _propertyName, _propertyType)); + } + + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "PropertyAccessorFor.FullTagetTypeName.PropertyName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("SetFor" + _targetType.FullName + _propertyName, + TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing IMemberAccessor. + typeBuilder.AddInterfaceImplementation(typeof(ISet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Set + // Define a method named "Set" for the set operation (IMemberAccessor). + var setParamTypes = new[] { typeof(object), typeof(object) }; + var methodBuilder = typeBuilder.DefineMethod("Set", + MethodAttributes.Public | MethodAttributes.Virtual, + null, + setParamTypes); + + // Get an ILGenerator and used to emit the IL that we want. + // Set(object, value); + var generatorIL = methodBuilder.GetILGenerator(); + if (_canWrite) + { + // Emit the IL for the set access. + var targetSetMethod = _targetType.GetMethod("set_" + _propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (targetSetMethod == null) targetSetMethod = _targetType.GetMethod("set_" + _propertyName); + var paramType = targetSetMethod.GetParameters()[0].ParameterType; + + generatorIL.DeclareLocal(paramType); + generatorIL.Emit(OpCodes.Ldarg_1); //Load the first argument (target object) + generatorIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type + generatorIL.Emit(OpCodes.Ldarg_2); //Load the second argument (value object) + if (paramType.IsValueType) + { + generatorIL.Emit(OpCodes.Unbox, paramType); //Unbox it + if (typeToOpcode[paramType] != null) + { + var load = (OpCode)typeToOpcode[paramType]; + generatorIL.Emit(load); //and load + } + else + { + generatorIL.Emit(OpCodes.Ldobj, paramType); + } + } + else + { + generatorIL.Emit(OpCodes.Castclass, paramType); //Cast class + } + + generatorIL.EmitCall(OpCodes.Callvirt, targetSetMethod, null); //Set the property value + generatorIL.Emit(OpCodes.Ret); + } + else + { + generatorIL.ThrowException(typeof(MissingMethodException)); + } + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + #region IAccessor Members + /// + /// Gets the member name. + /// + /// + public string Name => _propertyName; + + /// + /// Gets the type of this member (field or property). + /// + /// + public Type MemberType => _propertyType; + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/GetAccessorFactory.cs b/ORBatisCore/Utilities/Objects/Members/GetAccessorFactory.cs new file mode 100644 index 0000000..f094445 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/GetAccessorFactory.cs @@ -0,0 +1,248 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Text; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// A factory to build for a type. +/// +public class GetAccessorFactory : IGetAccessorFactory +{ + private readonly AssemblyBuilder _assemblyBuilder; + + private readonly IDictionary _cachedIGetAccessor = new HybridDictionary(); + private readonly CreateFieldGetAccessor _createFieldGetAccessor; + + private readonly CreatePropertyGetAccessor _createPropertyGetAccessor; + private readonly ModuleBuilder _moduleBuilder; + private readonly object _syncObject = new(); + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [allow code generation]. + public GetAccessorFactory(bool allowCodeGeneration) + { + if (allowCodeGeneration) + { + // Detect runtime environment and create the appropriate factory + if (Environment.Version.Major >= 2) + { + _createPropertyGetAccessor = CreateDynamicPropertyGetAccessor; + _createFieldGetAccessor = CreateDynamicFieldGetAccessor; + } + else + { + var assemblyName = new AssemblyName(); + assemblyName.Name = "iBATIS.FastGetAccessor" + HashCodeProvider.GetIdentityHashCode(this); + + // Create a new assembly with one module + _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); + + _createPropertyGetAccessor = CreatePropertyAccessor; + _createFieldGetAccessor = CreateFieldAccessor; + } + } + else + { + _createPropertyGetAccessor = CreateReflectionPropertyGetAccessor; + _createFieldGetAccessor = CreateReflectionFieldGetAccessor; + } + } + + #region IGetAccessorFactory Members + /// + /// Generate an instance. + /// + /// Target object type. + /// Field or Property name. + /// null if the generation fail + [MethodImpl(MethodImplOptions.Synchronized)] + public IGetAccessor CreateGetAccessor(Type targetType, string name) + { + var key = new StringBuilder(targetType.FullName).Append(".").Append(name).ToString(); + + if (_cachedIGetAccessor.Contains(key)) return (IGetAccessor)_cachedIGetAccessor[key]; + + IGetAccessor getAccessor = null; + lock (_syncObject) + { + if (!_cachedIGetAccessor.Contains(key)) + { + // Property + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var memberInfo = reflectionCache.GetGetter(name); + + if (memberInfo != null) + { + if (memberInfo is PropertyInfo) + { + getAccessor = _createPropertyGetAccessor(targetType, name); + _cachedIGetAccessor[key] = getAccessor; + } + else + { + getAccessor = _createFieldGetAccessor(targetType, name); + _cachedIGetAccessor[key] = getAccessor; + } + } + else + { + throw new ProbeException( + string.Format("No property or field named \"{0}\" exists for type " + + "{1}.", name, targetType)); + } + } + else + { + getAccessor = (IGetAccessor)_cachedIGetAccessor[key]; + } + } + + return getAccessor; + } + #endregion + + /// + /// Create a Dynamic IGetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreateDynamicPropertyGetAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); + + if (propertyInfo.CanRead) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetGetMethod(); + + if (methodInfo != null) // == visibilty public + return new DelegatePropertyGetAccessor(targetType, propertyName); + + return new ReflectionPropertyGetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be get.", propertyInfo.Name, targetType)); + } + + /// + /// Create a Dynamic IGetAccessor instance for a field + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreateDynamicFieldGetAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); + + if (fieldInfo.IsPublic) return new DelegateFieldGetAccessor(targetType, fieldName); + + return new ReflectionFieldGetAccessor(targetType, fieldName); + } + + + /// + /// Create a IGetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreatePropertyAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); + + if (propertyInfo.CanRead) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetGetMethod(); + if (methodInfo != null) // == visibilty public + return new EmitPropertyGetAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionPropertyGetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be get.", propertyInfo.Name, targetType)); + } + + /// + /// Create a IGetAccessor instance for a field + /// + /// Target object type. + /// Field name. + /// null if the generation fail + private IGetAccessor CreateFieldAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); + + if (fieldInfo.IsPublic) return new EmitFieldGetAccessor(targetType, fieldName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionFieldGetAccessor(targetType, fieldName); + } + + /// + /// Create a Reflection IGetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreateReflectionPropertyGetAccessor(Type targetType, string propertyName) + { + return new ReflectionPropertyGetAccessor(targetType, propertyName); + } + + /// + /// Create Reflection IGetAccessor instance for a field + /// + /// Target object type. + /// field name. + /// null if the generation fail + private IGetAccessor CreateReflectionFieldGetAccessor(Type targetType, string fieldName) + { + return new ReflectionFieldGetAccessor(targetType, fieldName); + } + + private delegate IGetAccessor CreatePropertyGetAccessor(Type targetType, string propertyName); + + private delegate IGetAccessor CreateFieldGetAccessor(Type targetType, string fieldName); +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/Members/SetAccessorFactory.cs b/ORBatisCore/Utilities/Objects/Members/SetAccessorFactory.cs new file mode 100644 index 0000000..d4d315a --- /dev/null +++ b/ORBatisCore/Utilities/Objects/Members/SetAccessorFactory.cs @@ -0,0 +1,247 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Text; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects.Members; + +/// +/// A factory to build for a type. +/// +public class SetAccessorFactory : ISetAccessorFactory +{ + private readonly AssemblyBuilder _assemblyBuilder; + + private readonly IDictionary _cachedISetAccessor = new HybridDictionary(); + private readonly CreateFieldSetAccessor _createFieldSetAccessor; + + private readonly CreatePropertySetAccessor _createPropertySetAccessor; + private readonly ModuleBuilder _moduleBuilder; + private readonly object _syncObject = new(); + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [allow code generation]. + public SetAccessorFactory(bool allowCodeGeneration) + { + if (allowCodeGeneration) + { + // Detect runtime environment and create the appropriate factory + if (Environment.Version.Major >= 2) + { + _createPropertySetAccessor = CreateDynamicPropertySetAccessor; + _createFieldSetAccessor = CreateDynamicFieldSetAccessor; + } + else + { + var assemblyName = new AssemblyName(); + assemblyName.Name = "iBATIS.FastSetAccessor" + HashCodeProvider.GetIdentityHashCode(this); + + // Create a new assembly with one module + _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); + + _createPropertySetAccessor = CreatePropertyAccessor; + _createFieldSetAccessor = CreateFieldAccessor; + } + } + else + { + _createPropertySetAccessor = CreateReflectionPropertySetAccessor; + _createFieldSetAccessor = CreateReflectionFieldSetAccessor; + } + } + + #region ISetAccessorFactory Members + /// + /// Generate an instance. + /// + /// Target object type. + /// Field or Property name. + /// null if the generation fail + [MethodImpl(MethodImplOptions.Synchronized)] + public ISetAccessor CreateSetAccessor(Type targetType, string name) + { + var key = new StringBuilder(targetType.FullName).Append(".").Append(name).ToString(); + + if (_cachedISetAccessor.Contains(key)) return (ISetAccessor)_cachedISetAccessor[key]; + + ISetAccessor setAccessor = null; + lock (_syncObject) + { + if (!_cachedISetAccessor.Contains(key)) + { + // Property + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var memberInfo = reflectionCache.GetSetter(name); + + if (memberInfo != null) + { + if (memberInfo is PropertyInfo) + { + setAccessor = _createPropertySetAccessor(targetType, name); + _cachedISetAccessor[key] = setAccessor; + } + else + { + setAccessor = _createFieldSetAccessor(targetType, name); + _cachedISetAccessor[key] = setAccessor; + } + } + else + { + throw new ProbeException( + string.Format("No property or field named \"{0}\" exists for type " + + "{1}.", name, targetType)); + } + } + else + { + setAccessor = (ISetAccessor)_cachedISetAccessor[key]; + } + } + + return setAccessor; + } + #endregion + + /// + /// Create a Dynamic ISetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private ISetAccessor CreateDynamicPropertySetAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); + + if (propertyInfo.CanWrite) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetSetMethod(); + if (methodInfo != null) // == visibilty public + return new DelegatePropertySetAccessor(targetType, propertyName); + + return new ReflectionPropertySetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be set.", propertyInfo.Name, targetType)); + } + + /// + /// Create a Dynamic ISetAccessor instance for a field + /// + /// Target object type. + /// field name. + /// null if the generation fail + private ISetAccessor CreateDynamicFieldSetAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetSetter(fieldName); + + if (fieldInfo.IsPublic) return new DelegateFieldSetAccessor(targetType, fieldName); + + return new ReflectionFieldSetAccessor(targetType, fieldName); + } + + + /// + /// Create a ISetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private ISetAccessor CreatePropertyAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); + + if (propertyInfo.CanWrite) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetSetMethod(); + if (methodInfo != null) // == visibilty public + return new EmitPropertySetAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionPropertySetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be set.", propertyInfo.Name, targetType)); + } + + /// + /// Create a ISetAccessor instance for a field + /// + /// Target object type. + /// Field name. + /// null if the generation fail + private ISetAccessor CreateFieldAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetSetter(fieldName); + + if (fieldInfo.IsPublic) return new EmitFieldSetAccessor(targetType, fieldName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionFieldSetAccessor(targetType, fieldName); + } + + /// + /// Create a Reflection ISetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private ISetAccessor CreateReflectionPropertySetAccessor(Type targetType, string propertyName) + { + return new ReflectionPropertySetAccessor(targetType, propertyName); + } + + /// + /// Create Reflection ISetAccessor instance for a field + /// + /// Target object type. + /// field name. + /// null if the generation fail + private ISetAccessor CreateReflectionFieldSetAccessor(Type targetType, string fieldName) + { + return new ReflectionFieldSetAccessor(targetType, fieldName); + } + + private delegate ISetAccessor CreatePropertySetAccessor(Type targetType, string propertyName); + + private delegate ISetAccessor CreateFieldSetAccessor(Type targetType, string fieldName); +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Objects/ObjectFactory.cs b/ORBatisCore/Utilities/Objects/ObjectFactory.cs new file mode 100644 index 0000000..9ddf092 --- /dev/null +++ b/ORBatisCore/Utilities/Objects/ObjectFactory.cs @@ -0,0 +1,73 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Reflection; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects; + +/// +/// A factory to create objects +/// +public class ObjectFactory : IObjectFactory +{ + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IObjectFactory _objectFactory; + + /// + /// Constructor + /// + /// + public ObjectFactory(bool allowCodeGeneration) + { + if (allowCodeGeneration) + { + // Detect runtime environment and create the appropriate factory + if (Environment.Version.Major >= 2) + _objectFactory = new DelegateObjectFactory(); + else + _objectFactory = new EmitObjectFactory(); + } + else + { + _objectFactory = new ActivatorObjectFactory(); + } + } + + #region IObjectFactory members + /// + /// Create a new factory instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new instance factory + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + if (_logger.IsDebugEnabled) return new FactoryLogAdapter(typeToCreate, types, _objectFactory.CreateFactory(typeToCreate, types)); + + return _objectFactory.CreateFactory(typeToCreate, types); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisCore/Utilities/Resources.cs b/ORBatisCore/Utilities/Resources.cs new file mode 100644 index 0000000..6dd1d6e --- /dev/null +++ b/ORBatisCore/Utilities/Resources.cs @@ -0,0 +1,557 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408099 $ + * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections.Specialized; +using System.Reflection; +using System.Security.Permissions; +using System.Xml; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Xml; +#endregion + +namespace IBatisNet.Common.Utilities; + +/// +/// A class to simplify access to resources. +/// The file can be loaded from the application root directory +/// (use the resource attribute) +/// or from any valid URL (use the url attribute). +/// For example,to load a fixed path file, use: +/// <properties url=�file:///c:/config/my.properties� /> +/// +public class Resources +{ + #region Fields + //private static CachedTypeResolver _cachedTypeResolver = null; + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + #region Constructor (s) / Destructor + static Resources() + { + //_cachedTypeResolver = new CachedTypeResolver(); + } + #endregion + + #region Inner Class : FileAssemblyInfo + /// + /// Holds data about a and it's + /// attendant . + /// + internal class FileAssemblyInfo + { + #region Constants + /// + /// The string that separates file name + /// from their attendant + /// names in an assembly qualified type name. + /// + public const string FileAssemblySeparator = ","; + #endregion + + #region Constructor (s) / Destructor + /// + /// Creates a new instance of the FileAssemblyInfo class. + /// + /// + /// The unresolved name of a . + /// + public FileAssemblyInfo(string unresolvedFileName) + { + SplitFileAndAssemblyNames(unresolvedFileName); + } + #endregion + + #region Methods + /// + /// + /// + private void SplitFileAndAssemblyNames(string originalFileName) + { + OriginalFileName = originalFileName; + + var separatorIndex = originalFileName.IndexOf(FileAssemblySeparator); + + if (separatorIndex < 0) + { + FileName = originalFileName.Trim(); + AssemblyName = null; // IsAssemblyQualified will return false + } + else + { + FileName = originalFileName.Substring(0, separatorIndex).Trim(); + AssemblyName = originalFileName.Substring(separatorIndex + 1).Trim(); + } + } + #endregion + + #region Properties + /// + /// The resource file name . + /// + public string ResourceFileName => AssemblyName + "." + FileName; + + /// + /// The original name. + /// + public string OriginalFileName { get; private set; } = string.Empty; + + /// + /// The file name portion. + /// + public string FileName { get; private set; } = string.Empty; + + /// + /// The (unresolved, possibly partial) name of the attandant assembly. + /// + public string AssemblyName { get; private set; } = string.Empty; + + /// + /// Is the type name being resolved assembly qualified? + /// + public bool IsAssemblyQualified + { + get + { + if (AssemblyName == null || AssemblyName.Trim().Length == 0) return false; + + return true; + } + } + #endregion + } + #endregion + + #region Properties + /// + /// The name of the directory containing the application + /// + public static string ApplicationBase { get; } = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; + + /// + /// The name of the directory used to probe the assemblies. + /// + public static string BaseDirectory { get; } = AppDomain.CurrentDomain.BaseDirectory; + #endregion + + #region Methods + /// + /// Protocole separator + /// + public const string PROTOCOL_SEPARATOR = "://"; + + /// + /// Strips protocol name from the resource name + /// + /// Name of the resource + /// Name of the resource without protocol name + public static string GetFileSystemResourceWithoutProtocol(string filePath) + { + var pos = filePath.IndexOf(PROTOCOL_SEPARATOR); + if (pos == -1) return filePath; + + // skip forward slashes after protocol name, if any + if (filePath.Length > pos + PROTOCOL_SEPARATOR.Length) + while (filePath[++pos] == '/') + ; + + return filePath.Substring(pos); + } + + /// + /// Get config file + /// + /// + /// A config resource path. + /// + /// An XmlDocument representation of the config file + public static XmlDocument GetConfigAsXmlDocument(string resourcePath) + { + var config = new XmlDocument(); + XmlTextReader reader = null; + resourcePath = GetFileSystemResourceWithoutProtocol(resourcePath); + + if (!FileExists(resourcePath)) resourcePath = Path.Combine(BaseDirectory, resourcePath); + + try + { + reader = new XmlTextReader(resourcePath); + config.Load(reader); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load config file \"{0}\". Cause : {1}", + resourcePath, + e.Message), e); + } + finally + { + if (reader != null) reader.Close(); + } + + return config; + } + + /// + /// Determines whether the specified file exists. + /// + /// The file to check. + /// + /// true if the caller has the required permissions and path contains the name of an existing file + /// false if the caller has the required permissions and path doesn't contain the name of an existing file + /// else exception + /// + public static bool FileExists(string filePath) + { + if (File.Exists(filePath)) + // true if the caller has the required permissions and path contains the name of an existing file; + return true; + + // This method also returns false if the caller does not have sufficient permissions + // to read the specified file, + // no exception is thrown and the method returns false regardless of the existence of path. + // So we check permissiion and throw an exception if no permission + FileIOPermission filePermission = null; + try + { + // filePath must be the absolute path of the file. + filePermission = new FileIOPermission(FileIOPermissionAccess.Read, filePath); + } + catch + { + return false; + } + + try + { + filePermission.Demand(); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("iBATIS doesn't have the right to read the config file \"{0}\". Cause : {1}", + filePath, + e.Message), e); + } + + return false; + } + + + /// + /// Load an XML resource from a location specify by the node. + /// + /// An location node + /// the global properties + /// Return the Xml document load. + public static XmlDocument GetAsXmlDocument(XmlNode node, NameValueCollection properties) + { + XmlDocument xmlDocument = null; + + if (node.Attributes["resource"] != null) + { + var ressource = NodeUtils.ParsePropertyTokens(node.Attributes["resource"].Value, properties); + xmlDocument = GetResourceAsXmlDocument(ressource); + } + else if (node.Attributes["url"] != null) + { + var url = NodeUtils.ParsePropertyTokens(node.Attributes["url"].Value, properties); + xmlDocument = GetUrlAsXmlDocument(url); + } + else if (node.Attributes["embedded"] != null) + { + var embedded = NodeUtils.ParsePropertyTokens(node.Attributes["embedded"].Value, properties); + xmlDocument = GetEmbeddedResourceAsXmlDocument(embedded); + } + + return xmlDocument; + } + + + /// + /// Get the path resource of an url or resource location. + /// + /// The specification from where to load. + /// the global properties + /// + public static string GetValueOfNodeResourceUrl(XmlNode node, NameValueCollection properties) + { + string path = null; + + if (node.Attributes["resource"] != null) + { + var ressource = NodeUtils.ParsePropertyTokens(node.Attributes["resource"].Value, properties); + path = Path.Combine(ApplicationBase, ressource); + } + else if (node.Attributes["url"] != null) + { + var url = NodeUtils.ParsePropertyTokens(node.Attributes["url"].Value, properties); + path = url; + } + + return path; + } + + /// + /// Get XmlDocument from a stream resource + /// + /// + /// + public static XmlDocument GetStreamAsXmlDocument(Stream resource) + { + var config = new XmlDocument(); + + try + { + config.Load(resource); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load XmlDocument via stream. Cause : {0}", + e.Message), e); + } + + return config; + } + + /// + /// Get XmlDocument from a FileInfo resource + /// + /// + /// + public static XmlDocument GetFileInfoAsXmlDocument(FileInfo resource) + { + var config = new XmlDocument(); + + try + { + config.Load(resource.FullName); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load XmlDocument via FileInfo. Cause : {0}", + e.Message), e); + } + + return config; + } + + /// + /// Get XmlDocument from a Uri resource + /// + /// + /// + public static XmlDocument GetUriAsXmlDocument(Uri resource) + { + var config = new XmlDocument(); + + try + { + config.Load(resource.AbsoluteUri); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load XmlDocument via Uri. Cause : {0}", + e.Message), e); + } + + return config; + } + + /// + /// Get XmlDocument from relative (from root directory of the application) path resource + /// + /// + /// + public static XmlDocument GetResourceAsXmlDocument(string resource) + { + var config = new XmlDocument(); + + try + { + config.Load(Path.Combine(ApplicationBase, resource)); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file via resource \"{0}\" as resource. Cause : {1}", + resource, + e.Message), e); + } + + return config; + } + + + /// + /// Get XmlDocument from absolute path resource + /// + /// + /// + public static XmlDocument GetUrlAsXmlDocument(string url) + { + var config = new XmlDocument(); + + try + { + config.Load(url); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file via url \"{0}\" as url. Cause : {1}", + url, + e.Message), e); + } + + return config; + } + + + /// + /// + /// + /// + public static XmlDocument GetEmbeddedResourceAsXmlDocument(string resource) + { + var config = new XmlDocument(); + var isLoad = false; + + var fileInfo = new FileAssemblyInfo(resource); + if (fileInfo.IsAssemblyQualified) + { + Assembly assembly = null; + assembly = Assembly.Load(fileInfo.AssemblyName); + var stream = assembly.GetManifestResourceStream(fileInfo.ResourceFileName); + // JIRA - IBATISNET-103 + if (stream == null) stream = assembly.GetManifestResourceStream(fileInfo.FileName); + if (stream != null) + try + { + config.Load(stream); + isLoad = true; + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file \"{0}\" in embedded resource. Cause : {1}", + resource, + e.Message), e); + } + } + else + { + // bare type name... loop thru all loaded assemblies + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + var stream = assembly.GetManifestResourceStream(fileInfo.FileName); + if (stream != null) + { + try + { + config.Load(stream); + isLoad = true; + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file \"{0}\" in embedded resource. Cause : ", + resource, + e.Message), e); + } + + break; + } + } + } + + if (isLoad == false) + { + _logger.Error("Could not load embedded resource from assembly"); + throw new ConfigurationException( + string.Format("Unable to load embedded resource from assembly \"{0}\".", + fileInfo.OriginalFileName)); + } + + return config; + } + + + /// + /// Load a file from a given resource path + /// + /// + /// The resource path + /// + /// return a FileInfo + public static FileInfo GetFileInfo(string resourcePath) + { + FileInfo fileInfo = null; + resourcePath = GetFileSystemResourceWithoutProtocol(resourcePath); + + if (!FileExists(resourcePath)) resourcePath = Path.Combine(ApplicationBase, resourcePath); + + try + { + //argument : The fully qualified name of the new file, or the relative file name. + fileInfo = new FileInfo(resourcePath); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file \"{0}\". Cause : \"{1}\"", resourcePath, e.Message), e); + } + + return fileInfo; + } + + + /// + /// Resolves the supplied type name into a instance. + /// + /// + /// The (possibly partially assembly qualified) name of a . + /// + /// + /// A resolved instance. + /// + /// + /// If the type cannot be resolved. + /// + [Obsolete("Use IBatisNet.Common.Utilities.TypeUtils")] + public static Type TypeForName(string typeName) + { + return TypeUtils.ResolveType(typeName); + //_cachedTypeResolver.Resolve(className); + } + #endregion +} \ No newline at end of file diff --git a/ORBatisFramework/Commands/DataReaderDecorator.cs b/ORBatisFramework/Commands/DataReaderDecorator.cs new file mode 100644 index 0000000..6ac3a78 --- /dev/null +++ b/ORBatisFramework/Commands/DataReaderDecorator.cs @@ -0,0 +1,491 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 383115 $ + * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Configuration; +using System.Data; +using System.Globalization; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.Commands +{ + /// + /// Decorate an + /// to auto move to next ResultMap on NextResult call. + /// + public class DataReaderDecorator : IDataReader + { + private readonly IDataReader _innerDataReader; + private readonly RequestScope _request; + + /// + /// Initializes a new instance of the class. + /// + /// The data reader. + /// The request scope + public DataReaderDecorator(IDataReader dataReader, RequestScope request) + { + _innerDataReader = dataReader; + _request = request; + } + + #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + void IDisposable.Dispose() + { + _innerDataReader.Dispose(); + } + #endregion + + #region IDataReader Members + /// + /// Closes the 0bject. + /// + void IDataReader.Close() + { + _innerDataReader.Close(); + } + + /// + /// Gets a value indicating the depth of nesting for the current row. + /// + /// + /// The level of nesting. + int IDataReader.Depth => _innerDataReader.Depth; + + /// + /// Returns a that describes the column metadata of the + /// . + /// + /// + /// A that describes the column metadata. + /// + /// The is closed. + DataTable IDataReader.GetSchemaTable() + { + return _innerDataReader.GetSchemaTable(); + } + + /// + /// Gets a value indicating whether the data reader is closed. + /// + /// + /// true if the data reader is closed; otherwise, false. + bool IDataReader.IsClosed => _innerDataReader.IsClosed; + + /// + /// Advances the data reader to the next result, when reading the results of batch SQL statements. + /// + /// + /// true if there are more rows; otherwise, false. + /// + bool IDataReader.NextResult() + { + _request.MoveNextResultMap(); + return _innerDataReader.NextResult(); + } + + /// + /// Advances the to the next record. + /// + /// + /// true if there are more rows; otherwise, false. + /// + bool IDataReader.Read() + { + return _innerDataReader.Read(); + } + + int IDataReader.RecordsAffected => _innerDataReader.RecordsAffected; + #endregion + + #region IDataRecord Members + /// + /// Gets the number of columns in the current row. + /// + /// + /// + /// When not positioned in a valid recordset, 0; otherwise the number of columns in the current record. The + /// default is -1. + /// + int IDataRecord.FieldCount => _innerDataReader.FieldCount; + + /// + /// Gets the value of the specified column as a Boolean. + /// + /// The zero-based column ordinal. + /// The value of the column. + /// + /// The index passed was outside the range of 0 through + /// . + /// + bool IDataRecord.GetBoolean(int i) + { + return _innerDataReader.GetBoolean(i); + } + + /// + /// Gets the 8-bit unsigned integer value of the specified column. + /// + /// The zero-based column ordinal. + /// + /// The 8-bit unsigned integer value of the specified column. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + byte IDataRecord.GetByte(int i) + { + return _innerDataReader.GetByte(i); + } + + /// + /// Reads a stream of bytes from the specified column offset into the buffer as an array, starting at the given buffer + /// offset. + /// + /// The zero-based column ordinal. + /// The index within the field from which to start the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to start the read operation. + /// The number of bytes to read. + /// The actual number of bytes read. + /// + /// The index passed was outside the range of 0 through + /// . + /// + long IDataRecord.GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) + { + return _innerDataReader.GetBytes(i, fieldOffset, buffer, bufferoffset, length); + } + + /// + /// Gets the character value of the specified column. + /// + /// The zero-based column ordinal. + /// + /// The character value of the specified column. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + char IDataRecord.GetChar(int i) + { + return _innerDataReader.GetChar(i); + } + + /// + /// Reads a stream of characters from the specified column offset into the buffer as an array, starting at the given + /// buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the row from which to start the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to start the read operation. + /// The number of bytes to read. + /// The actual number of characters read. + /// + /// The index passed was outside the range of 0 through + /// . + /// + long IDataRecord.GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) + { + return _innerDataReader.GetChars(i, fieldoffset, buffer, bufferoffset, length); + } + + /// + /// Gets an to be used when the field points to more remote structured data. + /// + /// The index of the field to find. + /// + /// An to be used when the field points to more remote structured data. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + IDataReader IDataRecord.GetData(int i) + { + return _innerDataReader.GetData(i); + } + + /// + /// Gets the data type information for the specified field. + /// + /// The index of the field to find. + /// + /// The data type information for the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + string IDataRecord.GetDataTypeName(int i) + { + return _innerDataReader.GetDataTypeName(i); + } + + /// + /// Gets the date and time data value of the specified field. + /// + /// The index of the field to find. + /// + /// The date and time data value of the spcified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + DateTime IDataRecord.GetDateTime(int i) + { + var dateTimeFormat = ConfigurationManager.AppSettings["dateTimeFormat"]; + + if (!string.IsNullOrWhiteSpace(dateTimeFormat) && _innerDataReader.GetFieldType(i) == typeof(string)) return DateTime.ParseExact(_innerDataReader.GetString(i), dateTimeFormat, CultureInfo.InvariantCulture); + + return _innerDataReader.GetDateTime(i); + } + + /// + /// Gets the fixed-position numeric value of the specified field. + /// + /// The index of the field to find. + /// + /// The fixed-position numeric value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + decimal IDataRecord.GetDecimal(int i) + { + return _innerDataReader.GetDecimal(i); + } + + /// + /// Gets the double-precision floating point number of the specified field. + /// + /// The index of the field to find. + /// + /// The double-precision floating point number of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + double IDataRecord.GetDouble(int i) + { + return _innerDataReader.GetDouble(i); + } + + /// + /// Gets the information corresponding to the type of + /// that would be returned from . + /// + /// The index of the field to find. + /// + /// The information corresponding to the type of that + /// would be returned from . + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + Type IDataRecord.GetFieldType(int i) + { + return _innerDataReader.GetFieldType(i); + } + + /// + /// Gets the single-precision floating point number of the specified field. + /// + /// The index of the field to find. + /// + /// The single-precision floating point number of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + float IDataRecord.GetFloat(int i) + { + return _innerDataReader.GetFloat(i); + } + + /// + /// Returns the GUID value of the specified field. + /// + /// The index of the field to find. + /// The GUID value of the specified field. + /// + /// The index passed was outside the range of 0 through + /// . + /// + Guid IDataRecord.GetGuid(int i) + { + return _innerDataReader.GetGuid(i); + } + + /// + /// Gets the 16-bit signed integer value of the specified field. + /// + /// The index of the field to find. + /// + /// The 16-bit signed integer value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + short IDataRecord.GetInt16(int i) + { + return _innerDataReader.GetInt16(i); + } + + /// + /// Gets the 32-bit signed integer value of the specified field. + /// + /// The index of the field to find. + /// + /// The 32-bit signed integer value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + int IDataRecord.GetInt32(int i) + { + return _innerDataReader.GetInt32(i); + } + + /// + /// Gets the 64-bit signed integer value of the specified field. + /// + /// The index of the field to find. + /// + /// The 64-bit signed integer value of the specified field. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + long IDataRecord.GetInt64(int i) + { + return _innerDataReader.GetInt64(i); + } + + /// + /// Gets the name for the field to find. + /// + /// The index of the field to find. + /// + /// The name of the field or the empty string (""), if there is no value to return. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + string IDataRecord.GetName(int i) + { + return _innerDataReader.GetName(i); + } + + /// + /// Return the index of the named field. + /// + /// The name of the field to find. + /// The index of the named field. + int IDataRecord.GetOrdinal(string name) + { + return _innerDataReader.GetOrdinal(name); + } + + /// + /// Gets the string value of the specified field. + /// + /// The index of the field to find. + /// The string value of the specified field. + /// + /// The index passed was outside the range of 0 through + /// . + /// + string IDataRecord.GetString(int i) + { + return _innerDataReader.GetString(i); + } + + /// + /// Return the value of the specified field. + /// + /// The index of the field to find. + /// + /// The which will contain the field value upon return. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + object IDataRecord.GetValue(int i) + { + return _innerDataReader.GetValue(i); + } + + int IDataRecord.GetValues(object[] values) + { + return _innerDataReader.GetValues(values); + } + + /// + /// Return whether the specified field is set to null. + /// + /// The index of the field to find. + /// + /// true if the specified field is set to null. Otherwise, false. + /// + /// + /// The index passed was outside the range of 0 through + /// . + /// + bool IDataRecord.IsDBNull(int i) + { + return _innerDataReader.IsDBNull(i); + } + + /// + /// Gets the with the specified name. + /// + /// + object IDataRecord.this[string name] => _innerDataReader[name]; + + /// + /// Gets the with the specified i. + /// + /// + object IDataRecord.this[int i] => _innerDataReader[i]; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Commands/DataReaderTransformer.cs b/ORBatisFramework/Commands/DataReaderTransformer.cs new file mode 100644 index 0000000..dc1939d --- /dev/null +++ b/ORBatisFramework/Commands/DataReaderTransformer.cs @@ -0,0 +1,51 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.Common; + +namespace IBatisNet.DataMapper.Commands +{ + /// + /// For which don't support M.A.R.S, wraps the current + /// in an . + /// + public sealed class DataReaderTransformer + { + /// + /// Creates a DataReaderAdapter from a + /// + /// The which holds the records from the Database. + /// The databse provider + public static IDataReader Transform(IDataReader reader, IDbProvider dbProvider) + { + if (!dbProvider.AllowMARS && !(reader is InMemoryDataReader)) + // The underlying reader will be closed. + return new InMemoryDataReader(reader); + + return reader; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Commands/DbCommandDecorator.cs b/ORBatisFramework/Commands/DbCommandDecorator.cs new file mode 100644 index 0000000..4b22bf7 --- /dev/null +++ b/ORBatisFramework/Commands/DbCommandDecorator.cs @@ -0,0 +1,233 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 383115 $ + * $Date: 2006-11-15 13:22:00 -0700 (Wed, 15 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.Commands +{ + /// + /// Decorate an + /// to auto move to next ResultMap on ExecuteReader call. + /// + public class DbCommandDecorator : IDbCommand + { + private readonly IDbCommand _innerDbCommand; + private readonly RequestScope _request; + + /// + /// Initializes a new instance of the class. + /// + /// The db command. + /// The request scope + public DbCommandDecorator(IDbCommand dbCommand, RequestScope request) + { + _request = request; + _innerDbCommand = dbCommand; + } + + #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + void IDisposable.Dispose() + { + _innerDbCommand.Dispose(); + } + #endregion + + + #region IDbCommand Members + /// + /// Attempts to cancels the execution of an . + /// + void IDbCommand.Cancel() + { + _innerDbCommand.Cancel(); + } + + /// + /// Gets or sets the text command to run against the data source. + /// + /// + /// The text command to execute. The default value is an empty string (""). + string IDbCommand.CommandText + { + get => _innerDbCommand.CommandText; + set => _innerDbCommand.CommandText = value; + } + + /// + /// Gets or sets the wait time before terminating the attempt to execute a command and generating an error. + /// + /// + /// The time (in seconds) to wait for the command to execute. The default value is 30 seconds. + /// The property value assigned is less than 0. + int IDbCommand.CommandTimeout + { + get => _innerDbCommand.CommandTimeout; + set => _innerDbCommand.CommandTimeout = value; + } + + /// + /// Indicates or specifies how the property is interpreted. + /// + /// + /// One of the values. The default is Text. + CommandType IDbCommand.CommandType + { + get => _innerDbCommand.CommandType; + set => _innerDbCommand.CommandType = value; + } + + /// + /// Gets or sets the used by this instance of the + /// . + /// + /// + /// The connection to the data source. + IDbConnection IDbCommand.Connection + { + get => _innerDbCommand.Connection; + set => _innerDbCommand.Connection = value; + } + + /// + /// Creates a new instance of an object. + /// + /// An IDbDataParameter object. + IDbDataParameter IDbCommand.CreateParameter() + { + return _innerDbCommand.CreateParameter(); + } + + /// + /// Executes an SQL statement against the Connection object of a .NET Framework data provider, and returns the number + /// of rows affected. + /// + /// The number of rows affected. + /// The connection does not exist.-or- The connection is not open. + int IDbCommand.ExecuteNonQuery() + { + _request.Session.OpenConnection(); + return _innerDbCommand.ExecuteNonQuery(); + } + + /// + /// Executes the against the + /// , and builds an + /// using one of the values. + /// + /// One of the values. + /// + /// An object. + /// + IDataReader IDbCommand.ExecuteReader(CommandBehavior behavior) + { + _request.Session.OpenConnection(); + return _innerDbCommand.ExecuteReader(behavior); + } + + /// + /// Executes the against the + /// and builds an . + /// + /// + /// An object. + /// + IDataReader IDbCommand.ExecuteReader() + { + _request.Session.OpenConnection(); + _request.MoveNextResultMap(); + return new DataReaderDecorator(_innerDbCommand.ExecuteReader(), _request); + } + + /// + /// Executes the query, and returns the first column of the first row in the resultset returned by the query. Extra + /// columns or rows are ignored. + /// + /// + /// The first column of the first row in the resultset. + /// + object IDbCommand.ExecuteScalar() + { + _request.Session.OpenConnection(); + return _innerDbCommand.ExecuteScalar(); + } + + /// + /// Gets the . + /// + /// + /// The parameters of the SQL statement or stored procedure. + IDataParameterCollection IDbCommand.Parameters => _innerDbCommand.Parameters; + + /// + /// Creates a prepared (or compiled) version of the command on the data source. + /// + /// + /// The + /// is not set.-or- The is not + /// . + /// + void IDbCommand.Prepare() + { + _innerDbCommand.Prepare(); + } + + /// + /// Gets or sets the transaction within which the Command object of a .NET Framework data provider executes. + /// + /// + /// the Command object of a .NET Framework data provider executes. The default value is null. + IDbTransaction IDbCommand.Transaction + { + get => _innerDbCommand.Transaction; + set => _innerDbCommand.Transaction = value; + } + + /// + /// Gets or sets how command results are applied to the when used by the + /// method of a + /// . + /// + /// + /// + /// One of the values. The default is Both unless the command is + /// automatically generated. Then the default is None. + /// + /// + /// The value entered was not one of the + /// values. + /// + UpdateRowSource IDbCommand.UpdatedRowSource + { + get => _innerDbCommand.UpdatedRowSource; + set => _innerDbCommand.UpdatedRowSource = value; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Commands/DefaultPreparedCommand.cs b/ORBatisFramework/Commands/DefaultPreparedCommand.cs new file mode 100644 index 0000000..accb327 --- /dev/null +++ b/ORBatisFramework/Commands/DefaultPreparedCommand.cs @@ -0,0 +1,203 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 591573 $ + * $Date: 2007-11-03 04:17:59 -0600 (Sat, 03 Nov 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using System.Reflection; +using System.Text; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.Commands +{ + /// + /// Summary description for DefaultPreparedCommand. + /// + internal class DefaultPreparedCommand : IPreparedCommand + { + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + #region IPreparedCommand Members + /// + /// Create an IDbCommand for the SqlMapSession and the current SQL Statement + /// and fill IDbCommand IDataParameter's with the parameterObject. + /// + /// + /// The SqlMapSession + /// The IStatement + /// + /// The parameter object that will fill the sql parameter + /// + /// An IDbCommand with all the IDataParameter filled. + public void Create(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject) + { + // the IDbConnection & the IDbTransaction are assign in the CreateCommand + request.IDbCommand = new DbCommandDecorator(session.CreateCommand(statement.CommandType), request); + + request.IDbCommand.CommandText = request.PreparedStatement.PreparedSql; + + if (_logger.IsDebugEnabled) _logger.Debug("Statement Id: [" + statement.Id + "] PreparedStatement : [" + request.IDbCommand.CommandText + "]"); + + ApplyParameterMap(session, request.IDbCommand, request, statement, parameterObject); + } + + + /// + /// Applies the parameter map. + /// + /// The session. + /// The command. + /// The request. + /// The statement. + /// The parameter object. + protected virtual void ApplyParameterMap + (ISqlMapSession session, IDbCommand command, + RequestScope request, IStatement statement, object parameterObject) + { + var properties = request.PreparedStatement.DbParametersName; + var parameters = request.PreparedStatement.DbParameters; + var paramLogList = new StringBuilder(); // Log info + var typeLogList = new StringBuilder(); // Log info + + var count = properties.Count; + + for (var i = 0; i < count; ++i) + { + var sqlParameter = parameters[i]; + var parameterCopy = command.CreateParameter(); + var property = request.ParameterMap.GetProperty(i); + + #region Logging + if (_logger.IsDebugEnabled) + { + paramLogList.Append(sqlParameter.ParameterName); + paramLogList.Append("=["); + typeLogList.Append(sqlParameter.ParameterName); + typeLogList.Append("=["); + } + #endregion + + if (command.CommandType == CommandType.StoredProcedure) + { + #region store procedure command + // A store procedure must always use a ParameterMap + // to indicate the mapping order of the properties to the columns + if (request.ParameterMap == null) // Inline Parameters + throw new DataMapperException("A procedure statement tag must alway have a parameterMap attribute, which is not the case for the procedure '" + statement.Id + "'."); + + // Parameters via ParameterMap + if (property.DirectionAttribute.Length == 0) property.Direction = sqlParameter.Direction; + + sqlParameter.Direction = property.Direction; + #endregion + } + + #region Logging + if (_logger.IsDebugEnabled) + { + paramLogList.Append(property.PropertyName); + paramLogList.Append(","); + } + #endregion + + request.ParameterMap.SetParameter(property, parameterCopy, parameterObject); + + parameterCopy.Direction = sqlParameter.Direction; + + // With a ParameterMap, we could specify the ParameterDbTypeProperty + if (request.ParameterMap != null) + if (property.DbType != null && property.DbType.Length > 0) + { + var dbTypePropertyName = session.DataSource.DbProvider.ParameterDbTypeProperty; + var propertyValue = ObjectProbe.GetMemberValue(sqlParameter, dbTypePropertyName, request.DataExchangeFactory.AccessorFactory); + ObjectProbe.SetMemberValue(parameterCopy, dbTypePropertyName, propertyValue, + request.DataExchangeFactory.ObjectFactory, request.DataExchangeFactory.AccessorFactory); + } + //parameterCopy.DbType = sqlParameter.DbType; + + //parameterCopy.DbType = sqlParameter.DbType; + #region Logging + if (_logger.IsDebugEnabled) + { + if (parameterCopy.Value == DBNull.Value || parameterCopy.Value == null) + { + paramLogList.Append("null"); + paramLogList.Append("], "); + + if (parameterCopy.Value == null) + typeLogList.Append("null, null"); + else + typeLogList.Append("System.DBNull, null"); + typeLogList.Append("], "); + } + else + { + paramLogList.Append(parameterCopy.Value); + paramLogList.Append("], "); + + // sqlParameter.DbType could be null (as with Npgsql) + // if PreparedStatementFactory did not find a dbType for the parameter in: + // line 225: "if (property.DbType.Length >0)" + // Use parameterCopy.DbType + + //typeLogList.Append( sqlParameter.DbType.ToString() ); + typeLogList.Append(parameterCopy.DbType.ToString()); + typeLogList.Append(", "); + typeLogList.Append(parameterCopy.Value.GetType()); + typeLogList.Append("], "); + } + } + #endregion + + // JIRA-49 Fixes (size, precision, and scale) + if (session.DataSource.DbProvider.SetDbParameterSize) + if (sqlParameter.Size > 0) + parameterCopy.Size = sqlParameter.Size; + + if (session.DataSource.DbProvider.SetDbParameterPrecision) parameterCopy.Precision = sqlParameter.Precision; + + if (session.DataSource.DbProvider.SetDbParameterScale) parameterCopy.Scale = sqlParameter.Scale; + + parameterCopy.ParameterName = sqlParameter.ParameterName; + + command.Parameters.Add(parameterCopy); + } + + #region Logging + if (_logger.IsDebugEnabled && properties.Count > 0) + { + _logger.Debug("Statement Id: [" + statement.Id + "] Parameters: [" + paramLogList.ToString(0, paramLogList.Length - 2) + "]"); + _logger.Debug("Statement Id: [" + statement.Id + "] Types: [" + typeLogList.ToString(0, typeLogList.Length - 2) + "]"); + } + #endregion + } + #endregion + } +} \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/test.config b/ORBatisFramework/Commands/IDbDataParameterCollection.cs similarity index 100% rename from src/IBatisNet.DataAccess.Test/bin/Debug/test.config rename to ORBatisFramework/Commands/IDbDataParameterCollection.cs diff --git a/ORBatisFramework/Commands/IPreparedCommand.cs b/ORBatisFramework/Commands/IPreparedCommand.cs new file mode 100644 index 0000000..e8b4de7 --- /dev/null +++ b/ORBatisFramework/Commands/IPreparedCommand.cs @@ -0,0 +1,51 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.Commands +{ + /// + /// Summary description for IPreparedCommand. + /// + public interface IPreparedCommand + { + /// + /// Create an IDbCommand for the SqlMapSession and the current SQL Statement + /// and fill IDbCommand IDataParameter's with the parameterObject. + /// + /// + /// The SqlMapSession + /// The IStatement + /// + /// The parameter object that will fill the sql parameter + /// + /// An IDbCommand with all the IDataParameter filled. + void Create(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject); + } +} \ No newline at end of file diff --git a/ORBatisFramework/Commands/InMemoryDataReader.cs b/ORBatisFramework/Commands/InMemoryDataReader.cs new file mode 100644 index 0000000..80ad0e9 --- /dev/null +++ b/ORBatisFramework/Commands/InMemoryDataReader.cs @@ -0,0 +1,581 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-26 14:12:57 -0600 (Wed, 26 Apr 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Data; +using IBatisNet.Common; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.Commands +{ + /// + /// An implementation of that will copy the contents + /// of the an open to an in-memory if the + /// session doesn't allow multiple open with + /// the same . + /// + public class InMemoryDataReader : IDataReader + { + private int _currentRowIndex; + + private InMemoryResultSet[] _results; + + + /// + /// Creates an InMemoryDataReader from a + /// + /// The which holds the records from the Database. + public InMemoryDataReader(IDataReader reader) + { + var resultList = new ArrayList(); + + try + { + Depth = 0; + _currentRowIndex = 0; + + resultList.Add(new InMemoryResultSet(reader, true)); + + while (reader.NextResult()) resultList.Add(new InMemoryResultSet(reader, false)); + + _results = (InMemoryResultSet[])resultList.ToArray(typeof(InMemoryResultSet)); + } + catch (Exception e) + { + throw new DataMapperException("There was a problem converting an IDataReader to an InMemoryDataReader", e); + } + finally + { + reader.Close(); + reader.Dispose(); + } + } + + + /// + /// Gets the current result set. + /// + /// The current result set. + private InMemoryResultSet CurrentResultSet => _results[Depth]; + + #region IDisposable Members + /// + /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. + /// + public void Dispose() + { + IsClosed = true; + _results = null; + } + #endregion + + /// + /// Represent an in-memory result set + /// + private class InMemoryResultSet + { + private readonly string[] _dataTypeName; + + private readonly string[] _fieldsName; + private readonly StringDictionary _fieldsNameLookup = new StringDictionary(); + + private readonly Type[] _fieldsType; + + // [row][column] + private readonly object[][] _records; + + /// + /// Creates an in-memory ResultSet from a + /// + /// + /// true if the is already positioned on the record + /// to start reading from. + /// + /// The which holds the records from the Database. + public InMemoryResultSet(IDataReader reader, bool isMidstream) + { + // [record index][ columns values=object[ ] ] + var recordsList = new ArrayList(); + + FieldCount = reader.FieldCount; + _fieldsName = new string[FieldCount]; + _fieldsType = new Type[FieldCount]; + _dataTypeName = new string[FieldCount]; + + + var firstRow = true; + + // if we are in the middle of processing the reader then don't bother + // to move to the next record - just use the current one. + // Copy the records in memory + while (isMidstream || reader.Read()) + { + if (firstRow) + for (var fieldIndex = 0; fieldIndex < reader.FieldCount; fieldIndex++) + { + var fieldName = reader.GetName(fieldIndex); + + _fieldsName[fieldIndex] = fieldName; + if (!_fieldsNameLookup.ContainsKey(fieldName)) _fieldsNameLookup.Add(fieldName, fieldIndex.ToString()); + + _fieldsType[fieldIndex] = reader.GetFieldType(fieldIndex); + _dataTypeName[fieldIndex] = reader.GetDataTypeName(fieldIndex); + } + + firstRow = false; + + var columnsValues = new object[FieldCount]; + reader.GetValues(columnsValues); + recordsList.Add(columnsValues); + + isMidstream = false; + } + + _records = (object[][])recordsList.ToArray(typeof(object[])); + } + + /// + /// Gets the number of columns in the current row. + /// + /// The number of columns in the current row. + public int FieldCount { get; } + + /// + /// The number of record contained in the ResultSet. + /// + public int RecordCount => _records.Length; + + /// + /// Get a column value in a row + /// + /// The row index + /// The column index + /// The column value + public object GetValue(int rowIndex, int colIndex) + { + return _records[rowIndex][colIndex]; + } + + + /// + /// Gets the type of the field. + /// + /// Index of the col. + /// The type of the field. + public Type GetFieldType(int colIndex) + { + return _fieldsType[colIndex]; + } + + /// + /// Gets the name of the field. + /// + /// Index of the col. + /// The name of the field. + public string GetName(int colIndex) + { + return _fieldsName[colIndex]; + } + + /// + /// Gets the ordinal. + /// + /// Name of the column. + /// The ordinal of the column + public int GetOrdinal(string colName) + { + if (_fieldsNameLookup.ContainsKey(colName)) return Convert.ToInt32(_fieldsNameLookup[colName]); + + throw new IndexOutOfRangeException(string.Format("No column with the specified name was found: {0}.", colName)); + } + + /// + /// Gets the name of the database type. + /// + /// Index of the col. + /// The name of the database type + public string GetDataTypeName(int colIndex) + { + return _dataTypeName[colIndex]; + } + + + /// + /// Gets the values. + /// + /// Index of the row. + /// The values. + /// + public int GetValues(int rowIndex, object[] values) + { + Array.Copy(_records[rowIndex], 0, values, 0, FieldCount); + return FieldCount; + } + } + + + #region IDataReader Members + /// + /// Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. + /// + public int RecordsAffected => throw new NotImplementedException("InMemoryDataReader only used for select IList statements !"); + + /// + /// Gets a value indicating whether the data reader is closed. + /// + public bool IsClosed { get; private set; } + + /// + /// Advances the data reader to the next result, when reading the results of batch SQL statements. + /// + /// + public bool NextResult() + { + Depth++; + if (Depth >= _results.Length) + { + Depth--; + return false; + } + + return true; + } + + /// + /// Closes the IDataReader 0bject. + /// + public void Close() + { + IsClosed = true; + } + + /// + /// Advances the IDataReader to the next record. + /// + /// true if there are more rows; otherwise, false. + public bool Read() + { + _currentRowIndex++; + if (_currentRowIndex >= _results[Depth].RecordCount) + { + _currentRowIndex--; + return false; + } + + return true; + } + + /// + /// Gets a value indicating the depth of nesting for the current row. + /// + public int Depth { get; private set; } + + /// + /// Returns a DataTable that describes the column metadata of the IDataReader. + /// + /// + public DataTable GetSchemaTable() + { + throw new NotImplementedException("GetSchemaTable() is not implemented, cause not use."); + } + #endregion + + #region IDataRecord Members + /// + /// Gets the 32-bit signed integer value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public int GetInt32(int fieldIndex) + { + return (int)GetValue(fieldIndex); + } + + /// + /// Gets the column with the specified name. + /// + public object this[string name] => this[GetOrdinal(name)]; + + /// + /// Gets the column located at the specified index. + /// + public object this[int fieldIndex] => GetValue(fieldIndex); + + /// + /// Return the value of the specified field. + /// + /// The index of the field to find. + /// The object which will contain the field value upon return. + public object GetValue(int fieldIndex) + { + return CurrentResultSet.GetValue(_currentRowIndex, fieldIndex); + } + + /// + /// Return whether the specified field is set to null. + /// + /// The zero-based column ordinal. + /// The value of the column. + public bool IsDBNull(int fieldIndex) + { + return GetValue(fieldIndex) == DBNull.Value; + } + + /// + /// Reads a stream of bytes from the specified column offset into the buffer as an array, + /// starting at the given buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the field from which to begin the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to begin the read operation. + /// The number of bytes to read. + /// The actual number of bytes read. + public long GetBytes(int fieldIndex, long dataIndex, byte[] buffer, int bufferIndex, int length) + { + var value = GetValue(fieldIndex); + if (!(value is byte[])) throw new InvalidCastException("Type is " + value.GetType()); + + if (buffer == null) + // Return length of data + return ((byte[])value).Length; + + // Copy data into buffer + var availableLength = (int)(((byte[])value).Length - dataIndex); + if (availableLength < length) length = availableLength; + + Array.Copy((byte[])value, (int)dataIndex, buffer, bufferIndex, length); + return length; + } + + + /// + /// Gets the 8-bit unsigned integer value of the specified column. + /// + /// The zero-based column ordinal. + /// The value of the column. + public byte GetByte(int fieldIndex) + { + return (byte)GetValue(fieldIndex); + } + + /// + /// Gets the Type information corresponding to the type of Object that would be returned from GetValue. + /// + /// The zero-based column ordinal. + /// The value of the column. + public Type GetFieldType(int fieldIndex) + { + return CurrentResultSet.GetFieldType(fieldIndex); + } + + /// + /// Gets the fixed-position numeric value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public decimal GetDecimal(int fieldIndex) + { + return (decimal)GetValue(fieldIndex); + } + + /// + /// Gets all the attribute fields in the collection for the current record. + /// + /// + /// + public int GetValues(object[] values) + { + return CurrentResultSet.GetValues(_currentRowIndex, values); + } + + /// + /// Gets the name for the field to find. + /// + /// The zero-based column ordinal. + /// The value of the column. + public string GetName(int fieldIndex) + { + return CurrentResultSet.GetName(fieldIndex); + } + + /// + /// Indicates the number of fields within the current record. This property is read-only. + /// + public int FieldCount => CurrentResultSet.FieldCount; + + /// + /// + /// The zero-based column ordinal. + /// The value of the column. + public long GetInt64(int fieldIndex) + { + return (long)GetValue(fieldIndex); + } + + /// + /// + /// The zero-based column ordinal. + /// The value of the column. + public double GetDouble(int fieldIndex) + { + return (double)GetValue(fieldIndex); + } + + /// + /// Gets the value of the specified column as a Boolean. + /// + /// The zero-based column ordinal. + /// The value of the column. + public bool GetBoolean(int fieldIndex) + { + return (bool)GetValue(fieldIndex); + } + + /// + /// Returns the GUID value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public Guid GetGuid(int fieldIndex) + { + return (Guid)GetValue(fieldIndex); + } + + /// + /// Returns the value of the specified column as a DateTime object. + /// + /// The zero-based column ordinal. + /// The value of the column. + public DateTime GetDateTime(int fieldIndex) + { + return (DateTime)GetValue(fieldIndex); + } + + /// + /// Returns the column ordinal, given the name of the column. + /// + /// The name of the column. + /// The value of the column. + public int GetOrdinal(string colName) + { + return CurrentResultSet.GetOrdinal(colName); + } + + /// + /// Gets the database type information for the specified field. + /// + /// The index of the field to find. + /// The database type information for the specified field. + public string GetDataTypeName(int fieldIndex) + { + return CurrentResultSet.GetDataTypeName(fieldIndex); + } + + /// + /// Returns the value of the specified column as a single-precision floating point number. + /// + /// The zero-based column ordinal. + /// The value of the column. + public float GetFloat(int fieldIndex) + { + return (float)GetValue(fieldIndex); + } + + /// + /// Gets an IDataReader to be used when the field points to more remote structured data. + /// + /// The zero-based column ordinal. + /// The value of the column. + public IDataReader GetData(int fieldIndex) + { + throw new NotImplementedException("GetData(int) is not implemented, cause not use."); + } + + /// + /// Reads a stream of characters from the specified column offset into the buffer as an array, + /// starting at the given buffer offset. + /// + /// The zero-based column ordinal. + /// The index within the row from which to begin the read operation. + /// The buffer into which to read the stream of bytes. + /// The index for buffer to begin the read operation. + /// The number of bytes to read. + /// The actual number of characters read. + public long GetChars(int fieldIndex, long dataIndex, char[] buffer, int bufferIndex, int length) + { + var value = GetValue(fieldIndex); + char[] valueBuffer = null; + + if (value is char[]) + valueBuffer = (char[])value; + else if (value is string) + valueBuffer = ((string)value).ToCharArray(); + else + throw new InvalidCastException("Type is " + value.GetType()); + + if (buffer == null) + // Return length of data + return valueBuffer.Length; + + // Copy data into buffer + Array.Copy(valueBuffer, (int)dataIndex, buffer, bufferIndex, length); + return valueBuffer.Length - dataIndex; + } + + /// + /// Gets the string value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public string GetString(int fieldIndex) + { + return (string)GetValue(fieldIndex); + } + + /// + /// Gets the character value of the specified column. + /// + /// The zero-based column ordinal. + /// The value of the column. + public char GetChar(int fieldIndex) + { + return (char)GetValue(fieldIndex); + } + + /// + /// Gets the 16-bit signed integer value of the specified field. + /// + /// The zero-based column ordinal. + /// The value of the column. + public short GetInt16(int fieldIndex) + { + return (short)GetValue(fieldIndex); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Commands/PreparedCommandFactory.cs b/ORBatisFramework/Commands/PreparedCommandFactory.cs new file mode 100644 index 0000000..56ada51 --- /dev/null +++ b/ORBatisFramework/Commands/PreparedCommandFactory.cs @@ -0,0 +1,52 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 512878 $ + * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - Gilles Bayon + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.Commands +{ + /// + /// Summary description for PreparedCommandFactory. + /// + internal sealed class PreparedCommandFactory + { + /// + /// Get an IPreparedCommand. + /// + /// + public static IPreparedCommand GetPreparedCommand(bool isEmbedStatementParams) + { + IPreparedCommand preparedCommand = null; + +// if (isEmbedStatementParams) +// { +// preparedCommand = new EmbedParamsPreparedCommand(); +// } +// else +// { + preparedCommand = new DefaultPreparedCommand(); +// } + + return preparedCommand; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Alias/TypeAlias.cs b/ORBatisFramework/Configuration/Alias/TypeAlias.cs new file mode 100644 index 0000000..4884a8d --- /dev/null +++ b/ORBatisFramework/Configuration/Alias/TypeAlias.cs @@ -0,0 +1,116 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 408099 $ + * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Xml.Serialization; +using IBatisNet.Common.Utilities; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Alias +{ + /// + /// TypeAlias. + /// + [Serializable] + [XmlRoot("typeAlias", Namespace = "http://ibatis.apache.org/dataMapper")] + public class TypeAlias + { + #region Methods + /// + /// Initialize the object, + /// try to idenfify the .Net type class from the corresponding name. + /// + public void Initialize() + { + _class = TypeUtils.ResolveType(_className); + } + #endregion + + #region Fields + [NonSerialized] private string _name = string.Empty; + + [NonSerialized] private string _className = string.Empty; + + [NonSerialized] private Type _class; + #endregion + + #region Properties + /// + /// Name used to identify the typeAlias amongst the others. + /// + /// Account + [XmlAttribute("alias")] + public string Name + { + get => _name; + set + { + if (value == null || value.Length < 1) throw new ArgumentNullException("The name attribute is mandatory in the typeAlias "); + _name = value; + } + } + + + /// + /// The type class for the typeAlias + /// + [XmlIgnore] + public Type Class => _class; + + + /// + /// The class name to identify the typeAlias. + /// + /// Com.Site.Domain.Product + [XmlAttribute("type")] + public string ClassName + { + get => _className; + set + { + if (value == null || value.Length < 1) throw new ArgumentNullException("The class attribute is mandatory in the typeAlias " + _name); + _className = value; + } + } + #endregion + + #region Constructor (s) / Destructor + /// + /// Do not use direclty, only for serialization. + /// + public TypeAlias() { } + + /// + /// Constructor + /// + /// a type. + public TypeAlias(Type type) + { + _class = type; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Alias/TypeHandler.cs b/ORBatisFramework/Configuration/Alias/TypeHandler.cs new file mode 100644 index 0000000..cd6f3fe --- /dev/null +++ b/ORBatisFramework/Configuration/Alias/TypeHandler.cs @@ -0,0 +1,107 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 408099 $ + * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Xml.Serialization; +using IBatisNet.Common.Utilities; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Alias +{ + /// + /// Summary description for TypeHandler. + /// + [Serializable] + [XmlRoot("typeHandler", Namespace = "http://ibatis.apache.org/dataMapper")] + public class TypeHandler + { + #region Constructors + /// + /// Do not use direclty, only for serialization. + /// + public TypeHandler() { } + #endregion + + #region Methods + /// + /// Initialize the object, + /// try to idenfify the .Net type class from the corresponding name. + /// + public void Initialize() + { + _class = TypeUtils.ResolveType(_className); + } + #endregion + #region Fields + [NonSerialized] private string _className = string.Empty; + + [NonSerialized] private Type _class; + + [NonSerialized] private string _dbType = string.Empty; + + [NonSerialized] private string _callBackName = string.Empty; + #endregion + + #region Properties + /// + /// CLR type + /// + [XmlAttribute("type")] + public string ClassName + { + get => _className; + set => _className = value; + } + + /// + /// The type class for the TypeName + /// + [XmlIgnore] + public Type Class => _class; + + /// + /// dbType name + /// + [XmlAttribute("dbType")] + public string DbType + { + get => _dbType; + set => _dbType = value; + } + + + /// + /// callback alias name + /// + [XmlAttribute("callback")] + public string CallBackName + { + get => _callBackName; + set => _callBackName = value; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/CacheKey.cs b/ORBatisFramework/Configuration/Cache/CacheKey.cs new file mode 100644 index 0000000..847e54d --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/CacheKey.cs @@ -0,0 +1,150 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 451064 $ + * $Date: 2006-09-28 17:53:56 -0600 (Thu, 28 Sep 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2005 - iBATIS Team + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Text; +using IBatisNet.Common.Utilities; + +namespace IBatisNet.DataMapper.Configuration.Cache +{ + /// + /// Hash value generator for cache keys + /// + public class CacheKey + { + private const int DEFAULT_MULTIPLYER = 37; + private const int DEFAULT_HASHCODE = 17; + + private readonly int _multiplier = DEFAULT_MULTIPLYER; + private readonly IList _paramList = new ArrayList(); + private long _checksum = long.MinValue; + private int _count; + private int _hashCode = DEFAULT_HASHCODE; + + /// + /// Default constructor + /// + public CacheKey() + { + _hashCode = DEFAULT_HASHCODE; + _multiplier = DEFAULT_MULTIPLYER; + _count = 0; + } + + /// + /// Constructor that supplies an initial hashcode + /// + /// the hashcode to use + public CacheKey(int initialNonZeroOddNumber) + { + _hashCode = initialNonZeroOddNumber; + _multiplier = DEFAULT_MULTIPLYER; + _count = 0; + } + + /// + /// Constructor that supplies an initial hashcode and multiplier + /// + /// the hashcode to use + /// the multiplier to use + public CacheKey(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber) + { + _hashCode = initialNonZeroOddNumber; + _multiplier = multiplierNonZeroOddNumber; + _count = 0; + } + + /// + /// Updates this object with new information based on an object + /// + /// the object + /// the cachekey + public CacheKey Update(object obj) + { + var baseHashCode = HashCodeProvider.GetIdentityHashCode(obj); + + _count++; + _checksum += baseHashCode; + baseHashCode *= _count; + + _hashCode = _multiplier * _hashCode + baseHashCode; + + _paramList.Add(obj); + + return this; + } + + /// + /// + /// + /// + public override bool Equals(object obj) + { + if (this == obj) return true; + if (!(obj is CacheKey)) return false; + + var cacheKey = (CacheKey)obj; + + if (_hashCode != cacheKey._hashCode) return false; + if (_checksum != cacheKey._checksum) return false; + if (_count != cacheKey._count) return false; + + var count = _paramList.Count; + for (var i = 0; i < count; i++) + { + var thisParam = _paramList[i]; + var thatParam = cacheKey._paramList[i]; + if (thisParam == null) + { + if (thatParam != null) return false; + } + else + { + if (!thisParam.Equals(thatParam)) return false; + } + } + + return true; + } + + /// + /// Get the HashCode for this CacheKey + /// + /// + public override int GetHashCode() + { + return _hashCode; + } + + /// + /// ToString implementation. + /// + /// A string that give the CacheKey HashCode. + public override string ToString() + { + return new StringBuilder().Append(_hashCode).Append('|').Append(_checksum).ToString(); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/CacheModel.cs b/ORBatisFramework/Configuration/Cache/CacheModel.cs new file mode 100644 index 0000000..9067854 --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/CacheModel.cs @@ -0,0 +1,371 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 575913 $ + * $LastChangedDate: 2007-09-15 06:43:08 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.Serialization.Formatters.Binary; +using System.Xml.Serialization; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache +{ + /// + /// Summary description for CacheModel. + /// + [Serializable] + [XmlRoot("cacheModel", Namespace = "http://ibatis.apache.org/mapping")] + public class CacheModel + { + #region Constructor (s) / Destructor + /// + /// Constructor + /// + public CacheModel() + { + _lastFlush = DateTime.Now.Ticks; + } + #endregion + + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.Synchronized)] + public object GetLock(CacheKey key) + { + var controllerId = HashCodeProvider.GetIdentityHashCode(_controller); + var keyHash = key.GetHashCode(); + var lockKey = 29 * controllerId + keyHash; + var lok = _lockMap[lockKey]; + if (lok == null) + { + lok = lockKey; //might as well use the same object + _lockMap[lockKey] = lok; + } + + return lok; + } + + #region Fields + private static IDictionary _lockMap = new HybridDictionary(); + + [NonSerialized] private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// This is used to represent null objects that are returned from the cache so + /// that they can be cached, too. + /// + [NonSerialized] public static readonly object NULL_OBJECT = new object(); + + /// + /// Constant to turn off periodic cache flushes + /// + [NonSerialized] public const long NO_FLUSH_INTERVAL = -99999; + + [NonSerialized] private object _statLock = new object(); + + [NonSerialized] private int _requests; + + [NonSerialized] private int _hits; + + [NonSerialized] private string _id = string.Empty; + + [NonSerialized] private ICacheController _controller; + + [NonSerialized] private FlushInterval _flushInterval; + + [NonSerialized] private long _lastFlush; + + [NonSerialized] private HybridDictionary _properties = new HybridDictionary(); + + [NonSerialized] private string _implementation = string.Empty; + + [NonSerialized] private bool _isReadOnly = true; + + [NonSerialized] private bool _isSerializable; + #endregion + + #region Properties + /// + /// Identifier used to identify the CacheModel amongst the others. + /// + [XmlAttribute("id")] + public string Id + { + get => _id; + set + { + if (value == null || value.Length < 1) + throw new ArgumentNullException("The id attribute is mandatory in a cacheModel tag."); + + _id = value; + } + } + + /// + /// Cache controller implementation name. + /// + [XmlAttribute("implementation")] + public string Implementation + { + get => _implementation; + set + { + if (value == null || value.Length < 1) + throw new ArgumentNullException("The implementation attribute is mandatory in a cacheModel tag."); + + _implementation = value; + } + } + + /// + /// Set the cache controller + /// + public ICacheController CacheController + { + set => _controller = value; + } + + /// + /// Set or get the flushInterval (in Ticks) + /// + [XmlElement("flushInterval", typeof(FlushInterval))] + public FlushInterval FlushInterval + { + get => _flushInterval; + set => _flushInterval = value; + } + + /// + /// Specifie how the cache content should be returned. + /// If true a deep copy is returned. + /// + /// + /// Combinaison + /// IsReadOnly=true/IsSerializable=false : Returned instance of cached object + /// IsReadOnly=false/IsSerializable=true : Returned coopy of cached object + /// + public bool IsSerializable + { + get => _isSerializable; + set => _isSerializable = value; + } + + /// + /// Determines if the cache will be used as a read-only cache. + /// Tells the cache model that is allowed to pass back a reference to the object + /// existing in the cache. + /// + /// + /// The IsReadOnly properties works in conjonction with the IsSerializable propertie. + /// + public bool IsReadOnly + { + get => _isReadOnly; + set => _isReadOnly = value; + } + #endregion + + #region Methods + /// + /// + public void Initialize() + { + // Initialize FlushInterval + _flushInterval.Initialize(); + + try + { + if (_implementation == null) throw new DataMapperException("Error instantiating cache controller for cache named '" + _id + "'. Cause: The class for name '" + _implementation + "' could not be found."); + + // Build the CacheController + var type = TypeUtils.ResolveType(_implementation); + var arguments = new object[0]; + + _controller = (ICacheController)Activator.CreateInstance(type, arguments); + } + catch (Exception e) + { + throw new ConfigurationException("Error instantiating cache controller for cache named '" + _id + ". Cause: " + e.Message, e); + } + + //------------ configure Controller--------------------- + try + { + _controller.Configure(_properties); + } + catch (Exception e) + { + throw new ConfigurationException("Error configuring controller named '" + _id + "'. Cause: " + e.Message, e); + } + } + + + /// + /// Event listener + /// + /// A MappedStatement on which we listen ExecuteEventArgs event. + public void RegisterTriggerStatement(IMappedStatement mappedStatement) + { + mappedStatement.Execute += FlushHandler; + } + + + /// + /// FlushHandler which clear the cache + /// + /// + /// + private void FlushHandler(object sender, ExecuteEventArgs e) + { + if (_logger.IsDebugEnabled) _logger.Debug("Flush cacheModel named " + _id + " for statement '" + e.StatementName + "'"); + + Flush(); + } + + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + _lastFlush = DateTime.Now.Ticks; + _controller.Flush(); + } + + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + /// + /// A side effect of this method is that is may clear the cache + /// if it has not been cleared in the flushInterval. + /// + public object this[CacheKey key] + { + get + { + lock (this) + { + if (_lastFlush != NO_FLUSH_INTERVAL + && DateTime.Now.Ticks - _lastFlush > _flushInterval.Interval) + Flush(); + } + + object value = null; + lock (GetLock(key)) + { + value = _controller[key]; + } + + if (_isSerializable && !_isReadOnly && + value != NULL_OBJECT && value != null) + try + { + var stream = new MemoryStream((byte[])value); + stream.Position = 0; + var formatter = new BinaryFormatter(); + value = formatter.Deserialize(stream); + } + catch (Exception ex) + { + throw new IBatisNetException("Error caching serializable object. Be sure you're not attempting to use " + + "a serialized cache for an object that may be taking advantage of lazy loading. Cause: " + ex.Message, ex); + } + + lock (_statLock) + { + _requests++; + if (value != null) _hits++; + } + + if (_logger.IsDebugEnabled) + { + if (value != null) + _logger.Debug(string.Format("Retrieved cached object '{0}' using key '{1}' ", value, key)); + else + _logger.Debug(string.Format("Cache miss using key '{0}' ", key)); + } + + return value; + } + set + { + if (null == value) value = NULL_OBJECT; + if (_isSerializable && !_isReadOnly && value != NULL_OBJECT) + try + { + var stream = new MemoryStream(); + var formatter = new BinaryFormatter(); + formatter.Serialize(stream, value); + value = stream.ToArray(); + } + catch (Exception ex) + { + throw new IBatisNetException("Error caching serializable object. Cause: " + ex.Message, ex); + } + + _controller[key] = value; + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Cache object '{0}' using key '{1}' ", value, key)); + } + } + + /// + /// + public double HitRatio + { + get + { + if (_requests != 0) return _hits / (double)_requests; + + return 0; + } + } + + + /// + /// Add a property + /// + /// The name of the property + /// The value of the property + public void AddProperty(string name, string value) + { + _properties.Add(name, value); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/Fifo/FifoCacheController.cs b/ORBatisFramework/Configuration/Cache/Fifo/FifoCacheController.cs new file mode 100644 index 0000000..c8d4ac5 --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/Fifo/FifoCacheController.cs @@ -0,0 +1,112 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Fifo +{ + /// + /// Summary description for FifoCacheController. + /// + public class FifoCacheController : ICacheController + { + #region Constructor (s) / Destructor + /// + /// + public FifoCacheController() + { + _cacheSize = 100; + _cache = Hashtable.Synchronized(new Hashtable()); + _keyList = ArrayList.Synchronized(new ArrayList()); + } + #endregion + #region Fields + private int _cacheSize; + private readonly Hashtable _cache; + private readonly IList _keyList; + #endregion + + #region ICacheController Members + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + public object Remove(object key) + { + var o = this[key]; + + _keyList.Remove(key); + _cache.Remove(key); + return o; + } + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + _cache.Clear(); + _keyList.Clear(); + } + + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + public object this[object key] + { + get => _cache[key]; + set + { + _cache[key] = value; + _keyList.Add(key); + if (_keyList.Count > _cacheSize) + { + var oldestKey = _keyList[0]; + _keyList.Remove(0); + _cache.Remove(oldestKey); + } + } + } + + + /// + /// Configures the cache + /// + public void Configure(IDictionary properties) + { + var size = (string)properties["CacheSize"]; + ; + if (size != null) _cacheSize = Convert.ToInt32(size); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/FlushInterval.cs b/ORBatisFramework/Configuration/Cache/FlushInterval.cs new file mode 100644 index 0000000..8ef12e2 --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/FlushInterval.cs @@ -0,0 +1,116 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 707150 $ + * $Date: 2008-10-22 11:54:18 -0600 (Wed, 22 Oct 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Xml.Serialization; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache +{ + /// + /// Summary description for FlushInterval. + /// + [Serializable] + [XmlRoot("flushInterval")] + public class FlushInterval + { + #region Methods + /// + /// Calcul the flush interval value in ticks + /// + public void Initialize() + { + long interval = 0; + if (_milliseconds != 0) interval += _milliseconds * TimeSpan.TicksPerMillisecond; + if (_seconds != 0) interval += _seconds * TimeSpan.TicksPerSecond; + if (_minutes != 0) interval += _minutes * TimeSpan.TicksPerMinute; + if (_hours != 0) interval += _hours * TimeSpan.TicksPerHour; + + if (interval == 0) interval = CacheModel.NO_FLUSH_INTERVAL; + Interval = interval; + } + #endregion + + #region Fields + private int _hours; + private int _minutes; + private int _seconds; + private int _milliseconds; + #endregion + + #region Properties + /// + /// Flush interval in hours + /// + [XmlAttribute("hours")] + public int Hours + { + get => _hours; + set => _hours = value; + } + + + /// + /// Flush interval in minutes + /// + [XmlAttribute("minutes")] + public int Minutes + { + get => _minutes; + set => _minutes = value; + } + + + /// + /// Flush interval in seconds + /// + [XmlAttribute("seconds")] + public int Seconds + { + get => _seconds; + set => _seconds = value; + } + + + /// + /// Flush interval in milliseconds + /// + [XmlAttribute("milliseconds")] + public int Milliseconds + { + get => _milliseconds; + set => _milliseconds = value; + } + + + /// + /// Get the flush interval value + /// + [XmlIgnoreAttribute] + public long Interval { get; private set; } = CacheModel.NO_FLUSH_INTERVAL; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/ICacheController.cs b/ORBatisFramework/Configuration/Cache/ICacheController.cs new file mode 100644 index 0000000..ec5a321 --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/ICacheController.cs @@ -0,0 +1,66 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache +{ + /// + /// Summary description for ICacheController. + /// + public interface ICacheController + { + #region Properties + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + object this[object key] { get; set; } + #endregion + + #region Methods + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + object Remove(object key); + + /// + /// Clears all elements from the cache. + /// + void Flush(); + + /// + /// Configures the CacheController + /// + /// + void Configure(IDictionary properties); + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/Lru/LruCacheController.cs b/ORBatisFramework/Configuration/Cache/Lru/LruCacheController.cs new file mode 100644 index 0000000..88edfc4 --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/Lru/LruCacheController.cs @@ -0,0 +1,117 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Lru +{ + /// + /// Summary description for LruCacheController. + /// + public class LruCacheController : ICacheController + { + #region Constructor (s) / Destructor + /// + /// + public LruCacheController() + { + _cacheSize = 100; + _cache = Hashtable.Synchronized(new Hashtable()); + _keyList = ArrayList.Synchronized(new ArrayList()); + } + #endregion + #region Fields + private int _cacheSize; + private readonly Hashtable _cache; + private readonly IList _keyList; + #endregion + + #region ICacheController Members + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + public object Remove(object key) + { + var o = this[key]; + + _keyList.Remove(key); + _cache.Remove(key); + return o; + } + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + _cache.Clear(); + _keyList.Clear(); + } + + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + public object this[object key] + { + get + { + _keyList.Remove(key); + _keyList.Add(key); + return _cache[key]; + } + set + { + _cache[key] = value; + _keyList.Add(key); + if (_keyList.Count > _cacheSize) + { + var oldestKey = _keyList[0]; + _keyList.Remove(0); + _cache.Remove(oldestKey); + } + } + } + + + /// + /// Configures the cache + /// + public void Configure(IDictionary properties) + { + var size = (string)properties["CacheSize"]; + ; + if (size != null) _cacheSize = Convert.ToInt32(size); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/Memory/MemoryCacheControler.cs b/ORBatisFramework/Configuration/Cache/Memory/MemoryCacheControler.cs new file mode 100644 index 0000000..0ab22d5 --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/Memory/MemoryCacheControler.cs @@ -0,0 +1,144 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Collections; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Memory +{ + /// + /// Summary description for MemoryCacheControler. + /// + public class MemoryCacheControler : ICacheController + { + #region Constructor (s) / Destructor + /// + /// Constructor + /// + public MemoryCacheControler() + { + _cache = Hashtable.Synchronized(new Hashtable()); + } + #endregion + + /// + /// Class to implement a strong (permanent) reference. + /// + private class StrongReference + { + public StrongReference(object obj) + { + Target = obj; + } + + /// + /// Gets the object (the target) referenced by this instance. + /// + public object Target { get; } + } + + #region Fields + private MemoryCacheLevel _cacheLevel = MemoryCacheLevel.Weak; + private readonly Hashtable _cache; + #endregion + + #region ICacheController Members + /// + /// Remove an object from a cache model + /// + /// the key to the object + /// the removed object(?) + public object Remove(object key) + { + object value = null; + var reference = this[key]; + _cache.Remove(key); + if (reference != null) + { + if (reference is StrongReference) + value = ((StrongReference)reference).Target; + else if (reference is WeakReference) value = ((WeakReference)reference).Target; + } + + return value; + } + + /// + /// Adds an item with the specified key and value into cached data. + /// Gets a cached object with the specified key. + /// + /// The cached object or null + public object this[object key] + { + get + { + object value = null; + var reference = _cache[key]; + if (reference != null) + { + if (reference is StrongReference) + value = ((StrongReference)reference).Target; + else if (reference is WeakReference) value = ((WeakReference)reference).Target; + } + + return value; + } + set + { + object reference = null; + if (_cacheLevel.Equals(MemoryCacheLevel.Weak)) + reference = new WeakReference(value); + else if (_cacheLevel.Equals(MemoryCacheLevel.Strong)) reference = new StrongReference(value); + _cache[key] = reference; + } + } + + + /// + /// Clears all elements from the cache. + /// + public void Flush() + { + lock (this) + { + _cache.Clear(); + } + } + + + /// + /// Configures the cache + /// + public void Configure(IDictionary properties) + { + var referenceType = (string)properties["Type"]; + ; + if (referenceType != null) _cacheLevel = MemoryCacheLevel.GetByRefenceType(referenceType.ToUpper()); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Cache/Memory/MemoryCacheLevel.cs b/ORBatisFramework/Configuration/Cache/Memory/MemoryCacheLevel.cs new file mode 100644 index 0000000..243d07a --- /dev/null +++ b/ORBatisFramework/Configuration/Cache/Memory/MemoryCacheLevel.cs @@ -0,0 +1,106 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +using IBatisNet.DataMapper.Exceptions; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Cache.Memory +{ + /// + /// Summary description for MemoryCacheLevel. + /// + public class MemoryCacheLevel + { + #region Constructor (s) / Destructor + /// + /// + static MemoryCacheLevel() + { + Weak = new MemoryCacheLevel("WEAK"); + Strong = new MemoryCacheLevel("STRONG"); + + _cacheLevelMap[Weak.ReferenceType] = Weak; + _cacheLevelMap[Strong.ReferenceType] = Strong; + } + #endregion + #region Fields + private static readonly Hashtable _cacheLevelMap = new Hashtable(); + + /// + /// Constant for weak caching + /// This cache model is probably the best choice in most cases. It will increase + /// performance for popular results, but it will absolutely release the memory to + /// be used in allocating other objects, assuming that the results are not currently + /// in use. + /// References an object while still allowing it to be garbage collected. + /// + public static MemoryCacheLevel Weak; + + /// + /// Constant for strong caching. + /// This cache model will guarantee that the results stay in memory until the cache + /// is explicitly flushed. This is ideal for results that are: + /// + /// very small + /// absolutely static + /// used very often + /// + /// The advantage is that performance will be very good for this particular query. + /// The disadvantage is that if the memory used by these results is needed, then it + /// will not be released to make room for other objects (possibly more important + /// objects). + /// + public static MemoryCacheLevel Strong; + #endregion + + #region Methods + /// + /// Creates a new instance of CacheLevel + /// + /// The type of the CacheLevel. + private MemoryCacheLevel(string type) + { + ReferenceType = type; + } + + /// + /// + public string ReferenceType { get; } + + /// + /// + /// + /// + public static MemoryCacheLevel GetByRefenceType(string referenceType) + { + var cacheLevel = (MemoryCacheLevel)_cacheLevelMap[referenceType]; + if (cacheLevel == null) throw new DataMapperException("Error getting CacheLevel (reference type) for name: '" + referenceType + "'."); + return cacheLevel; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/DomSqlMapBuilder.cs b/ORBatisFramework/Configuration/DomSqlMapBuilder.cs new file mode 100644 index 0000000..00c7991 --- /dev/null +++ b/ORBatisFramework/Configuration/DomSqlMapBuilder.cs @@ -0,0 +1,1790 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638539 $ + * $Date: 2008-03-18 13:53:02 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Text; +using System.Threading; +using System.Xml; +using System.Xml.Schema; +using IBatisNet.Common; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.Common.Xml; +using IBatisNet.DataMapper.Configuration.Alias; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.Cache.Fifo; +using IBatisNet.DataMapper.Configuration.Cache.Lru; +using IBatisNet.DataMapper.Configuration.Cache.Memory; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Serializers; +using IBatisNet.DataMapper.Configuration.Sql; +using IBatisNet.DataMapper.Configuration.Sql.Dynamic; +using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; +using IBatisNet.DataMapper.Configuration.Sql.SimpleDynamic; +using IBatisNet.DataMapper.Configuration.Sql.Static; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.MappedStatements; +using IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +using IBatisNet.DataMapper.Scope; +using IBatisNet.DataMapper.TypeHandlers; +#endregion + +namespace IBatisNet.DataMapper.Configuration +{ + /// + /// Builds an ISqlMapper instance from the supplied resources (e.g. XML configuration files). + /// + public class DomSqlMapBuilder + { + #region Constructor + /// + /// Constructs a DomSqlMapBuilder. + /// + public DomSqlMapBuilder() + { + _configScope = new ConfigurationScope(); + _paramParser = new InlineParameterMapParser(); + _deSerializerFactory = new DeSerializerFactory(_configScope); + } + #endregion + #region Embedded resource + // Which files must we allow to be used as Embedded Resources ? + // - slqMap.config [Yes] + // - providers.config [Yes] + // - sqlMap files [Yes] + // - properties file (like Database.config) [Yes] + // see contribution, NHibernate usage, + // see http://www.codeproject.com/csharp/EmbeddedResourceStrings.asp + // see http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=75 + #endregion + + #region Constant + private const string PROPERTY_ELEMENT_KEY_ATTRIB = "key"; + private const string PROPERTY_ELEMENT_VALUE_ATTRIB = "value"; + + /// + /// + private const string DATAMAPPER_NAMESPACE_PREFIX = "mapper"; + + private const string PROVIDERS_NAMESPACE_PREFIX = "provider"; + private const string MAPPING_NAMESPACE_PREFIX = "mapping"; + private const string MODULE_NAMESPACE_PREFIX = "module"; + private const string DATAMAPPER_XML_NAMESPACE = "http://ibatis.apache.org/dataMapper"; + private const string PROVIDER_XML_NAMESPACE = "http://ibatis.apache.org/providers"; + private const string MAPPING_XML_NAMESPACE = "http://ibatis.apache.org/mapping"; + private const string MODULE_XML_NAMESPACE = "http://ibatis.apache.org/module"; + + /// + /// Default filename of main configuration file. + /// + public const string DEFAULT_FILE_CONFIG_NAME = "SqlMap.config"; + + /// + /// Default provider name + /// + private const string DEFAULT_PROVIDER_NAME = "_DEFAULT_PROVIDER_NAME"; + + /// + /// Dot representation. + /// + public const string DOT = "."; + + /// + /// Token for SqlMapConfig xml root element. + /// + private const string XML_DATAMAPPER_CONFIG_ROOT = "sqlMapConfig"; + + /// + /// Token for xml path to SqlMapConfig settings element. + /// + private const string XML_CONFIG_SETTINGS = "sqlMapConfig/settings/setting"; + + /// + /// Token for default providers config file name. + /// + private const string PROVIDERS_FILE_NAME = "providers.config"; + + /// + /// Token for xml path to SqlMapConfig providers element. + /// + private const string XML_CONFIG_PROVIDERS = "sqlMapConfig/providers"; + + /// + /// Token for xml path to properties elements. + /// + private const string XML_PROPERTIES = "properties"; + + /// + /// Token for xml path to property elements. + /// + private const string XML_PROPERTY = "property"; + + /// + /// Token for xml path to settings add elements. + /// + private const string XML_SETTINGS_ADD = "/*/add"; + + /// + /// Token for xml path to global properties elements. + /// + private const string XML_GLOBAL_PROPERTIES = "*/add"; + + /// + /// Token for xml path to provider elements. + /// + private const string XML_PROVIDER = "providers/provider"; + + /// + /// Token for xml path to database provider elements. + /// + private const string XML_DATABASE_PROVIDER = "sqlMapConfig/database/provider"; + + /// + /// Token for xml path to database source elements. + /// + private const string XML_DATABASE_DATASOURCE = "sqlMapConfig/database/dataSource"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_TYPEALIAS = "sqlMapConfig/alias/typeAlias"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_TYPEHANDLER = "sqlMapConfig/typeHandlers/typeHandler"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_MAPMODULE = "sqlMapConfig/sqlMapModules/sqlMapModule"; + + /// + /// Token for xml path to sqlMap elements. + /// + private const string XML_SQLMAP = "sqlMapConfig/sqlMaps/sqlMap"; + + /// + /// Token for xml path to module sqlMap elements. + /// + private const string XML_MODULE_MAP = "sqlMapModule/sqlMaps/sqlMap"; + + /// + /// Token for mapping xml root. + /// + private const string XML_MAPPING_ROOT = "sqlMap"; + + /// + /// Token for xml path to type alias elements. + /// + private const string XML_TYPEALIAS = "sqlMap/alias/typeAlias"; + + /// + /// Token for xml path to resultMap elements. + /// + private const string XML_RESULTMAP = "sqlMap/resultMaps/resultMap"; + + /// + /// Token for xml path to parameterMap elements. + /// + private const string XML_PARAMETERMAP = "sqlMap/parameterMaps/parameterMap"; + + /// + /// Token for xml path to sql elements. + /// + private const string SQL_STATEMENT = "sqlMap/statements/sql"; + + /// + /// Token for xml path to statement elements. + /// + private const string XML_STATEMENT = "sqlMap/statements/statement"; + + /// + /// Token for xml path to select elements. + /// + private const string XML_SELECT = "sqlMap/statements/select"; + + /// + /// Token for xml path to insert elements. + /// + private const string XML_INSERT = "sqlMap/statements/insert"; + + /// + /// Token for xml path to selectKey elements. + /// + private const string XML_SELECTKEY = "selectKey"; + + /// + /// Token for xml path to update elements. + /// + private const string XML_UPDATE = "sqlMap/statements/update"; + + /// + /// Token for xml path to delete elements. + /// + private const string XML_DELETE = "sqlMap/statements/delete"; + + /// + /// Token for xml path to procedure elements. + /// + private const string XML_PROCEDURE = "sqlMap/statements/procedure"; + + /// + /// Token for xml path to cacheModel elements. + /// + private const string XML_CACHE_MODEL = "sqlMap/cacheModels/cacheModel"; + + /// + /// Token for xml path to flushOnExecute elements. + /// + private const string XML_FLUSH_ON_EXECUTE = "flushOnExecute"; + + /// + /// Token for xml path to search statement elements. + /// + private const string XML_SEARCH_STATEMENT = "sqlMap/statements"; + + /// + /// Token for xml path to search parameterMap elements. + /// + private const string XML_SEARCH_PARAMETER = "sqlMap/parameterMaps/parameterMap[@id='"; + + /// + /// Token for xml path to search resultMap elements. + /// + private const string XML_SEARCH_RESULTMAP = "sqlMap/resultMaps/resultMap[@id='"; + + /// + /// Token for useStatementNamespaces attribute. + /// + private const string ATR_USE_STATEMENT_NAMESPACES = "useStatementNamespaces"; + + /// + /// Token for cacheModelsEnabled attribute. + /// + private const string ATR_CACHE_MODELS_ENABLED = "cacheModelsEnabled"; + + /// + /// Token for validateSqlMap attribute. + /// + private const string ATR_VALIDATE_SQLMAP = "validateSqlMap"; + + /// + /// Token for useReflectionOptimizer attribute. + /// + private const string ATR_USE_REFLECTION_OPTIMIZER = "useReflectionOptimizer"; + #endregion + + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private readonly ConfigurationScope _configScope; + private readonly DeSerializerFactory _deSerializerFactory; + private readonly InlineParameterMapParser _paramParser; + private IObjectFactory _objectFactory; + private ISetAccessorFactory _setAccessorFactory; + private IGetAccessorFactory _getAccessorFactory; + private ISqlMapper _sqlMapper; + private bool _validateSqlMapConfig = true; + #endregion + + #region Properties + /// + /// Allow properties to be set before configuration. + /// + public NameValueCollection Properties + { + set => _configScope.Properties.Add(value); + } + + /// + /// Allow a custom to be set before configuration. + /// + public ISetAccessorFactory SetAccessorFactory + { + set => _setAccessorFactory = value; + } + + /// + /// Allow a custom to be set before configuration. + /// + public IGetAccessorFactory GetAccessorFactory + { + set => _getAccessorFactory = value; + } + + /// + /// Allow a custom to be set before configuration. + /// + public IObjectFactory ObjectFactory + { + set => _objectFactory = value; + } + + /// + /// Allow a custom to be set before configuration. + /// + public ISqlMapper SqlMapper + { + set => _sqlMapper = value; + } + + /// + /// Enable validation of SqlMap document. This property must be set before configuration. + /// + public bool ValidateSqlMapConfig + { + set => _validateSqlMapConfig = value; + } + #endregion + + #region Configure + /// + /// Configure a SqlMapper from default resource file named 'SqlMap.config'. + /// + /// An ISqlMapper instance. + /// + /// The file path is relative to the application root. For ASP.Net applications + /// this would be the same directory as the Web.config file. For other .Net + /// applications the SqlMap.config file should be placed in the same folder + /// as the executable. + /// + public ISqlMapper Configure() + { + return Configure(Resources.GetConfigAsXmlDocument(DEFAULT_FILE_CONFIG_NAME)); + } + + /// + /// Configure and returns an ISqlMapper instance. + /// + /// An xml sql map configuration document. + /// An ISqlMapper instance. + public ISqlMapper Configure(XmlDocument document) + { + return Build(document, false); + } + + + /// + /// Configure an ISqlMapper object from a file path. + /// + /// + /// A relative ressource path from your Application root + /// or a absolue file path file:\\c:\dir\a.config + /// + /// An ISqlMapper instance. + public ISqlMapper Configure(string resource) + { + XmlDocument document; + if (resource.StartsWith("file://")) + document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); + else + document = Resources.GetResourceAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure an ISqlMapper object from a stream. + /// + /// A Stream resource. + /// An SqlMap + public ISqlMapper Configure(Stream resource) + { + var document = Resources.GetStreamAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure an ISqlMapper object from a FileInfo. + /// + /// A FileInfo resource. + /// An ISqlMapper instance. + public ISqlMapper Configure(FileInfo resource) + { + var document = Resources.GetFileInfoAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure an ISqlMapper object from an Uri. + /// + /// A Uri resource. + /// An ISqlMapper instance. + public ISqlMapper Configure(Uri resource) + { + var document = Resources.GetUriAsXmlDocument(resource); + return Build(document, false); + } + + /// + /// Configure and monitor the default configuration file (SqlMap.config) for modifications + /// and automatically reconfigure SqlMap. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(ConfigureHandler configureDelegate) + { + return ConfigureAndWatch(DEFAULT_FILE_CONFIG_NAME, configureDelegate); + } + + /// + /// Configure and monitor the configuration file for modifications + /// and automatically reconfigure the ISqlMapper instance. + /// + /// + /// A relative ressource path from your Application root + /// or an absolue file path file:\\c:\dir\a.config + /// + /// + /// Delegate called when the file has changed. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(string resource, ConfigureHandler configureDelegate) + { + XmlDocument document = null; + if (resource.StartsWith("file://")) + document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); + else + document = Resources.GetResourceAsXmlDocument(resource); + + ConfigWatcherHandler.ClearFilesMonitored(); + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(resource)); + + var callBakDelegate = new TimerCallback(OnConfigFileChange); + + var state = new StateConfig(); + state.FileName = resource; + state.ConfigureHandler = configureDelegate; + + var sqlMapper = Build(document, true); + + new ConfigWatcherHandler(callBakDelegate, state); + + return sqlMapper; + } + + /// + /// Configure and monitor the configuration file for modifications + /// and automatically reconfigure the ISqlMapper instance. + /// + /// + /// A FileInfo to a SqlMap.config file. + /// + /// + /// Delegate called when the file has changed. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(FileInfo resource, ConfigureHandler configureDelegate) + { + var document = Resources.GetFileInfoAsXmlDocument(resource); + + ConfigWatcherHandler.ClearFilesMonitored(); + ConfigWatcherHandler.AddFileToWatch(resource); + + var callBakDelegate = new TimerCallback(OnConfigFileChange); + + var state = new StateConfig(); + state.FileName = resource.FullName; + state.ConfigureHandler = configureDelegate; + + var sqlMapper = Build(document, true); + + new ConfigWatcherHandler(callBakDelegate, state); + + return sqlMapper; + } + + /// + /// Callback called when the SqlMap.config file has changed. + /// + /// The object. + public static void OnConfigFileChange(object obj) + { + var state = (StateConfig)obj; + state.ConfigureHandler(null); + } + #endregion + + #region Methods + /// + /// Build an ISqlMapper instance. + /// + /// An xml configuration document. + /// A data source. + /// + /// + /// Returns an ISqlMapper instance. + private ISqlMapper Build(XmlDocument document, DataSource dataSource, + bool useConfigFileWatcher, bool isCallFromDao) + { + _configScope.SqlMapConfigDocument = document; + _configScope.DataSource = dataSource; + _configScope.IsCallFromDao = isCallFromDao; + _configScope.UseConfigFileWatcher = useConfigFileWatcher; + + _configScope.XmlNamespaceManager = new XmlNamespaceManager(_configScope.SqlMapConfigDocument.NameTable); + _configScope.XmlNamespaceManager.AddNamespace(DATAMAPPER_NAMESPACE_PREFIX, DATAMAPPER_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(PROVIDERS_NAMESPACE_PREFIX, PROVIDER_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(MAPPING_NAMESPACE_PREFIX, MAPPING_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(MODULE_NAMESPACE_PREFIX, MODULE_XML_NAMESPACE); + + try + { + if (_validateSqlMapConfig) ValidateSchema(document.ChildNodes[1], "SqlMapConfig.xsd"); + Initialize(); + return _configScope.SqlMapper; + } + catch (Exception e) + { + throw new ConfigurationException(_configScope.ErrorContext.ToString(), e); + } + } + + /// + /// Validates an XmlNode against a schema file. + /// + /// The doc to validate. + /// Schema file name. + private void ValidateSchema(XmlNode section, string schemaFileName) + { + XmlReader validatingReader = null; + Stream xsdFile = null; + + _configScope.ErrorContext.Activity = "Validate SqlMap config"; + try + { + //Validate the document using a schema + xsdFile = GetStream(schemaFileName); + + if (xsdFile == null) + // TODO: avoid using hard-coded value "IBatisNet.DataMapper" + throw new ConfigurationException("Unable to locate embedded resource [IBatisNet.DataMapper." + schemaFileName + "]. If you are building from source, verfiy the file is marked as an embedded resource."); + + var schema = XmlSchema.Read(xsdFile, ValidationCallBack); + + var settings = new XmlReaderSettings(); + settings.ValidationType = ValidationType.Schema; + + // Create the XmlSchemaSet class. + var schemas = new XmlSchemaSet(); + schemas.Add(schema); + + settings.Schemas = schemas; + validatingReader = XmlReader.Create(new XmlNodeReader(section), settings); + + // Wire up the call back. The ValidationEvent is fired when the + // XmlValidatingReader hits an issue validating a section of the xml + settings.ValidationEventHandler += ValidationCallBack; + // Validate the document + while (validatingReader.Read()) { } + + if (!_configScope.IsXmlValid) throw new ConfigurationException("Invalid SqlMap.config document. cause :" + _configScope.ErrorContext.Resource); + } + finally + { + if (validatingReader != null) validatingReader.Close(); + if (xsdFile != null) xsdFile.Close(); + } + } + + private void ValidationCallBack(object sender, ValidationEventArgs args) + { + _configScope.IsXmlValid = false; + _configScope.ErrorContext.Resource += args.Message + Environment.NewLine; + } + + /// + /// Load statements (select, insert, update, delete), parameters, and resultMaps. + /// + /// + /// + /// + /// + /// + /// Used by Dao + public ISqlMapper Build(XmlDocument document, DataSource dataSource, bool useConfigFileWatcher, NameValueCollection properties) + { + _configScope.Properties.Add(properties); + return Build(document, dataSource, useConfigFileWatcher, true); + } + + /// + /// Load SqlMap configuration from + /// from the XmlDocument passed in parameter. + /// + /// The xml sql map configuration. + /// + public ISqlMapper Build(XmlDocument document, bool useConfigFileWatcher) + { + return Build(document, null, useConfigFileWatcher, false); + } + + /// + /// Reset PreparedStatements cache + /// + private void Reset() { } + + /// + /// Intialize the internal ISqlMapper instance. + /// + private void Initialize() + { + Reset(); + + #region Load Global Properties + if (_configScope.IsCallFromDao == false) + { + _configScope.NodeContext = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATAMAPPER_CONFIG_ROOT), _configScope.XmlNamespaceManager); + + ParseGlobalProperties(); + } + #endregion + + #region Load settings + _configScope.ErrorContext.Activity = "loading global settings"; + + var settings = _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_CONFIG_SETTINGS), _configScope.XmlNamespaceManager); + + if (settings != null) + foreach (XmlNode setting in settings) + { + if (setting.Attributes[ATR_USE_STATEMENT_NAMESPACES] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_STATEMENT_NAMESPACES].Value, _configScope.Properties); + _configScope.UseStatementNamespaces = Convert.ToBoolean(value); + } + + if (setting.Attributes[ATR_CACHE_MODELS_ENABLED] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_CACHE_MODELS_ENABLED].Value, _configScope.Properties); + _configScope.IsCacheModelsEnabled = Convert.ToBoolean(value); + } + + if (setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER].Value, _configScope.Properties); + _configScope.UseReflectionOptimizer = Convert.ToBoolean(value); + } + + if (setting.Attributes[ATR_VALIDATE_SQLMAP] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_VALIDATE_SQLMAP].Value, _configScope.Properties); + _configScope.ValidateSqlMap = Convert.ToBoolean(value); + } + } + #endregion + + if (_objectFactory == null) _objectFactory = new ObjectFactory(_configScope.UseReflectionOptimizer); + if (_setAccessorFactory == null) _setAccessorFactory = new SetAccessorFactory(_configScope.UseReflectionOptimizer); + if (_getAccessorFactory == null) _getAccessorFactory = new GetAccessorFactory(_configScope.UseReflectionOptimizer); + if (_sqlMapper == null) + { + var accessorFactory = new AccessorFactory(_setAccessorFactory, _getAccessorFactory); + _configScope.SqlMapper = new SqlMapper(_objectFactory, accessorFactory); + } + else + { + _configScope.SqlMapper = _sqlMapper; + } + + var emptyParameterMap = new ParameterMap(_configScope.DataExchangeFactory); + emptyParameterMap.Id = ConfigurationScope.EMPTY_PARAMETER_MAP; + _configScope.SqlMapper.AddParameterMap(emptyParameterMap); + + _configScope.SqlMapper.IsCacheModelsEnabled = _configScope.IsCacheModelsEnabled; + + #region Cache Alias + var cacheAlias = new TypeAlias(typeof(MemoryCacheControler)); + cacheAlias.Name = "MEMORY"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(LruCacheController)); + cacheAlias.Name = "LRU"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(FifoCacheController)); + cacheAlias.Name = "FIFO"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(AnsiStringTypeHandler)); + cacheAlias.Name = "AnsiStringTypeHandler"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + #endregion + + #region Load providers + if (_configScope.IsCallFromDao == false) GetProviders(); + #endregion + + #region Load DataBase + #region Choose the provider + IDbProvider provider = null; + if (_configScope.IsCallFromDao == false) + { + provider = ParseProvider(); + _configScope.ErrorContext.Reset(); + } + #endregion + + #region Load the DataSources + _configScope.ErrorContext.Activity = "loading Database DataSource"; + var nodeDataSource = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_DATASOURCE), _configScope.XmlNamespaceManager); + + if (nodeDataSource == null) + { + if (_configScope.IsCallFromDao == false) throw new ConfigurationException("There's no dataSource tag in SqlMap.config."); + + // patch from Luke Yang + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } + else + { + if (_configScope.IsCallFromDao == false) + { + _configScope.ErrorContext.Resource = nodeDataSource.OuterXml; + _configScope.ErrorContext.MoreInfo = "parse DataSource"; + + var dataSource = DataSourceDeSerializer.Deserialize(nodeDataSource); + + dataSource.DbProvider = provider; + dataSource.ConnectionString = NodeUtils.ParsePropertyTokens(dataSource.ConnectionString, _configScope.Properties); + + _configScope.DataSource = dataSource; + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } + else + { + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } + + _configScope.ErrorContext.Reset(); + } + #endregion + #endregion + + #region Load Global TypeAlias + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEALIAS), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.Activity = "loading global Type alias"; + TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Load TypeHandlers + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEHANDLER), _configScope.XmlNamespaceManager)) + try + { + _configScope.ErrorContext.Activity = "loading typeHandler"; + TypeHandlerDeSerializer.Deserialize(xmlNode, _configScope); + } + catch (Exception e) + { + var prop = NodeUtils.ParseAttributes(xmlNode, _configScope.Properties); + + throw new ConfigurationException( + string.Format("Error registering TypeHandler class \"{0}\" for handling .Net type \"{1}\" and dbType \"{2}\". Cause: {3}", + NodeUtils.GetStringAttribute(prop, "callback"), + NodeUtils.GetStringAttribute(prop, "type"), + NodeUtils.GetStringAttribute(prop, "dbType"), + e.Message), e); + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Load sqlMap mapping files + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager)) + { + _configScope.NodeContext = xmlNode; + ConfigureSqlMap(); + } + #endregion + + #region Load sqlMap Modules + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_MAPMODULE), _configScope.XmlNamespaceManager)) + { + _configScope.NodeContext = xmlNode; + ConfigureSqlMapModule(); + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Attach CacheModel to statement + if (_configScope.IsCacheModelsEnabled) + foreach (DictionaryEntry entry in _configScope.SqlMapper.MappedStatements) + { + _configScope.ErrorContext.Activity = "Set CacheModel to statement"; + + var mappedStatement = (IMappedStatement)entry.Value; + if (mappedStatement.Statement.CacheModelName.Length > 0) + { + _configScope.ErrorContext.MoreInfo = "statement : " + mappedStatement.Statement.Id; + _configScope.ErrorContext.Resource = "cacheModel : " + mappedStatement.Statement.CacheModelName; + mappedStatement.Statement.CacheModel = _configScope.SqlMapper.GetCache(mappedStatement.Statement.CacheModelName); + } + } + + _configScope.ErrorContext.Reset(); + #endregion + + #region Register Trigger Statements for Cache Models + foreach (DictionaryEntry entry in _configScope.CacheModelFlushOnExecuteStatements) + { + var cacheModelId = (string)entry.Key; + var statementsToRegister = (IList)entry.Value; + + if (statementsToRegister != null && statementsToRegister.Count > 0) + foreach (string statementName in statementsToRegister) + { + var mappedStatement = _configScope.SqlMapper.MappedStatements[statementName] as IMappedStatement; + + if (mappedStatement != null) + { + var cacheModel = _configScope.SqlMapper.GetCache(cacheModelId); + + if (_logger.IsDebugEnabled) _logger.Debug("Registering trigger statement [" + mappedStatement.Id + "] to cache model [" + cacheModel.Id + "]"); + + cacheModel.RegisterTriggerStatement(mappedStatement); + } + else + { + if (_logger.IsWarnEnabled) _logger.Warn("Unable to register trigger statement [" + statementName + "] to cache model [" + cacheModelId + "]. Statement does not exist."); + } + } + } + #endregion + + #region Resolve resultMap / Discriminator / PropertyStategy attributes on Result/Argument Property + foreach (DictionaryEntry entry in _configScope.SqlMapper.ResultMaps) + { + _configScope.ErrorContext.Activity = "Resolve 'resultMap' attribute on Result Property"; + + var resultMap = (ResultMap)entry.Value; + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var result = resultMap.Properties[index]; + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + result.PropertyStrategy = PropertyStrategyFactory.Get(result); + } + + for (var index = 0; index < resultMap.Parameters.Count; index++) + { + var result = resultMap.Parameters[index]; + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + result.ArgumentStrategy = ArgumentStrategyFactory.Get((ArgumentProperty)result); + } + + if (resultMap.Discriminator != null) resultMap.Discriminator.Initialize(_configScope); + } + + _configScope.ErrorContext.Reset(); + #endregion + } + + /// + /// Load and initialize providers from specified file. + /// + private void GetProviders() + { + IDbProvider provider; + XmlDocument xmlProviders; + + _configScope.ErrorContext.Activity = "loading Providers"; + + XmlNode providersNode; + providersNode = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_CONFIG_PROVIDERS), _configScope.XmlNamespaceManager); + + if (providersNode != null) + xmlProviders = Resources.GetAsXmlDocument(providersNode, _configScope.Properties); + else + xmlProviders = Resources.GetConfigAsXmlDocument(PROVIDERS_FILE_NAME); + + foreach (XmlNode node in xmlProviders.SelectNodes(ApplyProviderNamespacePrefix(XML_PROVIDER), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.Resource = node.InnerXml; + provider = ProviderDeSerializer.Deserialize(node); + + if (provider.IsEnabled) + { + _configScope.ErrorContext.ObjectId = provider.Name; + _configScope.ErrorContext.MoreInfo = "initialize provider"; + + provider.Initialize(); + _configScope.Providers.Add(provider.Name, provider); + + if (provider.IsDefault) + { + if (_configScope.Providers[DEFAULT_PROVIDER_NAME] == null) + _configScope.Providers.Add(DEFAULT_PROVIDER_NAME, provider); + else + throw new ConfigurationException( + string.Format("Error while configuring the Provider named \"{0}\" There can be only one default Provider.", provider.Name)); + } + } + } + + _configScope.ErrorContext.Reset(); + } + + + /// + /// Parse the provider tag. + /// + /// A provider object. + private IDbProvider ParseProvider() + { + _configScope.ErrorContext.Activity = "load DataBase Provider"; + var node = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_PROVIDER), _configScope.XmlNamespaceManager); + + if (node != null) + { + _configScope.ErrorContext.Resource = node.OuterXml; + var providerName = NodeUtils.ParsePropertyTokens(node.Attributes["name"].Value, _configScope.Properties); + + _configScope.ErrorContext.ObjectId = providerName; + + if (_configScope.Providers.Contains(providerName)) return (IDbProvider)_configScope.Providers[providerName]; + + throw new ConfigurationException( + string.Format("Error while configuring the Provider named \"{0}\". Cause : The provider is not in 'providers.config' or is not enabled.", + providerName)); + } + + if (_configScope.Providers.Contains(DEFAULT_PROVIDER_NAME)) return (IDbProvider)_configScope.Providers[DEFAULT_PROVIDER_NAME]; + + throw new ConfigurationException( + "Error while configuring the SqlMap. There is no provider marked default in 'providers.config' file."); + } + + private void ConfigureSqlMapModule() + { + var sqlModuleNode = _configScope.NodeContext; + + _configScope.ErrorContext.Activity = "loading SqlMap Module"; + _configScope.ErrorContext.Resource = sqlModuleNode.OuterXml; + if (_configScope.UseConfigFileWatcher) + if (sqlModuleNode.Attributes["resource"] != null || sqlModuleNode.Attributes["url"] != null) + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlModuleNode, _configScope.Properties))); + + _configScope.SqlMapModuleDocument = Resources.GetAsXmlDocument(sqlModuleNode, _configScope.Properties); + + if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapModuleDocument.ChildNodes[1], "SqlMapModule.xsd"); + foreach (XmlNode xmlNode in _configScope.SqlMapModuleDocument.SelectNodes(ApplyModuleNamespacePrefix(XML_MODULE_MAP), _configScope.XmlNamespaceManager)) + { + _configScope.NodeContext = xmlNode; + ConfigureSqlMap(); + _configScope.NodeContext = sqlModuleNode; + } + } + + /// + /// Load sqlMap statement. + /// + private void ConfigureSqlMap() + { + var sqlMapNode = _configScope.NodeContext; + + _configScope.ErrorContext.Activity = "loading SqlMap"; + _configScope.ErrorContext.Resource = sqlMapNode.OuterXml; + + if (_configScope.UseConfigFileWatcher) + if (sqlMapNode.Attributes["resource"] != null || sqlMapNode.Attributes["url"] != null) + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlMapNode, _configScope.Properties))); + + // Load the file + _configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, _configScope.Properties); + + if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); + + _configScope.SqlMapNamespace = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), _configScope.XmlNamespaceManager).Attributes["namespace"].Value; + + #region Load TypeAlias + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), _configScope.XmlNamespaceManager)) TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); + _configScope.ErrorContext.MoreInfo = string.Empty; + _configScope.ErrorContext.ObjectId = string.Empty; + #endregion + + #region Load resultMap + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_RESULTMAP), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading ResultMap tag"; + _configScope.NodeContext = xmlNode; // A ResultMap node + + BuildResultMap(); + } + #endregion + + #region Load parameterMaps + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PARAMETERMAP), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading ParameterMap tag"; + _configScope.NodeContext = xmlNode; // A ParameterMap node + + BuildParameterMap(); + } + #endregion + + #region Load statements + #region Sql tag + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(SQL_STATEMENT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading sql tag"; + _configScope.NodeContext = xmlNode; // A sql tag + + SqlDeSerializer.Deserialize(xmlNode, _configScope); + } + #endregion + + #region Statement tag + Statement statement; + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_STATEMENT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading statement tag"; + _configScope.NodeContext = xmlNode; // A statement tag + + statement = StatementDeSerializer.Deserialize(xmlNode, _configScope); + statement.CacheModelName = _configScope.ApplyNamespace(statement.CacheModelName); + statement.ParameterMapName = _configScope.ApplyNamespace(statement.ParameterMapName); + //statement.ResultMapName = ApplyNamespace( statement.ResultMapName ); + + if (_configScope.UseStatementNamespaces) statement.Id = _configScope.ApplyNamespace(statement.Id); + _configScope.ErrorContext.ObjectId = statement.Id; + statement.Initialize(_configScope); + + // Build ISql (analyse sql statement) + ProcessSqlStatement(statement); + + // Build MappedStatement + var mappedStatement = new MappedStatement(_configScope.SqlMapper, statement); + IMappedStatement mapStatement = mappedStatement; + if (statement.CacheModelName != null && statement.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + + _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + } + #endregion + + #region Select tag + Select select; + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_SELECT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading select tag"; + _configScope.NodeContext = xmlNode; // A select node + + select = SelectDeSerializer.Deserialize(xmlNode, _configScope); + select.CacheModelName = _configScope.ApplyNamespace(select.CacheModelName); + select.ParameterMapName = _configScope.ApplyNamespace(select.ParameterMapName); + //select.ResultMapName = ApplyNamespace( select.ResultMapName ); + + if (_configScope.UseStatementNamespaces) select.Id = _configScope.ApplyNamespace(select.Id); + _configScope.ErrorContext.ObjectId = select.Id; + + select.Initialize(_configScope); + + if (select.Generate != null) + GenerateCommandText(_configScope, select); + else + // Build ISql (analyse sql statement) + ProcessSqlStatement(select); + + // Build MappedStatement + MappedStatement mappedStatement = new SelectMappedStatement(_configScope.SqlMapper, select); + IMappedStatement mapStatement = mappedStatement; + if (select.CacheModelName != null && select.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + + _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + } + #endregion + + #region Insert tag + Insert insert; + foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_INSERT), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.MoreInfo = "loading insert tag"; + _configScope.NodeContext = xmlNode; // A insert tag + + MappedStatement mappedStatement; + + insert = InsertDeSerializer.Deserialize(xmlNode, _configScope); + insert.CacheModelName = _configScope.ApplyNamespace(insert.CacheModelName); + insert.ParameterMapName = _configScope.ApplyNamespace(insert.ParameterMapName); + //insert.ResultMapName = ApplyNamespace( insert.ResultMapName ); + + if (_configScope.UseStatementNamespaces) insert.Id = _configScope.ApplyNamespace(insert.Id); + _configScope.ErrorContext.ObjectId = insert.Id; + insert.Initialize(_configScope); + + // Build ISql (analyse sql command text) + if (insert.Generate != null) + GenerateCommandText(_configScope, insert); + else + ProcessSqlStatement(insert); + + // Build MappedStatement + mappedStatement = new InsertMappedStatement(_configScope.SqlMapper, insert); + + _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); + + #region statement SelectKey + // Set sql statement SelectKey + if (insert.SelectKey != null) + { + _configScope.ErrorContext.MoreInfo = "loading selectKey tag"; + _configScope.NodeContext = xmlNode.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SELECTKEY), _configScope.XmlNamespaceManager); + + insert.SelectKey.Id = insert.Id; + insert.SelectKey.Initialize(_configScope); + insert.SelectKey.Id += DOT + "SelectKey"; + + // Initialize can also use _configScope.ErrorContext.ObjectId to get the id + // of the parent node's "id" attribute + var insert = configurationScope.SqlMapper.GetMappedStatement(Id); + + var insertParameterClass = insert.Statement.ParameterClass; + + // make sure the PropertyName is a valid settable property of the node's parameterClass + if (insertParameterClass != null && + ObjectProbe.IsSimpleType(insertParameterClass) == false) + { + configurationScope.ErrorContext.MoreInfo = string.Format("Looking for settable property named '{0}' on type '{1}' for selectKey node of statement id '{2}'.", + PropertyName, // 0 + insert.Statement.ParameterClass.Name, // 1 + Id); // 2 + + // we expect this to throw an exception if the property cannot be found; GetSetter is + // called instead of HasWriteableProperty becuase we want the same wording for + // property not found exceptions; GetSetter and HasWritableProperty both use the + // same internal cache for looking up the ProperyInfo object + ReflectionInfo.GetInstance(insert.Statement.ParameterClass).GetSetter(PropertyName); + } + } + + base.Initialize(configurationScope); + } + #endregion + + #region Fields + [NonSerialized] private SelectKeyType _selectKeyType = SelectKeyType.post; + + [NonSerialized] private string _property = string.Empty; + #endregion + + #region Properties + /// + /// Extend statement attribute + /// + [XmlIgnore] + public override string ExtendStatement + { + get => string.Empty; + set { } + } + + /// + /// The property name object to fill with the key. + /// + [XmlAttribute("property")] + public string PropertyName + { + get => _property; + set => _property = value; + } + + /// + /// The type of the selectKey tag : 'Pre' or 'Post' + /// + [XmlAttribute("type")] + public SelectKeyType SelectKeyType + { + get => _selectKeyType; + set => _selectKeyType = value; + } + + + /// + /// True if it is a post-generated key. + /// + [XmlIgnore] + public bool isAfter => _selectKeyType == SelectKeyType.post; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Statements/SqlGenerator.cs b/ORBatisFramework/Configuration/Statements/SqlGenerator.cs new file mode 100644 index 0000000..1e710e9 --- /dev/null +++ b/ORBatisFramework/Configuration/Statements/SqlGenerator.cs @@ -0,0 +1,243 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 512878 $ + * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Text; + +namespace IBatisNet.DataMapper.Configuration.Statements +{ + /// + /// Summary description for SqlGenerator. + /// + public sealed class SqlGenerator + { + /// + /// Creates SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + public static string BuildQuery(IStatement statement) + { + var sqlText = string.Empty; + + if (statement is Select) + sqlText = BuildSelectQuery(statement); + else if (statement is Insert) + sqlText = BuildInsertQuery(statement); + else if (statement is Update) + sqlText = BuildUpdateQuery(statement); + else if (statement is Delete) sqlText = BuildDeleteQuery(statement); + + return sqlText; + } + + + /// + /// Creates an select SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildSelectQuery(IStatement statement) + { + var output = new StringBuilder(); + var select = (Select)statement; + var columnCount = statement.ParameterMap.PropertiesList.Count; + + output.Append("SELECT "); + + // Create the list of columns + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + if (i < columnCount - 1) + output.Append("\t" + property.ColumnName + " as " + property.PropertyName + ","); + else + output.Append("\t" + property.ColumnName + " as " + property.PropertyName); + } + + output.Append(" FROM "); + output.Append("\t" + select.Generate.Table + ""); + + // Create the where clause + + var compositeKeyList = select.Generate.By.Split(','); + if (compositeKeyList.Length > 0 && select.Generate.By.Length > 0) + { + output.Append(" WHERE "); + var length = compositeKeyList.Length; + for (var i = 0; i < length; i++) + { + var columnName = compositeKeyList[i]; + + if (i > 0) + output.Append("\tAND " + columnName + " = ?"); + else + output.Append("\t" + columnName + " = ?"); + } + } + + // 'Select All' case + if (statement.ParameterClass == null) + // The ParameterMap is just used to build the query + // to avoid problems later, we set it to null + statement.ParameterMap = null; + + return output.ToString(); + } + + + /// + /// Creates an insert SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildInsertQuery(IStatement statement) + { + var output = new StringBuilder(); + var insert = (Insert)statement; + var columnCount = statement.ParameterMap.PropertiesList.Count; + + output.Append("INSERT INTO " + insert.Generate.Table + " ("); + + // Create the parameter list + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + // Append the column name as a parameter of the insert statement + if (i < columnCount - 1) + output.Append("\t" + property.ColumnName + ","); + else + output.Append("\t" + property.ColumnName + ""); + } + + output.Append(") VALUES ("); + + // Create the values list + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + // Append the necessary line breaks and commas + if (i < columnCount - 1) + output.Append("\t?,"); + else + output.Append("\t?"); + } + + output.Append(")"); + + return output.ToString(); + } + + + /// + /// Creates an update SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildUpdateQuery(IStatement statement) + { + var output = new StringBuilder(); + var update = (Update)statement; + var columnCount = statement.ParameterMap.PropertiesList.Count; + var keysList = update.Generate.By.Split(','); + + output.Append("UPDATE "); + output.Append("\t" + update.Generate.Table + " "); + output.Append("SET "); + + // Create the set statement + for (var i = 0; i < columnCount; i++) + { + var property = statement.ParameterMap.PropertiesList[i]; + + // Ignore key columns + if (update.Generate.By.IndexOf(property.ColumnName) < 0) + { + if (i < columnCount - keysList.Length - 1) + output.Append("\t" + property.ColumnName + " = ?,"); + else + output.Append("\t" + property.ColumnName + " = ? "); + } + } + + output.Append(" WHERE "); + + // Create the where clause + var length = keysList.Length; + for (var i = 0; i < length; i++) + { + var columnName = keysList[i]; + + if (i > 0) + output.Append("\tAND " + columnName + " = ?"); + else + output.Append("\t " + columnName + " = ?"); + } + + if (!string.IsNullOrWhiteSpace(update.Generate.RowVersion)) + { + if (keysList.Length > 0) + output.Append("\tAND " + update.Generate.RowVersion + " = #" + update.Generate.RowVersion + "# - 1"); + else + output.Append("\t " + update.Generate.RowVersion + " = #" + update.Generate.RowVersion + "# - 1"); + } + + return output.ToString(); + } + + /// + /// Creates an delete SQL command text for a specified statement + /// + /// The statement to build the SQL command text. + /// The SQL command text for the statement. + private static string BuildDeleteQuery(IStatement statement) + { + var output = new StringBuilder(); + var delete = (Delete)statement; + var keysList = delete.Generate.By.Split(','); + + output.Append("DELETE FROM"); + output.Append("\t" + delete.Generate.Table + ""); + output.Append(" WHERE "); + + // Create the where clause + var length = keysList.Length; + for (var i = 0; i < keysList.Length; i++) + { + var columnName = keysList[i].Trim(); + + if (i > 0) + output.Append("\tAND " + columnName + " = ?"); + else + output.Append("\t " + columnName + " = ?"); + } + + return output.ToString(); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Statements/Statement.cs b/ORBatisFramework/Configuration/Statements/Statement.cs new file mode 100644 index 0000000..f565715 --- /dev/null +++ b/ORBatisFramework/Configuration/Statements/Statement.cs @@ -0,0 +1,326 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 469233 $ + * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Xml.Serialization; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Sql; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.Configuration.Statements +{ + /// + /// Summary description for Statement. + /// + [Serializable] + [XmlRoot("statement", Namespace = "http://ibatis.apache.org/mapping")] + public class Statement : IStatement + { + #region Fields + [NonSerialized] private bool _allowRemapping; + + [NonSerialized] private string _id = string.Empty; + + // ResultMap + [NonSerialized] private string _resultMapName = string.Empty; + + [NonSerialized] private ResultMapCollection _resultsMap = new ResultMapCollection(); + + // ParameterMap + [NonSerialized] private string _parameterMapName = string.Empty; + + [NonSerialized] private ParameterMap _parameterMap; + + // Result Class + [NonSerialized] private string _resultClassName = string.Empty; + + [NonSerialized] private Type _resultClass; + + // Parameter Class + [NonSerialized] private string _parameterClassName = string.Empty; + + [NonSerialized] private Type _parameterClass; + + // List Class + [NonSerialized] private string _listClassName = string.Empty; + + [NonSerialized] private Type _listClass; + + // CacheModel + [NonSerialized] private string _cacheModelName = string.Empty; + [NonSerialized] private CacheModel _cacheModel; + [NonSerialized] private ISql _sql; + [NonSerialized] private string _extendStatement = string.Empty; + [NonSerialized] private IFactory _listClassFactory; + #endregion + + #region Properties + /// + /// Allow remapping of dynamic SQL + /// + [XmlAttribute("remapResults")] + public bool AllowRemapping + { + get => _allowRemapping; + set => _allowRemapping = value; + } + + /// + /// Extend statement attribute + /// + [XmlAttribute("extends")] + public virtual string ExtendStatement + { + get => _extendStatement; + set => _extendStatement = value; + } + + /// + /// The CacheModel name to use. + /// + [XmlAttribute("cacheModel")] + public string CacheModelName + { + get => _cacheModelName; + set => _cacheModelName = value; + } + + /// + /// Tell us if a cacheModel is attached to this statement. + /// + [XmlIgnore] + public bool HasCacheModel => _cacheModelName.Length > 0; + + /// + /// The CacheModel used by this statement. + /// + [XmlIgnore] + public CacheModel CacheModel + { + get => _cacheModel; + set => _cacheModel = value; + } + + /// + /// The list class name to use for strongly typed collection. + /// + [XmlAttribute("listClass")] + public string ListClassName + { + get => _listClassName; + set => _listClassName = value; + } + + + /// + /// The list class type to use for strongly typed collection. + /// + [XmlIgnore] + public Type ListClass => _listClass; + + /// + /// The result class name to used. + /// + [XmlAttribute("resultClass")] + public string ResultClassName + { + get => _resultClassName; + set => _resultClassName = value; + } + + /// + /// The result class type to used. + /// + [XmlIgnore] + public Type ResultClass => _resultClass; + + /// + /// The parameter class name to used. + /// + [XmlAttribute("parameterClass")] + public string ParameterClassName + { + get => _parameterClassName; + set => _parameterClassName = value; + } + + /// + /// The parameter class type to used. + /// + [XmlIgnore] + public Type ParameterClass => _parameterClass; + + /// + /// Name used to identify the statement amongst the others. + /// + [XmlAttribute("id")] + public string Id + { + get => _id; + set + { + if (value == null || value.Length < 1) + throw new DataMapperException("The id attribute is required in a statement tag."); + + _id = value; + } + } + + + /// + /// The sql statement + /// + [XmlIgnore] + public ISql Sql + { + get => _sql; + set + { + if (value == null) + throw new DataMapperException("The sql statement query text is required in the statement tag " + _id); + + _sql = value; + } + } + + + /// + /// The ResultMaps name used by the statement. + /// + [XmlAttribute("resultMap")] + public string ResultMapName + { + get => _resultMapName; + set => _resultMapName = value; + } + + /// + /// The ParameterMap name used by the statement. + /// + [XmlAttribute("parameterMap")] + public string ParameterMapName + { + get => _parameterMapName; + set => _parameterMapName = value; + } + + /// + /// The ResultMap used by the statement. + /// + [XmlIgnore] + public ResultMapCollection ResultsMap => _resultsMap; + + /// + /// The parameterMap used by the statement. + /// + [XmlIgnore] + public ParameterMap ParameterMap + { + get => _parameterMap; + set => _parameterMap = value; + } + + /// + /// The type of the statement (text or procedure) + /// Default Text. + /// + /// Text or StoredProcedure + [XmlIgnore] + public virtual CommandType CommandType => CommandType.Text; + #endregion + + + #region Methods + /// + /// Initialize an statement for the sqlMap. + /// + /// The scope of the configuration + internal virtual void Initialize(ConfigurationScope configurationScope) + { + if (_resultMapName.Length > 0) + { + var names = _resultMapName.Split(','); + for (var i = 0; i < names.Length; i++) + { + var name = configurationScope.ApplyNamespace(names[i].Trim()); + _resultsMap.Add(configurationScope.SqlMapper.GetResultMap(name)); + } + } + + if (_parameterMapName.Length > 0) _parameterMap = configurationScope.SqlMapper.GetParameterMap(_parameterMapName); + if (_resultClassName.Length > 0) + { + var classNames = _resultClassName.Split(','); + for (var i = 0; i < classNames.Length; i++) + { + _resultClass = configurationScope.SqlMapper.TypeHandlerFactory.GetType(classNames[i].Trim()); + IFactory resultClassFactory = null; + if (Type.GetTypeCode(_resultClass) == TypeCode.Object && + _resultClass.IsValueType == false) + resultClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_resultClass, Type.EmptyTypes); + var dataExchange = configurationScope.DataExchangeFactory.GetDataExchangeForClass(_resultClass); + IResultMap autoMap = new AutoResultMap(_resultClass, resultClassFactory, dataExchange); + _resultsMap.Add(autoMap); + } + } + + if (_parameterClassName.Length > 0) _parameterClass = configurationScope.SqlMapper.TypeHandlerFactory.GetType(_parameterClassName); + if (_listClassName.Length > 0) + { + _listClass = configurationScope.SqlMapper.TypeHandlerFactory.GetType(_listClassName); + _listClassFactory = configurationScope.SqlMapper.ObjectFactory.CreateFactory(_listClass, Type.EmptyTypes); + } + } + + + /// + /// Create an instance of 'IList' class. + /// + /// An object which implment IList. + public IList CreateInstanceOfListClass() + { + return (IList)_listClassFactory.CreateInstance(null); + } + + /// + /// Create an instance of a generic 'IList' class. + /// + /// An object which implment IList. + public IList CreateInstanceOfGenericListClass() + { + return (IList)_listClassFactory.CreateInstance(null); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Configuration/Statements/Update.cs b/ORBatisFramework/Configuration/Statements/Update.cs new file mode 100644 index 0000000..127cf26 --- /dev/null +++ b/ORBatisFramework/Configuration/Statements/Update.cs @@ -0,0 +1,58 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Xml.Serialization; + +namespace IBatisNet.DataMapper.Configuration.Statements +{ + /// + /// Summary description for Update. + /// + [Serializable] + [XmlRoot("update", Namespace = "http://ibatis.apache.org/mapping")] + public class Update : Statement + { + #region Fields + [NonSerialized] private Generate _generate; + #endregion + + /// + /// Do not use direclty, only for serialization. + /// + public Update() { } + + /// + /// The Generate tag used by a generated update statement. + /// (CRUD operation) + /// + [XmlElement("generate", typeof(Generate))] + public Generate Generate + { + get => _generate; + set => _generate = value; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/BaseDataExchange.cs b/ORBatisFramework/DataExchange/BaseDataExchange.cs new file mode 100644 index 0000000..7f2485f --- /dev/null +++ b/ORBatisFramework/DataExchange/BaseDataExchange.cs @@ -0,0 +1,76 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-01 11:53:15 -0700 (Sat, 01 Apr 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// Summary description for BaseDataExchange. + /// + public abstract class BaseDataExchange : IDataExchange + { + /// + /// Constructor + /// + /// + public BaseDataExchange(DataExchangeFactory dataExchangeFactory) + { + DataExchangeFactory = dataExchangeFactory; + } + + /// + /// Getter for the factory that created this object + /// + public DataExchangeFactory DataExchangeFactory { get; } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public abstract object GetData(ParameterProperty mapping, object parameterObject); + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public abstract void SetData(ref object target, ResultProperty mapping, object dataBaseValue); + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public abstract void SetData(ref object target, ParameterProperty mapping, object dataBaseValue); + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/ComplexDataExchange.cs b/ORBatisFramework/DataExchange/ComplexDataExchange.cs new file mode 100644 index 0000000..224b2e9 --- /dev/null +++ b/ORBatisFramework/DataExchange/ComplexDataExchange.cs @@ -0,0 +1,89 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-23 14:42:23 -0600 (Tue, 23 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// A IDataExchange implemtation for working with .NET object + /// + public sealed class ComplexDataExchange : BaseDataExchange + { + /// + /// Cosntructor + /// + /// + public ComplexDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + if (parameterObject != null) + { + if (DataExchangeFactory.TypeHandlerFactory.IsSimpleType(parameterObject.GetType())) return parameterObject; + + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, DataExchangeFactory.AccessorFactory); + } + + return null; + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/DataExchangeFactory.cs b/ORBatisFramework/DataExchange/DataExchangeFactory.cs new file mode 100644 index 0000000..10f1550 --- /dev/null +++ b/ORBatisFramework/DataExchange/DataExchangeFactory.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-11-12 10:00:49 -0700 (Sun, 12 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.TypeHandlers; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// Factory for DataExchange objects + /// + public class DataExchangeFactory + { + private readonly IDataExchange _complexDataExchange; + private readonly IDataExchange _dictionaryDataExchange; + private readonly IDataExchange _listDataExchange; + + private readonly IDataExchange _primitiveDataExchange; + + + /// + /// Initializes a new instance of the class. + /// + /// The type handler factory. + /// The object factory. + /// The accessor factory. + public DataExchangeFactory(TypeHandlerFactory typeHandlerFactory, + IObjectFactory objectFactory, + AccessorFactory accessorFactory) + { + ObjectFactory = objectFactory; + TypeHandlerFactory = typeHandlerFactory; + AccessorFactory = accessorFactory; + + _primitiveDataExchange = new PrimitiveDataExchange(this); + _complexDataExchange = new ComplexDataExchange(this); + _listDataExchange = new ListDataExchange(this); + _dictionaryDataExchange = new DictionaryDataExchange(this); + } + + /// + /// Getter for the type handler factory + /// + public TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The factory for object + /// + public IObjectFactory ObjectFactory { get; } + + /// + /// The factory which build + /// + public AccessorFactory AccessorFactory { get; } + + /// + /// Get a DataExchange object for the passed in Class + /// + /// The class to get a DataExchange object for + /// The IDataExchange object + public IDataExchange GetDataExchangeForClass(Type clazz) + { + IDataExchange dataExchange = null; + if (clazz == null) + dataExchange = _complexDataExchange; + else if (typeof(IList).IsAssignableFrom(clazz)) + dataExchange = _listDataExchange; + else if (typeof(IDictionary).IsAssignableFrom(clazz)) + dataExchange = _dictionaryDataExchange; + else if (TypeHandlerFactory.GetTypeHandler(clazz) != null) + dataExchange = _primitiveDataExchange; + else + dataExchange = new DotNetObjectDataExchange(clazz, this); + + return dataExchange; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/DictionaryDataExchange.cs b/ORBatisFramework/DataExchange/DictionaryDataExchange.cs new file mode 100644 index 0000000..c09e8e3 --- /dev/null +++ b/ORBatisFramework/DataExchange/DictionaryDataExchange.cs @@ -0,0 +1,82 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// DataExchange implementation for IDictionary objects + /// + public sealed class DictionaryDataExchange : BaseDataExchange + { + /// + /// Cosntructor + /// + /// + public DictionaryDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + ((IDictionary)target).Add(mapping.PropertyName, dataBaseValue); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/DotNetObjectDataExchange.cs b/ORBatisFramework/DataExchange/DotNetObjectDataExchange.cs new file mode 100644 index 0000000..62ea855 --- /dev/null +++ b/ORBatisFramework/DataExchange/DotNetObjectDataExchange.cs @@ -0,0 +1,112 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2008-10-11 15:26:43 -0600 (Sat, 11 Oct 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// IDataExchange implementation for .NET object + /// + public sealed class DotNetObjectDataExchange : BaseDataExchange + { + private readonly Type _parameterClass; + + /// + /// Cosntructor + /// + /// + /// + public DotNetObjectDataExchange(Type parameterClass, DataExchangeFactory dataExchangeFactory) + : base(dataExchangeFactory) + { + _parameterClass = parameterClass; + } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + if (mapping.IsComplexMemberName || _parameterClass != parameterObject.GetType()) + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + + return mapping.GetAccessor.Get(parameterObject); + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + var targetType = target.GetType(); + if (targetType != _parameterClass + && !targetType.IsSubclassOf(_parameterClass) + && !_parameterClass.IsAssignableFrom(targetType)) + throw new ArgumentException("Could not set value in class '" + target.GetType() + "' for property '" + mapping.PropertyName + "' of type '" + mapping.MemberType + "'"); + if (mapping.IsComplexMemberName) + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + else + mapping.SetAccessor.Set(target, dataBaseValue); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + if (mapping.IsComplexMemberName) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + else + { + var setAccessorFactory = DataExchangeFactory.AccessorFactory.SetAccessorFactory; + var _setAccessor = setAccessorFactory.CreateSetAccessor(_parameterClass, mapping.PropertyName); + + _setAccessor.Set(target, dataBaseValue); + } + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/IDataExchange.cs b/ORBatisFramework/DataExchange/IDataExchange.cs new file mode 100644 index 0000000..8b7f65d --- /dev/null +++ b/ORBatisFramework/DataExchange/IDataExchange.cs @@ -0,0 +1,60 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-01 11:53:15 -0700 (Sat, 01 Apr 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// Interface for exchanging data between a parameter map/result map and the related objects + /// + public interface IDataExchange + { + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + object GetData(ParameterProperty mapping, object parameterObject); + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + void SetData(ref object target, ResultProperty mapping, object dataBaseValue); + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + void SetData(ref object target, ParameterProperty mapping, object dataBaseValue); + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/ListDataExchange.cs b/ORBatisFramework/DataExchange/ListDataExchange.cs new file mode 100644 index 0000000..57f82f9 --- /dev/null +++ b/ORBatisFramework/DataExchange/ListDataExchange.cs @@ -0,0 +1,83 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// IDataExchange implementation for IList objects + /// + public sealed class ListDataExchange : BaseDataExchange + { + /// + /// Cosntructor + /// + /// + public ListDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + ObjectProbe.SetMemberValue(target, mapping.PropertyName, dataBaseValue, + DataExchangeFactory.ObjectFactory, + DataExchangeFactory.AccessorFactory); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/DataExchange/PrimitiveDataExchange.cs b/ORBatisFramework/DataExchange/PrimitiveDataExchange.cs new file mode 100644 index 0000000..36bddcd --- /dev/null +++ b/ORBatisFramework/DataExchange/PrimitiveDataExchange.cs @@ -0,0 +1,86 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.DataExchange +{ + /// + /// DataExchange implementation for "primitive" objects. + /// + /// + /// The primitive types are Boolean, Byte, SByte, Int16, UInt16, Int32, + /// UInt32, Int64, UInt64, Char, Double, and Single + string, Guid, Decimal, DateTime + /// + public sealed class PrimitiveDataExchange : BaseDataExchange + { + /// + /// Cosntructor + /// + /// + public PrimitiveDataExchange(DataExchangeFactory dataExchangeFactory) : base(dataExchangeFactory) { } + + #region IDataExchange Members + /// + /// Gets the data to be set into a IDataParameter. + /// + /// + /// + public override object GetData(ParameterProperty mapping, object parameterObject) + { + if (mapping.IsComplexMemberName) + return ObjectProbe.GetMemberValue(parameterObject, mapping.PropertyName, + DataExchangeFactory.AccessorFactory); + + return parameterObject; + } + + /// + /// Sets the value to the result property. + /// + /// + /// + /// + public override void SetData(ref object target, ResultProperty mapping, object dataBaseValue) + { + target = dataBaseValue; + } + + /// + /// Sets the value to the parameter property. + /// + /// Use to set value on output parameter + /// + /// + /// + public override void SetData(ref object target, ParameterProperty mapping, object dataBaseValue) + { + target = dataBaseValue; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Delegates.cs b/ORBatisFramework/Delegates.cs new file mode 100644 index 0000000..9ffe439 --- /dev/null +++ b/ORBatisFramework/Delegates.cs @@ -0,0 +1,64 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 430536 $ + * $LastChangedDate: 2006-08-10 23:24:45 +0200 (jeu., 10 ao�t 2006) $ + * $LastChangedBy: rgrabowski $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Generic; + +namespace IBatisNet.DataMapper +{ + /// + /// A delegate called once per row in the QueryWithRowDelegate method + /// + /// The object currently being processed. + /// The optional parameter object passed into the QueryWithRowDelegate method. + /// The IList that will be returned to the caller. + public delegate void RowDelegate(object obj, object parameterObject, IList list); + + /// + /// A delegate called once per row in the QueryWithRowDelegate method + /// + /// The object currently being processed. + /// The optional parameter object passed into the QueryWithRowDelegate method. + /// The IList that will be returned to the caller. + public delegate void RowDelegate(object obj, object parameterObject, IList list); + + /// + /// A delegate called once per row in the QueryForMapWithRowDelegate method + /// + /// + /// + /// The optional parameter object passed into the QueryForMapWithRowDelegate method. + /// The IDictionary that will be returned to the caller. + public delegate void DictionaryRowDelegate(K key, V value, object parameterObject, IDictionary dictionary); + + /// + /// A delegate called once per row in the QueryForMapWithRowDelegate method + /// + /// + /// + /// The optional parameter object passed into the QueryForMapWithRowDelegate method. + /// The IDictionary that will be returned to the caller. + public delegate void DictionaryRowDelegate(object key, object value, object parameterObject, IDictionary dictionary); +} \ No newline at end of file diff --git a/ORBatisFramework/Enumeration.cs b/ORBatisFramework/Enumeration.cs new file mode 100644 index 0000000..0953b7a --- /dev/null +++ b/ORBatisFramework/Enumeration.cs @@ -0,0 +1,59 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper +{ + /// + /// Indicate if the generated key by a selectKey statement + /// concern a pre or post-generated key. + /// + public enum SelectKeyType + { + /// + /// + pre = 1, + + /// + /// + post = 2 + } + + /// + /// + public enum CacheKeyType + { + /// + /// + Object = 1, + + /// + /// + List = 2, + + /// + /// + Map = 3 + } +} \ No newline at end of file diff --git a/ORBatisFramework/Exceptions/DataMapperException.cs b/ORBatisFramework/Exceptions/DataMapperException.cs new file mode 100644 index 0000000..7648c98 --- /dev/null +++ b/ORBatisFramework/Exceptions/DataMapperException.cs @@ -0,0 +1,110 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Runtime.Serialization; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.DataMapper.Exceptions +{ + /// + /// The DataMapperException is thrown when an error in the SqlMapper component occurs. + /// + [Serializable] + public class DataMapperException : IBatisNetException + { + /// + /// Initializes a new instance of the class. + /// + /// + /// This constructor initializes the + /// Message + /// property of the new instance + /// to a system-supplied message that describes the error. + /// + public DataMapperException() : base("iBATIS.NET DataMapper component caused an exception.") { } + + /// + /// Initializes a new instance of the + /// class with a reference to the inner exception that is the cause of this exception. + /// + /// + /// This constructor initializes the Message property of the new instance + /// using the message parameter. + /// + /// + /// The exception that is the cause of the current exception. + /// If the innerException parameter is not a null reference (Nothing in Visual Basic), + /// the current exception is raised in a catch block that handles the inner exception. + /// + public DataMapperException(Exception ex) : base("iBATIS.NET DataMapper component caused an exception.", ex) { } + + + /// + /// Initializes a new instance of the + /// class with a specified error message. + /// + /// + /// This constructor initializes the Message property of the new instance to + /// the Message property of the passed in exception. + /// + /// The message that describes the error. + public DataMapperException(string message) : base(message) { } + + /// + /// Initializes a new instance of the + /// class with a specified error message and a reference to the inner exception + /// that is the cause of this exception. + /// + /// + /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous + /// exception in the InnerException property. + /// The InnerException property returns the same value that is passed into the constructor, or a null reference + /// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the + /// constructor. + /// + /// The message that describes the error. + /// The exception that caused the error + public DataMapperException(string message, Exception inner) : base(message, inner) { } + + /// + /// Initializes a new instance of the + /// class with serialized data. + /// + /// + /// This constructor is called during deserialization to reconstitute the + /// exception object transmitted over a stream. + /// + /// + /// The that holds the serialized + /// object data about the exception being thrown. + /// + /// + /// The that contains contextual + /// information about the source or destination. + /// + protected DataMapperException(SerializationInfo info, StreamingContext context) : base(info, context) { } + } +} \ No newline at end of file diff --git a/ORBatisFramework/ExecuteEventArgs.cs b/ORBatisFramework/ExecuteEventArgs.cs new file mode 100644 index 0000000..be47b54 --- /dev/null +++ b/ORBatisFramework/ExecuteEventArgs.cs @@ -0,0 +1,40 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; + +namespace IBatisNet.DataMapper +{ + /// + /// Summary description for ExecuteEventArgs. + /// + public class ExecuteEventArgs : EventArgs + { + /// + /// Set or get the statement name + /// + public string StatementName { get; set; } = string.Empty; + } +} \ No newline at end of file diff --git a/ORBatisFramework/ISqlMapSession.cs b/ORBatisFramework/ISqlMapSession.cs new file mode 100644 index 0000000..62ffdcb --- /dev/null +++ b/ORBatisFramework/ISqlMapSession.cs @@ -0,0 +1,51 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 474910 $ + * $LastChangedDate: 2006-11-14 19:33:12 +0100 (mar., 14 nov. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common; + +namespace IBatisNet.DataMapper +{ + /// + /// SqlMap Session contract + /// + public interface ISqlMapSession : IDalSession + { + /// + /// Gets the SQL mapper. + /// + /// The SQL mapper. + ISqlMapper SqlMapper { get; } + + /// + /// Create the connection + /// + void CreateConnection(); + + /// + /// Create the connection + /// + void CreateConnection(string connectionString); + } +} \ No newline at end of file diff --git a/ORBatisFramework/ISqlMapper.cs b/ORBatisFramework/ISqlMapper.cs new file mode 100644 index 0000000..220d83e --- /dev/null +++ b/ORBatisFramework/ISqlMapper.cs @@ -0,0 +1,606 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region using +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using IBatisNet.Common; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements; +using IBatisNet.DataMapper.TypeHandlers; + +//using IBatisNet.DataMapper.SessionStore; +#endregion + +namespace IBatisNet.DataMapper +{ + /// + /// Contract for an + /// + public interface ISqlMapper + { + /// + /// Name used to identify the the + /// + string Id { get; } + + /// + /// Allow to set a custom session store like the + /// + /// Set it after the configuration and before use of the + /// + /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); + /// + //ISessionStore SessionStore { set; } + + /// + /// Gets a value indicating whether this instance is session started. + /// + /// + /// true if this instance is session started; otherwise, false. + /// + //bool IsSessionStarted { get; } + + /// + /// Returns the DalSession instance + /// currently being used by the SqlMap. + /// + //ISqlMapSession LocalSession { get; } + + /// + /// Gets the DB helper parameter cache. + /// + /// The DB helper parameter cache. + DBHelperParameterCache DBHelperParameterCache { get; } + + /// + /// A flag that determines whether cache models were enabled + /// when this SqlMap was built. + /// + bool IsCacheModelsEnabled { get; set; } + + /// + /// Factory for DataExchange objects + /// + DataExchangeFactory DataExchangeFactory { get; } + + /// + /// The TypeHandlerFactory + /// + TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The meta factory for object factory + /// + IObjectFactory ObjectFactory { get; } + + /// + /// The factory which build + /// + AccessorFactory AccessorFactory { get; } + + /// + /// The ParameterMap collection + /// + HybridDictionary ParameterMaps { get; } + + /// + /// The ResultMap collection + /// + HybridDictionary ResultMaps { get; } + + /// + /// The MappedStatements collection + /// + HybridDictionary MappedStatements { get; } + + ///// + ///// Begins the transaction. + ///// + ///// + //ISqlMapSession BeginTransaction(); + + ///// + ///// Begins the transaction. + ///// + ///// if set to true [open connection]. + ///// + //ISqlMapSession BeginTransaction(bool openConnection); + + ///// + ///// Begins the transaction. + ///// + ///// The connection string. + ///// + //ISqlMapSession BeginTransaction(string connectionString); + + ///// + ///// Begins the transaction. + ///// + ///// if set to true [open new connection]. + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel); + + ///// + ///// Begins the transaction. + ///// + ///// The connection string. + ///// if set to true [open new connection]. + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel); + + ///// + ///// Begins the transaction. + ///// + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(IsolationLevel isolationLevel); + + ///// + ///// Begins the transaction. + ///// + ///// The connection string. + ///// The isolation level. + ///// + //ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel); + + ///// + ///// Closes the connection. + ///// + //void CloseConnection(); + + ///// + ///// Commits the transaction. + ///// + ///// if set to true [close connection]. + //void CommitTransaction(bool closeConnection); + + ///// + ///// Commits the transaction. + ///// + //void CommitTransaction(); + + /// + /// Gets or sets the data source. + /// + /// The data source. + IDataSource DataSource { get; set; } + + /// + /// Creates a new SqlMapSession that will be used to query the data source. + /// + /// A new session + ISqlMapSession CreateSqlMapSession(); + + /// + /// Get a ParameterMap by name + /// + /// The name of the ParameterMap + /// The ParameterMap + ParameterMap GetParameterMap(string name); + + /// + /// Adds a (named) ParameterMap. + /// + /// the ParameterMap to add + void AddParameterMap(ParameterMap parameterMap); + + /// + /// Gets a ResultMap by name + /// + /// The name of the result map + /// The ResultMap + IResultMap GetResultMap(string name); + + /// + /// Adds a (named) ResultMap + /// + /// The ResultMap to add + void AddResultMap(IResultMap resultMap); + + /// + /// Gets a cache by name + /// + /// The name of the cache to get + /// The cache object + CacheModel GetCache(string name); + + /// + /// Adds a (named) cache. + /// + /// The cache to add + void AddCache(CacheModel cache); + + /// + /// Adds a (named) MappedStatement. + /// + /// The key name + /// The statement to add + void AddMappedStatement(string key, IMappedStatement mappedStatement); + + /// + /// Executes a Sql DELETE statement. + /// Delete returns the number of rows effected. + /// + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + int Delete(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Flushes all cached objects that belong to this SqlMap + /// + void FlushCaches(); + + /// + /// Gets the data cache stats. + /// + /// + string GetDataCacheStats(); + + /// + /// Gets a MappedStatement by name + /// + /// The id of the statement + /// The MappedStatement + IMappedStatement GetMappedStatement(string id); + + /// + /// Executes a Sql INSERT statement. + /// Insert is a bit different from other update methods, as it + /// provides facilities for returning the primary key of the + /// newly inserted row (rather than the effected rows). This + /// functionality is of course optional. + ///

+ /// The parameter object is generally used to supply the input + /// data for the INSERT values. + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// + /// The primary key of the newly inserted row. + /// This might be automatically generated by the RDBMS, + /// or selected from a sequence table or other source. + /// + object Insert(string statementName, object parameterObject, ISqlMapSession session); + + ///// + ///// Opens the connection. + ///// + ///// + //ISqlMapSession OpenConnection(); + + ///// + ///// Opens the connection. + ///// + ///// The connection string. + ///// + //ISqlMapSession OpenConnection(string connectionString); + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + /// A List of result objects. + void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + object QueryForObject(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to + /// automatically scroll through results from a database table. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL + /// The maximum number of objects to store in each page + /// A PaginatedList of beans containing the rows + [Obsolete("This method will be remove in future version.", false)] + PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session); + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); + + ///// + ///// Rolls the back transaction. + ///// + //void RollBackTransaction(); + + ///// + ///// Rolls the back transaction. + ///// + ///// if set to true [close connection]. + //void RollBackTransaction(bool closeConnection); + + /// + /// Executes a Sql UPDATE statement. + /// Update can also be used for any other update statement type, + /// such as inserts and deletes. Update returns the number of + /// rows effected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the UPDATE values as well as the WHERE clause parameter(s). + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + int Update(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary of object containing the rows keyed by keyProperty. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method> + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + T QueryForObject(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ ///

+ /// Name of the statement. + /// The parameter object. + /// + DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session); + } +} \ No newline at end of file diff --git a/ORBatisFramework/Logging/ConfigurationSectionHandler.cs b/ORBatisFramework/Logging/ConfigurationSectionHandler.cs new file mode 100644 index 0000000..559d55c --- /dev/null +++ b/ORBatisFramework/Logging/ConfigurationSectionHandler.cs @@ -0,0 +1,198 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Configuration; +using System.Xml; +using IBatisNet.Common.Logging.Impl; +using ConfigurationException = IBatisNet.Common.Exceptions.ConfigurationException; + +namespace IBatisNet.Common.Logging +{ + /// + /// Used in an application's configuration file (App.Config or Web.Config) to configure the logging subsystem. + /// + /// + /// + /// An example configuration section that writes IBatisNet messages to the Console using the built-in Console + /// Logger. + /// + /// + /// + /// + ///
+ /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// The following aliases are recognized for the type attribute of logFactoryAdapter: + /// + /// + /// + /// CONSOLE + /// Alias for IBatisNet.Common.Logging.Impl.ConsoleOutLoggerFA, IBatisNet.Common + /// + /// + /// TRACE + /// Alias for IBatisNet.Common.Logging.Impl.TraceLoggerFA, IBatisNet.Common + /// + /// + /// NOOP + /// Alias IBatisNet.Common.Logging.Impl.NoOpLoggerFA, IBatisNet.Common + /// + /// + /// + public class ConfigurationSectionHandler : IConfigurationSectionHandler + { + /// + /// Constructor + /// + public ConfigurationSectionHandler() { } + + #region IConfigurationSectionHandler Members + /// + /// Verifies that the logFactoryAdapter element appears once in the configuration section. + /// + /// The parent of the current item. + /// Additional information about the configuration process. + /// The configuration section to apply an XPath query too. + /// + /// A object containing the specified logFactoryAdapter type + /// along with user supplied configuration properties. + /// + public object Create(object parent, object configContext, XmlNode section) + { + var logFactoryElementsCount = section.SelectNodes(LOGFACTORYADAPTER_ELEMENT).Count; + + if (logFactoryElementsCount > 1) throw new ConfigurationException("Only one element allowed"); + + if (logFactoryElementsCount == 1) return ReadConfiguration(section); + + return null; + } + #endregion + + /// + /// Retrieves the of the logger the use by looking at the logFactoryAdapter element + /// of the logging configuration element. + /// + /// + /// + /// A object containing the specified type that implements + /// along with zero or more properties that will be + /// passed to the logger factory adapter's constructor as an . + /// + private LogSetting ReadConfiguration(XmlNode section) + { + var logFactoryElement = section.SelectSingleNode(LOGFACTORYADAPTER_ELEMENT); + + var factoryTypeString = string.Empty; + if (logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB] != null) + factoryTypeString = logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB].Value; + + if (factoryTypeString == string.Empty) + throw new ConfigurationException + ("Required Attribute '" + + LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB + + "' not found in element '" + + LOGFACTORYADAPTER_ELEMENT + + "'" + ); + + Type factoryType = null; + try + { + if (string.Compare(factoryTypeString, "CONSOLE", true) == 0) + factoryType = typeof(ConsoleOutLoggerFA); + else if (string.Compare(factoryTypeString, "TRACE", true) == 0) + factoryType = typeof(TraceLoggerFA); + else if (string.Compare(factoryTypeString, "NOOP", true) == 0) + factoryType = typeof(NoOpLoggerFA); + else + factoryType = Type.GetType(factoryTypeString, true, false); + } + catch (Exception e) + { + throw new ConfigurationException + ("Unable to create type '" + factoryTypeString + "'" + , e + ); + } + + var propertyNodes = logFactoryElement.SelectNodes(ARGUMENT_ELEMENT); + + NameValueCollection properties = null; + properties = new NameValueCollection(StringComparer.InvariantCultureIgnoreCase); + foreach (XmlNode propertyNode in propertyNodes) + { + var key = string.Empty; + var itsValue = string.Empty; + + var keyAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_KEY_ATTRIB]; + var valueAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_VALUE_ATTRIB]; + + if (keyAttrib == null) + throw new ConfigurationException + ("Required Attribute '" + + ARGUMENT_ELEMENT_KEY_ATTRIB + + "' not found in element '" + + ARGUMENT_ELEMENT + + "'" + ); + + key = keyAttrib.Value; + + if (valueAttrib != null) itsValue = valueAttrib.Value; + + properties.Add(key, itsValue); + } + + return new LogSetting(factoryType, properties); + } + + #region Fields + private static readonly string LOGFACTORYADAPTER_ELEMENT = "logFactoryAdapter"; + private static readonly string LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB = "type"; + private static readonly string ARGUMENT_ELEMENT = "arg"; + private static readonly string ARGUMENT_ELEMENT_KEY_ATTRIB = "key"; + private static readonly string ARGUMENT_ELEMENT_VALUE_ATTRIB = "value"; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Logging/LogManager.cs b/ORBatisFramework/Logging/LogManager.cs new file mode 100644 index 0000000..529b8cb --- /dev/null +++ b/ORBatisFramework/Logging/LogManager.cs @@ -0,0 +1,204 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 474141 $ + * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Configuration; +using IBatisNet.Common.Logging.Impl; + +namespace IBatisNet.Common.Logging +{ + /// + /// Uses the specified to create instances + /// that are used to log messages. Inspired by log4net. + /// + public sealed class LogManager + { + private static ILoggerFactoryAdapter _adapter; + private static readonly object _loadLock = new object(); + private static readonly string IBATIS_SECTION_LOGGING = "iBATIS/logging"; + + /// + /// Initializes a new instance of the class. + /// + /// + /// Uses a private access modifier to prevent instantiation of this class. + /// + private LogManager() { } + + + /// + /// Gets or sets the adapter. + /// + /// + /// + /// The IBatisNet.Common assembly ships with the following built-in + /// implementations: + /// + /// + /// + /// + /// + /// + /// Writes output to Console.Out + /// + /// + /// + /// + /// + /// Writes output to the System.Diagnostics.Trace sub-system + /// + /// + /// + /// + /// + /// Ignores all messages + /// + /// + /// + /// The adapter. + public static ILoggerFactoryAdapter Adapter + { + get + { + if (_adapter == null) + lock (_loadLock) + { + if (_adapter == null) _adapter = BuildLoggerFactoryAdapter(); + } + + return _adapter; + } + set + { + lock (_loadLock) + { + _adapter = value; + } + } + } + + + /// + /// Gets the logger. + /// + /// The type. + /// + public static ILog GetLogger(Type type) + { + return Adapter.GetLogger(type); + } + + + /// + /// Gets the logger. + /// + /// The name. + /// + public static ILog GetLogger(string name) + { + return Adapter.GetLogger(name); + } + + + /// + /// Builds the logger factory adapter. + /// + /// + private static ILoggerFactoryAdapter BuildLoggerFactoryAdapter() + { + LogSetting setting = null; + try + { + setting = (LogSetting)ConfigurationManager.GetSection(IBATIS_SECTION_LOGGING); + } + catch (Exception ex) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to read configuration. Using default logger.", ex); + return defaultFactory; + } + + if (setting != null && !typeof(ILoggerFactoryAdapter).IsAssignableFrom(setting.FactoryAdapterType)) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Type " + setting.FactoryAdapterType.FullName + " does not implement ILoggerFactoryAdapter. Using default logger"); + return defaultFactory; + } + + ILoggerFactoryAdapter instance = null; + + if (setting != null) + { + if (setting.Properties.Count > 0) + try + { + object[] args = { setting.Properties }; + + instance = (ILoggerFactoryAdapter)Activator.CreateInstance(setting.FactoryAdapterType, args); + } + catch (Exception ex) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to create instance of type " + setting.FactoryAdapterType.FullName + ". Using default logger.", ex); + return defaultFactory; + } + else + try + { + instance = (ILoggerFactoryAdapter)Activator.CreateInstance(setting.FactoryAdapterType); + } + catch (Exception ex) + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to create instance of type " + setting.FactoryAdapterType.FullName + ". Using default logger.", ex); + return defaultFactory; + } + } + else + { + var defaultFactory = BuildDefaultLoggerFactoryAdapter(); + var log = defaultFactory.GetLogger(typeof(LogManager)); + log.Warn("Unable to read configuration IBatisNet/logging. Using default logger."); + return defaultFactory; + } + + return instance; + } + + + /// + /// Builds the default logger factory adapter. + /// + /// + private static ILoggerFactoryAdapter BuildDefaultLoggerFactoryAdapter() + { + return new NoOpLoggerFA(); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs new file mode 100644 index 0000000..95e9e96 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs @@ -0,0 +1,79 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// Factory to get implementation. + /// + public sealed class ArgumentStrategyFactory + { + private static readonly IArgumentStrategy _defaultStrategy; + private static readonly IArgumentStrategy _resultMapStrategy; + private static readonly IArgumentStrategy _selectArrayStrategy; + private static readonly IArgumentStrategy _selectGenericListStrategy; + private static readonly IArgumentStrategy _selectListStrategy; + private static readonly IArgumentStrategy _selectObjectStrategy; + + /// + /// Initializes the class. + /// + static ArgumentStrategyFactory() + { + _defaultStrategy = new DefaultStrategy(); + _resultMapStrategy = new ResultMapStrategy(); + + _selectArrayStrategy = new SelectArrayStrategy(); + _selectListStrategy = new SelectListStrategy(); + _selectObjectStrategy = new SelectObjectStrategy(); + _selectGenericListStrategy = new SelectGenericListStrategy(); + } + + /// + /// Finds the . + /// + /// The . + /// The + public static IArgumentStrategy Get(ArgumentProperty mapping) + { + // no 'select' or 'resultMap' attributes + if (mapping.Select.Length == 0 && mapping.NestedResultMap == null) + // We have a 'normal' ResultMap + return _defaultStrategy; + + if (mapping.NestedResultMap != null) // 'resultMap' attribut + return _resultMapStrategy; + + //'select' ResultProperty + return new SelectStrategy(mapping, + _selectArrayStrategy, + _selectGenericListStrategy, + _selectListStrategy, + _selectObjectStrategy); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/DefaultStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/DefaultStrategy.cs new file mode 100644 index 0000000..1962607 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/DefaultStrategy.cs @@ -0,0 +1,75 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; +using IBatisNet.DataMapper.TypeHandlers; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// implementation when no 'select' or + /// 'resultMapping' attribute exists on a . + /// + public sealed class DefaultStrategy : IArgumentStrategy + { + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + if (mapping.TypeHandler == null || + mapping.TypeHandler is UnknownTypeHandler) // Find the TypeHandler + lock (mapping) + { + if (mapping.TypeHandler == null || mapping.TypeHandler is UnknownTypeHandler) + { + var columnIndex = 0; + if (mapping.ColumnIndex == ResultProperty.UNKNOWN_COLUMN_INDEX) + columnIndex = reader.GetOrdinal(mapping.ColumnName); + else + columnIndex = mapping.ColumnIndex; + var systemType = reader.GetFieldType(columnIndex); + + mapping.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(systemType); + } + } + + var dataBaseValue = mapping.GetDataBaseValue(reader); + request.IsRowDataFound = request.IsRowDataFound || dataBaseValue != null; + + return dataBaseValue; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs new file mode 100644 index 0000000..67f94da --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs @@ -0,0 +1,47 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// contract to get the value of an argument constructor. + /// + public interface IArgumentStrategy + { + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + object GetValue(RequestScope request, ResultProperty mapping, ref IDataReader reader, object keys); + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs new file mode 100644 index 0000000..d1bc180 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs @@ -0,0 +1,84 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// implementation when a 'resultMapping' attribute exists + /// on a . + /// + public sealed class ResultMapStrategy : BaseStrategy, IArgumentStrategy + { + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + object[] parameters = null; + var isParameterFound = false; + + var resultMapping = mapping.NestedResultMap.ResolveSubMap(reader); + + if (resultMapping.Parameters.Count > 0) + { + parameters = new object[resultMapping.Parameters.Count]; + // Fill parameters array + for (var index = 0; index < resultMapping.Parameters.Count; index++) + { + var property = resultMapping.Parameters[index]; + parameters[index] = property.ArgumentStrategy.GetValue(request, property, ref reader, null); + request.IsRowDataFound = request.IsRowDataFound || parameters[index] != null; + isParameterFound = isParameterFound || parameters[index] != null; + } + } + + object obj = null; + // If I have a constructor tag and all argumments values are null, the obj is null + if (resultMapping.Parameters.Count > 0 && isParameterFound == false) + { + obj = null; + } + else + { + obj = resultMapping.CreateInstanceOfResult(parameters); + if (FillObjectWithReaderAndResultMap(request, reader, resultMapping, ref obj) == false) obj = null; + } + + return obj; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs new file mode 100644 index 0000000..0316969 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs @@ -0,0 +1,66 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on a + /// + public sealed class SelectArrayStrategy : IArgumentStrategy + { + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + var values = selectStatement.ExecuteQueryForList(request.Session, keys); + + var elementType = mapping.MemberType.GetElementType(); + var array = Array.CreateInstance(elementType, values.Count); + var count = values.Count; + for (var i = 0; i < count; i++) array.SetValue(values[i], i); + return array; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs new file mode 100644 index 0000000..e5168c6 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs @@ -0,0 +1,91 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Reflection; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on an and the object property is + /// different from an or an . + /// + public sealed class SelectGenericListStrategy : IArgumentStrategy + { + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + + var typeArgs = mapping.MemberType.GetGenericArguments(); + var genericList = typeof(IList<>); + var constructedType = genericList.MakeGenericType(typeArgs); + var elementType = mapping.MemberType.GetGenericArguments()[0]; + + var mappedStatementType = selectStatement.GetType(); + + Type[] typeArguments = { typeof(SqlMapSession), typeof(object) }; + + var mis = mappedStatementType.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance); + MethodInfo mi = null; + foreach (var m in mis) + if (m.IsGenericMethod && + m.Name == "ExecuteQueryForList" && + m.GetParameters().Length == 2) + { + mi = m; + break; + } + + var miConstructed = mi.MakeGenericMethod(elementType); + + // Invoke the method. + object[] args = { request.Session, keys }; + var values = miConstructed.Invoke(selectStatement, args); + + return values; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectListStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectListStrategy.cs new file mode 100644 index 0000000..16b66a0 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectListStrategy.cs @@ -0,0 +1,71 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on a + /// + public sealed class SelectListStrategy : IArgumentStrategy + { + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + if (mapping.MemberType == typeof(IList)) + { + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + return selectStatement.ExecuteQueryForList(request.Session, keys); + } + + // Strongly typed List + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + var factory = request.DataExchangeFactory.ObjectFactory.CreateFactory(mapping.MemberType, Type.EmptyTypes); + var values = factory.CreateInstance(null); + selectStatement.ExecuteQueryForList(request.Session, keys, (IList)values); + return values; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs new file mode 100644 index 0000000..9ea5bd6 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs @@ -0,0 +1,62 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on an and the object property is + /// different from an or an . + /// + public sealed class SelectObjectStrategy : IArgumentStrategy + { + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + reader = DataReaderTransformer.Transform(reader, request.Session.DataSource.DbProvider); + return selectStatement.ExecuteQueryForObject(request.Session, keys); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectStrategy.cs b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectStrategy.cs new file mode 100644 index 0000000..c2cb7c4 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ArgumentStrategy/SelectStrategy.cs @@ -0,0 +1,130 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; + +//using System.Reflection; +//using IBatisNet.Common; +//using IBatisNet.DataMapper.Commands; + +namespace IBatisNet.DataMapper.MappedStatements.ArgumentStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on a + /// + public class SelectStrategy : IArgumentStrategy + { + private readonly IArgumentStrategy _selectStrategy; + + /// + /// Initializes a new instance of the class. + /// + /// The mapping. + /// The select array strategy. + /// The select generic list strategy. + /// The select list strategy. + /// The select object strategy. + public SelectStrategy(ResultProperty mapping, + IArgumentStrategy selectArrayStrategy, + IArgumentStrategy selectGenericListStrategy, + IArgumentStrategy selectListStrategy, + IArgumentStrategy selectObjectStrategy) + { + // Collection object or .NET object + if (mapping.MemberType.BaseType == typeof(Array)) + _selectStrategy = selectArrayStrategy; + else if (mapping.MemberType.IsGenericType && + typeof(IList<>).IsAssignableFrom(mapping.MemberType.GetGenericTypeDefinition())) + _selectStrategy = selectGenericListStrategy; + // Check if the object to Map implement 'IList' or is IList type + // If yes the ResultProperty is map to a IList object + else if (typeof(IList).IsAssignableFrom(mapping.MemberType)) + _selectStrategy = selectListStrategy; + + else // The ResultProperty is map to a .Net object + _selectStrategy = selectObjectStrategy; + } + + #region IArgumentStrategy Members + /// + /// Gets the value of an argument constructor. + /// + /// The current . + /// The with the argument infos. + /// The current . + /// The keys + /// The paremeter value. + public object GetValue(RequestScope request, ResultProperty mapping, + ref IDataReader reader, object selectKeys) + { + var paramString = mapping.ColumnName; + object keys = null; + var wasNull = false; + + #region Finds the select keys. + if (paramString.IndexOf(',') > 0 || paramString.IndexOf('=') > 0) // composite parameters key + { + IDictionary keyMap = new Hashtable(); + keys = keyMap; + // define which character is seperating fields + char[] splitter = { '=', ',' }; + + var paramTab = paramString.Split(splitter); + if (paramTab.Length % 2 != 0) throw new DataMapperException("Invalid composite key string format in '" + mapping.PropertyName + ". It must be: property1=column1,property2=column2,..."); + var enumerator = paramTab.GetEnumerator(); + while (!wasNull && enumerator.MoveNext()) + { + var hashKey = ((string)enumerator.Current).Trim(); + if (paramString.Contains("=")) // old 1.x style multiple params + enumerator.MoveNext(); + var hashValue = reader.GetValue(reader.GetOrdinal(((string)enumerator.Current).Trim())); + + keyMap.Add(hashKey, hashValue); + wasNull = hashValue == DBNull.Value; + } + } + else // single parameter key + { + keys = reader.GetValue(reader.GetOrdinal(paramString)); + wasNull = reader.IsDBNull(reader.GetOrdinal(paramString)); + } + #endregion + + if (wasNull) return null; + + // Collection object or .Net object + // lazyLoading is not permit for argument constructor + return _selectStrategy.GetValue(request, mapping, ref reader, keys); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/BaseStrategy.cs b/ORBatisFramework/MappedStatements/BaseStrategy.cs new file mode 100644 index 0000000..db960aa --- /dev/null +++ b/ORBatisFramework/MappedStatements/BaseStrategy.cs @@ -0,0 +1,110 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using System.Text; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// BaseStrategy. + /// + public abstract class BaseStrategy + { + private const string KEY_SEPARATOR = "\002"; + + /// + /// Used by N+1 Select solution + /// + public static object SKIP = new object(); + + + /// + /// Calculte a unique key which identify the resukt object build by this + /// + /// + /// + /// + /// + protected string GetUniqueKey(IResultMap resultMap, RequestScope request, IDataReader reader) + { + if (resultMap.GroupByProperties.Count > 0) + { + var keyBuffer = new StringBuilder(); + + for (var i = 0; i < resultMap.GroupByProperties.Count; i++) + { + var resultProperty = resultMap.GroupByProperties[i]; + keyBuffer.Append(resultProperty.GetDataBaseValue(reader)); + keyBuffer.Append('-'); + } + + if (keyBuffer.Length < 1) + // we should never go here + return null; + + // separator value not likely to appear in a database + keyBuffer.Append(KEY_SEPARATOR); + return keyBuffer.ToString(); + } + + // we should never go here + return null; + } + + /// + /// Fills the object with reader and result map. + /// + /// The request. + /// The reader. + /// The result map. + /// The result object. + /// Indicates if we have found a row. + protected bool FillObjectWithReaderAndResultMap(RequestScope request, IDataReader reader, + IResultMap resultMap, ref object resultObject) + { + var dataFound = false; + + if (resultMap.Properties.Count > 0) + { + // For each Property in the ResultMap, set the property in the object + for (var index = 0; index < resultMap.Properties.Count; index++) + { + request.IsRowDataFound = false; + var property = resultMap.Properties[index]; + property.PropertyStrategy.Set(request, resultMap, property, ref resultObject, reader, null); + dataFound = dataFound || request.IsRowDataFound; + } + + request.IsRowDataFound = dataFound; + return dataFound; + } + + return true; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/CachingStatement.cs b/ORBatisFramework/MappedStatements/CachingStatement.cs new file mode 100644 index 0000000..458f999 --- /dev/null +++ b/ORBatisFramework/MappedStatements/CachingStatement.cs @@ -0,0 +1,488 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 602985 $ + * $Date: 2007-12-10 11:25:11 -0700 (Mon, 10 Dec 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Collections.Generic; +using System.Data; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Summary description for CachingStatement. + /// + public sealed class CachingStatement : IMappedStatement + { + private readonly MappedStatement _mappedStatement; + + /// + /// Constructor + /// + /// + public CachingStatement(MappedStatement statement) + { + _mappedStatement = statement; + } + + /// + /// Event launch on exceute query + /// + public event ExecuteEventHandler Execute; + + /// + /// Gets a percentage of successful cache hits achieved + /// + /// The percentage of hits (0-1), or -1 if cache is disabled. + public double GetDataCacheHitRatio() + { + if (_mappedStatement.Statement.CacheModel != null) return _mappedStatement.Statement.CacheModel.HitRatio; + + return -1; + } + + /// + /// Gets the cache key. + /// + /// The request. + /// the cache key + private CacheKey GetCacheKey(RequestScope request) + { + var cacheKey = new CacheKey(); + var count = request.IDbCommand.Parameters.Count; + for (var i = 0; i < count; i++) + { + var dataParameter = (IDataParameter)request.IDbCommand.Parameters[i]; + if (dataParameter.Value != null) cacheKey.Update(dataParameter.Value); + } + + cacheKey.Update(_mappedStatement.Id); + cacheKey.Update(_mappedStatement.SqlMap.DataSource.ConnectionString); + cacheKey.Update(request.IDbCommand.CommandText); + + var cacheModel = _mappedStatement.Statement.CacheModel; + if (!cacheModel.IsReadOnly && !cacheModel.IsSerializable) + // read/write, nonserializable cache models need to use per-session caching + cacheKey.Update(request.Session); + return cacheKey; + } + + #region IMappedStatement Members + /// + /// The IPreparedCommand to use + /// + public IPreparedCommand PreparedCommand => _mappedStatement.PreparedCommand; + + /// + /// Name used to identify the MappedStatement amongst the others. + /// This the name of the SQL statment by default. + /// + public string Id => _mappedStatement.Id; + + /// + /// The SQL statment used by this MappedStatement + /// + public IStatement Statement => _mappedStatement.Statement; + + /// + /// The SqlMap used by this MappedStatement + /// + public ISqlMapper SqlMap => _mappedStatement.SqlMap; + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + IDictionary map = new Hashtable(); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForMap"); + if (keyProperty != null) cacheKey.Update(keyProperty); + if (valueProperty != null) cacheKey.Update(valueProperty); + + map = Statement.CacheModel[cacheKey] as IDictionary; + if (map == null) + { + map = _mappedStatement.RunQueryForMap(request, session, parameterObject, keyProperty, valueProperty, null); + Statement.CacheModel[cacheKey] = map; + } + + return map; + } + + #region ExecuteQueryForMap .NET 2.0 + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + IDictionary map = new Dictionary(); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForMap"); + if (keyProperty != null) cacheKey.Update(keyProperty); + if (valueProperty != null) cacheKey.Update(valueProperty); + + map = Statement.CacheModel[cacheKey] as IDictionary; + if (map == null) + { + map = _mappedStatement.RunQueryForDictionary(request, session, parameterObject, keyProperty, valueProperty, null); + Statement.CacheModel[cacheKey] = map; + } + + return map; + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + #endregion + + /// + /// Execute an update statement. Also used for delete statement. + /// Return the number of row effected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of row effected. + public int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + return _mappedStatement.ExecuteUpdate(session, parameterObject); + } + + /// + /// Execute an insert statement. Fill the parameter object with + /// the ouput parameters if any, also could return the insert generated key + /// + /// The session + /// The parameter object used to fill the statement. + /// Can return the insert generated key. + public object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + return _mappedStatement.ExecuteInsert(session, parameterObject); + } + + #region ExecuteQueryForList + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + _mappedStatement.ExecuteQueryForList(session, parameterObject, resultObject); + } + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForList"); + cacheKey.Update(skipResults); + cacheKey.Update(maxResults); + + list = Statement.CacheModel[cacheKey] as IList; + if (list == null) + { + list = _mappedStatement.RunQueryForList(request, session, parameterObject, skipResults, maxResults); + Statement.CacheModel[cacheKey] = list; + } + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForList(session, parameterObject, MappedStatement.NO_SKIPPED_RESULTS, MappedStatement.NO_MAXIMUM_RESULTS); + } + #endregion + + #region ExecuteQueryForList .NET 2.0 + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + _mappedStatement.ExecuteQueryForList(session, parameterObject, resultObject); + } + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForList"); + cacheKey.Update(skipResults); + cacheKey.Update(maxResults); + + list = Statement.CacheModel[cacheKey] as IList; + if (list == null) + { + list = _mappedStatement.RunQueryForList(request, session, parameterObject, skipResults, maxResults); + Statement.CacheModel[cacheKey] = list; + } + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForList(session, parameterObject, MappedStatement.NO_SKIPPED_RESULTS, MappedStatement.NO_MAXIMUM_RESULTS); + } + #endregion + + #region ExecuteQueryForObject + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, null); + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + object obj = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForObject"); + + obj = Statement.CacheModel[cacheKey]; + // check if this query has alreay been run + if (obj == CacheModel.NULL_OBJECT) + { + // convert the marker object back into a null value + obj = null; + } + else if (obj == null) + { + obj = _mappedStatement.RunQueryForObject(request, session, parameterObject, resultObject); + Statement.CacheModel[cacheKey] = obj; + } + + return obj; + } + + + #region ExecuteQueryForObject .NET 2.0 + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public T ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, default(T)); + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public T ExecuteQueryForObject(ISqlMapSession session, object parameterObject, T resultObject) + { + var obj = default(T); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + _mappedStatement.PreparedCommand.Create(request, session, Statement, parameterObject); + + var cacheKey = GetCacheKey(request); + cacheKey.Update("ExecuteQueryForObject"); + + var cacheObjet = Statement.CacheModel[cacheKey]; + // check if this query has alreay been run + if (cacheObjet is T) + { + obj = (T)cacheObjet; + } + else if (cacheObjet == CacheModel.NULL_OBJECT) + { + // convert the marker object back into a null value + obj = default; + } + else + { + obj = _mappedStatement.RunQueryForObject(request, session, parameterObject, resultObject); + Statement.CacheModel[cacheKey] = obj; + } + + return obj; + } + #endregion + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + return _mappedStatement.ExecuteQueryForMapWithRowDelegate(session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + #endregion + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/DeleteMappedStatement.cs b/ORBatisFramework/MappedStatements/DeleteMappedStatement.cs new file mode 100644 index 0000000..09c19af --- /dev/null +++ b/ORBatisFramework/MappedStatements/DeleteMappedStatement.cs @@ -0,0 +1,141 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Collections; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Summary description for DeleteMappedStatement. + /// + public sealed class DeleteMappedStatement : MappedStatement + { + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal DeleteMappedStatement(ISqlMapper sqlMap, IStatement statement) + : base(sqlMap, statement) { } + + #region ExecuteQueryForMap + /// + /// + /// + /// + /// + /// + /// + public override IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + throw new DataMapperException("Delete statements cannot be executed as a query for map."); + } + #endregion + + #region ExecuteInsert + /// + /// + /// + /// + /// + public override object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query insert."); + } + #endregion + + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + throw new DataMapperException("Delete statements cannot be executed as a query for row delegate."); + } + + #region ExecuteQueryForList + /// + /// + /// + /// + /// + public override void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + throw new DataMapperException("Delete statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for list."); + } + #endregion + + + #region ExecuteForObject + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for object."); + } + + /// + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + throw new DataMapperException("Delete statements cannot be executed as a query for object."); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/IMappedStatement.cs b/ORBatisFramework/MappedStatements/IMappedStatement.cs new file mode 100644 index 0000000..b79978d --- /dev/null +++ b/ORBatisFramework/MappedStatements/IMappedStatement.cs @@ -0,0 +1,291 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System.Collections; +using System.Collections.Generic; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.Statements; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// + public delegate void ExecuteEventHandler(object sender, ExecuteEventArgs e); + + /// + /// Summary description for IMappedStatement. + /// + public interface IMappedStatement + { + #region Event + /// + /// Event launch on exceute query + /// + event ExecuteEventHandler Execute; + #endregion + + #region ExecuteQueryForMap + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty); + #endregion + + #region ExecuteUpdate + /// + /// Execute an update statement. Also used for delete statement. + /// Return the number of row effected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of row effected. + int ExecuteUpdate(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteInsert + /// + /// Execute an insert statement. Fill the parameter object with + /// the ouput parameters if any, also could return the insert generated key + /// + /// The session + /// The parameter object used to fill the statement. + /// Can return the insert generated key. + object ExecuteInsert(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteQueryForRowDelegate .NET 2.0 + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + /// param> + /// + IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate); + #endregion + + #region Properties + /// + /// The IPreparedCommand to use + /// + IPreparedCommand PreparedCommand { get; } + + /// + /// Name used to identify the MappedStatement amongst the others. + /// This the name of the SQL statment by default. + /// + string Id { get; } + + /// + /// The SQL statment used by this MappedStatement + /// + IStatement Statement { get; } + + + /// + /// The SqlMap used by this MappedStatement + /// + ISqlMapper SqlMap { get; } + #endregion + + #region ExecuteQueryForMap .NET 2.0 + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty); + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate); + #endregion + + #region ExecuteQueryForList + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject); + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults); + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteQueryForList .NET 2.0 + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject); + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults); + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList ExecuteQueryForList(ISqlMapSession session, object parameterObject); + #endregion + + #region ExecuteForObject + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + object ExecuteQueryForObject(ISqlMapSession session, object parameterObject); + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject); + #endregion + + + #region ExecuteForObject .NET 2.0 + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + T ExecuteQueryForObject(ISqlMapSession session, object parameterObject); + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + T ExecuteQueryForObject(ISqlMapSession session, object parameterObject, T resultObject); + #endregion + + #region Delegate + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + /// param> + /// + IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate); + + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate); + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/InsertMappedStatement.cs b/ORBatisFramework/MappedStatements/InsertMappedStatement.cs new file mode 100644 index 0000000..df01f5b --- /dev/null +++ b/ORBatisFramework/MappedStatements/InsertMappedStatement.cs @@ -0,0 +1,157 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Collections; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Summary description for InsertMappedStatement. + /// + public sealed class InsertMappedStatement : MappedStatement + { + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal InsertMappedStatement(ISqlMapper sqlMap, IStatement statement) : base(sqlMap, statement) { } + + #region ExecuteQueryForMap + /// + /// + /// + /// + /// + /// + /// + public override IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + throw new DataMapperException("Insert statements cannot be executed as a query for map."); + } + #endregion + + #region ExecuteUpdate + /// + /// + /// + /// + /// + public override int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a update query."); + } + #endregion + + #region ExecuteQueryForList + /// + /// + /// + /// + /// + public override void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + throw new DataMapperException("Insert statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for list."); + } + #endregion + + #region Delegate + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + throw new DataMapperException("Insert statements cannot be executed as a query for row delegate."); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public override IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + throw new DataMapperException("Insert statements cannot be executed as a query for row delegate."); + } + #endregion + + #region ExecuteForObject + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for object."); + } + + /// + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + throw new DataMapperException("Insert statements cannot be executed as a query for object."); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/MappedStatement.cs b/ORBatisFramework/MappedStatements/MappedStatement.cs new file mode 100644 index 0000000..0186c6e --- /dev/null +++ b/ORBatisFramework/MappedStatements/MappedStatement.cs @@ -0,0 +1,1103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 575902 $ + * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using System.Text; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Commands; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements.PostSelectStrategy; +using IBatisNet.DataMapper.MappedStatements.ResultStrategy; +using IBatisNet.DataMapper.Scope; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Summary description for MappedStatement. + /// + public class MappedStatement : IMappedStatement + { + #region Constructor (s) / Destructor + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal MappedStatement(ISqlMapper sqlMap, IStatement statement) + { + SqlMap = sqlMap; + Statement = statement; + PreparedCommand = PreparedCommandFactory.GetPreparedCommand(false); + _resultStrategy = ResultStrategyFactory.Get(Statement); + } + #endregion + + /// + /// Event launch on exceute query + /// + public event ExecuteEventHandler Execute; + + #region Fields + // Magic number used to set the the maximum number of rows returned to 'all'. + internal const int NO_MAXIMUM_RESULTS = -1; + + // Magic number used to set the the number of rows skipped to 'none'. + internal const int NO_SKIPPED_RESULTS = -1; + + private readonly IResultStrategy _resultStrategy; + #endregion + + #region Properties + /// + /// The IPreparedCommand to use + /// + public IPreparedCommand PreparedCommand { get; } + + /// + /// Name used to identify the MappedStatement amongst the others. + /// This the name of the SQL statement by default. + /// + public string Id => Statement.Id; + + /// + /// The SQL statment used by this MappedStatement + /// + public IStatement Statement { get; } + + /// + /// The SqlMap used by this MappedStatement + /// + public ISqlMapper SqlMap { get; } + #endregion + + #region Methods + /// + /// Retrieve the output parameter and map them on the result object. + /// This routine is only use is you specified a ParameterMap and some output attribute + /// or if you use a store procedure with output parameter... + /// + /// + /// The current session. + /// The result object. + /// The command sql. + private void RetrieveOutputParameters(RequestScope request, ISqlMapSession session, IDbCommand command, object result) + { + if (request.ParameterMap != null) + { + var count = request.ParameterMap.PropertiesList.Count; + for (var i = 0; i < count; i++) + { + var mapping = request.ParameterMap.GetProperty(i); + if (mapping.Direction == ParameterDirection.Output || + mapping.Direction == ParameterDirection.InputOutput) + { + var parameterName = string.Empty; + if (session.DataSource.DbProvider.UseParameterPrefixInParameter == false) + parameterName = mapping.ColumnName; + else + parameterName = session.DataSource.DbProvider.ParameterPrefix + + mapping.ColumnName; + + if (mapping.TypeHandler == null) // Find the TypeHandler + lock (mapping) + { + if (mapping.TypeHandler == null) + { + var propertyType = ObjectProbe.GetMemberTypeForGetter(result, mapping.PropertyName); + + mapping.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(propertyType); + } + } + + // Fix IBATISNET-239 + //"Normalize" System.DBNull parameters + var dataParameter = (IDataParameter)command.Parameters[parameterName]; + var dbValue = dataParameter.Value; + + object value = null; + + var wasNull = dbValue == DBNull.Value; + if (wasNull) + { + if (mapping.HasNullValue) + value = mapping.TypeHandler.ValueOf(mapping.GetAccessor.MemberType, mapping.NullValue); + else + value = mapping.TypeHandler.NullValue; + } + else + { + value = mapping.TypeHandler.GetDataBaseValue(dataParameter.Value, result.GetType()); + } + + request.IsRowDataFound = request.IsRowDataFound || value != null; + + request.ParameterMap.SetOutputParameter(ref result, mapping, value); + } + } + } + } + + + #region ExecuteForObject + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public virtual object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, null); + } + + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public virtual object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + object obj = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + obj = RunQueryForObject(request, session, parameterObject, resultObject); + + return obj; + } + + public dynamic ExecuteQueryForDynamicObject(ISqlMapSession session, object parameterObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + var obj = RunQueryForDynamicObject(request, session, parameterObject); + + return obj; + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + internal dynamic RunQueryForDynamicObject(RequestScope request, ISqlMapSession session, object parameterObject) + { + var resultObject = default(dynamic); + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + while (reader.Read()) + { + object obj = _resultStrategy.Process(request, ref reader, resultObject); + if (obj != BaseStrategy.SKIP) resultObject = obj; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + #region remark + // If you are using the OleDb data provider (as you are), you need to close the + // DataReader before output parameters are visible. + #endregion + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return resultObject; + } + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + internal object RunQueryForObject(RequestScope request, ISqlMapSession session, object parameterObject, object resultObject) + { + var result = resultObject; + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, resultObject); + if (obj != BaseStrategy.SKIP) result = obj; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + #region remark + // If you are using the OleDb data provider (as you are), you need to close the + // DataReader before output parameters are visible. + #endregion + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return result; + } + #endregion + + #region ExecuteForObject .NET 2.0 + /// + /// Executes an SQL statement that returns a single row as an Object. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The object + public virtual T ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + return ExecuteQueryForObject(session, parameterObject, default(T)); + } + + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + public virtual T ExecuteQueryForObject(ISqlMapSession session, object parameterObject, T resultObject) + { + var obj = default(T); + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + obj = RunQueryForObject(request, session, parameterObject, resultObject); + + return obj; + } + + + /// + /// Executes an SQL statement that returns a single row as an Object of the type of + /// the resultObject passed in as a parameter. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object. + /// The object + internal T RunQueryForObject(RequestScope request, ISqlMapSession session, object parameterObject, T resultObject) + { + var result = resultObject; + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, resultObject); + if (obj != BaseStrategy.SKIP) result = (T)obj; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + #region remark + // If you are using the OleDb data provider, you need to close the + // DataReader before output parameters are visible. + #endregion + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return result; + } + #endregion + + #region ExecuteQueryForList + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public virtual IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + if (rowDelegate == null) throw new DataMapperException("A null RowDelegate was passed to QueryForRowDelegate."); + + return RunQueryForList(request, session, parameterObject, null, rowDelegate); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public virtual IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + if (rowDelegate == null) throw new DataMapperException("A null DictionaryRowDelegate was passed to QueryForMapWithRowDelegate."); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForMap(request, session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, null, null); + } + + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, skipResults, maxResults); + } + + /// + /// Runs the query for list. + /// + /// The request. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + + using (var command = request.IDbCommand) + { + if (Statement.ListClass == null) + list = new ArrayList(); + else + list = Statement.CreateInstanceOfListClass(); + + var reader = command.ExecuteReader(); + + try + { + // skip results + for (var i = 0; i < skipResults; i++) + if (!reader.Read()) + break; + + // Get Results + var resultsFetched = 0; + while ((maxResults == NO_MAXIMUM_RESULTS || resultsFetched < maxResults) + && reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add(obj); + resultsFetched++; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + /// + /// Executes the SQL and retuns a List of result objects. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + /// + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, object parameterObject, IList resultObject, RowDelegate rowDelegate) + { + var list = resultObject; + + using (var command = request.IDbCommand) + { + if (resultObject == null) + { + if (Statement.ListClass == null) + list = new ArrayList(); + else + list = Statement.CreateInstanceOfListClass(); + } + + var reader = command.ExecuteReader(); + + try + { + do + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add(obj); + } + else + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + rowDelegate(obj, parameterObject, list); + } + } while (reader.NextResult()); + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public virtual void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + RunQueryForList(request, session, parameterObject, resultObject, null); + } + #endregion + + #region ExecuteQueryForList .NET 2.0 + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// + public virtual IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + if (rowDelegate == null) throw new DataMapperException("A null RowDelegate was passed to QueryForRowDelegate."); + return RunQueryForList(request, session, parameterObject, null, rowDelegate); + } + + + /// + /// Executes the SQL and retuns all rows selected. This is exactly the same as + /// calling ExecuteQueryForList(session, parameterObject, NO_SKIPPED_RESULTS, NO_MAXIMUM_RESULTS). + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, null, null); + } + + + /// + /// Executes the SQL and retuns a subset of the rows selected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public virtual IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForList(request, session, parameterObject, skipResults, maxResults); + } + + + /// + /// Executes the SQL and retuns a List of result objects. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + IList list = null; + + using (var command = request.IDbCommand) + { + if (Statement.ListClass == null) + list = new List(); + else + list = Statement.CreateInstanceOfGenericListClass(); + + var reader = command.ExecuteReader(); + try + { + // skip results + for (var i = 0; i < skipResults; i++) + if (!reader.Read()) + break; + + var resultsFetched = 0; + while ((maxResults == NO_MAXIMUM_RESULTS || resultsFetched < maxResults) + && reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add((T)obj); + resultsFetched++; + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + /// + /// Executes the SQL and retuns a List of result objects. + /// + /// The request scope. + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The result object + /// + /// A List of result objects. + internal IList RunQueryForList(RequestScope request, ISqlMapSession session, + object parameterObject, IList resultObject, RowDelegate rowDelegate) + { + var list = resultObject; + + using (var command = request.IDbCommand) + { + if (resultObject == null) + { + if (Statement.ListClass == null) + list = new List(); + else + list = Statement.CreateInstanceOfGenericListClass(); + } + + var reader = command.ExecuteReader(); + try + { + do + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + if (obj != BaseStrategy.SKIP) list.Add((T)obj); + } + else + while (reader.Read()) + { + var obj = (T)_resultStrategy.Process(request, ref reader, null); + rowDelegate(obj, parameterObject, list); + } + } while (reader.NextResult()); + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + RetrieveOutputParameters(request, session, command, parameterObject); + } + + return list; + } + + /// + /// Executes the SQL and and fill a strongly typed collection. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// A strongly typed collection of result objects. + public virtual void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + RunQueryForList(request, session, parameterObject, resultObject, null); + } + #endregion + + #region ExecuteUpdate, ExecuteInsert + /// + /// Execute an update statement. Also used for delete statement. + /// Return the number of row effected. + /// + /// The session used to execute the statement. + /// The object used to set the parameters in the SQL. + /// The number of row effected. + public virtual int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + var rows = 0; // the number of rows affected + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + using (var command = request.IDbCommand) + { + rows = command.ExecuteNonQuery(); + + //ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return rows; + } + + + /// + /// Execute an insert statement. Fill the parameter object with + /// the ouput parameters if any, also could return the insert generated key + /// + /// The session + /// The parameter object used to fill the statement. + /// Can return the insert generated key. + public virtual object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + object generatedKey = null; + SelectKey selectKeyStatement = null; + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + if (Statement is Insert) selectKeyStatement = ((Insert)Statement).SelectKey; + + if (selectKeyStatement != null && !selectKeyStatement.isAfter) + { + var mappedStatement = SqlMap.GetMappedStatement(selectKeyStatement.Id); + generatedKey = mappedStatement.ExecuteQueryForObject(session, parameterObject); + + ObjectProbe.SetMemberValue(parameterObject, selectKeyStatement.PropertyName, generatedKey, + request.DataExchangeFactory.ObjectFactory, + request.DataExchangeFactory.AccessorFactory); + } + + PreparedCommand.Create(request, session, Statement, parameterObject); + using (var command = request.IDbCommand) + { + if (Statement is Insert) + { + command.ExecuteNonQuery(); + } + // Retrieve output parameter if the result class is specified + else if (Statement is Procedure && Statement.ResultClass != null && + SqlMap.TypeHandlerFactory.IsSimpleType(Statement.ResultClass)) + { + IDataParameter returnValueParameter = command.CreateParameter(); + returnValueParameter.Direction = ParameterDirection.ReturnValue; + command.Parameters.Add(returnValueParameter); + + command.ExecuteNonQuery(); + generatedKey = returnValueParameter.Value; + + var typeHandler = SqlMap.TypeHandlerFactory.GetTypeHandler(Statement.ResultClass); + generatedKey = typeHandler.GetDataBaseValue(generatedKey, Statement.ResultClass); + } + else + { + generatedKey = command.ExecuteScalar(); + if (Statement.ResultClass != null && + SqlMap.TypeHandlerFactory.IsSimpleType(Statement.ResultClass)) + { + var typeHandler = SqlMap.TypeHandlerFactory.GetTypeHandler(Statement.ResultClass); + generatedKey = typeHandler.GetDataBaseValue(generatedKey, Statement.ResultClass); + } + } + + if (selectKeyStatement != null && selectKeyStatement.isAfter) + { + var mappedStatement = SqlMap.GetMappedStatement(selectKeyStatement.Id); + generatedKey = mappedStatement.ExecuteQueryForObject(session, parameterObject); + + ObjectProbe.SetMemberValue(parameterObject, selectKeyStatement.PropertyName, generatedKey, + request.DataExchangeFactory.ObjectFactory, + request.DataExchangeFactory.AccessorFactory); + } + + //ExecutePostSelect(request); + + RetrieveOutputParameters(request, session, command, parameterObject); + } + + RaiseExecuteEvent(); + + return generatedKey; + } + #endregion + + #region ExecuteQueryForMap + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public virtual IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForMap(request, session, parameterObject, keyProperty, valueProperty, null); + } + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The request scope. + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForMapWithRowDelegate method + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + internal IDictionary RunQueryForMap(RequestScope request, + ISqlMapSession session, + object parameterObject, + string keyProperty, + string valueProperty, + DictionaryRowDelegate rowDelegate) + { + IDictionary map = new Hashtable(); + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = obj; + if (valueProperty != null) value = ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + map.Add(key, value); + } + else + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = obj; + if (valueProperty != null) value = ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + rowDelegate(key, value, parameterObject, map); + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + } + + return map; + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// + /// If a transaction is not in progress, or the + /// database throws an exception. + /// + public virtual IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForDictionary(request, session, parameterObject, keyProperty, valueProperty, null); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public virtual IDictionary ExecuteQueryForDictionary(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + var request = Statement.Sql.GetRequestScope(this, parameterObject, session); + + if (rowDelegate == null) throw new DataMapperException("A null DictionaryRowDelegate was passed to QueryForDictionary."); + + PreparedCommand.Create(request, session, Statement, parameterObject); + + return RunQueryForDictionary(request, session, parameterObject, keyProperty, valueProperty, rowDelegate); + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The request scope. + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForMapWithRowDelegate method + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + internal IDictionary RunQueryForDictionary(RequestScope request, + ISqlMapSession session, + object parameterObject, + string keyProperty, + string valueProperty, + DictionaryRowDelegate rowDelegate) + { + IDictionary map = new Dictionary(); + + using (var command = request.IDbCommand) + { + var reader = command.ExecuteReader(); + try + { + if (rowDelegate == null) + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = (K)ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = default(V); + if (valueProperty != null) + value = (V)ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + else + value = (V)obj; + map.Add(key, value); + } + else + while (reader.Read()) + { + var obj = _resultStrategy.Process(request, ref reader, null); + var key = (K)ObjectProbe.GetMemberValue(obj, keyProperty, request.DataExchangeFactory.AccessorFactory); + var value = default(V); + if (valueProperty != null) + value = (V)ObjectProbe.GetMemberValue(obj, valueProperty, request.DataExchangeFactory.AccessorFactory); + else + value = (V)obj; + rowDelegate(key, value, parameterObject, map); + } + } + finally + { + reader.Close(); + reader.Dispose(); + } + + ExecutePostSelect(request); + } + + return map; + } + #endregion + + + /// + /// Executes the . + /// + /// The current . + private void ExecutePostSelect(RequestScope request) + { + while (request.QueueSelect.Count > 0) + { + var postSelect = request.QueueSelect.Dequeue() as PostBindind; + + PostSelectStrategyFactory.Get(postSelect.Method).Execute(postSelect, request); + } + } + + + /// + /// Raise an event ExecuteEventArgs + /// (Used when a query is executed) + /// + private void RaiseExecuteEvent() + { + var e = new ExecuteEventArgs(); + e.StatementName = Statement.Id; + if (Execute != null) Execute(this, e); + } + + /// + /// ToString implementation. + /// + /// A string that describes the MappedStatement + public override string ToString() + { + var buffer = new StringBuilder(); + buffer.Append("\tMappedStatement: " + Id); + buffer.Append(Environment.NewLine); + if (Statement.ParameterMap != null) buffer.Append(Statement.ParameterMap.Id); + + return buffer.ToString(); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PaginatedList.cs b/ORBatisFramework/MappedStatements/PaginatedList.cs new file mode 100644 index 0000000..2fc644f --- /dev/null +++ b/ORBatisFramework/MappedStatements/PaginatedList.cs @@ -0,0 +1,425 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using IBatisNet.Common.Pagination; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Summary description for PaginatedDataList. + /// + public class PaginatedList : IPaginatedList + { + private readonly ISqlMapSession _session; + + /// + /// Constructor + /// + /// + /// + /// + public PaginatedList(IMappedStatement mappedStatement, object parameterObject, int pageSize, ISqlMapSession session) + { + _mappedStatement = mappedStatement; + _parameterObject = parameterObject; + PageSize = pageSize; + PageIndex = 0; + _session = session; + PageTo(0); + } + + + /// + /// + public bool IsEmpty => _currentPageList.Count == 0; + + #region IEnumerable Members + /// + /// + /// + public IEnumerator GetEnumerator() + { + return _currentPageList.GetEnumerator(); + } + #endregion + + + /// + /// + private void PageForward() + { + try + { + _prevPageList = _currentPageList; + _currentPageList = _nextPageList; + _nextPageList = GetList(PageIndex + 1, PageSize); + } + catch (DataMapperException e) + { + throw new DataMapperException("Unexpected error while repaginating paged list. Cause: " + e.Message, e); + } + } + + /// + /// + private void PageBack() + { + try + { + _nextPageList = _currentPageList; + _currentPageList = _prevPageList; + if (PageIndex > 0) + _prevPageList = GetList(PageIndex - 1, PageSize); + else + _prevPageList = new ArrayList(); + } + catch (DataMapperException e) + { + throw new DataMapperException("Unexpected error while repaginating paged list. Cause: " + e.Message, e); + } + } + + /// + /// + /// + private void SafePageTo(int index) + { + try + { + PageTo(index); + } + catch (DataMapperException e) + { + throw new DataMapperException("Unexpected error while repaginating paged list. Cause: " + e.Message, e); + } + } + + + /// + /// + /// + public void PageTo(int index) + { + PageIndex = index; + IList list = null; + + if (index < 1) + list = GetList(PageIndex, PageSize * 2); + else + list = GetList(index - 1, PageSize * 3); + + if (list.Count < 1) + { + _prevPageList = new ArrayList(); + _currentPageList = new ArrayList(); + _nextPageList = new ArrayList(); + } + else + { + if (index < 1) + { + _prevPageList = new ArrayList(); + if (list.Count <= PageSize) + { + _currentPageList = SubList(list, 0, list.Count); + _nextPageList = new ArrayList(); + } + else + { + _currentPageList = SubList(list, 0, PageSize); + _nextPageList = SubList(list, PageSize, list.Count); + } + } + else + { + if (list.Count <= PageSize) + { + _prevPageList = SubList(list, 0, list.Count); + _currentPageList = new ArrayList(); + _nextPageList = new ArrayList(); + } + else if (list.Count <= PageSize * 2) + { + _prevPageList = SubList(list, 0, PageSize); + _currentPageList = SubList(list, PageSize, list.Count); + _nextPageList = new ArrayList(); + } + else + { + _prevPageList = SubList(list, 0, PageSize); + _currentPageList = SubList(list, PageSize, PageSize * 2); + _nextPageList = SubList(list, PageSize * 2, list.Count); + } + } + } + } + + + /// + /// + /// + /// + /// + private IList GetList(int index, int localPageSize) + { + var isSessionLocal = false; + + + var list = _mappedStatement.ExecuteQueryForList(_session, _parameterObject, index * PageSize, localPageSize); + + return list; + } + + + /// + /// Provides a view of the IList pramaeter + /// from the specified position + /// to the specified position . + /// + /// The IList elements. + /// Starting position for the view of elements. + /// Ending position for the view of elements. + /// + /// A view of list. + /// + /// + /// The list that is returned is just a view, it is still backed + /// by the orignal list. Any changes you make to it will be + /// reflected in the orignal list. + /// + private IList SubList(IList list, int fromIndex, int toIndex) + { + return ((ArrayList)list).GetRange(fromIndex, toIndex - fromIndex); + } + + #region Fields + private IList _prevPageList; + private IList _currentPageList; + private IList _nextPageList; + + private readonly IMappedStatement _mappedStatement; + private readonly object _parameterObject; + #endregion + + #region IPaginatedList Members + /// + /// + public int PageIndex { get; private set; } + + /// + /// + public bool IsPreviousPageAvailable => _prevPageList.Count > 0; + + /// + /// + public bool IsFirstPage => PageIndex == 0; + + /// + /// + /// + public void GotoPage(int pageIndex) + { + SafePageTo(pageIndex); + } + + /// + /// + public int PageSize { get; } + + /// + /// + /// + public bool NextPage() + { + if (IsNextPageAvailable) + { + PageIndex++; + PageForward(); + return true; + } + + return false; + } + + /// + /// + public bool IsMiddlePage => !(IsFirstPage || IsLastPage); + + /// + /// + /// + public bool PreviousPage() + { + if (IsPreviousPageAvailable) + { + PageIndex--; + PageBack(); + return true; + } + + return false; + } + + /// + /// + public bool IsNextPageAvailable => _nextPageList.Count > 0; + + /// + /// + public bool IsLastPage => _nextPageList.Count < 1; + #endregion + + #region IList Members + /// + /// + public bool IsReadOnly => _currentPageList.IsReadOnly; + + /// + /// + public object this[int index] + { + get => _currentPageList[index]; + set => _currentPageList[index] = value; + } + + /// + /// + /// + public void RemoveAt(int index) + { + _currentPageList.RemoveAt(index); + } + + /// + /// + /// + /// + public void Insert(int index, object value) + { + _currentPageList.Insert(index, value); + } + + /// + /// + /// + public void Remove(object value) + { + _currentPageList.Remove(value); + } + + /// + /// + /// + /// + public bool Contains(object value) + { + return _currentPageList.Contains(value); + } + + /// + /// + public void Clear() + { + _currentPageList.Clear(); + } + + /// + /// + /// + /// + public int IndexOf(object value) + { + return _currentPageList.IndexOf(value); + } + + /// + /// + /// + /// + public int Add(object value) + { + return _currentPageList.Add(value); + } + + /// + /// + public bool IsFixedSize => _currentPageList.IsFixedSize; + #endregion + + #region ICollection Members + /// + /// + public bool IsSynchronized => _currentPageList.IsSynchronized; + + /// + /// + public int Count => _currentPageList.Count; + + /// + /// + /// + /// + public void CopyTo(Array array, int index) + { + _currentPageList.CopyTo(array, index); + } + + /// + /// + public object SyncRoot => _currentPageList.SyncRoot; + #endregion + + #region IEnumerator Members + /// + /// Sets the enumerator to its initial position, + /// which is before the first element in the collection. + /// + public void Reset() + { + _currentPageList.GetEnumerator().Reset(); + } + + /// + /// Gets the current element in the page. + /// + public object Current => _currentPageList.GetEnumerator().Current; + + /// + /// Advances the enumerator to the next element of the collection. + /// + /// + /// true if the enumerator was successfully advanced to the next element; + /// false if the enumerator has passed the end of the collection. + /// + public bool MoveNext() + { + return _currentPageList.GetEnumerator().MoveNext(); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostBindind.cs b/ORBatisFramework/MappedStatements/PostBindind.cs new file mode 100644 index 0000000..f1153ad --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostBindind.cs @@ -0,0 +1,107 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// All dataq tor retrieve 'select' + /// + /// + /// As ADO.NET allows one open per connection at once, we keep + /// all the datas to open the next after having closed the current. + /// + public sealed class PostBindind + { + /// + /// Enumeration of the ExecuteQuery method. + /// + public enum ExecuteMethod + { + /// + /// Execute Query For Object + /// + ExecuteQueryForObject = 1, + + /// + /// Execute Query For IList + /// + ExecuteQueryForIList, + + /// + /// Execute Query For Generic IList + /// + ExecuteQueryForGenericIList, + + /// + /// Execute Query For Array List + /// + ExecuteQueryForArrayList, + + /// + /// Execute Query For Strong Typed IList + /// + ExecuteQueryForStrongTypedIList + } + + #region Properties + /// + /// Gets or sets the statement. + /// + /// The statement. + public IMappedStatement Statement { set; get; } + + + /// + /// Gets or sets the result property. + /// + /// The result property. + public ResultProperty ResultProperty { set; get; } + + + /// + /// Gets or sets the target. + /// + /// The target. + public object Target { set; get; } + + + /// + /// Gets or sets the keys. + /// + /// The keys. + public object Keys { set; get; } + + + /// + /// Gets or sets the method. + /// + /// The method. + public ExecuteMethod Method { set; get; } = ExecuteMethod.ExecuteQueryForIList; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostSelectStrategy/ArrayStrategy.cs b/ORBatisFramework/MappedStatements/PostSelectStrategy/ArrayStrategy.cs new file mode 100644 index 0000000..c95ae03 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostSelectStrategy/ArrayStrategy.cs @@ -0,0 +1,55 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy +{ + /// + /// implementation to exceute a query for . + /// + public sealed class ArrayStrategy : IPostSelectStrategy + { + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + var values = postSelect.Statement.ExecuteQueryForList(request.Session, postSelect.Keys); + var elementType = postSelect.ResultProperty.SetAccessor.MemberType.GetElementType(); + + var array = Array.CreateInstance(elementType, values.Count); + var count = values.Count; + for (var i = 0; i < count; i++) array.SetValue(values[i], i); + + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, array); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostSelectStrategy/GenericListStrategy.cs b/ORBatisFramework/MappedStatements/PostSelectStrategy/GenericListStrategy.cs new file mode 100644 index 0000000..b293400 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostSelectStrategy/GenericListStrategy.cs @@ -0,0 +1,79 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections.Generic; +using System.Reflection; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy +{ + /// + /// implementation to exceute a query generic list. + /// + public sealed class GenericListStrategy : IPostSelectStrategy + { + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + // How to: Examine and Instantiate Generic Types with Reflection + // http://msdn2.microsoft.com/en-us/library/b8ytshk6.aspx + + var typeArgs = postSelect.ResultProperty.SetAccessor.MemberType.GetGenericArguments(); + var genericList = typeof(IList<>); + var constructedType = genericList.MakeGenericType(typeArgs); + var elementType = postSelect.ResultProperty.SetAccessor.MemberType.GetGenericArguments()[0]; + + var mappedStatementType = postSelect.Statement.GetType(); + + Type[] typeArguments = { typeof(SqlMapSession), typeof(object) }; + + var mis = mappedStatementType.GetMethods(BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance); + MethodInfo mi = null; + foreach (var m in mis) + if (m.IsGenericMethod && + m.Name == "ExecuteQueryForList" && + m.GetParameters().Length == 2) + { + mi = m; + break; + } + + var miConstructed = mi.MakeGenericMethod(elementType); + + // Invoke the method. + object[] args = { request.Session, postSelect.Keys }; + var values = miConstructed.Invoke(postSelect.Statement, args); + + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, values); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs b/ORBatisFramework/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs new file mode 100644 index 0000000..e06eb11 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs @@ -0,0 +1,45 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy +{ + /// + /// contract to excute a 'select' + /// after the process of the main + /// + public interface IPostSelectStrategy + { + /// + /// Executes the specified . + /// + /// The . + /// The + void Execute(PostBindind postSelect, RequestScope request); + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostSelectStrategy/ListStrategy.cs b/ORBatisFramework/MappedStatements/PostSelectStrategy/ListStrategy.cs new file mode 100644 index 0000000..d8996fa --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostSelectStrategy/ListStrategy.cs @@ -0,0 +1,48 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy +{ + /// + /// implementation to exceute a query for list. + /// + public sealed class ListStrategy : IPostSelectStrategy + { + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + object values = postSelect.Statement.ExecuteQueryForList(request.Session, postSelect.Keys); + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, values); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostSelectStrategy/ObjectStrategy.cs b/ORBatisFramework/MappedStatements/PostSelectStrategy/ObjectStrategy.cs new file mode 100644 index 0000000..39342f4 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostSelectStrategy/ObjectStrategy.cs @@ -0,0 +1,48 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy +{ + /// + /// implementation to exceute a query for object. + /// + public sealed class ObjectStrategy : IPostSelectStrategy + { + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + var value = postSelect.Statement.ExecuteQueryForObject(request.Session, postSelect.Keys); + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, value); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs b/ORBatisFramework/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs new file mode 100644 index 0000000..618f0f6 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs @@ -0,0 +1,61 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Specialized; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy +{ + /// + /// Factory to get implementation. + /// + public sealed class PostSelectStrategyFactory + { + private static readonly IDictionary _strategies = new HybridDictionary(); + + /// + /// Initializes the class. + /// + static PostSelectStrategyFactory() + { + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForArrayList, new ArrayStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForIList, new ListStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForObject, new ObjectStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForStrongTypedIList, new StrongTypedListStrategy()); + _strategies.Add(PostBindind.ExecuteMethod.ExecuteQueryForGenericIList, new GenericListStrategy()); + } + + + /// + /// Gets the . + /// + /// The . + /// The + public static IPostSelectStrategy Get(PostBindind.ExecuteMethod method) + { + return (IPostSelectStrategy)_strategies[method]; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs b/ORBatisFramework/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs new file mode 100644 index 0000000..b59e624 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs @@ -0,0 +1,53 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PostSelectStrategy +{ + /// + /// implementation to exceute a query for + /// strong typed list. + /// + public sealed class StrongTypedListStrategy : IPostSelectStrategy + { + #region IPostSelectStrategy Members + /// + /// Executes the specified . + /// + /// The . + /// The + public void Execute(PostBindind postSelect, RequestScope request) + { + var factory = request.DataExchangeFactory.ObjectFactory.CreateFactory(postSelect.ResultProperty.SetAccessor.MemberType, Type.EmptyTypes); + var values = factory.CreateInstance(null); + postSelect.Statement.ExecuteQueryForList(request.Session, postSelect.Keys, (IList)values); + postSelect.ResultProperty.SetAccessor.Set(postSelect.Target, values); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/DefaultStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/DefaultStrategy.cs new file mode 100644 index 0000000..0ae9c5e --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/DefaultStrategy.cs @@ -0,0 +1,90 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; +using IBatisNet.DataMapper.TypeHandlers; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// implementation when no 'select' or + /// 'resultMapping' attribute exists on a . + /// + public sealed class DefaultStrategy : IPropertyStrategy + { + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when the 'select' and 'resultMap' attributes + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + var obj = Get(request, resultMap, mapping, ref target, reader); + resultMap.SetValueOfProperty(ref target, mapping, obj); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + if (mapping.TypeHandler == null || mapping.TypeHandler is UnknownTypeHandler) // Find the TypeHandler + lock (mapping) + { + if (mapping.TypeHandler == null || mapping.TypeHandler is UnknownTypeHandler) + { + var columnIndex = 0; + if (mapping.ColumnIndex == ResultProperty.UNKNOWN_COLUMN_INDEX) + columnIndex = reader.GetOrdinal(mapping.ColumnName); + else + columnIndex = mapping.ColumnIndex; + var systemType = reader.GetFieldType(columnIndex); + + mapping.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(systemType); + } + } + + var dataBaseValue = mapping.GetDataBaseValue(reader); + request.IsRowDataFound = request.IsRowDataFound || dataBaseValue != null; + return dataBaseValue; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/GroupByStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/GroupByStrategy.cs new file mode 100644 index 0000000..61086bd --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/GroupByStrategy.cs @@ -0,0 +1,147 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-09-15 08:29:07 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertStrategy +{ + /// + /// implementation when a 'resultMapping' attribute exists + /// on a ant the resulMap have a groupBy attribute. + /// + public sealed class GroupByStrategy : BaseStrategy, IPropertyStrategy + { + private static readonly IPropertyStrategy _resultMapStrategy; + + /// + /// Initializes the class. + /// + static GroupByStrategy() + { + _resultMapStrategy = new ResultMapStrategy(); + } + + #region IPropertyStrategy Members + /// + /// Sets value of the specified on the target object + /// when a 'resultMapping' attribute exists + /// on the . + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + Get(request, resultMap, mapping, ref target, reader); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + // The property is a IList + IList list = null; + + // Get the IList property + var property = ObjectProbe.GetMemberValue(target, mapping.PropertyName, + request.DataExchangeFactory.AccessorFactory); + + if (property == null) // Create the list if need + { + property = mapping.ListFactory.CreateInstance(null); + mapping.SetAccessor.Set(target, property); + } + + list = (IList)property; + + object result = null; + var propertyRresultMap = mapping.NestedResultMap.ResolveSubMap(reader); + + if (propertyRresultMap.GroupByProperties.Count > 0) + { + var uniqueKey = GetUniqueKey(propertyRresultMap, request, reader); + + // Gets the [key, result object] already build + var buildObjects = request.GetUniqueKeys(propertyRresultMap); + + if (buildObjects != null && buildObjects.Contains(uniqueKey)) + { + // Unique key is already known, so get the existing result object and process additional results. + result = buildObjects[uniqueKey]; + + //In some cases (nested groupings) our object may be null, so there is + //no point in going on + if (result != null) + // process resulMapping attribute which point to a groupBy attribute + for (var index = 0; index < propertyRresultMap.Properties.Count; index++) + { + var resultProperty = propertyRresultMap.Properties[index]; + if (resultProperty.PropertyStrategy is GroupByStrategy) resultProperty.PropertyStrategy.Set(request, propertyRresultMap, resultProperty, ref result, reader, null); + } + + result = SKIP; + } + else if (uniqueKey == null || buildObjects == null || !buildObjects.Contains(uniqueKey)) + { + // Unique key is NOT known, so create a new result object and then process additional results. + result = _resultMapStrategy.Get(request, resultMap, mapping, ref target, reader); + + if (buildObjects == null) + { + buildObjects = new Hashtable(); + request.SetUniqueKeys(propertyRresultMap, buildObjects); + } + + buildObjects[uniqueKey] = result; + } + } + else // Last resultMap have no groupBy attribute + { + result = _resultMapStrategy.Get(request, resultMap, mapping, ref target, reader); + } + + + if (result != null && result != SKIP) list.Add(result); + + return result; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/IPropertyStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/IPropertyStrategy.cs new file mode 100644 index 0000000..324b78b --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/IPropertyStrategy.cs @@ -0,0 +1,61 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// contract to set value object on . + /// + public interface IPropertyStrategy + { + /// + /// Sets value of the specified on the target object. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, + IDataReader reader, object keys); + + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target. + object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader); + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs b/ORBatisFramework/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs new file mode 100644 index 0000000..2f3b0d2 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs @@ -0,0 +1,94 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Collections.Generic; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.MappedStatements.PropertStrategy; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// Factory to get implementation. + /// + public sealed class PropertyStrategyFactory + { + private static readonly IPropertyStrategy _defaultStrategy; + private static readonly IPropertyStrategy _resultMapStrategy; + private static readonly IPropertyStrategy _groupByStrategy; + + private static readonly IPropertyStrategy _selectArrayStrategy; + private static readonly IPropertyStrategy _selectGenericListStrategy; + private static readonly IPropertyStrategy _selectListStrategy; + private static readonly IPropertyStrategy _selectObjectStrategy; + + /// + /// Initializes the class. + /// + static PropertyStrategyFactory() + { + _defaultStrategy = new DefaultStrategy(); + _resultMapStrategy = new ResultMapStrategy(); + _groupByStrategy = new GroupByStrategy(); + + _selectArrayStrategy = new SelectArrayStrategy(); + _selectListStrategy = new SelectListStrategy(); + _selectObjectStrategy = new SelectObjectStrategy(); + _selectGenericListStrategy = new SelectGenericListStrategy(); + } + + /// + /// Finds the . + /// + /// The . + /// The + public static IPropertyStrategy Get(ResultProperty mapping) + { + // no 'select' or 'resultMap' attributes + if (mapping.Select.Length == 0 && mapping.NestedResultMap == null) + // We have a 'normal' ResultMap + return _defaultStrategy; + + if (mapping.NestedResultMap != null) // 'resultMap' attribute + { + if (mapping.NestedResultMap.GroupByPropertyNames.Count > 0) return _groupByStrategy; + if (mapping.MemberType.IsGenericType && + typeof(IList<>).IsAssignableFrom(mapping.MemberType.GetGenericTypeDefinition())) + return _groupByStrategy; + + if (typeof(IList).IsAssignableFrom(mapping.MemberType)) return _groupByStrategy; + + return _resultMapStrategy; + } + + //'select' ResultProperty + return new SelectStrategy(mapping, + _selectArrayStrategy, + _selectGenericListStrategy, + _selectListStrategy, + _selectObjectStrategy); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/ResultMapStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/ResultMapStrategy.cs new file mode 100644 index 0000000..5c77b34 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/ResultMapStrategy.cs @@ -0,0 +1,104 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// implementation when a 'resultMapping' attribute exists + /// on a . + /// + public sealed class ResultMapStrategy : BaseStrategy, IPropertyStrategy + { + #region IPropertyStrategy Members + /// + /// Sets value of the specified on the target object + /// when a 'resultMapping' attribute exists + /// on the . + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + var obj = Get(request, resultMap, mapping, ref target, reader); + // Sets created object on the property + resultMap.SetValueOfProperty(ref target, mapping, obj); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + object[] parameters = null; + var isParameterFound = false; + + var resultMapping = mapping.NestedResultMap.ResolveSubMap(reader); + + if (resultMapping.Parameters.Count > 0) + { + parameters = new object[resultMapping.Parameters.Count]; + // Fill parameters array + for (var index = 0; index < resultMapping.Parameters.Count; index++) + { + var resultProperty = resultMapping.Parameters[index]; + parameters[index] = resultProperty.ArgumentStrategy.GetValue(request, resultProperty, ref reader, null); + request.IsRowDataFound = request.IsRowDataFound || parameters[index] != null; + isParameterFound = isParameterFound || parameters[index] != null; + } + } + + object obj = null; + // If I have a constructor tag and all argumments values are null, the obj is null + if (resultMapping.Parameters.Count > 0 && isParameterFound == false) + { + obj = null; + } + else + { + obj = resultMapping.CreateInstanceOfResult(parameters); + + // Fills properties on the new object + if (FillObjectWithReaderAndResultMap(request, reader, resultMapping, ref obj) == false) obj = null; + } + + return obj; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/SelectArrayStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/SelectArrayStrategy.cs new file mode 100644 index 0000000..c69dba0 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/SelectArrayStrategy.cs @@ -0,0 +1,82 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on a + /// + public sealed class SelectArrayStrategy : IPropertyStrategy + { + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an Array property + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) throw new NotImplementedException("Lazy load no supported for System.Array property:" + mapping.SetAccessor.Name); + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForArrayList; + request.QueueSelect.Enqueue(postSelect); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs new file mode 100644 index 0000000..9f43fbd --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs @@ -0,0 +1,91 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on a + /// + public sealed class SelectGenericListStrategy : IPropertyStrategy + { + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an property + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The current + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) + { + var values = mapping.LazyFactory.CreateProxy(selectStatement, keys, target, mapping.SetAccessor); + mapping.SetAccessor.Set(target, values); + } + else + { + if (mapping.SetAccessor.MemberType.GetGenericTypeDefinition() == typeof(IList<>)) postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForGenericIList; + request.QueueSelect.Enqueue(postSelect); + } + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/SelectListStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/SelectListStrategy.cs new file mode 100644 index 0000000..f0cce00 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/SelectListStrategy.cs @@ -0,0 +1,93 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on a + /// + public sealed class SelectListStrategy : IPropertyStrategy + { + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an property + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The current + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) + { + var values = mapping.LazyFactory.CreateProxy(selectStatement, keys, target, mapping.SetAccessor); + mapping.SetAccessor.Set(target, values); + } + else + { + if (mapping.SetAccessor.MemberType == typeof(IList)) + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForIList; + else + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForStrongTypedIList; + request.QueueSelect.Enqueue(postSelect); + } + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/SelectObjectStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/SelectObjectStrategy.cs new file mode 100644 index 0000000..448474c --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/SelectObjectStrategy.cs @@ -0,0 +1,91 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on an and the object property is + /// different from an or an . + /// + public sealed class SelectObjectStrategy : IPropertyStrategy + { + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists and fills an object property. + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The current + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object keys) + { + // Get the select statement + var selectStatement = request.MappedStatement.SqlMap.GetMappedStatement(mapping.Select); + + var postSelect = new PostBindind(); + postSelect.Statement = selectStatement; + postSelect.Keys = keys; + postSelect.Target = target; + postSelect.ResultProperty = mapping; + + if (mapping.IsLazyLoad) + { + var values = mapping.LazyFactory.CreateProxy(selectStatement, keys, target, mapping.SetAccessor); + mapping.SetAccessor.Set(target, values); + } + else + { + postSelect.Method = PostBindind.ExecuteMethod.ExecuteQueryForObject; + request.QueueSelect.Enqueue(postSelect); + } + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/PropertStrategy/SelectStrategy.cs b/ORBatisFramework/MappedStatements/PropertStrategy/SelectStrategy.cs new file mode 100644 index 0000000..7f4e1d8 --- /dev/null +++ b/ORBatisFramework/MappedStatements/PropertStrategy/SelectStrategy.cs @@ -0,0 +1,143 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.PropertyStrategy +{ + /// + /// implementation when a 'select' attribute exists + /// on a + /// + public class SelectStrategy : IPropertyStrategy + { + private readonly IPropertyStrategy _selectStrategy; + + + /// + /// Initializes a new instance of the class. + /// + /// The mapping. + /// The select array strategy. + /// The select generic list strategy. + /// The select list strategy. + /// The select object strategy. + public SelectStrategy(ResultProperty mapping, + IPropertyStrategy selectArrayStrategy, + IPropertyStrategy selectGenericListStrategy, + IPropertyStrategy selectListStrategy, + IPropertyStrategy selectObjectStrategy) + { + // Collection object or .NET object + if (mapping.SetAccessor.MemberType.BaseType == typeof(Array)) + _selectStrategy = selectArrayStrategy; + else if (mapping.SetAccessor.MemberType.IsGenericType && + typeof(IList<>).IsAssignableFrom(mapping.SetAccessor.MemberType.GetGenericTypeDefinition())) + _selectStrategy = selectGenericListStrategy; + // Check if the object to Map implement 'IList' or is IList type + // If yes the ResultProperty is map to a IList object + else if (typeof(IList).IsAssignableFrom(mapping.SetAccessor.MemberType)) + _selectStrategy = selectListStrategy; + + else // The ResultProperty is map to a .Net object + _selectStrategy = selectObjectStrategy; + } + + #region IPropertyStrategy members + /// + /// Sets value of the specified on the target object + /// when a 'select' attribute exists + /// on the are empties. + /// + /// The request. + /// The result map. + /// The ResultProperty. + /// The target. + /// The reader. + /// The keys + public void Set(RequestScope request, IResultMap resultMap, + ResultProperty mapping, ref object target, IDataReader reader, object selectKeys) + { + var paramString = mapping.ColumnName; + object keys = null; + var wasNull = false; + + #region Finds the select keys. + if (paramString.IndexOf(',') > 0 || paramString.IndexOf('=') > 0) // composite parameters key + { + IDictionary keyMap = new Hashtable(); + keys = keyMap; + // define which character is seperating fields + char[] splitter = { '=', ',' }; + + var paramTab = paramString.Split(splitter); + if (paramTab.Length % 2 != 0) throw new DataMapperException("Invalid composite key string format in '" + mapping.PropertyName + ". It must be: property1=column1,property2=column2,..."); + var enumerator = paramTab.GetEnumerator(); + while (!wasNull && enumerator.MoveNext()) + { + var hashKey = ((string)enumerator.Current).Trim(); + if (paramString.Contains("=")) // old 1.x style multiple params + enumerator.MoveNext(); + var hashValue = reader.GetValue(reader.GetOrdinal(((string)enumerator.Current).Trim())); + + keyMap.Add(hashKey, hashValue); + wasNull = hashValue == DBNull.Value; + } + } + else // single parameter key + { + keys = reader.GetValue(reader.GetOrdinal(paramString)); + wasNull = reader.IsDBNull(reader.GetOrdinal(paramString)); + } + #endregion + + if (wasNull) + // set the value of an object property to null + mapping.SetAccessor.Set(target, null); + else // Collection object or .Net object + _selectStrategy.Set(request, resultMap, mapping, ref target, reader, keys); + } + + /// + /// Gets the value of the specified that must be set on the target object. + /// + /// The request. + /// The result map. + /// The mapping. + /// The reader. + /// The target object + public object Get(RequestScope request, IResultMap resultMap, ResultProperty mapping, ref object target, IDataReader reader) + { + throw new NotSupportedException("Get method on ResultMapStrategy is not supported"); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ReaderAutoMapper.cs b/ORBatisFramework/MappedStatements/ReaderAutoMapper.cs new file mode 100644 index 0000000..04f2a07 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ReaderAutoMapper.cs @@ -0,0 +1,131 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 397590 $ + * $Date: 2006-04-29 11:39:42 +0200 (Sat, 29 Apr 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Data; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +#endregion + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Build a dynamic instance of a + /// + public sealed class ReaderAutoMapper + { + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// Builds a for an . + /// + /// The data exchange factory. + /// The reader. + /// The result object. + public static ResultPropertyCollection Build(DataExchangeFactory dataExchangeFactory, + IDataReader reader, + ref object resultObject) + { + var targetType = resultObject.GetType(); + var properties = new ResultPropertyCollection(); + + try + { + // Get all PropertyInfo from the resultObject properties + var reflectionInfo = ReflectionInfo.GetInstance(targetType); + var membersName = reflectionInfo.GetWriteableMemberNames(); + + var propertyMap = new Hashtable(); + var length = membersName.Length; + for (var i = 0; i < length; i++) + { + var setAccessorFactory = dataExchangeFactory.AccessorFactory.SetAccessorFactory; + var setAccessor = setAccessorFactory.CreateSetAccessor(targetType, membersName[i]); + propertyMap.Add(membersName[i], setAccessor); + } + + // Get all column Name from the reader + // and build a resultMap from with the help of the PropertyInfo[]. + var dataColumn = reader.GetSchemaTable(); + var count = dataColumn.Rows.Count; + for (var i = 0; i < count; i++) + { + var columnName = dataColumn.Rows[i][0].ToString(); + var matchedSetAccessor = propertyMap[columnName] as ISetAccessor; + + var property = new ResultProperty(); + property.ColumnName = columnName; + property.ColumnIndex = i; + + if (resultObject is Hashtable) + { + property.PropertyName = columnName; + properties.Add(property); + } + + Type propertyType = null; + + if (matchedSetAccessor == null) + try + { + propertyType = ObjectProbe.GetMemberTypeForSetter(resultObject, columnName); + } + catch + { + _logger.Error("The column [" + columnName + "] could not be auto mapped to a property on [" + resultObject + "]"); + } + else + propertyType = matchedSetAccessor.MemberType; + + if (propertyType != null || matchedSetAccessor != null) + { + property.PropertyName = matchedSetAccessor != null ? matchedSetAccessor.Name : columnName; + if (matchedSetAccessor != null) + property.Initialize(dataExchangeFactory.TypeHandlerFactory, matchedSetAccessor); + else + property.TypeHandler = dataExchangeFactory.TypeHandlerFactory.GetTypeHandler(propertyType); + + property.PropertyStrategy = PropertyStrategyFactory.Get(property); + properties.Add(property); + } + } + } + catch (Exception e) + { + throw new DataMapperException("Error automapping columns. Cause: " + e.Message, e); + } + + return properties; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/AutoMapStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/AutoMapStrategy.cs new file mode 100644 index 0000000..265f3e6 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/AutoMapStrategy.cs @@ -0,0 +1,113 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation used when implicit 'ResultMap'. + /// + public sealed class AutoMapStrategy : IResultStrategy + { + #region IResultStrategy Members + /// + /// Processes the specified + /// a an auto result map is used. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + if (outObject == null) outObject = (request.CurrentResultMap as AutoResultMap).CreateInstanceOfResultClass(); + + var resultMap = InitializeAutoResultMap(request, ref reader, ref outObject); + + // En configuration initialiser des AutoResultMap (IResultMap) avec uniquement leur class name et class et les mettres + // ds Statement.ResultsMap puis ds AutoMapStrategy faire comme AutoResultMap ds Java + // tester si la request.CurrentResultMap [AutoResultMap (IResultMap)] est initialis�e + // [if (allowRemapping || getResultMappings() == null) {initialize(rs);] java + // si ( request.Statement.AllowRemapping || (request.CurrentResultMap as AutoResultMap).IsInitalized) .... + + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var property = resultMap.Properties[index]; + resultMap.SetValueOfProperty(ref outObject, property, + property.GetDataBaseValue(reader)); + } + + return outObject; + } + #endregion + + /// + /// Auto-map the reader to the result object. + /// + /// The request. + /// The reader. + /// The result object. + /// The AutoResultMap use to map the resultset. + private AutoResultMap InitializeAutoResultMap(RequestScope request, ref IDataReader reader, ref object resultObject) + { + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (request.Statement.AllowRemapping) + { + resultMap = resultMap.Clone(); + + var properties = ReaderAutoMapper.Build( + request.DataExchangeFactory, + reader, + ref resultObject); + + resultMap.Properties.AddRange(properties); + } + else + { + if (!resultMap.IsInitalized) + lock (resultMap) + { + if (!resultMap.IsInitalized) + { + var properties = ReaderAutoMapper.Build( + request.DataExchangeFactory, + reader, + ref resultObject); + + resultMap.Properties.AddRange(properties); + resultMap.IsInitalized = true; + } + } + } + + return resultMap; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/BaseResultStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/BaseResultStrategy.cs new file mode 100644 index 0000000..0955c20 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/BaseResultStrategy.cs @@ -0,0 +1,26 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy { } \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/ClassDiagram.cd b/ORBatisFramework/MappedStatements/ResultStrategy/ClassDiagram.cd new file mode 100644 index 0000000..482be22 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/ClassDiagram.cd @@ -0,0 +1,103 @@ + + + + + + + + + + + + + + + + MappedStatements\ResultStrategy\AutoMapStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAIAAAAAACAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\DictionaryStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\ListStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\ObjectStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\ResultClassStrategy.cs + AAAAAAAAAEAAAAAIAgAAAAAAAAAAAAAAAAAABABAAAA= + + + + + + + MappedStatements\ResultStrategy\ResultMapStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\ResultStrategyFactory.cs + AAAAAAAAAAAAAABAAAAAAAAAIAABAAAAAAAEAAAAAAA= + + + + + + + + + + MappedStatements\ResultStrategy\SimpleTypeStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\MapStrategy.cs + AAAAEAAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\GroupByStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + + + + + MappedStatements\ResultStrategy\IResultStrategy.cs + AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= + + + \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/DictionaryStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/DictionaryStrategy.cs new file mode 100644 index 0000000..6047ce1 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/DictionaryStrategy.cs @@ -0,0 +1,73 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation when + /// a 'resultClass' attribute is specified and + /// the type of the result object is . + /// + public sealed class DictionaryStrategy : IResultStrategy + { + #region IResultStrategy Members + /// + /// Processes the specified + /// when a 'resultClass' attribute is specified on the statement and + /// the 'resultClass' attribute is a . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (outObject == null) outObject = resultMap.CreateInstanceOfResultClass(); + + var count = reader.FieldCount; + var dictionary = (IDictionary)outObject; + for (var i = 0; i < count; i++) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = i; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(i)); + dictionary.Add( + reader.GetName(i), + property.GetDataBaseValue(reader)); + } + + return outObject; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs new file mode 100644 index 0000000..742f565 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs @@ -0,0 +1,121 @@ +//#region Apache Notice +///***************************************************************************** +// * $Revision: 374175 $ +// * $LastChangedDate: 2013-05-31 19:40:27 +0200 (mar., 25 avr. 2006) $ +// * $LastChangedBy: mmccurrey $ +// * +// * MyBATIS.NET Data Mapper +// * +// * +// * +// * Licensed under the Apache License, Version 2.0 (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * http://www.apache.org/licenses/LICENSE-2.0 +// * +// * Unless required by applicable law or agreed to in writing, software +// * distributed under the License is distributed on an "AS IS" BASIS, +// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// * See the License for the specific language governing permissions and +// * limitations under the License. +// * +// ********************************************************************************/ +//#endregion + +//using System.Data; +//using IBatisNet.DataMapper.Configuration.ResultMapping; +//using IBatisNet.DataMapper.Scope; + +//namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +//{ +// public class DynamicMapStrategy +// { +// /// +// /// Auto-map the reader to the result object. +// /// +// /// The request. +// /// The reader. +// /// The result object. +// /// The AutoResultMap use to map the resultset. +// private DynamicResultMap InitializeAutoResultMap(RequestScope request, ref IDataReader reader, ref object resultObject) +// { +// //In the case of Dynamic, we set the AutoResultMap as an expando object +// DynamicResultMap resultMap = request.CurrentResultMap as DynamicResultMap; + +// if (request.Statement.AllowRemapping) +// { +// resultMap = resultMap.Clone(); + +// ResultPropertyCollection properties = ReaderAutoMapper.Build( +// request.DataExchangeFactory, +// reader, +// ref resultObject); + +// resultMap.Properties.AddRange(properties); +// } +// else +// { +// if (!resultMap.IsInitalized) +// { +// lock (resultMap) +// { +// if (!resultMap.IsInitalized) +// { +// ResultPropertyCollection properties = ReaderAutoMapper.Build( +// request.DataExchangeFactory, +// reader, +// ref resultObject); + +// resultMap.Properties.AddRange(properties); +// resultMap.IsInitalized = true; +// } +// } +// } + +// } + +// return resultMap; +// } + + +// #region IResultStrategy Members + +// /// +// /// Processes the specified +// /// a an auto result map is used. +// /// +// /// The request. +// /// The reader. +// /// The result object. +// public object Process(RequestScope request, ref IDataReader reader, object resultObject) +// { +// object outObject = resultObject; + +// if (outObject == null) +// { +// outObject = (request.CurrentResultMap as AutoResultMap).CreateInstanceOfResultClass(); +// } + +// AutoResultMap resultMap = InitializeAutoResultMap(request, ref reader, ref outObject); + +// // En configuration initialiser des AutoResultMap (IResultMap) avec uniquement leur class name et class et les mettres +// // ds Statement.ResultsMap puis ds AutoMapStrategy faire comme AutoResultMap ds Java +// // tester si la request.CurrentResultMap [AutoResultMap (IResultMap)] est initialisée +// // [if (allowRemapping || getResultMappings() == null) {initialize(rs);] java +// // si ( request.Statement.AllowRemapping || (request.CurrentResultMap as AutoResultMap).IsInitalized) .... + +// for (int index = 0; index < resultMap.Properties.Count; index++) +// { +// ResultProperty property = resultMap.Properties[index]; +// resultMap.SetValueOfProperty(ref outObject, property, +// property.GetDataBaseValue(reader)); +// } + +// return outObject; +// } + +// #endregion +// } +//} + diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/GroupByStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/GroupByStrategy.cs new file mode 100644 index 0000000..7f4dd21 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/GroupByStrategy.cs @@ -0,0 +1,98 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-09-15 06:03:39 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation when + /// a 'groupBy' attribute is specified on the resultMap tag. + /// + /// N+1 Select solution + public sealed class GroupByStrategy : BaseStrategy, IResultStrategy + { + #region IResultStrategy Members + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + /// The result object + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + var resultMap = request.CurrentResultMap.ResolveSubMap(reader); + + var uniqueKey = GetUniqueKey(resultMap, request, reader); + // Gets the [key, result object] already build + var buildObjects = request.GetUniqueKeys(resultMap); + + if (buildObjects != null && buildObjects.Contains(uniqueKey)) + { + // Unique key is already known, so get the existing result object and process additional results. + outObject = buildObjects[uniqueKey]; + // process resulMapping attribute wich point to a groupBy attribute + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var resultProperty = resultMap.Properties[index]; + if (resultProperty.PropertyStrategy is PropertStrategy.GroupByStrategy) resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null); + } + + outObject = SKIP; + } + else if (uniqueKey == null || buildObjects == null || !buildObjects.Contains(uniqueKey)) + { + // Unique key is NOT known, so create a new result object and process additional results. + + // Fix IBATISNET-241 + if (outObject == null) + // temp ?, we don't support constructor tag with groupBy attribute + outObject = resultMap.CreateInstanceOfResult(null); + + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var resultProperty = resultMap.Properties[index]; + resultProperty.PropertyStrategy.Set(request, resultMap, resultProperty, ref outObject, reader, null); + } + + if (buildObjects == null) + { + buildObjects = new Hashtable(); + request.SetUniqueKeys(resultMap, buildObjects); + } + + buildObjects[uniqueKey] = outObject; + } + + return outObject; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/IResultStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/IResultStrategy.cs new file mode 100644 index 0000000..5e7b047 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/IResultStrategy.cs @@ -0,0 +1,44 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// contract to process the . + /// + public interface IResultStrategy + { + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + object Process(RequestScope request, ref IDataReader reader, object resultObject); + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/ListStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/ListStrategy.cs new file mode 100644 index 0000000..e5a964c --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/ListStrategy.cs @@ -0,0 +1,70 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation when + /// a 'resultClass' attribute is specified and + /// the type of the result object is . + /// + public sealed class ListStrategy : IResultStrategy + { + #region IResultStrategy Members + /// + /// Processes the specified + /// when a ResultClass is specified on the statement and + /// the ResultClass is . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (outObject == null) outObject = resultMap.CreateInstanceOfResultClass(); + + var count = reader.FieldCount; + for (var i = 0; i < count; i++) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = i; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(i)); + ((IList)outObject).Add(property.GetDataBaseValue(reader)); + } + + return outObject; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/MapStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/MapStrategy.cs new file mode 100644 index 0000000..fb5b56f --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/MapStrategy.cs @@ -0,0 +1,66 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// Delegates on the or on the + /// implementation if a grouBy attribute is specify on the resultMap tag. + /// + public sealed class MapStrategy : IResultStrategy + { + private static readonly IResultStrategy _resultMapStrategy; + private static readonly IResultStrategy _groupByStrategy; + + /// + /// Initializes the class. + /// + static MapStrategy() + { + _resultMapStrategy = new ResultMapStrategy(); + _groupByStrategy = new GroupByStrategy(); + } + + #region IResultStrategy Members + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var resultMap = request.CurrentResultMap.ResolveSubMap(reader); + + if (resultMap.GroupByPropertyNames.Count > 0) return _groupByStrategy.Process(request, ref reader, resultObject); + + return _resultMapStrategy.Process(request, ref reader, resultObject); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/ObjectStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/ObjectStrategy.cs new file mode 100644 index 0000000..57584a6 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/ObjectStrategy.cs @@ -0,0 +1,79 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation when + /// no 'resultClass' attribute is specified. + /// + public sealed class ObjectStrategy : IResultStrategy + { + #region IResultStrategy Members + /// + /// Processes the specified + /// when no resultClass or resultMap attribute are specified. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + if (reader.FieldCount == 1) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = 0; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(0)); + outObject = property.GetDataBaseValue(reader); + } + else if (reader.FieldCount > 1) + { + var newOutObject = new object[reader.FieldCount]; + var count = reader.FieldCount; + for (var i = 0; i < count; i++) + { + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = i; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(reader.GetFieldType(i)); + newOutObject[i] = property.GetDataBaseValue(reader); + } + + outObject = newOutObject; + } + + // do nothing if 0 fields + return outObject; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/ResultClassStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/ResultClassStrategy.cs new file mode 100644 index 0000000..eef7c49 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/ResultClassStrategy.cs @@ -0,0 +1,74 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation when + /// a 'resultClass' attribute is specified. + /// + public sealed class ResultClassStrategy : IResultStrategy + { + private static IResultStrategy _simpleTypeStrategy; + private static IResultStrategy _dictionaryStrategy; + private static IResultStrategy _listStrategy; + private static IResultStrategy _autoMapStrategy; + + /// + /// Initializes a new instance of the class. + /// + public ResultClassStrategy() + { + _simpleTypeStrategy = new SimpleTypeStrategy(); + _dictionaryStrategy = new DictionaryStrategy(); + _listStrategy = new ListStrategy(); + _autoMapStrategy = new AutoMapStrategy(); + } + + #region IResultStrategy Members + /// + /// Processes the specified . + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + // Check if the ResultClass is a 'primitive' Type + if (request.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(request.CurrentResultMap.Class)) return _simpleTypeStrategy.Process(request, ref reader, resultObject); + + if (typeof(IDictionary).IsAssignableFrom(request.CurrentResultMap.Class)) return _dictionaryStrategy.Process(request, ref reader, resultObject); + + if (typeof(IList).IsAssignableFrom(request.CurrentResultMap.Class)) return _listStrategy.Process(request, ref reader, resultObject); + + return _autoMapStrategy.Process(request, ref reader, resultObject); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/ResultMapStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/ResultMapStrategy.cs new file mode 100644 index 0000000..ff477cd --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/ResultMapStrategy.cs @@ -0,0 +1,79 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation when + /// a 'resultMap' attribute is specified. + /// + public sealed class ResultMapStrategy : BaseStrategy, IResultStrategy + { + #region IResultStrategy Members + /// + /// Processes the specified + /// when a ResultMap is specified on the statement. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + + var resultMap = request.CurrentResultMap.ResolveSubMap(reader); + + if (outObject == null) + { + object[] parameters = null; + if (resultMap.Parameters.Count > 0) + { + parameters = new object[resultMap.Parameters.Count]; + // Fill parameters array + for (var index = 0; index < resultMap.Parameters.Count; index++) + { + var resultProperty = resultMap.Parameters[index]; + parameters[index] = resultProperty.ArgumentStrategy.GetValue(request, resultProperty, ref reader, null); + } + } + + outObject = resultMap.CreateInstanceOfResult(parameters); + } + + // For each Property in the ResultMap, set the property in the object + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var property = resultMap.Properties[index]; + property.PropertyStrategy.Set(request, resultMap, property, ref outObject, reader, null); + } + + return outObject; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/ResultStrategyFactory.cs b/ORBatisFramework/MappedStatements/ResultStrategy/ResultStrategyFactory.cs new file mode 100644 index 0000000..657e29e --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/ResultStrategyFactory.cs @@ -0,0 +1,69 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Statements; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// Factory to get implementation. + /// + public sealed class ResultStrategyFactory + { + private static readonly IResultStrategy _resultClassStrategy; + private static readonly IResultStrategy _mapStrategy; + private static readonly IResultStrategy _objectStrategy; + + /// + /// Initializes the class. + /// + static ResultStrategyFactory() + { + _mapStrategy = new MapStrategy(); + _resultClassStrategy = new ResultClassStrategy(); + _objectStrategy = new ObjectStrategy(); + } + + /// + /// Finds the . + /// + /// The statement. + /// The + public static IResultStrategy Get(IStatement statement) + { + // If there's an IResultMap, use it + if (statement.ResultsMap.Count > 0) + { + if (statement.ResultsMap[0] is ResultMap) return _mapStrategy; + + // it is an AutoResultMap + return _resultClassStrategy; + } + + return _objectStrategy; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs b/ORBatisFramework/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs new file mode 100644 index 0000000..8085127 --- /dev/null +++ b/ORBatisFramework/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs @@ -0,0 +1,80 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; +using IBatisNet.DataMapper.Scope; + +namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy +{ + /// + /// implementation when + /// a 'resultClass' attribute is specified and + /// the type of the result object is primitive. + /// + public sealed class SimpleTypeStrategy : IResultStrategy + { + #region IResultStrategy Members + /// + /// Processes the specified + /// when a ResultClass is specified on the statement and + /// the ResultClass is a SimpleType. + /// + /// The request. + /// The reader. + /// The result object. + public object Process(RequestScope request, ref IDataReader reader, object resultObject) + { + var outObject = resultObject; + var resultMap = request.CurrentResultMap as AutoResultMap; + + if (outObject == null) outObject = resultMap.CreateInstanceOfResultClass(); + + if (!resultMap.IsInitalized) + lock (resultMap) + { + if (!resultMap.IsInitalized) + { + // Create a ResultProperty + var property = new ResultProperty(); + property.PropertyName = "value"; + property.ColumnIndex = 0; + property.TypeHandler = request.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(outObject.GetType()); + property.PropertyStrategy = PropertyStrategyFactory.Get(property); + + resultMap.Properties.Add(property); + resultMap.DataExchange = request.DataExchangeFactory.GetDataExchangeForClass(typeof(int)); // set the PrimitiveDataExchange + resultMap.IsInitalized = true; + } + } + + resultMap.Properties[0].PropertyStrategy.Set(request, resultMap, resultMap.Properties[0], ref outObject, reader, null); + + return outObject; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/SelectMappedStatement.cs b/ORBatisFramework/MappedStatements/SelectMappedStatement.cs new file mode 100644 index 0000000..789621d --- /dev/null +++ b/ORBatisFramework/MappedStatements/SelectMappedStatement.cs @@ -0,0 +1,70 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Summary description for SelectMappedStatement. + /// + public sealed class SelectMappedStatement : MappedStatement + { + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal SelectMappedStatement(ISqlMapper sqlMap, IStatement statement) + : base(sqlMap, statement) { } + + + #region ExecuteInsert + /// + /// + /// + /// + /// + public override object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query insert."); + } + #endregion + + #region ExecuteUpdate + /// + /// + /// + /// + /// + public override int ExecuteUpdate(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Insert statements cannot be executed as a update query."); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/MappedStatements/UpdateMappedStatement.cs b/ORBatisFramework/MappedStatements/UpdateMappedStatement.cs new file mode 100644 index 0000000..cbf8353 --- /dev/null +++ b/ORBatisFramework/MappedStatements/UpdateMappedStatement.cs @@ -0,0 +1,158 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + + +using System.Collections; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.MappedStatements +{ + /// + /// Summary description for UpdateMappedStatement. + /// + public sealed class UpdateMappedStatement : MappedStatement + { + /// + /// Constructor + /// + /// An SqlMap + /// An SQL statement + internal UpdateMappedStatement(ISqlMapper sqlMap, IStatement statement) + : base(sqlMap, statement) { } + + #region ExecuteQueryForMap + /// + /// + /// + /// + /// + /// + /// + public override IDictionary ExecuteQueryForMap(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty) + { + throw new DataMapperException("Update statements cannot be executed as a query for map."); + } + #endregion + + #region ExecuteInsert + /// + /// + /// + /// + /// + public override object ExecuteInsert(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query insert."); + } + #endregion + + #region ExecuteQueryForList + /// + /// + /// + /// + /// + public override void ExecuteQueryForList(ISqlMapSession session, object parameterObject, IList resultObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject, int skipResults, int maxResults) + { + throw new DataMapperException("Update statements cannot be executed as a query for list."); + } + + /// + /// + /// + /// + /// + public override IList ExecuteQueryForList(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for list."); + } + #endregion + + #region Delegate + /// + /// + /// + /// + /// + /// + public override IList ExecuteQueryForRowDelegate(ISqlMapSession session, object parameterObject, RowDelegate rowDelegate) + { + throw new DataMapperException("Update statement cannot be executed as a query for row delegate."); + } + + /// + /// Runs a query with a custom object that gets a chance + /// to deal with each row as it is processed. + /// + /// The session used to execute the statement + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A hashtable of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public override IDictionary ExecuteQueryForMapWithRowDelegate(ISqlMapSession session, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate) + { + throw new DataMapperException("Update statement cannot be executed as a query for row delegate."); + } + #endregion + + #region ExecuteForObject + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for object."); + } + + /// + /// + /// + /// + /// + /// + public override object ExecuteQueryForObject(ISqlMapSession session, object parameterObject, object resultObject) + { + throw new DataMapperException("Update statements cannot be executed as a query for object."); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Mapper.cs b/ORBatisFramework/Mapper.cs new file mode 100644 index 0000000..90a4ee2 --- /dev/null +++ b/ORBatisFramework/Mapper.cs @@ -0,0 +1,83 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 513429 $ + * $Date: 2007-03-01 11:32:25 -0700 (Thu, 01 Mar 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities; +using IBatisNet.DataMapper.Configuration; + +namespace IBatisNet.DataMapper +{ + /// + /// A singleton class to access the default SqlMapper defined by the SqlMap.Config + /// + public sealed class Mapper + { + #region Fields + private static volatile ISqlMapper _mapper; + #endregion + + /// + /// + /// + public static void Configure(object obj) + { + _mapper = null; + } + + /// + /// Init the 'default' SqlMapper defined by the SqlMap.Config file. + /// + public static void InitMapper() + { + var handler = new ConfigureHandler(Configure); + var builder = new DomSqlMapBuilder(); + _mapper = builder.ConfigureAndWatch(handler); + } + + /// + /// Get the instance of the SqlMapper defined by the SqlMap.Config file. + /// + /// A SqlMapper initalized via the SqlMap.Config file. + public static ISqlMapper Instance() + { + if (_mapper == null) + lock (typeof(SqlMapper)) + { + if (_mapper == null) // double-check + InitMapper(); + } + + return _mapper; + } + + /// + /// Get the instance of the SqlMapper defined by the SqlMap.Config file. (Convenience form of Instance method.) + /// + /// A SqlMapper initalized via the SqlMap.Config file. + public static ISqlMapper Get() + { + return Instance(); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/ORBatisFramework.csproj b/ORBatisFramework/ORBatisFramework.csproj new file mode 100644 index 0000000..b01bf52 --- /dev/null +++ b/ORBatisFramework/ORBatisFramework.csproj @@ -0,0 +1,359 @@ + + + + + Debug + AnyCPU + {3C780CE6-4AAC-4439-8334-8DFE3B091CA3} + Library + Properties + ORBatisFramework + ORBatisFramework + v4.8 + 512 + IBatisNet.DataMapper + IBatisNet.DataMapper + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\packages\Castle.Core.5.2.1\lib\net462\Castle.Core.dll + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {1ec66731-5437-4f55-9617-22e822772864} + ORBatis.Common + + + + + + + + + + + + + + Designer + + + + + + + + + diff --git a/ORBatisFramework/Properties/AssemblyInfo.cs b/ORBatisFramework/Properties/AssemblyInfo.cs new file mode 100644 index 0000000..90f67a5 --- /dev/null +++ b/ORBatisFramework/Properties/AssemblyInfo.cs @@ -0,0 +1,35 @@ +using System.Reflection; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("ORBatisFramework")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ORBatisFramework")] +[assembly: AssemblyCopyright("Copyright © 2025")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("3C780CE6-4AAC-4439-8334-8DFE3B091CA3")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] \ No newline at end of file diff --git a/ORBatisFramework/Proxy/ILazyFactory.cs b/ORBatisFramework/Proxy/ILazyFactory.cs new file mode 100644 index 0000000..a673933 --- /dev/null +++ b/ORBatisFramework/Proxy/ILazyFactory.cs @@ -0,0 +1,47 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-18 14:25:03 -0600 (Thu, 18 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// Contract of an + /// + public interface ILazyFactory + { + /// + /// Create a new proxy instance. + /// + /// The mapped statement. + /// The param. + /// The target. + /// The set accessor. + /// Returns a new proxy. + object CreateProxy(IMappedStatement mappedStatement, object param, + object target, ISetAccessor setAccessor); + } +} \ No newline at end of file diff --git a/ORBatisFramework/Proxy/LazyFactoryBuilder.cs b/ORBatisFramework/Proxy/LazyFactoryBuilder.cs new file mode 100644 index 0000000..c56de58 --- /dev/null +++ b/ORBatisFramework/Proxy/LazyFactoryBuilder.cs @@ -0,0 +1,85 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2007-01-04 14:28:10 -0700 (Thu, 04 Jan 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using IBatisNet.DataMapper.Exceptions; + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// Gets instance. + /// + public class LazyFactoryBuilder + { + private readonly IDictionary _factory = new HybridDictionary(); + + /// + /// Initializes a new instance of the class. + /// + public LazyFactoryBuilder() + { + _factory[typeof(IList)] = new LazyListFactory(); + _factory[typeof(IList<>)] = new LazyListGenericFactory(); + } + + + /// + /// Register (add) a lazy load Proxy for a type and member type + /// + /// The target type which contains the member proxyfied + /// The member name the proxy must emulate + /// The . + public void Register(Type type, string memberName, ILazyFactory factory) + { + // To use for further used, support for custom proxy + } + + /// + /// Get a ILazyLoadProxy for a type, member name + /// + /// The target type which contains the member proxyfied + /// Return the ILazyLoadProxy instance + public ILazyFactory GetLazyFactory(Type type) + { + if (type.IsInterface) + { + if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>)) return _factory[type.GetGenericTypeDefinition()] as ILazyFactory; + + if (type == typeof(IList)) return _factory[type] as ILazyFactory; + + throw new DataMapperException("Cannot proxy others interfaces than IList or IList<>."); + } + + // if you want to proxy concrete classes, there are also two requirements: + // the class can not be sealed and only virtual methods can be intercepted. + // The reason is that DynamicProxy will create a subclass of your class overriding all methods + // so it can dispatch the invocations to the interceptor. + return new LazyLoadProxyFactory(); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Proxy/LazyList.cs b/ORBatisFramework/Proxy/LazyList.cs new file mode 100644 index 0000000..27c41a0 --- /dev/null +++ b/ORBatisFramework/Proxy/LazyList.cs @@ -0,0 +1,327 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-08-15 12:36:48 -0600 (Tue, 15 Aug 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// A lazy list + /// + [Serializable] + public class LazyList : IList + { + /// + /// Initializes a new instance of the class. + /// + /// The mapped satement. + /// The param. + /// The target. + /// The set accessor. + public LazyList(IMappedStatement mappedSatement, object param, + object target, ISetAccessor setAccessor) + { + _list = new ArrayList(); + _param = param; + _statementId = mappedSatement.Id; + _sqlMap = mappedSatement.SqlMap; + _target = target; + _setAccessor = setAccessor; + } + + #region IEnumerable Members + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + public IEnumerator GetEnumerator() + { + Load("Add"); + return _list.GetEnumerator(); + } + #endregion + + /// + /// Resolve the lazy loading. + /// + /// Name of the method. + private void Load(string methodName) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call to " + methodName); + + lock (_loadLock) + { + if (_loaded == false) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call, query statement " + _statementId); + throw new InvalidOperationException("todo: find session"); + + _list = _sqlMap.QueryForList(_statementId, _param, null); + _loaded = true; + _setAccessor.Set(_target, _list); + } + } + + if (_logger.IsDebugEnabled) _logger.Debug("End of proxyfied call to " + methodName); + } + + #region Fields + private object _param; + private object _target; + private ISetAccessor _setAccessor; + private ISqlMapper _sqlMap; + private string _statementId = string.Empty; + private bool _loaded; + private object _loadLock = new object(); + private IList _list; + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + + #region IList Members + /// + /// Adds an item to the . + /// + /// The to add to the . + /// + /// The position into which the new element was inserted. + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + public int Add(object value) + { + Load("Add"); + return _list.Add(value); + } + + /// + /// Removes all items from the . + /// + /// The is read-only. + public void Clear() + { + Load("Clear"); + _list.Clear(); + } + + /// + /// Determines whether the contains a specific value. + /// + /// + /// The to locate in the + /// . + /// + /// + /// true if the is found in the ; + /// otherwise, false. + /// + public bool Contains(object value) + { + Load("Contains"); + return _list.Contains(value); + } + + /// + /// Determines the index of a specific item in the . + /// + /// + /// The to locate in the + /// . + /// + /// + /// The index of value if found in the list; otherwise, -1. + /// + public int IndexOf(object value) + { + Load("IndexOf"); + return _list.IndexOf(value); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which value should be inserted. + /// + /// The to insert into the + /// . + /// + /// + /// index is not a valid index in the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + /// + /// value is null reference in the + /// . + /// + public void Insert(int index, object value) + { + Load("Insert"); + _list.Insert(index, value); + } + + /// + /// Gets a value indicating whether the has a fixed size. + /// + /// + /// true if the has a fixed size; otherwise, false. + public bool IsFixedSize => false; + + /// + /// Gets a value indicating whether the is read-only. + /// + /// + /// true if the is read-only; otherwise, false. + public bool IsReadOnly => false; + + /// + /// Removes the first occurrence of a specific object from the . + /// + /// + /// The to remove from the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + public void Remove(object value) + { + Load("Remove"); + _list.Remove(value); + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + /// + /// index is not a valid index in the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + public void RemoveAt(int index) + { + Load("RemoveAt"); + _list.RemoveAt(index); + } + + /// + /// Gets or sets the at the specified index. + /// + /// + public object this[int index] + { + get + { + Load("this"); + return _list[index]; + } + set + { + Load("this"); + _list[index] = value; + } + } + #endregion + + #region ICollection Members + /// + /// Copies the elements of the to an + /// , starting at a particular index. + /// + /// + /// The one-dimensional that is the destination of the elements + /// copied from . The must have + /// zero-based indexing. + /// + /// The zero-based index in array at which copying begins. + /// array is null. + /// index is less than zero. + /// + /// array is multidimensional.-or- index is equal to or greater than the + /// length of array.-or- The number of elements in the source is + /// greater than the available space from index to the end of the destination array. + /// + /// + /// The type of the source + /// cannot be cast automatically to the type of the destination + /// array. + /// + public void CopyTo(Array array, int index) + { + Load("CopyTo"); + _list.CopyTo(array, index); + } + + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + public int Count + { + get + { + Load("Count"); + return _list.Count; + } + } + + /// + /// Gets a value indicating whether access to the is synchronized + /// (thread safe). + /// + /// + /// + /// true if access to the is synchronized (thread safe); + /// otherwise, false. + /// + public bool IsSynchronized => false; + + /// + /// Gets an object that can be used to synchronize access to the . + /// + /// + /// An object that can be used to synchronize access to the . + public object SyncRoot => this; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Proxy/LazyListFactory.cs b/ORBatisFramework/Proxy/LazyListFactory.cs new file mode 100644 index 0000000..9bde1f3 --- /dev/null +++ b/ORBatisFramework/Proxy/LazyListFactory.cs @@ -0,0 +1,53 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-18 14:25:03 -0600 (Thu, 18 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// Implementation of to create proxy for an element. + /// + public class LazyListFactory : ILazyFactory + { + #region ILazyFactory Members + /// + /// Create a new proxy instance. + /// + /// The mapped statement. + /// The param. + /// The target. + /// The set accessor. + /// Returns a new proxy. + public object CreateProxy(IMappedStatement mappedStatement, object param, + object target, ISetAccessor setAccessor) + { + return new LazyList(mappedStatement, param, target, setAccessor); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Proxy/LazyListGeneric.cs b/ORBatisFramework/Proxy/LazyListGeneric.cs new file mode 100644 index 0000000..200ed58 --- /dev/null +++ b/ORBatisFramework/Proxy/LazyListGeneric.cs @@ -0,0 +1,516 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-11-09 13:02:26 -0700 (Thu, 09 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// A lazy generic list + /// + /// + [Serializable] + public class LazyListGeneric : IList, IList where T : class + + { + /// + /// Initializes a new instance of the LazyListGeneric class. + /// + /// The mapped satement. + /// The param. + /// The target. + /// The set accessor. + public LazyListGeneric(IMappedStatement mappedSatement, object param, + object target, ISetAccessor setAccessor) + { + _param = param; + _statementId = mappedSatement.Id; + _sqlMap = mappedSatement.SqlMap; + _target = target; + _setAccessor = setAccessor; + _list = new List(); + } + + #region IEnumerable Members + /// + /// Returns an enumerator that iterates through the collection. + /// + /// + /// A that can be used to iterate through the collection. + /// + public IEnumerator GetEnumerator() + { + Load("GetEnumerator"); + return _list.GetEnumerator(); + } + #endregion + + #region IEnumerable Members + /// + /// Returns an enumerator that iterates through a collection. + /// + /// + /// An object that can be used to iterate through the collection. + /// + IEnumerator IEnumerable.GetEnumerator() + { + Load("GetEnumerator"); + return _list.GetEnumerator(); + } + #endregion + + /// + /// Resolve the lazy loading. + /// + /// Name of the method. + private void Load(string methodName) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call to " + methodName); + + lock (_loadLock) + { + if (_loaded == false) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call, query statement " + _statementId); + + throw new InvalidOperationException("todo: find session"); + _list = _sqlMap.QueryForList(_statementId, _param, null); + _loaded = true; + _setAccessor.Set(_target, _list); + } + } + + if (_logger.IsDebugEnabled) _logger.Debug("End of proxyfied call to " + methodName); + } + + #region Fields + private object _param; + private object _target; + private ISetAccessor _setAccessor; + private ISqlMapper _sqlMap; + private string _statementId = string.Empty; + private bool _loaded; + private object _loadLock = new object(); + private IList _list; + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + + #region IList Members + /// + /// Determines the index of a specific item in the . + /// + /// The object to locate in the . + /// + /// The index of item if found in the list; otherwise, -1. + /// + public int IndexOf(T item) + { + Load("IndexOf"); + return _list.IndexOf(item); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which item should be inserted. + /// The object to insert into the . + /// + /// The is + /// read-only. + /// + /// + /// index is not a valid index in the + /// . + /// + public void Insert(int index, T item) + { + Load("Insert"); + _list.Insert(index, item); + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + /// + /// The is + /// read-only. + /// + /// + /// index is not a valid index in the + /// . + /// + public void RemoveAt(int index) + { + Load("RemoveAt"); + _list.RemoveAt(index); + } + + /// + /// Gets or sets the object at the specified index. + /// + /// + public T this[int index] + { + get + { + Load("this"); + return _list[index]; + } + set + { + Load("this"); + _list[index] = value; + } + } + #endregion + + #region ICollection Members + /// + /// Adds an item to the . + /// + /// The object to add to the . + /// + /// The is + /// read-only. + /// + public void Add(T item) + { + Load("Add"); + _list.Add(item); + } + + /// + /// Removes all items from the . + /// + /// + /// The is + /// read-only. + /// + public void Clear() + { + Load("Clear"); + _list.Clear(); + } + + /// + /// Determines whether the contains a specific value. + /// + /// The object to locate in the . + /// + /// true if item is found in the ; otherwise, false. + /// + public bool Contains(T item) + { + Load("Contains"); + return _list.Contains(item); + } + + /// + /// Copies the elements of the to an + /// , starting at a particular index. + /// + /// + /// The one-dimensional that is the destination of the elements + /// copied from . The + /// must have zero-based indexing. + /// + /// The zero-based index in array at which copying begins. + /// arrayIndex is less than 0. + /// array is null. + /// + /// array is multidimensional.-or-arrayIndex is equal to or greater than the + /// length of array.-or-The number of elements in the source + /// is greater than the available space from arrayIndex + /// to the end of the destination array.-or-Type T cannot be cast automatically to the type of the destination array. + /// + public void CopyTo(T[] array, int arrayIndex) + { + Load("CopyTo"); + _list.CopyTo(array, arrayIndex); + } + + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + public int Count + { + get + { + Load("Count"); + return _list.Count; + } + } + + /// + /// Gets a value indicating whether the is read-only. + /// + /// + /// true if the is read-only; otherwise, false. + public bool IsReadOnly => false; + + /// + /// Removes the first occurrence of a specific object from the + /// . + /// + /// The object to remove from the . + /// + /// true if item was successfully removed from the ; + /// otherwise, false. This method also returns false if item is not found in the original + /// . + /// + /// + /// The is + /// read-only. + /// + public bool Remove(T item) + { + Load("Remove"); + return _list.Remove(item); + } + #endregion + + #region IList Members + /// + /// Adds an item to the . + /// + /// The to add to the . + /// + /// The position into which the new element was inserted. + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + int IList.Add(object value) + { + Load("Add"); + return ((IList)_list).Add(value); + } + + /// + /// Removes all items from the . + /// + /// + /// The is + /// read-only. + /// + void IList.Clear() + { + Clear(); + } + + /// + /// Determines whether the contains a specific value. + /// + /// + /// The to locate in the + /// . + /// + /// + /// true if the is found in the ; + /// otherwise, false. + /// + bool IList.Contains(object value) + { + Load("Contains"); + return ((IList)_list).Contains(value); + } + + /// + /// Determines the index of a specific item in the . + /// + /// + /// The to locate in the + /// . + /// + /// + /// The index of value if found in the list; otherwise, -1. + /// + int IList.IndexOf(object value) + { + Load("IndexOf"); + return ((IList)_list).IndexOf(value); + } + + /// + /// Inserts an item to the at the specified index. + /// + /// The zero-based index at which value should be inserted. + /// + /// The to insert into the + /// . + /// + /// + /// index is not a valid index in the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + /// + /// value is null reference in the + /// . + /// + void IList.Insert(int index, object value) + { + Load("IndexOf"); + ((IList)_list).Insert(index, value); + } + + /// + /// Gets a value indicating whether the has a fixed size. + /// + /// + /// true if the has a fixed size; otherwise, false. + bool IList.IsFixedSize => false; + + /// + /// Gets a value indicating whether the is read-only. + /// + /// + /// true if the is read-only; otherwise, false. + bool IList.IsReadOnly => false; + + + /// + /// Removes the first occurrence of a specific object from the . + /// + /// + /// The to remove from the + /// . + /// + /// + /// The is read-only.-or- + /// The has a fixed size. + /// + void IList.Remove(object value) + { + Load("Remove"); + ((IList)_list).Remove(value); + } + + /// + /// Removes the item at the specified index. + /// + /// The zero-based index of the item to remove. + /// + /// The is + /// read-only. + /// + /// + /// index is not a valid index in the + /// . + /// + void IList.RemoveAt(int index) + { + RemoveAt(index); + } + + /// + /// Gets or sets the at the specified index. + /// + /// + object IList.this[int index] + { + get + { + Load("this"); + return this[index]; + } + set + { + Load("this"); + ((IList)_list)[index] = value; + } + } + #endregion + + #region ICollection Members + /// + /// Copies the elements of the to an , + /// starting at a particular index. + /// + /// + /// The one-dimensional that is the destination of the elements + /// copied from . The must have + /// zero-based indexing. + /// + /// The zero-based index in array at which copying begins. + /// array is null. + /// index is less than zero. + /// + /// array is multidimensional.-or- index is equal to or greater than the + /// length of array.-or- The number of elements in the source is + /// greater than the available space from index to the end of the destination array. + /// + /// + /// The type of the source + /// cannot be cast automatically to the type of the destination + /// array. + /// + void ICollection.CopyTo(Array array, int index) + { + Load("CopyTo"); + ((IList)_list).CopyTo(array, index); + } + + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + int ICollection.Count => Count; + + /// + /// Gets a value indicating whether access to the is synchronized + /// (thread safe). + /// + /// + /// + /// true if access to the is synchronized (thread safe); + /// otherwise, false. + /// + bool ICollection.IsSynchronized => false; + + /// + /// Gets an object that can be used to synchronize access to the . + /// + /// + /// An object that can be used to synchronize access to the . + object ICollection.SyncRoot => this; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Proxy/LazyListGenericFactory.cs b/ORBatisFramework/Proxy/LazyListGenericFactory.cs new file mode 100644 index 0000000..434e809 --- /dev/null +++ b/ORBatisFramework/Proxy/LazyListGenericFactory.cs @@ -0,0 +1,62 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-18 14:25:03 -0600 (Thu, 18 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// /// Implementation of to create proxy for an generic IList element. + /// + public class LazyListGenericFactory : ILazyFactory + { + #region ILazyFactory Members + /// + /// Create a new proxy instance. + /// + /// The mapped statement. + /// The param. + /// The target. + /// The set accessor. + /// Returns a new proxy. + public object CreateProxy(IMappedStatement mappedStatement, object param, + object target, ISetAccessor setAccessor) + { + var elementType = setAccessor.MemberType.GetGenericArguments()[0]; + var lazyType = typeof(LazyListGeneric<>); + var lazyGenericType = lazyType.MakeGenericType(elementType); + + Type[] parametersType = { typeof(IMappedStatement), typeof(object), typeof(object), typeof(ISetAccessor) }; + + var factory = mappedStatement.SqlMap.DataExchangeFactory.ObjectFactory.CreateFactory(lazyGenericType, parametersType); + + object[] parameters = { mappedStatement, param, target, setAccessor }; + return factory.CreateInstance(parameters); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Proxy/LazyLoadInterceptor.cs b/ORBatisFramework/Proxy/LazyLoadInterceptor.cs new file mode 100644 index 0000000..3114a6c --- /dev/null +++ b/ORBatisFramework/Proxy/LazyLoadInterceptor.cs @@ -0,0 +1,138 @@ +#region Apache Notice +/***************************************************************************** + * $LastChangedDate: 2013-07-11 $ + * $LastChangedBy: mmccurrey $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2008/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Reflection; +using Castle.DynamicProxy; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; +#endregion + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// Default implementation of the interceptor reponsible of load the lazy element + /// Could load collections and single objects + /// + [Serializable] + public class LazyLoadInterceptor : IInterceptor + { + #region IInterceptor member + /// + /// Intercepts the specified invocation., params object[] arguments + /// + /// The invocation. + /// + public virtual void Intercept(IInvocation invocation) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call to " + invocation.Method.Name); + + lock (syncLock) + { + if (loaded == false && !passthroughMethods.Contains(invocation.Method.Name)) + { + if (_logger.IsDebugEnabled) _logger.Debug("Proxyfying call, query statement " + statementName); + + //Perform load + throw new InvalidOperationException("todo: find session"); + + if (typeof(IList).IsAssignableFrom(setAccessor.MemberType)) + lazyLoadedItem = sqlMapper.QueryForList(statementName, param, null); + else + lazyLoadedItem = sqlMapper.QueryForObject(statementName, param, null); + + loaded = true; + setAccessor.Set(target, lazyLoadedItem); + } + } + + try + { + invocation.ReturnValue = invocation.Method.Invoke(lazyLoadedItem, invocation.Arguments); + } + catch (TargetInvocationException exception) + { + PreserveStackTrace(exception); + throw; + } + + if (_logger.IsDebugEnabled) _logger.Debug("End of proxyfied call to " + invocation.Method.Name); + } + #endregion + + private void PreserveStackTrace(Exception exception) + { + var preserveStackTrace = typeof(Exception).GetMethod("InternalPreserveStackTrace", + BindingFlags.Instance | BindingFlags.NonPublic); + preserveStackTrace.Invoke(exception, null); + } + + #region Fields + private readonly object param; + private readonly object target; + private readonly ISetAccessor setAccessor; + private readonly ISqlMapper sqlMapper; + private readonly string statementName = string.Empty; + private bool loaded; + private object lazyLoadedItem; + private readonly object syncLock = new object(); + private static readonly ArrayList passthroughMethods = new ArrayList(); + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + + #region Constructor (s) / Destructor + /// + /// Static Constructor for a lazy list loader + /// + static LazyLoadInterceptor() + { + passthroughMethods.Add("GetType"); + } + + /// + /// Constructor for a lazy list loader + /// + /// The data mapper. + /// The mapped statement used to build the list + /// The parameter object used to build the list + /// The target object which contains the property proxydied. + /// The proxified member accessor. + public LazyLoadInterceptor( + ISqlMapper sqlMapper, + IMappedStatement mappedSatement, object param, + object target, ISetAccessor setAccessor) + { + this.param = param; + statementName = mappedSatement.Id; + this.sqlMapper = sqlMapper; + this.target = target; + this.setAccessor = setAccessor; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Proxy/LazyLoadProxyFactory.cs b/ORBatisFramework/Proxy/LazyLoadProxyFactory.cs new file mode 100644 index 0000000..e1466c9 --- /dev/null +++ b/ORBatisFramework/Proxy/LazyLoadProxyFactory.cs @@ -0,0 +1,78 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2008-06-28 09:26:16 -0600 (Sat, 28 Jun 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2008/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using Castle.DynamicProxy; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.MappedStatements; + +namespace IBatisNet.DataMapper.Proxy +{ + /// + /// Proxy Factory for Lazy Load + /// + public class LazyLoadProxyFactory : ILazyFactory + { + #region ILazyFactory Members + /// + /// Builds the specified lazy load proxy for a concrete class with virtual method. + /// + /// The mapped statement used to build the lazy loaded object. + /// The parameter object used to build lazy loaded object. + /// The target object which contains the property proxydied.. + /// The proxified member accessor. + /// + /// Return a proxy object + /// + public object CreateProxy( + IMappedStatement selectStatement, object param, + object target, ISetAccessor setAccessor) + { + var typeProxified = setAccessor.MemberType; + + if (logger.IsDebugEnabled) logger.Debug(string.Format("Statement '{0}', create proxy for member {1}.", selectStatement.Id, setAccessor.MemberType)); + + // Build the proxy + var interceptor = new LazyLoadInterceptor(selectStatement.SqlMap, selectStatement, param, target, setAccessor); + + // if you want to proxy concrete classes, there are also 2 main requirements : + // the class can not be sealed and only virtual methods can be intercepted. + // The reason is that DynamicProxy will create a subclass of your class overriding all methods + // so it can dispatch the invocations to the interceptor. + + // The proxified type must also have an empty constructor + var generatedProxy = proxyGenerator.CreateClassProxy(typeProxified, Type.EmptyTypes, interceptor); + + return generatedProxy; + } + #endregion + #region Fields + private static readonly ILog logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private static readonly ProxyGenerator proxyGenerator = new ProxyGenerator(); + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Scope/ConfigurationScope.cs b/ORBatisFramework/Scope/ConfigurationScope.cs new file mode 100644 index 0000000..a109ef7 --- /dev/null +++ b/ORBatisFramework/Scope/ConfigurationScope.cs @@ -0,0 +1,256 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 576082 $ + * $Date: 2007-09-16 06:04:01 -0600 (Sun, 16 Sep 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Configuration; +using System.Xml; +using IBatisNet.Common; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.DataMapper.Configuration; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.TypeHandlers; +#endregion + +namespace IBatisNet.DataMapper.Scope +{ + /// + /// The ConfigurationScope maintains the state of the build process. + /// + public class ConfigurationScope : IScope + { + /// + /// Empty parameter map + /// + public const string EMPTY_PARAMETER_MAP = "iBATIS.Empty.ParameterMap"; + + #region Constructors + /// + /// Default constructor + /// + public ConfigurationScope() + { + ErrorContext = new ErrorContext(); + + Providers.Clear(); + } + #endregion + + /// + /// Register under Statement Name or Fully Qualified Statement Name + /// + /// An Identity + /// The new Identity + public string ApplyNamespace(string id) + { + var newId = id; + + if (SqlMapNamespace != null && SqlMapNamespace.Length > 0 + && id != null && id.Length > 0 && id.IndexOf(".") < 0) + newId = SqlMapNamespace + DomSqlMapBuilder.DOT + id; + return newId; + } + + /// + /// Resolves the type handler. + /// + /// The clazz. + /// Name of the member. + /// Type of the CLR. + /// Type of the db. + /// if set to true [for setter]. + /// + public ITypeHandler ResolveTypeHandler(Type clazz, string memberName, string clrType, string dbType, bool forSetter) + { + ITypeHandler handler = null; + if (clazz == null) + { + handler = DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); + } + else if (typeof(IDictionary).IsAssignableFrom(clazz)) + { + // IDictionary + if (clrType == null || clrType.Length == 0) + handler = DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); + else + try + { + var type = TypeUtils.ResolveType(clrType); + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); + } + catch (Exception e) + { + throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); + } + } + else if (DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(clazz, dbType) != null) + { + // Primitive + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(clazz, dbType); + } + else + { + // .NET object + if (clrType == null || clrType.Length == 0) + { + Type type = null; + if (forSetter) + type = ObjectProbe.GetMemberTypeForSetter(clazz, memberName); + else + type = ObjectProbe.GetMemberTypeForGetter(clazz, memberName); + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); + } + else + { + try + { + var type = TypeUtils.ResolveType(clrType); + handler = DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); + } + catch (Exception e) + { + throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); + } + } + } + + return handler; + } + + + #region Properties + /// + /// The list of sql fragment + /// + public HybridDictionary SqlIncludes { get; } = new HybridDictionary(); + + /// + /// XmlNamespaceManager + /// + public XmlNamespaceManager XmlNamespaceManager { set; get; } + + /// + /// Set if the parser should validate the sqlMap documents + /// + public bool ValidateSqlMap { set; get; } + + /// + /// Tells us if the xml configuration file validate the schema + /// + public bool IsXmlValid { set; get; } = true; + + + /// + /// The current SqlMap namespace. + /// + public string SqlMapNamespace { set; get; } + + /// + /// The SqlMapper we are building. + /// + public ISqlMapper SqlMapper { set; get; } + + + /// + /// A factory for DataExchange objects + /// + public DataExchangeFactory DataExchangeFactory => SqlMapper.DataExchangeFactory; + + /// + /// Tell us if we are in a DataAccess context. + /// + public bool IsCallFromDao { set; get; } + + /// + /// Tell us if we cache model is enabled. + /// + public bool IsCacheModelsEnabled { set; get; } + + /// + /// External data source + /// + public DataSource DataSource { set; get; } + + /// + /// The current context node we are analizing + /// + public XmlNode NodeContext { set; get; } + + /// + /// The XML SqlMap config file + /// + public XmlDocument SqlMapConfigDocument { set; get; } + + /// + /// A XML SqlMap file + /// + public XmlDocument SqlMapDocument { set; get; } + + /// + /// A XML SqlMap file + /// + public XmlDocument SqlMapModuleDocument { set; get; } + + /// + /// Tell us if we use Configuration File Watcher + /// + public bool UseConfigFileWatcher { set; get; } + + /// + /// Tell us if we use statements namespaces + /// + public bool UseStatementNamespaces { set; get; } + + /// + /// Get the request's error context + /// + public ErrorContext ErrorContext { get; } + + /// + /// List of providers + /// + public HybridDictionary Providers { get; } = new HybridDictionary(); + + /// + /// List of global properties + /// + public NameValueCollection Properties { get; } = new NameValueCollection(); + + /// + /// Indicates if we can use reflection optimizer. + /// + public bool UseReflectionOptimizer { get; set; } = true; + + /// + /// Temporary storage for mapping cache model ids (key is System.String) to statements (value is IList which contains + /// IMappedStatements). + /// + public HybridDictionary CacheModelFlushOnExecuteStatements { get; set; } = new HybridDictionary(); + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Scope/ErrorContext.cs b/ORBatisFramework/Scope/ErrorContext.cs new file mode 100644 index 0000000..dc2923a --- /dev/null +++ b/ORBatisFramework/Scope/ErrorContext.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Text; +#endregion + +namespace IBatisNet.DataMapper.Scope +{ + /// + /// An error context to help us create meaningful error messages. + /// + public class ErrorContext + { + #region Properties + /// + /// The resource causing the problem + /// + public string Resource { get; set; } = string.Empty; + + /// + /// The activity that was happening when the error happened + /// + public string Activity { get; set; } = string.Empty; + + /// + /// The object ID where the problem happened + /// + public string ObjectId { get; set; } = string.Empty; + + /// + /// More information about the error + /// + public string MoreInfo { get; set; } = string.Empty; + #endregion + + #region Methods + /// + /// Clear the error context + /// + public void Reset() + { + Resource = string.Empty; + Activity = string.Empty; + ObjectId = string.Empty; + MoreInfo = string.Empty; + } + + /// + /// + /// + public override string ToString() + { + var message = new StringBuilder(); + + // activity + if (Activity != null && Activity.Length > 0) + { + message.Append(Environment.NewLine); + message.Append("- The error occurred while "); + message.Append(Activity); + message.Append("."); + } + + // more info + if (MoreInfo != null && MoreInfo.Length > 0) + { + message.Append(Environment.NewLine); + message.Append("- "); + message.Append(MoreInfo); + } + + // resource + if (Resource != null && Resource.Length > 0) + { + message.Append(Environment.NewLine); + message.Append("- The error occurred in "); + message.Append(Resource); + message.Append("."); + } + + // object + if (ObjectId != null && ObjectId.Length > 0) + { + message.Append(" "); + message.Append(Environment.NewLine); + message.Append("- Check the "); + message.Append(ObjectId); + message.Append("."); + } + + return message.ToString(); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Scope/IScope.cs b/ORBatisFramework/Scope/IScope.cs new file mode 100644 index 0000000..bbf96b7 --- /dev/null +++ b/ORBatisFramework/Scope/IScope.cs @@ -0,0 +1,44 @@ +using IBatisNet.DataMapper.DataExchange; + +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.Scope +{ + /// + /// + public interface IScope + { + /// + /// Get the error context + /// + ErrorContext ErrorContext { get; } + + /// + /// The factory for DataExchange objects + /// + DataExchangeFactory DataExchangeFactory { get; } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Scope/RequestScope.cs b/ORBatisFramework/Scope/RequestScope.cs new file mode 100644 index 0000000..7254dd0 --- /dev/null +++ b/ORBatisFramework/Scope/RequestScope.cs @@ -0,0 +1,215 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 476843 $ + * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Collections; +using System.Data; +using System.Runtime.CompilerServices; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Configuration.Statements; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.MappedStatements; +#endregion + +namespace IBatisNet.DataMapper.Scope +{ + /// + /// Hold data during the process of a mapped statement. + /// + public class RequestScope : IScope + { + #region Constructors + /// + /// Initializes a new instance of the class. + /// + /// The data exchange factory. + /// The session. + /// The statement + public RequestScope( + DataExchangeFactory dataExchangeFactory, + ISqlMapSession session, + IStatement statement + ) + { + ErrorContext = new ErrorContext(); + + Statement = statement; + ParameterMap = statement.ParameterMap; + Session = session; + DataExchangeFactory = dataExchangeFactory; + _id = GetNextId(); + } + #endregion + #region Fields + private static long _nextId; + private readonly long _id; + + private int _currentResultMapIndex = -1; + + // Used by N+1 Select solution + // Holds [IResultMap, IDictionary] couple where the IDictionary holds [key, result object] + private IDictionary _uniqueKeys; + #endregion + + #region Properties + /// + /// Gets the unique keys. + /// + /// The ResultMap. + /// + /// Returns [key, result object] which holds the result objects that have + /// already been build during this request with this + /// + public IDictionary GetUniqueKeys(IResultMap map) + { + if (_uniqueKeys == null) return null; + return (IDictionary)_uniqueKeys[map]; + } + + /// + /// Sets the unique keys. + /// + /// The map. + /// The keys. + public void SetUniqueKeys(IResultMap map, IDictionary keys) + { + if (_uniqueKeys == null) _uniqueKeys = new Hashtable(); + _uniqueKeys.Add(map, keys); + } + + /// + /// The current . + /// + public IMappedStatement MappedStatement { set; get; } + + /// + /// Gets the current . + /// + /// The statement. + public IStatement Statement { get; } + + /// + /// The current . + /// + public ISqlMapSession Session { get; } + + /// + /// The to execute + /// + public IDbCommand IDbCommand { set; get; } + + /// + /// Indicate if the statement have find data + /// + public bool IsRowDataFound { set; get; } + + /// + /// The 'select' result property to process after having process the main properties. + /// + public Queue QueueSelect { get; set; } = new Queue(); + + /// + /// The current used by this request. + /// + public IResultMap CurrentResultMap => Statement.ResultsMap[_currentResultMapIndex]; + + /// + /// Moves to the next result map. + /// + /// + public bool MoveNextResultMap() + { + if (_currentResultMapIndex < Statement.ResultsMap.Count - 1) + { + _currentResultMapIndex++; + return true; + } + + return false; + } + + /// + /// The used by this request. + /// + public ParameterMap ParameterMap { set; get; } + + /// + /// The used by this request. + /// + public PreparedStatement PreparedStatement { get; set; } + #endregion + + #region Method + /// + /// Check if the specify object is equal to the current object. + /// + /// + /// + public override bool Equals(object obj) + { + if (this == obj) return true; + if (!(obj is RequestScope)) return false; + + var scope = (RequestScope)obj; + + if (_id != scope._id) return false; + + return true; + } + + /// + /// Get the HashCode for this RequestScope + /// + /// + public override int GetHashCode() + { + return (int)(_id ^ (_id >> 32)); + } + + /// + /// Method to get a unique ID + /// + /// The new ID + [MethodImpl(MethodImplOptions.Synchronized)] + public static long GetNextId() + { + return _nextId++; + } + #endregion + + #region IScope Members + /// + /// A factory for DataExchange objects + /// + public DataExchangeFactory DataExchangeFactory { get; } + + /// + /// Get the request's error context + /// + public ErrorContext ErrorContext { get; } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/SqlMap.xsd b/ORBatisFramework/SqlMap.xsd new file mode 100644 index 0000000..1a9f7a3 --- /dev/null +++ b/ORBatisFramework/SqlMap.xsd @@ -0,0 +1,853 @@ + + + + + + Mapping XML Schema Definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatisFramework/SqlMapConfig.xsd b/ORBatisFramework/SqlMapConfig.xsd new file mode 100644 index 0000000..1f6abdf --- /dev/null +++ b/ORBatisFramework/SqlMapConfig.xsd @@ -0,0 +1,154 @@ + + + + + + DataMapper XML Schema Definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + The document root. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatisFramework/SqlMapModule.xsd b/ORBatisFramework/SqlMapModule.xsd new file mode 100644 index 0000000..9e9ba3f --- /dev/null +++ b/ORBatisFramework/SqlMapModule.xsd @@ -0,0 +1,44 @@ + + + + + + Mapping Module XML Schema Definition + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatisFramework/SqlMapSession.cs b/ORBatisFramework/SqlMapSession.cs new file mode 100644 index 0000000..588566d --- /dev/null +++ b/ORBatisFramework/SqlMapSession.cs @@ -0,0 +1,475 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 515691 $ + * $Date: 2007-03-07 11:39:07 -0700 (Wed, 07 Mar 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Imports +using System; +using System.Data; +using System.Reflection; +using IBatisNet.Common; +using IBatisNet.Common.Logging; +using IBatisNet.DataMapper.Exceptions; +#endregion + + +namespace IBatisNet.DataMapper +{ + /// + /// Summary description for SqlMapSession. + /// + [Serializable] + public class SqlMapSession : ISqlMapSession + { + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + #region Constructor (s) / Destructor + /// + /// + /// + public SqlMapSession(ISqlMapper sqlMapper) + { + DataSource = sqlMapper.DataSource; + SqlMapper = sqlMapper; + } + #endregion + + #region IDisposable Members + /// + /// Releasing, or resetting resources. + /// + public void Dispose() + { + if (_logger.IsDebugEnabled) _logger.Debug("Dispose SqlMapSession"); + if (IsTransactionStart == false) + { + if (_connection.State != ConnectionState.Closed) CloseConnection(); + } + else + { + if (_consistent) + { + CommitTransaction(); + IsTransactionStart = false; + } + else + { + if (_connection.State != ConnectionState.Closed) + { + RollBackTransaction(); + IsTransactionStart = false; + } + } + } + } + #endregion + + #region IDalSession Members + #region Fields + /// + /// Changes the vote to commit (true) or to abort (false) in transsaction + /// + private bool _consistent; + + /// + /// Holds value of connection + /// + private IDbConnection _connection; + + /// + /// Holds value of transaction + /// + private IDbTransaction _transaction; + #endregion + + #region Properties + /// + /// Gets the SQL mapper. + /// + /// The SQL mapper. + public ISqlMapper SqlMapper { get; } + + + /// + /// The data source use by the session. + /// + /// + public IDataSource DataSource { get; } + + + /// + /// The Connection use by the session. + /// + /// + public IDbConnection Connection => _connection; + + + /// + /// The Transaction use by the session. + /// + /// + public IDbTransaction Transaction => _transaction; + + /// + /// Indicates if a transaction is open on + /// the session. + /// + public bool IsTransactionStart { get; private set; } + + /// + /// Changes the vote for transaction to commit (true) or to abort (false). + /// + private bool Consistent + { + set => _consistent = value; + } + #endregion + + #region Methods + /// + /// Complete (commit) a transaction + /// + /// + /// Use in 'using' syntax. + /// + public void Complete() + { + Consistent = true; + } + + /// + /// Open the connection + /// + public void OpenConnection() + { + OpenConnection(DataSource.ConnectionString); + } + + /// + /// Create the connection + /// + public void CreateConnection() + { + CreateConnection(DataSource.ConnectionString); + } + + /// + /// Create the connection + /// + public void CreateConnection(string connectionString) + { + _connection = DataSource.DbProvider.CreateConnection(); + _connection.ConnectionString = connectionString; + } + + /// + /// Open a connection, on the specified connection string. + /// + /// The connection string + public void OpenConnection(string connectionString) + { + if (_connection == null) + { + CreateConnection(connectionString); + try + { + _connection.Open(); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Open Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), DataSource.DbProvider.Description)); + } + catch (Exception ex) + { + throw new DataMapperException(string.Format("Unable to open connection to \"{0}\".", DataSource.DbProvider.Description), ex); + } + } + else if (_connection.State != ConnectionState.Open) + { + try + { + _connection.Open(); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Open Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), DataSource.DbProvider.Description)); + } + catch (Exception ex) + { + throw new DataMapperException(string.Format("Unable to open connection to \"{0}\".", DataSource.DbProvider.Description), ex); + } + } + } + + /// + /// Close the connection + /// + public void CloseConnection() + { + if (_connection != null && _connection.State != ConnectionState.Closed) + { + _connection.Close(); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Close Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), DataSource.DbProvider.Description)); + _connection.Dispose(); + } + + _connection = null; + } + + /// + /// Begins a database transaction. + /// + public void BeginTransaction() + { + BeginTransaction(DataSource.ConnectionString); + } + + /// + /// Open a connection and begin a transaction on the specified connection string. + /// + /// The connection string + public void BeginTransaction(string connectionString) + { + if (_connection == null || _connection.State != ConnectionState.Open) OpenConnection(connectionString); + _transaction = _connection.BeginTransaction(); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + + /// + /// Begins a database transaction + /// + /// Open a connection. + public void BeginTransaction(bool openConnection) + { + if (openConnection) + { + BeginTransaction(); + } + else + { + if (_connection == null || _connection.State != ConnectionState.Open) OpenConnection(); + _transaction = _connection.BeginTransaction(); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + } + + /// + /// Begins a database transaction with the specified isolation level. + /// + /// + /// The isolation level under which the transaction should run. + /// + public void BeginTransaction(IsolationLevel isolationLevel) + { + BeginTransaction(DataSource.ConnectionString, isolationLevel); + } + + /// + /// Open a connection and begin a transaction on the specified connection string. + /// + /// The connection string + /// The transaction isolation level for this connection. + public void BeginTransaction(string connectionString, IsolationLevel isolationLevel) + { + if (_connection == null || _connection.State != ConnectionState.Open) OpenConnection(connectionString); + _transaction = _connection.BeginTransaction(isolationLevel); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + + /// + /// Begins a transaction on the current connection + /// with the specified IsolationLevel value. + /// + /// The transaction isolation level for this connection. + /// Open a connection. + public void BeginTransaction(bool openConnection, IsolationLevel isolationLevel) + { + BeginTransaction(DataSource.ConnectionString, openConnection, isolationLevel); + } + + /// + /// Begins a transaction on the current connection + /// with the specified IsolationLevel value. + /// + /// The transaction isolation level for this connection. + /// The connection string + /// Open a connection. + public void BeginTransaction(string connectionString, bool openConnection, IsolationLevel isolationLevel) + { + if (openConnection) + { + BeginTransaction(connectionString, isolationLevel); + } + else + { + if (_connection == null || _connection.State != ConnectionState.Open) throw new DataMapperException("SqlMapSession could not invoke StartTransaction(). A Connection must be started. Call OpenConnection() first."); + _transaction = _connection.BeginTransaction(isolationLevel); + if (_logger.IsDebugEnabled) _logger.Debug("Begin Transaction."); + IsTransactionStart = true; + } + } + + /// + /// Commits the database transaction. + /// + /// + /// Will close the connection. + /// + public void CommitTransaction() + { + if (_logger.IsDebugEnabled) _logger.Debug("Commit Transaction."); + _transaction.Commit(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + + if (_connection.State != ConnectionState.Closed) CloseConnection(); + } + + /// + /// Commits the database transaction. + /// + /// Close the connection + public void CommitTransaction(bool closeConnection) + { + if (closeConnection) + { + CommitTransaction(); + } + else + { + if (_logger.IsDebugEnabled) _logger.Debug("Commit Transaction."); + _transaction.Commit(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + } + } + + /// + /// Rolls back a transaction from a pending state. + /// + /// + /// Will close the connection. + /// + public void RollBackTransaction() + { + if (_logger.IsDebugEnabled) _logger.Debug("RollBack Transaction."); + _transaction.Rollback(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + if (_connection.State != ConnectionState.Closed) CloseConnection(); + } + + /// + /// Rolls back a transaction from a pending state. + /// + /// Close the connection + public void RollBackTransaction(bool closeConnection) + { + if (closeConnection) + { + RollBackTransaction(); + } + else + { + if (_logger.IsDebugEnabled) _logger.Debug("RollBack Transaction."); + _transaction.Rollback(); + _transaction.Dispose(); + _transaction = null; + IsTransactionStart = false; + } + } + + /// + /// Create a command object + /// + /// + /// + public IDbCommand CreateCommand(CommandType commandType) + { + var command = _connection.CreateCommand(); //_dataSource.DbProvider.CreateCommand(); + command.CommandTimeout = DataSource.DbProvider.DbCommandTimeout; + command.CommandType = commandType; + //command.Connection = _connection; + + // Assign transaction + if (_transaction != null) + try + { + command.Transaction = _transaction; + } + catch { } + + // Assign connection timeout + if (_connection != null) + try // MySql provider doesn't suppport it ! + { + command.CommandTimeout = _connection.ConnectionTimeout; + } + catch (NotSupportedException e) + { + if (_logger.IsInfoEnabled) _logger.Info(e.Message); + } + + // if (_logger.IsDebugEnabled) +// { +// command = IDbCommandProxy.NewInstance(command); +// } + + return command; + } + + /// + /// Create an IDataParameter + /// + /// An IDataParameter. + public IDbDataParameter CreateDataParameter() + { + return DataSource.DbProvider.CreateDataParameter(); + } + + /// + /// + /// + public IDbDataAdapter CreateDataAdapter() + { + return DataSource.DbProvider.CreateDataAdapter(); + } + + /// + /// + /// + /// + public IDbDataAdapter CreateDataAdapter(IDbCommand command) + { + IDbDataAdapter dataAdapter = null; + + dataAdapter = DataSource.DbProvider.CreateDataAdapter(); + dataAdapter.SelectCommand = command; + + return dataAdapter; + } + #endregion + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/SqlMapper.cs b/ORBatisFramework/SqlMapper.cs new file mode 100644 index 0000000..a9b6349 --- /dev/null +++ b/ORBatisFramework/SqlMapper.cs @@ -0,0 +1,1118 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 591621 $ + * $LastChangedDate: 2007-11-03 07:44:57 -0600 (Sat, 03 Nov 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.Specialized; +using System.Data; +using System.Text; +using IBatisNet.Common; +using IBatisNet.Common.Utilities; +using IBatisNet.Common.Utilities.Objects; +using IBatisNet.Common.Utilities.Objects.Members; +using IBatisNet.DataMapper.Configuration.Cache; +using IBatisNet.DataMapper.Configuration.ParameterMapping; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.DataExchange; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.MappedStatements; +using IBatisNet.DataMapper.TypeHandlers; + +//using IBatisNet.DataMapper.SessionStore; +#endregion + +namespace IBatisNet.DataMapper +{ + /// + /// Summary description for SqlMap. + /// + public class SqlMapper : ISqlMapper + { + #region Constructor (s) / Destructor + /// + /// Initializes a new instance of the class. + /// + /// The object factory. + /// The accessor factory. + public SqlMapper(IObjectFactory objectFactory, + AccessorFactory accessorFactory) + { + TypeHandlerFactory = new TypeHandlerFactory(); + DBHelperParameterCache = new DBHelperParameterCache(); + _objectFactory = objectFactory; + AccessorFactory = accessorFactory; + + DataExchangeFactory = new DataExchangeFactory(TypeHandlerFactory, _objectFactory, accessorFactory); + Id = HashCodeProvider.GetIdentityHashCode(this).ToString(); + //_sessionStore = SessionStoreFactory.GetSessionStore(_id); + } + #endregion + + #region QueryForDataTable + /// + /// Executes the SQL and retuns all rows selected. + ///

+ ///

+ /// Name of the statement. + /// The parameter object. + /// + public DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var dataTable = new DataTable(statementName); + var request = statement.Statement.Sql.GetRequestScope(statement, parameterObject, session); + statement.PreparedCommand.Create(request, session, statement.Statement, parameterObject); + + using (request.IDbCommand) + { + dataTable.Load(request.IDbCommand.ExecuteReader()); + } + + + return dataTable; + } + #endregion + #region QueryForPaginatedList + /// + /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to + /// automatically scroll through results from a database table. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL + /// The maximum number of objects to store in each page + /// A PaginatedList of beans containing the rows + [Obsolete("This method will be remove in future version.", false)] + public PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + return new PaginatedList(statement, parameterObject, pageSize, session); + } + #endregion + + + /// + /// Creates a new SqlMapSession that will be used to query the data source. + /// + /// A new session + public ISqlMapSession CreateSqlMapSession() + { + ISqlMapSession session = new SqlMapSession(this); + session.CreateConnection(); + + return session; + } + + + /// + /// Creates the SQL map session. + /// + /// The connection string. + /// A new session + public ISqlMapSession CreateSqlMapSession(string connectionString) + { + ISqlMapSession session = new SqlMapSession(this); + session.CreateConnection(connectionString); + + return session; + } + + #region Fields + //(MappedStatement Name, MappedStatement) + //(ResultMap name, ResultMap) + //(ParameterMap name, ParameterMap) + // DataSource + //(CacheModel name, cache)) + private readonly HybridDictionary _cacheMaps = new HybridDictionary(); + + // An identifiant + + /// + /// Container session unique for each thread. + /// + //private ISessionStore _sessionStore = null; + private readonly IObjectFactory _objectFactory; + #endregion + + #region Properties + /// + /// Name used to identify the the + /// + public string Id { get; } = string.Empty; + + /// + /// Allow to set a custom session store like the + /// + /// Set it after the configuration and before use of the + /// + /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); + /// + //public ISessionStore SessionStore + //{ + // set { _sessionStore = value; } + //} + + /// + /// Returns the DalSession instance + /// currently being used by the SqlMap. + /// + //public ISqlMapSession LocalSession + //{ + // get { return _sessionStore.LocalSession; } + //} + + // /// + // /// Gets a value indicating whether this instance is session started. + // /// + // /// + // /// true if this instance is session started; otherwise, false. + // /// + //public bool IsSessionStarted + //{ + // get { return (_sessionStore.LocalSession != null); } + //} + + /// + /// Gets the DB helper parameter cache. + /// + /// The DB helper parameter cache. + public DBHelperParameterCache DBHelperParameterCache { get; } + + /// + /// Factory for DataExchange objects + /// + public DataExchangeFactory DataExchangeFactory { get; } + + /// + /// The TypeHandlerFactory + /// + public TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The meta factory for object factory + /// + public IObjectFactory ObjectFactory => _objectFactory; + + /// + /// The factory which build + /// + public AccessorFactory AccessorFactory { get; } + + /// + /// A flag that determines whether cache models were enabled + /// when this SqlMap was built. + /// + public bool IsCacheModelsEnabled { set; get; } + #endregion + + #region Methods + #region Manage Connection, Transaction + ///// + ///// Open a connection + ///// + ///// + //public ISqlMapSession OpenConnection() + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // return session; + //} + + ///// + ///// Open a connection, on the specified connection string. + ///// + ///// The connection string + //public ISqlMapSession OpenConnection(string connectionString) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // return session; + //} + + ///// + ///// Open a connection + ///// + //public void CloseConnection() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CloseConnection(). No connection was started. Call OpenConnection() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CloseConnection(); + // } + // catch(Exception ex) + // { + // throw new DataMapperException("SqlMapper could not CloseConnection(). Cause :"+ex.Message, ex); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + + ///// + ///// Begins a database transaction. + ///// + //public ISqlMapSession BeginTransaction() + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // session.BeginTransaction(); + // return session ; + //} + + ///// + ///// Open a connection and begin a transaction on the specified connection string. + ///// + ///// The connection string + //public ISqlMapSession BeginTransaction(string connectionString) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // session.BeginTransaction( connectionString ); + // return session ; + //} + + ///// + ///// Begins a database transaction on the currect session + ///// + ///// Open a connection. + //public ISqlMapSession BeginTransaction(bool openConnection) + //{ + // ISqlMapSession session = null; + + // if (openConnection) + // { + // session = this.BeginTransaction(); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(openConnection); + // } + + // return session; + //} + + ///// + ///// Begins a database transaction with the specified isolation level. + ///// + ///// + ///// The isolation level under which the transaction should run. + ///// + //public ISqlMapSession BeginTransaction(IsolationLevel isolationLevel) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // session.BeginTransaction(isolationLevel); + // return session; + //} + + ///// + ///// Open a connection and begin a transaction on the specified connection string. + ///// + ///// The connection string + ///// The transaction isolation level for this connection. + //public ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // session.BeginTransaction( connectionString, isolationLevel); + // return session; + //} + + ///// + ///// Start a database transaction on the current session + ///// with the specified isolation level. + ///// + ///// Open a connection. + ///// + ///// The isolation level under which the transaction should run. + ///// + //public ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel) + //{ + // ISqlMapSession session = null; + + // if (openNewConnection) + // { + // session = this.BeginTransaction(isolationLevel); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(openNewConnection, isolationLevel); + // } + // return session; + //} + + ///// + ///// Begins a transaction on the current connection + ///// with the specified IsolationLevel value. + ///// + ///// The transaction isolation level for this connection. + ///// The connection string + ///// Open a connection. + //public ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel) + //{ + // ISqlMapSession session = null; + + // if (openNewConnection) + // { + // session = this.BeginTransaction(connectionString, isolationLevel); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(connectionString, openNewConnection, isolationLevel); + // } + // return session; + //} + + ///// + ///// Commits the database transaction. + ///// + ///// + ///// Will close the connection. + ///// + //public void CommitTransaction() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CommitTransaction(); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + ///// + ///// Commits the database transaction. + ///// + ///// Close the connection + //public void CommitTransaction(bool closeConnection) + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CommitTransaction(closeConnection); + // } + // finally + // { + // if (closeConnection) + // { + // _sessionStore.Dispose(); + // } + // } + //} + + ///// + ///// Rolls back a transaction from a pending state. + ///// + ///// + ///// Will close the connection. + ///// + //public void RollBackTransaction() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.RollBackTransaction(); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + ///// + ///// Rolls back a transaction from a pending state. + ///// + ///// Close the connection + //public void RollBackTransaction(bool closeConnection) + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.RollBackTransaction(closeConnection); + // } + // finally + // { + // if (closeConnection) + // { + // _sessionStore.Dispose(); + // } + // } + //} + #endregion + + #region QueryForObject + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + public object QueryForObject(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject); + return result; + } + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + public object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject, resultObject); + + return result; + } + #endregion + #endregion + #region QueryForObject .NET 2.0 + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + public T QueryForObject(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject); + + return result; + } + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + public T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject, instanceObject); + + return result; + } + #endregion + + #region QueryForMap, QueryForDictionary + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, session); + } + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, valueProperty, session); + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, null, session); + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForMap(session, parameterObject, keyProperty, valueProperty); + + return map; + } + #endregion + + #region QueryForList + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject); + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + + return list; + } + + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + /// A List of result objects. + public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + statement.ExecuteQueryForList(session, parameterObject, resultObject); + } + #endregion + + #region QueryForList .NET 2.0 + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty); + + + return map; + } + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary of object containing the rows keyed by keyProperty. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForDictionary(statementName, parameterObject, keyProperty, null); + } + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method> + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty, rowDelegate); + + + return map; + } + + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject); + + return list; + } + + /// + /// Executes the SQL and retuns all rows selected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + + return list; + } + + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + statement.ExecuteQueryForList(session, parameterObject, resultObject); + } + #endregion + + #region QueryWithRowDelegate + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + + return list; + } + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + + return list; + } + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

+ /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

+ /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForMapWithRowDelegate(session, parameterObject, keyProperty, valueProperty, rowDelegate); + + return map; + } + #endregion + + #region Query Insert, Update, Delete + /// + /// Executes a Sql INSERT statement. + /// Insert is a bit different from other update methods, as it + /// provides facilities for returning the primary key of the + /// newly inserted row (rather than the effected rows). This + /// functionality is of course optional. + ///

+ /// The parameter object is generally used to supply the input + /// data for the INSERT values. + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// + /// The primary key of the newly inserted row. + /// This might be automatically generated by the RDBMS, + /// or selected from a sequence table or other source. + /// + public object Insert(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var generatedKey = statement.ExecuteInsert(session, parameterObject); + + return generatedKey; + } + + /// + /// Executes a Sql UPDATE statement. + /// Update can also be used for any other update statement type, + /// such as inserts and deletes. Update returns the number of + /// rows effected. + ///

+ /// The parameter object is generally used to supply the input + /// data for the UPDATE values as well as the WHERE clause parameter(s). + ///

+ /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + public int Update(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var rows = statement.ExecuteUpdate(session, parameterObject); + + return rows; + } + + /// + /// Executes a Sql DELETE statement. + /// Delete returns the number of rows effected. + /// + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + public int Delete(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var rows = statement.ExecuteUpdate(session, parameterObject); + + return rows; + } + #endregion + + #region Get/Add ParemeterMap, ResultMap, MappedStatement, TypeAlias, DataSource, CacheModel + /// + /// Gets a MappedStatement by name + /// + /// The id of the statement + /// The MappedStatement + public IMappedStatement GetMappedStatement(string id) + { + if (MappedStatements.Contains(id) == false) throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); + return (IMappedStatement)MappedStatements[id]; + } + + /// + /// Adds a (named) MappedStatement. + /// + /// The key name + /// The statement to add + public void AddMappedStatement(string key, IMappedStatement mappedStatement) + { + if (MappedStatements.Contains(key)) throw new DataMapperException("This SQL map already contains a MappedStatement named " + mappedStatement.Id); + MappedStatements.Add(key, mappedStatement); + } + + /// + /// The MappedStatements collection + /// + public HybridDictionary MappedStatements { get; } = new HybridDictionary(); + + /// + /// Get a ParameterMap by name + /// + /// The name of the ParameterMap + /// The ParameterMap + public ParameterMap GetParameterMap(string name) + { + if (!ParameterMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an ParameterMap named " + name + ". "); + return (ParameterMap)ParameterMaps[name]; + } + + /// + /// Adds a (named) ParameterMap. + /// + /// the ParameterMap to add + public void AddParameterMap(ParameterMap parameterMap) + { + if (ParameterMaps.Contains(parameterMap.Id)) throw new DataMapperException("This SQL map already contains an ParameterMap named " + parameterMap.Id); + ParameterMaps.Add(parameterMap.Id, parameterMap); + } + + /// + /// Gets a ResultMap by name + /// + /// The name of the result map + /// The ResultMap + public IResultMap GetResultMap(string name) + { + if (ResultMaps.Contains(name) == false) throw new DataMapperException("This SQL map does not contain an ResultMap named " + name); + return (ResultMap)ResultMaps[name]; + } + + /// + /// Adds a (named) ResultMap + /// + /// The ResultMap to add + public void AddResultMap(IResultMap resultMap) + { + if (ResultMaps.Contains(resultMap.Id)) throw new DataMapperException("This SQL map already contains an ResultMap named " + resultMap.Id); + ResultMaps.Add(resultMap.Id, resultMap); + } + + /// + /// The ParameterMap collection + /// + public HybridDictionary ParameterMaps { get; } = new HybridDictionary(); + + /// + /// The ResultMap collection + /// + public HybridDictionary ResultMaps { get; } = new HybridDictionary(); + + /// + /// The DataSource + /// + public IDataSource DataSource { get; set; } + + /// + /// Flushes all cached objects that belong to this SqlMap + /// + public void FlushCaches() + { + var enumerator = _cacheMaps.GetEnumerator(); + while (enumerator.MoveNext()) ((CacheModel)enumerator.Value).Flush(); + } + + /// + /// Adds a (named) cache. + /// + /// The cache to add + public void AddCache(CacheModel cache) + { + if (_cacheMaps.Contains(cache.Id)) throw new DataMapperException("This SQL map already contains an Cache named " + cache.Id); + _cacheMaps.Add(cache.Id, cache); + } + + /// + /// Gets a cache by name + /// + /// The name of the cache to get + /// The cache object + public CacheModel GetCache(string name) + { + if (!_cacheMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an Cache named " + name); + return (CacheModel)_cacheMaps[name]; + } + + /// + /// + /// + public string GetDataCacheStats() + { + var buffer = new StringBuilder(); + buffer.Append(Environment.NewLine); + buffer.Append("Cache Data Statistics"); + buffer.Append(Environment.NewLine); + buffer.Append("====================="); + buffer.Append(Environment.NewLine); + + var enumerator = MappedStatements.GetEnumerator(); + while (enumerator.MoveNext()) + { + var mappedStatement = (IMappedStatement)enumerator.Value; + + buffer.Append(mappedStatement.Id); + buffer.Append(": "); + + if (mappedStatement is CachingStatement) + { + var hitRatio = ((CachingStatement)mappedStatement).GetDataCacheHitRatio(); + if (hitRatio != -1) + { + buffer.Append(Math.Round(hitRatio * 100)); + buffer.Append("%"); + } + else + { + // this statement has a cache but it hasn't been accessed yet + // buffer.Append("Cache has not been accessed."); ??? + buffer.Append("No Cache."); + } + } + else + { + buffer.Append("No Cache."); + } + + buffer.Append(Environment.NewLine); + } + + return buffer.ToString(); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/AnsiStringTypeHandler.cs b/ORBatisFramework/TypeHandlers/AnsiStringTypeHandler.cs new file mode 100644 index 0000000..2da94ed --- /dev/null +++ b/ORBatisFramework/TypeHandlers/AnsiStringTypeHandler.cs @@ -0,0 +1,111 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 474910 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// TypeHandler for AnsiString dbType + /// + public class AnsiStringTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + dataParameter.DbType = DbType.AnsiString; + base.SetParameter(dataParameter, parameterValue, dbType); + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/BaseTypeHandler.cs b/ORBatisFramework/TypeHandlers/BaseTypeHandler.cs new file mode 100644 index 0000000..0783d6a --- /dev/null +++ b/ORBatisFramework/TypeHandlers/BaseTypeHandler.cs @@ -0,0 +1,114 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 595821 $ + * $LastChangedDate: 2007-11-16 14:00:04 -0700 (Fri, 16 Nov 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Summary description for BaseTypeHandler. + /// + public abstract class BaseTypeHandler : ITypeHandler + { + /// + /// Gets a column value by the name + /// + /// + /// + /// + public abstract object GetValueByName(ResultProperty mapping, IDataReader dataReader); + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public abstract object GetValueByIndex(ResultProperty mapping, IDataReader dataReader); + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public abstract object GetDataBaseValue(object outputValue, Type parameterType); + + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public abstract bool IsSimpleType { get; } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public abstract object ValueOf(Type type, string s); + + /// + /// The null value for this type + /// + public virtual object NullValue => null; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public virtual void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + if (parameterValue != null) + dataParameter.Value = parameterValue; + else + // When sending a null parameter value to the server, + // the user must specify DBNull, not null. + dataParameter.Value = DBNull.Value; + } + + /// + /// Compares two values (that this handler deals with) for equality + /// + /// one of the objects + /// the other object as a String + /// true if they are equal + public virtual bool Equals(object obj, string str) + { + if (obj == null || str == null) return (string)obj == str; + + var castedObject = ValueOf(obj.GetType(), str); + return obj.Equals(castedObject); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/BooleanTypeHandler.cs b/ORBatisFramework/TypeHandlers/BooleanTypeHandler.cs new file mode 100644 index 0000000..69d86eb --- /dev/null +++ b/ORBatisFramework/TypeHandlers/BooleanTypeHandler.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Boolean TypeHandler. + /// + public sealed class BooleanTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToBoolean(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToBoolean(dataReader.GetValue(mapping.ColumnIndex)); + } + + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToBoolean(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToBoolean(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("BooleanTypeHandler could not cast a null value in bool field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/ByteArrayTypeHandler.cs b/ORBatisFramework/TypeHandlers/ByteArrayTypeHandler.cs new file mode 100644 index 0000000..570fe5b --- /dev/null +++ b/ORBatisFramework/TypeHandlers/ByteArrayTypeHandler.cs @@ -0,0 +1,125 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 652259 $ + * $LastChangedDate: 2008-04-29 22:53:42 -0600 (Tue, 29 Apr 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region using +using System; +using System.Data; +using System.Text; +using IBatisNet.DataMapper.Configuration.ResultMapping; +using IBatisNet.DataMapper.Exceptions; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de ByteArrayTypeHandler. + /// + public sealed class ByteArrayTypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index) || dataReader.GetBytes(index, 0, null, 0, 0) == 0) return DBNull.Value; + + return GetValueByIndex(index, dataReader); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex) || dataReader.GetBytes(mapping.ColumnIndex, 0, null, 0, 0) == 0) return DBNull.Value; + + return GetValueByIndex(mapping.ColumnIndex, dataReader); + } + + + /// + /// Gets the index of the value by. + /// + /// Index of the column. + /// The data reader. + /// + private byte[] GetValueByIndex(int columnIndex, IDataReader dataReader) + { + // determine the buffer size + var bufferLength = (int)dataReader.GetBytes(columnIndex, 0, null, 0, 0); + + // initialize it + var byteArray = new byte[bufferLength]; + + // fill it + dataReader.GetBytes(columnIndex, 0, byteArray, 0, bufferLength); + + return byteArray; + } + + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Encoding.Default.GetBytes(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + throw new DataMapperException("NotSupportedException"); + } + + //public override object NullValue + //{ + // get { return null; } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/ByteTypeHandler.cs b/ORBatisFramework/TypeHandlers/ByteTypeHandler.cs new file mode 100644 index 0000000..62d0637 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/ByteTypeHandler.cs @@ -0,0 +1,108 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 697594 $ + * $LastChangedDate: 2008-09-21 13:27:05 -0600 (Sun, 21 Sep 2008) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de ByteTypeHandler. + /// + public sealed class ByteTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToByte(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToByte(outputValue); + } + + /// + /// The null value for this type + /// + /// + //public override object NullValue + //{ + // get { throw new InvalidCastException("ByteTypeHandler, could not cast a null value in byte field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/CharTypeHandler.cs b/ORBatisFramework/TypeHandlers/CharTypeHandler.cs new file mode 100644 index 0000000..c27a02f --- /dev/null +++ b/ORBatisFramework/TypeHandlers/CharTypeHandler.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de CharTypeHandler. + /// + public sealed class CharTypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index)[0]; + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex)[0]; + //GetChar(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToChar(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToChar(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("CharTypeHandler, could not cast a null value in char field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/CustomTypeHandler.cs b/ORBatisFramework/TypeHandlers/CustomTypeHandler.cs new file mode 100644 index 0000000..77ec58b --- /dev/null +++ b/ORBatisFramework/TypeHandlers/CustomTypeHandler.cs @@ -0,0 +1,137 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Custom type handler for adding a TypeHandlerCallback + /// + public sealed class CustomTypeHandler : BaseTypeHandler + { + private readonly ITypeHandlerCallback _callback; + + /// + /// Initializes a new instance of the class. + /// + /// The callback. + public CustomTypeHandler(ITypeHandlerCallback callback) + { + _callback = callback; + } + + /// + /// Gets or sets the callback. + /// + /// The callback. + public ITypeHandlerCallback Callback + { + get => _callback; + set + { + /* nop */ + } + } + + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// The null value for this type + /// + /// + public override object NullValue => _callback.NullValue; + + /// + /// Performs processing on a value before it is used to set + /// the parameter of a IDbCommand. + /// + /// + /// The value to be set + /// Data base type + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + IParameterSetter setter = new ParameterSetterImpl(dataParameter); + _callback.SetParameter(setter, parameterValue); + } + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + IResultGetter getter = new ResultGetterImpl(dataReader, mapping.ColumnName); + return _callback.GetResult(getter); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + IResultGetter getter = new ResultGetterImpl(dataReader, mapping.ColumnIndex); + return _callback.GetResult(getter); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return _callback.ValueOf(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + IResultGetter getter = new ResultGetterImpl(outputValue); + return _callback.GetResult(getter); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/DBNullTypeHandler.cs b/ORBatisFramework/TypeHandlers/DBNullTypeHandler.cs new file mode 100644 index 0000000..6469f5f --- /dev/null +++ b/ORBatisFramework/TypeHandlers/DBNullTypeHandler.cs @@ -0,0 +1,107 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (dim., 19 f�vr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// DBNull TypeHandler. + /// + public sealed class DBNullTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => false; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + return DBNull.Value; + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + return DBNull.Value; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return DBNull.Value; + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return DBNull.Value; + } + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + dataParameter.Value = DBNull.Value; + } + + //public override object NullValue + //{ + // get { return null; } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/DateTimeTypeHandler.cs b/ORBatisFramework/TypeHandlers/DateTimeTypeHandler.cs new file mode 100644 index 0000000..759389d --- /dev/null +++ b/ORBatisFramework/TypeHandlers/DateTimeTypeHandler.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de DateTimeTypeHandler. + /// + public sealed class DateTimeTypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDateTime(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDateTime(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDateTime(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDateTime(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("DateTimeTypeHandler could not cast a null value in DateTime field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/DecimalTypeHandler.cs b/ORBatisFramework/TypeHandlers/DecimalTypeHandler.cs new file mode 100644 index 0000000..ceead9c --- /dev/null +++ b/ORBatisFramework/TypeHandlers/DecimalTypeHandler.cs @@ -0,0 +1,107 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using System.Globalization; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// DecimalTypeHandler. + /// + public sealed class DecimalTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDecimal(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDecimal(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + /// + /// value decimal must be in format ######.## + /// where . is separator for decimal + /// + public override object ValueOf(Type type, string s) + { + var culture = new CultureInfo("en-US"); + return decimal.Parse(s, culture); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDecimal(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("DecimalTypeHandler could not cast a null value in decimal field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/DoubleTypeHandler.cs b/ORBatisFramework/TypeHandlers/DoubleTypeHandler.cs new file mode 100644 index 0000000..ffe96ef --- /dev/null +++ b/ORBatisFramework/TypeHandlers/DoubleTypeHandler.cs @@ -0,0 +1,102 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de Double. + /// + public sealed class DoubleTypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDouble(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDouble(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDouble(s); + } + + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDouble(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("DoubleTypeHandler, could not cast a null value in double field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/EnumTypeHandler.cs b/ORBatisFramework/TypeHandlers/EnumTypeHandler.cs new file mode 100644 index 0000000..cda5f7c --- /dev/null +++ b/ORBatisFramework/TypeHandlers/EnumTypeHandler.cs @@ -0,0 +1,118 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 575902 $ + * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Summary description for EnumTypeHandler. + /// + public sealed class EnumTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + if (parameterValue != null) + dataParameter.Value = Convert.ChangeType(parameterValue, Enum.GetUnderlyingType(parameterValue.GetType())); + else + // When sending a null parameter value to the server, + // the user must specify DBNull, not null. + dataParameter.Value = DBNull.Value; + } + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Enum.Parse(mapping.MemberType, dataReader.GetValue(index).ToString()); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Enum.Parse(mapping.MemberType, dataReader.GetValue(mapping.ColumnIndex).ToString()); + } + + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Enum.Parse(type, s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Enum.Parse(parameterType, outputValue.ToString()); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("EnumTypeHandler, could not cast a null value in Enum field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/GuidTypeHandler.cs b/ORBatisFramework/TypeHandlers/GuidTypeHandler.cs new file mode 100644 index 0000000..1db8c39 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/GuidTypeHandler.cs @@ -0,0 +1,101 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de GuidTypeHandler. + /// + public sealed class GuidTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return new Guid(dataReader.GetGuid(index).ToString()); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return new Guid(dataReader.GetValue(mapping.ColumnIndex).ToString()); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return new Guid(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new Guid(outputValue.ToString()); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("GuidTypeHandler could not cast a null value in Guid field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/IParameterSetter.cs b/ORBatisFramework/TypeHandlers/IParameterSetter.cs new file mode 100644 index 0000000..b3e20a5 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/IParameterSetter.cs @@ -0,0 +1,53 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Allows parameters to be set on the underlying prepared IDbCommand. + /// TypeHandlerCallback implementations use this interface to + /// process values before they are set on the IDbCommand. + /// + /// + /// There is no need to implement this. The implementation + /// will be passed into the TypeHandlerCallback automatically. + /// + public interface IParameterSetter + { + /// + /// Returns the underlying IDataParameter + /// + IDataParameter DataParameter { get; } + + /// + /// Get the parameter value + /// + object Value { set; } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/IResultGetter.cs b/ORBatisFramework/TypeHandlers/IResultGetter.cs new file mode 100644 index 0000000..58608f1 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/IResultGetter.cs @@ -0,0 +1,55 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 638571 $ + * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Allows values to be retrieved from the underlying IDataReader. + /// TypeHandlerCallback implementations use this interface to + /// get values that they can subsequently manipulate before + /// having them returned. * or index with these + /// methods. + /// + /// + /// There is no need to implement this. The implementation + /// will be passed into the TypeHandlerCallback automatically. + /// + public interface IResultGetter + { + /// + /// Returns the underlying IDataReader + /// + IDataReader DataReader { get; } + + /// + /// Get the parameter value + /// + object Value { get; } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/ITypeHandler.cs b/ORBatisFramework/TypeHandlers/ITypeHandler.cs new file mode 100644 index 0000000..00630aa --- /dev/null +++ b/ORBatisFramework/TypeHandlers/ITypeHandler.cs @@ -0,0 +1,97 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 389819 $ + * $LastChangedDate: 2006-03-29 09:15:54 -0700 (Wed, 29 Mar 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Summary description for ITypeHandler. + /// + public interface ITypeHandler + { + /// + /// + /// + bool IsSimpleType { get; } + + /// + /// The null value for this type + /// + object NullValue { get; } + + /// + /// Gets a column value by the name + /// + /// + /// + /// + object GetValueByName(ResultProperty mapping, IDataReader dataReader); + + /// + /// Gets a column value by the index + /// + /// + /// + /// + object GetValueByIndex(ResultProperty mapping, IDataReader dataReader); + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + object GetDataBaseValue(object outputValue, Type parameterType); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType); + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + object ValueOf(Type type, string s); + + /// + /// Compares two values (that this handler deals with) for equality + /// + /// one of the objects + /// the other object as a String + /// true if they are equal + bool Equals(object obj, string str); + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/ITypeHandlerCallback.cs b/ORBatisFramework/TypeHandlers/ITypeHandlerCallback.cs new file mode 100644 index 0000000..1252be0 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/ITypeHandlerCallback.cs @@ -0,0 +1,79 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 383115 $ + * $LastChangedDate: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// A simple interface for implementing custom type handlers. + ///

+ /// Using this interface, you can implement a type handler that + /// will perform customized processing before parameters are set + /// on a IDbCommand and after values are retrieved from + /// a IDataReader. Using a custom type handler you can extend + /// the framework to handle types that are not supported, or + /// handle supported types in a different way. For example, + /// you might use a custom type handler to implement proprietary + /// BLOB support (e.g. Oracle), or you might use it to handle + /// booleans using "Y" and "N" instead of the more typical 0/1. + ///

+ public interface ITypeHandlerCallback + { + /// + /// The null value for this type + /// + object NullValue { get; } + + /// + /// Performs processing on a value before it is used to set + /// the parameter of a IDbCommand. + /// + /// The interface for setting the value on the IDbCommand. + /// The value to be set + void SetParameter(IParameterSetter setter, object parameter); + + + /// + /// Performs processing on a value before after it has been retrieved + /// from a IDataReader. + /// + /// The interface for getting the value from the IDataReader. + /// The processed value. + object GetResult(IResultGetter getter); + + + /// + /// Casts the string representation of a value into a type recognized by + /// this type handler. This method is used to translate nullValue values + /// into types that can be appropriately compared. If your custom type handler + /// cannot support nullValues, or if there is no reasonable string representation + /// for this type (e.g. File type), you can simply return the String representation + /// as it was passed in. It is not recommended to return null, unless null was passed + /// in. + /// + /// + /// + object ValueOf(string s); + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Int16TypeHandler.cs b/ORBatisFramework/TypeHandlers/Int16TypeHandler.cs new file mode 100644 index 0000000..788b1b0 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Int16TypeHandler.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de Int16TypeHandler. + /// + public sealed class Int16TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToInt16(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int16TypeHandler could not cast a null value in int16 field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Int32TypeHandler.cs b/ORBatisFramework/TypeHandlers/Int32TypeHandler.cs new file mode 100644 index 0000000..b1163ad --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Int32TypeHandler.cs @@ -0,0 +1,105 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Summary description for Int32TypeHandler. + /// + public sealed class Int32TypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToInt32(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int32TypeHandler could not cast a null value in int32 field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Int64TypeHandler.cs b/ORBatisFramework/TypeHandlers/Int64TypeHandler.cs new file mode 100644 index 0000000..6f03db0 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Int64TypeHandler.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de Int64TypeHandler. + /// + public sealed class Int64TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToInt64(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int64TypeHandler could not cast a null value in int64 field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs new file mode 100644 index 0000000..851fe46 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs @@ -0,0 +1,122 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable Boolean Type + /// + public sealed class NullableBooleanTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new bool?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (bool?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToBoolean(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToBoolean(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToBoolean(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToBoolean(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableByteTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableByteTypeHandler.cs new file mode 100644 index 0000000..6161d83 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableByteTypeHandler.cs @@ -0,0 +1,121 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable Byte Type + /// + public sealed class NullableByteTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new byte?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (byte?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToByte(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToByte(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableCharTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableCharTypeHandler.cs new file mode 100644 index 0000000..9c9f106 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableCharTypeHandler.cs @@ -0,0 +1,121 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable char Type + /// + public sealed class NullableCharTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new char?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (char?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index)[0]; + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex)[0]; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToChar(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToChar(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs new file mode 100644 index 0000000..259c7ee --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs @@ -0,0 +1,119 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// + /// System.TimeSpan is map to DbType.Int64 + public sealed class NullableDateTimeTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new DateTime?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (DateTime?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDateTime(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDateTime(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDateTime(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDateTime(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs new file mode 100644 index 0000000..804d5a6 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs @@ -0,0 +1,127 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using System.Globalization; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable decimal Type + /// + public class NullableDecimalTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new decimal?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public sealed override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (decimal?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDecimal(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDecimal(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToChar(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + /// + /// value decimal must be in format ######.## + /// where . is separator for decimal + /// + public override object ValueOf(Type type, string s) + { + var culture = new CultureInfo("en-US"); + return decimal.Parse(s, culture); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs new file mode 100644 index 0000000..da5211f --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs @@ -0,0 +1,121 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable double Type + /// + public sealed class NullableDoubleTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new double?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (double?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetDouble(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetDouble(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToDouble(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToDouble(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableGuidTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableGuidTypeHandler.cs new file mode 100644 index 0000000..aaa3e99 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableGuidTypeHandler.cs @@ -0,0 +1,120 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable Guid type + /// + public sealed class NullableGuidTypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new Guid?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (Guid?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetGuid(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetGuid(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new Guid(outputValue.ToString()); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return new Guid(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableInt16TypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableInt16TypeHandler.cs new file mode 100644 index 0000000..ea94947 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableInt16TypeHandler.cs @@ -0,0 +1,129 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable UInt16 Type + /// + public sealed class NullableInt16TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new short?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (short?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return short.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int16? xTyped = (Int16?)x; + // return xTyped.Equals(y); + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableInt32TypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableInt32TypeHandler.cs new file mode 100644 index 0000000..382d80e --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableInt32TypeHandler.cs @@ -0,0 +1,127 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable Int32 Type + /// + public sealed class NullableInt32TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new int?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (int?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + /// + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return int.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int32? xTyped = (Int32?)x; + // return xTyped.Equals(y); + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableInt64TypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableInt64TypeHandler.cs new file mode 100644 index 0000000..29318d6 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableInt64TypeHandler.cs @@ -0,0 +1,128 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable Int64 Type + /// + public sealed class NullableInt64TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new long?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (long?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value + /// + /// ouput database value + /// type used + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return long.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int64? xTyped = (Int64?)x; + // return xTyped.Equals(y); + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableSByteTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableSByteTypeHandler.cs new file mode 100644 index 0000000..b5debce --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableSByteTypeHandler.cs @@ -0,0 +1,122 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for SByte TimeSpan Type + /// + public sealed class NullableSByteTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new sbyte?(); + + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (byte?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSByte(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSByte(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableSingleTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableSingleTypeHandler.cs new file mode 100644 index 0000000..b98a7d7 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableSingleTypeHandler.cs @@ -0,0 +1,120 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable Single type + /// + public sealed class NullableSingleTypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new float?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (float?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetFloat(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetFloat(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSingle(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSingle(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs new file mode 100644 index 0000000..2ddd5d3 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs @@ -0,0 +1,121 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable TimeSpan Type + /// + public sealed class NullableTimeSpanTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// The null value for this type + /// + /// + public override object NullValue => new TimeSpan?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (TimeSpan?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value.Ticks; //nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(index))); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex))); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new TimeSpan(Convert.ToInt64(outputValue)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return TimeSpan.Parse(s); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs new file mode 100644 index 0000000..09a3c77 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs @@ -0,0 +1,128 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable Int16 type + /// + public sealed class NullableUInt16TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new ushort?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (ushort?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return ushort.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int16? xTyped = (Int16?)x; + // return xTyped.Equals(y); + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs new file mode 100644 index 0000000..dea361c --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs @@ -0,0 +1,128 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// Summary description for Int32TypeHandler. + /// + public sealed class NullableUInt32TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new uint?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (uint?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return uint.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int32? xTyped = (Int32?)x; + // return xTyped.Equals(y); + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs b/ORBatisFramework/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs new file mode 100644 index 0000000..80274f9 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs @@ -0,0 +1,128 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 378879 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers.Nullables +{ + /// + /// TypeHandler for Nullable UInt64 Type + /// + public sealed class NullableUInt64TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// The null value for this type + /// + /// + public override object NullValue => new ulong?(); + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + var nullableValue = (ulong?)parameterValue; + + if (nullableValue.HasValue) + dataParameter.Value = nullableValue.Value; + else + dataParameter.Value = DBNull.Value; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return ulong.Parse(s); + } + + //public override bool Equals(object x, object y) + //{ + // //get boxed values. + // Int64? xTyped = (Int64?)x; + // return xTyped.Equals(y); + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/ObjectTypeHandler.cs b/ORBatisFramework/TypeHandlers/ObjectTypeHandler.cs new file mode 100644 index 0000000..f9797ee --- /dev/null +++ b/ORBatisFramework/TypeHandlers/ObjectTypeHandler.cs @@ -0,0 +1,101 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de ObjectTypeHandler. + /// + public sealed class ObjectTypeHandler : BaseTypeHandler + { + /// + /// Tell us if ot is a 'primitive' type + /// + /// + /// + public override bool IsSimpleType => false; + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetValue(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetValue(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + //public override object NullValue + //{ + // get { return null; } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/ParameterSetterImpl.cs b/ORBatisFramework/TypeHandlers/ParameterSetterImpl.cs new file mode 100644 index 0000000..07a8289 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/ParameterSetterImpl.cs @@ -0,0 +1,63 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// A ParameterSetter implementation + /// + public sealed class ParameterSetterImpl : IParameterSetter + { + #region Constructor + /// + /// Default Constructor + /// + /// + public ParameterSetterImpl(IDataParameter dataParameter) + { + DataParameter = dataParameter; + } + #endregion + + #region IParameterSetter members + /// + /// Returns the underlying DataParameter + /// + public IDataParameter DataParameter { get; } + + /// + /// Set the parameter value + /// + public object Value + { + set => DataParameter.Value = value; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/ResultGetterImpl.cs b/ORBatisFramework/TypeHandlers/ResultGetterImpl.cs new file mode 100644 index 0000000..8392acc --- /dev/null +++ b/ORBatisFramework/TypeHandlers/ResultGetterImpl.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System.Data; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de ResultGetterImpl. + /// + public sealed class ResultGetterImpl : IResultGetter + { + #region Fields + private readonly int _columnIndex = int.MinValue; + private readonly string _columnName = string.Empty; + private readonly object _outputValue; + #endregion + + #region Constructors + /// + /// Creates an instance for a IDataReader and column index + /// + /// The dataReader + /// the column index + public ResultGetterImpl(IDataReader dataReader, int columnIndex) + { + _columnIndex = columnIndex; + DataReader = dataReader; + } + + /// + /// Creates an instance for a IDataReader and column name + /// + /// The dataReader + /// the column name + public ResultGetterImpl(IDataReader dataReader, string columnName) + { + _columnName = columnName; + DataReader = dataReader; + } + + /// + /// Creates an instance for an output parameter + /// + /// value of an output parameter (store procedure) + public ResultGetterImpl(object outputValue) + { + _outputValue = outputValue; + } + #endregion + + #region IResultGetter members + /// + /// Returns the underlying IDataReader + /// + /// Null for an output parameter + public IDataReader DataReader { get; } + + /// + /// Get the parameter value + /// + public object Value + { + get + { + if (_columnName.Length > 0) + { + var index = DataReader.GetOrdinal(_columnName); + return DataReader.GetValue(index); + } + + if (_columnIndex >= 0) return DataReader.GetValue(_columnIndex); + + return _outputValue; + } + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/SByteTypeHandler.cs b/ORBatisFramework/TypeHandlers/SByteTypeHandler.cs new file mode 100644 index 0000000..8ce671e --- /dev/null +++ b/ORBatisFramework/TypeHandlers/SByteTypeHandler.cs @@ -0,0 +1,104 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// SByteTypeHandler. + /// + public sealed class SByteTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// The null value for this type + /// + /// + public override object NullValue => throw new InvalidCastException("SByteTypeHandler, could not cast a null value in sbyte field."); + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToSByte(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSByte(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSByte(outputValue); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/SingleTypeHandler.cs b/ORBatisFramework/TypeHandlers/SingleTypeHandler.cs new file mode 100644 index 0000000..2d57d2e --- /dev/null +++ b/ORBatisFramework/TypeHandlers/SingleTypeHandler.cs @@ -0,0 +1,104 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de SingleTypeHandler. + /// + public sealed class SingleTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetFloat(index); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetFloat(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToSingle(s); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToSingle(outputValue); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("SingleTypeHandler could not cast a null value in single field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/StringTypeHandler.cs b/ORBatisFramework/TypeHandlers/StringTypeHandler.cs new file mode 100644 index 0000000..b6a93a7 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/StringTypeHandler.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 476843 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de SByteTypeHandler. + /// + public sealed class StringTypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetString(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetString(mapping.ColumnIndex); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } + + //public override object NullValue + //{ + // get { return null; } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/TimeSpanTypeHandler.cs b/ORBatisFramework/TypeHandlers/TimeSpanTypeHandler.cs new file mode 100644 index 0000000..444a63e --- /dev/null +++ b/ORBatisFramework/TypeHandlers/TimeSpanTypeHandler.cs @@ -0,0 +1,112 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 474910 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Description r�sum�e de TimespanTypeHandler. + /// + public sealed class TimeSpanTypeHandler : BaseTypeHandler + { + /// + /// + /// + public override bool IsSimpleType => true; + + /// + /// Sets a parameter on a IDbCommand + /// + /// the parameter + /// the parameter value + /// the dbType of the parameter + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + dataParameter.Value = ((TimeSpan)parameterValue).Ticks; + } + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(index))); + } + + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return new TimeSpan(Convert.ToInt64(dataReader.GetValue(mapping.ColumnIndex))); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return new TimeSpan(Convert.ToInt64(outputValue)); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return TimeSpan.Parse(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("TimeSpanTypeHandler could not cast a null value in TimeSpan field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/TypeHandlerFactory.cs b/ORBatisFramework/TypeHandlers/TypeHandlerFactory.cs new file mode 100644 index 0000000..8e3c85e --- /dev/null +++ b/ORBatisFramework/TypeHandlers/TypeHandlerFactory.cs @@ -0,0 +1,360 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 501527 $ + * $Date: 2007-01-30 12:32:11 -0700 (Tue, 30 Jan 2007) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Utilities; +using IBatisNet.DataMapper.Configuration.Alias; +using IBatisNet.DataMapper.Exceptions; +using IBatisNet.DataMapper.TypeHandlers.Nullables; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Not much of a suprise, this is a factory class for TypeHandler objects. + /// + public class TypeHandlerFactory + { + #region Constructor + /// + /// Constructor + /// + public TypeHandlerFactory() + { + ITypeHandler handler = null; + + handler = new DBNullTypeHandler(); + Register(typeof(DBNull), handler); + + handler = new BooleanTypeHandler(); + Register(typeof(bool), handler); // key= "System.Boolean" + + handler = new ByteTypeHandler(); + Register(typeof(byte), handler); + + handler = new CharTypeHandler(); + Register(typeof(char), handler); + + handler = new DateTimeTypeHandler(); + Register(typeof(DateTime), handler); + + handler = new DecimalTypeHandler(); + Register(typeof(decimal), handler); + + handler = new DoubleTypeHandler(); + Register(typeof(double), handler); + + handler = new Int16TypeHandler(); + Register(typeof(short), handler); + + handler = new Int32TypeHandler(); + Register(typeof(int), handler); + + handler = new Int64TypeHandler(); + Register(typeof(long), handler); + + handler = new SingleTypeHandler(); + Register(typeof(float), handler); + + handler = new StringTypeHandler(); + Register(typeof(string), handler); + + handler = new GuidTypeHandler(); + Register(typeof(Guid), handler); + + handler = new TimeSpanTypeHandler(); + Register(typeof(TimeSpan), handler); + + handler = new ByteArrayTypeHandler(); + Register(typeof(byte[]), handler); + + handler = new ObjectTypeHandler(); + Register(typeof(object), handler); + + handler = new EnumTypeHandler(); + Register(typeof(Enum), handler); + + handler = new UInt16TypeHandler(); + Register(typeof(ushort), handler); + + handler = new UInt32TypeHandler(); + Register(typeof(uint), handler); + + handler = new UInt64TypeHandler(); + Register(typeof(ulong), handler); + + handler = new SByteTypeHandler(); + Register(typeof(sbyte), handler); + + handler = new NullableBooleanTypeHandler(); + Register(typeof(bool?), handler); + + handler = new NullableByteTypeHandler(); + Register(typeof(byte?), handler); + + handler = new NullableCharTypeHandler(); + Register(typeof(char?), handler); + + handler = new NullableDateTimeTypeHandler(); + Register(typeof(DateTime?), handler); + + handler = new NullableDecimalTypeHandler(); + Register(typeof(decimal?), handler); + + handler = new NullableDoubleTypeHandler(); + Register(typeof(double?), handler); + + handler = new NullableGuidTypeHandler(); + Register(typeof(Guid?), handler); + + handler = new NullableInt16TypeHandler(); + Register(typeof(short?), handler); + + handler = new NullableInt32TypeHandler(); + Register(typeof(int?), handler); + + handler = new NullableInt64TypeHandler(); + Register(typeof(long?), handler); + + handler = new NullableSingleTypeHandler(); + Register(typeof(float?), handler); + + handler = new NullableUInt16TypeHandler(); + Register(typeof(ushort?), handler); + + handler = new NullableUInt32TypeHandler(); + Register(typeof(uint?), handler); + + handler = new NullableUInt64TypeHandler(); + Register(typeof(ulong?), handler); + + handler = new NullableSByteTypeHandler(); + Register(typeof(sbyte?), handler); + + handler = new NullableTimeSpanTypeHandler(); + Register(typeof(TimeSpan?), handler); + + _unknownTypeHandler = new UnknownTypeHandler(this); + } + #endregion + + /// + /// Gets a named TypeAlias from the list of available TypeAlias + /// + /// The name of the TypeAlias. + /// The TypeAlias. + internal TypeAlias GetTypeAlias(string name) + { + if (_typeAliasMaps.Contains(name)) return (TypeAlias)_typeAliasMaps[name]; + + return null; + } + + /// + /// Gets the type object from the specific class name. + /// + /// The supplied class name. + /// + /// The correpsonding type. + /// + internal Type GetType(string className) + { + Type type = null; + var typeAlias = GetTypeAlias(className); + + if (typeAlias != null) + type = typeAlias.Class; + else + type = TypeUtils.ResolveType(className); + + return type; + } + + /// + /// Adds a named TypeAlias to the list of available TypeAlias. + /// + /// The key name. + /// The TypeAlias. + internal void AddTypeAlias(string key, TypeAlias typeAlias) + { + if (_typeAliasMaps.Contains(key)) throw new DataMapperException(" Alias name conflict occurred. The type alias '" + key + "' is already mapped to the value '" + typeAlias.ClassName + "'."); + _typeAliasMaps.Add(key, typeAlias); + } + + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IDictionary _typeHandlerMap = new HybridDictionary(); + private readonly ITypeHandler _unknownTypeHandler; + + private const string NULL = "_NULL_TYPE_"; + + //(typeAlias name, type alias) + private readonly IDictionary _typeAliasMaps = new HybridDictionary(); + #endregion + + #region Methods + /// + /// Get a TypeHandler for a Type + /// + /// the Type you want a TypeHandler for + /// the handler + public ITypeHandler GetTypeHandler(Type type) + { + return GetTypeHandler(type, null); + } + + /// + /// Get a TypeHandler for a type + /// + /// the type you want a TypeHandler for + /// the database type + /// the handler + public ITypeHandler GetTypeHandler(Type type, string dbType) + { + if (type.IsEnum) return GetPrivateTypeHandler(typeof(Enum), dbType); + + return GetPrivateTypeHandler(type, dbType); + } + + /// + /// Get a TypeHandler for a type and a dbType type + /// + /// the type + /// the dbType type + /// the handler + private ITypeHandler GetPrivateTypeHandler(Type type, string dbType) + { + var dbTypeHandlerMap = (IDictionary)_typeHandlerMap[type]; + ITypeHandler handler = null; + + if (dbTypeHandlerMap != null) + { + if (dbType == null) + { + handler = (ITypeHandler)dbTypeHandlerMap[NULL]; + } + else + { + handler = (ITypeHandler)dbTypeHandlerMap[dbType]; + if (handler == null) handler = (ITypeHandler)dbTypeHandlerMap[NULL]; + } + + if (handler == null) throw new DataMapperException(string.Format("Type handler for {0} not registered.", type.Name)); + } + + return handler; + } + + + /// + /// Register (add) a type handler for a type + /// + /// the type + /// the handler instance + public void Register(Type type, ITypeHandler handler) + { + Register(type, null, handler); + } + + /// + /// Register (add) a type handler for a type and dbType + /// + /// the type + /// the dbType (optional, if dbType is null the handler will be used for all dbTypes) + /// the handler instance + public void Register(Type type, string dbType, ITypeHandler handler) + { + var map = (HybridDictionary)_typeHandlerMap[type]; + if (map == null) + { + map = new HybridDictionary(); + _typeHandlerMap.Add(type, map); + } + + if (dbType == null) + { + if (_logger.IsInfoEnabled) + { + // notify the user that they are no longer using one of the built-in type handlers + var oldTypeHandler = (ITypeHandler)map[NULL]; + + if (oldTypeHandler != null) + { + // the replacement will always(?) be a CustomTypeHandler + var customTypeHandler = handler as CustomTypeHandler; + + var replacement = string.Empty; + + if (customTypeHandler != null) + // report the underlying type + replacement = customTypeHandler.Callback.ToString(); + else + replacement = handler.ToString(); + + // should oldTypeHandler be checked if its a CustomTypeHandler and if so report the Callback property ??? + _logger.Info("Replacing type handler [" + oldTypeHandler + "] with [" + replacement + "]."); + } + } + + map[NULL] = handler; + } + else + { + map.Add(dbType, handler); + } + } + + /// + /// When in doubt, get the "unknown" type handler + /// + /// if I told you, it would not be unknown, would it? + public ITypeHandler GetUnkownTypeHandler() + { + return _unknownTypeHandler; + } + + /// + /// + /// + /// + public bool IsSimpleType(Type type) + { + var result = false; + if (type != null) + { + var handler = GetTypeHandler(type, null); + if (handler != null) result = handler.IsSimpleType; + } + + return result; + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/UInt16TypeHandler.cs b/ORBatisFramework/TypeHandlers/UInt16TypeHandler.cs new file mode 100644 index 0000000..68eef27 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/UInt16TypeHandler.cs @@ -0,0 +1,105 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// TypeHandler for UInt16 Type + /// + public sealed class UInt16TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToUInt16(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + // Don't used dataReader.GetInt32 to fix oracle who alwray return decimal type + return Convert.ToUInt16(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt16(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToUInt16(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int16TypeHandler could not cast a null value in int16 field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/UInt32TypeHandler.cs b/ORBatisFramework/TypeHandlers/UInt32TypeHandler.cs new file mode 100644 index 0000000..7eae1bc --- /dev/null +++ b/ORBatisFramework/TypeHandlers/UInt32TypeHandler.cs @@ -0,0 +1,103 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// UInt32TypeHandler + /// + public sealed class UInt32TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt32(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt32(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToUInt32(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int32TypeHandler could not cast a null value in int32 field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/UInt64TypeHandler.cs b/ORBatisFramework/TypeHandlers/UInt64TypeHandler.cs new file mode 100644 index 0000000..3f60b88 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/UInt64TypeHandler.cs @@ -0,0 +1,104 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408164 $ + * $LastChangedDate: 2006-11-14 11:33:12 -0700 (Tue, 14 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Summary description for UInt64TypeHandler. + /// + public sealed class UInt64TypeHandler : BaseTypeHandler + { + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(index)); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return Convert.ToUInt64(dataReader.GetValue(mapping.ColumnIndex)); + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return Convert.ToUInt64(outputValue); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return Convert.ToUInt64(s); + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("Int64TypeHandler could not cast a null value in int64 field."); } + //} + } +} \ No newline at end of file diff --git a/ORBatisFramework/TypeHandlers/UnknownTypeHandler.cs b/ORBatisFramework/TypeHandlers/UnknownTypeHandler.cs new file mode 100644 index 0000000..1fed972 --- /dev/null +++ b/ORBatisFramework/TypeHandlers/UnknownTypeHandler.cs @@ -0,0 +1,151 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 595821 $ + * $LastChangedDate: 2007-11-16 14:00:04 -0700 (Fri, 16 Nov 2007) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Data; +using IBatisNet.DataMapper.Configuration.ResultMapping; +#endregion + +namespace IBatisNet.DataMapper.TypeHandlers +{ + /// + /// Implementation of TypeHandler for dealing with unknown types + /// + public sealed class UnknownTypeHandler : BaseTypeHandler + { + private readonly TypeHandlerFactory _factory; + + /// + /// Constructor to create via a factory + /// + /// the factory to associate this with + public UnknownTypeHandler(TypeHandlerFactory factory) + { + _factory = factory; + } + + + /// + /// Gets a value indicating whether this instance is simple type. + /// + /// + /// true if this instance is simple type; otherwise, false. + /// + public override bool IsSimpleType => true; + + /// + /// Performs processing on a value before it is used to set + /// the parameter of a IDbCommand. + /// + /// + /// The value to be set + /// Data base type + public override void SetParameter(IDataParameter dataParameter, object parameterValue, string dbType) + { + if (parameterValue != null) + { + var handler = _factory.GetTypeHandler(parameterValue.GetType(), dbType); + handler.SetParameter(dataParameter, parameterValue, dbType); + } + else + { + // When sending a null parameter value to the server, + // the user must specify DBNull, not null. + dataParameter.Value = DBNull.Value; + } + } + + /// + /// Gets a column value by the name + /// + /// + /// + /// + public override object GetValueByName(ResultProperty mapping, IDataReader dataReader) + { + var index = dataReader.GetOrdinal(mapping.ColumnName); + + if (dataReader.IsDBNull(index)) return DBNull.Value; + + return dataReader.GetValue(index); + } + + /// + /// Gets a column value by the index + /// + /// + /// + /// + public override object GetValueByIndex(ResultProperty mapping, IDataReader dataReader) + { + if (dataReader.IsDBNull(mapping.ColumnIndex)) return DBNull.Value; + + return dataReader.GetValue(mapping.ColumnIndex); + } + + /// + /// Converts the String to the type that this handler deals with + /// + /// the tyepe of the property (used only for enum conversion) + /// the String value + /// the converted value + public override object ValueOf(Type type, string s) + { + return s; + } + + /// + /// Retrieve ouput database value of an output parameter + /// + /// ouput database value + /// type used in EnumTypeHandler + /// + public override object GetDataBaseValue(object outputValue, Type parameterType) + { + return outputValue; + } + + //public override object NullValue + //{ + // get { throw new InvalidCastException("UnknownTypeHandler could not cast a null value in unknown type field."); } + //} + + /// + /// Compares two values (that this handler deals with) for equality + /// + /// one of the objects + /// the other object as a String + /// true if they are equal + public override bool Equals(object obj, string str) + { + if (obj == null || str == null) return (string)obj == str; + + var handler = _factory.GetTypeHandler(obj.GetType()); + var castedObject = handler.ValueOf(obj.GetType(), str); + return obj.Equals(castedObject); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/ConfigWatcherHandler.cs b/ORBatisFramework/Utilities/ConfigWatcherHandler.cs new file mode 100644 index 0000000..fd3a87b --- /dev/null +++ b/ORBatisFramework/Utilities/ConfigWatcherHandler.cs @@ -0,0 +1,211 @@ +#region Apache Notice +/***************************************************************************** + * $Header: $ + * $Revision: 452570 $ + * $Date: 2006-10-03 11:00:01 -0600 (Tue, 03 Oct 2006) $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2004 - Gilles Bayon + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System.Collections; +using System.IO; +using System.Reflection; +using System.Threading; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities +{ + /// + /// Represents the method that handles calls from Configure. + /// + /// + /// obj is a null object in a DaoManager context. + /// obj is the reconfigured sqlMap in a SqlMap context. + /// + public delegate void ConfigureHandler(object obj); + + /// + /// + public struct StateConfig + { + /// + /// Master Config File name. + /// + public string FileName; + + /// + /// Delegate called when a file is changed, use it to rebuild. + /// + public ConfigureHandler ConfigureHandler; + } + + /// + /// Class used to watch config files. + /// + /// + /// Uses the to monitor + /// changes to a specified file. Because multiple change notifications + /// may be raised when the file is modified, a timer is used to + /// compress the notifications into a single event. The timer + /// waits for the specified time before delivering + /// the event notification. If any further + /// change notifications arrive while the timer is waiting it + /// is reset and waits again for the specified time to + /// elapse. + /// + public sealed class ConfigWatcherHandler + { + #region Constructor (s) / Destructor + /// + /// - + /// + /// + /// Represent the call context of the SqlMap or DaoManager ConfigureAndWatch method call. + /// + /// + public ConfigWatcherHandler(TimerCallback onWhatchedFileChange, StateConfig state) + { + for (var index = 0; index < _filesToWatch.Count; index++) + { + var configFile = (FileInfo)_filesToWatch[index]; + + AttachWatcher(configFile); + + // Create the timer that will be used to deliver events. Set as disabled + // callback : A TimerCallback delegate representing a method to be executed. + // state : An object containing information to be used by the callback method, or a null reference + // dueTime : The amount of time to delay before callback is invoked, in milliseconds. Specify Timeout.Infinite to prevent the timer from starting. Specify zero (0) to start the timer immediately + // period : The time interval between invocations of callback, in milliseconds. Specify Timeout.Infinite to disable periodic signaling + _timer = new Timer(onWhatchedFileChange, state, Timeout.Infinite, Timeout.Infinite); + } + } + #endregion + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + /// + /// The timer used to compress the notification events. + /// + private readonly Timer _timer; + + /// + /// A list of configuration files to watch. + /// + private static readonly ArrayList _filesToWatch = new ArrayList(); + + /// + /// The list of FileSystemWatcher. + /// + private static readonly ArrayList _filesWatcher = new ArrayList(); + + /// + /// The default amount of time to wait after receiving notification + /// before reloading the config file. + /// + private const int TIMEOUT_MILLISECONDS = 500; + #endregion + + #region Methods + private void AttachWatcher(FileInfo configFile) + { + // Create a new FileSystemWatcher and set its properties. + var watcher = new FileSystemWatcher(); + + watcher.Path = configFile.DirectoryName; + watcher.Filter = configFile.Name; + + // Set the notification filters + watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.FileName; + + // Add event handlers. OnChanged will do for all event handlers that fire a FileSystemEventArgs + watcher.Changed += ConfigWatcherHandler_OnChanged; + watcher.Created += ConfigWatcherHandler_OnChanged; + watcher.Deleted += ConfigWatcherHandler_OnChanged; + watcher.Renamed += ConfigWatcherHandler_OnRenamed; + + // Begin watching. + watcher.EnableRaisingEvents = true; + + _filesWatcher.Add(watcher); + } + + /// + /// Add a file to be monitored. + /// + /// + public static void AddFileToWatch(FileInfo configFile) + { + if (_logger.IsDebugEnabled) + // TODO: remove Path.GetFileName? + _logger.Debug("Adding file [" + Path.GetFileName(configFile.FullName) + "] to list of watched files."); + + _filesToWatch.Add(configFile); + } + + /// + /// Reset the list of files being monitored. + /// + public static void ClearFilesMonitored() + { + _filesToWatch.Clear(); + + // Kill all FileSystemWatcher + for (var index = 0; index < _filesWatcher.Count; index++) + { + var fileWatcher = (FileSystemWatcher)_filesWatcher[index]; + + fileWatcher.EnableRaisingEvents = false; + fileWatcher.Dispose(); + } + } + + /// + /// Event handler used by . + /// + /// The firing the event. + /// The argument indicates the file that caused the event to be fired. + /// + /// This handler reloads the configuration from the file when the event is fired. + /// + private void ConfigWatcherHandler_OnChanged(object source, FileSystemEventArgs e) + { + if (_logger.IsDebugEnabled) _logger.Debug("ConfigWatcherHandler : " + e.ChangeType + " [" + e.Name + "]"); + + // timer will fire only once + _timer.Change(TIMEOUT_MILLISECONDS, Timeout.Infinite); + } + + /// + /// Event handler used by . + /// + /// The firing the event. + /// The argument indicates the file that caused the event to be fired. + /// + /// This handler reloads the configuration from the file when the event is fired. + /// + private void ConfigWatcherHandler_OnRenamed(object source, RenamedEventArgs e) + { + if (_logger.IsDebugEnabled) _logger.Debug("ConfigWatcherHandler : " + e.ChangeType + " [" + e.OldName + "/" + e.Name + "]"); + + // timer will fire only once + _timer.Change(TIMEOUT_MILLISECONDS, Timeout.Infinite); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/DelegateFactory.cs b/ORBatisFramework/Utilities/Objects/DelegateFactory.cs new file mode 100644 index 0000000..b048f10 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/DelegateFactory.cs @@ -0,0 +1,122 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A implementation that builds object via DynamicMethod. + /// + public sealed class DelegateFactory : IFactory + { + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + private readonly Create _create; + + /// + /// Initializes a new instance of the class. + /// + /// The instance type to create. + /// The types argument. + public DelegateFactory(Type typeToCreate, Type[] argumentTypes) + { + var dynamicMethod = new DynamicMethod("CreateImplementation", typeof(object), new[] { typeof(object[]) }, GetType().Module, false); + var generatorIL = dynamicMethod.GetILGenerator(); + + // Emit the IL for Create method. + // Add test if contructeur not public + var constructorInfo = typeToCreate.GetConstructor(VISIBILITY, null, argumentTypes, null); + if (constructorInfo == null || !constructorInfo.IsPublic) + throw new ProbeException( + string.Format("Unable to optimize create instance. Cause : Could not find public constructor matching specified arguments for type \"{0}\".", typeToCreate.Name)); + // new typeToCreate() or new typeToCreate(... arguments ...) + EmitArgsIL(generatorIL, argumentTypes); + generatorIL.Emit(OpCodes.Newobj, constructorInfo); + generatorIL.Emit(OpCodes.Ret); + + _create = (Create)dynamicMethod.CreateDelegate(typeof(Create)); + } + + #region IFactory members + /// + /// Create a new instance with the specified parameters + /// + /// + /// An array of values that matches the number, order and type + /// of the parameters for this constructor. + /// + /// + /// If you call a constructor with no parameters, pass null. + /// Anyway, what you pass will be ignore. + /// + /// A new instance + public object CreateInstance(object[] parameters) + { + return _create(parameters); + } + #endregion + + /// + /// Emit parameter IL for a method call. + /// + /// IL generator. + /// Arguments type defined for a the constructor. + private void EmitArgsIL(ILGenerator il, Type[] argumentTypes) + { + // Add args. Since all args are objects, value types are unboxed. + // Refs to value types are to be converted to values themselves. + for (var i = 0; i < argumentTypes.Length; i++) + { + // Push args array reference on the stack , followed by the index. + // Ldelem will resolve them to args[i]. + il.Emit(OpCodes.Ldarg_0); // Argument 1 is argument array. + il.Emit(OpCodes.Ldc_I4, i); + il.Emit(OpCodes.Ldelem_Ref); + + // If param is a primitive/value type then we need to unbox it. + var paramType = argumentTypes[i]; + if (paramType.IsValueType) + { + if (paramType.IsPrimitive || paramType.IsEnum) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(BoxingOpCodes.GetOpCode(paramType)); + } + else if (paramType.IsValueType) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(OpCodes.Ldobj, paramType); + } + } + } + } + + private delegate object Create(object[] parameters); + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/DelegateObjectFactory.cs b/ORBatisFramework/Utilities/Objects/DelegateObjectFactory.cs new file mode 100644 index 0000000..dbb0775 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/DelegateObjectFactory.cs @@ -0,0 +1,100 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Text; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A implementation that can create objects via DynamicMethod. + /// + public sealed class DelegateObjectFactory : IObjectFactory + { + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IDictionary _cachedfactories = new HybridDictionary(); + private readonly object _padlock = new object(); + + #region IObjectFactory members + /// + /// Create a new instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new see instance. + [MethodImpl(MethodImplOptions.Synchronized)] + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + var key = GenerateKey(typeToCreate, types); + + var factory = _cachedfactories[key] as IFactory; + if (factory == null) + lock (_padlock) + { + factory = _cachedfactories[key] as IFactory; + if (factory == null) // double-check + { + if (typeToCreate.IsAbstract) + { + if (_logger.IsInfoEnabled) _logger.Info("Create a stub IFactory for abstract type " + typeToCreate.Name); + factory = new AbstractFactory(typeToCreate); + } + else + { + factory = new DelegateFactory(typeToCreate, types); + } + + _cachedfactories[key] = factory; + } + } + + return factory; + } + + /// + /// Generates the key for a cache entry. + /// + /// The type instance to build. + /// The types of the constructor arguments + /// The key for a cache entry. + private string GenerateKey(Type typeToCreate, object[] arguments) + { + var cacheKey = new StringBuilder(); + cacheKey.Append(typeToCreate); + cacheKey.Append("."); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + cacheKey.Append(".").Append(arguments[i]); + + return cacheKey.ToString(); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/EmitObjectFactory.cs b/ORBatisFramework/Utilities/Objects/EmitObjectFactory.cs new file mode 100644 index 0000000..ea765d6 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/EmitObjectFactory.cs @@ -0,0 +1,95 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Text; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A implementation that can create objects via IL code + /// + public sealed class EmitObjectFactory : IObjectFactory + { + private readonly IDictionary _cachedfactories = new HybridDictionary(); + private readonly FactoryBuilder _factoryBuilder; + private readonly object _padlock = new object(); + + /// + /// Initializes a new instance of the class. + /// + public EmitObjectFactory() + { + _factoryBuilder = new FactoryBuilder(); + } + + #region IObjectFactory members + /// + /// Create a new instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new instance. + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + var key = GenerateKey(typeToCreate, types); + + var factory = _cachedfactories[key] as IFactory; + if (factory == null) + lock (_padlock) + { + factory = _cachedfactories[key] as IFactory; + if (factory == null) // double-check + { + factory = _factoryBuilder.CreateFactory(typeToCreate, types); + _cachedfactories[key] = factory; + } + } + + return factory; + } + + /// + /// Generates the key for a cache entry. + /// + /// The type instance to build. + /// The types of the constructor arguments + /// The key for a cache entry. + private string GenerateKey(Type typeToCreate, object[] arguments) + { + var cacheKey = new StringBuilder(); + cacheKey.Append(typeToCreate); + cacheKey.Append("."); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + cacheKey.Append(".").Append(arguments[i]); + + return cacheKey.ToString(); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/FactoryBuilder.cs b/ORBatisFramework/Utilities/Objects/FactoryBuilder.cs new file mode 100644 index 0000000..036b045 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/FactoryBuilder.cs @@ -0,0 +1,153 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// Build IFactory object via IL + /// + public class FactoryBuilder + { + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + private const MethodAttributes CREATE_METHOD_ATTRIBUTES = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final; + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private readonly ModuleBuilder _moduleBuilder; + + /// + /// constructor + /// + public FactoryBuilder() + { + var assemblyName = new AssemblyName(); + assemblyName.Name = "iBATIS.EmitFactory" + HashCodeProvider.GetIdentityHashCode(this); + + // Create a new assembly with one module + var _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); + } + + + /// + /// Create a factory which build class of type typeToCreate + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new instance. + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + if (typeToCreate.IsAbstract) + { + if (_logger.IsInfoEnabled) _logger.Info("Create a stub IFactory for abstract type " + typeToCreate.Name); + return new AbstractFactory(typeToCreate); + } + + var innerType = CreateFactoryType(typeToCreate, types); + var ctor = innerType.GetConstructor(Type.EmptyTypes); + return (IFactory)ctor.Invoke(new object[] { }); + } + + + /// + /// Creates a . + /// + /// The type instance to create. + /// The types. + /// The + private Type CreateFactoryType(Type typeToCreate, Type[] types) + { + var typesName = string.Empty; + for (var i = 0; i < types.Length; i++) typesName += types[i].Name.Replace("[]", string.Empty) + i; + var typeBuilder = _moduleBuilder.DefineType("EmitFactoryFor" + typeToCreate.FullName + typesName, TypeAttributes.Public); + typeBuilder.AddInterfaceImplementation(typeof(IFactory)); + ImplementCreateInstance(typeBuilder, typeToCreate, types); + return typeBuilder.CreateType(); + } + + /// + /// Implements the create instance. + /// + /// The type builder. + /// The type to create. + /// The argument types. + private void ImplementCreateInstance(TypeBuilder typeBuilder, Type typeToCreate, Type[] argumentTypes) + { + // object CreateInstance(object[] parameters); + var meth = typeBuilder.DefineMethod("CreateInstance", CREATE_METHOD_ATTRIBUTES, typeof(object), new[] { typeof(object[]) }); + var il = meth.GetILGenerator(); + + // Add test if contructeur not public + var ctor = typeToCreate.GetConstructor(VISIBILITY, null, argumentTypes, null); + if (ctor == null || !ctor.IsPublic) + throw new ProbeException( + string.Format("Unable to optimize create instance. Cause : Could not find public constructor matching specified arguments for type \"{0}\".", typeToCreate.Name)); + // new typeToCreate() or new typeToCreate(... arguments ...) + EmitArgsIL(il, argumentTypes); + il.Emit(OpCodes.Newobj, ctor); + il.Emit(OpCodes.Ret); + } + + /// + /// Emit parameter IL for a method call. + /// + /// IL generator. + /// Arguments type defined for a the constructor. + private void EmitArgsIL(ILGenerator il, Type[] argumentTypes) + { + // Add args. Since all args are objects, value types are unboxed. + // Refs to value types are to be converted to values themselves. + for (var i = 0; i < argumentTypes.Length; i++) + { + // Push args array reference on the stack , followed by the index. + // Ldelem will resolve them to args[i]. + il.Emit(OpCodes.Ldarg_1); // Argument 1 is argument array. + il.Emit(OpCodes.Ldc_I4, i); + il.Emit(OpCodes.Ldelem_Ref); + + // If param is a primitive/value type then we need to unbox it. + var paramType = argumentTypes[i]; + if (paramType.IsValueType) + { + if (paramType.IsPrimitive || paramType.IsEnum) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(BoxingOpCodes.GetOpCode(paramType)); + } + else if (paramType.IsValueType) + { + il.Emit(OpCodes.Unbox, paramType); + il.Emit(OpCodes.Ldobj, paramType); + } + } + } + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/FactoryLogAdapter.cs b/ORBatisFramework/Utilities/Objects/FactoryLogAdapter.cs new file mode 100644 index 0000000..034a586 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/FactoryLogAdapter.cs @@ -0,0 +1,123 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-11-09 11:44:07 -0700 (Thu, 09 Nov 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Text; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A wrapper arround an implementation which logs argument type and value + /// when CreateInstance is called. + /// + public class FactoryLogAdapter : IFactory + { + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IFactory _factory; + private readonly string _parametersTypeName = string.Empty; + private readonly string _typeName = string.Empty; + + /// + /// Initializes a new instance of the class. + /// + /// The type. + /// The paramters types. + /// The factory. + public FactoryLogAdapter(Type type, Type[] paramtersTypes, IFactory factory) + { + _factory = factory; + _typeName = type.FullName; + _parametersTypeName = GenerateParametersName(paramtersTypes); + } + + #region IFactory Members + /// + /// Create a new instance with the specified parameters + /// + /// + /// An array of values that matches the number, order and type + /// of the parameters for this constructor. + /// + /// A new instance + /// + /// If you call a constructor with no parameters, pass null. + /// Anyway, what you pass will be ignore. + /// + public object CreateInstance(object[] parameters) + { + object newObject = null; + + try + { + newObject = _factory.CreateInstance(parameters); + } + catch + { + _logger.Debug("Enabled to create instance for type '" + _typeName); + _logger.Debug(" using parameters type : " + _parametersTypeName); + _logger.Debug(" using parameters value : " + GenerateLogInfoForParameterValue(parameters)); + throw; + } + + return newObject; + } + #endregion + + /// + /// Generates the a string containing all parameter type names. + /// + /// The types of the constructor arguments + /// The string. + private string GenerateParametersName(object[] arguments) + { + var names = new StringBuilder(); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + names.Append("[").Append(arguments[i]).Append("] "); + + return names.ToString(); + } + + /// + /// Generates the a string containing all parameters value. + /// + /// The arguments + /// The string. + private string GenerateLogInfoForParameterValue(object[] arguments) + { + var values = new StringBuilder(); + if (arguments != null && arguments.Length != 0) + for (var i = 0; i < arguments.Length; i++) + if (arguments[i] != null) + values.Append("[").Append(arguments[i]).Append("] "); + else + values.Append("[null] "); + + return values.ToString(); + } + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/DelegateGetFieldAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/DelegateGetFieldAccessor.cs new file mode 100644 index 0000000..6eef22a --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/DelegateGetFieldAccessor.cs @@ -0,0 +1,118 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class defines a field get accessor and + /// provides Reflection.Emit-generated + /// via the new DynamicMethod (.NET V2). + /// + public sealed class DelegateFieldGetAccessor : BaseAccessor, IGetAccessor + { + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly GetValue _get; + + /// + /// Initializes a new instance of the class + /// for field get access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the field. + public DelegateFieldGetAccessor(Type targetObjectType, string fieldName) + { + // this.targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = targetObjectType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + nullInternal = GetNullInternal(_fieldType); + + var dynamicMethodGet = new DynamicMethod("GetImplementation", typeof(object), new[] { typeof(object) }, GetType().Module, false); + var ilgen = dynamicMethodGet.GetILGenerator(); + + // Emit the IL for get access. + + // We need a reference to the current instance (stored in local argument index 0) + // so Ldfld can load from the correct instance (this one). + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldfld, fieldInfo); + if (_fieldType.IsValueType) + // Now, we execute the box opcode, which pops the value of field 'x', + // returning a reference to the filed value boxed as an object. + ilgen.Emit(OpCodes.Box, fieldInfo.FieldType); + ilgen.Emit(OpCodes.Ret); + _get = (GetValue)dynamicMethodGet.CreateDelegate(typeof(GetValue)); + } + + #region IGet Members + /// + /// Gets the field value from the specified target. + /// + /// Target object. + /// Property value. + public object Get(object target) + { + return _get(target); + } + #endregion + + private delegate object GetValue(object instance); + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs new file mode 100644 index 0000000..b94279f --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs @@ -0,0 +1,126 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class defines a get property accessor and + /// provides Reflection.Emit-generated + /// via the new DynamicMethod (.NET V2). + /// + public sealed class DelegatePropertyGetAccessor : BaseAccessor, IGetAccessor + { + private readonly bool _canRead; + + private readonly GetValue _get; + + /// + /// The property type + /// + private readonly Type _propertyType; + + /// + /// Initializes a new instance of the class + /// for get property access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the property. + public DelegatePropertyGetAccessor(Type targetObjectType, string propertyName) + { + targetType = targetObjectType; + this.propertyName = propertyName; + + var propertyInfo = GetPropertyInfo(targetObjectType); + + if (propertyInfo == null) propertyInfo = targetType.GetProperty(propertyName); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, targetType)); + + _propertyType = propertyInfo.PropertyType; + _canRead = propertyInfo.CanRead; + + nullInternal = GetNullInternal(_propertyType); + + if (propertyInfo.CanRead) + { + var dynamicMethod = new DynamicMethod("GetImplementation", typeof(object), new[] { typeof(object) }, GetType().Module, true); + var ilgen = dynamicMethod.GetILGenerator(); + + // Emit the IL for get access. + var targetGetMethod = propertyInfo.GetGetMethod(); + + ilgen.DeclareLocal(typeof(object)); + ilgen.Emit(OpCodes.Ldarg_0); //Load the first argument,(target object) + ilgen.Emit(OpCodes.Castclass, targetObjectType); //Cast to the source type + ilgen.EmitCall(OpCodes.Callvirt, targetGetMethod, null); //Get the property value + if (targetGetMethod.ReturnType.IsValueType) ilgen.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box if necessary + ilgen.Emit(OpCodes.Stloc_0); //Store it + ilgen.Emit(OpCodes.Ldloc_0); + ilgen.Emit(OpCodes.Ret); + + _get = (GetValue)dynamicMethod.CreateDelegate(typeof(GetValue)); + } + } + + #region IGet Members + /// + /// Gets the field value from the specified target. + /// + /// Target object. + /// Property value. + public object Get(object target) + { + if (_canRead) return _get(target); + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a get method.", propertyName, targetType)); + } + #endregion + + private delegate object GetValue(object instance); + + #region IAccessor Members + /// + /// Gets the property's name. + /// + /// + public string Name => propertyName; + + /// + /// Gets the property's type. + /// + /// + public Type MemberType => _propertyType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/DelegatePropertySetAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/DelegatePropertySetAccessor.cs new file mode 100644 index 0000000..739c294 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/DelegatePropertySetAccessor.cs @@ -0,0 +1,151 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class defines a set property accessor and + /// provides Reflection.Emit-generated + /// via the new DynamicMethod (.NET V2). + /// + public sealed class DelegatePropertySetAccessor : BaseAccessor, ISetAccessor + { + private readonly bool _canWrite; + + /// + /// The property type + /// + private readonly Type _propertyType; + + private readonly SetValue _set; + + /// + /// Initializes a new instance of the class + /// for set property access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the property. + public DelegatePropertySetAccessor(Type targetObjectType, string propName) + { + targetType = targetObjectType; + propertyName = propName; + + var propertyInfo = GetPropertyInfo(targetObjectType); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, targetType)); + + _propertyType = propertyInfo.PropertyType; + _canWrite = propertyInfo.CanWrite; + + nullInternal = GetNullInternal(_propertyType); + + if (propertyInfo.CanWrite) + { + var dynamicMethod = new DynamicMethod("SetImplementation", null, new[] { typeof(object), typeof(object) }, GetType().Module, true); + var ilgen = dynamicMethod.GetILGenerator(); + + // Emit the IL for set access. + var targetSetMethod = propertyInfo.GetSetMethod(); + + var paramType = targetSetMethod.GetParameters()[0].ParameterType; + ilgen.DeclareLocal(paramType); + ilgen.Emit(OpCodes.Ldarg_0); //Load the first argument (target object) + ilgen.Emit(OpCodes.Castclass, targetType); //Cast to the source type + ilgen.Emit(OpCodes.Ldarg_1); //Load the second argument (value object) + if (paramType.IsValueType) + { + ilgen.Emit(OpCodes.Unbox, paramType); //Unbox it + if (typeToOpcode[paramType] != null) + { + var load = (OpCode)typeToOpcode[paramType]; + ilgen.Emit(load); //and load + } + else + { + ilgen.Emit(OpCodes.Ldobj, paramType); + } + } + else + { + ilgen.Emit(OpCodes.Castclass, paramType); //Cast class + } + + ilgen.EmitCall(OpCodes.Callvirt, targetSetMethod, null); //Set the property value + ilgen.Emit(OpCodes.Ret); + + _set = (SetValue)dynamicMethod.CreateDelegate(typeof(SetValue)); + } + } + + #region ISet Members + /// + /// Sets the field for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + if (_canWrite) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + + _set(target, newValue); + } + else + { + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a set method.", propertyName, targetType)); + } + } + #endregion + + private delegate void SetValue(object instance, object value); + + #region IAccessor Members + /// + /// Gets the property's name. + /// + /// + public string Name => propertyName; + + /// + /// Gets the property's type. + /// + /// + public Type MemberType => _propertyType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/DelegateSetFieldAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/DelegateSetFieldAccessor.cs new file mode 100644 index 0000000..e619936 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/DelegateSetFieldAccessor.cs @@ -0,0 +1,125 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class defines a field get accessor and + /// provides Reflection.Emit-generated + /// via the new DynamicMethod (.NET V2). + /// + public sealed class DelegateFieldSetAccessor : BaseAccessor, ISetAccessor + { + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly SetValue _set; + + /// + /// Initializes a new instance of the class + /// for field get access via DynamicMethod. + /// + /// Type of the target object. + /// Name of the field. + public DelegateFieldSetAccessor(Type targetObjectType, string fieldName) + { + // this.targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = targetObjectType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + nullInternal = GetNullInternal(_fieldType); + + // Emit the IL for set access. + var dynamicMethodSet = new DynamicMethod("SetImplementation", null, new[] { typeof(object), typeof(object) }, GetType().Module, false); + var ilgen = dynamicMethodSet.GetILGenerator(); + + ilgen = dynamicMethodSet.GetILGenerator(); + + ilgen.Emit(OpCodes.Ldarg_0); + ilgen.Emit(OpCodes.Ldarg_1); + UnboxIfNeeded(fieldInfo.FieldType, ilgen); + ilgen.Emit(OpCodes.Stfld, fieldInfo); + ilgen.Emit(OpCodes.Ret); + + _set = (SetValue)dynamicMethodSet.CreateDelegate(typeof(SetValue)); + } + + #region ISet Members + /// + /// Sets the field for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + _set(target, newValue); + } + #endregion + + private static void UnboxIfNeeded(Type type, ILGenerator generator) + { + if (type.IsValueType) generator.Emit(OpCodes.Unbox_Any, type); + } + + private delegate void SetValue(object instance, object value); + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/EmitFieldGetAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/EmitFieldGetAccessor.cs new file mode 100644 index 0000000..55e46fb --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/EmitFieldGetAccessor.cs @@ -0,0 +1,185 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an IL-based get access + /// to a field of a specified target class. + /// + /// Will Throw FieldAccessException on private field + public sealed class EmitFieldGetAccessor : BaseAccessor, IGetAccessor + { + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly Type _targetType; + + /// + /// The IL emitted IGet + /// + private IGet _emittedGet; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target object. + /// Name of the field. + /// The assembly builder. + /// The module builder. + public EmitFieldGetAccessor(Type targetObjectType, string fieldName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = _targetType.GetField(fieldName, VISIBILITY); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region IGet Members + /// + /// Gets the value stored in the field for the specified target. + /// + /// Object to retrieve the field from. + /// The value. + public object Get(object target) + { + return _emittedGet.Get(target); + } + #endregion + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedGet = assemblyBuilder.CreateInstance("GetFor" + _targetType.FullName + _fieldName) as IGet; + + nullInternal = GetNullInternal(_fieldType); + + if (_emittedGet == null) + throw new NotSupportedException( + string.Format("Unable to create a get field accessor for '{0}' field on class '{0}'.", _fieldName, _fieldType)); + } + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "GetFor.FullTagetTypeName.FieldName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("GetFor" + _targetType.FullName + _fieldName, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing IMemberAccessor. + typeBuilder.AddInterfaceImplementation(typeof(IGet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Get + // Define a method named "Get" for the get operation (IMemberAccessor). + var getParamTypes = new[] { typeof(object) }; + var getMethod = typeBuilder.DefineMethod("Get", + MethodAttributes.Public | MethodAttributes.Virtual, + typeof(object), + getParamTypes); + + // Get an ILGenerator and used it to emit the IL that we want. + var getIL = getMethod.GetILGenerator(); + + var targetField = _targetType.GetField(_fieldName, VISIBILITY); + + // Emit the IL for get access. + if (targetField != null) + { + // We need a reference to the current instance (stored in local argument index 1) + // so Ldfld can load from the correct instance (this one). + getIL.Emit(OpCodes.Ldarg_1); + getIL.Emit(OpCodes.Ldfld, targetField); + if (_fieldType.IsValueType) + // Now, we execute the box opcode, which pops the value of field 'x', + // returning a reference to the filed value boxed as an object. + getIL.Emit(OpCodes.Box, targetField.FieldType); + getIL.Emit(OpCodes.Ret); + } + else + { + getIL.ThrowException(typeof(MissingMethodException)); + } + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/EmitFieldSetAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/EmitFieldSetAccessor.cs new file mode 100644 index 0000000..b2a036f --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/EmitFieldSetAccessor.cs @@ -0,0 +1,204 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an IL-based set access + /// to a field of a specified target class. + /// + /// Will Throw FieldAccessException on private field + public sealed class EmitFieldSetAccessor : BaseAccessor, ISetAccessor + { + private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; + + /// + /// The field name + /// + private readonly string _fieldName = string.Empty; + + /// + /// The class parent type + /// + private readonly Type _fieldType; + + private readonly Type _targetType; + + /// + /// The IL emitted ISet + /// + private ISet _emittedSet; + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target object. + /// Name of the field. + /// The assembly builder. + /// The module builder. + public EmitFieldSetAccessor(Type targetObjectType, string fieldName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _fieldName = fieldName; + + var fieldInfo = _targetType.GetField(fieldName, VISIBILITY); + + // Make sure the field exists + if (fieldInfo == null) + throw new NotSupportedException( + string.Format("Field \"{0}\" does not exist for type " + + "{1}.", fieldName, targetObjectType)); + + _fieldType = fieldInfo.FieldType; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region ISet Members + /// + /// Sets the field for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + _emittedSet.Set(target, newValue); + } + #endregion + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedSet = assemblyBuilder.CreateInstance("SetFor" + _targetType.FullName + _fieldName) as ISet; + + nullInternal = GetNullInternal(_fieldType); + + if (_emittedSet == null) + throw new NotSupportedException( + string.Format("Unable to create a set field accessor for '{0}' field on class '{0}'.", _fieldName, _fieldType)); + } + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "SetFor.FullTargetTypeName.FieldName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("SetFor" + _targetType.FullName + _fieldName, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing ISet. + typeBuilder.AddInterfaceImplementation(typeof(ISet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Set + // Define a method named "Set" for the set operation (IMemberAccessor). + var setParamTypes = new[] { typeof(object), typeof(object) }; + var setMethod = typeBuilder.DefineMethod("Set", + MethodAttributes.Public | MethodAttributes.Virtual, + null, + setParamTypes); + + // Get an ILGenerator and used to emit the IL that we want. + var setIL = setMethod.GetILGenerator(); + + var targetField = _targetType.GetField(_fieldName, VISIBILITY); + + // Emit the IL for the set access. + if (targetField != null) + { + setIL.Emit(OpCodes.Ldarg_1); //Load the first argument (target object) + setIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type + setIL.Emit(OpCodes.Ldarg_2); //Load the second argument (value object) + if (_fieldType.IsValueType) + { + setIL.Emit(OpCodes.Unbox, _fieldType); //Unbox it + if (typeToOpcode[_fieldType] != null) + { + var load = (OpCode)typeToOpcode[_fieldType]; + setIL.Emit(load); //and load + } + else + { + setIL.Emit(OpCodes.Ldobj, _fieldType); + } + + setIL.Emit(OpCodes.Stfld, targetField); //Set the field value + } + else + { + // setIL.Emit(OpCodes.Castclass, _fieldType); //Cast class + setIL.Emit(OpCodes.Stfld, targetField); + } + } + else + { + setIL.ThrowException(typeof(MissingMethodException)); + } + + setIL.Emit(OpCodes.Ret); + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + #region IAccessor Members + /// + /// Gets the field's name. + /// + /// + public string Name => _fieldName; + + /// + /// Gets the field's type. + /// + /// + public Type MemberType => _fieldType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/EmitPropertyGetAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/EmitPropertyGetAccessor.cs new file mode 100644 index 0000000..9250e00 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/EmitPropertyGetAccessor.cs @@ -0,0 +1,193 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an IL-based get access + /// to a property of a specified target class. + /// + public sealed class EmitPropertyGetAccessor : BaseAccessor, IGetAccessor + { + private readonly bool _canRead; + + /// + /// The property name + /// + private readonly string _propertyName = string.Empty; + + /// + /// The property type + /// + private readonly Type _propertyType; + + /// + /// The class parent type + /// + private readonly Type _targetType; + + /// + /// The IL emitted IGet + /// + private IGet _emittedGet; + + + /// + /// Initializes a new instance of the class. + /// + /// Type of the target object. + /// Name of the property. + /// The . + /// The . + public EmitPropertyGetAccessor(Type targetObjectType, string propertyName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _propertyName = propertyName; + + // deals with Overriding a property using new and reflection + // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx + var propertyInfo = _targetType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (propertyInfo == null) propertyInfo = _targetType.GetProperty(propertyName); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, _targetType)); + + _propertyType = propertyInfo.PropertyType; + _canRead = propertyInfo.CanRead; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region IGet Members + /// + /// Gets the property value from the specified target. + /// + /// Target object. + /// Property value. + public object Get(object target) + { + if (_canRead) return _emittedGet.Get(target); + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a get method.", _propertyName, _targetType)); + } + #endregion + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedGet = assemblyBuilder.CreateInstance("GetFor" + _targetType.FullName + _propertyName) as IGet; + + nullInternal = GetNullInternal(_propertyType); + + if (_emittedGet == null) + throw new NotSupportedException( + string.Format("Unable to create a get property accessor for \"{0}\".", _propertyType)); + } + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "PropertyAccessorFor.FullTagetTypeName.PropertyName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("GetFor" + _targetType.FullName + _propertyName, + TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing IMemberAccessor. + typeBuilder.AddInterfaceImplementation(typeof(IGet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Get + // Define a method named "Get" for the get operation (IGet). + var getParamTypes = new[] { typeof(object) }; + var methodBuilder = typeBuilder.DefineMethod("Get", + MethodAttributes.Public | MethodAttributes.Virtual, typeof(object), getParamTypes); + // Get an ILGenerator and used it to emit the IL that we want. + var generatorIL = methodBuilder.GetILGenerator(); + + if (_canRead) + { + // Emit the IL for get access. + var targetGetMethod = _targetType.GetMethod("get_" + _propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (targetGetMethod == null) targetGetMethod = _targetType.GetMethod("get_" + _propertyName); + + generatorIL.DeclareLocal(typeof(object)); + generatorIL.Emit(OpCodes.Ldarg_1); //Load the first argument,(target object) + generatorIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type + generatorIL.EmitCall(OpCodes.Call, targetGetMethod, null); //Get the property value + if (targetGetMethod.ReturnType.IsValueType) generatorIL.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box if necessary + generatorIL.Emit(OpCodes.Stloc_0); //Store it + generatorIL.Emit(OpCodes.Ldloc_0); + generatorIL.Emit(OpCodes.Ret); + } + else + { + generatorIL.ThrowException(typeof(MissingMethodException)); + } + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + #region IAccessor Members + /// + /// Gets the property's name. + /// + /// + public string Name => _propertyName; + + /// + /// Gets the property's type. + /// + /// + public Type MemberType => _propertyType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/EmitPropertySetAccessor.cs b/ORBatisFramework/Utilities/Objects/Members/EmitPropertySetAccessor.cs new file mode 100644 index 0000000..3f07dc9 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/EmitPropertySetAccessor.cs @@ -0,0 +1,225 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using System.Reflection.Emit; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// The class provides an IL-based set access + /// to a property of a specified target class. + /// + public sealed class EmitPropertySetAccessor : BaseAccessor, ISetAccessor + { + private readonly bool _canWrite; + + /// + /// The property name + /// + private readonly string _propertyName = string.Empty; + + /// + /// The property type + /// + private readonly Type _propertyType; + + /// + /// The class parent type + /// + private readonly Type _targetType; + + /// + /// The IL emitted ISet + /// + private ISet _emittedSet; + + /// + /// Initializes a new instance of the class. + /// Generates the implementation for setter methods. + /// + /// Type of the target object. + /// Name of the property. + /// The . + /// The . + public EmitPropertySetAccessor(Type targetObjectType, string propertyName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + _targetType = targetObjectType; + _propertyName = propertyName; + + // deals with Overriding a property using new and reflection + // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx + var propertyInfo = _targetType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (propertyInfo == null) propertyInfo = _targetType.GetProperty(propertyName); + + // Make sure the property exists + if (propertyInfo == null) + throw new NotSupportedException( + string.Format("Property \"{0}\" does not exist for type " + + "{1}.", propertyName, _targetType)); + + _propertyType = propertyInfo.PropertyType; + _canWrite = propertyInfo.CanWrite; + EmitIL(assemblyBuilder, moduleBuilder); + } + + #region ISet Members + /// + /// Sets the property for the specified target. + /// + /// Target object. + /// Value to set. + public void Set(object target, object value) + { + if (_canWrite) + { + var newValue = value; + if (newValue == null) + // If the value to assign is null, assign null internal value + newValue = nullInternal; + + _emittedSet.Set(target, newValue); + } + else + { + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} doesn't have a set method.", _propertyName, _targetType)); + } + } + #endregion + + + /// + /// This method create a new type oject for the the property accessor class + /// that will provide dynamic access. + /// + /// The assembly builder. + /// The module builder. + private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) + { + // Create a new type object for the the field accessor class. + EmitType(moduleBuilder); + + // Create a new instance + _emittedSet = assemblyBuilder.CreateInstance("SetFor" + _targetType.FullName + _propertyName) as ISet; + + nullInternal = GetNullInternal(_propertyType); + + if (_emittedSet == null) + throw new NotSupportedException( + string.Format("Unable to create a get propert accessor for '{0}' property on class '{1}'.", _propertyName, _propertyType)); + } + + + /// + /// Create an type that will provide the set access method. + /// + /// + /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); + /// CodeAccessPermission.RevertAssert(); + /// + /// The module builder. + private void EmitType(ModuleBuilder moduleBuilder) + { + // Define a public class named "PropertyAccessorFor.FullTagetTypeName.PropertyName" in the assembly. + var typeBuilder = moduleBuilder.DefineType("SetFor" + _targetType.FullName + _propertyName, + TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); + + // Mark the class as implementing IMemberAccessor. + typeBuilder.AddInterfaceImplementation(typeof(ISet)); + + // Add a constructor + typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); + + #region Emit Set + // Define a method named "Set" for the set operation (IMemberAccessor). + var setParamTypes = new[] { typeof(object), typeof(object) }; + var methodBuilder = typeBuilder.DefineMethod("Set", + MethodAttributes.Public | MethodAttributes.Virtual, + null, + setParamTypes); + + // Get an ILGenerator and used to emit the IL that we want. + // Set(object, value); + var generatorIL = methodBuilder.GetILGenerator(); + if (_canWrite) + { + // Emit the IL for the set access. + var targetSetMethod = _targetType.GetMethod("set_" + _propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (targetSetMethod == null) targetSetMethod = _targetType.GetMethod("set_" + _propertyName); + var paramType = targetSetMethod.GetParameters()[0].ParameterType; + + generatorIL.DeclareLocal(paramType); + generatorIL.Emit(OpCodes.Ldarg_1); //Load the first argument (target object) + generatorIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type + generatorIL.Emit(OpCodes.Ldarg_2); //Load the second argument (value object) + if (paramType.IsValueType) + { + generatorIL.Emit(OpCodes.Unbox, paramType); //Unbox it + if (typeToOpcode[paramType] != null) + { + var load = (OpCode)typeToOpcode[paramType]; + generatorIL.Emit(load); //and load + } + else + { + generatorIL.Emit(OpCodes.Ldobj, paramType); + } + } + else + { + generatorIL.Emit(OpCodes.Castclass, paramType); //Cast class + } + + generatorIL.EmitCall(OpCodes.Callvirt, targetSetMethod, null); //Set the property value + generatorIL.Emit(OpCodes.Ret); + } + else + { + generatorIL.ThrowException(typeof(MissingMethodException)); + } + #endregion + + // Load the type + typeBuilder.CreateType(); + } + + #region IAccessor Members + /// + /// Gets the member name. + /// + /// + public string Name => _propertyName; + + /// + /// Gets the type of this member (field or property). + /// + /// + public Type MemberType => _propertyType; + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/GetAccessorFactory.cs b/ORBatisFramework/Utilities/Objects/Members/GetAccessorFactory.cs new file mode 100644 index 0000000..8434e84 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/GetAccessorFactory.cs @@ -0,0 +1,248 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Text; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// A factory to build for a type. + /// + public class GetAccessorFactory : IGetAccessorFactory + { + private readonly AssemblyBuilder _assemblyBuilder; + + private readonly IDictionary _cachedIGetAccessor = new HybridDictionary(); + private readonly CreateFieldGetAccessor _createFieldGetAccessor; + + private readonly CreatePropertyGetAccessor _createPropertyGetAccessor; + private readonly ModuleBuilder _moduleBuilder; + private readonly object _syncObject = new object(); + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [allow code generation]. + public GetAccessorFactory(bool allowCodeGeneration) + { + if (allowCodeGeneration) + { + // Detect runtime environment and create the appropriate factory + if (Environment.Version.Major >= 2) + { + _createPropertyGetAccessor = CreateDynamicPropertyGetAccessor; + _createFieldGetAccessor = CreateDynamicFieldGetAccessor; + } + else + { + var assemblyName = new AssemblyName(); + assemblyName.Name = "iBATIS.FastGetAccessor" + HashCodeProvider.GetIdentityHashCode(this); + + // Create a new assembly with one module + _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); + + _createPropertyGetAccessor = CreatePropertyAccessor; + _createFieldGetAccessor = CreateFieldAccessor; + } + } + else + { + _createPropertyGetAccessor = CreateReflectionPropertyGetAccessor; + _createFieldGetAccessor = CreateReflectionFieldGetAccessor; + } + } + + #region IGetAccessorFactory Members + /// + /// Generate an instance. + /// + /// Target object type. + /// Field or Property name. + /// null if the generation fail + [MethodImpl(MethodImplOptions.Synchronized)] + public IGetAccessor CreateGetAccessor(Type targetType, string name) + { + var key = new StringBuilder(targetType.FullName).Append(".").Append(name).ToString(); + + if (_cachedIGetAccessor.Contains(key)) return (IGetAccessor)_cachedIGetAccessor[key]; + + IGetAccessor getAccessor = null; + lock (_syncObject) + { + if (!_cachedIGetAccessor.Contains(key)) + { + // Property + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var memberInfo = reflectionCache.GetGetter(name); + + if (memberInfo != null) + { + if (memberInfo is PropertyInfo) + { + getAccessor = _createPropertyGetAccessor(targetType, name); + _cachedIGetAccessor[key] = getAccessor; + } + else + { + getAccessor = _createFieldGetAccessor(targetType, name); + _cachedIGetAccessor[key] = getAccessor; + } + } + else + { + throw new ProbeException( + string.Format("No property or field named \"{0}\" exists for type " + + "{1}.", name, targetType)); + } + } + else + { + getAccessor = (IGetAccessor)_cachedIGetAccessor[key]; + } + } + + return getAccessor; + } + #endregion + + /// + /// Create a Dynamic IGetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreateDynamicPropertyGetAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); + + if (propertyInfo.CanRead) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetGetMethod(); + if (methodInfo != null) // == visibilty public + return new DelegatePropertyGetAccessor(targetType, propertyName); + + return new ReflectionPropertyGetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be get.", propertyInfo.Name, targetType)); + } + + /// + /// Create a Dynamic IGetAccessor instance for a field + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreateDynamicFieldGetAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); + + if (fieldInfo.IsPublic) return new DelegateFieldGetAccessor(targetType, fieldName); + + return new ReflectionFieldGetAccessor(targetType, fieldName); + } + + /// + /// Create a IGetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreatePropertyAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); + + if (propertyInfo.CanRead) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetGetMethod(); + if (methodInfo != null) // == visibilty public + return new EmitPropertyGetAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionPropertyGetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be get.", propertyInfo.Name, targetType)); + } + + /// + /// Create a IGetAccessor instance for a field + /// + /// Target object type. + /// Field name. + /// null if the generation fail + private IGetAccessor CreateFieldAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); + + if (fieldInfo.IsPublic) return new EmitFieldGetAccessor(targetType, fieldName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionFieldGetAccessor(targetType, fieldName); + } + + /// + /// Create a Reflection IGetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private IGetAccessor CreateReflectionPropertyGetAccessor(Type targetType, string propertyName) + { + return new ReflectionPropertyGetAccessor(targetType, propertyName); + } + + /// + /// Create Reflection IGetAccessor instance for a field + /// + /// Target object type. + /// field name. + /// null if the generation fail + private IGetAccessor CreateReflectionFieldGetAccessor(Type targetType, string fieldName) + { + return new ReflectionFieldGetAccessor(targetType, fieldName); + } + + private delegate IGetAccessor CreatePropertyGetAccessor(Type targetType, string propertyName); + + private delegate IGetAccessor CreateFieldGetAccessor(Type targetType, string fieldName); + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/Members/SetAccessorFactory.cs b/ORBatisFramework/Utilities/Objects/Members/SetAccessorFactory.cs new file mode 100644 index 0000000..8bf6196 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/Members/SetAccessorFactory.cs @@ -0,0 +1,248 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Collections; +using System.Collections.Specialized; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; +using System.Text; +using IBatisNet.Common.Exceptions; + +namespace IBatisNet.Common.Utilities.Objects.Members +{ + /// + /// A factory to build for a type. + /// + public class SetAccessorFactory : ISetAccessorFactory + { + private readonly AssemblyBuilder _assemblyBuilder; + + private readonly IDictionary _cachedISetAccessor = new HybridDictionary(); + private readonly CreateFieldSetAccessor _createFieldSetAccessor; + + private readonly CreatePropertySetAccessor _createPropertySetAccessor; + private readonly ModuleBuilder _moduleBuilder; + private readonly object _syncObject = new object(); + + /// + /// Initializes a new instance of the class. + /// + /// if set to true [allow code generation]. + public SetAccessorFactory(bool allowCodeGeneration) + { + if (allowCodeGeneration) + { + // Detect runtime environment and create the appropriate factory + if (Environment.Version.Major >= 2) + { + _createPropertySetAccessor = CreateDynamicPropertySetAccessor; + _createFieldSetAccessor = CreateDynamicFieldSetAccessor; + } + else + { + var assemblyName = new AssemblyName(); + assemblyName.Name = "iBATIS.FastSetAccessor" + HashCodeProvider.GetIdentityHashCode(this); + + // Create a new assembly with one module + _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); + _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); + + _createPropertySetAccessor = CreatePropertyAccessor; + _createFieldSetAccessor = CreateFieldAccessor; + } + } + else + { + _createPropertySetAccessor = CreateReflectionPropertySetAccessor; + _createFieldSetAccessor = CreateReflectionFieldSetAccessor; + } + } + + #region ISetAccessorFactory Members + /// + /// Generate an instance. + /// + /// Target object type. + /// Field or Property name. + /// null if the generation fail + [MethodImpl(MethodImplOptions.Synchronized)] + public ISetAccessor CreateSetAccessor(Type targetType, string name) + { + var key = new StringBuilder(targetType.FullName).Append(".").Append(name).ToString(); + + if (_cachedISetAccessor.Contains(key)) return (ISetAccessor)_cachedISetAccessor[key]; + + ISetAccessor setAccessor = null; + lock (_syncObject) + { + if (!_cachedISetAccessor.Contains(key)) + { + // Property + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var memberInfo = reflectionCache.GetSetter(name); + + if (memberInfo != null) + { + if (memberInfo is PropertyInfo) + { + setAccessor = _createPropertySetAccessor(targetType, name); + _cachedISetAccessor[key] = setAccessor; + } + else + { + setAccessor = _createFieldSetAccessor(targetType, name); + _cachedISetAccessor[key] = setAccessor; + } + } + else + { + throw new ProbeException( + string.Format("No property or field named \"{0}\" exists for type " + + "{1}.", name, targetType)); + } + } + else + { + setAccessor = (ISetAccessor)_cachedISetAccessor[key]; + } + } + + return setAccessor; + } + #endregion + + /// + /// Create a Dynamic ISetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private ISetAccessor CreateDynamicPropertySetAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); + + if (propertyInfo.CanWrite) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetSetMethod(); + if (methodInfo != null) // == visibilty public + return new DelegatePropertySetAccessor(targetType, propertyName); + + return new ReflectionPropertySetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be set.", propertyInfo.Name, targetType)); + } + + /// + /// Create a Dynamic ISetAccessor instance for a field + /// + /// Target object type. + /// field name. + /// null if the generation fail + private ISetAccessor CreateDynamicFieldSetAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetSetter(fieldName); + + if (fieldInfo.IsPublic) return new DelegateFieldSetAccessor(targetType, fieldName); + + return new ReflectionFieldSetAccessor(targetType, fieldName); + } + + /// + /// Create a ISetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private ISetAccessor CreatePropertyAccessor(Type targetType, string propertyName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); + + if (propertyInfo.CanWrite) + { + MethodInfo methodInfo = null; + methodInfo = propertyInfo.GetSetMethod(); + if (methodInfo != null) // == visibilty public + return new EmitPropertySetAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionPropertySetAccessor(targetType, propertyName); + } + + throw new NotSupportedException( + string.Format("Property \"{0}\" on type " + + "{1} cannot be set.", propertyInfo.Name, targetType)); + } + + /// + /// Create a ISetAccessor instance for a field + /// + /// Target object type. + /// Field name. + /// null if the generation fail + private ISetAccessor CreateFieldAccessor(Type targetType, string fieldName) + { + var reflectionCache = ReflectionInfo.GetInstance(targetType); + var fieldInfo = (FieldInfo)reflectionCache.GetSetter(fieldName); + + if (fieldInfo.IsPublic) return new EmitFieldSetAccessor(targetType, fieldName, _assemblyBuilder, _moduleBuilder); + + return new ReflectionFieldSetAccessor(targetType, fieldName); + } + + /// + /// Create a Reflection ISetAccessor instance for a property + /// + /// Target object type. + /// Property name. + /// null if the generation fail + private ISetAccessor CreateReflectionPropertySetAccessor(Type targetType, string propertyName) + { + return new ReflectionPropertySetAccessor(targetType, propertyName); + } + + /// + /// Create Reflection ISetAccessor instance for a field + /// + /// Target object type. + /// field name. + /// null if the generation fail + private ISetAccessor CreateReflectionFieldSetAccessor(Type targetType, string fieldName) + { + return new ReflectionFieldSetAccessor(targetType, fieldName); + } + + private delegate ISetAccessor CreatePropertySetAccessor(Type targetType, string propertyName); + + private delegate ISetAccessor CreateFieldSetAccessor(Type targetType, string fieldName); + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Objects/ObjectFactory.cs b/ORBatisFramework/Utilities/Objects/ObjectFactory.cs new file mode 100644 index 0000000..0c05966 --- /dev/null +++ b/ORBatisFramework/Utilities/Objects/ObjectFactory.cs @@ -0,0 +1,75 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 374175 $ + * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +using System; +using System.Reflection; +using IBatisNet.Common.Logging; + +namespace IBatisNet.Common.Utilities.Objects +{ + /// + /// A factory to create objects + /// + public class ObjectFactory : IObjectFactory + { + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + private readonly IObjectFactory _objectFactory; + + /// + /// Constructor + /// + /// + public ObjectFactory(bool allowCodeGeneration) + { + if (allowCodeGeneration) + { + // Detect runtime environment and create the appropriate factory + if (Environment.Version.Major >= 2) + _objectFactory = new DelegateObjectFactory(); + else + _objectFactory = new EmitObjectFactory(); + } + else + { + _objectFactory = new ActivatorObjectFactory(); + } + } + + #region IObjectFactory members + /// + /// Create a new factory instance for a given type + /// + /// The type instance to build + /// The types of the constructor arguments + /// Returns a new instance factory + public IFactory CreateFactory(Type typeToCreate, Type[] types) + { + if (_logger.IsDebugEnabled) return new FactoryLogAdapter(typeToCreate, types, _objectFactory.CreateFactory(typeToCreate, types)); + + return _objectFactory.CreateFactory(typeToCreate, types); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/Utilities/Resources.cs b/ORBatisFramework/Utilities/Resources.cs new file mode 100644 index 0000000..5388d6d --- /dev/null +++ b/ORBatisFramework/Utilities/Resources.cs @@ -0,0 +1,560 @@ +#region Apache Notice +/***************************************************************************** + * $Revision: 408099 $ + * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ + * $LastChangedBy: gbayon $ + * + * iBATIS.NET Data Mapper + * Copyright (C) 2006/2005 - The Apache Software Foundation + * + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + ********************************************************************************/ +#endregion + +#region Using +using System; +using System.Collections.Specialized; +using System.IO; +using System.Reflection; +using System.Security.Permissions; +using System.Xml; +using IBatisNet.Common.Exceptions; +using IBatisNet.Common.Logging; +using IBatisNet.Common.Xml; +#endregion + +namespace IBatisNet.Common.Utilities +{ + /// + /// A class to simplify access to resources. + /// The file can be loaded from the application root directory + /// (use the resource attribute) + /// or from any valid URL (use the url attribute). + /// For example,to load a fixed path file, use: + /// <properties url=�file:///c:/config/my.properties� /> + /// + public class Resources + { + #region Fields + //private static CachedTypeResolver _cachedTypeResolver = null; + + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + #endregion + #region Constructor (s) / Destructor + static Resources() + { + //_cachedTypeResolver = new CachedTypeResolver(); + } + #endregion + + #region Inner Class : FileAssemblyInfo + /// + /// Holds data about a and it's + /// attendant . + /// + internal class FileAssemblyInfo + { + #region Constants + /// + /// The string that separates file name + /// from their attendant + /// names in an assembly qualified type name. + /// + public const string FileAssemblySeparator = ","; + #endregion + + #region Constructor (s) / Destructor + /// + /// Creates a new instance of the FileAssemblyInfo class. + /// + /// + /// The unresolved name of a . + /// + public FileAssemblyInfo(string unresolvedFileName) + { + SplitFileAndAssemblyNames(unresolvedFileName); + } + #endregion + + #region Methods + /// + /// + /// + private void SplitFileAndAssemblyNames(string originalFileName) + { + OriginalFileName = originalFileName; + + var separatorIndex = originalFileName.IndexOf(FileAssemblySeparator); + + if (separatorIndex < 0) + { + FileName = originalFileName.Trim(); + AssemblyName = null; // IsAssemblyQualified will return false + } + else + { + FileName = originalFileName.Substring(0, separatorIndex).Trim(); + AssemblyName = originalFileName.Substring(separatorIndex + 1).Trim(); + } + } + #endregion + + #region Properties + /// + /// The resource file name . + /// + public string ResourceFileName => AssemblyName + "." + FileName; + + /// + /// The original name. + /// + public string OriginalFileName { get; private set; } = string.Empty; + + /// + /// The file name portion. + /// + public string FileName { get; private set; } = string.Empty; + + /// + /// The (unresolved, possibly partial) name of the attandant assembly. + /// + public string AssemblyName { get; private set; } = string.Empty; + + /// + /// Is the type name being resolved assembly qualified? + /// + public bool IsAssemblyQualified + { + get + { + if (AssemblyName == null || AssemblyName.Trim().Length == 0) return false; + + return true; + } + } + #endregion + } + #endregion + + #region Properties + /// + /// The name of the directory containing the application + /// + public static string ApplicationBase { get; } = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; + + /// + /// The name of the directory used to probe the assemblies. + /// + public static string BaseDirectory { get; } = AppDomain.CurrentDomain.BaseDirectory; + #endregion + + #region Methods + /// + /// Protocole separator + /// + public const string PROTOCOL_SEPARATOR = "://"; + + /// + /// Strips protocol name from the resource name + /// + /// Name of the resource + /// Name of the resource without protocol name + public static string GetFileSystemResourceWithoutProtocol(string filePath) + { + var pos = filePath.IndexOf(PROTOCOL_SEPARATOR); + if (pos == -1) return filePath; + + // skip forward slashes after protocol name, if any + if (filePath.Length > pos + PROTOCOL_SEPARATOR.Length) + while (filePath[++pos] == '/') + ; + + return filePath.Substring(pos); + } + + /// + /// Get config file + /// + /// + /// A config resource path. + /// + /// An XmlDocument representation of the config file + public static XmlDocument GetConfigAsXmlDocument(string resourcePath) + { + var config = new XmlDocument(); + XmlTextReader reader = null; + resourcePath = GetFileSystemResourceWithoutProtocol(resourcePath); + + if (!FileExists(resourcePath)) resourcePath = Path.Combine(BaseDirectory, resourcePath); + + try + { + reader = new XmlTextReader(resourcePath); + config.Load(reader); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load config file \"{0}\". Cause : {1}", + resourcePath, + e.Message), e); + } + finally + { + if (reader != null) reader.Close(); + } + + return config; + } + + /// + /// Determines whether the specified file exists. + /// + /// The file to check. + /// + /// true if the caller has the required permissions and path contains the name of an existing file + /// false if the caller has the required permissions and path doesn't contain the name of an existing file + /// else exception + /// + public static bool FileExists(string filePath) + { + if (File.Exists(filePath)) + // true if the caller has the required permissions and path contains the name of an existing file; + return true; + + // This method also returns false if the caller does not have sufficient permissions + // to read the specified file, + // no exception is thrown and the method returns false regardless of the existence of path. + // So we check permissiion and throw an exception if no permission + FileIOPermission filePermission = null; + try + { + // filePath must be the absolute path of the file. + filePermission = new FileIOPermission(FileIOPermissionAccess.Read, filePath); + } + catch + { + return false; + } + + try + { + filePermission.Demand(); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("iBATIS doesn't have the right to read the config file \"{0}\". Cause : {1}", + filePath, + e.Message), e); + } + + return false; + } + + + /// + /// Load an XML resource from a location specify by the node. + /// + /// An location node + /// the global properties + /// Return the Xml document load. + public static XmlDocument GetAsXmlDocument(XmlNode node, NameValueCollection properties) + { + XmlDocument xmlDocument = null; + + if (node.Attributes["resource"] != null) + { + var ressource = NodeUtils.ParsePropertyTokens(node.Attributes["resource"].Value, properties); + xmlDocument = GetResourceAsXmlDocument(ressource); + } + else if (node.Attributes["url"] != null) + { + var url = NodeUtils.ParsePropertyTokens(node.Attributes["url"].Value, properties); + xmlDocument = GetUrlAsXmlDocument(url); + } + else if (node.Attributes["embedded"] != null) + { + var embedded = NodeUtils.ParsePropertyTokens(node.Attributes["embedded"].Value, properties); + xmlDocument = GetEmbeddedResourceAsXmlDocument(embedded); + } + + return xmlDocument; + } + + + /// + /// Get the path resource of an url or resource location. + /// + /// The specification from where to load. + /// the global properties + /// + public static string GetValueOfNodeResourceUrl(XmlNode node, NameValueCollection properties) + { + string path = null; + + if (node.Attributes["resource"] != null) + { + var ressource = NodeUtils.ParsePropertyTokens(node.Attributes["resource"].Value, properties); + path = Path.Combine(ApplicationBase, ressource); + } + else if (node.Attributes["url"] != null) + { + var url = NodeUtils.ParsePropertyTokens(node.Attributes["url"].Value, properties); + path = url; + } + + return path; + } + + /// + /// Get XmlDocument from a stream resource + /// + /// + /// + public static XmlDocument GetStreamAsXmlDocument(Stream resource) + { + var config = new XmlDocument(); + + try + { + config.Load(resource); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load XmlDocument via stream. Cause : {0}", + e.Message), e); + } + + return config; + } + + /// + /// Get XmlDocument from a FileInfo resource + /// + /// + /// + public static XmlDocument GetFileInfoAsXmlDocument(FileInfo resource) + { + var config = new XmlDocument(); + + try + { + config.Load(resource.FullName); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load XmlDocument via FileInfo. Cause : {0}", + e.Message), e); + } + + return config; + } + + /// + /// Get XmlDocument from a Uri resource + /// + /// + /// + public static XmlDocument GetUriAsXmlDocument(Uri resource) + { + var config = new XmlDocument(); + + try + { + config.Load(resource.AbsoluteUri); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load XmlDocument via Uri. Cause : {0}", + e.Message), e); + } + + return config; + } + + /// + /// Get XmlDocument from relative (from root directory of the application) path resource + /// + /// + /// + public static XmlDocument GetResourceAsXmlDocument(string resource) + { + var config = new XmlDocument(); + + try + { + config.Load(Path.Combine(ApplicationBase, resource)); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file via resource \"{0}\" as resource. Cause : {1}", + resource, + e.Message), e); + } + + return config; + } + + + /// + /// Get XmlDocument from absolute path resource + /// + /// + /// + public static XmlDocument GetUrlAsXmlDocument(string url) + { + var config = new XmlDocument(); + + try + { + config.Load(url); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file via url \"{0}\" as url. Cause : {1}", + url, + e.Message), e); + } + + return config; + } + + + /// + /// + /// + /// + public static XmlDocument GetEmbeddedResourceAsXmlDocument(string resource) + { + var config = new XmlDocument(); + var isLoad = false; + + var fileInfo = new FileAssemblyInfo(resource); + if (fileInfo.IsAssemblyQualified) + { + Assembly assembly = null; + assembly = Assembly.Load(fileInfo.AssemblyName); + var stream = assembly.GetManifestResourceStream(fileInfo.ResourceFileName); + // JIRA - IBATISNET-103 + if (stream == null) stream = assembly.GetManifestResourceStream(fileInfo.FileName); + if (stream != null) + try + { + config.Load(stream); + isLoad = true; + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file \"{0}\" in embedded resource. Cause : {1}", + resource, + e.Message), e); + } + } + else + { + // bare type name... loop thru all loaded assemblies + var assemblies = AppDomain.CurrentDomain.GetAssemblies(); + foreach (var assembly in assemblies) + { + var stream = assembly.GetManifestResourceStream(fileInfo.FileName); + if (stream != null) + { + try + { + config.Load(stream); + isLoad = true; + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file \"{0}\" in embedded resource. Cause : ", + resource, + e.Message), e); + } + + break; + } + } + } + + if (isLoad == false) + { + _logger.Error("Could not load embedded resource from assembly"); + throw new ConfigurationException( + string.Format("Unable to load embedded resource from assembly \"{0}\".", + fileInfo.OriginalFileName)); + } + + return config; + } + + + /// + /// Load a file from a given resource path + /// + /// + /// The resource path + /// + /// return a FileInfo + public static FileInfo GetFileInfo(string resourcePath) + { + FileInfo fileInfo = null; + resourcePath = GetFileSystemResourceWithoutProtocol(resourcePath); + + if (!FileExists(resourcePath)) resourcePath = Path.Combine(ApplicationBase, resourcePath); + + try + { + //argument : The fully qualified name of the new file, or the relative file name. + fileInfo = new FileInfo(resourcePath); + } + catch (Exception e) + { + throw new ConfigurationException( + string.Format("Unable to load file \"{0}\". Cause : \"{1}\"", resourcePath, e.Message), e); + } + + return fileInfo; + } + + + /// + /// Resolves the supplied type name into a instance. + /// + /// + /// The (possibly partially assembly qualified) name of a . + /// + /// + /// A resolved instance. + /// + /// + /// If the type cannot be resolved. + /// + [Obsolete("Use IBatisNet.Common.Utilities.TypeUtils")] + public static Type TypeForName(string typeName) + { + return TypeUtils.ResolveType(typeName); + //_cachedTypeResolver.Resolve(className); + } + #endregion + } +} \ No newline at end of file diff --git a/ORBatisFramework/packages.config b/ORBatisFramework/packages.config new file mode 100644 index 0000000..ba6115e --- /dev/null +++ b/ORBatisFramework/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/README.txt b/README.txt deleted file mode 100644 index 4f092b1..0000000 --- a/README.txt +++ /dev/null @@ -1,9 +0,0 @@ -docs - The docbook source for the Developers Guide. Form this, we generate HTML, PDF, and CHM files to be distributed in the Documentation package. - -mapper - The main iBatisNet solution, including Common, DataAccess, and DataMapper. - -tutorial - The tutorial solution (and docbook). - -npetshop - The example PetShop solution - -#### diff --git a/docs/README.html b/docs/README.html deleted file mode 100644 index fdce5d9..0000000 --- a/docs/README.html +++ /dev/null @@ -1,112 +0,0 @@ - - -mybatisnet - building documentation - - -

mybastisnet documentation repository

-

This document aims at describing the essential characteristics of the mybatisnet -documentation repository, and more specifically to guide documentation contributors -on how to:

-
    -
  • setup the tools required to build the documentation from source;
  • -
  • perform the build, targeting various output formats (currently CHM and PDF).
  • -
- -

Tools required

-
-
    -
  • nant, to run the documentation build script (see - - http://nant.sourceforge.net/ to download and setup nant);
  • -
  • docbook DTD and stylesheets (see the docbook - section below for instructions on obtaining and setting these up);
  • -
  • xlstproc, to convert the source documentation from docbook format - to other formats (HTML, CHM, PDF,...) by applying XML stylesheets and then using - other tools (see the xlstproc section below for - instructions on obtaining and setting up the required xsltproc utilities under - windows);
  • -
  • fop, required to produce the PDF version of the documentation (see - http://xmlgraphics.apache.org/fop/download.html - for instructions on obtaining and setting up fop). Note that FOP is - implemented in Java, so you will need a properly set-up java runtime (JRE) - to use it.
  • -
  • HTML Help Workshop, required to produce the CHM version of the - documentation (see - http://www.microsoft.com/downloads/en/details.aspx?FamilyID=00535334-c8a6-452f-9aa0-d597d16580cc&displaylang=en - for instructions on obtaining and setting up HTML Help Workshop).

    - NOTE: The workshop is actually bundled with other Microsoft - products (not sure which, perhaps Windows itself). However, recent versions - of the workshop (e.g., the one under Windows 7) don't seem to include - hhc.exe, the command-line tool this project needs. It might therefore - still be required that you install the workshop, even if you already have it.
  • -
- -

docbook

- -

Docbook is a is an XML documentation format specification, essentially - implemented in two things that a tool needs to parse a docbook source document - (which is in XML):

-
    -
  1. an XML DTD (docbookx.dtd). This is available in many, many versions. The - mybatisnet documentation currently uses version 4.1.2. You will find the - docbook DTD and its dependencies in the .\docbook\dtd folder. - The original source for the DTD is - http://www.oasis-open.org/docbook/xml/. -
  2. a set of XML stylesheets (xsl files), which are provided at - http://sourceforge.net/projects/docbook. - These instruction were tested with the latest stable release, which as of - this writing is docbook-xsl-ns v1.76.0. -
      -
    1. Download the stylesheets bundle at - http://sourceforge.net/projects/docbook/files/docbook-xsl-ns/1.76.0/docbook-xsl-ns-1.76.0.zip/download.
    2. -
    3. extract the contents of the top-level folder from the ZIP archive in - the .\docbook\styles folder. You should wind up with the following folders - under .\docbook\styles: common, docsrc, eclipse, ... The paths to these - stylesheets are currently hardcoded in the mybatisnet docbook stylesheets, - so it's important to unzip the files in the right place.
    4. -
    -
  3. -
- -

xsltproc

- -

xsltproc is one of many tools that are able to apply stylesheets to XML - documents, with the usual goal of converting the XML to some other format. To - deploy a windows version of xlstproc:

-
    -
  1. Download the following files (more recent versions of each are available, but - these specific versions are known to work well together): -
      -
    1. ftp://ftp.zlatkovic.com/libxml/oldreleases/iconv-1.9.1.win32.zip
    2. -
    3. ftp://ftp.zlatkovic.com/libxml/oldreleases/libxml2-2.6.15.win32.zip
    4. -
    5. ftp://ftp.zlatkovic.com/libxml/oldreleases/libxmlsec-1.2.6.win32.zip
    6. -
    7. ftp://ftp.zlatkovic.com/libxml/oldreleases/libxslt-1.1.12.win32.zip
    8. -
    9. ftp://ftp.zlatkovic.com/libxml/oldreleases/zlib-1.2.1.win32.zip
    10. -
  2. -
  3. Unzip each of the files above in a folder of your choice.
  4. -
  5. Copy the contents of all the bin folders (EXEs and DLLs) in the same folder.
  6. -
  7. Add the folder containing all EXEs and DLLs to your path, so that - xsltproc.exe is available from a command prompt.
  8. -
- -

Building the documentation under Windows

- -

Once the tools described above have been installed in the right places:

-
    -
  1. Open a command prompt and cd to this directory.
  2. -
  3. Run nant allDoc to produce CHM and PDF versions of - DataMapperGuide, DataAccesGuide and the tutorial.
  4. -
- -

The build script also contains other targets, please see doc.build for details.

- -

Also note that as of this writing, the production of PDF output is producing - less than ideal results. Also note that as a byproduct of the CHM output, the - documentation is also generated in HTML format, which is prerequisite for the - production of the CHM version.

- - \ No newline at end of file diff --git a/docs/dataAccessGuide/resources/IBatisNet.vsd b/docs/dataAccessGuide/resources/IBatisNet.vsd deleted file mode 100644 index cbbd282e1c07b7752bfeaf381cbce59791dd3168..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 951808 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

9X2J_o+ z=eH@c+|W$eAj8}!!@OaJx$$Sy9UB#!s-@n-*?9a?o0;$l8z2Y_76t~JU`5lwV6(tr^T1$>z~IN0OM)9` zm^TSCWCffKY^4S&A=tmvMy%=$fbZY0U6ZJ zk&K-qnU?~JG~bJ^vt*;%4BRrhNVBUD=l|3bzKKX=Cw5fg^;fa7zp_^gk%Rfz_(iVk zEzYlLrWCSLrn1*tal%${Q+pkb&$3IIYM3&$!IG4zM(Zt#G(X?LK9+qR5v`WaF_~l1 z+Ha-2Ycq>v*J9H%Zj7h}%z5+Mu;#a6&u=r&sYtWm^a0i$$TwvSjqIH!YMSyBUpAbI z4>nC#4lL5BSifWGvj|1s%>HJ+`1kb5SlLWjhHQ=B4!>QpD}Kd(K`(up2~9K1%{GPOnw=QDdevRBa$Wz-138~%#$wYLmuQ zyMo$9d}-D+!`v#vyjg}hySb;?v2vDS$1yph^E(bD-Zlq`1%GDbK}u=z-M-OgBx}da zq^up;W?4HjQlE)d&g=6`G|k)I%)m}ixSD$}E7lT|rH{aIquky+$)@`SIj28Eq zWt8ph=lJG-&+qo@rLF{F4n;?D0|e%hPXH zdd6S6k!-+kK_shJ2On;;bxWCpN)puFFqtzxiqXuJ<>NQhFSf_iQyF&5ie#&Tb_El* zJ59Q9i>Y+Hm+HWGW#bChYG57&<=yG8-{iD=P9J4rc0N0{_+-cEn8~x?Ks;bFW5(( z7~c3bn0qO}Mdj_ir!k}9x~>mwAIQg0_xgD90(p|YbJmOskET5OIL(gCzL{{-d)lp_ z);9OTNqJ~@ae3&XoBnMtG)=f!dDn2%-H0ZhPRA`8Q>&vfbFQ(S1KVxsno;e}qFSTR|)K&B8+cceJ%pxNH@JeT+s zPA{DPgP2i%n>}7RNBNC%lhQ4AZiKPRDkm*@v?FY^bIRbR%_#p0MwrC}#azX51=*}n zDb`7kWSmvri9hRia^_&IQjlhs#$X(I!5m~Y2seeDCTq(cxL;aob#g8hXvlieOzBZp zT53Vbsa-;q)mP(J9q{0Pd$^4%eo|>EG1|)BSz7AJFxtMhWUk+GzpH;Fuv$>8*-KyE zDcI3a+gvNrdOh>swPZp0i5j+RgYCJN6{wN?N!V>$E4r99YED;TQ7!lhuAnwtUM^SD$e%6e#ag09}pDVdr;v$Rn z*uR$eXoqTJwMy+`?HcV4?NKecqAk`cW(SYGt%xdg zyus;nZZSn!qxrk6y=5V?Mm8Bsxb4>lZ1|F;uyGZImASX*;7Bpa%LLbUj?G%7Tm2&Y z=70f%8@guIrN}8^m;4_35w5a{(pnb9o5-8TTfrMUqEE7as%)8z`5Svcr>U2gYAvs$ zf!O$qamo&aqTlF^cT*cH=1H5L8xY@|gaxQb*nToOWxS-S>PP|=W<|nA6T7hC=O?Wn zSTXk8`Ej#)7Tt{OSjw85>D_cjqNe)>KlcN{iPj`6*not6RyA>_^�s*~vUBwfHp|Yv6U;l@BPE&`i51Hp< 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

h#*{jNzp5>GOCns@>< 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

Rxu%_eUfBEw~U`F~uRF{u6LK!@Cu4lPQOr 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

  • Cf!Cb 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

    Jjf4KBbbm!6`hD))+W5tgT{ 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Μ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≫;7(d}O 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¥rDz^kEqtU>Xd|=m23(XnA&( zE%CNZJ*ASMIMo!&Yr7kcXQ;?mehsmL+V`7W2zs(_VR4hTxJQGGpqv z;h}6I=JKytaLqLHT+{mdVNm$+thqhSUJl+G-+XG1Q^he`yT>(sj@QfI1iM81Z6f`( z7Gs-3=U?=l_8o#I`T71AmQ7b-&}DYLdsX3eh{UyP@!_M+Q{SIy(AsL7vWE|-^4={K z7Fin%btgpiuc};&ZncGs*YaOJtS9791ljNVT@qG05WRr+i~cVEY3`vpB~AK7+3)XH z35E-|r9$WA`4EH}Vilu|*CGh@s`$jEa8t6L4i0XR^6v?lF3d0z<50~&Bm18`T=aTK z_UAIkL8l$hvBg#p7|So4u4pK-w3t{5&W2SAx=nJ%0r`|#4$=s(m;m2K7HVI$f7Vv0 z;RX$SuH+HXk$AXdrEJ@@?y&(3SZ3&6+oj~h@M%NsD{lc^1*ol7AcZ}CR03N*R@E#X z*Z-|6A!7R@3_;=fB}IG{|2~M|`@X|xU?UOCyBp7t;~c-!B$SeW^?6{g(!fN)Y0Fo9 zy(bJ7yu5_j7|IQ&g)LaSZ7LV2$-TP7+#U~XH@qoV*k&JyE|8axe-4h`EvV0lRx-B> zRUwQ9AIL4>){=G{_I_QmN&E$b;9MebGV4T%*qlzP!UvdcwywZ`-#1I&YwjfWgA>!w z1gZj;55HMzJ4ov0o=ob%hg;6*M?z$sv>iv4_8Jp5MT`_{JNw-YNVVgBp`6 z_epHnddSyP&@D)M-j&>FN#%bnn@_lU-4F?F?A7l=5zUnwx^s7t0PJSaG58uuc%MiBmF) zf1X0VW%&!)?bp_V96{Rt$1gWta5O1a>3Hx=iP>K5f&D_$QgjB%KH~`Q_&zH9K9{q^ zHioOLWwtTHbngTaYsjvv2v?MLnN2v zMTSCT%)0fS*cVR}MUy~%($mX;M z7QU27MkfAj}!11VO?ipCgwpqhUwr%5r2ezP_sW>|D7yWtykp^4%*1_ukHYADI zw3)R^!vS!{sC8?00BtAiP<7M#`$AU(_L|19@6#jTnEeeN*!872rMn>SZIW|rTQ6g5 zdwI;b#HlS^%1WRT$Yv68H8m2v)`Tz?qZ_bPRY64+`eIcDhb27L1SPsK%k1`?HErgY!H>-$!vt12AG1>6-J{}&F1FX%{MFgJn>lu%a(EQ$q=_`zR`SaSPD=zF z3tdNmvjHj2A0KxW!*}!8Z#ynMb76XAdSJ`mq@uF!UpK=2(#@Qk8Qgvy3g|H)HUiR> zOr3d63)^9k(zVCG_`g;LBKA5A)GCoQ@x(&duw^}yxk-x!i%GV{ARA?Qz{4Ad2+0+F zO8uTaR#3XZ^X2>AXOCco&0q};g3FwHbSBNHeo?Yz+Y9FLIwhP|w-K$t^lE~49};01 z#jh%B?{#=G$JHyf#d9ek0LyG=VGjmkJI_jK`C*lz{nsb!;@Uh9usQW`e0}lTHjq^w z$4B~P{G*fV%b$5*Z&mAqatq$Y>i$A1EzxL@1{~;@fh&4@l>@eTk>K{4bOk55hxQ9G zP6!X_cS-p=oN=`%IcTj{2-v*&ZC1v%j_|kBH15Ygp(l(`2ObaXp(B3E@LTesN%Q?< zMLplRZ+yKbM#OSlh7{%O_6Qq)aX5PMV9*HjZw**ia~m8p^=DB}{1y5#u*w5F3e*B+ z6+Rp5Sdhv7_x*Xh;&tFyskl*YFIU{Q?14LF%KUkQMhTRwL1!4_kH;rD7aVL)RVaV; z-i&a~hZ0rKhS7e&sbItWzgshGpyZb_Ed?(=kCut&RK0TX)=)66b-7I9UbPpZnR?Bd z6oDrway4FhMa$J_!B86ObWeHQy$Gzcd0xfEQ-WEFRcDd1A#7L~hF!Z%Q^lYE0Rv0Y z@x|>8tb~<}=!;<`QE8zc%D`sw!ZLJpr#<8bj*l%?ZQ#I4)rP(p$0cGTy{AAqc+|?~ z<{DerWosF=<-hDcBDS^xc^t#-<4h{MsDG>K(@Pfqo<)~^>CDwCgRifERrw2n_22O} zEE7LY3`R|8vkI)ft!`2}KFC2YERHfdPQhTxL6Tb~>gNaYO?cmNaQ<{r`45=?y=G#< z)uf6N7=4gS^Zf~QiZ!~)sN8E|T0v3To}(jU*CiGf?aKcy<5Wgr_NRIA=na=rkTRhQ zEs~gEi5HJZObo<}_rOYDQ&j=U7jss1{!S*~^@BV1zd$h$>;;Z(pc1OS*Zk)81o-lB z+n18RpV0B)8x=LX(^f?bdhZb1i^JN^gNcedV}Mi-)b};+2Lvw`N2717PCBJ>g)0qA zN@qvqsVtaR=|HcrwChxY*__Avd zNLy#;|04EhFtNcN*vkt6D!y#i=#=|Hd0*K(LHZ|FtIN@u<0BbDiQGXmwDFi|;KmaM zccaMEmc8r57(cJ5cwjAzOH@GN#V4y`qpfN1+&gjRJ+iaGlAaCO+31UUHV^EF+zL?f zG!QjP-mwYtRT4dSJ_%m~DO-LNnHOCk(LNlB`GE7l9v4J$5cx}9=86A6+IC@k21jiw ztZ-G%QJ1+YL@Xb4zfd`AAY$AC{4dp9)~-6}1Ga-4Zt1f|!4$QQ@A*Ne&b`V5j$W1A zPG9RJ%H-hN&`T541C@ZtS1imY1>$3@a(o_mo!uu;?Y|JQ1Mp*mY8F$IP)X5}-FV7K_ z?&ppK)fr+Axq@L1$HJA4(7NW(unJecu*pr}qGirL#_Bk^Yqmw|H_&{>b{?IJpYRKKq~<| z5Pbn>26y##G+&YWH#XlZ#rq?wWS8>rB)D6ZJx@K%P_lJ zxja!xoU>LS*sJ*u*Ao&gsotEsr#D|j=3~J4i5youxS9=2a>6DZEPkz?!}wAQjdCul zd0s;k%q_hHwe}L`m31jS7)97uan3}CD78q6YmTu5{7lPH~ikpoCcR`1v z(uIcwZI6-2X2YX9R%OSj3!7yn3VwNDzX4l>+L!ot^E@cUo%?h5d-?`oXKap{D73sw zLDJ@y!ip#8cx~SqrzW#nkqEh$JqwR-7T(MfGzU!M+iJC^aB#hK{g$e2A0dg*_g`KB z5$h({qXzB%x|U%dcRhs9L$`wx(%x@_I!*)2`$O(Nbdmc43Le<(l9!;S$nHSOm>dS? z?6ASrBTgA$Wh0h=k34l(!ufsXZINE7jhjZ*0fQ00_)cx13N~02-}kxy<_pw$57}1P z?)VK0R(Ddb_`Zx{rql#!Ua_aCorlsR*10xzzLy!HnbBJ$Fc>8SQhYo$Z`~rRCWV@1n3eTS?87el%~bZML7JsE*MhoA{5N8ZW)!Ve*ehY(JRPmqmu|f3XB0$@ zp*iEm#?dg@+=WK8GT9;p)hz%oY?QaDYVsH38s*(Ax}QE91Y`BNgR)lly$t(nVPOpT1Jw^e=&G9BmO}mt zbUj=4SI{nBK>mu2)7Wx&sP3&4ZdB(2=4qAf|GtGBfZc1Cd&JZwjZIJ6^kdllTAim^ zj}!xPw;Uc@$Li`r+@XuR%V!BOl-}6$&-i!W4bp^qpFwpS-b4!sY-uq_=Mg+GAL-dP z-I6n;zT+O8u*!VmgejF|Qqs)O(r^g*3F;E}!6<2$EWCTFk@n+*l>;P;RUS5pcc`b$ zVe8j>1Zip~0#n`IVa}rRHdV%V;;PHWE_HOyO-|zgESw{ z*=f9o%NSC?Cdyy)u{{x;J0y0s8Sm484TCu2tWn2T^h;IO^Li;53_tXq(Qqx=WOR#i zh2J8;`-bf`!-Xv8!#6apSFu?`(@XlR`>`EQ{wtyTtKsr?rx99gI2;8uvXr}Q%37Lf z>cwgYu5B?y>vggMDfQ@NQz+QtVXmdkIRNU^%aP8^7!urCCFzfoGZkM*IhR_HqmdYj zotneYcG((c zS{GY1`a$-XW#ZK{p{DRLMM9a!o<{=?e6tSff6*h&@ZA@ia?VQli3XgBax%LocTy1! zRISq#?(0U>9+g1SJxAXf`h_AXdz|#dTMh7FqZ3mfiKo+Ny`FaTqA%tOw?1n;5`0ER zd&JewI}Sd~&Vt3Mzr~?HN@hmOB3=TWFz2r@HKcAi5#T0ec7sk8yAlYw8ddSEL+J~u z*^y~ejjylK7gglgpt&NM(;g$pDz4-&C^p5x<$=ok=85^{l%PD4f>l*Qv^1!WIcRO>z>}fS zqojaiZ}}HUDo-n4=h97pFuS!n26jJpqGLwf?4+g8F^uQ|Y?G0VY5kC!=bBL;B<=`C z6%xA19E@JpP|CR@!pF26_5+KU85d|{`X1PyF5#~wUXQ*1e94REo*mpi7r=Lp#*n^(WY&}zMK}n3@J$$Jp>W&F24!zcj7ag&I z()?8JwCx_lsQI0i#N(yEAiCZAz2A4y9z=1k>Wb@ph-JpciB@lN+oGKV zAN#Em{0n##8T-j@8a5crNI39oAGEQv42gte+q4hwcqpO>YhNuBdZ=$X770CV(~4kk zs;wSiZJkV6we!nt9LAx;5M4m8t##4vbcL4|4ZDXr=aS)T=28fb0!!*&Wd3D!->G>$ zdPY0uELfYA_P#VT{s0|2{|}U&d7*#fbahvdb~k(`S%vsckn>eX6eEs14-ra1XS|iIzk^gUFKy+R?T&u)aC^T4uG!b5;(L7h^iDy0szbTB&i# z50Pqmm_v6!0u9Zl!QL_LH{^}@o0QgI6TXX@v{%s!T2p2lbOf3uiO3u;{`~yEvd0S; z3W_Y`Tj@N7>s91}ZjTpF;PKIJBo1h6hh=dW<0nDkIJlP_`yE zT$nP5oYcJJ>}y!xBh24KQ!V1e1sx^O`e~Mdt0Ac}zWp@ja6&qZ0Jx!(6pS~iyF;x# zC3b)A@QzA!>++ro(z$wW1CV0;FR0=Q^H`o5RMc9Nj?@9Jq&LJugE;vfE}odz&nru9 zQL;~`Dnr^bYnwQYbHt~7>r^FL;&h{DI?wfl$WZ0E$$4brkI}-S`LxOPy^b&vAmCG4 z{bw+Y9@zC<0)xr82je=IJ{wv#I8s~l-wmjA+xDOjQD-x&BU`lxOrkedrDT_12GNx= z<^Mo%Z5i1+{9C7f8mQ!!${UVBHb9Fm`$|4)>Ot}{??N~p@wPge@UbfR6x`9}j_d_1&COCePggbT~WjzUb)=)2C z&e-g8#B5>9$gi-|y6-W^!KCc>KV|P#lXGY!;;Y{iU)?)}AZk)>KSvsB2ldQZihB{~ zE+{q$<7rs6-JWUoYRky;omX_vLj5h9@V=uDl*an)>^IWZY$*!Sg`eMqtRlWfG|(sS zNC=Y8B0UZ~NYu6M%C!iFlkqyw?0UL{Az_g0uHt zeBDbRbd{K>@uuiAqhM!yfjS0rmI=3Y#|O?@g#QDtOrb>4l$+lW7VfF%A?t`9>iwOo zRU$uix!~bTk?vj7bfavj5IXU(Pvapc92kd4GN)-K<;C5;kR5M3x?I5daJBB?G>SPS z|J#tXN~LJef*lQ+>aR5E?u8E-mJKzDQmPCkpICjgn0f=CN%!NmZc?t8p~RT&cSesb zJ=hj5JkZT!Jt8E+)AW6`e5rF5pwSuFl(gNVoZ{R3b*lmAD0-i_xaYd^s_1d|{-9ip z(udDl3$xi6jIY2;T_=dmH%?8Rq4ZwIks~Q|3}zz)vvePw zS!;F^zFs&)v@~Z30{2?}Q^QYeVkxiYemuP_4=UINXIA2}2M=tjmOXf^7ox^8VxoFO znIK|RH5cpm&S%ExB$*Yo`;ZAv56RJQk(w2?RC^A){|-zMQ^6iGS!%K2^ek#%`JWEE z!|%ZVXJltXvx*)t^TUl=V#7H>&Y(NtzfCvPTk|XebG^>Sak76s@Z1S__rWX<5A&Y= zTC@1NLdv$}_GIql4Z55xGYlu1!qz#Y2OFP+n?;LljH2ypVCR#N<;39Nc7&eW?(aw_ zVAYzV5IeiD9@Yh!H0^(n$_heNjfTx$BJ5~3bK(DE>&)Y!{KEckN}H4=ZIUfXr7udh z#H?nYvD0QLrA47sDm9iuB5Sf`SN5H(4W)e{qJ%~$71>gjF|OZ1e>}gZ=f7U_n%wuC zdpYM^*XQ&8XoYG`+?NB^_4wTbd5JRcd!~qYsCN^3Au)Zv-(7u2u)Gdq{VZPVsWa?l z_-`St{{06^$LF#w;je{#GvAUdbCT0Wt_fYGsh%(8Sv%WR6Cd^17L<|tBM*NXh4@${o z2S)`K5=Wrr;v5wT9R5;~y0x;bF&^uk(1EO={Ha#mQdM>?YSHyGf21;;`GMRTTz(d$s&HGC-=> za@)p|ZUu5@jAm_;fP9j(Hc2F<#JIYB*TUIBHoh!$+THFLG;H~Xxs-Ie8w_ZHlS@y= zi1NdB*I}fCr?m8dYDrFHC8!hN>iMQS4mlnEphrY_%Rgu2$5PMlQC0X5h4kFw)_s#FKq71tKFk)AGU$29Fsu%<{lPNO-k`uCmYg4i5$?H@WgY&{;fLMz zg}8ttk9l37J1MBcbR~h9Hf_5U-S!Zssn2xlMbvY4^C zG`jSGu59h=pC?&x+m3(zJhpBbaG!lxymtqY2~ToZEue;u@^L>!DlRiE)jjv5CtUm2q5|LK!d?Jey$Sdd8GJ|&5>R+~PGhQ3KA zTU!Z?5gI3B8hD|q6Hv7`=%{9zKjt*tMfGc|n-DJ*RcI)VB ztj9uz*&(N%_8_0BA;T8qRhBwUofnYg;kmznq7AB(7H>Utg0|I27WqH zie7`wZs*)i){K2>}t9X&&rRAB4i~X!I{+Fln<&?1**L9qXEdg8Pa`y7U zg&W|*tde|zH=sP{**IrGrzS?>XQ<9Sd$@%Qh2^~qUi^BWrfIuSy)zu87B|mhCsjvZ z%SYB=1!HuI$AlqK$6-qsuIeWw8|-fnc@&S_*mJx6JKVY5z9!~4)R*ayV(VDtoGZ&H zu`T55`ZF7s5Shn1!opxoN_Y4;am54HQqslVmYoLp&GfdemD;_Y-?6w3Q~Ugd&O^`_ zWo1g8@E!mMV$8+P2(uu#l0fqp@znh|_S+p-hl$%TsskoMG;(ajj&pEwXWNyPvg^LW z7R!^^cyUc)y?CWka2=-e@^&TY`x_?7*)ba?N&FcMowHqr2crR&|*73T~jAz7<2dJ+cEjgPLSrk%AWH zy4u0bycul4X;p=*_7JUm#=I39u#vl6DSN6=hcR z5z!cmL9y{l(K}8R#0cKhVUj)X=@w{#4&KKwp&7pzhFxb@d8Z(YSn=*ISF?+65vqyV z(UGp31qPq#x4bNg__2=)&NIouRpOAVn<{unMI8C&xLmD5NtKxcedLIUL%R#2tBW3JIb@vzqr;MEZ$6=Z>Lbox=?`A6 z=;8l<<*_biM2`YtW#KRFk7LZIWzeK`DYITT0C25Fr7M&@>@m<#_Rvced0?N4IrE7)$fzzG9 zpJ|5`dIt?usNT!rn)I8jM}2#OU|m_x=VOGI9qTaCkPI3g)U=G*m zKdh?((RFVevx2amoO}ghdAnd3&G1ZPnx4M+W+HewZ>rsz7T7x_!)-CX%+O13aRgdY z(1#%1jsw8C$NU^qbyE^3`D>d!OU`CYpTN5*n(4VAE1S{16Sf2MZb%BY%I6`8bcur= zcotO>qV*nT!Hdh5HX&QK$iQ$bnH(YSw{$Qm{y|0^X2VZU&~u2hAteR`^MZ=|`j!Nu z{|mW7iF)?(Dr^L~96G8i9ijrGf72j1p>t^v@A0r;dzoHgH=7AnkBJB8lcp}hK1Yw* z9J?1RPRZDF`+ngkC-89dNSz)@>@op-!_+71OdP&KtCalE0onl^cz$wx{zvutF*NzB zH#X}zT08?vHuFpI+oF3=6>ev`Z?~K&u>6&`Rue@ReLiN5DeI`>xN3CjrNNH-1b>Bj zF9UjiOp{!K54tS;zdOy00adA`#^zDk_e73;Z9iy@oC3~@y5~$!YA$!Y?P~E!tfOfc=&0}Vif}}t@k7fO9;;iIIRLX! zBFIe1nT-;Oz-VHCR%5!WY8B$2dWw?p{i`=b!J?>j?{~eqP2~9Czb96Wif-DD$Wj)& zsK;^`f?GoBB2GPK?b7h=x8;{*gz`RapbhSdXG$GPj!(DWHTXCTiFY4W|FpiSar9p{ zkTqsXUeM1&{lGt0cY&X|Dm%#RkZyg{zSfwb`WE9s#Gl;vYA=b~iW*u!C!0dk-OJ%Z zebxXiZ`F8k`m%%`!;wINIiQF8ZGY^pixE$dNTWWU-SBHjP%w_}6jQgvUGRFu6JMn+ z!v}G7SGPh@nNkS$dCUrqZu&6zJ?)`!9VYxI7j|7H0kgF06x=t898f^&8!&pJlQNTx z!aH~H_R2<8g%x%1an}gpD?36R*}r!rv2|3>frh<`&wYk>HCO9`-45p$br>U%?b%hq zUC;1?ACGcayfo6krd{+nP44X3C0WTJL&>G`r8Z`W0CUv;s5w2=kpf=a=B#<1ZdK^M z8yx?(OJtQV5F_F?@QwHy(C`FnIDr!l1lrANiLDP`6;5-LEqzw%2YxyM)VmMAzB;|_ z_{4xa%)`d7*KbY$No+*8y?Nx(Un%oC#k@T;4!S@pkiJcSRpk*1m(%mqulJ$H5%h5)cDG^Avp69JAGkTt3bUaBk{umF0yGT_kw-{=5jA8llXOG0pKBAxYtbDhe{b~}k5ls#NK z>>?*5v>B|<>+35gF@r%pg+P)&qP-vHu!+nd&Kx$;I|PS}q<;G6KB}N>^+#7%cZHQN zm~wZ{bXj;?zr&*dD1Pe0JyIFhCNN5BCD?5-`lqfzHsR*QudObtfD~2u4l``J7Y3MV zF>iiNoBXOiiycngHd9Rnwe@ompM!`v*fjOFo*D=GNkj`md08ze+9kU#m6MeOPosi1 z+TAX1UeG4q2Bi=jPZARK-BTYD%T~g&L(BE=ZFuMlAM=E&Ey*`db6dK5-IKaQaAt5j zRsZ4q^~?m=m(wI-UPbJOK$o*&GN{AMDOQ~R*g8x{Kdjg4MerE;y8y4b;>@z3Za+frcoQ z3N}gacJ(sFCc=`P4{r%3PaT0ff8)+L-E(ng=)g_Gvb!hLB$*Ip_g21|d{t(OqDI56 zl-vC#SoAW>MP0busR@SyV39ycTw(WH0kD{{kAwJ{V*IC{ozP5~es(MDKHcbmPv)+G z(iauy&V8*g2Kf^jP4sZ`AD;ScmDf7{_AZWaVE4|Bal|d;J`VD9UU3P_MlXiSMW=VO z-G2c+!&@Tkid6yNzAS0$mso`UaU)SUMorOfLKZt5$DH+0gRjk88@k^M4nGUo z%|7cuf>?2y(}?AB)9H8UjpX^JaQ8ISzF~x3+NZD=m`hF_xVBbV7${4bz8S;nnPcg} zD&mUA>vn$vi!53try*l8tXr|5HS224C=}l#XBf_Vzjdr_kwZG>wpZJ3sBPn6ukYNm z7H&ANSNK=IiOxeCE&bbbJej46day@Z&o@bd$p&n}MmcP@w-hf}PgG-jI%dZu7}}k+ z@GUOyCA^IqKE6D>-Um|u8n3y(XN}kUy(Hk9kb&^oCCo^8a&CHkFJ|juXzw)ia!n^y za4bIGm#XTzn~s61W+{VSsU!*%etUH2%*q!j@R8A2(3pFI1b6Un=QWsRv(b&_5~gmT zudxBx`Nm`}$yrvG2yz?b!(|L~)wxq%Jzz9y&a<$P`#``kuV6%!IVI|5Dy zYcr4F$~iC~)^bejqg^AgAZ8ho&fe*KD<}_H>Ca> zikObs($ZqEuK-vC&x{s}VH7D4CatpE_;ngs;=|v!o%$^Oi?9?sEFbj$g+~m|w5F!s z>LJ36;e7G^ByTNxg1zyvF}w8oEhd}6aNpuULe;1*FVyel?PnqAK?nb8T|@c+!3dH~ z+4CC{PhX#o3r6+67^hGyEca>mxhMbKGJy>{$t^TDyCpTX%ESKm}a=z7!74tUu3q8@%)t{LT? zt{KV%!yX$cMp!o${(S@^*-~R@sbZpf6Uq#6Hh!cV4u)HopD$04 zvi^x39v{79oPa#xjfTA*;7YGvzwks01>AVcvN#vcTmdo4-DMa1pS$x%qth|xOQsCJ zz{Y5N>d<*@QE*l~Q7FUTrw36H#GIzou#~4Dh`iH;5-zCp_I)BM(43>Gb-`rDAZRSAUWaXP)ObNTy>>6&=PF!*B;F zT}yn`d&rz9k>mK@{{@TdDDmNGdXInE_7J+Hsu8P16S|A5jRH26c?{05N~Yent9k*p zNnVXs^zdkccTyuZ0M5IcgDw6f3)JhMPOAQi z*zsGt|0GdD{>{fiEJ(Nzm~oX)O%S3Zce!hNrUEP~6=D>3ijNGcF)>@yF;>fp09zfN zO1)iN17~b%bw2-3tOIWb>!6s9iIap<>^#?{jD%Rm$JZipCC4TfY`r(%U_}Q5gtV_gP7XHMt2ar``_z zlEAg0aAKza8(w5O8P<_qc#`iftpX15w#j+dJ1jotQhHd*YMgi(NReZ`+wY5M!=WEn z>I$~r`vRX?RfCVj%m?@;kJB+eifeIgpp;BWF;kQO3=xYHu77dMG>4Dxh@ofmo=uE# z{NvLx;{oe%(DMBX)o*&`dAOTr`ex_6h7mZ^Q$)|cp#Nx0Gw+tODOMf1ZbKt@gviLg zYh^v4N#xla3*Gf*#K9d?zLN8Fc;XTC`U8f0S(*1%M2bZ5HN^eSmX=2F0jXaze-$f)HbLF}pZZlk?;wty~|IF$= zuq1fMcA@csn>c6~IK<9=d9xmVu#~rL6CJXGDb*xeWg5n7P{y8MTdvU18ZV>&@KNnu$CbD4xp>QN4=Jq@OK#{PVkdXb3 zH-PhFX;8Tr6F^peti`A+M*-f2OIeY;*=(L>tX5f4Iz~nrnsFN*_b}6=ApKhEA?1E# z$bXgd!ZM%eIl(=%#>#svJRQ>pTY7OV{^G=9xTqR$oEh-@s@z9)O-H5KcASh6H-gh# zP4$rf54q4F)O{4U++ziD1QbXbQ(v4IgukRXGW;dQ`3jKR?UJkz-lGyO5R-#C-f+61 zQg{}(b`CtS#Rvw#J3j56 z>Nrfe)sHMy%rb#U;}6XH%6_W`PwuF4m>Rwb6u|FPW3daf!-4&^=fXp@EP>0rQfHSX zyoGxX^=AfRwCceWZ+&+msf@@N2hwevQN?8ooj>jmuMV1=KPauXAq-Q^U8 zmbl=@mcc1P0XF51__i^&g5n)HAy?0HfR{E{XB6+!#tUz$b=eVz?jLZjMH~Atoe5!~5a4LiZI)&M}44g=3nr**)mXkB>tDUaYr)=6RHB@ZaKZgLO4> zXlmH<>>j@FiZfbld6@R-Z;SN>xorNLQ*AMXzV4 z(QbtoLBA=vU+jO*^xWB*e(7s9G5E`J!b4fbT;7~OL;(}kj(@$T4~!B>nrpvH#zOPI znMv}P+WBAc21Bremg`qjlYjwH(>cQ!%rQ`&h4Qxu1!9USzN2BeSxHY_@a9extcVwg zz9c_C2fC|q73@lbr(=m~MN`8%>x2ma@7hV}=jIUx{|E+p>(G#9!>BOfwd(_d7huHq zw8pRAj1)|NcL|)?q~wwCzU##YtAtFOZMzBkjeI3D+t!)Wbt zff!H;ks;i=JxzxoR-JnEvioAw#%P!Z#x@{-Z_f+H?JLiJio&Cz;aScexc%kqjXfkh zo*J&Iup|KY;dYkSnWv=?v!z+JaUj$kBE+<*_hbIk81$O*!%hwNiS7de<$4D-@!S~j z6yFtWLWW4N@t|U743WIqaE?GscMUiaA_VL484+-D*vF9VhD?oH$3j>3Q~b4glMgvh zr`AdK9s_5>f)Di!1e}gDdE)y9o2&!25k|$8G~Y_DH1=iw_KK zywg*|Yhr>49ivV_deEtoJ6eOVAGuDOevsY6Q6P zH;|7PG!w`trBM(8<%GVM6#UgjZiEl}rh9ai8hSno#VQHjW_G}g_!FJ(jTIAo6=Dks zRcNCa-Q7Q)F)LqXe}q2>Fjb5Kcj1BkOKdC(+#Rewjy00U2u^ROKZ1ZeQyO3yfvHFZIuwHjt?oQpA1A_9^b_W zg1BP|A?Ml~$j&J`x4cv34-CXDX(7iqIPwnS6Yob&4UgJ_D)BL&$o6#LzPK}dp;G0Y zEjoAJD}7@0m@i<%#(u7UwR2QZknJoa6x)C!g4)~flx;6U6a z^cBtD_HFshQ!amgg2#1ME?tY@#|gVkA#sFHqf7Wr_5`tnw;XjjZ^V9kX`{UYu3kn_ zGkI^AP@=m=wLbl|{M3+w>Sd`f7kaio2W@(c%TO!XfWP&dl*avWC*o2VkvFVm1{rltrx`C=C8N$Hv3pUp1R$1OJ> zGc;D28h+G`9z&}P&^X%z(bUe6tL0M2NIujj|>xs6dI~uagf9RI5Zkvx6&nZ_rcqHbvw=LR?0ww zmh*9Ad|5O1yC^PE^?D$N3aGIEDA$dg36D2Ckk#COVlnK`a7q2>LkQ&<%zJ-QaXAK^ z-oYk;k^1IQJR~(7d=zCVtvGGWMcCv&OUZ#y=Z~*y?Rwt>60X-YSnE*#utI^E^TMlr z&sciB$JDU(nq_1ZlvjX@?vc9*HH4LG{`H^+VwS3|0y5t&hg7%|87i}E5J-C213X($Z#F@wZdLoii#2Vm`ti74n`J&Ws#RN6E9Eb8g>V>e02$ z&D}|!Mto(Xymp5}Hgvwn{s==97pJWQWZk}EeB9+H5Oda)c=(^V>!vWdEsj8@iO<88 zEL8^|&8H_E9Dmc{$gY8CMjGM9;CthzQJYTR={pW&-0dM+A~75U^b{o(MY)wgO%4~M zmX@95xy4j%x;{1R{}oP>h55U21>M|Xv3|t`7u{ycV5-Lg$S(zd0C!c|KvMm@zo6>_ zPe=%>kw%6vk@?sN>rDp+IhGS6W%WWrFOaa1ED>6ZjfCy`4=ig=l6Hc~_EoA0O}H%1 zxH?MgfYc`SS(#~e0dg$F}~Zh&A< z{lOtP>gl*AmFRbi7r$7$)y%Bx@PF`|+_Zdxk?@e)edVY0ujlfEXk@PQC&<6PWCA;| zZ_m1}$-VriG82PB-J%+(zS|m3Ot??;ssA__NAXBFn2*;0%I<}#*wBL`ytjm2AjQ7@ zOUzzC*;=!xODLz#p)RN8G4G?el+Qva2QlIR%|gLDS@4a5E))0MGYU+`?KJX@sJj5Y zzcMb|AKAYFuu|UmViUtBc|(_)miE_fO*QTVX*Fh5lhWF3Xq?jc*FHKbxvZX24X)S8 zp|Z@j4bVyqn5C`4%8@zR>aT&;^QLag?pU8fkk;8wEk$B*rc*1W5$ZGul!ucvcG@a+ zFlZ@#`sZKH#WRhReXy7s@XnK+ozLB1HO84P$p$pYaet(#euhM##MfBnT{adHc)k)7 z5@LOqr^2g6YK($%gC$TH_RMvLBM-O!a^we>BaVE3?MLnwpgvvLM+n>80`YZSe_ryQ zHi6jIJ?F9E1NV6+tz9JXYYOdDfx7>B9{swvJMa9l!CLe2L3C+S^Yp3l&L@xuPGn!5 zyw#!jsVUy}P7H}!$|3jkO7D8bg>5vUyp?C@y}R)WMqv617W&hf^k;6=4wZcaoAi{F$nXWn(!u7t{q zojWUx$~(CemAI`$@BZ4eU=Ttr4i#YYIJV0tJN9eFubG(=W(g8@@RuOb4?k<}-iTdV ze-?TfY1o*YE1hF6ZxSyzNCw4F!Ac^+sB-YgDv%WaW>k_e-$d~tv6+fFVzFzFb{Kl#`>c#`bOI_B$y_}=S` zDFM^n_`&=m`^x%j=N)YUs&1z+Gxt?2FW{lEtCF=EI`H#|4yuxB6%(RMcdY#$r~PW$ z+z@?S(uXjZF6*i3n@cD4$L<*)bVr|(pMwz1qF@8jpKtg?H+KnptG{402`s}F(g2PU zA<`Z1`d_Q~z`xG2X>ptdETZLYTnDt`0Ey?ORqq9L-_Y@kS1qPN)oNFIhGe5qeNn_z zhEvDYf^|1Qji%<;MGIOCjT86T2IO%w2u!%VYM2mV!-ay=ZsuVP$(}%`ofB1}l#zh6 zaNpkaqn77jNu*64gBqq`SW&e(&oIN?#DNJjT89~_1I%b0W~2_&Qnh8(Oq$RqRlq%X zsd}>WnjdTny1iKZz3^)!#o7HfXZiUhf}sA|szf{56J7XBxq*LhCs-K@wEma1fGJkzkG1db-F2^fF*{fNi6ad*;vCskX=R7&pVf7_c*^>Y%VPrAEy_*?^S4pyTujRXl z5T&%LtEtSLGcDwd9N;bT^!aeV3?I;Aeo7LKWcHP^FsoYN#wXkZ5zUjQ$MlNT`)gST zl<1I9xRH`g)lCLrzk3a?jtj!!Y0(naHNTJF25;zI3hb|qU84&0$9tqGkr^$(2|Gv8 z82s`OrihlO$#Zkb?|7)7{52lY)Nw91~E6A-uIxYm`H3=jCY z`vt3lR#-A<|5op7f342uB%rfxt4L8cHlWh@+)^CXCjVEi)M!%6R>-3tnQUWuo;5s$ z8F_g*bDYyE0X(`}Z8I|~%228K*e03OAu*Am>67h#%|CD5PEP=QPR6H*?d90dCV>i0 z9d^rv6RP9g0Ld9=)r=g?-YYX|#y|ydi~B>rG#JhRpKn^LN0e4KPBjF_cjo9Y9{l+M zwD602939NJPMnU*YgA9(#aM0*8wqz?Gu}~fzao}r2REv}(r2uP!v)ynwv~r2!$XaX z+`A&i&%ttn;1mA9bQymQr9SzEfi0s1p>Y}hE*txbdMAF|!Uq56dBKSRL3#4@a3v0F zuuOBES$cwyP%?x&F%;*2A}4Yl-;rj0$vHcefG+tyu}DS<4NekoePC3tdEK6}4l2H}3b> zF1F7?Oa)D0a-h3|a{ZNa!Jo09)qtx4hELiU;Z}MpjPGQtY1Ykq3YRToBq-NP;&?Xm zSMECPanQ6482gumup`bY@h(gnern0*poi+XSqEdEdjt;dr@dG=Z}STg_zQ6&!VH&q z21`7BwP4{H9-_mNP~>SOX|3+*IDxWGo{-S$=w1fcoDLyI`KKAyE9$Qc7U$yC)qVgY ziURZ)??#@|kljLgDLHf;se=QINdHMPr}Fm=>)_H$XkqbIqj4Q`q~fL2B!wtv{q~ zBc_+0-jT6`seWnzNI9WK&Aa4pOvLu1i=IJbeqW2&{nw@rkR2Jn(k_Z`(=n-=pfkaU zf0A`ec>9KWvNg?Jv>spM%mSvH7?Y7pxRY=#W{0SVdHsW-3$TZ|JSv|aIL;laPFvCT zMRR5)zPEEfb8Sr&7~R|^@lE@Jg&;Go9{EZmY?$1zTv_t1^}mcY_^0A@(9ce?vIVA} z_b8=e*LJYrv3ozX@6dvvhI|Go?bSt|t-TAqqwcM0GqRP_R&-F)9>dC;!6UXML@|)a zbN)6#E>Pe$U6m|$x2bz84F``f7noRKV7+_ z{<1GHb2nT@`OB$-;WA82pEL8tC#a;98N9wdTn+rhpSX=?X!-J;5oL1P>D6UH7eO)1 zJA~O`3=i1xy!BbDIM6mY+s5X@-!}F*pL{D{!C-R=(+Zq66GKif}~x}nm8tDIPo z!i4wWfc3g}KM)MJ9VAC5?@)vnnlU&}wezZjVP>CbJ+9)b(|}18*~|=%_JFRpZ_Sp; zd^iOMP9LJ;qVE*&78LIyr1rS3EQKQGCcYRgY8`jsjuE9!wVHY~?Cb|TrsLWxz`Qo4 zb50%E@7m_93kQ&JGg1EhMp^%9=XpL$`j{~SVPID#Y#E)prwFk;w z%dx)VqQ{HJzKrd9*+9Sf;s|f&rv2DAIws5%*vLBZMsBfsd>{To5UJ2n$Rqhq4lBj(RaTRz)mI*89Og@;G2?N6UN-w(PI6<*yKP2Bv5#7s^WV0C8f@_wKXP z%5Xc^WGOS%ehJ*BmCg6-+_;DTqgWIZdGiSi)n4~fvt)kX5{5gtrnA)>zpn$MorJ)L zq8Im$-Pw{QifOp{j0Lg^n)nCLk2B!#vQ<%X|FiEjI0JT6#~4bWoz;q6T8xa)FG!`A zCoI@A*$=Ll_}Zknh}FEWQBgm?iDFKFg$~xKWnU>iIvn}F?#-v7R|lbmI(@L0^;6;z z@()y-tP@@01EQJh?N&PI*aEHMaY#tU_h~_ZD2BxP#j^ed$@KCO;V*rY{QWI~VnRZT z2ULK)M@*NRSy~5iw~a3?Mtd`uzA=aP;c1&Aw2wOGz&kKxd#_nQzB>pxfxG)cv&$91 zXjyOKT6|U!N80>~@<~b5uLHHA!)#gC$83l=?}~{|-Q)Own7Pz3jhl|Kf9XyEwW@5I z{yzN&(=O9V6v)oc--5P;g%UE3F$=!;y+PsWFt1=cLB`@rUXdpLr+P ztsp`r7QDJ>w{lFFRVagAPY++fRd$j@G%-{I(pcLg(<4pRLZ#5f#q#)gGhT?DX~~&I zl9(>^rN{hVw8}$}^1*>QZF1HT{A_X$Zo_ADxH?{zm*#tlV$OqK5L-pMf#nNp#6L)J z9>%Pn{w*ie;}Xx__Yn>sQCSF3s{AClTiy6>qXt_z*0#a26Yz6w%GK}}+Gvbw zUYM+%2aVZ};Tbjjgcv14?iZ?KZ*!ASD7t723)a3fDsWRwfIZnwcV=>_;hW7|E;aAJ zRFq5IKO`~=0mdo43b>LMl<<&qBp~a5)Zh%~YH(!=?Yp66dc0L-`vMAhGJQL`i>%S0zK?9h?PXUmK!u+;<`87F#*Gd9qenQAB`6u$Q7l{5-kbGu@wvMDZLcuuL-z{My=%Raxf{y#u4Iuwn5X?;ns2S>?@FU>Gd5_^?Y)I zjQ6q^yUP?lFuMV%VrE4#9Hfew5yiACz)}-glZ6p!1Sr<`N)Q`-LYTH@qdAnOU}6kw z2u#lg(aYsy-JX(~=+jtP&@fqZIg6OD0dH^jwP3_QHG}Dk1uGBI0`72^rvA~Q%86o7 zG&#|v%d!)j16tF=xJeJwUW|dlyS7L#26p?-6x6xNpG?VHvb$JZca%#mq>10 z1&+*g2l>7$XgzoC;GS>B3v#DLF)yZ>CKZKX@!`2f(Bt(2<^A^EDyNzn@lvl@k$qy{3&6|!fbnW8d>-dTaDdSR2bD5~Y5$Y-k<5x? z?frl+JKNug`xzrpZC7~r5*0*SPnJGva>1gfMVWfQ{MTn+te}JV@{eV z!#IQGH7w$40ER)4CaEtah9M}BzzzQF?>V+;&uURju+2FWNO^gbl&w_UJGjFAJvk9w zt|?d^ViHo$WqNTKrLGEExtnIAiEG~7GKs;60T7@GdbO*G}O_^50*d$Kol5{7IV`@8RI!ryu+jKnY z3Ti-*^mBHLw}(!@6B82hYD_h~4(2~_cMA4=-amFGW~aI>Y9CI+UDMQM5sWBH?mnw^ za?(2}!81j-o!O=fHPG56{DpG1=;wTa-iKghLa)d+g^=^_u{ToIm%#ir@7K0e(?(E! zbTT8@>DkDjp~Zq`Q4CW*A55E8PZ-5r@`j~VTdwj)%U6Pl^$tr`*lh;ycOu)ooS}HR z98CQqH_r=plVG5BD*j((dJPzzcIEyrqyB58rzKTtneti56nbX>*-{La` z69wkB%Teru>CN5HOUvlvrQ1IP-?-J)7fesLf*mudaOom{96#u+C}!y^QL_^ej%AjG z*15 z!{;yYL3<$kM4_$Yx_{-u>X>|ZZDFQou11W3oVOP$8ztjJVMc2(BQ@a8Xblq8#Jp4B z=6*BHWIJ{h2it2i)+g`g6pU`Gi!SzN&(DG~HGaic>lKT@v29L63@1o)8e)DnTOA`Q zIBbUC6>peHX=|o}pcI}boWI`u6L`n5S&x%WmW)MSG!VrYG~F^o7+qmpKvLri5I>V2 zg|!b$?|3;D z{aYZ4aT`fDgCOZ`%!GNzGY3oQ`>-?N$EP5)!0dEE7SRVDx%1za7(PcD54C-2CTD0~ zoE1-8Hjq!PL@!5~PtVNix!-MuFWdyQ+SaZx3TaJdf8IGZ`8zq+GM}J>;AK`P{l$Sq30o z#;h!Z-!7+)Nk7at(}rdHX=N8S=XArhT_XSH(z{8Frcaqcjg&s6s0wwK7hc%*R4(>L zI|}>#z${d#ydSK0V##QkLd0uPTlAQMEZxy$V?t`_?&et}*RK_7LJA9wxBDe;qK*Y@_}j7I zJ(=lPh+?|vu-81IlFiBjuoti2X*&sfp;#m0lqfsu8TV0Z@#cN=MKQM_=Y;w0jRwpV z&f(?bAICX&ta<3BsPMgM{x$$w*$<-15^^uYja+(l4=4ULsv}1IrdMAS;df<qU3c^q>IPqTN+B$3kmh%p~;*lWGp(S+FYV?F)nkE`-0)$j zBjX0@cW8f!J7$Z7l&Kli`yMiZ0uNElN>aD^6MZ<$$n+xaKGhH3;yykSTPyP!0&!uw zZUsFT9@!Af6l4VX32*FlC&7F?`ZTqm`9S@TwQ6nMgE*50KA7*VbY|vnbm56rZq|#l zmg=4&Brc;4iG>-RAPcH&aF z-MO`xr;+dOmnk#|jM0F=Q|kj3XI50=z{hgg!IvUV5mVwk<(fVRi^AH2S48uN#@iRn zt8vIfbBlD4#kNb6sA1P~+Ec`l`g-bJLO`cvh=rt=BeFL3``?#%B`o-;K8TDl(YGwX zRrDr3s6szru%flPZ3tanImpYh=!|+mi3HIRv;)pM!U6>To#p;=y5<-McJ`oFcHg3+ z^D!1;uj-xln+nN-|2np(=$6RSAk&cSQu_J1$}~gacuIvuHTD%4g^r2FqrxhDJ*Rka zVa>~5z^H6*HXQlzN5Ehxye+A+ICdMVm^kVV(|@@2^obNJ@?%{*7Z|RgMI`)0G?X7=djr~j&PSg`|_oT=_H3P_s)0UEH=EK zDHtBY?~WD{7Ys+CVO%u4$P(0C?HFDMugxFa6|L-19E_T~aAS$(?!!IoA`m^X=XFby z)n}ML;MW@Y8Xw2$7w-iXIgfa~L%EVCMF7*N7%4R$a!Y?}^|6B44@s9GjMsS+#P zEzLd+4wxT5cWoN2=gDvIo(tsdca9ahy*3Z^_S$X(vjYU@0TLlaU#Qv{l>;BhR6BK@C3EM7nkRx9* zU~tpM`>iTypy|*fWaWQu1Rumm?yp`rFaRTR_Tj;Ycd&{icX-~}Z=_^*-?I=LVT@x zWtmkJ@J9>HL#Os+Se3)RX9#w^KV{+Arp}Gl&Ip*d0*bAceSCw9YT`<772Es!p}ZP; zn<hBCkXaErsucc?KryEQX}zgx4{f;JC{lgs}fTW1~*Jpo7V9UrK+7xchMo*1fDrWZ^Ll=*itK6-JBJ`~$FYNPCv>tMEr zLU{MXXB`N9>{q|Ldq)-Zvy#b$i}C#y+@SCFc(+>F!#@NtucQQbI<@zwa%RjeU5sBpzh7S&)uV|G9_ybPy=sS6^^T~= zf%KQ?^dIvxs0=sGc%#~tHhWs%@g-O&rF5#fZAt;TW@b-|bhPU3Q7z7Qz9?ozKYcTR zgVC?5e-FlYXx06U*;fR~;a5eXOtwnEW&!1(A*s(TG?x}F)vl{VOMPg{5K#_2v$F%b zHr`hIuP-uyLx0Hz^lSQ+mFl`S0{tLkZ&W*q2%7k^7nIUxB?Kl|2WgyjUC%Om`p}aV zH?q|??J6$C|)$SOqaED?p9}r{S`5cxgycHbp=G?#O^zpa90U_pVT*JS01`8qUGXt?^w=4BUffTNoWP1ET767?q6JzpdA_UD7 z8q#aGMABZIxS`s`?0R1xv@_iZx2CfWQxCU<-O54JN*W3W^g|stDcm8^Y^pw-_Bf*x zyL5Ky14Uo0AygYGw>;*dxNvzatA|6AK2XB)%xtjz)sNQXWU}f6e#- z923mIZZMekQa#$39OC#Wz@jrk9?kLZ?|2Oy2)95fcn@#KsM@!Mz28WiJMH)lTF2m( za(pAxF4T9i6^xR#QX)tJX<;6R;$m?MHL#yo! zg$GAFnf{cWLpRUP0H)a9X_VNN|L7~5u`t?SsV6Ar1qKxXrJC_4da|>A_EPw($X|}y zK(v9_o&klBgJkFMSD1v>XfpbR#L`;^N4wC5Ih!lKmQ8RwBP59p$ty{T1`sMCs!_eU zde1*T$`AxU)y-&rEF*QqY-zXSp&i+$t8cCzb&(-b`HK(AZ#V2vX;JbUiDil|S ztdmP+{<0K`KAwL|L!km*hH5tqLR3;|&kZ!9B`}yXRlsIAo}_}mu>j7Ib`m{&!o1L& zv#!`myYv-VbAd-V&W@d<8(M@7ol4#it4Q3lqP-kHuJkOw^2@154c&=wSTlL|Z(Yv| zaQcXPU1rhSB=FV>m3#H#*=>4K5Icui+A%|Ci1|dk{Zh=Jdc5fHGkfyyxTCU$@ZtCw z_3A+TXppimddG*k~ZP^wfw>T5$+XJ!2 zaKXY*vp-)e1mfNu+O)f3J`mKlpXz^mQX>|Nb~Az)Oi6-)5N#bF>KA2XW%a_bsw)>_xpF4Vf7pQgq*gW>+Qvm=ckc+?1tfJwx2>U1)B8FJ(S9SvJMn-pVN*KQp3r*+vSu({>@Ks0=+~-ZVhf+ z7KBmz(!Bx_gaO6ru9&=Ft!>SOIDvIZMTWI(_kdU&*bw&U`gxFB)9iujnr4qKhZ-{G z0wspBV6~(W(=tggL>cct{;Rx;z-}xe8v@U%6wSnKEGfW!-DB$Orm=m%fF1Z-k8GK! z*G}A=pPyz!)Fs2?`KML$-gZN;St6!1^;i>}OJjD>BHwPN+!NbfL7AUM(4D7-JH^SG z+27&Ur;Rm1RYRv?$7U0cANZn|2QATg(r{}=tsbP~?Dj^80Hmg7I58V9(*006e zl6Y3*Z6mNytPs0FJp^^fQ*HoR(dhi z@G0c`hGssaGC#Y6x+&blzfnn<;4T79Z0pXN{C^^Mqo$zSd7xV;i+aKJW#&&7+CLluWUmA z?L$_!A@sVl5m?V*4x=KdlGnODF=96d3BI2DoC(*LfHOp;kYw}Bn*N|yo{6X|XrvEz ziJFzk7tUD1w7sSxZ|XKZ5WJ?8dDjW`zl4pt=cmt#?l%I9gVowGzw^o|Wd_b&0vjYS zK_G!MdhOPwm=D?`8#jt>$=d@WYcylhwpE%jy63dbN=8l}cdA1~?2Qxx&!QrOyIBIm z`sAV!8T8JpH_Berm;&SGQX~VmJq@ce;I}%o$EhCk(?zW2MlgRgSt~Kb$q)QJ_&>e= z)hY;I&9u?YIo7VW<|KP`og0i$uZuY{MG)m#tICjLxC#)e(Qr zKR<0C16f8}T?ZAb_CfqBywD}#z(HUhmA4R9&Mzdt5mg@|nnYmlf=rH)S)#e}Z76*h zs+g;IO=t-#kGW(*Hk#iEua)CQPZ?y2(HHre(0Wz-{wWxZ=1$3<+# zP5(owU)KN3Pd~GP*GA@H!`c;Q@S?Qvp*Yuni34TWi@^Ndh&e?MY1xJ9<8Gc`7hJb| z7NWOL8-4u@-S~o2>g4Ar=_F*o-QETj5(Fw_{5hJ)W=U`5ou97TA!sZNV^%87U7K_T zXn$VDy^}}8=q!*j=3YU<0B)TJLc&P*17Gc@ut+3jAf2VUySZ2rP?Pn*Us+?RLO&uT zRS(hFsIa}(!r)c^UJfEpLQ%q z_3-Go|1?tTd4gd;{PwRmceaW`L#LQx@`u39)YKR5vh&k&L)Kt?L;j8W&Fex?|F$iV z@?ZZ}1oluiXpHuSuIix< zN*W@f5Zlb13KdN6fm1P)B}V;&{|q)Tl%sRmPZb4geySMivY)DmL-x)iF!tONq#iAE z1pfg_WN(sYGJEQlMs|I4a2`fpVU&7B{+H<(ByZqW(w)eh3;Ec?AoEOXcl-Ib(-*IAumaM-kk{Eckn~sw4qh0_79v;4Hq`K^mLZ4 zy)-}FF#g)47$|kbnoG_;*T?y`q?^0`n;JqeGh)yd?T|pe;l2lQz3K$5GOXAJ_+fIj zu|&IahHRg^@G>PJkA${6@RrT=T3r}ul-%vy&W4p(U@meg!|v`DFkJ-9ZMDn@J3C2m z@`+dhRKjY+RpOcJ~&A;Yjzs^JdXCBkH#QUe=uyU|`oDUzF{`T|y zbfBb^DL*{^suVG#VZ9C7+itZn^&Z~=1uv8X-7H&v(271Dou8I(mokNxgPXMKu_)!)VTJIUf@iaVPT>l=6!PK~2G=&EDBJG^@ zLuq})n6P2VSUp^VKA7gOKZU}K(Vi$&GO#b>C6Ys(xU~U)C$E8WgePD_-~9BI^r#Ts+^3DZkY|ApKbUEZz_d@j(!X^gRi)f z5&p;>W%Ni~1XlB6iD?~tC92(MF382gfaC&QHU`M|x(jZx<6GtZkn2Wku`H zMVV`5ScB&lX7=5vb>CLEGv+fQCbSr@kgH&uR?G^yiryMLKmCZ=(~J}REAWK}{#7f( zzV&atTP_A%g~&3sgQcxc13+$DYQ5a42Dxb4j}m`EbB*?<)hil`q6Wt+b!AzU@YtK&CjQ` z^GSC{@*xm66Xm*GA;3OAZaOB zFyVl?OQ637bm-q4NUSrISXxeBkH(9cw}6BaE=!Ia6$@uyox^SU`?4SAW(oJaEAaia z>6W

    A!H&97?J#YgPHpy@h1;;%(8tU9Q2ejeS}Lr{#31M?TV~I~B~U&Vu=cJ2jdy z1#iLs)c%^U2*L|%T%^C06)sW)b}9-~%tP4ksHdHRe4p7TF~Pr|!P4!J?Sab8Y7~(d z>B&lan9LW!%$%KeMd{`q7%)n&o2QbD!9#m7q(v)yBe_VjBIrZdJhIaJc$*75?NkpW zxm_rk3qIk8SuQ|`{O~s~TSj%%PK6NWIza!zvg%>KAfV)wmEaV*a6|<5=V*vI4#*}- zVL0Z1moReAC}0Wq>I3k!sU;gZ#`w^lv(=(8#u{f17q3TYgks}4sS!*Lz8BGbmw{Jz z%p#$VWp-ZTpFnYbHIo%z4f9%Y9_VBe|BTENTjZuO2%nj{!XBt&M4 zdPaa`+-HqDT5mFFg}JZR{jta5EPy?28@{T(_zDQlzYWMti8}&P_G+5x6G2a@`(1ul z>vvzqTY%d*jc|95suwJN+2?>bF~cyvoV@p=R5GACw!`pI)Ou%HAURtU4VqTEYU z$Wk9fR}Z%Xoh=;dzoSjn{z%6MZq)L{vdJ=R^pndLlw3$6M!a8IVB?^hH1<<57^{O` zVDUtIol5DK2ug~7w)7lf`Cs(hx?%BHWVLCaWUAY8I}JGMamPKV@0` zdgza219FzEes1CnUDZAe#)}_g3AegrHS*YY0)#%|7M(jN6AdQ&qX=R92;l}_w2QNmp6ukGHwoK>!0@3+b|YjV>Pf{g~+uHmlRXPgP5G zNM$sQgA-qlz+BuH9xM2e^IbbukwqAKwr=BHK61mFpz9VUq$0a#{+>~Uu^E)A3hg-7#ZskKg>tQ>VP-=B{arwK7J~du6ni% zjl$=LeZk76n4lCr$W3uNdR=~CKN?7o_Jw4%r3PtEb3b=)daH9M{J(K#OPvZb))7{F zDx}d97`3`!NMBmWdmzA7b?BzmCB)O$uG0;t4)@N?-eIX!cazDonuZT7TCEY+$5Lqb zrOa96F&L*gcx9#bNlEd}W0*d1T=;G4(_qN{i9heJl>9EOjibTm>;p$ zqd*?9F@T*yBGG4CbkKF)wUq+vkNV!4=_#u4MEQjN6ryYb!fdWkHYo_RnQ%g;`qw1b zTW{oNCbsB6V!A~kYr+BzNDs!$Wt7S7WXrBoLACohYv$1(xrQB5DzyM&THHahsoD-O zi#j#AOsJ=<=)A*)p0k6KwQXO!V#G5j^B+=r{`w5Fc#4%`*-Kd$=Di8QVZ* z9nsrB$4@Ivd^-Sp zRwJh7(UkD6{}yBBv2)cBHBe5 zNyG#U+#Iv!J;VYgNVLAdTy^wB5Rx`v1d5ZXG`@%CHX0 zuL9Lz+GX>D)_#nmei9gr)Y6hQbj!J_-LdqTr^c%8)Olxyko|BSV`E;EN-Tg-jJN=~ zGygTP{0Qw35LOE$1;?D!EDMzGk6--m(uw}X>qZtE2os{JW%#Cdg9uY}${qt@PB?tP zM5Em6fFU)wNAr$MwU7K3u+jdMshTb34oBlR$jbirTx}h%SOfevdVK$s(|XA~9U1Fq z4vANyWt4G6*~U=|flxz7(=2K8j~J?|=vP|UsoOwN!Hja$(H$<3CTaVRIe!obc~ly) zQKaBH6>SARU8MNB(ExtXXB?}@PbX;BaB7}RH%F>2H*AIUwZ9|8MU}% z^Zg(w6Vv#Gg~bMDuJjUI4Rt6MHi+|b3}3Uq`v!yN&3<#x6@#JbgOkl2nt?`Br+j_s zRZKIRdF+*blv;07eX&sUF6o{~l)2Ec6m|hXkbo9{8`(LytPX z>XVTPdn%KCIc~8HYy#Uk@zw82L7VoOx`+4WJxH=15Y~)g^in*Gu(K~@s^8B6*+$#< zlVXT8`Lf!dzNL|}kEM zGih@qLK3ZX2OXAv6Jp@WX4b}OiKaXt)-tdUbs~Ehe`TsY0%mOHwxE3VQteImo-osM z#RIc37~e#0u$5WZubr8ZL)kVb{j}DagkB4&V@GTUWpgzlc#lVFewk(zSQYM+&0}Ll zwA~<`DaJmGz>=ROm#XbwLQ0>p5&Uno zyneTtq3tzrE!Iqli4e^L=0|Upk7W8G&Y`B9#p2j~iSPb!lCnA^s~(0P3A#Dz9t zINN-EQ0bmYKFoKkgq`x0_(HSlV}6JIa@O7!3SafB-g~Fki6kkfw3iWafT4{mG$&PV zpzWIdb73H0tFtYTZU$@AH3SC7x=;hsI9Z3??c4ub&F$X{RMRWA2R@$AfW}F;w-y?f z8t`-O>CM7_=d__*=WDTLI4N=I9d^C+9a}N0}k$Q?lCR&Vjh z(t@Rr!A4R!wj~WaK_#3nT$#P|-2$a3c23YG$M!hla45D)WG_?>1Cz*q`A=0G_l@(> zee|zTZEZi%!4G_|JnVk!s^dYpMKkY%?U5+j$B=FF+cy{3ZU()#%6ad(aH4%^FCWee1_LrRr(ft!F*eM@l})&yZ|uqNsz1Z#SS4L?=~ zwzO1cT$LjQ{Jc9^I`SX4K)*5PFReQg*%WEi$ilwE#`nX3t--PF%1zrrG5({{ZiB<} zpyQD8>m@$_5&51^XcT|&JM0$tJ#1@vKTtJ-bW_B;mK=0MzYU)QU9y=+!hnxG`GQt+0GD>JNE3huAS!wl*Ljb zXT0wYhW_l)dI|<}gXn^gRe346#@Gc2Kh#y+jD3>^_Y<|13ALq)lxd$!8nZnEe6C<; zrH@yQ5}D2JtJwv)i}q4v6$q}fBSy@JWU)6 zml7EE!s=XF(BN}0tZO?nFE|`pxjcr76ufvL~kvX9KH7UZa*vP z^ASEAa{!TvEp8W2eqos6gt$U#FgsN14#?GoN>Kc+v9()at30pDhj(zyqfvTNHNc1lqPp z=ZIH0++>^)$9nI`a@bY@mI|$%u|GwoeFx71w5KwKHP#$A z^&;yI8y2iU?=U!Qo{&`xr-f4X&+`v(ET`f^@|95sYUp}A)ZAA*R_?!(3D!=XL@4mf zjgr-m`h_kkb>oD?sLd=WmhSgm;L)rDh52m?JF8=wfsj%f^qcsKg>g$9n`1HKAgu-$ zRGJEZL|UoPiD<)*&cwI>f`i7YC>FY~NEG`=YA^IWe#EYNue6{1l2g(rmv9&>h@jXR z8{euoI)dVP-(MB4n;RhCRNCT_TEtIsPRIOp`BZVNJLs=-B;89TRKq6kb_d(yq74~nBz?>jb>y%UK)p+|@TFG|KIg+)dZaeAtmUqui=rJ6cf|Gy z0Y297@5MT$)9`Xd@~A8YtM0{2QAR07C{5S#so-`{Dh@fD!i>Zg*=r_hl=ZaQjb>n2 zu)TMT9e;bkZp~7p#!>VJo;%2|QkmS^4 zHk#N5<<8VCCB?(q5Moj{C)}74k1oo&W5ID>jxK079nKbL^6vqc)vBa1tW_n284)bl zPc95c^+q5nCUv+e&?i7zM4SKN`*UAlTKk5;i@W)YblcnF*neW{oMNDJUNd8>AK@G% zw41CLJ^)eUR}3FCM2%;`E*LO7!9ylt0@7?sQv}Z;&n;dQ2Xc|P2X{GBZ$c=o>^CoE;Gx<;_Q;R%Y2&IkXQ6pNaI!ob-4|XX#wH=M;k!X!+LJ zDO;i!Y5WYUcT10R(#d>XM9f{1rxRGUyDBxgoN1-*{@ieL*bIZ&2VcFMXhnaN!%03- zT|bq#JZf@X`XK1y@8oWCSP@#RZdG20`y>6&%VY}&N%|BA<0dTG9@c2jn zJpuxb2Rj+%5eZGPlHsjWNC;O97ry6W9{0XZB4E;me-WxX_0Hk}ob~&N4YQ~{b(p@sQARY6+y@lWf!!|kzA zr-ctyS`d;b;yoQ#-3f{oFQfNK|5bpy=OS6v3Qj65v3t;dI{p5E08puSUS!!%<>W3c zqPsA`oR39aS6P^L>J1|hTN?ovp_eToeQpw%(|S+U;2Ox} zTkF<8jACWM?uE;HoQXVF)mlLHJ-fCf%e)BWR9|7)VM)j*z5L8nSa;(vnv}^g_RjHF zaEO?xclF6uU*@auWkX&?vcYae$X8S4>#*1JLgP37Zld%3)G|pE%B{PPU(>&>w6hh+@!fL$aW!&fh#z6rjQS5I0$j zS73=-0E78{^ON&s__v@~68)(DCNxA3>k)T%7sHv$nu!M@$7*Pol-0$tFZ8CJ;e^0H z)%Ha0x3D4l`kQ4<3#@2sk)|bfSz9aVo?31ni-vf|)4$H2kq<_>?DWDBH_buD1-VLO zE_}*xhO^rpwJWCsw@_n(?~X3VC+k9)qzg~jUF8lWA2ijX^+R2N(xTCT4gJ^-urmEaz_<{feDj@b(?*I{@Yv31N%mlbXW`aY06Eqe;?zf=xW zH$1nK);z*!OYpFDF$H!vT*Nhc_y=HD>q$^XVXm-}=8D2xX(-K=1zW>w?*g+vueB=1 zs(XP!KJ$JwbrJ1G8m*Ly4o*Fz21IUoD30yb^9GleumCb)0oj(c{4S$vzziX$GLPmH0NMss8gZdG1 z(Byo-r28khlh`>dYDiSXF19^jKoSDo+o(T+}TBV$AuXtn<7Tj7d&126HlV z%mv!qI`O%*qIeK2*(*leMCAb7w=l(8=MUOc<;UNd#jz6Zv*5yRMNlp}DnqFbmmT7I zw>bR2yCh;>s`dM70jm zO;h}xpMIN#we+=k(rWrzH+tEQe>mmJ@mdiF;hHRmery~XhbL>=I;dIG)}iM*v|ZUX zDA@|sn{s*kzH$FpSWKnXbowc~p6`ZKe2Q_cTv0ph78v^{i$-b=7V@Jt#V6I%z+>^t%K)2=*#|p?@a8(3SGO@VFFYzHw z>t?mF1O_Aa6D(XMrar01mBHvf(`k_?4wTgL_lvF^u0VqPoN=y;^hF$d3U-FNlIB9x zQ%TveK0Pvq!NZeFnjD|m!dyp;DiK(6nAz<+sf$r@6y25A;gv|j5c5zeew?r!-bKWZ z6{}u80k6MpRcxQ*>7a(oitiYXuQRFx*EFJ-dWw^3Ht#Ry^Dhqp*Axy~T|uv3~MoL=$Tv>{^i#S34q~uy2PjUAEPk4G}GzPa!L0Rx9r2E#&v9-pEpmfY0!J z4fsqcS_VE3c9m1%l-rxrom#mQ@T+$nS>~V!6}*`^uRl}BIzblnsJ{PV#`w=aaB%A> zIfbh@1xyVo=l5Tskf3S}`9c1?g8cYpQB0+}xbaEG6_FDGgDKoiKj-uaw%y&`OuXBb zK*5TXryd-Rrv!kjTXVk)A$A?SX2gwb>KWYxD;ZBH;)%SH@x=ejVjH-6xV@bIh--vh zS}*Sk^fl~RQWC%nvPQY>n}l78%{P)V#Y$+wyLa(PV0a&vfLo#@w|Z@24W&dQF!rD- zx_sDmr_l|&KvsggUpAL*>+|wltl}H&sz375O*R>fv}^rNyx2bgo6AY^a6anemfXJu8NR=kcXzLivUX%8!LDB1^;Z)9--CedY=eJ~vtZ!6+kza9 z0s~$`?%agi+KuqcFeGY>Ta_RFky7_NCMw({IjxK8uo(X)={~P>#*1n?MLXnP*9&B| zf&t$$OQDc|P2y-pNIkQjq3>P^S5LX`_1uDQCHY$a+DyA1WG#UnfMED(cQTu^p@)qh3{QfePKH|d>qgjG8g z;zO<4sg7wc^$+-8aCf0}YC)d9&fi;v_E;2zaS$hz;$HFZDQGvCPh@0T@j-}H$c^&+ z4%Dx%mc%AJBeO51B;@f|xhM4h0z&HJo6TPCfwS3tB4SiM6$&)zjeZu zoORrU&`2VL?&N#qC$#$`K#s#O?Ckz#+-Dgd(Cb>o1FXOhXA#ts(xg zT<~~PS~O0=bZS`K18(ea#AWd&48VQNcUn^M$91sHhg~T*x~HEiY=7BtIG(jt8a(=@ zt(C(59faPq3DcFN{Zv@u+T4V{^MjRgCG~1M*Kj<+0Q5XMjCoY+CgI~`%bd9Qf4Zb8 zLO1zA-@|j7tXRN9=JA$2lWgthiq>tF_r@MqlkuRIfxWOjt@>b;Fe`3}(0tW7zwM~``?eQvAk=NwmOkK5pU1efM)<{SX=Z@rXWBl01v zpbruGkp4?4s#|y6We+>J@K^l~c~jaV2$*sR{%%Y*fDUb~)+ZXq7@G8Z+;F_g`8W?? zjWtw`(KX!%-mzBM|L#x*pg*l$qrj+VC)MM_`M}}$|5- zCB70#l_B!ys#JO2e8f026fFZmfwSOoz_*G}MjNJZjyvvX-%3IMBCdwnv*ouh0mxTR zFdLrc-MkctR)@p>8$E|WN|?|Pa|-Re$%fXy(5LZX!0TD@#zXUFEcwvrMmM{wi`nS$ zHhJ=SrXH$Bc)I3^%T|0t3o0z6;Hd-ro&jf|TQmGBDf{(iI{roknvD;zq&4T)U>AJ3r{y_`iNZl}^Hto&V}mzfO=zG2YeIvHrFYevv%Ed;e18IJ$-9gb zcM;_wSI+o2Z&l_W&@60n8-x~zg(>rqt?mCUd<`A*-xTHvT+f_vl^;I#!dZbKV`T!) z4?b(Usl=GQIZw52-B2*t^}OT;cFCEisv@kc|-!m_hRIk zUdk@jWg`xO#faxqz&k1?`3DJkAla*6bS3I*8^NgO{BITQOn|#{pV%B1Ztj8$hmV^d z*GR4=&ysx}W!;bNx(NHIo_iE@)vKW($;zQ&+w1@oaDE|fzmM-ADcbk?H*AiI?t+II zR1{nT+R*;Fq+ZW<)4`>FG6rLiHSMViF&3%?uM4E=fGuodMIQ>Qv93OrG!*MP*mdIj zoG0jRY0)4vy;y*A457oz6>k*vwj8x%HbY&G+K~y~PWOZqi_f?`^B0_OQK9~G#Wo3q zs^J~dEEEt(H?DZM-BWdhGcl$&MZs$^kP%yoFK zD8UM?hMIYlOrA}&R#~k>T~D?i^8yys6pGxyjq5YszO9r{&a!uU7npcW?yc8~j0Dys z83AP}Jp`{Bd3Jd@YMZ>AwXGZPmy4(~UaHY1>UCn|@uTzBNA0Hi&}?w$xaGA$fdjOf zOioHnMekrpy<9UGMuJk$jnu08R3>!eDA2I-kw*6$RUA%ICnL-g98zxSUS{Y6aCKXr&liELN2L|1lMOQ zBLNbnLp_Cu_ch}xZTCXs)<4|4>qXAO_OtKQQcI#fP<2>|KMr-JcL;*F zaYms=%%e>p(s|IXTD|2waIfEY5 zMzhue)Z~J1&rQA6RW>R@NR~+L1Dv`wtTw~`r`2e7+TPXDyFdIPsFlarKM(xf35mmu zpCDu81BAp|&sdtRx#%UR7Zzx4=PdvVma45c20nFFD*me#+O!olh>YQki?=5?9d{Ef zbv1pd+>_rSF;Jg(uLfe57^x_k*Ycc{!@?%Kr*|6Q@kj>6cwW4}Vk0W*KWN*y^g#vU z|8QCUy)ZSmB!{){jq;ZExCI)u?NU((CZ92mv!J1;Djn|)9%5mHyzM*qfN&%B?9lEg z2{6Ln(TL`29i?7Re|G2h=B`yFv4cPk6p4O01O90@2ke2c}+R)-Fr<- z4%-4y;GMEvPNkrb^r)-#`}Mh9?QDSAR$k`K7Hx?ty&I!Eyhmj~sA9`=F~^Qrz~}xf zIKJ-sAiZ>ptbow}SDmCR+d(#)aQrL>Z^5>`+Kt;JAn#i%ud|F)06cM1kJ3s`)TAgW z$-7m^VH>8Q&YN`Dj#zpa9yJ(TJ`)i76$ZFf*_G7W*yPVwu}93jGUh1agHPjIeyDS` zD?&l6)&$=fuHL0Uj;(PIydSK)3aSxu7{mO0ZN_aKbYE!uhP`1RM@Oy1%<=<7e6HR- z9Zfj|c3IK*+WIyOm9>BBryO?NY#6*7hPV|nZdztDO-M^QJya#YR#AcAb?_ z*EMue9y(8a*fCiI$Zw(PV!NenkQ_Yjo`;Su0qVEu<#%9x`RwsBL;cRB3SG2r!mbx{HrB|&!Tmo%tfLIKQx zIiHOzK3gex@ldM z?>@9|S4{jkp*IGjn=@8&D1mD&hmxj^y())oJ(%eW_mZvf_16?ksP7m2<>uuvn0|1% z>)W*DuWAv9YX_Bo*>9x=Y{lW*r;61QNj5o!0|yo~&=cYw&G$Xck2H5V4IjgvB=U|d z;Ot>%YTuU-s7m(_AZHb4zl!oN`V7k!7#?DWBgW?yUA&CpCRmk7hd z%!Ah}Vrk&mwaTERF?5t?r%SK4`oaN~>k92ncSrg}Kb)~?V>QQK;R1@U&Eld~hA>D< zov2L^B=*4cLQ33At(c?a>^=60;iKl*=O97xozqcJt|X0~x&8CFPfHtGLNFy$W4;5S zkgQN0qo%}j76g^9YIYuB{Rl1E?YxQoWV@O8qsAQTUDB?Q_`xmQpU~PMuRx7z5S zun-sr-vTzGM#R#$?5-N$xRn2KU*wZZ zIn6`28*{k1{FnKOmJHGDtbTh-^+B=XWYhlp@D4P44-J@%%x(dExI~M?_LRMhMLBH! zBYwX)5%{hd{{F;X<#KrL#=nr!IK%>0iutZlBWVtFK2bUB3ho~e?|%jN4~X|K-H+^p zu;L#?#{nAh52h-7P89V6okz#0n8{i=*@%l`Tp_&L_GtKJMMM0$3w z9#O<3hBdLOAY~a!e99bK+5@_N%IB_WkmukV?q#%96~hir6;pDg)H24&9dWoVIHXOcx+~@Ri_F$mcg1I z_qm=y)B8G0qo1eK7${c?V^qYneIYdT>hMy|V@si4@9QGiHJ@=b7jMTVGy71`l2tQ}~ zED;T+gt!-e&ul?LIsD3VU%x!KduqpzX0>E=HdG9;hQ`Wf`c$(VHs@czUk?Z^Xk`z? zF>6Atz=4%26(I55N|lO+#CNmP?wYUt;1|~iLf)jeKM*JhZzf2dtgzneh+6T^H*-|K zyYs$sSgVIr@C%C?SBqR&M`6W3{`Ao=7VTH&>DLrRXJIaud!zQ^Z`AZ=Or$(?+ZeBHm&ZA>) zhLoMs=fMBct!#WGI;OgD+yX)gE}>@U~egij)cu_uL|xQ63hzImKc@%{@okfz-H zW;9`x9Ufa1+hh{wT_9CE{oLKbeLLvpujR1D4N3ks2zRS~b80S;39zF7azk?1VJN8cf4b+d#yt`bS!zhTXdO2*7U$cK7l>Sz)} zsse2ZrQ__~?WbN9lyM2#|K?FUIz@NEmYA2gY;nq0DkWX{jvSWr`6KWT=4MuEbYTIJ zP_-@AsBjPMUi%xhQQ@9atCqMlF*|+#0!;dQHOLT3evoJ1ONPgC%9)|}QNG=@zlp&y z(5U-;_Wfh}V~G8HKC-=;QiVXxOEkW*~MSs^80t zZFi{ShLbr5lrnjzTxsR(S0s)XPGYYB(WqDSdf{IWk6602B#a^`Nm1&M$&e3~f z3#&PL-`U_8*DC!NHmI)Be`oY@sS1+Mmx~*)rjU6_T~^3k>^sJVI6MCNg6>*DiL(&IL{=T#>XJ0z%>6K2tNE1HhS7w1U^Q-gXYXD|bgL5TGzl=#OOZI!0bnB?fbv z;B*C|2ietvciygm7uNBQ4%v&a!ZBk$jiw#Bmeh^&BR+Ci)pTFDLK^?9m~wyt@806R zS)qm&G>xv>pD6s_ko{?PTD=XfU#VG`*KA88%bm!$=AFz-K~FO^Fyo4Y3@T+cUiaU5 zN>2y!yi;c0ctnv=xA$Sv-&=ah4Et}#ABCA7@BV9BgU>IT9$!Y>&V}q>5@zgwg?Ia6RPtAwc*e5YlJImrNfKf|3}z+fHkpv z@8greQbYwr!5)xeH})J=NE1Ygy$wgNjJjrb0&IRu-~6a| zYpO@KJs{LAXoknZOWR?X*1A`tD(fZism-+2`TV&8X=6Iwvfu7iOQ%8Tk*zuIg%Bo5 z93rgTrx4;P;Hu>o+IUQW^G1)palSYZ-G;;=f9dn%5}hIYsmZtfZr-s>!v#++C9!MG5+*3p1gP*6Hg8D0%#P*G8`( zd&q7pviCH%U?|5ALaCvd5mk0@eCLwY6AaE2!pZ0ILvfAYTp;({j~qWi>}kakV~-B| z&?8%(D{+m_M6JBiXN%e&8uN^ArsalC2eE;BZm+T8CvfWb`gaE>we$jSQC7A4~1Vd);JVp7H@!&Bfir9teD(XKe{jW`P*$<MeSHSzQjcK4*F{5L>RlU9Q^Wz6#?a>c3=Ce9rHtv;`=w0|a6HQTCMC>u&;RsiIm@LZw;goFaK);!5CT zrz)=09#YOT{&sm#*f{vbv%j`;Y4QVkihhF&ew8Qgz|gRpPAk0jM8d@P>)wtvZ(0Wx zE1C?+D)7QwtKthSrG;CnVN2MUFiSUKKVf!F+KO3gg9Z2_dOIsP%rqeb<307W{8v5w z*1BUfW085rp0EY|;poid&+i^j;IBI(SdETDLl zUHmHs$l-7Q1?8UJE{WVe;~$J0?C`+K9}EwqhsAUp#n8xK*J+DT(Zv5jHBwWg&A1Sj z9lRP>>GygS9lzoRe4}^I)Ot0n2%HmNoia$WU)?diV)NKR55op+0VjuZ;Ya2N9RuQO zoy8){(cK`$bN|_Sj+v|5>rPhCUzCT{X~6^cL%jR`-{-W`t}F?{Mf6H4AdI#1qF44@ z2QXN^Xh%fXR$Z{{dHl9>(uHIRdcJ8b;jpKLYI#R2bAZDCvcu)*$t$%K!3rw)UQ z8ZiLsdQOu%wj7xqH#S@-_y&$w2bd3+Jel+J*8(m=-v)GMU6xR+%g5}>PQvGKdifZq zv$H@XiRk-rPe%sOU;YgJU{_Gay3tp^@cD5o|2;F5MuwOn)<_!8hcR!QuBEp;{wcq3 zxY!C$koc?66yE1A!Vd56swXSU2AFde!ihr%n;$sE*bCbuJOV&cu{ju4HiwU8x6C|> zpm&cg-MofCd&`HqGF(xHth4Uo1*S7DQ-NG$b;gEf9-u>Zm ztaj59e1*7i5jJqk+iqX^!e^JOIa7=G_-=c4YGwqij)=0$izwHE_n$T>1GUP+pg-~1 zt;qE6!}7Atd+(q59&#W8az`0>-VSbg2Put`R5EK0-rve_BeUkDZ(e48o<3-2as;gU zNZ6$uSZNH44>V5>^zk=?Wz*vwuj;TB;#*0NlC1oVmhQ?0H3Z92LQ$zWFMr|;`4L6> zTiAOx2=BV@n?gIGO>T2fy(x;I*FOVxe$$V&OZQ^Cn?gQ2{03E7ksTQwD=Idxn{h4T ztr=K4@J9#eeBFo5daqk!t6a5|u7IVbGSrk2^-|*51Gx%iferb~JkYahc*YY*K z2#sG2;t1PYtuDu^Sq9}r8R(;kG5Z-TfQam{htAoM@!Z*=$SV3bP*@QR72#4?k;0am zBG7d-_v=l)ZQ)|M$JBvFTEie~fWAj=>rz)~+I82d6`ON)h5&b} zvduNS%PGMGm&*ln9!s5&A&lUTnUv#{k;(e&_R1-J8lDB+eg>^h+#=?)nS0>Cr3qbk zhwZ%qA9MC>`~1QyUg-I2T;}vmSHF})A9wDB@@4k7fPG@pues&e{`@Z$IR0HDE_iTf zFOG46sKtA>ENt`b4?iQF|8gq}@B-df@6vD6s^8+@W%+R)H*$9hxF^fCPK>=@2)$2D zIyJKd^LKgeC4OZONc^OfZ>i4@;I_=J0tJz^d&hJc=LDCvq3r4**Uf%XKamYyW1W7dh!u^ zH|h*~lSFHVBj&I3=9Y!E=w zL6B?^?c!NAMfLr^;n=fz%1nW&+hS|DPusk*^x%!(aQ>;ot&&Yq=c@I!Y;XD36#W>7 ztGkZ)J=pQ`nvXC|d4HGndBt)_Yg>2QE59#WFl+0Osb7YEo_va?Ja3$H#~`0w>MGcUv^W2~K<*Hl-yf=q^-NEsc(xYc~^wQI}Sfjq?tYiIRuRC=`?? zkt9CwR!!mq$(Y24#@o^W2RA4^E*9%9lgg_bQ$@+RFf6E;h6g+Z@7a2n`Be(mpV0*tv-*mX z4Ipyio<7qp*-_xLBK`XG8+ry{+s!fiUaVU*tJjBdmr8@b&AM|0UZ~R~fu~NBRJ_Ia z+i_+in2L*O z&KaA)c41RWzR|D0VB@}(8%iC|+X^de#gB)#-#XhJRE1Iw4hGAx$lEuw3NFFoCr)#e z9#Lt+D+Nw(k31D6W0Rs_FK6`t`wO6z)GcCP|i+`?e9FJ}Sc4|a#1ReWf^o(=N~ znei_wHd}#L`ri)+N1y)CsxL~OTYU3|_1DW_X6cf-X=Tq9^4SBXh?1vp&+dc0J9jx| z={tYt>pBMCLc-Fdvf?RF7%*-8vsoSj?%#CgkLt3y_;Q$-S!wNzJlg7(1Qua|`Dtx0lm5 zvjdkNiISBbGp02@Q;I5Y0Q+|2sMCS6nvQ`J9}KKGkg7c&+%jS=UVzXfcrWG;-?nB| zG z$Wl}Jz&GZH;S9vN2371LDI$*TYxfBeB~##D!028I+zS}p+vW8R%WNR(IC}@Wp8qUw zjItCZ{|i$pCNZTg_#qssf@5)q_Hyi#OIftsFZ~zvd5M2Me77HU==nn&yEu_tufOgz zhAdy(8FT1C-QO;7ewN21?IX@c3Q_WwpLv&GylG_s!!BX%C#LPOcI$JZc|OOrtOWqV1V@!01wD@u_(Z7lhGX&-(ZToU8E!-zo78i>*9Pai=te<$Fb0%cRQEq`bzJ@lK0h zfY(|0x&8B66POw{jiL(&%ok44g}1KW5cw;SD&_~d6{=!>)!E|dlYfemcjT;t1hJKg z!|rbbVRRhvQ2BJ%O?bR!RNxZ~I)g5+zG)peA7uX6Zd+3lDQHt^95(@-Yk@ zWfDu}Tlu>kFcuDG?Fo70T~|+6);6dObZoAv40K5N?~LxySIBRj$xFQ50^VMibVIx6 zo(8?WB-`c$Gf=T@j#=6GB^S|<*4J|nkKnpip6+R{A6e%< z>D-AOG=;o#K^ve7+Td3O)Vsp3N}_sK@=mO#pkg&$hil5zyq-ij9<>zazHt7*exi^+ zgucE<6J~F8$%oj4u9YUe_}W0tN<1mK)T~606mmHBF8k<}UvoH+(A8lIx8IANKy+11 z<`KJbe4$Af;y0FkQhMtSR3Wy&Zodk#1>g41jOcnbED&6eXuUi=jN9DNMIk>_5`RoN z0^A%E?~E9GNE;Y~f~-Dn?7IjadS0HpRh~s}ynEY&v8)$fEYd)|Sj;LQ7mK?3K|f@3 zaPSswK%U6I0Bu4J1x7*HMyt-Dt;I%buNrOqA)5!gPahKz3U&gN~KYmW>*|BR5tUoLys%hLbgMmN6!UUW`lVZHIq$2J(DBb@0cm% zw}1Y9+yEBXx+Tte*#9UD8Mj2b5wAx;El7AhlH&zQAs@W!;t5#nci2A3b=^Qn-#V(C zT#bNSj>y$WN-jqVImSl9$sASjML6{s7hlAB9k61j^tuEq_CwJMIV%wSPfj*@!nyVp z7OxuA&I&Q>0o&B;knkn74k=o;;!eKj$jZY&mL8tAKW+eA&fK~ngLC|`?Uq8--$l$nsGB#(9vx~S3`xoY{nVrxRuqX-!ZrS+_Ix14v+PngkSvg zT`Gzih##P$sKM}yu?xPmonDnD znzbo_vCMbVoOo<9PW~aA?}c1SjF#Ut+H%h*+aCqrG`hstc-`B-;hxdTb4H?B*bguO zPUmbj^l?hfVolZG`SIHAryON7P`+U73dZcO*cXgl!4NLmQ_V5j>&Q(=9an3iJ4tr| zVEQhKy$djX7scKMbPJVn12>+lj2opwK4?Ykxw2Lp3>w?;q~!15FTk9kU)J#a^$PGf zW4z3MNmOLVHii7z%BlGn*D%)Z;Ei_LSmRJ@DOK^+*Mp!4rYgEaw{31hK56m&4X6EP-yuVtHD1zR{c$5{D z<^RJ<1bLjGzpu^pw}t2S7Z+xW?_TH_^1(GN^NoS+U^mx~q-t-}9Kftbc{Y z0Eflg?6z}?z%AK6)k)`yiJWOJRmjOQbf9A5T4^jMnYiZSw_~;lqApGx^u;;hGfWJ9 zUwd!&y%X@m{Xh?rqfbbZ^cAOi>talM>!l-lE8WgqN-;)&<9Nfp)jm*-{Kt~PMs zjnHMCY9FCE$K)vOKTD!XZ+8TJtxWz%2-A{5IuiZ4yI(K}!Souun zzu5!OW9-P02b269at4 z{@0Y};uHO^IV0A$iPO74iR^2w=kBQSF!IC&qU-ahZ1|99vDoRlpS$FuUa3!$LLNLA z)Nz9GEES>hH*uQ|U}p*CE8${i3F#|Y4$2y9i(U@*(jJ_^8|jT>Osb5Z!PzCZxSp@Q z2(XLf&o+HMJ)~n()!sSs{&?5}+FrPv@A+%kYOprw zF7m;4BE*t5A~q4_*hZ`x?B==cZh(`l0`EmC?V~dMGm3F=*)m zrl}1BradxEvvE2e4clza^f$NqwF~N4X}>OW3S))y1}@HB_OWX4TKKj7(I8WIr+r-M z!VymHuUwW(@SDKZU>wGsPuA9CFgv42glI&Rr>3}zEga~cP1ZPv50#T z_G#I^4R=cUEEG#Wo)%jVly8m=^^NmQE8CLkdletHvcbY9{w6e&4{E>Xz-0jGpkDF0J{7AC7=Q#fyZbskXzaX12Kly;0 zd(8wx1-Kb&CzvBhE8DkT5KcDtCke7~^MFwBoNONaE@;QiIFkbF0(x56p&1370xiqc z1v?AyGmB3sNXN&7n*~qE=Hbc$IX)&D3N3{AW{yk|x(i#st`LUc)=|AUp#UF~uL>Uu zA2og!IyBB;(NH2`avue<2w=PO8Q9B z%1)1w*h_FTZLuU!a-V)CT9S;p`snEek`mm^cq6Hk81*yJ!u2KY)3ZiOS@>X_Jzu&O zAJ0Zg6UpYebJAjb%zGiNCY$F0r={Je=MRNx_+aekzhpV|?&Tj2eB4BSORqp3GRHfi z+J=D1aiCgIwGsH~;T4s8av!MQy;wrMdzrjv7dZN;!YOKI);kztUQv8DD98#(kn+lOk;%IN zwO_;AHCV?PGiK!%?4?y3K{vQ+BSPH%c~pwhHBj%#&$Co}@)YC7CRm~dQbGz_1*8O(YslRRRIZ^z(Mp+otX18U+>CZ` zyjeD`=)a2Eioi@~Ri72ungq(6#MY#Q zG$%PSx%DroEbn!Dz1^AHEbEocrR9D-nGMaLCa`h?HGx&Tq88ttX_@Z}T$swh>3Gkn z2ei12@%=s-HZ=chr4W-V#T6{=6#D>G>|^>B=)c^x?@h0`&8*_Vn!$K`mJ3SZPkG70LlyiYzI(g0DfL;2RwZBp&FC=Cf7X;cfxE4rzrg%>klgZ z9`dNeTPDBg`{Xq}0O_$Fs{rOqu0% zYxsAQ1@eInt};0p&Igjsmkj5NNjBeSc=jwE0;Atr%@TWF+Qz!&IJM*X#8~`bKvfL* zD;reBfcLRM;jCxn`R&6@h>x${`8BQbA$t>Nx1%3NY5qgDTgx+P1={~2JQS0J zhh6Y^(uYv;UWHCz{k4HaCtPFUtI#JWd^meZUFdt?yh<`+%T;%@yRVbB-AA7ndih@BavbkeEZ`EBgON!S^>N%qFs zc6g1VHmIR_`^E#`v>!mV*eFV z^}l%)I+ZM-D)-~U{eUa?OWKOtv?1{&JO1vcJ$!lE=m9c$VxDC+{P4Wz7K!vd`OzlB z5~}cHIUHUIY9F|eg}n~g>5xb24A;JO)%t%;Wkc3($AW>pbKl`hgU#^nWjr=q`r4AJ z|CVom&740r`Vt4B9uJ+oKc=A|v;*Cvb#fxHR8Ax#{O*Bmbf-od@yQ+zWNfQG{?~i~ z>`;64;DXw#hrcN`>=$OLVZW`9Quza&4*KF~Jy79#9Ib}{hf>{5%|r7b#v_Ke#Wqde zzG0b6F8sLq`v6F9naPU{x4cmuTC&5I+t3_*w*bEHzto>C9P=3xQ|zP0>ol2$B@-^ViAbROTG`4^(B& zL7(ee{_Pj7#(q(m{LqZ)k#Au3$-N;?37gs^uRmJeoiCH`wt&HP>=W-D_Xe@@emhuV@+ zsGJVfQIXr$Fg+$tdC>@abf3Az3_o}W@^93Q9<=4233MOz-ZO`od{nC4YpSD6jw?h! zlfJ4#gy4BDt`M9*w#?}LctbsjOW*R9;!VWna8zcuDbnyu zq9N*k>WsLdxfeSWe$P7L!oK~xzhIfgiDgfh1U}wj2*Tgup;nG5LjmjQfK9<2>!EAZ z;y{weN$|pG>7Yqx@Y`Ah14g&LI3$}H!;K!dA<^slmJJ2UhGum!VsKIyBW|s`i&Ylq z0Y>Zs1=+=jU0n>>?TJ5!Tj5ng`~v*4-?cIBn{(j8-AMZcdu6fWH@>$AKI7X>Q(-;( ztp50U^Si?MPn0js3)Fsl!`89~c8yKBWR-m&%j}a?_Q^8))P5E4hLzf{>f#M69eOsq zN%H+>MJfU%TnYNL+fmUII#zidI`GTd0;Z&1KSO%nfONf)o;Nvmy~*SXyj=y!eM`G* z7q@4Kw;A{$C&2=rsdGUY+x3LUsYVdkY|Fe}t9O1+jV7a-rOK$D$SJIBu`PZqDXe_e z_Xr#UTVIcus0+{E!XR54DvcE=9|CqE$gvM0coK=_BEeh~mJ2YL%i~}ESUL8`%3H|T z3UIEeVk_cf`+P!DrG=GZTNsWSXVrULcVdkX+x)xMwZCu16-W$2b93_S^SQm}?EPNX z|Hu(gTIp1bp$!aN?E#lg_2C)Kw#)i62C2-i#+EQ?2m{^)QJbJv>)8Wd#|GDF8L`3F zd3WIJDY}0*zOoFK+FZG`S$jDI$GRsX$$`k~lAc%H@C{)G5KxtTu?!dV-LN2|{x%d= z7Qw{h+T9lJcR0-*daZJn!SL-yV%gZLJ{xWr7FLoJ$&meBMUgB%?Dn2vD=e&J7=x)! zw*e2?#fMmHC%?BDJ$XE{uo70rrRbbVFtLN8UC}g!ycz7my)wy0nj{WZoKi-dtC7GIzw1|SnAOp5S(8v z*l(#D0SA*k6YO6_S3$S!<1=+xBd6>S6ZtN$#e^FVqwYvUljTQFg@$H86DKBoFp`-U@kiomD?ptq;*RoAGO z-C#zOvHOas{BOWzkBs8vtnVisUllom*3y}iQ$TTY_AtEkat`$Aa@SAnwA-6y=KT7@ z9q+?W@~eR|*RZt)l(~kjHQ4TL+j~XCH7B^Xk zztK9cJEO2N>%d6^F@#imWU^13kEs6i=ul6gaw294ftqD1mJq{H8A&gu^4mCF=PY7v z$6@%LyMs`mZ&U7?=NtWHs}GdTj1sMF3ze-rP(cM$AS_T7P^soNclp68th_$R3A$CE z?lbe;#lC{M5jKH6x-bi?_Ca!Y{wD)=TsF(8bV84;%?)@i{fVPjl(M|9P#cmCP;W@M z@In>m!^u#pIG?rhRqTH&9k<5DGHtdMo-*7}0f+4)k1dNbt7!}ipN^+r|1divn03X^ z?PTMbHR2iR-9EgZkzd^@r<1C;oGeHU2cL|nKC?5-2J*ftu8-r(Zjc}()iU<=((Pj=5);? zhH+{6isXs6o-E^UiZ+emA{6y`-dfqg=lkygrr)60HvrRbQ0yBDzo5d(Tk>tas{J6? zJ+jZMFLoOnXKoF^&#re5T~k>1;UOoXqV=cv@129eieFe6=mY*{DkKt%tss#|qXbwb z9`W2C6jSwWYww36V4+>H&+r2LI;OYGM& zQ0HUK7Et+EhkoW)zXgiu8uMIpDWdCT4$rvC!pd0>diTlPOT(e=sGVbPcri-a&hT?5 z*5&QSSDubzO#NP4-uC3Bv4-*n2x@n9#lNUUFFc|kK8s4*g$8xnF07UP2dmJ2C_2Ms z^uzuIY2e^_;yriw!u2pANJl4ar9Bh6yC%%{{bZ8Z9@pe`t?Ge!p3WUXV}Y zmcCc;tN2%P36RMp>-e@cpbBl~zL1ik&HU!hkVq{Si6ju5|;UM$6UJdqf z;B=5q`}JnU3811=I5@?nqEkE>{@|-_c$=>ug9|+-I{zM>Jmkq_#aM1(B}N2dKp@^g zVniSY1j1T^jL)te2CDe%+==ZSwEXJx+qzp4kowj>S-iXa9*Fn;paLd9!9j4qM2_Jg z`PIvA&$onEy(-*p>)TZG1I7ndXyeB^?EDHKW9MY(oJ+>ev5AOpXJ__1OQ&-)Il!~Z z_?^H+XA}zrS-({qKA5TA@U=c{32aypd*5nWE1Yu7iaw`nnA5mfuuWW8x$4<3Yn;1L z;$D2S)fvh!2Q4Dqm(WA)zLc)U?#ujYol`HsMv+%ze;jXKY+6I*sTjuqB#?o`F-S-t z11G83JU20ATWLk~@0|sJza0kzAG6c~gFMi&xyYCpOM; zIkv+;z>hVad5@1TZ3mOV71UNA(|eFE|D`^1?DFrugUo`2+k90PBt%r4qhLcgU78Bi zmNky^-ZN&X!)2HD;qW5)vR7U}xs&0=S2uU2NQO9i7duFmLmbsUeNfp*k^M`49Fq=l z96h5p+{Ssq8`wFL$1q?YcV*o+{x~JTVI60a%^&Mk~jA6?VXqo?bG6kb<0K;x5)QuFwZr-=ZGd8RMX1!gXnTO32VRS7s zy%pmWfC4IDoPvM?Dk$m|jdvhGoo54TUY|cB2>4^TK*< z!|d~Rz-W1MI_%fzI!uc3+V*sr``r$m7WsdG1aQZ!nL=p+3DY7`S{?cF78N5d{B~3^ z;(~LM3T_1I$fvBmW?+l_FQ=k0blCID<7!sLOCG%ApQaGupxX5=Ix5F}yIagw*cy(7 zEoBFsujD)LgLO{Z+{utOP|z(L(w36Ytrj^B-~$=KCj{^q6RH*cYb=?j45 zFCgg)1n)3^!PRBVw&t&}^TznEmx`VCa|d4wn>T7+;T49WtyyQrpL^jJ`5EQHi8%dY ziu1J#M>kf0@@E$c{RHYjh_!qudekCMOiG>zlP{GuGUI_Ame0=(n#fZ;?+S z0cSuW&Pc!+V8j^(l>idRM?xj!rNLcVw5nZ&Qd{gQY?0@Oo`LDf(`I?x{Jsf3W%iQzU~d*NCSOAZAL0P6odWJ&DX=_e){xS2t z7kF}t@3}mlc@GA#Da6Q6P$NbTe7>}Ha<1nP-%9~6Oq}2^b-fJna$GONDyXgbT|69f z8pe{lW}jn4n|~VqWAJi3K|o#4)(+J5Y!l&7l?ovT$)zfU9M*WMg+3K1AQr}9wbJrg zMn2Q>omcOI8g}ejq5t~~INqP~!`uh8AErn9n$a!tz$ed~qai?Ke|g$p(M8o!c?a7D zw8#UT=YdOL^aJ-xcYg~?ez}dgk%gb#D|i&_GJN_b*C=l2@FOo8N0)g8DX;k)R&jek zdc2C;1E`QY_Fn-Na>xEFe2YH2gI!C;P5_US4gDm}w`9|E(cZIM&# z1AcIfovI&+SzH@`iei~<%}H%xZczJV0=sbau`goxtf2<|`EAW}R6!h2A-L||#<$}iGR?i{{&{dZ)#sL3 z`m=2y`x6@1B3G550y6$jhW{IjQ(xmt^gZ&<1J(@NWPjpwz%Ox=`_u&u+_vT=x3I4Q zhnI158L05`CWSMooZj*ALY33IMZOGtQ#?5XjyN6UuDj^>_EcuS4FY9bb6rrqSA9x% za5+=$YyaflwpPax950;(8##i3;N%|T<6?Yl!`H4|bMZuTitB88NGQ`I?AVa*;Qb^M z7f*lnPO$NFUweb2g0|-O@K>aFW1m9~iBLIqRS(xILHj|4d2>A?RAJt(<5+w}(yU`N z7Z+R=&7!1ys>{UPutn`T<5sCWXWbV7uFOIeX5r$>EM#GpTJpBBZ;*5iVuNW@8|fNs zoj)2sA1bpQaB4f1*J%SHRHyi~^cHLp@3})o^gxCEp0)KA z1?L;)S%O>u$MlxtAl?=s4&Y(*Qn|<>{|)x&%_$dc{f_s&Uqu+zw@Wm5;aEt2;+eWe z_xhyjKHj0dm$t~c(rQ?A?`@99!SHO%9=vUoN!)?1(Z!?%bv*2(3ey7`wD~Is#^joB7xeWUD z#7QG&=NF4>ltGW^(za%!7$EBakYxZ^GF%71WL3|CycjSu@|{_;&f_{)Ygy9^kBv9) z@|Au856<~++kh#T1iN$5Q=5m0@ar!X{2R{Os^H(s+piT>zK*Vu*sME!u6xABGxmyK zd|RjQ6ay__3R;SRwl(BTP+K!eIhYG-%E6=6xPsbf$xW(vZQs*$a2GPC>t%S(Ywi9!DAhEn8P}-?p^NZqKCV;W zSaEe_`11Khv*l~SF}<68UXF>j*fM+Z7o~LNyx+0lxlWZUijzgjT+vcpAR``Rz(Ytz zJT@#_K7Rr{f4jcPv)KIxH?(6;OxKOC&AIsMR-e2!#J|9~#fPt0?RN9J50{_)2Ljbm zv2pP8V?zUb4g)LKw4;-4Qrj9cT7nrX=aH3qpj;zSTeU`FQ{_j{n$>sopW5$U*Jdnw;;B zTiBpVG<|5S2m_l;6=^R}73XoGxJF#Ljcb#M;|W_q9Zv`WGM@0Sh=7=k2v}w3f9S=A zP_;jw(Vz6^NA0*)yrw{DlR2&YYw)bUqrvsW*7Vum_WOYKB9;3dX2z)8_Z?fTvj0P5 z(>M%$@f~IJ=6=Wp=$Pm(%=!f`)thw;uL;L)!x;mh-f7nZxzqj=E$rojvvJ`4Z&fyq zc=%EAtW^ACT26wh@=5Auma6i}3BFAxoSCt2`!64BSKyt=_HP@rYSNz}K4p)Zfz~^Y zf3LIys_F$UdhtKDdsf+GEj3(94X9dbxRhFJmJ_~0!Y~tDTOg&@;o$d2W~J2&3|w=i zc{Xp>?1Z^XCpo3PRX&1ZopTe&CDevdMHmKQD9x^jOH| z?Y@1jw3?|H>m#+vG%S7uq4cCo&XodZ!BE-F*q+az$I&}L@ycUbc~gYUFLG5^P@kBl?^2%-zuhC z#ascHZxz$6w$|%$Py6(~86IT}>0SvZ>_@tqHKtovNdLY}GC6?H2^EurSgY5xEpr7^ ze|N8f@LfMm*=KES1ikNsdVE2Gh>3CLL3`ZKW3}+dxFbpx=Ylw~;o--^qywCh>*l0*F%ou1WV;WobF&0zHe z8+gld10`!Cph29&kO2!glv{&D+X9B$YGeFu|2msE%D;h2b^W79xN1Gp0E4u(%nb|& z7}hpeOfYmd98}vd$k%W)Zd&d$JV`dKE*jp$P3sSaQo}E`4K})rK8)H1{QU#YG^Y~H zG5B%OLu0%>096K0FDD6=!Gm zfJ25<#E^?ahNON#x}dTZ{&E48t*}H6H~>iL3%LEe0|4k<=VM|ZxskTqNZDwF2&Nfx zD03Rqlj+Oc%#329BxW}AI`a|p15?VRu}oOVnl*{#%390{WN}#utaO&_GV4C;4eQf5 zQu}l)OYi-koFPDuu&s){WI(yeu&LVaT#Ixm?F4^EtF#mB_fcslAft<lhU}Z|+0L1(kLZfD6`6bWen5yDFo}^BAZynm8I<0at}92*M9U zl`d%G461ZN@hnhnh(0?36`1a^X0#INsw*{thq_V|{8WMMb3qNZck7slbXEEbtX)<5 z3sy~1K@@<;RzVcn`SwWn&$2y~zY3@{7woT+V_z`R{Z}zaAd5kg8z@jA0CcWMNdy4W z#R?5}u2Ly9Fe}9h4R7p0m7&+`gM`e`>wT)7^$27*zlTYdoL|pkR#$Y6z_zM5>*c_<{YY0go`~#J@ElU=2vQ z*+G>$awkZRQ%8_4)`+2?)`&xa)QF@l4P(`|v~&`-rH`$-^ClFYhxWi4GJ6(~8j^Ia z0Ga+pW`9Y^^sgottS|w)wJ5I^V7HbI2{{51b3}Ter6lGE>2}WiXHc2{I^5peVO#%% z^eO7_<&Ja^l!-BC|!-845^`BV* zNcT^T`#y+HT<8u}YL&~fp;T@xmO>vxmCglWkxJ((O!;&|rE{UyL#1=!z|B9sKuDL; z!JvvLj<15q5vJ5u4OB3W*B=LC7zfg=tEYV$^B&MgC5}sR*Kl`n4{}qvg9L1 zTew~LPW(~)JOP@`U&-IbkL91>=kezhtSUg;3-%S9EI3~vEO=hcj*;3+=Sk6O=}zeZ=_zS}v_x7it&}3U zR3G}mNMOM%SOFn`_QG*E2gM+U&(H{jAu=-@YB-} zR;B@K0E@}8W6fc$VxjGx06B_(3GX z_+Ait74$u*J*XR(!5zc3=g#Az)!d!j16&eQT*58qR&tS?tIsFF#4P?S{tA8wAMNFn zAmU=anE#pI$R`AdL=R6BcnW+4n*~vVBmv46To*hNd=N+lv;q<>j3yPh7A!6ZEZ`Q9 zFyYGu=zhVQg1Ul^0umoQPUt8^^Mz}Lp+XWETqL|Bd?7^D!d4*(31*7z#B;=}#Av&C zpZKKsyjUoHF8(TR79$b_JX|tE!jbq(wo0NUC|QytxhZ)fkx1$#BtMWA6JtOpX`n+6x*9-vq7y}3U^=%^9?r)zIif)Abl z{9hYqBBA%B{XJ+XM$?DQrJY$oLvb1jk4s~&qM`E|iHJ*kznO*@8VTYN z?cp>;(~QjK5sLjZ^h48!$0KTzX~;|?5%CB}r=j&435q1v71B_wM#7FH8g9|h3yp*q zN!))(L%EvYE{Y^Jzn~!pjRfr`E`OpSWvBbuO`Ozr*UG5$z!xohem?-5ff%;p%jgTy^nbAqJ_?CB)omZ&beCXmPR7NXZdNNw;BoB zPZ(~{LfV?Ev-cAwJG4-fM#9@q=tgUymzuLg`-u2MN2kTIge^=X{W0)M%mYnzKX) ziK9(g=r4@~#Su$r+9QTNOkZvEMAJtUN6fL&?yOtTA>zO|ZFEi3 zhkb~!XK5p=PU9RRR(oip8=9+&4iOd$wUM(%g80OmRobXhBVqFi&n?>MqDI2w6Nsyg zmS`j*KC$G0_P_K-JaIo+8_m%4VaF5N8QQ2qBjLppuM7Wmbx}OQDAq>nG<{G4vG1Wa ziqJ^d354!T?asQ6mq6Hj(MGnKKB5F-YPZ*-Akv#DVWvqR~<86yk(jr}J0IOCf%1 z>7p^3kwq!QU?W}hR5LOwOMBg>KovkKOD$%}G7tPRI9SMlZk-D8{3tK?A#_1w+ zO&^|sSbIVjjnrIABp{Av>7pNHjO647Zw z`brlSYa}R*$or;?x@sisG~${}xAU6IOC#zOx@d#u>Y_AazMdYMueoP*hRE-whpIJw z*k_0&3%!4>r)P+%qx4X^=31gN#D}SRxYF%ED-lX3J~-+jd6$1A>~x~STMv0^`tZ^T zizRyKy5`A?(uue0^w49?$S8xz+OCIYYwnPpLA31ALmM>`UIr0xSP#W$B%%!Bhd>X# z(nwGyapyelqZyfdPWfG(B>!JM`i71n}QLcw>YVH|j5g`&ibXg-|XA#5d z^bpVFpI^$$B65{_Xj0#QB%&7)60Bk_Oxf^6d4 zI(^ik=_AS}&PMAa|K9)fL1zj5RDGn^?;i>KEMa_I9|da8;+-WT%Jq>*BN3e?Y=7ya zdW{6-5KR3pNU4#qbBK{vU67kb!pkAH+jc>T8i^=}=(4a2TA{f*$|VA^1BkDYuyY9o zzY7Y`oW;u}mgjasP8x|QmpFU33kuYnh0YPZK6OC~O&|6-!nnN)3f4$?=ZNTD2FOhF zmPO}?ltBi_L-Q_B9#Ml$(^q(BrhcmIJVNMXfJ$^p3H67Da|#jK%&u$t{`-3a4Vl)- zfQ~}w2>F?Bt7;~cI&@lyR(AvRzP=uJs%>a!#)W81m31<8uVV9>Mj4Ch7m7RLkqPDd zdU8PA_xHaC{P<7T5E>p+)$RN5+W+tC>Kc+`|6j-dpBuz81Eo;EO7jm+lSJfS^3Oi} z_mX}PZR!#OY)B(yhxX%t_lURC?6AZd|KA=R!2f1oNdT6N_(yUVOAcen;D03Fu;e|!;5+oGlbxmE=RFT! z02*X;{NrmH1KOGpy}qHlAwX@tH>2C9_TTkY&1**~~ETk=@ zRW;LQYHQWWUT9Z09sb&~M~6PoZe4W~yFiCk(sI&gRIt@BFn8dsK@ zdNRH-_GnE7Yr~qx2XWf9^)5MDCE5?4JtWMT&q}lnddXPxXj6OYTALcq8t)Cy$6);vISOr=Lz#hyM7tBZGyBK*Qk0oepp}GH(!a?^f zx1f+4=D}~xL$*A#3c6w*jJ97h&;4o{SZluWg87CF^NopUb)-dY{iUsc9ZKT#zZPX z_@{&fx68~ywg#?;jkV3P4b#xhR@pYR)*Wqi zM9Zh4F0`O-D0e)~A7pFW8@9GK1myRlo1+!ekiRq9It`83OvkAV-H@Vw^Qw-92wHdA z3bfu(du9YJs8QBducMVmTjfd542;trRVQnz4}3_cJ}ZO*mw#{Y3uvw{6;?I3H8ruS znwJ?|@iS<@^0K|DkTp5GTS4$!_8kN5!uF;X`nay2>~-ehuLIA&u5~hxnnp+b0qW7U zWsSz&w4_ZAmipi1cw+vpudS!qYUkG0f zc$Vr^H=TU@wdI2?o{Qw%`z6$2`vsKK%2@1*s^;g~rEhe-zqZiC@3c&9Y1$!nSfOJ5 z_X(>r?H)wP5lhs)&&)U){WQ&!MzhmCOEbT5Wu{t2aWt)orUpdc zIGWCB+V6T>lY>2aWYG7x;aR!)y4IK0j2_Bn8lCRfYaa4cw#v-0PRBD1(0a5Qzr7$K z3c+t~<#Qvu{7R#hXr#nwW1Y-Ts?S9BPmCPUi~=+UjV8>;)X8|!J3k}kmL98n9PBZR ze!9?0Zv(B+IHMP$O&?6p?DoAOn*0(%uWOA3uYNU`BE3RcXI-@3>e$if=_X@s>081L z>tqc`bjH%!BE)3Bg>lv(9Glu=yfks0O}x^^mPSjoX*IL9m}Rk?j?%l_F0@#VE6XZt z>r;*##{-M6cR}Bcl-7&a7ZQe}AKfQJtnM@F3R%qr&y8k)7>n-p2x*h~MS9XkenxV; z6UXO|xz5s3P8mg*WFSAD)o1j{JiFVOKGqgTEJEx?`#pO*WQ*}YBSRyCYBR=95iv+Vs@|xyGQydeBIaAwf1#1$i9qGR*%2fuZsm;nLXMEgN?Q#-y67) zs+Rd!^#9m<52z-ywrzCpCwW2wN*V+^DS)VmApz{>Nhl(Ugl0z)nqZ@Y&NxF6yADOL zjWbd$ICgZ#3U(a}>WpP{5KspTjs)z5bDt)i42B;V8bh0=<{d@WTIX^{lwmG`bE%Bv)Sj-RImp-#pHGk50?D3rfTM8P*mPd8Q(-`Sqt(g#{jiW+nW9A4&UUSJ-Y0nwVf3 zXsB7}9F{vG1TM&>NJ+&9wEVLIX$?#GNcxJe#~e3@c&6XmyvK{1UtfIq?omi6iLuVL0&5z)<~2D<)U^`|1FKdF_;o~%quFaAclTbluHa-R>UE85T!k~I<9RVJ}v#O z_cN7k^s^xaeX$pZt&TxXt5Aj&<@%=3l{zC}pkM9(w0~ib`X?4x%hnbLk?JEATMlix zu;uPLd-dJEOhkiP1PiNvdU)CiX#D%#}S2d)oFeYOuUK z(tqdQj%Ng(5H^}tGwOcfj|!y25rftDBn*PlC=T5E+sHn3eoT)#7@(HSABnwscyly~ z1Ai`CczSQhi^6&5_m=M)s8@><_a@ivPrkJ0RE_xen&ujoWR1jHX46}+))8l^k4zpb9A$3LBrj3wxh9E&+Vo9QPdCn&R!&)uAK@TMIGDrb_;G0 zHi#V?7!E57{CB=e`|09dGCe_XH6`I{-DQQafqnw@>zO18-2zGX>#lUB6 zvk2zXypMU^x1gu()z_W#^*9K&lL|p?lDIZ0h$sT+D+$3Lul|-|+vZo4ph6G-6Nj@1 z;znU%b!m^9s8FuWXo?EU_L1>$5Shbw&VTa2jR;zTf7240Lq0q_-O)vDBeu{ou_1`j zn0^7IuiROJU)3QuW59l|SrD+pZDM)@1MV=Pz6-ew6BJ5W5?;siV~KDJXJ|%|szo&Wh>* z^BoKY>V;zr=^RZKKYQ-x{W<);OS;Zr{8t`wsS_mhr538^t8LiR_-FVUVSJ3> zpf3-9;KYVtRW5Gjqv@qV~Sar(7DF*`L=RDc1Kn zpL9Wd%-}0tBH6xW$&dnB&eJvzPNow+Gr~>0L~}j(gu}Cx!nvm1g1SVdci|&dFhgV2 z@7X`3GOdeLUX0jo{~9WwnN${an7n_uF>-NyC#eL^(Xv|?p&5O1^he;7k6(2F<*V+s z2ydNfvO;0Nhi{<{8PLq{)9}ZL3@a4cMJi2a_6FfVofZ0~RL@!stkRHxUa&Dmv&xDm zyDpKh5|Bbqw6_)YHZ8(VdMo5^fwXuR?&6d{4gcqyatzy{#W19kPO~+>b?U zCC6RcL!Pt0wvDx&#CvRZSpZ4peiT%!V1Ji-Soq-m7c$APa}elhGC9a=Cz|UoPMIQh z=_3v}3KUYDf>Qm(sUJ~Hv;&Yx6qOt&PD>YqV~Jwp#5*$l#o4lX%f-?2#dB3q&*r09 z{eebuI(g(wi~8=>jt|}+1|GRefWm;vjIH|X&BYb$r85cbay*JDb~j4+0{c!|HA98K zR`pDK(Zw?xfoJ|;%0WIVBWgkc82i3Gay*(X zAyWGyCPVK*R0ZR74w2%B<~gFdRj&=ny@}M9hP1Inn(IqL403sIh~%JYjIj8RhU6uL zzQYjx-VmCD=i=10#QeS}&JmG`eUa;*K%@~m9{KRyotjM>JKCgl7*32*Aj09_u1?L;i)Asf@es?QU z#@YVme8Xxn$oqXh-$dgF@3(gyaNslur@yKe15Gc1TRwcZ>wZ2g&@hT-jV}%`@2G%h zK2fPxZQ6JZH=Q9*qdLa*IV$ZpR@@bsNIrlYfPxv5R$xZzp?stRo|`O0!blSnWr-1@ z%Kq-#Vkm)=Byg{t<-8Wd+U^3Y7DN77hDgK~+bep$Y0GESXPrfqQM3XG>y6b&r{x`D zkQqWUZG$y`agSw~L2SUwG2X%4fWt9oJ>hm(q!1hyDG!UDwOOnumg7f4v>NX6;Z_8< z4REuW3U?MwB6gFA1CN%!X?r9b!?*Azb_+uK6U)c&r^w=*2myRprI!Whxb&9bxU>;&&*1ioe!>V3*wW)t0o?jX;Rz>rAcxxsxOq#X zk4q;?alTW?P{yP+IO~Aj4#6qG4#8!(-4YPYskjJZN9iV|T(U{Y!Dy2*PH~|B4k^3` zzTXaM)hz*IohL5w#8sYnTD2#3=M(4v%V?w7fse6dUaY4qBL@?gEc6<0wmE+Zn zG)t#RdI7Z_So%qxdXIKgN@9%MANb&*> zToGiL9W;A#4tWZGLY*+Piw3_p)VrPJ0S*41ii69(bkbmS(EYJic~W3p;i%CaRe6aT~VRM6ZVj?bOQe?~(ZE;K~l^&;y{zDt?ePUBFyJwOYCghUFkC+_x_!Vqla>;hR zp1IhD`smXZ1E*{a1xfhPZet*5ONQ(0jraDPbzpoqNfn3t>>#kXtZbqpV#SOgEI@%w%4B;hU)@PqqhT&(vy7Nsr18d+|R58)-x9m9X$ z{-I64N7%S` z@3ULl)0Ei{*BeyCytNK%h%tQrWPZprK0o9f_lQAtbsdK>WoK4T$(i^)#rp$_eaN&^ zdlK_eoMJuki{JoY?*L%$fZ*3#0_OE}qCLGR){^keK4?jBYXaAn7N7lbvBO!`ytSL3 zM4n}(rsVSlj@gg(gM)aYeom8muGaI{CY~C@UwAIxyWiTn#8VD$+IFAMF2Wo{B@6RQ zQO4RIWmO`Zt$sNz1`9#tkBM^LDr6+T6?88Pn8bHgX6wkwm$cEAx*$AR#}Atw?fTvj zV+xeH+9pE`QUuR?f@6x^8Fj-Rgp$=B>SSIz$&7r%N0d8#`YYtuLmc z<02jPw(&-7s%NCwRrmI{hu0J5=&kgF_1vaNG&@e`6QzsJfOUV}qA9*X8x|j|)4#is zVyR26q^j(j(qbcBimAvrT^x}>rF%!>hugho>4!IY#c)!zsO@@6`mCUW35C|7fP z+{@!MiN&zp#^#}>4;#oeYqsl4vx;E%4QHSln^PedZ7%c22H)b}g7wx^730SU3Ord6 zWHR0EuTpP#z`V^Rb*Lif(PP~L0s2-L39mGqT4jrigxZ(+ZI8={w7W$}x8o%vZ3EI7 zCuZmgW^!6kZ$6%Av%_vu&*I<6&DUfTHM+cRK4^iZ?vLwLUdhr@O$Odp?K$uigEKa# zFohszsJ%5TJr4827BhTCwKe+qy`CKu+TH|CDNN}~9=*(IJx$}I8px1V9ZcJc!I zmG*EIjNSIN_BTMMdt=WY(rbvz5M<3pzEURgjU19X_!qUBFP;%}u64o6?1O98%>8lk zj3kO}>Sc22Xew$biwS$Q9tNn5D_NnLNe+t_h{?a#f zm?EXt`;u0VoMz}wsr2)fKlnv`W$zOWL$}j5OstzQUany_Mpewn->ptqbj{BrI#oCL zC*R0zwVWaDx`6B2(Hl-`d+M7?vljZ6E)Hh$+$LoyCi)1M9Ek`_3S1mmRqWgMbO`6y zpqQOh209pcKJbsgmcWj&gVa_LeZzD5R$ldt@QauhQSAFssXHJH$!Y9{#pud)r`puk zr4RBVN+S+LoQ*)9>^~w}B7(L?TO{;M7?dzNcH+l!IOtv8mo8;oiS@gj5TsdN`QUki zaTexe4*V`)33N|RN?4pwoUkpy`S&2U z`ec;NB1Q7ZQon0BYg){p+Nv1N>Co|By|G_=K$L1}_3tgG#vUl_r zubvb2`u1xBV#dpNFLXMb9N2#2>%Y*7h-aCfGOhDa=grvunG?IZTxe~ZNB`ch7%2qgK8Vw z?^9uSMYW99$xFP>YG0oJu7O?B@W=6$FY9Kt-fQ@~!PI~{VECxlrR$BCTI*Xy4S^>S zX|glX<2GwIY^^C9bgl;7sd-lO*Fa9)@e}Y5B(-tK5`RdMNDz0o=UX50>(SS%v%|VY<@tQ3?Exg$rs0znw!*`^%P@(bJ!=E1J3>t}-EY)<#%&b{d?#?m zb(-y#jG{o@J-w}9cnib-A zC+!AnFk!knp_d@|IlGh^qLBr<#zKi+f z<(;E!<3R{1hS_R}R1)c|F!1l*lrcw&A?2~!IS$_@h(s$48Z8Hf)oyiW?C+0{J2VCd_?hwPN94)F!TrT}=Kr%{Ll$nh2w0pA%#;wBqh z>Sh`RyyqLYsC`^!aTx&NZND?F-Rx5Y{oyz0|j1=e`YDk7d*Q`+RFfzr+8AYK1 z7Sv<~k_#!N1r=bDhevhD6Hv-qc`T_3e&d$>UanB;w7N1xR0suL<#O_?55pXO9pYg=d+8ysEJw0yMSfbmUYbAnvBQzs_P+{`X@2FSl5~ zRvY;Q@PLiS2@}wOms9oLg97jTM00_&%*|IUOj>2psUK_SF<;k?VbD|nn84dkDgaC% zqmv5IOrW@n3YeL|gD+G7m_UP>3eZd-y^9LaOdzC-3YeL|tu876On@_~Yr&eCK#Q3Q zY~vFa`u5LM0GPn(ix6ncjNl6)V0STs&xF8_W&|J|buogb zE=pi#1pb|rpoJtwbK^GwyXl4YT2|<#X5p)rPtWHMog%F&h8Np{lkVZ3t zE<)f+GlI{AfTS6LQ8>e)lMuL>8Np{l&_pwWuyfXCLeS032tE@6(#&3anc1radecS= zw*NQ!`cE1F`0J9+Gyt5x@o)~IZ86Xs_Dvfd26*`H_%bt%1>$<=XO%kkEOAJ6l=&q1 zG+_DvhjK2=A_tOlT@z1LtI1|(F+?Q08(0G4Q4Phkj{|A}wf zge`_lph1z4vE%Z7rpjQuGE2B%E|fcggqt>D44W5eiLzXK^KP-ivhy*gH!r`ZP_zb@ zGt(^iT)R>s>Db5k*RTT2c+;lFm|;2XrY*iNBCQ%k-5NwUc?FobFJiL5B>$?7Wn9lg zu&x~(rm|hc_xS`Tg=gGLeDG&)T|I2lFKVtmwvIO@VU+JBgod1H*DIYAH*;_$Ui1I>|h7s)WC0AY{92W6?& zY~Cln(;0_UuG-`Epj>*Pat4LSDqMRN;Kz2q2^`%j+n=_V5b*rC5E<45Fx4o4R4S(N z39B%{;W5*NLuEj3Jsoh>-=5qtjujgA#8lO%3GIer9@98L^Q_IV$l=N3S6Vq-0_jUyf`44Q)wh){uc0TKFcK3eyY!HBE)Bc{C9YA7BlN zsQe72wC1G+?4_c1Q$U2bQ{!R}X|}18tEh)+{UNG8eme#0-kK*ylhtUhkrMCrOCf^8 zVs23}yQy>=ZS)%|Smgi}X>eA`3ps>i;-f>=V4K7+cXbq1XcJu1HbfkZ&OG4g|NG~{kIa2bUJnsubn_n|5|Igrc(ZAyL@>${< zjaNH>?rnmGEV|8@d`Jbj?X`vg*uMUZThchs9x$5uP6#W7 zyZ(W2dksJsY#1(&y7vXbDC0AP2k`@G1bYC20l+so9=v=djbLWlazJp8QUN(Y!0nOC zLn(|d3|swfy9?Kg$Zq#VG=8VmiUp@r@haoE|(m5Heq?gxCfTskI&Wfpk;84MsX~NwuG=c{?;0K=Efl4!i<5i#94MjX5)7XzjaFWC0S3dG1 zN4gN)ONN3ajtogBg17m}G>$Za9o3G2;1#_ErmoV3GP_DwDEg)g!2n?TD0`Sja6ly$ z9#u{w_y;O>rzUu_I(Z9qN3GvU#s5IP?Lx2`GB+cO6O>!TPSyj zxidxlew&LS^)qq6`*Z^ zUulUDAMc6u9|fo$04%ZGAs}7{-Q##n4)Ar94DhZQ98@rfQ=WdzQ(z^vXi4{!0(^@yw`S&;@%v6TUm^G1 zkS8IP)j2P_E$hCthuF!h`%)zLU*{5$mzrcPRyumfOFery@?#*)^98?5bG`MZg&~rS zy5e^gX0eFg-U&#*La>vL-qB(a_@ofM>nyeb5LF@>FfO69*8ZqQtsoiEwN|D68?gH) zja{=ldIw+Z1n=RUX7KtGsR2m$!3vv;E@>R#>E8)nus_9u*Ompi3&BSjS!M+LW8!y~ zXtXfQA2V*T(k9IG;L`wA@gRcsH%G-w?Ed%_6p@xP+EM+M4~FVdv!SY1{vbF#N0mRy zM&u9ZwcuB9d+ZXBNg#H@#%5_`oT0oYo1)Dee$2Q2uCPcPZmWe@iee{n>+N z%Z>tMN6SJV3au~&p+3m|6)-DUvxdiez1zz--wcYFg0xL;XkRCh#wUR>WsP%bM3<*0bm;9wwiur8fb8ZIqvO zJ!}FRZLBs}9hCgLxAvPLy;d8q(auNTn9Dd+@eSHAvEP)G&A~B=+895rWBP7wbiQ_? zcYLF5JQFbGLk{O8j(gT-E{QJV-Rmdw`d@cE_6RUFSW@p@Bj4-Fsh^bS8{A!L;TY?w znCs7E&t&1SIPP@Day|GT7Fp!*pefC-pYq4MVY06jaFa1p-xx;ZcxUDB$gG54aM~dsJ!XB?lyO9g?G)N=shA3whLYkeVG+n&q*t6o0uTKaoq+Y5G_4_+~lO zXG>m$7&-V$B8-aTe#Ko4ss4IUnHM|D z_P`-~*j6>Mjn8-fsn0(CP61;d-|B<3!_M!LU?BCY5MSp7Nr}nQWAPH5IFbh~<~-`R z(%vnG$xe;&*mJ0hiPxw9g}9*S>Y%s6ZG15l zJBL@&y}?k-Yn?|+P_@N1lo+wrPQcHPSRHgO3@OQ5Gk+snBXB}DyK`aFJhE<0pQjy@ zkP{J^a1O$`iVZs8<6a6HKJ`3fp_c-GimG&vFY{L8KH^A=X;92lKNs^)bq+(Im?Jo@ zRVFP+JmxVH82PWv8XG-++Wz#a2WLons^?Jw$08&Bh;;T=Z*isqNcl-%<-H|!4j!Hk zK*|X!=jDcsjp-M7gOnT7Jx1i0rDx}jXVwc?4#1ts1HDZ#lTYi3SxzZ-Vz!F%h@ z&XZ4l7vT@BaaJh4wX5@Fkv0NH&4!Mbz^;&>%bs2#cz-zBsAmV+_SCFUPcvp*%TR$ALUv>u8JWFjSj~Z%i*iY za?v$rOgKKzU2TO9GX$gg|NB~7-a%{2xO6&^xCht_L=!z~YgsjWx*Jsa_z8Cv`qJ9c z6-mUzNtRJ5_?z)7%V^2M7LlkDX@tx@ERB$i>Vw*&`ruz!!9rFfOa%bs|2zOq9cxqVcAGX_+ZJ$-Gue3RImfGxe%jG9fZ2 z9sS2DplfE`OvguWA?Y~Q+&5!o=R&v5nCQM42rH(V=)M_9{OMazRE69nQVhANU!iZN zOs+3e99AZyu(Y4#sh8!+r`!{^%eO(_OqKkma^9cv=n)n2x$9t8n3V$C&X>Gn5t+r= zW4j+<|L`4nMPXC%Sai=Rt+p%CxE~UYm5^xkfJEbUbD~i~W-2fw8V~<#qLCs@zF!iJ zW4UVUSJSw;-RhE=btY30{{KqT44rI*&L)U88X3$Bbgt3zwh3~LeodfQ{yg@g%7&>L z+m}%j4j4AnFrT(R|M)7Q_E@7S0M~p@II_Pa9LfI|3CAO#wXvWj56W}M{nfPXOBKQP zkH18W6~1{H?mH%F3{P=dULpurlRQQTB8@8ZlndYH*Mx{Bj{o^=5Qm;#J}kb zH_}x6FoYYY;(P`jXPn-dXM{MTl-CRLjN`!ZwdRNQaOY1a=mekT3Tz?gRV@*+SBp5S z`A4AYyKv~3BXa|3!G=&HIwo9=k3p#M7=#*+3E{P4!m04U;;`sV8~mAlShSRXOlWl& zzU6Mgp#Eoe2q3`dO~_^bPQ>zopyYjyF=j~7WkCkS7&9Qom;o_Hc;Xe@8R5p3W;2QH_~{DQk@8@-xyQjzp68cxQWH~5#f+7oP5+IGK1eO*rMeL) zLnoY+Ktboud&5n)d2+=;DoP7|JDKLj9pv6kyF`wQD>(%zb;<8f(Uhz*p7>~R*XTDqL(U6*n}S{T=*{hYS4)EEIr2@ z30y?b(La`vj|3Ib?-X_rB3#N>qTwf^A-y=_QnU;IG>khL_D7J9F3g5aePwjRZy5-7 zac`mf?U-bAktiJTz*LwQfX zfxMsOqkBTBKX`zSAZ?*+!tUu8k)xl?-tN1kU+!X_LqocIcQpwleKii2{g7h~U#Bdx z#gLseJMV+8Gk&KPbWbS@aOPX^A%2%Y9ga?;f-uDIZhE^8g#6t`N=rOwoJtCNYjz04 zCWhv#Ny{(7%g=|y_uWe^ISH}#Yd(SEk^T8C6sHv$kL;XKMlt2eKed?Ws=y3)m9J`w zYWC1o`xYpd3VfKWMdWRd{ri@BT&=0mUaxsrJ?b*Xg^Jb%rv6S;ZQ=_ar{&f*rT_wDm5e<&4OT}wEwd3!QW zE%rj=tZJ=F@2I&2QR9PA=NP%DF(>s4hVI|z=93+r)=*ZrvBA;P1^&i(Nkoo_v04Mza77~pioKpkl*~(9sM-h!a){WdIocy5< zw+dSwTNB-)_xaa5+UNzz?=XXx<&*FA7%d{hT4%Ms>Y7Tor#k20lDof}{xrQXIeNw~ z)>ZbreNr#4=<(i3)*guBsh0DCx=>TBX@O~;yLXV-|ISyZ#1^{`MupY-aF;c>$8#M$ zWly}iIS!WJ!}MU%9+uQ? zOX!SHG;v?w_>q#463OtCu!Z}ooV2>oJ$gR>cJao3aZBx#hvHK=9E(rAp^8s6EI;A+ zVd(b-qQu~)9ByvO&|{>rUW(J^?tSby^ofeBRS-mt6I+?hxZu>Q&n8Jj%+?{1g}?Al z47oPs!H`$3*I23^s)1vqHfhVe-CvfxEO|WL<9L65O^hmI)DvZExjbJ*x{>^CBZUXy zZ5d&Ws<2TA!*#kH12+x#3JeQ$85Qu?jBkBr@F6U^&gV|_P~Ljq9f4U&hmeK~f&G&k zywO{q7rr|^Oo3;gczHO?7&VC)HCZ(_Vrs;YfOCy`Gu!_=d0b#Jolm5v zE~k&q)tgLp%mivd#L9@x5t}3jmwY?EDHg5`ny@eMnX)XQI^kTxorHlsa=lcMg%_r) zwg+aaTqic7a#dU4z%iqXzYVNhv?b6v6P*rxwy-JCBF|-1O7YsXh`H!`#KVZfgm3cb ztYdZF?P9bxtz+(Ad2jRNnZ36R-lE#_pm%T0aQ2&|ZhP0v8Dt93{g&W+Jn=XC31_c9 z*x!}^>9qSaKtTwi)9iz&TJFDO)gY?&AM{7b7yXf-y*_9f{A~7Re$f_ywCwt9_JP+I z`j6T7A54R+`Jc@`@cN3sn0?^&-TGqowWEeEvk&?;KAU~Cyx3{>f!AlY3TU&>Y!!Sq z`IN*W~xZnf*?+eB; z9|1k+H2TInWYRtXC>N=+OJ<*d!dJj1*udtAC4Yj^H{9dzLAegJ(>G|mY%^{2+4e8O z(!R7$&}kFojPLXb0?0wM(N_sh9~gc0Lhd6G8Xt-Ow85=F^1(*G)Q}W5)Ew? zq=Gc)*Xi|@TN3r|$^3dDV?Uozb66SSB^Z)T_O zDC%_jPEg8cpb=J4QQK*spsL8q?aH!e;a3S7Lrtf~FeMBpxbFgu;fCWe<#>OP7hJq+6hTFUIJ?rBHJ(=m7O&IaNQcQI zJ@51Tbjts;2_`+(w9`HKC`(c(eQRj<;9ky4(K5TG_jm)m?3T)v{u^DE=1tEbST7yB z5Zh@OY^Du^u5>A5c~`oWV2&pL4PIFUgHdILJMDrA;Pk!yY!__WwecLjPWuI?$%``p zuB^jdE}z+*?=lL0CXJt6z7HjzEdoY(r$u1)>1Qj2g8;g;MKFlJr_;luB|>)(UYCJK z`**<$I}JR5C7^P;8J3azZP`af#hjyj2Nq_SeSw_}_FY^2P()Vp89RuFA|C?axEbJ> zK>P0Y0LOkqD&$T9j82^&Wd5H%n|7#DK!nPjDuj$I7nJ3Kv-(5i)(pg5J-#^ZV7pOO zX2+e@4?(s+(bcmLC#S=pA6}>R!%F_ziPvfUu(#mDKs&bE4meV|^2!hL*B<5NYpR9J zqx`pmEkr)X3#CE^j`j>7%y#`mfe?ko({A5$yE}qLi7gFd5cYe>7AePDylQbgDBw=> zAVAxn!M3TUwZQ{6n5zb`g0}yx?Ib}Jhc4m(09R>cIahetH9su=jx4T%s1oK zxH%Y?g$*FewB~TCu7_-@lV~bHb)f)d_S}RP2-Uc_=c}NZ%7=U_Y&p-JX%h=bt#NLY z(BAx=2qN3gu-dj`rYit-3;-2PPKZx9Hp>;DIcClvYHI@TS;Vgit}%{2iVFZ#lcZBj zKgcuAOvcRUlwRKPF`ly-ohC$X!|*N_qR@SP2CuUJ7RO^Dv@t)yyT;oqNI!_PKE1)S zQee@LP8^n6FCKOfH2A4wBYJh}c;{LS4gJw-TF3i2^7eLnXc09Fd8Wf>Emzl8S~WrZ zq*KW2msxhw*S%R8^x*w#PUi?2mqoZCyTA%n(?TBI?c3*tH}+Ty-M*iNyol<3K{z)Y zL9efAGYEN(MOLUDx*p9!Uh31yyT}3ANCiUPLYy!w9LHs&qiiiUwzpl5567|}tj?qT z3@xtVwzq}O$qdIgORP}JQP%%64GzA|ap%wNm%RTlUgq(ugD_j>1wC5^M$1gv*}YbE zoUGZ&G@K=cAiu$28ErGy(*7IH91~*-p1lTlw_L-V3@2kxk+r9Y>nSScdx`{}BHOrL zZ`!aI7I})6@H1he$Au-#*)T|^k^yqwHPv2wzf+=XpN2)%}#${z6e)t3(8yS7_wqUa7`m*_oE zI#QpDBcF>?T0uQ?c_U3m=^u-oKaj5w+Yi6d!BF^$$a)a~Jb~q1v@V6rp=+D@tPAzBfvo`a*nM20bcIfs! zx!4qM$}*YWqfArnS61dhtSHkcve>7RaFtviE>iK4>P2^?G8wGUCj_dRk+Il>^U6#h zxnb^V6Vqh4e7Sa|iD58tyDh$qxywzhOk`nLN-Q&xt%i)mHW(&}P{-S)#8MN>kcc|a zX2w#JCA8|+SiFVNM%|7OiFHXCZRlHMGFTe+BxNMMy~fJ8f->l3ns}2yNpEZHEbQ!f zOV?wIJsEAeNq=MV4v~A$4u51MB{J+1EnaX%i57?}YOpxS#Xh0L{x`(7haGff7C%QaD7I_N4)4?7#q?)ZQp4Mva)5!0BN`#{2flWH?}V zv}>{01L=F240>DC`QJepo)i13{T4`pjV-FU*DvWF=XI}4pSce|#~`HrMMs8QAD z=#_n@dvGC^yjw9-)=%2n2%~hA-4tXauIcJ^=9ra0U+8tV=u`rMO>1SGFU`)N6doV; z8ExW!&}Qy+u99K8)fpz~fE?ID>wyVoIdB(v`Ucfei`c6~^O4imw@#CdAOv#irZdca z$)MxKF%#%HItb?I$k4BrJ)c80Ha8|Sd7H7P;CsSTKyWZ6)Qb4TRQMPz0slQcvR48T+&E)cP_KQ z*lsum;x+mJ-OO{r>S#yqD=;q-y++mYufdcDOLDRfj{w0%hO=rF#jfXu(^?_z?giP* zQ7IG-5L2ociagx}qpAg4qy&*Q;lA4kX-xMGm_HMLkf6;4OyCOrm!n_s>?S6)_T!kR zbEwlbRG;$)lTxW;@jkz)QoMiC#`_vrSLMsF?GR0x2Q^+t%S!j%kbv=%rX|gu&CB{- zP8qpXD~M#Hu=bi4z74H_wZ>k9Mb(1q0%tE|gU+k1dbDc#N~@t``>~hEraBJB$_!tD zS!o=kt52H>gM6g5^0K~ffR4~QE=J{FeUPk;1GhFmZ8I9LBbyZE#qfjO8mXjtz?PsT zZcB!Ove=~gPf;H&M15v;cCE}p;fhN<2&v9O0avx*QJ1yA1kPz=e-92m823tgFLMi6&{Ou58tik{{pHSNRZ+rg$Hs;ZRWpd>y;7d z;gVX-pYk>Mg)XTj{Gne5`?#cT#zVhGH*8&?&3Wk8%!R)|D>OV&0`G{12dnwc3s&=o zX5e`%n5}B2EQ*N83xpXsVK4+|+;mOo2)B@;+#H1>v@|zTk?5A_rX(gg9L){ZOumqN zLonrL?f}KOsSk2F#I)AjMa1+^xrIK&3{H_tPPnMZ5IIvPE2`#)=-k%M4nn%oMWi+K zz55qkS08elS~yN4iHa`rR*%souN9n(IjeVW=D*XfUTXv6Ts9PKRhMXqAdL7|wFlOM z=RG^Rrf5daoXbTc+|Z#R!?IEf^0VStOWexCwgg=fpgOFhP>fEl)^!UHu++gwvUghj zUG2qGafzEgS)-2$BAAnP9G`f3+Es0$UPs0Vbg4-(e-=b~1mWjfs*PKCCH-y6t+j^W z=umM<|5EW(U7B7O>AEM2+7rAL0+9u?_AK1PE0Kt7%B{4}ty{Y1z@D>vN&@``>}%fh z4qkDyDHjs!c6lozTZ2aJ>mEa2Yk~T+;D&9tf{2==8s2vGD{ZQWzITmrtA?o~?aou$ z?Oq;E1y5=|)bL6i;mdXp@r;bO)YhgWLIe&FOxZvgdK4*HDrikqsnea+NVS3_%9o(bbfw>Py+LZU0kLRV_(CUY$vSUZ; z#c164vY~n;E4P5FOMF$dsz_q5wC9zC4X`Qa+8-9b2^Pb+8mu3r&$2JHUr|`eJ!*fE zO9u4PdClP(?fY1-E7a`?9X4c)-5{HC-r1medYx_BWI^h$T5*_eCO`ESN*mIzTRHp{ z_U|hjQaxnxFIjCJKi2H6eg#kOg{RY<`>EtA%}77d{^)SUm7ttBp;z$($I^OPh@ty_ zriIRG^1D|v_~hO09>)u7kLGSw{i5QPBox?{FuYJZZ(nwYiW|sP&RF8XRR*{-fe+S~Gr0%I( zvh{r?E!&=UFt#cIZH!-jf3p|NOpLu7bW3GY@9L((zm2ZPDj%Ndw`Y?=UQW)suG?Gi zGtBg~Nz{p#r8NEw^_3lo(|CzGTk(T1GBwiWee{;>bp`oTv(`CQhRc zb>i2jYnYjY1xCa9dAJritP1`u`;negNeoYC{+8`pfI|z3aw2(ja)?2hjEAQ)s)nbN z0qJ;hG9x?%e~pZ{1#BHRc=&^$gy*PUvipFzJS(OTuj=Fj_Z`_}erl~lWMl;RE!`j8 zOeAk6)-WPTlsuPcY=4Vtv*e8w$uO>v{<1$jwbnZF=GT2+;_hi8txhNk?G@X7{`z9- z%*it+L93j7=Iq6J!M-n1WA@{u$4QNax*%Q9^s=7C=x&))acQu!_|N_O_wC;ocB)5X0oA z3B2I8XF&v`LDyp<^6|Vj8HEL|${PPb>K7%}+U^Z*;|KTNJ8)mH=e2RRdmTgE3xb9h z;QiJX`|*B~8~ig59yI+AS}uvM{@`w13J!}HX#t^B7`E8e9Sld*FWtcmIuQCAXrV`E zO8aAE>_L1>rJmDJ!$RsGPX-GDHJ zD_|PTAP7g1OEv7#?}cossc+Mrlc-<6`quh-ggIcIs`fU&);c`}5^YcgFv~+}HFVp1 zA&@@cH&52UxHV|P5z;z`33UafT2WV5uDGU?-<%OEb|U#TvGR;K;Fvhd^$48zQmVzV zr=$lYJCYBHTP6Ba;`nOu{Ex`>j2QS0j7PGRi;p;`SSw;4h-01|5vPmg(FC}`Msbeg z2C|U9(jkBWvPU7G>}*V+WsgFBAwMgZ%V1=YJ0;Dpi|}5AR$;DL>#&yW#hXn#VuyMm z=+-iQMS87L^?f|11tXmR#R|XA9k*vg?zlVQws?_HWvb#F*|@A@4EaE*fUcZhJINWb6-)95)tB0}qwVE%u>^eo+c6xZ=6vl@UYwdf^5BXu)ThNE|zhU>;#ZKwq#ve+ei_oj@^tC{Q(TB2U7P_#5>@IW^%9z~piNE9KFs^7>H{(iKP8fRfss|DZ%{ z`aLppo>R~TRc{(8pMmm$MvBGS@Si7FhmCU++xnE+^k9%Lbn z7LcN8w0v)u4XcU76~YsO?*%6WBw@zRVR)%tP-TD2W_!Kh!aoo)DLQ-RQb(%r7YI#; zaj%^a@{o1(@sZg7dUQP!H;C`uyNA4`2*_BM+5yP}fRKlbh7ja{FG?nj((aZd49 z#PpNjjCmtYpCOMP0}vW#JOL15o$hZ&kY$$JKM2ZlLs@Q}2zuOwAUn`M%n0%a1a&l@ zCuiJTYS_E*;=|oyGjc9UOs3bZX51`jSX{rY$JVD@$TQ|^*nOVwf{|nDo7c$iC*Lvo zx_@^zQh57Bb4%A^HnlA4T+BvT%_{L_&G^x#gvuK#@%P;MTY3*Z(bBn?ySp=w~)a(MC^AuQ&B^kP2qu?O_u|Ln~2iSf1OZ}}_n;)#h+Pd(_yFG1V7i7M(=?I>aTyxwP`9}1MkOwbGSf4O;@&#f1Ohdo^xj|VZ z%V%xsV3BEi$2FDuN8P!P-7oZ+I0hyi{qfBQWx!Ws(8b?`d@rui*(b}4{?_2Ulwwxg^y|_Z&qiYnDsAr#RlvtuS z37qtTW++oj|3M!OKBL91(f1CFzV|TspKA3V@t0)ApA2TRL0k2B%rt{6i-5w^A=}01 z1Xb%-sjAMpG{an&xaVQPMD(+R3dx-gkRwTofY zm1(Ghg@EU)sIbjT^(@swbl+ z){$X>vjUI6o3lvtovK8|2|S~6({?Q>#=ne2`Am5PT}!HS$aE#$=<=EM&=aOVvmQCR8 z_O?4tg7f7H6I3`repdX$et`T~{=YYoAaTF7cY)pK{O3RS-S^JDsxcqHNUy)XFASg510|=>3Cl6eJz82>Z=bR4D({{?k^S$`Wb(f$Q%+< zoGw>>N};xX$59){*&OQFRJgpzX5ORGgau{l%9^C`j5Rz%wA{VVDh%&j$S~$c@W0WEDsDg#D90k$=CC|%g1>4uCMRhdCj@U@b%fk z|MPR*Yq~(8EZ<%9Ytbi@eV2&5+r&miFn#3OH-C$fj}`mfu^$Yh4XSCy;!ER&V-l~h zwZ=Ri8ON{;C?cr0Ha&XXNiWJ{dZD6~urRlJ-u=-2=S3+Bg40XLY13Oy;yGIEAPDf1mI~Ib>-9@mPc|wNoGh_(KDKo>9BEvP@BP8dPh`1zrAu^np zg+sZ8LMH<7l!>gJ*2f{MK^$*W;2G86`|oKB&hcWc0wa)_kc_6CQ1p5f9fyi%&SRnw zm?tMHeW|gO?HB!C%}nbF<6`Eh|H>jTT@NrcW|38m_L%q>^ng|!IYEi&zbV%*Ou05f zxqhJnE2x+^Y`MOm;yy{9i&M%e3&(WzCo16u(*wS=m#dSEdSf4++E1=Al4;&h)BI%1 zVtWCyij@?Jpni+0{nSip^T{gM3+2Ghb88OUUIV+%-4jJg3Z`FidtBT>TUE z1kBa1F(cqz9kGM ziO3^4zlqL^Fhh>ykkutqbK8ej955Lc)O2B}E_2xr!^6kQ1zD18g)ei}_YJ||fH)Bg zhQSZkh0c&N*xly++xXk4yD#SyoW5VA-*5M*W=Sp_zE-oJ$msVd`YocPZzJ~bg~RFF z7OKB<26MPx0rizQN*rG|V(4ED`P;^!c8me`oY68kUmBTHDV(TcM*3TilQyZU;p{JMgody1A^jy`xz z(R(VH1DCR%qbig1iA)o?`Kq7FZk}b-gWL(yynoupm#yvgD7cDr_ftu zq;(`k+Y@?UN9zkhl#$CKHIW&S`mUM2nftH2sc?N zIst#fUn#mJ!UZcuFGcuna;2zNglCbQ1tOv_SA^w?I0YiCK*T9LA;M0GIJZRDEfJ^Z zOA+=`#HkfwwJ;J**v3pDcS7rEufLt*onl@6>HQazOaUEs-zzDn$}%eOF%|QW z!T780P;t*Cx5X)UDFdj#=TyQS=6)}uboFN~qaNC)7TU`-EtKXVHEn<_c9Z+JMVc#s$=EqZw9e*+bAjN| zKriBk^9lGf%*Adv--5q5F@X6Ld@$&fTiiUG5*@B+y~UPAHVY$=2mPGoD|B7pB($QA7mpO6WHJ%!zBn zIrM?Pig3Ep0eAhh_mtNK(2ndKsdkqKz z=7t*);S6atjF`LA@NzqV$ac(jWB`QYKjVEiXoYzO8iUe1o`J$EPzYL)#q4M9_gyjw zT9NN`OevJTafDeD1g+?vfwl*&$f*5pskjP)R%Dv}vT3FsvGp>rkF-s5$tNPPpPd6a z;XopF0Rxb_!sH8tC_`Wjn+HFfPaN0;&qJlyH8Fe7!!z8d%Tfr^T{4hPbe;+2e(_W$ zb4kHMXn(R51q*lN_C65XP`BB~42u)m>aRNat04N5kk4Ov?`TE96HhWBD9G97*%2V=W0pYxga0 zg!~@iPDKCkO{(z0wD0Kg3wEwlD8oP8B#6$@*)gN~Bu3T@=NHe99L~Q%97yyTSb5RM zYRGb_*t_HwE?c1_MIy_lshACcbK;L_0cIU!R5!t zxfkDPG}Q){3HhovkWc$-8`klJ?;DFLe*s@WU3a7t8i#kisi2N$nk|3w(y>JGcw}qJ z1g1v;OdZlTU?@2*b86<}ky+s$Vh{b{Q|x<$=M$X|a&HWyl`fZRoPQZG7JhwdleNFk zNpC&*nUmWIKT8c7R~L6s$v!?ewDEZ6I2Y?T5BvpVHh7k=vK4K~K0fZlp>p*ay%V2@ zXEY?!L0PRc8;U7?v>R5tlhT#5=B~(FaWV5zns&ck9}t&{H4S+NgXu?|xe8_X0~6?n z3(lNUD5LJvcZW}S8?8_dE8Z?_9cyytGq<9&>sd-!mpGhXrzww?SvB_11`wvDXX>@~ zi%0AZn=+^T>eK_%79Jm`7*XodV!v~S8qC&yR?{oS##G&0@nXfoB(wm2{-c|&Zu+p| zQCgc&;`k328CY-Oi5`26{YxJ^m}}V3RWOJE3t}J0Gc1Usv)e?lEQnU#y_2Eoz5ghD z-A47dyGh@r0jXMr?0kBI_S~ybPJL-}=gEGnt(S=W+r%ox3s$=lu_3B(kF`f??D&o| zUL3qjSI`X_bsEFh*G@0{%?!NXAv0ul-;pstHRrO}tQEwD)q@(Y)R1-0#bzKmtm~V9 z?TNl!g%Mu`w_4}+sY|<#tODU-72Io#jtt`$4CXJ4hWvolkROl_uYtvm8N;ZUF^q0M z)mX*GzcgfK3l&*4?8l?g_r5SX}fYZo!Y6Rp5 zZo!@6_Pgtbxb_C4fa$b~A5YjDIwmtnmoI?%bYM-U?UaNKr#6e)l?iU(TY8M~S6MyJ2nDxO@J<%m4Vv=Ly_dtTa*3Qdv`7 zWn>2O#G1F;OU0Yx@{IVq9XTlAlxUZngPjtwH&!dmO9lxTfdi~ z&82JS&gw*ORw$hwrr&u;ui2~!J{IQMm-ep!_=%?NuIjd0zu7#X_Iz`d>&g-9`viEp zcop?BTm8|<3~%H7Sv>8|z$-mpgQ(DEDpW4Ld}F=umnI`Vqbgi-dzaeGt=#32Q%l$! zqODsLRMR9y2>k*TDX2TI3O9|Ld$2$!EOc=$5-%0tgfP-3vfs#VDW4f(p-Aklsf@YMJoujF1cRnk|I?)*ljQ$JP7{9W-E1yKi~76>;#Wj@ZU-&+0;tdV(nZGEB{ z{#eNG14A7KYd|^o7I-swqaVDGZNUL>Wd3n;b_HHsA>>bi5INk05g^tINQk9jA;($) z11=0tkN_syvBYgMc)#Us@&eSQPLpU2udH6r)ZKc4lu-j&2+R2I=LK_BK2<%?80k){DZV^M+gq*GKPs7IcwPvsd!nT7Zr^6NkX}duETKt+R zPxw#%*9fQ|0(E+iE;2S_!l{caJy0NvF=4=k0e}m0xxQnHk<8OkZ4ThVfB_d>pgb9Y zI#NcNxTVI(!!`Y68WY*HbXn|383&;Wl0U@^x+sUqsR5u1h?`*2CX_^;@m<8?2~#n= z??8(u0-g{^nfAZ@Ar~|We-Z_QIowZ(jf)e$gK9-sg zOZ`W&?5OcXzaYOLN^{x6V0fZ4^BgyKt^Hogv*iZQ&il|b?yKGX=p&$9i9d9D)NHXG zAcYrkz+E?z=pbz6J?XeWuCmW z>5X9Uo9sxmdi?*gBJ%iAL}#;Av{~{w`1QcZwoIhf&*@Lv1x%$39@;06vw)H^bDUhLGAOd43M`+~ zQ77|t4ujj`+f1FbbztzMf1UElZLgC`t}L*HifLj=UM&@e%fE?J>L~{xdAKa0mLYlE zc9F$jMl}J+8z$FCWSS;wT9hodvx*^k7i^d^xnWJR^U)t=5|wBCiEUrQSlIoDiB!>* zi5smG1r(Uq---oB@p~w~hwIVuJ5v`-S)ARL6a`PV$KF)t)0P^}_VWJ-s@A z^_=Hsk#@mndX3K~sZuer&hpoD!d6mG6$C`4`If6BtxgQ*3j26M`inpecg|~GSU36z7j`fKwmLu`ihh1|I|tD$O8m5ul+sl-}M;XF5WlaTj4M> zirughI$y)Wre!n>k>D)Tza{Em(;j8+75oCLwjVm(e%%9Ps?&)w)OB}NrVcZK+TMzI zEM{8Ezx~pj)n^Qak8VaXaOjaa9L`eET!DtKc#1An4!;3r$(kyd` zNjSuQ+~0t|u);ei?DIilCkjMo$wSN`uGCF!*h9Pm5K;#~(!xB_wp}*A+>Fdzbh0^+ z6P;|{iy7K5H~$y&7j3UtgwzV2aX7_nz;2o$s4sn4h?GUJ4{AqEz()5C(_h53Uzkqd!iq8fEupby35`tVWGxG{l*M$FF@(lc7AKJl9aA2PWI>Kp*fhVzJW+IMsyCD5J(sV0U=^^+w!s#IcEF^lzwbuqqIRk$UBGyTk)cCIn`&EznyH3RBm-Iue)VTy)1UTxSPB2<$9gPu>HH35>Y&RptzISz zn+ELaMJf4#etzC6&(X?Z@WxWu0bYiJ2tQG%!!PIGnDZxN6Zm?9iO?W2b1u}`!wEm= z*{(oC)&nTe-9dqFf4>U0erDgflY!0v@MAY6JEsg|=10tUNyX*9uVvhi>vb~pEKS@& z4BRCX58@2~{+YzByNW%^2?z1VB}B<};tCvQMtf%7$b3nMM>0BQ9@th3%)DOPW)KB0 z#c<(#K<^W?!(& z=LtuNIFm)#WYJAd*F|_*Gh-r{a`Vq)T7HEd|0Ri~1q%e9$dkl(Q~aIz2`#C4++fB* zcAz-HG5yHCb77vjV7LwMMH{?wU{~3}hRs-PFVgg$$MyJF1BL*zouk`H_Bru6ans6P zi<)%;;g9#(%_zQIfvy6Huty!EKo?>%r#dR|3l;N;N*sz(E2y|{lDFcN_f#e2sQyMJ zR517KxjKqHlLKW`;V1i4gXHUV~fohvSoF@yYw*yZ)K60CYz3msj zh`SWq%&dxw5Bk}zvKk&+2>c-$W+9f8?|A_~5@@e+S~El)Y%^Pq!8RAZ(O2PWT)aBc^wZ*!GsN-B!~sR{e%73% z3r($u-)6mi_$L@XzSF|^qF&p?QPJCreyRNPqMjLEueYqS7=N#4#^Ia)F{+^`rfBmM zJw6kD`Y64D9b<&U5b}sX5MwbBE?LOR1w+YVK_F(hh+IdmHYd*>G4ddY z*1`G0hwwKKNg{{jEEb`I@XviCw^|)B{YFAYnW^tLvJ9Lj+nDL=PJf91)?ry@h0W{6 z2ACNd{rgL72OOAi*&)hl2Nn1`6_d}ZGHa>00?8UsW!6#m#OeYnVJ)l5?9d&U&r~>- zZ=b4_Xf9Ejd|0%K%VOVBfM#RuR>907!7hrK7}`3@a8{II?6S6wwvIW*JP_K@NXaMd zGI5&0E;JHnn{$MHRDzV1fHRBB=d?x!u7qo96p6-nshuqwDa6u*dt5D+#m_%mqQ~!t zao{WT+eopYE6%|hU85wqAW2(p=MKZ_P0zQc-A0+YAtetU)AJR|(nlGiHqnU(6w0ky zPHn^XGuAITQ8#PO(3JRA@a5?{1d*m@a`;j)_x{hqx$4I|O7y*Bo<)m3sUZ&vL!YKl5sHI3-lH6Jn;2r#x#T zd5IN1Wx_hom#!m2?aY+~X61J{cwNJlyMjxo>w#(8=~<=+70P=rdo-L_QaUZzcyaeT znNv-7DuTQ8$q8#26%-}-;+kQ_d(m=s#B1lsy4*W&=C@1~t@ez{O?dags`cxZfEbHg zdL_eKHY-ng8V@H|nO8aKl^8|(CPt<7l-3RPu*>Y9X&2c)><0AvC9~X;<@*%HE*o^< zzNZx4GNfQHQZdti4er^p|FMzauNhT`v-3M_#3&4dadsm0IdwZ3L6w=YdQ1o&X zeSy{~L|Mvd{i!w+9u8KHLH0ZG=-kVhjlArwU;P!i?HCf6Pf@V;i!p#@P^Hb2(5UWLz#oy~}uu&RDY+ zM=-g}?#Ac$A!n$3sqvspK8?+(SmL?P>LX+LGm){Bl) zW`OTfaoY`wjE{;2#J#7#_mg6JFwDq*yH@dxw$FjF*3^P{dSoke%vPR`>=|F4e~&$8 z8Rt7dH+~f2ahPLP2**t4Q)C(pF3fy(Kx(=x^_huTI2^ReS8?4r%e;M|&_>Y%JkUC| zvi+Rx&>gf%7H%+l2#69u#5Old=RsF(CW$BkP$%J$j>$n0Ob)J-g_hUJbHa(NKAEmN zdkW_8T|nP41?tS0ra(LC$sRs0=IGBJ#*ms@cPr0jDq49*^#tV%-tC zp#~e(uuPp;qp*+&ne)d6_Xaye_w>S(Y|VK1Cfm7oEa2&|RGB-PJ2tV0k5w)I4tOBf z0)YdP1w6x;vsXAq<}^$e=q-!!lrezET^1K0AMBXoA*-C>s1A@NxHD((+%O#o&jY~Y z>6W@qu9+-@<2S8qp)7VO0G?kYe8+XfZl0hYtHuD{`CA9OTp(fVBZvN$pOUp>tdiU|B*z7J^6MhfA3O^u1 zhgH}Cm@-r^S!Taqoa7&r(m3M%Bt}GLXXH8Pt$IK&iFhTzmxR3S8E)(K`;?%2 z+}VFtG#pIWU4||j?XvLsP>Ui|2--e(EmSW<+IT@?KMjN*XWy$KJZDq<*y2bMdFpLiG?Xp z6izFNrn%=fJ1~7<@XWc}?A&Oe5UU(M7&Xyzp+NgMG;V%!rT-(gKrcfdU`0^q1G$Lp z1Khv$0p%rN1y?md;R4;*10R58;7bCwOS z66ES0RKZ-&zP`G>JYlX^M0)&Hp6pa_j?P_tHQAIJ+U_o9N{J^#3z%2#gN<3f+$n$? z3jX4sr0O1wy?7}5o{F`t8%x{O&Mo3CtlG)Gr-B0hS869%%APWW;w@NOo>GB#shB&g z+IfwNdn~ysPPsvGK<#`?C0t_&#nX06OLrM{2h>i993Fyb?oiX5!O|jv`f6Ki1CFu{ zcA;!}jcT{8vuj>PIgV<#trv?=v84quB5=WfVuE>e7kp%v6=**`awx9v67U#b;jKIk zx9ITvdkb_%cIG(;_}GVKIDOl&YK+ zLb~G+USt{CbkO2$_e&2ER0}PKa$%~a8RHB5a-WsBv@}4e+6>*XHTUy_%US)EQ6v=0 zqHaM0Jcd5AhlUR2k{PRQ?bkwAneeMS>V;CDExs|LAydy|;E*NXSJ>CPgnKg;J?V{f zZ|8t@K@$XH&epFes&~0Oz}Jfi^ztn?Ug)gMyoClxXr`Q@npNcvIlnJbm7$on;=KLZ z1I6yseT3yHKIV4C3j^adrA#5eRNDDTjLV0Xsh?ds8lc)$m0ULQ%#A>+t3IWnxo@6q z@^~BM9lB!9!y5rDepy7l%X5c_y8Wd$v7hy!W;dngLCuz{?EK_6oc%kmu-6&BJGRRF zBhv!M=YPYrSnUl0=ba5l>JhL2Di8ysXVaVSx=Ffn6wSG@`pC?e0A}^3pPG$by#$nN zY}n;noQLI5dMm}{mh0}PKP(|iuM?M;Mnb2j6JTKk zJgJ(10b{Zuok<7tEyM({pt=b|NdkyEvK0lwcgK_NR>7w6>f?ufzClY5`a8R^1U;!n8zGL+xx~KxE4Y*aEh~y)=y??Lx@t4!lt%?F zh1XS!nTpDx;#NsQ=ZRAmP{m^PDk>p|eO;Bu60Y#c&nRlKeQKFRbBKDRSximSQnB}e zaQPZZMu?%LM%tM&jLXpU$4ijcji!#swB4v*Sv?De39uV{FVZnCfqhh4H>q-Jk=erm zJ?M)HrFE8ixN~HR42V}Pj+!``(>ZPhM~6JngNot{;}dPC$i4miSo$?k4sSnQ@!=fo zy{oAt7s%IcE}gs0fYvN}0l&Epk`V(RyD^rSSpg-J-_*C=Lw~;9vpQS7kyZrnK63YF z))QL4gc7L+2l_W(u0Awq_wsEy{hAMbxi;v2=DhCrK2|;y)Z%y(XJhSyq5;o^6%3UY z`V}uP?lF7yF+Ki($8|Wh#of!o$CEOq$=cZ$O#T2v=bNzX86ldxirGy#9}JyvQCN}N zaAJQD&@P{pEFqeg>v)tUKt@sIYuy?4oh_nwD7TpJX@XvIIz2zb&tB>(BFJtKbp)zfq3 zmDCaT%ax6mM#2Z)JZiw=2X;0yJidaawq%aJT->sk(VZ`PCw?T~>~TLd=w03Qfn5G? zK|h_$9a%eSvWt9!B7dLDA|3ky@?)qQZQxFkGjTRV-nL3xnhxPpRWK&rGWy9Mf2B`t zo)W**|A_m8AL&zLGC#ib|GMzoSV*7h!lqA6cAAaR#C9X3!C)ugV+8S2ot)=j}Z9BO|j9#v7(*tjS!5VV>t!CO)bXy?1C(LNT6y)y*_E5f80knR%Rn*Dw8FD zNg1^VOUXvokR@MTbA)Sr+LnPQP}%)M$IUyoM#F_3O=RhjnM7Wcs>?8G&2e_y=;U`%6YVBKolmu zYJ?iE=b*hD>%b`NbJa~FwE8rUJ1lA^mRUL;o#wp_=U=M2Z-i`5^DYHN6=Ri;jL?m8 zUI85(g&lcngkFCxhyQL)$Px6X5o#S!&dU#t!tTC+Ut_~*-t6H~SozggMkuzNH!ci* z>RxY+(Du{3S%bn4@Zk$G@idQq=*c9?7$I!QX`CZ&Pu0?im~o7awz{UX2~C4^$B3Bq z)$i&ixa)(3)&WC|3BHr7iKpRpR-IZk$AFP8$A&}fl~%FSxa0(Hb+O+r;wF#l1afZh z>zB>iom@k!Y<)nt;d~zMv5RQyMPiPYe)vh=03qiBe8auTs~jLClFcF9o)^t+MT>=c z(a>8BU~fuSH3D(*n%HdBC#^3J-$C3hBCc57eYlgii@=IZ^|A@t#J`y=SfmdDcdr|N zqc;_ z!cvGm;Q-WpD(bH<(qG^YInoQU6uC3sQ9xRu;R?uXRV-3$Q0#L}pWPlxKlNix=04gc zlZnehbuAq9orAOpnN++KBCQcD6=}xkx>ETbFX74iVggw|g) zYvH^>7`+(fsIU(Mxcx9WzQO_GxAsC*ea*kkpGt=ODMJi#)F{>powLL!xW*^fX;b$* zz~l2cClphsP0MpaElduWrWfu`q@L143C8f77;S*khN27uq#1(SVpE#6{=OI`z^59Z z+Um(a;XS5`dDHY#A*-qfawaM$KU|ZJCSz%+ujeQ2Oirv5B;M3kPq~bPY{vZY1yZV7 z>ALFD;+9G#qN=W~uD18nxpbeWb6*s{-KdCk3JU&HVcDs;mPS0IcDWtiZ1{foHXr_r zP|x+%?1rfc9nU!-cHW7oV|4enTIRf}z#rGKUkdl<7J|7KhDo2aa7pMDe$oOZf>1jU zQVY(pINAgDl9q=nZtAt%CR%TEir;Y~N-K!cVpt+$xeWi3UH}Wp!4t=MOGiWYM3xev zKRsZHCYBxnKd{EQo25AfRsBSYNbXjZ1*ab=Cr6pW@<-6?fe7pR|BfUJ#z>dd-5MHs zKt8iDiklB=x!wkRgc5_zKP2anh&UtagIy6}uzH4viEM>^IzzUU8tIIM}Y1@Yk`(*1Y*zCqf68^RVY|-jol$kTPo1zybcgB|v zkbQ;~l)WfhAsBEL4pD>;1a=M(zwR1D4c2G}>M76xr{&U%{V|BbV>!8vgi(Ha{wm+- zufKJ-lZSv)k7nNDyf+(Gs=!S4l9J0J%+2Q@*Y+na)hf=KA)B$mL-a;qn1IIdC^l}tF5niW zIz=&Q`{D8TCFw_~*jtj=LBTWnT$5Pv4II!A>)=c_WFN`K1ud8tB~ zw?0#SvbYMuypn&3I-~ILfq1vvsCx8E%--dip~VWUtH%gc06)Nj?*$u<`q=Yrg@dCx z#nGGCjiNW=V&rIJ$_-&jTXzemufmdnN+-jViwcgd&_P1h`*8bG`yiea;erf10nI6bN{ISMh+ZOm`J>Bi}9(#}7!qV1`gapq%j8K1# z8VSL>C#VE@@Ptd$NKiTY2KTr{$;X9;JKdrJ&rvb=C8^h_MR8wK%9B%GC;gOt(XMaU zE$X&-@)?SHH$8R0+#Z_FS;xiG4pFgvvwBnK)FC*6T>$5()IBH?A;&Sn^1fLyu(x&! zVs`;7LC*8DoaVzn3O9Auc<;_a4fnWLe}k_hKYW|F^v!o02@2ngHPwF7UhlclP2i3P zE3s4}uPn6x-Rch3qFg{;*DDTpXh!_xu3Il)bWw34fvKV2F`sth1nN{66#tfgM%41 zsbZ9z@SP_s_9&ihNfZsp*nrzttA@b`+j=T#Bm7)h6Cm|hUHWZLb@scu)@*zTf+*lE z@JEKEFwMSO&}BSK`CDe}$oHeG%J6E$BEwvEl^@JI4TML*`ACg&c)$K6kV zGO7H9>D)v6I5BcOW$s}V?Zk0A_u!i>0>kyA#%0?`e&t3JC1J$-dqtr<@@TkTFX+DU z+qw1CBTMxrKi~EbukmS0z zWuYFmf?9z~w6DNd;2qt+_$_$=A8_k!7JeknUY4}-Jeh6kdK2G}ia*-=?ak8)%grt) zqfyw0_i#0TeR=%DY% zy;@^eTnx7810xPQabxlK_p?t9ekbiO{c3m5XseB#D;U!sPrz2EjFy&stmEaTW{tKN z?8Pwj5_TQ``TC5R9e?F{k5PwzR}3qI@0AFI0U_z@&`(iZ>JjJdaA9Bjs*C7pMOpZV zPd)gJRTILVzjD!_=IAy0zMRi75-9Pf72cX?H=@Muh_4|Q6_tKx^V|pmi^C?7i6(!% zosxdn*{a2tb6!1ftlxl8z3i}y;=pX`6h-w7o_vZTQafiQkXadKS8ax7FA)@8wn_b* zl<+!<3X^HJUZOG%!OQ-6!YN(nYE-wV_(MJC2?h?o_fzWYq#l~S!K=-vU8H7C)?u+S zZOpu<6;EC#zy18)_7MkucZP;cNj~t(qH0N@i{|IsSm=t2LFd=sP=`d#%d4#r&-JNs zx?+7?wKRKac50}L=}YUf(A~bfPOZ3jc1FS4UE^xcXC8Lzrk-aoAzQOJEh(dOR^K3b zg!ZRU4iZN?MS4Y!9Qj798UE^F*&_kLt8^zMeuAz@c3V=w+%M^d_N`a75a8wmXt7DD?Zv19`sHzBPho(P#VpVc{>DENo2&c zm%fo>A}2?-?s)Sps>^Wy&q->Ygvyhx^ReBc!h&8W6`2PsV1gD@AGFSyuc_XqI68PC zQNpIjM9ys8Ayv=oWP^f7MH}jgQ)csRz2ujI0usk3Qb~#HN{Ymb5|8%py>q%Wg#T=_ zG$b!``A(ICy_4YCW_r8z!L~A=Sw8fNhJ!bv+7A7r0s^=Pg7I1XqrTe8IP`4;SP`5E zU08uj$FnHrRTN||u+IrV0%76`;B6M0Sg?x4Ne#;1)}O>q7Ax14o#Zmz=LR~XNc4d2 z^8l49uA8g@z|@!B9jV3)no$XEj+JB?fhgxO)5(&brL^RGFD^n|5L4SWHZUz(* zS(oU3{H|;~Nk9Y(ooF7RVj=PUf3>WeU~sgNQUu$ zL5fP>Z%hxkBvH#%i8-vyxoWF@Vf(SBk0c#A*${(ljH9_e(r%mWToH0Du@12bu?cqP zDkMh*?ow>4tHD-B@E&YiufKDQ)QwrA_rcB4jaj4Di)o_&eL9rBhkQS?NY6>%BM^DS z^lf8CRo`WCJXM3^?vy5(lTyv|Ncb+Bda4;w`X1oe8RkJ1wz;K-sx-D9nl{`Ie z&A6{5VXiGgO3P@ybclgp=Jv4$TGsS%EW&!V53_3S2H_7)>$`O^yJPOU%}RsS-pgFO zN%a2o_LWQy^XCR)6gwS<2iv&=!UYjkFj27k*)_x&>)9LLT-xAHHXJ8t$@3Qvv-cPy zEe<&~`~iVoL?VBDJgEx#SVOd>JPXBsB`d8) zMA@Y3Eh+Rkne_O#A)o?as2l8@>ul5|a_CH#kqxgKVW83K{Ye|(JR2LUrQzJcZ;LLf zI_Gl;cB482PsmRSmdAM?tGK&#sms<&wsr93vE8YuPC zv)s-sr;f*Q)N>E7&4I*REb+5Eci|V#71#>F5NXa?G?gXN?m})(Df|#@WGumLU^!fF z-ge!#HwdG?*zIoU!|qStb-!T|ZX~HNv`vO(Z+6VGH)hwH%{7%igj%2F-n~praQNfy zS+1U$R&iD+MEh9ky-@;*)$7uZn6azg*iCP>dgk`zBqp+2=E<;&qSG&6TB{vX-TEbq309D$95)lJ#+#;w+=ZKuK1$Q1RD) zP;QEetlZ=#(DYPO3-1rnl2HrkFJnC?_1q_86?C`X6X@ zVIQP1KvOw*28K^r+^mg_!KoNL6kC9$-ROq;e$uLkqXTe`nLqYLGh5zjYZWam#q@^K z;@qcsFN)3b%{U56;x{vHZA)`o`xw}e4XRnpa%F>$H8s@&V?F)91=TS76_|9s`f3l| zI_53*9S$S#9dP_{u8uEDF?}8n5GhdQF-!*-9j=DP@mX<|TT@DW{P0v?z|$k1#67Eur%46B!MQoTX3AnzGRpwW2NlWL5D5) z9w;B13al70^cmRm>2~@o5q2$vP0Q0o1jI70g}n>ud1!NYh9|f3B<(!8wu?SyQ(s-I zO4fTd<1v-SkumP8(5s4y&By~^Fn!LT5S5}8Zz?)_un6yJKWk~B6 zDePy!gAlYXi6g8Av~@nFz`1C%80Ty;)vi>;dqq=aDuXSirZ&cTYWN9Ey4mD26t+v- zdF};+movwgJ+4wHN5r{@lquw`DLnZr1p^2s1_hUThTkhCAmP1JqsUmek>nU>4SS%N zQwGD3?gyopg;ga0Cw>n(so)e!ggw240j7MWjem_q5bBv1%F!#~5X{yMRAib#E&w0d z#04aGdMM{mXu6dtUzpX`S};A7+Z?*Zyg_y3sBi&El&OgHE&Qn5ZdBKpN()Mo!_d=N zB^I8(gCF!;K>j(Z6~l2_NB9F!CIz~&8pZ7PXpO%R%&yl%;jtT{ltodor-KvsMU|Pd z#Q)bQPZSB;^^mMI%CSb^HRF}dw(Z;oTrP!%{jyGdS$P>YS3Fb$Kc$5u;4*-1b*F%# z-j0%^zFVRu&>a-@G;(%Jf?aUF>P26BFb#fp6p-Xo7lISEM@>L!8=~wBw?y^W5G5~- zcG?gX*wZp8W@mKj?x?u2DFMm5Q-YEfCacFLC7h1#8@3_pkb3gABx?Bd)SW5en(j%O z3&GP)CdKwl!n<1+@76ycQBSG@mcCj1`eO~eTq3X(hT_7Ia)ID=V;=0Yp6KG4{I2fZ z@=z4s%fkSK3-xKNEq*ShMv3!q?zAlSt)Uvbq!-B<#5J7`JMai12D{hAO$|E0l6bdO zOJ3^lS#eu=eue33h{aA`##LgSfW`J-G??(T^7-%$SZwF)OIXbpLaF`2tM8TOp z`ilUcUv8fNsd%kr^o;mGJb}NGJ809eO)OUq$D(5Q_x}ZeM`!0VtA7`ZuETEaLGA_y z`vNv!4&}~_2O5a$GxYUBQK4Q>)_xhe42ReIm&E9jI1tx}H9!TM1Ovr5dx%gRb>9e(hO&EV)$r-xu&=5BM6 zxvk!J?5X@`V0NxPAxHHmx*QaI+x($Uz45pMUzE)E)r223@lu~gNv9*7!w;gRW)br& zZyO!%&M&tMKWH5;>$Bx!v5nX~X|UhE=(OapRmrE4sZCMT>69s(qQa-HPKi01HhJar z)G%1B5|l&@^w5k=$~c)6uGtqwy}XdPA!^F*C?fXK1?tj;!{^_hKa_lJ8bAEtJB`ud z_@lN-hXe6*YL9$Oik&EW)#POGW_PG|8`_MeZb{t|h(A;dQ!gC(S-fhZ-09Fm6P0uE z!=8*#>p}YO{PieO`CY)HX%U9i$=s&QVX{y0b$r{yj;8phrz3NUakLKhhq8*7R z5^uzp-g_F8WUAZtL^yP4;*GF#}cwGpNe3jBYNmUhA6<6guz3S4T6<YJnvO468~(avtP z{iP--DCy?aK~?+{G_wlscC1@{bBxa-ocr{Vb$AJr9eo@A#bsh|^Q2BT6M_|jdMssZ z5@zf8x{#Jzd0LIIx;HV$MCBhd@!`X!O`VFy?p+hPYt*<2cfF4}h@I|BzNPF$sXIcx zz3j32H_t&`6x+Rh@A*!4_}O9X-i1-mqb8}|OlVoRMJbEVI@J_kMc)&g;6gmMrJn7w z-uKg7vJEh$%m71U_W8}nL(T*rc-J-i+h#3xIq`J~_1f~A@LDoLkDjs+H|LYq4mG@C zma(W)0pc39L)_nI(LASBLk6gRKwQ^Psz~q2e_VR^x)GKhF%Z{u;B2gb28cWB2gKc5 zxsR~IGCH9#?GQKe?VeC~+gQ#3!ZpG>bwJ!9*r$EN36pFThN-G+YJHHgJR240 z1!McL{~(-&br1SeJlfZ-_L9hBt) zl67EaLI7nMBYLt8R$Oy52hphg9UB@&mbZJ?53%iD^aXQ{)hRG6>jV47V=M9SI(_Gkva+f== z;TBeUkHaaYTU>s5Pn2pocweO^t~FOvgR}cWZ?_LL23T9c8V3AP*(#3q5k;DsVL3_ zrT8Fqv$jiu2|l15=}uvhE@PZv_Zhz|cDtLv*+{!SEw=msNUq;cFPVMDKXv0Y*G@tu z&PLkiT5WMS@J70Z8SVsp__hcJMX=FNhkZ?bb=VhYKojQ9E&SnugoLkbm~J{5MS@Zf z0bc~C5I{3K8_Ebo_;K(+e)#rXaoqSrWig>GCY~0<(vpzS`9^$q{5X#lGb|JE>pUYN z=RU7ZL)30oGkJ|{Chx=NIT?r{ zgM22ttI-`lM!e>|=K0>`-Q@+?2hTSeMB=J0;o2ZG&ZsUQg3OT0Dy_3%RF|hgX54hE za}HS}_+O}TRt>k~c)=kIWX;g;H8r8y+iRLG`n9qJK#MwSjQHw)J5_p1%+@5+E$`08+vt?8## zEY!!*bkZ1h3q}k9dx=^ve6mTv&nCGhpbmgq(LKm{+ybCMFmxtEF^llsxJ594A1C`U zik>eI-P6MsNl#m+hHFA9ay4f6q`N)hgq$cC#T#yI#yQR8!q7gFCByUwa1}kr+hfh# zGm;shw;T?Mxxa_cbn$SHJRd$Pa$?9Ikp-Vd!~0K^7#wcmj;D+V;}1j0G3VZyK7@DXsEp9$s))6-&|TiXIWxmAXa1(QKe8n9ek2;0_@_4=DM*wij$5%Q z%z%S>E*lyd5jk@9@8PdCBPR8q*)w^9(VR&}OJgUl*T1CnP2f)7^s+g5Jd7vp22J;xkStVpo* z<;oD^^M<=TPLWv=8oHu?QQ7L5E~AT91iUX=T6F36B9mWL*B7>63Fzl^I>ISpWpA&n zwVBs__P_o;A-+5|7&zdj!@q;W1YXy;4eS+~_}+3wMi9+pDmk{^w&~*Zbu`nJ(-HFj6kt!UgRZcq;(ODrKEw~YBu}RK4N=g1aeX1HPxSeP+u$K zPN*8TnEmhVq_3Lb-53SJP&m_0JG$vJci|6VXcp5>b=}mDZKt|!YGVeu7SK-HyQzq2 zr$4%BU#6XQbW?j>JMHMEO17Q;=%(A5cG}TRmu}}kJMHMElbCkO3P)V|7HFrYj=Ml) zW|p08*A4gHjDr;zE;8-$ev)H+!s>y3t>AT%d%k}L>TqkGMf ze++8WE^ty#f~z9>6Pl=z#U#iRQOdYPS)7vw#ZHo`<7E+QcwvoF6J@FUYz%bv4W_R? zfWF!V>>CDBrmtH6f1$5V{(sb0KQVn3c7ef{W+)2$tF5;CEdEay{r^`NZ9_;7GQ&S~ zQ5w3a48f+aCg`K>ZL}D%OKqWzo`XKx-bPPBAH5}mkpQ&OO6a2hm?k=U0JP9(jQp#GG9C26j~0rd2!sFAL;ojx zs8=BNALyY=|DZP=YTUegXyJ#3;4HHoEi} zUAW7#Xs_Z&6CIM$EmDP^I!>PC!tcrg*6~UtN z!>PCib2RdcB|tXq*aD}r0K&44v4+UVSh?Pf(kom;Wptf=FWtXXkw zTDx0O$0HfHVgkb>9ReBp2%`}cvj~ z2e{ZWU>T+ZGQ`3YTD7UL=dx8BV}Mk0O#Mx3i1h@)0{Wk16em`xa~Mv-?TrMn2B;^e zwmMA-PR7Y#q-6g%%M!}p*0)yQs{>BSti>!y8XRf(WZP5NmHC*%&G@WvH%Cc>@BhTr zXn*2<{t5PQlqlN0hlcQf055{UCEGqsF(RY}yMAQN!f;a7y(4UvNjKd!8XFC4l6meA z(-ekL!ahuvRPHOwg)vIF2SaVY9_GS^`48VdD3nWnTYndOb&0qLn~v^Hf(QRbCW|mU z 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%0A=1HLl_WhE8h(qhF8e6EReeI$*Xm>3jxo;9bk zz>j;u^o6ngWFdk)$wP+PL{FqkJhC<2-?9anqL4~9fj?|So=bApGWBtA?zCeEg$*(^ zeI|Rlgj+|SW@AIPiUh;t**=R{g+9DoBw^YejwOmWv(US|oqt$5{sIDp@h%|r?d|+t z77(%g#Ud7)_k8A!*%vuhQm{=*M*3YBKA%&$O}aX-HEiShZOcR5GP%r%@HcGbM_ne< zc;uXVgNL>bb2?v<-vzng6z9|ZKbzju8K3^+l>Bo|Mxj2E9J!JB#Y)?>5w(f?q@YiFIR%!{_pVE^MDC}WRlo;% zd&++4eraw>fwVyC;0xFY8|ii~m6l3F>Mlz!OF>$lQI1hgQQhg@)4iQ_202z12?bI^ z(TZ<9jK};87SKC#Iqmb3rikl@;$0pexR>$ znPV%=x7D_CamCLpU0`Kfnr-j7*F`7au9TL|a>cu9ThVFR_7H|`tlr=4b~*D=*yHq& zdbP`$8q9l{Y4xd+2kCAUc##fE-zJCikSsRSAmy+$dmn9!brRho)_QSaWw4FO%EHAd zwvmM^Q|uB7;m@(EwW{rQj_Qr-Jsq4+>2?D*~C+zrP8oh7ypzl zM1;uEz6(gr1>{?4ulB zeyjFY{rNyp%<-f+aJpHi`6=QrNKt*;A-j$HAdh^C=-^dmvh@d1%tp87A+ES*h?{k! zxN@!A#q0fkbwQ8ht#aDNi!a}x!y3A)V@kOb8oiOne5LZ` z*Hz3lsi*344&}BPio6AA%_j(gYndEUT0WBgx=QAiGCHbnk$rU7(U-_E=9 zZdFT6OJUVe0`3dwSEwtuBzhQ|2ULbUrEd~5-FQoRS|>-+H!rW`n+zNP(bY-)0cnobd{Cg=xO850cF)((S@XOgeS zJf#=7!e)0O0?vrMuBF?NYn87nd=qqgGxSW>K+3dHCw&o4B)! ztCO4l@Y5_ZEA7q$-j+N|ec3>OrFlvHd#W{X&z6OcXKr8~K7`PF8LaO{e&HXZ zyEJWH3~^h>3tY(|m0^AfxTN3}M0BChl^qggkDe`Nha}mf*NJzqLvrjZgHKW}#bd_j zAmB)fF*C@moZszsZFNTC3&HuW)kg`Zp7^s?PqAfg*yq%3&AcIJ_G9~~QVYbO!kjYuJnHt8A=SZh;e3GFC z_6%fIB^=WTi#C^X`SCfX3$~7=^W&)tww_zW1xJxZn>Xk22oUE*t%{!zAYQ#D zUL$yo>&EyM6yQ?6icr-!1rLJ{mlTJE7!d%X}x7T;(iJC?W zsfD!a3Fznab8m*PB0dSbSJx62R{*+mx^rrtGzf3HmE>M8{_eo+&S6vbXPwH@mps@l z7|7MAdh!U#>)3H=-?txCrkZv-Lw0K|mC99w5KbEBD8hV%baH3}3a60rmOjfXhGTh0 zuZaLSHeNBdUNKlZuNeC$-wG+0SXGTON{upKHuK~BxAZF0@hmj>%yyki?-{amRu#XUv0jJtD)W?lX(=eMwrZWC3nltD`8M! z-W}N7W&Eh1wgQ{#84P^5Hk#$b*l+^P-@XW?`vjb5seG2LS(THI+;ly!rey@!#*Oq< z`fumJj%GFk42^{tp&OgxcS?~Xqvjg^lv@?2=J^93ZUX0nPyYf?(-`rF7*NHD zcw-a5rnvJ!|AM@>2wwk!OROF6|E;~C1a9i+5ibv2*k*i*eL2!p-%>u21%!36Fcp;dO*xvTV{f%U<+tf-sc;B8BD z^IhR$^#)IGwz8W325%p1H8VTket(ZE66lP1YzthPtsEDjN_`RQgZVZ+c!yp2_GplF z*RDZ$)~-j{{G*C{>mEc2UjGtT-uoe%h}?WN)WogE^=fKY=H&jk2%2v<2zQz8!@a8~ z=lFB6Pbq9?aR@zxE+D2<@hM8 z%wlz#KiwjL9YT{vTE}_YX0gVha)PJ6$fBi4QPnL^Y8JPb|GZEjxXQA%VRLRUoW!CJ zbxZxfZpzEL7t!i(fB?{ebC*nk?JKsh+co3X6w`GZya1OMb*No;zKd9adr z>u&KmN@ zVySjz$X3s+m043hL^OgQjR9>DjdLn0E>u+dRAwR|N3rhO&B`Z-c2`z4_SK%Z6`8!6 z)^?}bHSe)JKyW=Vzk6O6UzC`=`vBW;rbH#3sM*DzXL1ZI?^-T(Ub=pEjMF^h4tj}n zN>$@ADQwhUMj!Ar&GYvlZDBc z8)O->BQn;r3fV20(xef5kSRv1wN2#?a;W+(2kYd?@*MdId8Pce{FVH(9C|Rg21 zS44ji`76Q|E0q=7jW`eKNB__kz1VYra9i6q zywXVD36if1H9wUZZ1;%_kbH$g595RknEG_GWK(b3^y-~%Wo%%!HUuejcR+cR?mdeT zC9cKcITrNLTfSA!FSh&XqqB58F2B#!H`D^hWl!+LMSbQhCjkowqkbobsgrM5l-*>; zOnVJIeO-p>oT%Dml@xVIh%P9aJD&7C_d}Aw>L1|{YMp`^^bLDRE1Q~!HEe|PKfMMi zJ`}dE%~wtNd-wMXh8sfOyZ27oW^vKeYtU(&F$#UmjWJhuWI6|>5j0u+Cqh|6&~x-z z=%ePf18Z1N%hWa1ira%&iT~j5(b0Udhq*yqjjP8^pU^h$5575O5W%Z?y-YVG%_1>L zzNAnRSWntPI!torT_-&zy(fJm0X0iQOO;+st>sh84$DDHpvkz+n8{ep;4sRQZzOML zfJ2PajGf61j5fxaEUeE2AAHd%EzVBdE}rsZZwarG2bdd-`nz$zaN|g2!B6`wNcic3 zt1sQdf}Y(?&Rf+KB>fCPg+I;~ZER(}*YizhAIz3clfs7NmL6@J(%yz3 zQ+K8B>}tar#})2hyc;GwVVzePOoT=Q{$~(xcy5l#IWFvQZ+PBy+Brc2duh6ik5-!N z|LpuzFDKXH;Ihbl?D8{-@lSj3W(SL|zKy1Iy$CJxxE`)!wFHqXP)5BQWx*TE+puXB zAA7Bqf4ud(Grizkn{lDBTjNBC_po2oPJWfthpdNS~k*TU=N-TdTnXsP6sSx4TpBUVs&P_*dfX%(L~;N|AD}vPr9aI4m+(d1o`$ zbI%Z(`6qMZK7_eLeN}TaQA7dJ(37_5)d#j5#M(Ikf|E`!fF2NgsM=DO|*N0<_N^DzJ;sF~+Mmv@euYcE@eqroS{z)@S(Cj-tlJyq5#A3ryKc%)_mYKec0EDaw&-;Nd9$k* zvTYGIeX}bub@ALhIL?!9Tl5gS*;PMvvA7k*toBa z5o8IhzwQyAV4a|NA!?jFDZ4Rc0Vg6>&$f4jG<(v{<#$so4xWwNn=xu;-3sOdr%+k& z0?q=?>sZ@f+up=jut&T{Ja;er1lB`HkQWC7ah)1RjUzI8DSat*HA-nDr!-31?1=%= zw1U|+p*wvi&UqMmf(0rNsKd0qqSJM*;+ZD1v3}&YgoZCb}d$MLTi2vcjj5(V0F%6 zeT?n;n1tE(_}R7)a7ZfdsCmnOh{YxUiW1j%ujyep{#YY2?T!*ny!m~tt1)Sv(%jvW{sjbnZUMsV`5jhb#3pgOg z_Fx|mOh2wKFmjn0bhoh#DMQ=}7TD44=q1+Hb8=re+j!)D$~s>f@?E?rt?SBrUeElD z4u-;{SCjGjWj^8>4`}G~F{I`I56J=OBuQGCn+yi>nInhxBG4ut_sg4JVz+Wp+Fl*I zbNaShB&+uvG(ewED6tA6i;M-T?$z`HB%uws1d#`%tP_5DFWf8_r6FlL^YvtV@_wW( z%^7rCC(}rl<;aG_(f2Uy^0qAN#Tbmlzuuo+ZY;5rcpM9^H3_cmM%g7+JVZHcs}R>| zn6OM(kE}~#4R7#g27RTYE>`mUcU-JilmAFNQQnP3$>d5)kL-O<rTk znJg8r;GUoy7C9(&akFgR^*L`>?p2`fy*o=30;a2WuWs-4_PHN_q-pm?rh`R3=RQ0{ z`r97S=@b^nIlcE#|Bf=GzF)Ge_^LMaw%*@(^*!|dk-@2rAiSUUu6@X}W##Jphe+@^FeP1mP_5xg~43(8Y5|e4A#e-!Svp9r2;wT{?C}C;MH}80r%i?R!11 zgnvQzr%?Ca#tH1`XGO}BLuL1B2=%tdiXEw<{Xc6<&}H>DR^@-z29}$oe5vDt^0vEp zeTRwPH8bvkS=@TtoovS&Vl>F%L<}Sv{7lU(cJwypl4D2`^%JbKI5|$4Q{IdNUAUh( z9nv(C6$$oiFuYRsr0iS%M#G<}**gslXOc#py%K&t={yPCEWT3qj-*16KUh*N9WB8^ z%K*!0%Md4ty5xq`vUWV!-TTP$wIysNX^Ch2_R^O@OS^@!hmp@X&$!6|FBn~np9~$J zX+Bmy&OZJ=8Y=T}l1bR(lkZc*8rKMYq&3GOw#56$yDiWXfGL7m0;a%M z;IUPrULsB_M{QrLT|0gfi9cn|l#m|$*;%#>~ln+*Z3}gOTKfi;LoV6j* zAUl3w&T-W2gY1u6mT@4DsC=CGL7MrWH4oBtZxy=in5mUYyzO4qp^2&PtZaMqAWdr{ zJDERDwC(Pp{oChs1!$!TR8m{h^LH_5vSo9N+e4aR{}f_P>xP=QijnUCbSK_Nl;8-Z zYGYbCqx@bxxRwT6EiLG7=&u@1=FV@Qkj0&Q0ArgKGlSzQnNW4Ik|xJr7tQbRuT+y8 zUVL0MBHMN^Dy_CKl|MxhF~6fbIs9dAY*^E>Uk6&NV9EB}Lbt2U$0-B-4{u%DuhV*Q z0<`vZ!i_OTCCI?@UdNjJ6E&C8X8;fI5=z<&dO{A=2*4mDk?*T<28p1YQ8rTf$pl&+_(<=1=7vR}US_dv)r-uLI5d591XS zMy$A7G_^?2 z?09v`y>}#U&%Q*lrmkLY;x5hF@xe%8*10SV{R0nnf0mjnB6hQE@9qr&h-6|iO)^*F zE#XOol2i%Elbn=POYTeFN)!@AwoL{O%1UKdWshX7vOd{4xq%$`$!CzfkE34A)F7P<4F%De467xik}z<=^9ghnd&=oBKA$K6;zUrP66KpH@1ZcPOrG$ zQmweJ_|}3~Q^1bCZ3w_7ZPqsZ6yOLvJtr)vQfX;AXOu|Jl5*e9J3t5r+V2O_r z|I5HP&jMTp?iOyUAm|fr2*LDXbSFaXt9CxoMvQC=UMk>zvOg|JUk9QOJdj0BiI!xL zKAxVs-n^Q5eM+6Ih15$rA^(B#c+5r&e2k8<+^7c5zfiU1ru`sE`XuY!?jfYUJjE0x z(UbI0C2LFFBzJV9s%Cy_Ij~_olc{EdFqKTr)8F+@mVCh&IPSjj&YTfd5UHDl{7erB zW3@}5&nFe4Ys-zCrJDB&0^q2?^lKC@T@yuKL^Uby}#j}Zn z?_4AG70)IOzS{>klLy~1lZq727K?wr;lu4TxLY3{Hg)i|#f_infYZiJwdII%23wrpnC@OsVO4yvyI0zC;+Z)!qVdu`CI{IT7N{NeRH&X*6n^~ctF906 zd(mL&%_l+Bq|K~+2k7$I9C)0-vIp*dj~#)_J-~JIdu)50Ir|=%X%E$*``I>rk6rJ< zEPj#QH?ln|{|Dmm2-Z}Aq&evv1fD~jKvO^LRv=V5U8k*AAE+ssjNDwS({y1WX`Qwy zYK8i)TR`xVgIJ@CN#W0S_pj+V_!P@F<~S2gHnlYavM~}27E%^c-nM-+imScaR?56# z2Evt>W@RY%Kb7{t1EtQ=y+2dvQj=}L)@3FO-`hO9Vq)xDT6|D^{3|O+nPCzr-qy@u zCYy|*W5*g+gfWpz7(l!EB&Jx{{PdZw19bdsM9}d|V=_m^StBs;cDik= zu*VW*=Nt;|Qx0^YoI|aV zW_@{!WkiP9xv{=Ht*QK?{voGGXX)~s-8YU;fT-E+*cpK zJW>EkZi)rMEaL3}fn?VNco@jmS8mNqKADV*xTx>G$3g;}B$N|1ZSTu(H`cU0tnj!2 zYRlhM^Q9(A@UVkx*F?Gn?l+!jbaSnGb*XmcU9+N)hJ)o%MRx`Y^XE-PVym-9VopN5 zOyxn*G^ZlBZytMdifXi4)02!|eEY^mRtM*Pqsd2KgZJ!L%QcEDOL`7vd@tkPzL~Mp zS0myAXTwEd@x>dNn2j247r2qK0|!_x&}tnAuUO9{t&%~zJ;xumA`>9mXiIr-)og+591rRlYwq^S7%?YBH%8~Dfxj| zZC317v~LG3vo0$hDBdaLP(oKvNmYs*l?#=O@dpk}r95CI4{3`|U)RkkRbEu~Z+J4i zMQ8y!2PYFEXU5b1c}acY z?e8;Dx>`$R2@ohN-*8sgJ|zvMK|tx=S^g=9y4`wX07`chC^NF!#h@^3?8o~(Gl4*v z7Q0ozRzN*r2$Ts|LZB?x=9}TE7=H)iR$i};GNf=<XAMsjweLRc+63ilI^2omD z_z5DbJ$@`oP)I^hcftYR+`!P?zI@<2C(}3dVC9yRac%PoUWJrF;f zk*>lISL8qsaYVe6LRnL9tLl%`K4r&Q$E)Sc0n=^9Lc#^{I#M!8xgrM~C7mK&COsgH z1u~;l7)Q&oKn5lsEDJ5cMaw&X2Qf3oQVstih$;5b8CAS@_PHqssvu^kPo{iYLyh~= z@(Wp@6^A=D#3B}H@U&{C@+^6GSUf*o7_WUVe)BTeb;QpEc$uiG4-#SmS=-^&@Y$Qc z*y71{XRtgW##+c06vP?rEb?8O$qvb4FHUlMYOw^yo$fWvSZ?s*-Rz8Y>A@K-Uc1@S zmV`HMrJIBJHO#dgJ>ey>>$JSL#&z^;NDbb}dD`Of)VEN`G*sBc7zu+S1hJ;wA3{Cn zJT`9hwP;z`LJoLwR9NgMXgn&6PYC+af{^#I?G))P2U;GsTxt2L&}(@c%wNBoy*4bi z>Vu5}E_&X|4n>GkU74YzDLobX+>|hFV1qKB zW2x}@KSX^8SW<1={sU;DS*U524Ky{gGQ@4`fIG7glhPJoYSYkMX#;Sy3vr~j5VtK{ zS!sncniUs~|8jYG@u1TrQPQIZ@>8>1D zJ0v|)kP=!zx#xLLc5k0grG4E>Fmk%T%;BMZoqdzJa9i1yvh*GI%!OBvK678+sI2(R zg2-30al(ht&nlN$`OggsW){zTd+L79sRzckWkt2lX*j_pep1r2r(A7f#+g^(^v4Ho zNiCvU(e1Mp0ZDS`ORfA2NBNta#q+-Z4?=vd`RQMV4qxn3iICwhb4|U4b4aDn3-feB z(^ArGaJh4GQaHmoO(aD^vc|KeWt9jU{vXZ>NJK4pV73*LHPwnQ}CV4x?@dwjh)<~Mowbw1IY`?N6AkK zXwQ_;I8y%K(-snE$wtX8f<95tQqO&vWin4^HD;<{n{(%l@E5cQ^DM#!?GJ0yE+W-ZtQGnI`bJcemE|bW}N8| zR4HYbGj_>9?Uldm37(d~mgmmPSMKMbkDW%H;*E%4|9ox-BP#Z_or;%AA)-_)7;_wA?<>a%no(A zc0snYXrpM?t$lZoi@+t(=6g3Xc8dqgqN;vAR5XIrjGDU9MvAI7`!aGlhO$~orsKO6 zWv7Q)YMsk4Xfs#7l?v5{rpjo;g;_Gd{&CbuKxLw{fF~2Z=|)Lt`_{l zY?tGry7?GK|2}lT!>cbg3sorXdR0xGCRn2Gf%?lIw4LvP`OAlGu@HY-kD~_);=?vp zsvGE>B+Jt(W(l+Kb4C8uEUN=AoHZ||PJQmyR4a1D9>nYzZ)^NJL>VcNGw z3uV$&ol=LO%c;Y{VPOKUO>c9s&}Bv0iZVkgf{FG8`@5`;4z8cZM9K$_Or>vQ;}BFt zc246YGjC+@gHJh#Jd>HyjL;+Bw|xE7Tj+uU+Xl<&(@eO7vetT%(P<5wW`w(53U>g} zE=$85FNGt?X-47I1`*CP!VyKrrEsUa2Ngl_8sjZSJF{XQWw3a(Z7dWQ&&@WHJ4~MFR2Y}W1e&) z)z&7dr5-zkFhJ5&d!MAssr|%$q8_fzDKx3ar9`{yAaW&YMdY)|%z%lrXWy}hj!HAI zMrGGZf0nttPim|$Ru!w{<@KMqmouD^M_+2U!t3Oz$2S&u=R=prHb(D?;EW#PgFt_Z zs^;m_CVct^$oxa1%D0CsBs)>tY1si2!BbhV$ode0DH#%#&z*>5s1&a;7++a|4z7Q zO-W1B#SC?gD{BUohN8j;g87t>8Nf*VD-+fC>F)kjdP}ilb;=w~)aSGevE~mnm%qb6 z3;BUFHZ9*pQ=-~TM+z5JT&W`|$8h<$4s3x3guoEj$}ipGQ88Fk(&LU5<=L5t;v_M# zmqnoH)qUi@yb+zz^r33HkRBY%Y^Pn!*!pyO_p8r1MMr8XKBtw)K8|c8caeAKqJ@*# z&Lv%zJ9HalU2vcw82!6LcPZqwddGa$A|{lUF(t4*s_xHH(8UmDs`Yqh!*{7?c=IzAjBaG$dp$klC6HNcrJyPu^hq_1|@-GbKkkP>H z^9Wz*$h5*kcq)FAAQ~UpH`0$T!PDa3#=mXB%k@t=+Ts9aMOsG1S2MyU_2o0p;sRG< zEphQHG9nhfj&*mIk6He0N|!nXWO%yUseq1!I-rj}s`hweKb-KVj(EA68Kdp)fEHed^f$9q(c>YpA8PIcsh>L#GkWUogsC~%`RKB+QVQ)fY^> z>~9pDF=@JT9K#@z(U@3sM}%wiC!?`>x*Lv|9P~`mBbX5m>^viN3g&_=_r=Kjo=;WC z_HcfE>LCLim^Es zazv>P8zZNo&8uM__!$MV9EpWV1%#{ca;D|jes0mcTi?OWdfku?ozQnWdn$BlmPe&* zxWCZtoenE1<%c>@q58P3QG;Do52a{L0M#fHQgh@&i?>XTE;RoRj`wJUu3fV)R4oj%ePpeZ;GwM^OxE2z!^dSuTFHFcZrw7E9cFXIW3cY z<^ACSV2Ts$u>}^_(KPx$`|AbChrNFul}dFMSc7z_$dG)J&~EnLF6R@*C>ZX zDWZC~mohCgF``G3X6h*7RDSBVHo@%mN-_HOT>Skr)ti#N}cHIJ^~q6%XS7;xV!*nU2y~1~$sHA(qU8 zmnNHp@5`RcYCp(+$XW<;f~nG82|%5h`{*LRQM#QPRi(Fy=*CWxO2GuV@^tK92AYh<;^8yV7R&o_}R%xdd+)8H<7 z<=(gk@v#OL`NHl*6v(gvR~^uE`Q~U!WP{NrN5NXkW(v67H>fy7Ij%L>cj(y-%JY zeoiq++)n3&(vQ;5(XY|((rf8W>3?88^yP|r9r8-sN!Rm8K3&Kw?YDTH7YwB68PQ*H z(dtKMvy53bti@YV7MocN)?sB5>oTjDRn3~1uCbW-zN%(E`V9Q#GejO)*#pCGJU&2V zbJNiAjI*!oIBC&W2e*wA13Q*)ny?9-WCfnfUz@YMPKg?Vu@rYh~Gx_fLvjp(&VCQ_A{_w#yRgT)xJf!IRqiO$nmp<~u8 zSm1-#4Hq9516_;afqaFU;J8+PpVm8>7^acGsoe%qBXBK5zEJcO$@sNIWKsh$789_4 z)ia1(oODT)G&S<#M8|_u9o5DblHaap)jcKiw}oVUJv}GLqYUKWprrdQa=R4tCyi>LqeW-~JLI1zD_T zTvNAr!z|Dz8JC5f0Swu8W(SvZ4BGMZtzxkA3PBcw~GrlwzkBEtc360gUA8S z7BBySTh+ty)S|8zu-k2jd{}PYvh6NDcecSbLxWT~tm7%T;< z!Uv}fBh(Qt38!-z*Xxwcy|1RjT3bULBu*s##rA!}(a4)?uZ@R{NHSZC0%A9aIcLie zs5PT01$rZDK~d{d%oo+7ubP(I;D_Pq1WiQVv|t~$PnEBu$Uat=ZF&Jux`8jn|0U)s zrcp4w)&%^7u}T-zifR9Xfard@aI?zVr(59aV}|_|Vk$ z(N8YBc+>wPT|h6RH_#DVZvR$n-vm8)fe+0LvSE3-v9_}A*V&}>x z;mM9B89YmHP`no(X9O+Xe5oER{>c8x?gqSM^{*cyPKMjW>x=qmjIQCyO5;6y=V zZz}(S_=Xrp&7IzJrnj6wVr|J{$rEeIEoYBTv1i>C*|Wa)%aT0959g2X-S#)Ij$gBU zucz#qbavmN+W9?oF%q3Kk}Hzik|!-jt&(oZsAOt}jArw1T3X`fgC;WD&u{o%vh6Y$ zWq4S|k)_IFcyC10E9A*h4fQ_>PjU#u9PzsNgggtU_2H>9!q=I961LY`5%9lro;r8b zj~%LgJtAzfQMxI&Do@^b3?9-1Y3Yaar&P;PW|;H3WK|mq*usIB>dq0>ItvGoABy`YEmdfA^cQQ!-{|uxjDI^e){v&0^f1x0NV;_S8&3nJ z>U!vzpFh-EUVUckB8YWwZ^B&CRBs=NWH<2fy@FLUn}mAUhCy0^Jw{Y0be^6$`p%pM zyUHt~LrJ=r97eQL3d1U%ipX~w^ia?7K02>0o%O=;`JJ#K3T)!g5pmC0%D6rT#{288 z%G1M?%*EvCp{N#W2coCO)*NGx44+p}Os7=3sA9eAOSYS;FGXqO{;}!E*YGM3H(=?d zXmtEU-joaC;nq}>n+ydWvdWnnDl0?JjM{vFq|+EY6#pHNrcgE}+8Q>NCOWohOJ-&- zHAj12UxG?oqK(W`?X)&ReW;P)YvWFfqe$Qi@?Jrt?WK>N+=qAl5|b)vd15#s6R8cx z2ieJANHU!KSo{ZQsPDaJpS>?ox)GK1fHb}k=9Mekd>BpQb z#Q@ZwgQ}&w%4RS$J%HfQG?{&1$b-y6I;4Y#j*Y0!2N{StG1&Fwlac3sZTUTB5i@p} zGdMqfMXBK9RbZsC)i~k!_Jst&CH=$r32@BU)OmIH=UrH z>zK~W99LNGMj_cElf~orMAE6TUIlAtDatPSL?EVLE2$L<#AWU=UWz(E<)WrkqIO!9 zEPcdlYD_uywdAbl&iXo3{Snl;*Iws^7j5YKUOUlA^eT?gNt}Ug?EYk<=oyRmo4QQO zx*C~i;2XT_B|LM1f1EdG`9FA3lZ$?G0`-&qdY9^wezy%I7TDyN5_Na?5DNqcGFHit zSn8ci*&jJNqFPwm*|lFe_Tu!W^d_%>;}%_ebu8#$TB5R%^GNu`` z69-4}VJYowy~U&)o!v)}+wIm(ByBfG=hSaK5KiYq=|)8c1Qb&8x|-m#1k0yc9xD2+ ze@y4K8`0!qp|uEeL3HEpK`Twlal**(s=b92+Zk2Ia*eN>&ZxR=hE01&08@Ta0_Y(; z-+*$W^L5r&33Y7apsAmjv6}9o0jL%hlQh4yZKRkH-XO_;8xs^a9Xl#f(nnAWB!~Vd z?T*4(P4S`ZMo8bo`ll%pl0LXjA<{8C8vQ>Yvw#k)=n*n1{XZy>O}|CYc}$nk74#9h zI@5j`!|@g%8#8R@4H4%th`D2})_M$6<_4zSJci41n^wnN-8S=voD*uvOarnV!)-Ie zS!0OG+OyXh%a33svYM4JjOE`6L634*R__gu`1QQE?;|UHd}5R}gY6po!sN~UCeQf~ z#mm`iPX_*KW$TT!Lc7`F(Fb(t$2`O4SD%MX#*3z~iRqJP*;k{C=TnXb^}};ErEa~D zve+%pCc8W?Jfi;SkvHK?^vCeXui--OFX>E$@Io90{E}AlB5JtT(wPX4w}TNAmf~P*sJkFG%l!Bmyqkluv=e5tUFjN5o7<@V~hjc=4TK(mB6$3s3qiGt06Fi?sV$w2$LHKGE3qBq@CUI8VAY_ww^?p83 z5nLYUKOX5a*L5Z7aGmddq<1HJ6?%aE4|^65&m;0&d4R^-%ZuZkKVL$<&KpcBp#lc( zAn!BpGOid`jeCXrj2jxlb#XRXcQMJI57n@ZcTY`1UdJ$am>I8rQN~qx_vx`pUU*qDrK0-oaZkqtJN;EEb%S6vEL{dbT z6#FIRog}0XCW}g_S{2|~;UdJ6_N>sVvV{7XFht;>A$^D=PJMih>jOQg9)WEipBjDv zk>qTnn%_qTyTl!0&@UE1Wl#gu0rf+_p_vr0h(e%{DO)HZlvv74dOjNv=wgbLf|$i9 z8gx6^3OZOvr_h=7NP03olU_ovq5Hq4JIjfYa{D;BJtR+dE#g?Y)shr{wjAoQ@-O0G z71p$FNB3@5^;QFiI63);ulou4a@OU3>n5o;YbWb0@)2#4o??M4)=kzURtrncO3{1V z1hX0=r{-snmSotn-J>eoVe#fb;^4-|O=8uBvxb#V^fl*t?>`ol5WatHt-Z#Y)jZ&H zxy>XQ*2-K7&NQF~^8RzP3G3?+3x)Ih3UKi7;1( zylA6fSE^e%=HiSOCp!R3HEt%VsxR%Uq2W8?0>Io9rbU|+zUGzZ_K2&uHm}KKXWS82b%(Gs)`$JhSnoX*eqH712G-6}!`_*! zBX5c{l8ge>TY4`Hh#L50thympAGcI%oBA5u#3l_|2pvIrRUhWUV}7d;jhN{>aq^CX z*YrqlW{}``LWWD-hJVCnf*FoUgKMt4m80Ki2MIWzXA}`>Ar(*))VaDJM`M$mlKxa3 zu{7ntdhD*mJoULGzato1Q_ie8vlkg)C=ndJl3AI{^8e`WELe5yxSkg#wbhum zqZfJcn4eQTSr{sGL23&wLraq4_ zj&Yk9BUdd7n7JW)Ul$TFoby7bPr%f6ujUjHIh%d*bnW8XXd$ORr$QHJtZ~^jD3FzX zMumH+8B>o?wtmi_=r*kM^`|jyyl-lI5tg}guS9H(D;7P%;H&NHtKR zy+6e**l-FgbG1cPQl3(Fj~eTK*Gp0XcN@B|O|x+j^&HiCn;*@I>+8n!wGZ>PKksMYL?qc!{Olix zr)-T^sqx+0T>YQNTpp$c#jCy>OkvdiM|Fhx4fzzst1JsJYJb$qJI=(6)tY0pNpogy z>AOl4zpQ69aEghOs%4P8WXM1nlCS|;UtSbW5|;c0{Cv7GBYrwvp%tXq_>WdR2dqnJY< z^Y9#>n`MP%H0JIIup_E4k`i$!uGZv-c%x~Ac-bEF^5_F(vpx;&1WJmxS5TAsML|CK z%bt^RPC_quAPU}FU*LD)Wd<$8r$-@}FuHegYRV4HEe& z9{wfY$6Z7sSHqvGiue2(M^JZdrngX@KL)+n;nu&$y$`)ECIKBi&bVB7Hgx?|4HzF^fc^Ll1fJ=mo}VmyZ+mb+cg~H0*&k zOg&~}x@Cz)de+S>($)+C2H}wDr1-S*h~E)q{M4-{=_o#3ty=Kv8pRa)nRT4_H*IEU ziq_s^HVg6$Q`L_XPa<qZ&fc*)QUC zE?PN_&X(6A*lg#R^~neph+RNBW<&%vwdYTF^j$w)=TOS4Kih=@>w*-xdbT=#ugM_s z+)z6oEX6zFy%*h7+%O+t^H*u}fMvtEp&8@}r55Zk(ViN|1aVBuT#vCZG-J%*NZ8oE z;o^9tF8#)s!*Y&$$&kahheNic6szSNM9JyhJZ$Hq<5Dv8LS)gs=jVwBy7Tb(TW5#k%@SgdBqL{EQgM znOcJ*DH58>;*La3{CcN5Da3tm-aS;9dYu})n;G}*+6g8FzSkVy{gGN$mQ&3&h+d~M ztOd!@i)uq=FRIl7`vXQ9;v-_y?|tcij|TkQHeQ4Xw=8Ys=B7VPjs%NWAUA^gKyIJ* zc%hN~{M4Ie$hD3tlGd(N$r2Mygb;;*J`J?oJNjhKjtvnBE)wjZRQI;U z6Jbpf+4@7>?=3L-H^QEG)UAd~+eaaC$8nJeI$t`(XzJbHBzJ|VOXJXqwPYjv7bA`T z=Q;a_{Q9#CAd&ZmPKoPglgLdAzXd|G2as?raNhq87aK3gbL^1ANgPu}$ArW&P50!zMdiJR$lRr5 zDY?otrPUdEDnCs9M!M&d1=IDX5YmM@0D0Sv)`@}FNF0;SeMz0qf23^rHa{bE=Asn~ z=V%L0my8=veq^DB1?fk~&3BB#eS1-j!Tvd#7;G{wRfa!Vf(liwX` zdOJta^T{Alk|Ajf8lAC@Jso~PB1@_y#?M|GxkpfamO?VrM#3%v$4o|-dC3Y0hh!&Z zDKZS$Ei~O@=)gRJL%zO{eUvTyDFe!8sn|eip>$S)jmihg7s_++Pi29!6@UWkWU zzRs3-FM|&|83#TEXo%XJNaTtSGVce9Me=GQKBiZYd~J?@+6a zsUV=lY$-bnvDiK$=*;KI3Bv?62ouA6ZF~NdI_mr>^!ZckAzvs6ih{r?C=0p?J%TJL zTLhaZbP7OHB02|IuFbwoV}cDfC==CH*PAi~fy1NuSLE)6*h1RyW%FF#{>E8xx3jA-u#6f6*(_|30Dujz1m5w$kgp=X|b+xjh z;=Usn_86#`m_drnAZO0b-9z`rs&E`Vliwmd^GVnEeXQ{V>&9weNnZBU zSMY_uO{1;0Y_^ly0cK|r&cIk)fSD^Ob1O7H2ZTygeEW`=x-aNYXtyP%& z<@A@xx0=|aPanNK9OCMkfAUbGs~Hi@lx&6IL2u!fdma1BxtUD#&tC0`@7pTIa4C}9 zSCTv>aw^YhtVcRcww~;1hm>~j#_bzEN{SJQm`sv)D(H-#t?OdLPoF+vexthb4k?#k ztGX8f41yAZKIOT^|4s}{Zj$-7+|){i$yZLh*PworL@!^<7JYqZH}+xwlstzF{E-0C zE!9b!&EGlxh-<)_^%8`wO<`rGXey!rDpJl+D=X)wAQjye&{G(6!QbFwoHH){@sL9i zed8=JwEhq-;>lmS5SK&$p!}f(Ybd&~DQpk3g3O3*tRNVSg_#kbp?s*wha0zvJ_FCO zTZ#6t#_uNh<3kOG);55X_{D@=JZckc-Hh*G58{FG!P-~@f(3!Wet05*ZMYizE?Wj| z^#5Jv4k>xlp*P^8Yl|=yiFy3Tq$z-!PU$I$Aqty)TSM zGTiPWr$acdZd6Qa9W|$~x?(dfe%jmH(%0TEKDWW0WGEn`qkrA7W<(FRP7e=uipama zk)_YY;pIufzX)m-|{xm_~G2{Bo2U_l=@G|j#$nJ-=9{fMZjs#D$ zYtt$@nDiM%nV59axk^I)OvRwz60a{o7Ym0Eq~4mq6#c>ohfzk&I&zhQw(crY&?J0G=r#!?*08Mkrv{fvv|YFzS50RX-YW4!Xh zVP3g!xyFH1Ub(wVKCgJ&WsD~ljh>W$cD*D;W39t4bxNgf6E|FtIRa{E`yN#M9XV<0 zhKshj-ZNd)syWA{*CLDG+P6i*e zKu9OtdZ2Tcbf;=inhiXvl8&{1Da-ln{*Ul#>06@D-$|ox*+J;@|Bd8MzN5IKKpybUy;MMM*p=%e*)0iwJ>!aqhN?`f6de&af)AppfVD%rmnSEr zeL;y?jddbQiX^hQ*cYnmh5mSJ+bzmoC99)yrvZ@;4^ipon_l3 zVWkG?KXTYfK_A)_9-04{oGI4XTrGZ8UEE&RUiUur=H;&hNd@`Nl~bt?AtFsoq^o1p zQ5WBxFVjJ8J_)6yS}l6u&xTWyib1L2P?_KRR4_w0qi{NfQBkhsEBTg7H0SpCr{?Mn z`N!nqb@947I;p=EzZJ7woDGAcyWicryKo4AN{!-BNyXRE>n7(qP~XsKz*tH@1{?uV zH^=Fb@is?b+nr)%m*di%(qYG9*v)6SJTkTd+sMG-9mj^naHKN|$aXmnx;a;v9?1+B z7n=OUd8u{Cyo}Z@{>(3O-=O!Yc1%n2$H54)gr*HGzoAQ=c1%)g!QH%Uv_p-}O>w4}X@sGF=P4T(w)uv?C|M2U$A#-!;?^%PGAv!f<-X-84D?eppGx zmI8yV#BWhrxq3o9VTz($9n46uTw#$*~Rmj3^rkyyyqk9*vOmpJ)J7Gff!*CK|M`p1z}N!cb}rnOb`o( z=3PlC%+rIe{|MA4m$p0ka==>uBY3a-#|^%HPgZ|y&{8pU75BzKucKFg8e`(7&6OjI z19CN&2Adf7Nc|MbkI_9n(j}w31xoPcN_1b3x_958bgOdTH^hH|SQ`7I`-F(_=FolE z>RZ7=gs__nyWY*~kDNy$PckjDNMB-_o?fWGk9=(% zQ4j8s>Pb;lJsFOM9W@5Oa9F(2B5%d2#mfy5LD?J_^~|}sqPH6ftlT+Ta4R^h6B(9F z&j86>#DzUQ1ALyQxiLW}qrLrRrgODTVhR3C4gNLWs%=9b{x#U;fN8nKKwu@B?5IM| zh(%y!uQ38EQKVH)3ItZ7TaU@4(bm9xJi5|r)gySR!g>o~{r;oap`4hB;}YeAlJ-W5yBKO6c?w0vigK{>sVJ``ZNBmOmvv zC{#V85Nwb|2+z-s<-rOFp%G6o+)gkY!Wgz^8Oc_WLBz12By5m3v=cfEyCyhIaZdS;u55ST9^J6bjdio||nG{URK@1sV(ZqCC+((SKtU zF4Dl-RCLs87?5D{5Xa*9$%O_mi3|{vs>mH~5tBV8nYbA%E@5)*pWLz^d34=NJh5Gj zxWyikO3zVL@b+FL%?;UyaMK%6uC-It<*Kqu6y}v_VzZ~Gc_WdpE}hxrcF2V+!A#5i z-c;cCI;uVNETkYwFQJmka!-%?N-%R9_7~pvSi0L4Dc3s;Edmh--T!4x%f0Z_GW>digd@m9{)yv zw)yVYaERSf*PFNOdPR8O{c8v3FP>NsV?k28Nvqik`?D3`E%72hje1e=q+Y$eSCULt7hByPHfN zK3%hGk0muMMAv~H7D@_a3JpRIg#|r-ny}~8imbmd8X#8(Dxt=O>31mg8tpXX*bI>SOr-=H=< z_$)Liee>40`lGhTl?Gr>t@&U@D}B>Utoe|J{HsfS@c9+;4O&QRT+%wHAN zTXw1?o-eCc&aI(-g*G=RP6AxobC)7& z&kc7R)7-gpLPx`b)pbL13+!MtjJ6dC~DEmf^wLp`vChm`x1MF|IOl~R)oSi zq$>xSvLYMzNyzGwC=hkQgiw%We)Yg>P)2AVSY4i;v!S6g=2kRd201`pkV*78Y65dE zVee;SXM)qY0Kx%6<_SAfw=_RZduz9Ieva$hb_E4W1EnA#s3;


    5v!ce3|iEsD_I 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 g)pv@K- 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 - - Configuration - - - Installation - - There are three steps to using the iBATIS Data Access Objects (DAO) - framework with your application for the first time. - - Setup the distribution - - - - Add assembly references - - - - Setup XML configuration documents - - - - - Setup the Distribution - - The official site for iBATIS for .NET is our Apache site - <http://ibatis.apache.org/>. The DataAccess framework is availabe - in 2 types of distributions: a binary distribution that includes the - required DataAccess assemblies and a source distribution that includes a - VSN solution. To download either of the distributions, follow the link - to the Downloads area on our web site, and select the either the binary - or source distribution for the iBATIS .NET DataAccess V1.6.1 or later - release (if you download the binary distribution, extract the files - using a utility like WinZip or the extractor built into newer versions - of Windows and skip ahead to the Add Assembly References - section). - - The source distribution includes a VSN solution and a number of C# - projects. The distribution is in the form of a ZIP archive. You can - extract the distribution using a utility like WinZip or the extractor - built into newer versions of Windows. We suggest that you create an - ibatisnet folder in your VSN project directory and - extract the distribution there. - - Under the distribution's source folder are - eight folders that make up the iBATIS.NET distribution, as shown in the - following table: - - - Folders found in the iBATIS.NET source distribution - - - - - Folder name - - Description - - - - - - External-Bin - - Dependency assemblies provided for your - convenience. - - - - IBatisNet.Common - - Assembly of classes shared by DataAccess and - DataMapper - - - - IBatisNet.Common.Test - - Test project for IBatisNet.Common that can be used with - NUnit - - - - IBatisNet.DataAccess - - The Data Access Objects framework - - - - IBatisNet.DataAccess.Extensions - - Contains a C# project for extensions to the DataAccess - framework such as NHibernate support - - - - IBatisNet.DataAccess.Test - - Test project for the DataAccess framework that can be - used with NUnit - - - - iBatisNet.DataMapper - - The DataMapper framework (see seperate DataMapper - Guide) - - - - IBatisNet.DataMapper.Test - - Test project for the DataMapper that can be used with - NUnit - - - -
    - - You can load the IBatisNet.sln solution file - into VSN and build the solution to generate the needed assemblies. There - are seven projects in the solution, and all should succeed. The - assemblies we need will be created under - \source\IBatisNet.DataAccess\bin\Debug. The created - assemblies are : - - - IBatisNet.Common.dll - - - - iBatisNet.DataAccess.dll - - - - The core DataAccess - framework has external dependencies on - - - Castle.DynamicProxy.dll (creating proxies) - - - - The dependency is found in the External-Bin folder and can also - be found in the bin\Debug folder after building the - solution. In addition, the framework's - IBatisNet.DataAccess.Extensions and - IBatisNet.DataAccess.Test projects have - dependencies on NHibernate. - - - If you will not be using NHibernate and have a problem building - the solution due to that dependency, simply remove the - IBatisNet.DataAccess.Extensions and IBatisNet.DataAccess.Test projects - from the solution before building. - -
    - - - Add Assembly References - - Switching to your own solution, open the project that will be - using the iBATIS.NET DAO Framework. Depending on how your organize your - solutions, this might not be the project for your Windows or Web - application. It may be a library project that your application project - references. You need to add two references to your project: - - IBatisNet.DataAccess.dll - - - - IBatisNet.Common.dll - - - - Additionally, the DAO framework has the following external - dependencies: - Dependencies - - - - - Name - - Description - - Assembly DLLs - - - - - - Castle dynamic proxy 1.1.5.0 - - Dynamic proxy generator - - Castle.DynamicProxy.dll - - - - -
    -
    - - - Setup XML configuration documents - - You will need to add two or more XML file items to your Windows or - Web application project (and Test project if you have one). These files - are: - - - - dao.config - The Data Access configuration file that is used to specify your DAOs, providers.config file location, and data source information. - - - - providers.config - A file used by the framework to look up the definition of your selected database provider. - - - - SqlMap.config and Data Map definition XML files - Required when using the iBATIS DataAccess framework in conjunction with the iBATIS DataMapper framework - - - - The dao.config and - providers.config files must be placed in a location - where the framework can find them at runtime. Depending on the type of - project you have, the default expected location of these 2 files will be - different, as shown in Table 3.3. However, your project is not limited - to using just these locations. The DataAccess framework provides other - options for placing these files in locations that are more suitable for - your project instead of using the default locations. These options are - covered later in this guide. - - - Where to place the dao.config file - - - - - Windows, Library, or Test projects (using NUnit or - equivalent) - - Place with the assembly (.dll) files and the - app.config file - - - - Web projects - - Place in the project root, with the - web.config file - - - -
    -
    - - - Visual Studio.NET Integration - - The configuration file (dao.config) is associated to a schema. The benefits of associating - an XML document with a schema are to validate the document (which is - done at runtime) and to use editing features such as - IntelliSense/content completion assistance. - - To allow association of the schemas in VS.NET XML editor to your - configuration file, you should add the schema file - (DaoConfig.xsd to either your VS.NET project or in - your VS.NET installation directory. The VS.NET directory will be - either - - C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas for VS.NET 2005 - - or - - C:\Program Files\Microsoft Visual Studio .NET - 2003\Common7\Packages\schemas\xml for VS.NET 2003 - - or - - C:\Program Files\Microsoft Visual Studio - .NET\Common7\Packages\schemas\xml for VS.NET 2002 - - depending on your version of VS.NET. It is typically easier to - place the file in the well known location under the VS.NET installation - directory than to copy the XSD file for each project you create. - - Once you have registered the schema with VS.NET you will be enough - to get IntelliSense and validation of the configuration file from within - VS.NET. - -
    - IntelliSense example - - - - - - -
    -
    -
    - - - Logging Activity - - The iBATIS DataAccess framework records its interaction with the - database through an internal logging mechanism patterned after Apache - Log4Net. The internal logging mechanism can use one of the three built-in - loggers (NoOpLogger, ConsoleOutLogger, TraceLogger) or external logging - packages such as Apache Log4Net. In order for iBATIS to generate log - messages, the application's config file (App.Config or Web.Config) must - contain an appropriate configSection node: - - - iBATIS Configuration Section Handler for logging - - <configSections> - <sectionGroup name="iBATIS"> - <section name="logging" type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common" /> - </sectionGroup> -</configSections> - - - The application's config file must declare one logger - implementation. See the examples below on how to configure one of the - three built-in loggers. - - <iBATIS> - <logging> - <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.ConsoleOutLoggerFA, IBatisNet.Common"> - <arg key="showLogName" value="true" /> - <arg key="showDataTime" value="true" /> - <arg key="level" value="ALL" /> - <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS" /> - </logFactoryAdapter> - </logging> -</iBATIS> -<iBATIS> - <logging> - <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.NoOpLoggerFA, IBatisNet.Common" /> - </logging> -</iBATIS> -<iBATIS> - <logging> - <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.TraceLoggerFA, IBatisNet.Common" /> - </logging> -</iBATIS> - - To configure iBATIS to use another logger implementation, simple - specify the appropriate logFactoryAdapter type. To use Apache Log4Net with - the iBATIS framework, use the following configuration - setting: - - <iBATIS> - <logging> - <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net"> - <arg key="configType" value="inline" /> - </logFactoryAdapter> - </logging> -</iBATIS> - - <iBATIS> - <logging> - <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net"> - <arg key="configType" value="file" /> - <arg key="configFile" value="log4Net.config" /> - </logFactoryAdapter> - </logging> -</iBATIS> - - The Log4NetLoggerFA supports the following values for the - configTypes argument: - Valid configType values - - - - - configType - - Description - - - - - - inline - - log4net node will use the log4net node in the - App.Config/Web.Config file when it is configured - - - - file - - (also requires configFile argument) - log4net will use an - external file for its configuration - - - - file-watch - - (also requires configFile argument) - log4net will use - an external file for its configuration and will re-configure - itself if this file changes - - - - external - - iBATIS will not attempt to configure log4net. - - - -
    - - - Sample Logging Configurations - - The simplest logging configuration is to output log messages to - Console.Out: - - <configuration> - <configSections> - <sectionGroup name="iBATIS"> - <section name="logging" type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common" /> - </sectionGroup> - </configSections> - <iBATIS> - <logging> - <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.ConsoleLoggerFA, IBatisNet.Common.Logging" /> - </logging> - </iBATIS> -</configuration> - - A common logging configuration is to use Apache Log4Net. To use - Log4Net with your own application, you need to provide your own Log4Net - configuration. You can do this by adding a configuration file for your - assembly that includes a <log4Net> element. The configuration file - is named after your assembly but adds a .config - extension, and is stored in the same folder as your assembly. This is an - example of a basic Log4Net configuration block - (IBatisNet.DataMapper.Test.dll.Config) that also creates a log4net.txt - which contains debug information from log4net. If log4net is not - producing output, check the log4net.txt file. - - <configuration> - <configSections> - <sectionGroup name="iBATIS"> - <section name="logging" type="IBatisNet.Common.Logging.ConfigurationSectionHandler, IBatisNet.Common" /> - </sectionGroup> - <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> - </configSections> - <appSettings> - <add key="log4net.Internal.Debug" value="true"/> - </appSettings> - <system.diagnostics> - <trace autoflush="true"> - <listeners> - <add name="textWriterTraceListener" - type="System.Diagnostics.TextWriterTraceListener" - initializeData="C:\\inetpub\\wwwroot\\log4net.txt" /> - </listeners> - </trace> - </system.diagnostics> - <iBATIS> - <logging> - <logFactoryAdapter type="IBatisNet.Common.Logging.Impl.Log4NetLoggerFA, IBatisNet.Common.Logging.Log4Net"> - <arg key="configType" value="inline" /> - </logFactoryAdapter> - </logging> - </iBATIS> - <log4net> - <appender name="FileAppender" type="log4net.Appender.FileAppender"> - <file value="log.txt" /> - <appendToFile value="true" /> - <layout type="log4net.Layout.SimpleLayout" /> - </appender> - <root> - <level value="ALL" /> - <appender-ref ref="FileAppender" /> - </root> - </log4net> -</configuration> - -
    - - The Configuration File (dao.config) - - The DaoManager class is responsible for the configuration of the DAO - Framework by parsing a special configuration XML file. The configuration - XML file specifies the following items: - - - - DAO contexts - - - - properties for configuration - - - - data source information - - - - DAO implementations for each associated DAO interface - - - - A DAO context is a grouping of related configuration information and - DAO implementations. Usually a context is associated with a single data - source such as a relational database or a flat file. By configuring - multiple contexts, you can easily centralize the data access configuration - for multiple databases. The structure of the DAO configuration file - (commonly called dao.config but not required) is as - follows. Values that you will likely change for your application are - highlighted. - - - Example dao.config file - - <?xml version="1.0" encoding="utf-8"?> -<daoConfig xmlns="http://ibatis.apache.org/dataAccess" -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> - -<providers resource="providers.config"> - -<!-- Example ADO.NET DAO Configuration --> -<context id="SimpleDao" default="true"> - <properties resource="properties.config"/> - - <database> - <!-- Optional ( default ) --> - <provider name="sqlServer1.1"/> - <dataSource name="iBatisNet" - connectionString="data source=${datasource};database=${database}; - user id=${userid};password=${password};"/> - </database> - - <daoFactory> - <dao interface="IBatisNet.Test.Dao.Interfaces.IAccountDao, IBatisNet.Test" - implementation="IBatisNet.Test.Dao.Implementations.Ado.AccountDao, IBatisNet.Test"/> - </daoFactory> -</context> - -<!-- Example SQL Maps DAO Configuration --> -<context id="SqlMapDao"> - <properties resource="properties2.config"/> - - <database> - <provider name="OleDb1.1"/> - <dataSource name="iBatisNet" - connectionString="Provider=SQLOLEDB;Server=${database};database=IBatisNet; - user id=${userid};password=${password};"/> - </database> - - <daoSessionHandler id="SqlMap"> - <property name="resource" value="SqlMap.config"/> - <!-- - url and embedded options are also available - <property name="url" value="C:\iBATIS\IBatisNet.DataAccess.Test\bin\Debug\SqlMap.config"/> - <property name="embedded" value="bin.Debug.SqlMap.config, IBatisNet.DataAccess.Test"/> - --> - </daoSessionHandler> - - <daoFactory> - <dao interface="IBatisNet.Test.Dao.Interfaces.IAccountDao, IBatisNet.Test" - implementation="IBatisNet.Test.Dao.Implementations.DataMapper.AccountDao, IBatisNet.Test"/> - </daoFactory> -</context> - -</daoConfig> - - - - - In the example above, what we end up with is two DAO contexts. DAOs - are automatically aware of which context they belong to and therefore - which session handler to use. Again, there can be any number of DAO - contexts specified in a dao.config file, and - generally, a context will refer to a single specific data source. - - In order to manage multiple configurations for different - environments (DEVT, Q/A, PROD), you can also make use of the optional - <properties> element as shown above. This allows - you to use placeholders in the place of literal value elements. If you - have a "properties" file with the following values: - - - Example properties file - - <add key="userid" value="IBatisNet" /> -<add key="password" value="test" /> -<add key="database" value="iBatisNet" /> -<add key="datasource" value="(local)\NetSDK" /> - - - You can use placeholders defined in that properties file instead of - explicit values in the dao.config file. For - example: - - <dataSource name="iBatisNet" - connectionString="data source=${datasource};database=${database}; - user id=${userid};password=${password};"/> - - This allows for easier management of different environment - configurations. Only one properties resource file may be specified per - context. - - Continuing with the example above, the provider and the datasource - values are given within the database element. Following - that, an optional daoSessionHandler may be specified. - If none is specified, the default iBATIS.NET DAO SessionHandler called - SimpleDaoSessionHandler will be used. In the - example, the second context identifies the SessionHandler as - SqlMap, meaning that the DAO implementations will be - using iBATIS.NET Data Mapper SqlMaps instead of basic ADO calls. - - Next in the context under daoFactory, is the - specification of all DAO interfaces and their associated implementations. - These mappings link a generic DAO interface to a concrete (specific) - implementation. This is where we can see the pluggable nature of Data - Access Objects. By simply replacing the implementation class for a given - DAO mapping, the persistence approach taken can be completely changed - (e.g. from ADO to iBATIS DataMapper SqlMaps to NHibernate). - - - - Configuration Elements - - The sections below describe the elements of the Data Access - configuration document for .NET. The dao.config file - can be validated by the DaoConfig.xsd schema provided - with the distribution. - - - - - type Attributes - - In general, when specifying a type attribute within a configuration file, a type attribute value must be a fully qualified type name following the format: - - type="[namespace.class], [assembly name], - Version=[version], Culture=[culture], - PublicKeyToken=[public token]" - - For example: - - type="MyProject.Domain.LineItem, MyProject.Domain, - Version=1.2.3300.0, Culture=neutral, - PublicKeyToken=b03f455f11d50a3a" - - The strongly typed name is desired, however, it is also legitimate to use the shorter style assembly type name: - - type="MyProject.Domain.LineItem, MyProject.Domain" - - - - - - - The <providers> Element - - Under ADO.NET, a database system is accessed through a provider. A - database system can use a custom provider or a generic ODBC provider. - iBATIS.NET uses a pluggable approach to installing providers. Each - provider is represented by an XML descriptor element. The list of - providers you might want to use can be kept in a separate XML descriptor - file. The iBATIS.NET distribution includes the standard - providers.config file with a set of thirteen - prewritten provider elements: - - - - sqlServer1.0 - Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.0 - - - - sqlServer1.1 -Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.1 - - - - OleDb1.1 - OleDb provider available with .NET Framework 1.1 - - - - Odbc1.1 - Odbc provider available with .NET Framework 1.1 - - - - oracle9.2 - Oracle provider V9.2.0.401 - - - - oracle10.1 - Oracle provider V10.1.0.301 - - - - oracleClient1.0 - MS Oracle provider V1.0.5 available with .NET Framework 1.1 - - - - ByteFx - ByteFx MySQL provider V0.7.6.15073 - - - - MySql - MySQL provider V1.0.4.20163 - - - - SQLite3 - SQLite.NET provider V0.21.1869.3794 - - - - Firebird1.7 - Firebird SQL .NET provider V1.7.0.33200 - - - - PostgreSql0.7 - Npgsql provider V0.7.0.0 - - - - iDb2.10 - IBM DB2 iSeries provider V10.0.0.0 - - - - The providers.config file can be found under - \source\IBatisNet.DataAccess.Test\bin\Debug in the - iBATIS.NET source distribution or in the root folder of the .NET - DataAccess binary distribution. - - A provider may require libraries that you do not have installed,. - Therefore, the provider element has an "enabled" attribute that allows - you to disable unused providers. One provider can also be marked as the - "default" and will be used if another is not specified by your - configuration. - - The standard providers.config file has - sqlServer1.1 set as the default and the sqlServer1.0 provider disabled. - Aside from sqlServer1.1, OleDb1.1, and Odbc1.1, all other providers are - disabled by default. Remember to set the "enabled" attribute to "true" - for the provider that you will be using. - - - ByteFx is the recommended provider if you are using MySQL. You - may download ByteFx from the MySQLNet SourceForge site - (http://sf.net/projects/mysqlnet/). If the ByteFx license is - acceptable to you, you may install it as a reference within your - application and enable the ByteFx provider. - - - - Be sure to review the providers.config - file and confirm that the provider you intend to use is enabled! - (Set the enabled attribute to true.) - - - - Expected default locations of the providers.config file - - - - - Windows, Library, or Test projects (using NUnit or - equivalent) - - With the assembly (.dll) files with the - app.config file - - - - Web projects - - In the project base directory, with the - web.config file - - - -
    - - To use the file, you can copy it into your project at the expected - default location, give a path to the file relative to the project root - directory, specify a url (absolute path) to its location, or make it an - embedded resource of your project. If you copy the file into the - expected default location, the <providers> element is not required - in your dao.config file. - - - <providers> attributes - - The <providers> element can accept one of the following - attributes to specify the location of the providers.config - file. - - - Attributes of the <providers> element - - - - - Attribute - - Description - - - - - - resource - - Specify the file to be loaded from a relative path from - the project root directory. Since the root directory is - different depending on the project type, it is best to use a - properties variable to indicate the relative path. Having that - variable defined in a properties file makes it easy to change - the path to all your DataAccess configuration resources in one - location.resource="${root}providers.config" - - - - url - - Specify the providers.config to be loaded through an - absolute path.url="c:\Web\MyApp\Resources\providers.config" -or -url="file://c:\Web\MyApp\Resources\providers.config" - - - - embedded - - Specify the providers.config file to be loaded as an - embedded resource in an assembly. Syntax for the embedded - attribute is '[extendednamespace.]filename, the name - of the assembly which contains the embedded - resource'embedded="Resources.providers.config, MyApp.Data" - - - -
    -
    -
    - - - The <context> Element - - A DAO context is a grouping of related configuration information - and DAO implementations for a specific database and provider. - - - Attributes of the <context> element - - - - - Attribute - - Description - - - - - - id - - Context id - - - - default - - Global setting to indicate if this is the default - context - - - -
    - - - The <properties> Element - - Sometimes the values we use in an XML configuration file occur - in more than one element. Often, there are values that change when we - move the application from one server to another. To help you manage - configuration values, you can specify a standard properties file (with - name=value entries) as part of a Data Access configuration. Each named - value in the properties file becomes a shell - variable that can be used throughout the Data Access - configuration. - - Properties are handy during building, testing, and deployment. - Additionally, properties make it easy to reconfigure your application - for multiple environments or to use automated tools for configuration - such as NAnt. - - The <properties> element can only accept one of the - following attributes to specify the location of the properties - file. - - - Attributes of the <properties> element - - - - - Attribute - - Description - - - - - - resource - - Specify the properties file name files to be loaded - from the root directory of the application (relative - path)resource="properties.config" - - - - url - - Specify the properties file to be loaded through an - absolute pathurl="c:\Web\MyApp\Resources\properties.config" -or -url="file://c:\Web\MyApp\Resources\properties.config" - - - - embedded - - Specify the properties file to be loaded as an embedded - resource in an assembly. Syntax for the embedded attribute is - '[extendednamespace.]filename, the name of the - assembly which contains the embedded - resource'embedded="Resources.properties.config, MyApp.Data" - - - -
    - - - <property> element and attributes - - You can also specify more than one properties file or add - property keys and values directly into your - dao.config file by using <property> - elements. For example: - - - <properties> - <property resource="myProperties.config"/> - <property resource="anotherProperties.config"/> - <property key="host" value="ibatis.com" /> -</properties> - - - - Attributes of the <property> element - - - - - Attribute - - Description - - - - - - resource - - Specify the properties file to be loaded from the - root directory of the applicationresource="properties.config" - - - - url - - Specify the properties file to be loaded through an - absolute path.url="c:\Web\MyApp\Resources\properties.config" -or -url="file://c:\Web\MyApp\Resources\properties.config" - - - - embedded - - Specify the properties file to be loaded as an - embedded resource in an assembly. Syntax for the embedded - attribute is '[extendednamespace.]filename, the - name of the assembly which contains the embedded - resource'embedded="Resources.properties.config, MyApp.Data" - - - - key - - Defines a property key (variable) - namekey="username" - - - - value - - Defines a value that will be used by the framework in - place of the the specified property - key/variablevalue="mydbuser" - - - -
    -
    -
    - - - The <database> Element - - The <database> element encloses elements that configure - the database system for use by the framework. These are the - <provider> and <datasource> elements. - - - The <provider> Element - - The <provider> element specifies a database provider - from the providers.config file. - - If the default provider is being used, the <provider> - element is optional. Or, if several providers are available, one may - be selected using the provider element without modifying the - providers.config file. <provider name="OleDb1.1" /> - - - Attributes of the <provider> element - - - - - Attribute - - Description - - - - - - name - - Name used to uniquely identify the provider - - - -
    -
    - - - The <dataSource> Element - - The <datasource> element specifies the connection string - for a specific database and provider. - - - Attributes of the <dataSource> element - - - - - Attribute - - Description - - - - - - name - - Name used to identify the data source - - - - connectionString - - The connection string to the database - - - -
    -
    -
    - - - The <daoSessionHandler> Element - - The <daoSessionHandler> element specifies the component - that manages transaction and connections for a session. - - - Attributes of the <daoSessionHandler> element - - - - - Attribute - - Description - - - - - - id - - Id used to uniquely identify the handler - - - -
    - - - The <property> Element - - Some <daoSessionHandler> implementations such as iBATIS - DataMapper SqlMaps and NHibernate need additional information for - configuration. The <property> element is used to specify this - information. - - For iBATIS DataMapper SqlMaps, the method for locating and - loading the SqlMap.config file is used in the - "name" attribute. Depending on the chosen method, the corresponding - filepath or fully-qualified resource and assembly name is used for - the "value" attribute. - - - Attributes of the <property> element for use with - iBATIS DataMapper SqlMaps - - - - - Attribute - - Description - - - - - - name - - Indicates the method used to locate and load the - SqlMap.config file. The available - options are "resource", "url", and "embedded" (as previously - described for loading the providers and properties - configuration files).name="resource" - - - - value - - Used to specify the filename, fullpath, or fully - qualified resource and assembly name for the - SqlMap.config file.value="MySqlMap.config" - - - -
    - - For NHibernate, the "name" and "value" attributes are used to - specify various NHibernate configuration details such as - "hibernate.dialect", "hibernate.connection.provider", and - "mapping". - - - Attributes of the <property> element for use with - NHibernate - - - - - Attribute - - Description - - - - - - name - - The name of the property to configure. - Example:name="hibernate.dialect" - - - - value - - The value of the property configuration. - Example:value="NHibernate.Dialect.MsSql2000Dialect" - - - -
    -
    -
    - - - The <daoFactory> Element - - The <daoFactory> element is a grouping of Dao interfaces - and implementations. - - - The <dao> Element - - The <dao> element specifies a Dao interface and one - implementation of that interface. - - - Attributes of the <dao> element - - - - - Attribute - - Description - - - - - - interface - - The interface that the Dao must implement. Structure - value must be : namespace-qualified name of the class, - followed by a comma, followed by (at a bare minimum) the - name of the assembly that contains the class. Example: - interface= -"IBatisNet.Test.Dao.Interfaces.IAccountDao, -IBatisNet.Test" - - - - implementation - - An implementation of the Dao interface. Structure - value must be : namespace-qualified name of the class, - followed by a comma, followed by (at a bare minimum) the - name of the assembly that contains the class. Example: - implementation= -"IBatisNet.Test.Dao.Implementations.Ado.AccountDao, -IBatisNet.Test" - - - -
    -
    -
    -
    -
    -
    \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/dao.xml b/docs/dataAccessGuide/src/en/dao.xml deleted file mode 100644 index dc3379a..0000000 --- a/docs/dataAccessGuide/src/en/dao.xml +++ /dev/null @@ -1,151 +0,0 @@ - - - Data Access Objects - - - Data Access Objects - - The iBATIS.NET Data Access Objects API can be used to help hide - persistence layer implementation details from the rest of your application - by allowing dynamic and pluggable DAO components to be easily swapped in - and out. For example, you could have two implementations of a particular - DAO, one that uses the iBATIS.NET DataMapper framework and another that - uses the NHibernate framework, to persist objects to the database. Another - example would be a DAO that provides caching services for another DAO. - Depending on the situation (e.g. limited database performance vs. limited - memory), either the cache DAO could be plugged in or the standard - un-cached DAO could be used. These examples show the convenience, and more - importantly, the safety that the DAO pattern provides. The DAO pattern - protects your application from possibly being tied to a particular - persistence approach. In the event that your current solution becomes - unsuitable (or even unavailable), you can simply create new DAO - implementations to support a new solution without having to modify any - code in the other layers of your application. - - - The iBATIS.NET DAO Framework and DataMapper Framework are - completely separate and are not dependent on each other in any way. - Please feel free to use either one separately, or both together. - - - - - The Components of the Data Access Objects API - - There are a number of classes that make up the IBatisNet.DataAccess - API. Each has a very specific and important role. The following table - lists the classes and a brief description. The next sections will provide - more detail on how to use these classes. - - - IBatisNet.DataAccess API Classes - - - - - Class/Interface (Patterns) - - Description - - - - - - - - DomDaoManagerBuilder - - Responsible for configuration of the DAO framework (via - dao.config), instantiating DAO implementations and IDaoManager instances. - - - - IDaoManager (Facade) - - Acting as a façade to the rest of the API. - - - - IDalSession (Marker Interface) - - A generic marker interface for a database session. A common - implementation would wrap an ADO.NET connection/transaction - object. - - - - DataAccessException (Runtime Exception) - - All methods and classes in the DAO API throw this exception - exclusively. DAO implementations should also throw this exception - exclusively and avoid throwing any other exception type by nesting - them within the DataAccessException. - - - - IDao (Marker Interface) - - A marker interface for all DAO implementations. This - interface must be implemented by all DAO classes. This interface - does not declare any methods to be implemented and only acts as a - marker (i.e. something for the XML-based DaoFactory to identify - the class by). - - - -
    -
    - - - Session Handler - - - Session Handler Implementations - - - - - Session Handler - - Description - - - - - - SqlMap - - Manages connection and transactions via the DataMapper - framework. - - - - NHibernate - - Provides easy integration for NHibernate and its associated - transaction facilities (SessionFactory, Session, - Transaction). - - - - ADONET - - Manages connection and transactions via ADO.NET using the - basic iBATIS.NET DataSource, IDbConnection, and IDbTransaction - interfaces. - - - -
    - - - - - - - - iBATIS.NET Data Access Objects - - -
    -
    \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/example.xml b/docs/dataAccessGuide/src/en/example.xml deleted file mode 100644 index 7ba0918..0000000 --- a/docs/dataAccessGuide/src/en/example.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - Examples - - - NPetshop Application - - For a complete example of using the DAO Framework, please visit - http://ibatis.apache.org/ - and download the NPetshop demo application. Have fun! - - \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/handler.xml b/docs/dataAccessGuide/src/en/handler.xml deleted file mode 100644 index 51b3892..0000000 --- a/docs/dataAccessGuide/src/en/handler.xml +++ /dev/null @@ -1,123 +0,0 @@ - - - Session Handler Implementations and Configuration - - - Overview - - A Session Handler implementation is a component that manages - transaction and connections for a session. There are currently three - implementations of session handlers that come with the framework: Simple, - SqlMap, and NHibernate. - - - - Simple DAO Session Handler (Default) Example Configuration - - This implementation uses ADO.NET to provide a connection and - transaction via the ADO.NET API. - - - Example Simple DAO Session Handler configuration - - <context id="SimpleDao" default="true"> - <properties resource="database.config"/> - - <database> - <!-- Optional ( default ) --> - <provider name="sqlServer1.1"/> - <dataSource name="iBatisNet" - connectionString="data source=${datasource};database=${database}; - user id=${userid};password=${password}"/> - </database> - - <!-- Element daoSessionHandler (ADONET) is Optional ( default ) --> - - <daoFactory> - <dao interface="IBatisNet.Test.Dao.Interfaces.IAccountDao, IBatisNet.Test" - implementation="IBatisNet.Test.Dao.Implementations.Ado.AccountDao, IBatisNet.Test"/> - </daoFactory> -</context> - - - - - - - SqlMap DAO Session Handler Example Configuration - - The SqlMap session handler implementation wraps iBATIS Data Mapper - SqlMapper session management services for simple use via the DAO - framework. All you need to specify is the SqlMap configuration - file. - - - Example SqlMap DAO Session Handler configuration - - <context id="SqlMapDao"> - <properties resource="database.config"/> - - <database> - <provider name="OleDb1.1"/> - <dataSource name="iBatisNet" - connectionString="Provider=SQLOLEDB;Server=${database};database=IBatisNet; - user id=${userid};password=${password};"/> - </database> - - <daoSessionHandler id="SqlMap"> - <property name="resource" value="SqlMap.config"/> - </daoSessionHandler> - - <daoFactory> - <dao interface="IBatisNet.Test.Dao.Interfaces.IAccountDao, IBatisNet.Test" - implementation="IBatisNet.Test.Dao.Implementations.DataMapper.AccountDao, IBatisNet.Test"/> - </daoFactory> -</context> - - - - - - - NHibernate DAO Session Handler Example Configuration - - Similar to the SqlMap implementation, the NHibernate session handler - implementation wraps the NHibernate session management services for simple - use via the DAO framework. Basically, the properties specified in the - configuration are the same as those that would normally be specified in an - NHibernate configuration section. Here is an example configuration: - - - Example NHibernate DAO Session Handler configuration - - <context id="NHibernateDao"> - <properties resource="database.config"/> - - <database> - <provider name="OleDb1.1"/> - <dataSource name="iBatisNet" - connectionString="Provider=SQLOLEDB;Server=${database};database=IBatisNet; - user id=${userid};password=${password};"/> - </database> - - <daoSessionHandler id="NHibernate"> - <property name="hibernate.dialect" - value="NHibernate.Dialect.MsSql2000Dialect"/> - <property name="hibernate.connection.provider" - value="NHibernate.Connection.DriverConnectionProvider"/> - <property name="hibernate.connection.driver_class" - value="NHibernate.Driver.SqlClientDriver"/> - <property name="mapping" value="IBatisNet.Test"/> - <property name="show_sql" value="false"/> - <property name="use_outer_join" value="true"/> - </daoSessionHandler> - - <daoFactory> - <dao interface="IBatisNet.Test.Dao.Interfaces.IAccountDao, IBatisNet.Test" - implementation="IBatisNet.Test.Dao.Implementations.DataMapper.AccountDao, IBatisNet.Test"/> - </daoFactory> -</context> - - - \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/images/DAODesign.gif b/docs/dataAccessGuide/src/en/images/DAODesign.gif deleted file mode 100644 index 5ca64a88d8872731b5431353688adac5c8367ea3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11218 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 diff --git a/docs/dataAccessGuide/src/en/images/DAODiagram.gif b/docs/dataAccessGuide/src/en/images/DAODiagram.gif deleted file mode 100644 index 25afbdd300bec59860d4b2c9908416c42084a736..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33728 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 - - - - - - - - -]> - - - iBATIS.NET - Data Access Objects Application Framework - Data Access Objects Developer Guide - Version 1.9.1 - March 2007 - - - Gilles - Bayon - - - Clinton - Begin - - - Roberto - Rabe - - - - - Copies of this document may be made for your own use and for - distribution to others, provided that you do not charge any fee for such - copies and further provided that each copy contains this Copyright - Notice, whether distributed in print or electronically. - - - - - - &introduction; - &dao; - &configuration; - &handler; - &programming; - &interface; - &example; - &xsd; - - \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/interface.xml b/docs/dataAccessGuide/src/en/interface.xml deleted file mode 100644 index f6d8588..0000000 --- a/docs/dataAccessGuide/src/en/interface.xml +++ /dev/null @@ -1,447 +0,0 @@ - - - Implementing the DAO Interface (Creating Your Data Access - Objects) - - - Interface - - The IDao interface is simple and - flexible because it does not declare any methods. It is intended to act as - a marker interface only (as per the Marker Interface pattern –Grand98). In - other words, by extending the IDao - interface, all that is really achieved for the class that implements your - DAO interface is the ability to be instantiated and managed by the - DaoManager. There are no limitations to the methods - that you use in your DAO interfaces. It is recommended for consistency - that DAO implementations only throw exceptions of type - DataAccessException which is an - ApplicationException. This helps to hide - the implementation details of your persistence solution. - - An example of a DAO interface is: - - [C#] -public interface IAccountDao : IDao { - Account GetAccountById(int accountID); - void Create(Account account); - // DAO Framework code may throw DataAccessException - void Update(Account account); - void Delete(Account account); -} - - - - DAO Design Considerations - - When implementing your DAO classes for your DAO interfaces, it is - recommended to use a design that includes the DAO interface, an abstract - (base) class, and a concrete class. The advantage to having the base class - is that it can contain common methods that simplify the usage of your - persistence approach (wrapping up exception handling, transaction - acquisition, etc.). - - - - - - - DAO Implementation Diagram - - - Notice that the BaseDao implements the - IDao marker and leaves the - IAccountDao without it. Furthermore, the - concrete AccountDao implements both by implementing - the IAccountDao and extending the - BaseDao. This allows your Account interface API to - remain free of the IDao marker. - - - - An Example BaseDao - - In case you are still wondering what the - IDao interface looks like in code, here it - is: - - using System; - -namespace IBatisNet.DataAccess.Interfaces { - public interface IDao { - - } -} - - It may not look like much, but that's the point! The iBATIS DAO - framework uses this interface to interact with your application DAOs since - they are marked as implementing it. As mentioned earlier, you don't have - to force your DAO interfaces to inherit - IDao if you create a class like - BaseDao. - - using System; -using IBatisNet.Common; -using IBatisNet.DataAccess; //DaoManager, DaoSession -using IBatisNet.DataAccess.Interfaces; //IDao - -namespace IBatisNet.Test.Implementations { - public class BaseDao: IDao { - protected DaoSession GetContext() { - IDaoManager daoManager = DaoManager.GetInstance(this); - return (daoManager.LocalDaoSession as DaoSession); - } - } -} - - The BaseDao class implements the - IDao marker interface and defines a - protected GetContext method that will be used by - DAO classes that inherit from BaseDao. By calling - GetContext, a DAO class gets a - DaoSession that is managed by the framework's - DaoManager. The DaoSession - abstract class uses the IDalSession - interface to provide an API to manage transactions and to access ADO.NET - objects during the session. - - namespace IBatisNet.DataAccess { - public abstract class DaoSession : IDalSession { - - // Constructor - public DaoSession(DaoManager daoManager) - - // Properties - public abstract DataSource DataSource - public abstract IDbConnection Connection - public abstract IDbTransaction Transaction - - // Methods - - // Complete (commit) a transaction - public abstract void Complete(); - - // Open a database connection. - public abstract void OpenConnection(); - - // Close the connection - public abstract void CloseConnection(); - - // Begin a transaction. - public abstract void BeginTransaction(); - - // Begin a database transaction - public abstract void BeginTransaction(bool openConnection); - - // Begin a transaction at the data source - // with the specified IsolationLevel value. - public abstract void BeginTransaction(IsolationLevel isolationLevel); - - // Begin a transaction on the current connection - // with the specified IsolationLevel value. - public abstract void BeginTransaction(bool openConnection, IsolationLevel isolationLevel); - - // Commit the database transaction. - // and close the connection. - public abstract void CommitTransaction(); - - // Commit the database transaction. - public abstract void CommitTransaction(bool closeConnection); - - // Rollback a transaction from a pending state - // and close the connection. - public abstract void RollBackTransaction(); - - // Rolls back a transaction from a pending state. - public abstract void RollBackTransaction(bool closeConnection); - - public abstract IDbCommand CreateCommand(CommandType commandType); - public abstract IDataParameter CreateDataParameter(); - public abstract IDbDataAdapter CreateDataAdapter(); - public abstract IDbDataAdapter CreateDataAdapter(IDbCommand command); -} - - The ADO.NET access provided by the DaoSession - object gives you the flexibility to sprinkle in ADO-based DAO classes with - iBATIS Data Mapper-based DAOs and NHibernate-based DAOs for those special - circumstances that often pop up. And you get all this without losing the - consistent DAO interface layer or exposing your persistence implementation - details. - - - - Consistency and Hidden Implementations - - Let's take a look at a consistency means when using a DAO layer. We - will use the previously shown IAccountDao interface to create two example - implementations, the first using ADO.NET and the second using the iBATIS - Data Mapper framework. After that, we will go through the steps to - creating and using an NHibernate-based DAO to use with the framework. - (Complete code examples can be found in the IBatisNet-Test project found - in the distribution) - - - ADO.NET AccountDao with the Simple DAO Session Handler - - First, we declare that we'll be using types from the - IBatisNet.DataAccess, - IBatisNet.DataAccess.Exceptions, and - IBatisNet.DataAccess.Interfaces namespaces with - our DAO. These provide the DaoSession and - DataAccessException classes as well as the - IDao interface. - - using System; -using System.Collections; -using System.Data; - -using IBatisNet.DataAccess; // DaoSession -using IBatisNet.DataAccess.Exceptions; // DataAccessException -using IBatisNet.DataAccess.Interfaces; // IDao - -using IBatisNet.Test.Dao.Interfaces; // IAccountDao -using IBatisNet.Test.Implementations; // BaseDao -using IBatisNet.Test.Domain; // Account - - The DAO will inherit from our BaseDao class - and implement our IAccountDao interface. - SQL queries are written to allow the DAO to be used with the SqlClient - provider for MS SQL Server. Additionally, command parameter names are - specified. - - namespace IBatisNet.Test.Dao.Implementations.Ado { - - public class AccountDao : BaseDao, IAccountDao { - private const string SELECT_ACCOUNT_BY_ID ="select Account_ID, ..."; - private const string INSERT_ACCOUNT = "insert into Accounts (Account_ID, ..."; - private const string UPDATE_ACCOUNT = "update Accounts set Account_FirstName = @Account_FirstName, ..."; - private const string DELETE_ACCOUNT = "delete from Accounts where Account_ID = @Account_ID"; - - private const string PARAM_ACCOUNT_ID = "@Account_ID"; - private const string PARAM_ACCOUNT_FIRSTNAME = "@Account_FirstName"; - private const string PARAM_ACCOUNT_LASTNAME = "@Account_LastName"; - private const string PARAM_ACCOUNT_EMAIL = "@Account_Email"; - - Now, let's let's see how this DAO's Delete(Account - account) method uses the framework. - - public void Delete(Account account) { - - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - command = daoSession.CreateCommand(CommandType.Text); - - try { - command.CommandText = DELETE_ACCOUNT; - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - command.Parameters.Add( sqlParameter ); - command.ExecuteNonQuery(); - command.Parameters.Clear(); - } - catch (System.Exception e) { - throw new - DataAccessException("Error executing AccountDao.Delete. Cause :" - + e.Message, e); - } - finally { - command.Dispose(); - } - } - - The DAO obtains an instance of DaoSession - by calling the GetContext method inherited from - BaseDao. Next, it uses the simple - DaoSession to get a command - object to execute the DELETE_ACCOUNT SQL statement. - Lastly, if an exception is thrown, the DAO makes sure it is a - DataAccessException. Pretty - straightforward. - - - - Data Mapper AccountDao with the SqlMap DAO Session - Handler - - The Data Mapper AccountDao requires the use - of the iBATIS Data Mapper framework. For this reason, the DAO framework - provides a SqlMapDaoSession handler for Data - Mapper-based DAOs. - - using System; - -using IBatisNet.DataMapper; // SqlMapper -using IBatisNet.DataAccess.DaoSessionHandlers; // SqlMapDaoSession -using IBatisNet.DataAccess.Exceptions; // DataAccessException - -using IBatisNet.Test.Dao.Interfaces; // IAccountDao -using IBatisNet.Test.Implementations; // BaseDao - -using IBatisNet.Test.Domain; // Account - - As with the ADO.NET implementation, the class will inherit from - our BaseDao class and implement our - IAccountDao interface. Since our queries - are handled by our work with the Data Mapper framework, we don't need to - define any SQL queries in this DAO. - - namespace IBatisNet.Test.Dao.Implementations.DataMapper { - public class AccountDao : BaseDao, IAccountDao { - - Here's how the Delete(Account account) - method is implemented in conjunction with the Data Mapper framework's - SqlMapper (see the iBATIS Data Mapper Guide for - details on using the SqlMapper): - - public void Delete(Account account) { - SqlMapDaoSession sqlMapDaoSession = null; - - try { - sqlMapDaoSession = (SqlMapDaoSession)this.GetContext(); - SqlMapper sqlMap = sqlMapDaoSession.SqlMap; - sqlMap.Delete("DeleteAccount", account); - } - catch(DataAccessException ex) { - throw new DataAccessException("Error executing AccountDao.Delete. Cause :" - + ex.Message,ex); - } - } - - In this example, the DAO obtains an instance of the Data Mapper - framework's SqlMapper through the - SqlMapDaoSession object. Next, the DAO passes in - the appropriate mapped statement name to the - SqlMapper to delete an - Account. If an exception is thrown, the DAO makes - sure it is a DataAccessException. Still - straightforward! - - - - Using the AccountDao with the DaoManager - - After configuring the framework's - DaoManager for either the ADO.NET or Data Mapper - AccountDao that we just created (see the - Configuration section), we can now look at how to use them. - - using System; - -using IBatisNet.DataAccess; - -using IBatisNet.Test.Dao.Interfaces; -using IBatisNet.Test.Domain; - -namespace Examples.Services { - - public class AccountService { - - protected static IDaoManager daoManager = null; - - static AccountService() { - daoManager = DaoManager.GetInstance(); - } - - public void someMethod () { - IAccountDao accountDao = (IAccountDao)daoManager[typeof(IAccountDao)]; - Account account = NewAccount(); // get an example Account for us to use - daoManager.OpenConnection(); - accountDao.Create(account); - account = accountDao.GetAccountById(1001); - accountDao.Delete(account); - daoManager.CloseConnection(); - } - } -} - - We get an instance of the AccountDao from - the DaoManager by requesting an instance of the - IAccountDao type. There is no indication - of whether the returned accountDao is the ADO.NET or - Data Mapper implementation. If we needed to for one reason or another, - we could easily change the configuration to switch between the DAO - implementations (use the DAO configuration file to switch database - platforms, run test DAOs, etc). After getting the - accountDao, we open a connection to the data source - and call the DAO method(s) that we need to execute. A consistent - interface for either ADO.NET or Data Mapper DAOs with no persistence - implementation details found in our code! - - - - NHibernate DAO with the NHibernate DAO Session Handler - - Using the DAO framework with the NHibernate object persistence - library is as easy as using the framework with raw ADO.NET or iBATIS - Data Maps. To demonstrate, we'll examine an NHibernate-based - UserDao class. - - Like the SqlMapDaoSession handler, the - NHibernateDaoSession handler is found in the - IBatisNet.DataAccess.Extensions.DaoSessionHandlers - namespace. - - using System; - -using NHibernate; - -using IBatisNet.DataAccess.Extensions.DaoSessionHandlers; // NHibernateDaoSession -using IBatisNet.DataAccess.Exceptions; // DataAccessException - -using IBatisNet.Test.Dao.Interfaces; // IUserDao -using IBatisNet.Test.Implementations; // BaseDao - -using IBatisNet.Test.Domain; // User - - Our example NHibernate UserDao class will - inherit from our BaseDao class and implement our - IUserDao interface. - - namespace IBatisNet.Test.Dao.Implementations.NHibernate { - public class UserDao : BaseDao, IUserDao - - Here's how two methods are implemented in conjunction with an - NHibernate Session: - - public void Create(User user) { - NHibernateDaoSession nHibernateDaoSession = null; - - try { - nHibernateDaoSession = (NHibernateDaoSession)this.GetContext(); - ISession session = nHibernateDaoSession.Session; - session.Save( user ); - } - catch(Exception ex) { - throw new DataAccessException("Error executing UserDao.Create. Cause :" - + ex.Message,ex); - } - } - - public User Load(string id) { - NHibernateDaoSession nHibernateDaoSession = null; - User user = null; - - try { - nHibernateDaoSession = (NHibernateDaoSession)this.GetContext(); - ISession session = nHibernateDaoSession.Session; - user = session.Load(typeof(User),id) as User; - } - catch(Exception ex) { - throw new DataAccessException("Error executing UserDao.Create. Cause :" - + ex.Message,ex); - } - - return user; - } - - The DAO obtains an NHibernate Session - through the NHibernateDaoSession object and - executes the appropriate Session methods. If an - exception is thrown, the DAO makes sure it is a - DataAccessException. - - - \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/introduction.xml b/docs/dataAccessGuide/src/en/introduction.xml deleted file mode 100644 index 1c2c934..0000000 --- a/docs/dataAccessGuide/src/en/introduction.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - Introduction - - - Overview - - When developing robust .NET connected applications, it is often a - good idea to isolate the specifics of your persistence implementation - behind a common API. Data Access Objects allow you to create simple - components that provide access to your data without revealing the - specifics of the implementation to the rest of your application. Using - DAOs, you can allow your application to be dynamically configured to use - different persistence mechanisms. If you have a complex application with a - number of different databases and persistence approaches involved, DAOs - can help you create a consistent API for the rest of your application to - use. - - - If you would like to get the latest development (unreleased) - version of this Guide, please see the iBATIS - Wiki FAQ. The FAQ entry explains how you can access our SVN - source repository and generate CHM and PDF files of the latest - development documentation for the DataAccess framework. - - - - - License Information - - iBATIS.NET is licensed according to the terms of the Apache License, - Version 2.0. The full text of this license are available online at http://www.apache.org/licenses/LICENSE-2.0 - (TXT - or HTML). You - can also view the full text of any of these licenses in the doc - subdirectory of the iBATIS.NET distribution. - - - - Support - - Mailing lists and bug trackers are available (courtesy of Apache - Software Foundation) at iBATIS’s Apache project page. Just direct your - browser to http://ibatis.apache.org/. - - - - Disclaimer - -

    - iBATIS MAKES NO WARRANTIES, EXPRESS OR IMPLIED, AS TO THE - INFORMATION IN THIS DOCUMENT. The names of actual companies and products - mentioned herein may be the trademarks of their respective - owners. -
    - - \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/programming.xml b/docs/dataAccessGuide/src/en/programming.xml deleted file mode 100644 index c63f11a..0000000 --- a/docs/dataAccessGuide/src/en/programming.xml +++ /dev/null @@ -1,379 +0,0 @@ - - - DAO Programming - - - Overview - - The iBATIS.NET Data Access Objects framework has a number of goals. - First, it attempts to hide the details of your persistence layer. This - includes hiding all interface, implementation, and exception details of - your persistence solution. For example: if your application is using raw - ADO, the DAO framework will hide classes like - DataReader, DataAdapter, - Connection, and Command. - Similarly, if your application is using the NHibernate object persistence - library, the DAO framework will hide classes like - Configuration, - SessionFactory, Session, and - HibernateException. All of these implementation - details will be hidden behind a consistent DAO interface layer. - Furthermore, the number of different data sources that are being used can - be hidden from the view of the application. - - The second goal of the framework is to simplify the persistence - programming model while keeping it more homogeneous at the same time. - Different persistence solutions have different programming semantics and - behavior. The DAO framework attempts to hide this as much as possible, - allowing the service and domain layer of your application to be written in - a uniform fashion. - - The DomDaoManagerBuilder class is responsible - for the proper configuration of the DAO framework (via - dao.config as described in previous sections). After - configuration, another class called the DaoManager - provides the core DAO API for each of your data access contexts. In - particular, the DaoManager provides methods that - allow you to access connection, transaction, and DAO instances. - - - In prior versions of the DAO framework, the - DaoManager handled configuration - responsibilities. This has been superceded by a new configuration API - found within the DomDaoManagerBuilder class. Old - configuration method signatures have remained the same, but new - configuration methods have been added for more flexibility. These new - methods support the loading of configuration information through a - Stream, Uri, - FileInfo, or XmlDocument - instance. - - - - - Configuration with the DomDaoManagerBuilder - - iBATIS offers you a plethora of options for loading your - dao.config file, such as loading it through a file - path, Stream, Uri, - FileInfo, or XmlDocument. - All of these methods are available through the - DomDaoManagerBuilder API for creating - DaoManager instances. - - The basic DomDaoManagerBuilder.Configure() - call will look for a file named dao.config in your - application's root directory. This directory's location differs by project - type but is normally the directory where you place your web.config or - app.config file. - - - Basic Configuration Call - - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -builder.Configure(); -IDaoManager daoManager = DaoManager.GetInstance("SqlMapDaoContext"); - - - If you have named your configuration file something other than - dao.config or if you have located your configuration - file in a directory other than the application root directory, you can - also pass in a relative or absolute file path to the - Configure method. - - - Configuration through an absolute or relative file path - - /* Configure from a file path. - Uses a relative resource path from your application root - or an absolute file path such as "file://c:\dir\a.config" */ -DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -builder.Configure(strPath); -IDaoManager daoManager = DaoManager.GetInstance("AnotherContext"); - - - - Since the application root directory location differs by project - type (Windows, Web, or library), you can use an AppSettings key for - defining a relative path to your dao.config file. - Having this key defined makes it easy to change the path without having - to recompile your code: - - builder.Configure( - ConfigurationSettings.AppSettings["rootPath"]+"dao.config"); - - - Aside from using a simple string filepath, you can also pass in a - FileInfo or Uri instance for - the DomDaoManagerBuilder to use in locating your - dao.config file. - - - Configuration with a FileInfo or Uri instance - - /* Configure with FileInfo. */ -FileInfo aFileInfo = someSupportClass.GetDynamicFileInfo(); -DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -builder.Configure(aFileInfo); -IDaoManager daoManager = DaoManager.GetInstance("NHibernateContext"); - -/* Configure through a Uri. */ -Uri aUri = someSupportClass.GetDynamicUri(); -DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -builder.Configure(aUri); -IDaoManager daoManager = DaoManager.GetInstance("SimpleDao"); - - - If you find that you already have loaded your DAO configuration - information as an XmlDocument or Stream - instance within your application, the - DomDaoManagerBuilder provides - Configure overloads for those types as - well. - - - Configuration with an XmlDocument or Stream - - /* Configure with an XmlDocument */ -XmlDocument anXmlDoc = someSupportClass.GetDynamicXmlDocument(); -DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -builder.Configure(anXmlDoc); -IDaoManager daoManager = DaoManager.GetInstance("Petstore"); - -/* Configure from a stream. */ -Stream aStream = someSupportClass.GetDynamicStream(); -DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -builder.Configure(aStream); -IDaoManager daoManager = DaoManager.GetInstance("AnotherPetstore"); - - - In addition to the straightforward - Configure methods, the - DomDaoManagerBuilder provides - ConfigureAndWatch methods that can be used to - monitor changes to the configuration files so that - DaoManagers can be reconfigured and reloaded on the - fly. To use this functionality, you application will need to pass a - ConfigureHandler (callback delegate) to the - DomDaoManagerBuilder so that it knows the method - for resetting your application's DaoManager - instances. - - Since the configuration files need to be watched for changes, your - dao.config file must be accessible through the file - system. This means that configuration is limited to the three methods - shown below. - - - DomDaoManagerBuilder ConfigureAndWatch methods - - /* Configure and monitor the configuration file for modifications - and automatically reconfigure DaoManagers. - This basic ConfigureAndWatch method looks for a file with the - default name of dao.config in the application root directory. */ -public void ConfigureAndWatch(ConfigureHandler configureDelegate) - -/* Configure and monitor the configuration file for modifications - and automatically reconfigure DaoManagers. - Uses a relative path from your application root - or an absolute file path such as "file:\\c:\dir\a.config" */ -public void ConfigureAndWatch( string resource, ConfigureHandler configureDelegate ) - -/* Configure and monitor the configuration file for modifications - and automatically reconfigure DaoManagers. - Uses a FileInfo instance for your config file. */ -public void ConfigureAndWatch( FileInfo resource, ConfigureHandler configureDelegate ) - - - - - Contexts, the DaoManager, and Session Handlers - - The DaoManager instance that is built from a - dao.config file is aware of all of the contexts - contained within the configuration file. The context basically bundles DAO - implementations together with a session handler. The - DaoManager knows which DAOs and session handler - belong to which context. When you request a DAO instance from the - DaoManager, the proper session handler will be - provided with it. Therefore, there is no need to access the context or - session handler directly. Your DAO knows how it works. - - - - Getting a Data Access Object - - Once you get a DaoManager instance, you can - use it to retrieve the DAO implementation by type (as specified in the - dao.config file in the daoFactory - section). Getting a DataAccess object is simply a matter of using the - GetDao(type) method of a - DaoManager instance (or the more concise indexer - method DaoManager[type]) For example: - - [C#] -IDaoManager daoManager = DaoManager.GetInstance("daoContextName"); -// gets the dao of type 'ICategoryDao' -ICategoryDao categoryDao = daoManager.GetDao(typeof(ICategoryDao)) as ICategoryDao; -// same thing, just using the indexer -IProductDao productDao = daoManager[typeof(IProductDao)] as IProductDao; - - - - Working with Connection and Transactions - - The DaoManager provides methods for working - with connection and transaction. These methods allow you to demarcate - connection/transactions and avoid having to pass transaction objects, like - IDbTransaction, around to all of your DAOs. - - - Example DAO transaction management - - [C#] -Product p1 = new Product(); -Product p2 = new Product(); -Category c 1= new Category() -c1.Add(p1); -c2.Add(p2); - -IDaoManager daoManager = DaoManager.GetInstance("PetStore"); -ICategoryDao categoryDao = daoManager[typeof(ICategoryDao)] as ICategoryDao; -IProductDao productDao = daoManager[typeof(IProductDao)] as IProductDao; - -try { - daoManager.BeginTransaction(); - productDao.Insert(p1); - productDao.Insert(p2); - categoryDao.Insert(c1); - daoManager.CommitTransaction(); -} -catch { - daoManager.RollBackTransaction(); -} - - - Calling BeginTransaction() lets the - DaoManager know that you are interested in managing - transactions programmatically. It is very important that you guarantee a - call to RollBackTransaction() if you’ve called - BeginTransaction(), which is why it is within the - catch block. The call to - RollBackTransaction() will rollback any changes - you’ve made in case an exception is thrown before the call to - CommitTransaction(). Be aware that if an - exception occurs before BeginTransaction() - completes and is caught in the catch block, - RollBackTransaction() will also throw another exception since a - transaction was not started. - - When you deal with a connection and transaction, you can also use - the using syntax as in the examples below. - - [C#] -IDaoManager daoManager = DaoManager.GetInstance("PetStore"); -IAccountDao accountDao = daoManager[typeof(IAccountDao)] as IAccountDao; - -using ( IDalSession session = daoManager.OpenConnection() ) -{ - Account account = NewAccount(); - accountDao.Create(account); -} - -using ( IDalSession session = daoManager.BeginTransaction() ) -{ - Account account = NewAccount(); - Account account2 = accountDao.GetAccountById(1); - account2.EmailAddress = "someotherAddress@somewhere.com"; - - accountDao.Create(account); - accountDao.Update(account2); - - session.Complete(); // Commit -} - - - - "AutoConnection"-Behavior - - In addition to programmatically demarcating a connection, you can - allow the DaoManager to automatically Open and - Close a connection for you. You don’t need to do anything special to use - the autoconnection behavior, just don’t call - OpenConnection(). - - - Example AutoConnection - - [C#] -// Open/close first Connection -Product product = productDao.GetProduct (5); -product.Description = "New description."; -// Open/close second Connection -productDao.UpdateProduct(product); -// Open/close third Connection -product = productDao.GetProduct (5); - - - - If the UpdateProduct() method contained - more than a single update, you would need to use the - BeginTransaction() method! - - - - - Distributed transactions - - Distributed transactions are transactions that can span multiple - resource managers, such as SQL Server and Oracle, and reconcile - transactions among them. - - iBATIS.NET introduces a new TransactionScope - class mimicking the new TransactionScope found in the - System.Transactions namespace (.NET Framework 2.0). - This class supports MSMQ, ADO.NET, SqlServer, and DTC transaction models. - This is a simple managed interface to COM+'s SWC (Services Without - Components) Transactions. It can be used only by developers using .NET 1.1 - and Windows XP SP2 or Windows Server 2003 since it implements distributed - transactional support using the ServiceDomain - class. - - Usage is simple, as seen in the following example where a code block - is made transactional à la Indigo (moving to Indigo will be easier since - it is the same API): - - [C#] -using IBatisNet.Common.Transaction; - -using (TransactionScope tx = new TransactionScope()) -{ - daoManager.OpenConnection(); - // Transaction will be automatically associated with it - account = accountDao.GetAccountById(1001); - account.FirstName = "Gilles"; - accountDao.Update(account); - daoManager.CloseConnection(); - - daoManager2.OpenConnection(); - // Transaction will be automatically associated with it - joeCool = userDao.Load("joe_cool"); - joeCool.LastLogon = stamp; - daoManager2.CloseConnection(); - - tx.Complete(); // Commit -} - - It is important to make sure that each instance of this class gets - Close()'d. The easiest way to ensure that each - instance is closed is with the using statement in C#. - When using calls Dispose on - the transaction scope at the end of the using code - block, the ambient transaction will be commited only - if the Complete() method has been called. - This class does not support a nested transaction scope with - different transaction options. - The next section provides some tips on how to write a DAO like - the AccountDao shown in the previous example. - - \ No newline at end of file diff --git a/docs/dataAccessGuide/src/en/xsd-template.xml b/docs/dataAccessGuide/src/en/xsd-template.xml deleted file mode 100644 index a617bc9..0000000 --- a/docs/dataAccessGuide/src/en/xsd-template.xml +++ /dev/null @@ -1,4 +0,0 @@ - - iBATIS.NET's <literal>DaoConfig.xsd</literal> - - diff --git a/docs/dataAccessGuide/styles/fopdf.xsl b/docs/dataAccessGuide/styles/fopdf.xsl deleted file mode 100644 index 3490575..0000000 --- a/docs/dataAccessGuide/styles/fopdf.xsl +++ /dev/null @@ -1,541 +0,0 @@ - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copyright 2003-2005 The Apache Software Foundation - - - Authors - - - - , - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataAccess Guide - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 0 - 1 - - 1 - - - - - - book toc - - - - 2 - - - - - - - - - - 0 - 0 - 0 - - - 5mm - 10mm - 10mm - - 15mm - 10mm - 0mm - - 18mm - 18mm - - - 0pc - - - - - left - false - - - 11 - 8 - - - 1.4 - - - - - - - 0.8em - - - - - - 15.5cm - - - - 4pt - 4pt - 4pt - 4pt - - - - 1.0pt - 1.0pt - - - - - 1 - - - - - - - - left - bold - - - pt - - - - - - - - - - - - - - - 0.8em - 0.8em - 0.8em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.6em - 0.6em - 0.6em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.4em - 0.4em - 0.4em - - - pt - - 0.1em - 0.1em - 0.1em - - - - - bold - - - pt - - false - 0.4em - 0.6em - 0.8em - - - - - - - - - pt - - wrap - - - - 1em - 1em - 1em - - - #444444 - solid - 0.1pt - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - - - - 1 - - #F0F0F0 - - - - - - 0 - 1 - - - 90 - - - - - '1' - &admon_gfx_path; - - - - - - figure after - example before - equation before - table before - procedure before - - - - 1 - - - - 0.8em - 0.8em - 0.8em - 0.1em - 0.1em - 0.1em - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/dataAccessGuide/styles/html.css b/docs/dataAccessGuide/styles/html.css deleted file mode 100644 index 2eac393..0000000 --- a/docs/dataAccessGuide/styles/html.css +++ /dev/null @@ -1,244 +0,0 @@ -body { - background: #FFFFFF; - font-family: sans-serif; - scrollbar-arrow-color: #000000; - scrollbar-base-color: #003300; - scrollbar-dark-shadow-color: #999900; - scrollbar-track-color: #808080; - scrollbar-face-color: #DEDEDE; - scrollbar-shadow-color: #DDDDDD; - scrollbar-highlight-color: #CCCCCC; - scrollbar-3d-light-color: #003300; -} - - -A:link{COLOR: #5E741C; TEXT-DECORATION: underline;} -A:visited{COLOR: #5E741C; TEXT-DECORATION: underline;} -A:hover{COLOR: #FF6600; TEXT-DECORATION: underline;} - -P, DL, DT, DD, BLOCKQUOTE { - color: #000000; - margin-bottom: 3px; - margin-top: 3px; - padding-top: 0px; - text-align: left; - /*border: 1px solid black;*/ -} - -OL, UL, P { - margin-top: 6px; - margin-bottom: 6px; -} - -P, BLOCKQUOTE { - font-size: 90%; -} - -P.releaseinfo { - font-size: 120%; font-weight: bold; - font-family: Arial, helvetica, sans-serif; - padding-top: 10px; -} - -P.pubdate { - font-size: 120%; font-weight: bold; - font-family: Arial, helvetica, sans-serif; -} - - - -TD, SPAN { - color: #000000; -} - -BLOCKQUOTE { - margin-right: 0px; -} - -H1, H2, H3, H4, H5, H6 { - margin-top:0px; - padding-top:14px; - font-family: Arial, helvetica, sans-serif; - margin-bottom: 0px; -} - -H2.title { - font-weight:800; - margin-bottom: 8px; -} - -H2.subtitle { - font-weight:800; - margin-bottom: 20px; -} - -H3.author { - color: #000000; - font-weight:500; - margin-top:0px; - padding-top:0px; - font-family: Arial, helvetica, sans-serif; - margin-bottom: 0px; -} - -TABLE { - border-collapse: collapse; - border: 1px thin #eeeeee; - empty-cells: hide; - border-style : groove; - border-spacing: 0px; -} - -TH { - background-color: #EBEBEC; -} - -td { -border : 2px; -border-color : #eeeeee; -border-style : groove; -border-spacing: 0px; -font-size: 80%; - padding: 4pt; -} - - -H1 { - font-size: 150%; -} -H2 { - font-size: 110%; -} -H3 { - font-size: 100%; font-weight: bold; -} -H4 { - font-size: 90%; font-weight: bold; -} -H5 { - font-size: 90%; font-style: italic; -} -H6 { - font-size: 100%; font-style: italic; -} - -TT { - font-size: 90%; - font-family: "Courier New", Courier, monospace; - color: #000000; -} - -.navheader, .navfooter { - background-color: #ffffff; -} -.navheader TABLE { - background-color: #D4D5D8; -} -.navheader th { - background-color: #D4D5D8; -} -.navheader td { - border : 0px; -} -.navfooter TABLE { - background-color: #D4D5D8; -} -.navfooter th { - background-color: #D4D5D8; -} -.navfooter td { - border : 0px; -} - -PRE { - font-size: 90%; - padding: 5px; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC; - background-color: #F4F4F4; -} - -UL, OL, LI { - list-style: disc; -} - -HR { - width: 100%; - height: 1px; - background-color: #CCCCCC; - border-width: 0px; - padding: 0px; - color: #CCCCCC; -} - -.variablelist { - padding-top: 10; - padding-bottom:10; - margin:0; -} - -/*(.itemizedlist, UL { - padding-top: 0; - padding-bottom:0; - margin:0; -}*/ - -.term { - font-weight:bold; -} - -.mediaobject { - padding-top: 30px; - padding-bottom: 30px; -} - -.legalnotice { - font-size: 70%; -} - - -.sidebar { - background-color: #E5ECF9; - padding: 0.25cm; -} - -.programlisting { - font-family: courier; - font-size: 11px; - font-weight: normal; - font-family: Lucida Console, monospace; - background-color: #EEEEEE; - padding: 0.25cm; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC - } - -.comment { - color: #008000; -} - -.blue { - color: #0000FF; -} - -.cache { - color: #FF9900; -} - -.alias { - color: #FF0000; -} - -.parameterMap { - color: #800080; -} - -.resultmap { - color: #3366FF; -} - -.statement { - color: #339966; -} diff --git a/docs/dataAccessGuide/styles/html.xsl b/docs/dataAccessGuide/styles/html.xsl deleted file mode 100644 index 70a08b8..0000000 --- a/docs/dataAccessGuide/styles/html.xsl +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - 1 - 0 - 1 - 0 - - - 1 - - - - - - book toc - - - - 5 - - - - - - 1 - - - - - - - - - images/ - - - 90 - - - - - - figure after - example before - equation before - table before - procedure before - - - - - - - - - - \ No newline at end of file diff --git a/docs/dataMapperGuide/resources/DataMapper.ppt b/docs/dataMapperGuide/resources/DataMapper.ppt deleted file mode 100644 index c378bb54b7c607c47d9b4ccce03f26051bd12111..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 64000 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 pck}yw7CNGNiSPF{$2ww9AK)m^jMmu!aI9qaGxz - - The Big Picture - - - Introduction - - iBATIS is a simple but complete framework that makes it easy for you - to map your objects to your SQL statements or stored procedures. The goal - of the iBATIS framework is to obtain 80% of data access functionality - using only 20% of the code. - - - - What does it do? - - Developers often create maps between objects within an application. - One definition of a Mapper is an "object that sets up communication - between two independent objects." A Data Mapper is a "layer of mappers - that moves data between objects and a database while keeping them - independent of each other and the mapper itself. " [Patterns of Enterprise - Architecture, ISBN 0-321-12742-0]. - - You provide the database and the objects; iBATIS provides the - mapping layer that goes between the two. - - - - - - How does it work? - - - - Your programming platform already provides a capable library for - accessing databases, whether through SQL statements or stored procedures. - But developers find several things are still hard to do well when using - "stock" ADO.NET, including: - Separating SQL code from programming code - - Passing input parameters to the library classes and - extracting the output - - Separating data access classes from business logic - classes - - Caching often-used data until it changes - - Managing transactions and threading - - - - - iBATIS DataMapper solves these problems -- and many more -- by using - XML documents to create a mapping between a plain-old object and a SQL - statement or a stored procedure. The "plain-old object" can be a - IDictionary or property object. - The object does not need to be part of a special object - hierarchy or implement a special interface. (Which is why we call them - "plain-old" objects.) Whatever you are already using should work just - fine. - - - - - -
    - iBATIS DataMapper workflow - - - - - - -
    -
    - - Here's a high level description of the workflow diagrammed by Figure 2.1: - - - - Provide a parameter, either as an object or a native type. The - parameter can be used to set runtime values in your SQL statement or - stored procedure. If a runtime value is not needed, the parameter can - be omitted. - - - - Execute the mapping by passing the parameter and the name you - gave the statement or procedure in your XML descriptor. This step is - where the magic happens. The framework will prepare the SQL statement - or stored procedure, set any runtime values using your parameter, - execute the procedure or statement, and return the result. - - - - In the case of an update, the number of rows affected is - returned. In the case of a query, a single object, or a collection of - objects is returned. Like the parameter, the result object, or - collection of objects, can be a plain-old object or a native - type. - - - - - - So, what does all this look like in your source code? Here's how you - might code the insert of a "lineItem" object into your - database:C# -Mapper.Instance().Insert("InsertLineItem",lineItem);If your - database is generating the primary keys, the generated key can be returned - from the same method call, like this: - - - - C# -int myKey = Mapper.Instance().Insert("InsertLineItem",lineItem); - - - - Example 2.1 shows an XML descriptor for "InsertLineItem". - - - - - - The "InsertLineItem" descriptor - - <insert id="InsertLineItem" parameterClass="LineItem"> - INSERT INTO [LinesItem] - (Order_Id, LineItem_LineNum, Item_Id, LineItem_Quantity, LineItem_UnitPrice) - VALUES - (#Order.Id#, #LineNumber#, #Item.Id#, #Quantity#, #Item.ListPrice#) - <selectKey type="post" resultClass="int" property="Id" > - select @@IDENTITY as value - </selectKey> -</insert> - - - - - - The <selectKey> stanza returns an autogenerated key from a SQL - Server database (for example). - - - - If you need to select multiple rows, iBATIS can return a list of - objects, each mapped to a row in the result set: - - - - - C# -IList productList = Mapper.Instance().QueryForList("selectProduct",categoryKey); - - - - - Or just one, if that's all you need:C# -Product product = Mapper.Instance().QueryForObject("SelectProduct",productKey) as Product; - - - - Of course, there's more, but this is iBATIS from 10,000 meters. (For - a longer, gentler introduction, see the Tutorial.) Section 3 describes the - Data Map definition files -- where the statement for "InsertLineItem" - would be defined. The Developers Guide for your platform (Section 4) - describes the "bootstrap" configuration file that exposes iBATIS to your - application. - - -
    - - - Is iBATIS the best choice for my project? - - iBATIS is a Data Mapping tool. Its role is to map the columns of a - database query (including a stored procedure) to the properties of an - object. If your application is based on business objects (including Maps - or IDictionary objects), then iBATIS can be a good choice. iBATIS is an - even better choice when your application is layered, so that that the - business layer is distinct from the user-interface layer. - - Under these circumstances, another good choice would be an - Object/Relational Mapping tool (OR/M tool), like NHibernate. Other - products in this category are Apache ObjectRelationalBridge and - Gentle.NET. An OR/M tool generates all or most of the SQL for you, either - beforehand or at runtime. These products are called OR/M tools because - they try to map an object graph to a relational schema. - - iBATIS is not an OR/M tool. iBATIS helps you map objects to stored - procedures or SQL statements. The underlying schema is irrelevant. An OR/M - tool is great if you can map your objects to tables. But they are not so - great if your objects are stored as a relational view rather than as a - table. If you can write a statement or procedure that exposes the columns - for your object, regardless of how they are stored, iBATIS can do the - rest. - - So, how do you decide whether to OR/M or to DataMap? As always, the - best advice is to implement a representative part of your project using - either approach, and then decide. But, in general, OR/M is a good thing - when you - - - - Have complete control over your database implementation - - - - Do not have a Database Administrator or SQL guru on the - team - - - - Need to model the problem domain outside the database as an - object graph. - - - - Likewise, the best time to use a Data Mapper, like iBATIS, is - when: - - - - You do not have complete control over the - database implementation, or want to continue to access a legacy - database as it is being refactored. - - - - You have database administrators or SQL gurus on the - team. - - - - The database is being used to model the problem domain, and the - application's primary role is to help the client use the database - model. - - - - In the end, you have to decide what's best for - your project. If a OR/M tool works better for you, - that's great! If your next project has different needs, then we hope you - give iBATIS another look. If iBATIS works for you now: Excellent! Join the - iBATIS user mailing list if you have any questions. - -
    \ No newline at end of file diff --git a/docs/dataMapperGuide/src/en/dotnet.xml b/docs/dataMapperGuide/src/en/dotnet.xml deleted file mode 100644 index 3eca25c..0000000 --- a/docs/dataMapperGuide/src/en/dotnet.xml +++ /dev/null @@ -1,2631 +0,0 @@ - - - .NET Developer Guide - - - Introduction - - This section explains how to install, configure, and use the MyBATIS - DataMapper with your .NET application. It is assumed that you are using - Microsoft Visual Studio .NET (VSN). If you are using another IDE, please - modify these instructions accordingly. - - - - Installing the DataMapper for .NET - - There are four steps to using MyBATIS DataMapper with your - application for the first time. - - Setup the distribution - - - - Add assembly references - - - - Visual Studio.NET Integration - - - - Add XML documents - - - - - Setup the Distribution - - The official site for MyBATIS DataMapper for .NET is our parent - site <http://www.mybatis.org/>. - The DataMapper is availabe in 2 types of distributions: a binary - distribution that includes the required DataMapper assemblies and a - source distribution that includes a VSN solution. To download either of - the distributions, follow the link to the Downloads area on our web - site, and select the either the binary or source distribution for the - MyBATIS .NET DataMapper release (if you download the binary distribution, - extract the files using a utility like WinZip or the extractor built - into newer versions of Windows and skip ahead to the Add Assembly - References section). - - The DataMapper source distribution includes a VSN solution and a - number of C# projects. The distribution is in the form of a ZIP archive. - You can extract the distribution using a utility like WinZip or the - extractor built into newer versions of Windows. We suggest that you - create an MyBATISnet folder in your VSN project - directory and extract the distribution there. - - Under the distribution's source folder are - eight folders that make up the MyBATIS.NET distribution, as shown in - Table 4.1. - Folders found in the MyBATIS.NET source distribution - - - - - Folder name - - Description - - - - - - External-Bin - - Dependency assemblies provided for your - convenience. - - - - MyBATISNet.Common - - Assembly of classes shared by DataAccess and - DataMapper - - - - MyBATISNet.Common.Logging.Log4Net - - Log4Net factory adapter classes - - - - MyBATISNet.Common.Test - - Test project for MyBATISNet.Common that can be used with - NUnit - - - - MyBATISNet.DataAccess - - The Data Access Objects framework (see separate DAO - Guide) - - - - MyBATISNet.DataAccess.Extensions - - Contains a C# project for extensions to the DataAccess - framework such as NHibernate support - - - - MyBATISNet.DataAccess.Test - - Test project for the DataAccess framework that can be - used with NUnit - - - - MyBATISNet.DataMapper - - The DataMapper framework - - - - MyBATISNet.DataMapper.Test - - Test project for the DataMapper that can be used with - NUnit - - - -
    - - You can load the MyBATISNet.sln solution file - into VSN and build the solution to generate the needed assemblies. There - are seven projects in the solution, and all should succeed. The - assemblies we need will be created under - \source\MyBATISNet.DataMapper\bin\Debug. The created - assemblies are : - - MyBATISNet.Common.dll - - - - MyBATISNet.DataMapper.dll - - The DataMapper has external dependencies on : - - - - - Castle.DynamicProxy.dll - - (creating proxies) - - This dependencies can be found in the External-Bin - folder and/or in the bin\Debug folder after building the - solution. - - - If you will not be using the DataAccess framework and NHibernate - and you have a problem building the solution due to the dependency on - NHibernate, simply remove the MyBATISNet.DataAccess.Extensions and - MyBATISNet.DataAccess.Test projects from the solution before - building. - -
    - - - Add Assembly References - - Switching to your own solution, open the project that will be - using the MyBATIS .NET DataMapper. Depending on how you organize your - solutions, this may or may not be the project for your Windows or Web - application. It may be a library project that your application project - references. You will need to add one or two references to your project: - - - MyBATISNet.DataMapper.dll - - - - MyBATISNet.DataAccess.dll (optional) - - - - MyBATISNet.Common.dll (implied) - - - - Castle.DynamicProxy.dll (implied) - - - - If you are using the Mapper singleton (see - section 4.4.1), then the only reference you will need is to the - DataMapper assembly. The Common and Castle.DynamicProxy assemblies are - needed at runtime, but Visual Studio.NET will resolve the dependencies - for you. If you are using the Data Access Objects framework, then you - will need a reference to the DataAccess assembly too. So, start with the - first, and add the others only if needed. - - If you have built the MyBATISNet solution as described in Section - 4.2.1, the three assemblies (MyBATISNet.DataMapper.dll, - MyBATISNet.Common.dll, and Castle.DynamicProxy.dll) that you will need - should be in the bin/Debug folder of the - MyBATISNet.DataMapper project. - - - - Add XML File Items - - After adding the assembly references, you will need to add three - types of XML files to your Windows, Web application, or library project - (and Test project if you have one). These files are: - - - - providers.config - A file used by the DataMapper to look up the definition of your selected database provider. - - - - SqlMap.xml - A Data Map file that contains your SQL queries. Your project will contain one or more of these files with names such as Account.xml or Product.xml. - - - - SqlMap.config - The DataMapper configuration file that is used to specify the locations of your SqlMap.xml files and providers.config file. It is also used to define other DataMapper configuration options such as caching. You will need to include one SqlMap.config file for each data source that your project has. - - - - As expected, the SqlMap.config and - providers.config files must be placed where the - DataMapper can find them at runtime. Depending on the type of project - you have, the default expected location of these 2 files will be - different, as shown in Table 4.2. However, your project is not limited - to using just these locations. The DataMapper provides other options for - placing these files in locations that are more suitable for your project - instead of using the default locations. These options are covered later - in this guide. - Default locations for the sqlMap.config and providers.config - files - - - - - Windows, Library, or Test projects (using NUnit or - equivalent) - - This would be the binary folder (such as /bin/debug) - with the assembly (.dll) files and the - App.config file - - - - Web projects - - In the application root, where the - Web.config file is located. - - - -
    -
    - - - Visual Studio.NET Integration - - Each configuration file (SqlMap.config, mappping file, - providers.config) is associated to a schema. The benefits of associating - an XML document with a schema are to validate the document (which is - done at runtime) and to use editing features such as - IntelliSense/content completion assistance. - - To allow association of the schemas in VS.NET XML editor to yours - configuration files, you should add the schema files - (SqlMap.xsd, SqlMapConfig.xsd, - providers.xsd) to either your VS.NET project or in - your VS.NET installation directory. The VS.NET directory will be - either - - C:\Program Files\Microsoft Visual Studio 8\Xml\Schemas for VS.NET 2005 - - or - - C:\Program Files\Microsoft Visual Studio .NET - 2003\Common7\Packages\schemas\xml for VS.NET 2003 - - or - - C:\Program Files\Microsoft Visual Studio - .NET\Common7\Packages\schemas\xml for VS.NET 2002 - - depending on your version of VS.NET. It is typically easier to - place the file in the well known location under the VS.NET installation - directory than to copy the XSD file for each project you create. - - Once you have registered the schema with VS.NET you will be enough - to get IntelliSense and validation of the configuration file from within - VS.NET. - -
    - IntelliSense example - - - - - - -
    -
    -
    - - - Configuring the DataMapper for .NET - - The MyBATIS DataMapper is configured using a central XML descriptor - file, usually named SqlMap.config, which provides the - details for your data source, data maps, and other features like caching, - transactions, and thread management. At runtime, your application code - will call a class method provided by the MyBATIS library to read and parse - your SqlMap.config file. After parsing the - configuration file, a DataMapper client will be returned by MyBATIS for - your application to use. - - - DataMapper clients - - Currently, the DataMapper framework revolves around the - SqlMapper class, which acts as a facade to the - DataMapper framework API. You can create a DataMapper client by - instantiating an object of the SqlMapper class. - An instance of the SqlMapper class (your - DataMapper client) is created by reading a single configuration file. - Each configuration file can specify one database or data source. - However, you can use multiple DataMapper clients in your application. - Just create another configuration file and pass the name of that file - when the DataMapper client is created. The configuration files might use - a different account with the same database, or reference different - databases on different servers. You can read from one client and write - to another, if that's what you need to do. See Section 4.4.1 for more - details on building a SqlMapper instance, but - first, let's take a look at the DataMapper configuration file. - - - - DataMapper Configuration File (SqlMap.config) - - A sample configuration file for a .NET web application is shown in - Example 4.1. Not all configuration elements are required. The following - sections describe the elements of this SqlMap.config file in more - detail. - - - Sample SqlMap.Config for a .NET Web Application (placed in - same directory as web.config) - - <?xml version="1.0" encoding="utf-8"?> -<sqlMapConfig xmlns="http://MyBATIS.apache.org/dataMapper" -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > - - <!-- Optional --> - <properties resource="properties.config"/> - - <settings> - <setting useStatementNamespaces="false"/> - <setting cacheModelsEnabled="true"/> - <setting validateSqlMap="false"/> - </settings> - - <!-- Not required if providers.config is located in default location --> - <providers embedded="resources.providers.config, MyBATISNet.Test"/> - - <database> - <provider name="sqlServer1.1"/> - <dataSource name="NPetshop" - connectionString="user id=${username}; - password=${password}; - data source=${datasource}; - database=${database};"/> - </database> - - <alias> - <typeAlias alias="Account" type="MyBATISNet.Test.Domain.Account, MyBATISNet.Test"/> - <typeAlias alias="YesNoBool" - type="MyBATISNet.Test.Domain.YesNoBoolTypeHandlerCallback, MyBATISNet.Test"/> - </alias> - - <typeHandlers> - <typeHandler type="bool" dbType="Varchar" callback="YesNoBool"/> - </typeHandlers> - - <sqlMaps> - <sqlMap resource="${root}Maps/Account.xml"/> - <sqlMap resource="${root}Maps/Category.xml"/> - <sqlMap resource="${root}Maps/Product.xml"/> - </sqlMaps> -</sqlMapConfig> - - - - - DataMapper Configuration Elements - - - The <properties> Element - - Sometimes the values we use in an XML configuration file occur - in more than one element. Often, there are values that change when we - move the application from one server to another. To help you manage - configuration values, you can specify a standard properties file (with - name=value entries) as part of a DataMapper configuration. Each named - value in the properties file becomes a shell - variable that can be used in the DataMapper configuration file and - your Data Map definition files (see Section 3). For example, if the - "properties" file contains - - - <?xml version="1.0" encoding="utf-8" ?> -<settings> - <add key="username" value="albert" /> -</settings> - - - then all elements in the DataMapper configuration can use the - variable ${username} to insert the value - "albert". For example: - - <dataSource connectionString="user id=${username};" - - Properties are handy during building, testing, and deployment by - making it easy to reconfigure your application for multiple - environments or use automated tools for configuration such as - NAnt. - - - <properties> attributes - - The <properties> element can accept one of the following - attributes to specify the location of the properties file. - - - Attributes of the <properties> element - - - - - Attribute - - Description - - - - - - resource - - Specify the properties file to be loaded from the - root directory of the applicationresource="properties.config" - - - - url - - Specify the properties file to be loaded through an - absolute path.url="c:\Web\MyApp\Resources\properties.config" --or- -url="file://c:\Web\MyApp\Resources\properties.config" - - - - embedded - - Specify the properties file to be loaded as an - embedded resource in an assembly. Syntax for the embedded - attribute is '[extendednamespace.]filename, the - name of the assembly which contains the embedded - resource'embedded="Resources.properties.config, MyApp.Data" - - - -
    -
    - - - <property> element and attributes - - You can also specify more than one properties file or add - property keys and values directly into your - SqlMap.config file by using <property> - elements. For example: - - - <properties> - <property resource="myProperties.config"/> - <property resource="anotherProperties.config"/> - <property key="host" value="MyBATIS.com" /> -</properties> - - - - Attributes of the <property> element - - - - - Attribute - - Description - - - - - - resource - - Specify the properties file to be loaded from the - root directory of the applicationresource="properties.config" - - - - url - - Specify the properties file to be loaded through an - absolute path.url="c:\Web\MyApp\Resources\properties.config" --or- -url="file://c:\Web\MyApp\Resources\properties.config" - - - - embedded - - Specify the properties file to be loaded as an - embedded resource in an assembly. Syntax for the embedded - attribute is '[extendednamespace.]filename, the - name of the assembly which contains the embedded - resource'embedded="Resources.properties.config, MyApp.Data" - - - - key - - Defines a property key (variable) - namekey="username" - - - - value - - Defines a value that will be used by the DataMapper - in place of the the specified property - key/variablevalue="mydbuser" - - - -
    -
    -
    - - - The <providers> Element - - Under ADO.NET, a database system is accessed through a provider. - A database system can use a custom provider or a generic ODBC - provider. The MyBATIS .NET DataMapper uses a pluggable approach to - using providers. Each provider is represented by an XML descriptor - element found in a file called providers.config. - The MyBATIS .NET DataMapper distribution includes a standard - providers.config file with a set of thirteen - prewritten provider elements: - - - - sqlServer1.0 - Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.0 - - - - sqlServer1.1 -Microsoft SQL Server 7.0/2000 provider available with .NET Framework 1.1 - - - - OleDb1.1 - OleDb provider available with .NET Framework 1.1 - - - - Odbc1.1 - Odbc provider available with .NET Framework 1.1 - - - - sqlServer2.0 -Microsoft SQL Server 7.0/2000/2005 provider available with .NET Framework 2.0 - - - - OleDb2.0 - OleDb provider available with .NET Framework 2.0 - - - - Odbc2.0 - Odbc provider available with .NET Framework 2.0 - - - - oracle9.2 - Oracle provider V9.2.0.401 - - - - oracle10.1 - Oracle provider V10.1.0.301 - - - - oracleClient1.0 - MS Oracle provider V1.0.5 available with .NET Framework 1.1 - - - - ByteFx - ByteFx MySQL provider V0.7.6.15073 - - - - MySql - MySQL provider V1.0.4.20163 - - - - SQLite3 - SQLite.NET provider V0.21.1869.3794 - - - - Firebird1.7 - Firebird SQL .NET provider V1.7.0.33200 - - - - PostgreSql0.7 - Npgsql provider V0.7.0.0 - - - - iDb2.10 - IBM DB2 iSeries provider V10.0.0.0 - - - - - If you use SQL Server 2005, you can configure the provider to allow Multiple Active Result Set (allowMARS="true") and add MultipleActiveResultSets=true in your connection string. - - - The providers.config file can be found - under \source\MyBATISNet.DataMapper.Test\bin\Debug - in the MyBATIS .NET source distribution or in the root folder of the - .NET DataMapper binary distribution. - - A provider may require libraries that you do not have - installed,. Therefore, the provider element has an "enabled" attribute - that allows you to disable unused providers. One provider can also be - marked as the "default" and will be used if another is not specified - by your configuration. - - The standard providers.config file has - sqlServer1.1 set as the default and the sqlServer1.0 provider - disabled. Aside from sqlServer1.1, OleDb1.1, and Odbc1.1, all other - providers are disabled by default. Remember to set the "enabled" - attribute to "true" for the provider that you will be using. - - - ByteFx is the recommended provider if you are using MySQL. You - may download ByteFx from the MySQLNet SourceForge site - (http://sf.net/projects/mysqlnet/). If the ByteFx license is - acceptable to you, you may install it as a reference within your - application and enable the ByteFx provider. - - - - Be sure to review the providers.config - file and confirm that the provider you intend to use is enabled by - setting the "enabled" attribute to "true". - - - - Expected default locations of the providers.config - file - - - - - Windows, Library, or Test projects (using NUnit or - equivalent) - - With the assembly (.dll) files with the - app.config file - - - - Web projects - - In the project base directory, with the - web.config file - - - -
    - - To use the file, you can copy it into your project at the - expected default location, give a path to the file relative to the - project root directory, specify a url (absolute path) to its location, - or make it an embedded resource of your project. If you copy the file - into the expected default location, the <providers> element is - not required in your sqlMap.config file. - - - <providers> attributes - - The <providers> element can accept one of the following - attributes to specify the location of the providers.config - file. - - - Attributes of the <providers> element - - - - - Attribute - - Description - - - - - - resource - - Specify the file to be loaded from a relative path - from the project root directory. Since the root directory is - different depending on the project type, it is best to use a - properties variable to indicate the relative path. Having - that variable defined in a properties file makes it easy to - change the path to all your Data Mapper configuration - resources in one location.resource="${root}providers.config" - - - - url - - Specify the providers.config to be loaded through an - absolute path.url="c:\Web\MyApp\Resources\providers.config" --or- -url="file://c:\Web\MyApp\Resources\providers.config" - - - - embedded - - Specify the providers.config file to be loaded as an - embedded resource in an assembly. Syntax for the embedded - attribute is '[extendednamespace.]filename, the - name of the assembly which contains the embedded - resource'embedded="Resources.providers.config, MyApp.Data" - - - -
    -
    -
    - - - The <settings> Element - - There are three default settings used by the framework.. The - settings appropriate for one application may not be appropriate for - another. The <settings> element lets you configure these options - and optimizations for the DataMapper instance that is created from the - XML document. Each <settings> attribute has a default, and you - can omit the <settings> element or any of its attributes. The - <settings> attributes and the behavior they control are - described in the following table. - - - Attributes of the <settings> element - - - - - Attribute - - Description - - - - - - cacheModelsEnabled - - This setting globally enables or disables all - cache models for an DataMapper client. This can come in handy - for debugging.Example: cacheModelsEnabled=”true” -Default: true (enabled) - - - - useStatementNamespaces - - - With this setting enabled, you must always refer - to mapped statements by their fully qualified name, which is - the combination of the sqlMap namesource and the statement id. - For example: - queryForObject(“Namespace.statement.Id”);Example: useStatementNamespaces=”false” -Default: false (disabled) - - - - validateSqlMap - - This setting globally enables or disables the - validation of mapping files against the SqlMapConfig.xsd - schema. This can come in handy for - debugging.Example: validateSqlMap=”false” -Default: false (disabled) - - - - useReflectionOptimizer - - This setting globally enables or disables the - usage of reflection to access property/filed value of C# object. The reflection optimizer use will emit types for retrieving, populating, instantiating parameter and result objects. -Example: useReflectionOptimizer=”true” -Default: true (enabled) - - - -
    -
    - - - The <typeAlias> Element - - The <typeAlias> element lets you specify a shorter name in - lieu of a fully-qualified classname. For example: <typeAlias alias="LineItem" type="NPetshop.Domain.Billing.LineItem, NPetshop.Domain" /> - - You can then refer to LineItem where you - would normally have to spell-out the fully qualified class name. - In the .NET implementation, zero or more <typeAlias> - elements can appear in the Data Map definition file, within an - enclosing <alias> element. - - - - <typeAlias> attributes - - The <typeAlias> element has two attributes: - Attributes of the <typeAlias> element - - - - - Attribute - - Description - - - - - - alias - - A unique identifier for this - elementalias="Category" - - - - type - - The fully-qualified classname, including namespace - referencetype= -"MyBATISNet.Test.Domain.Category, -MyBATISNet.Test" - - - -
    - - - - - type Attribute - - When specifying a type attribute for the configuration, the type attribute value must be a fully qualified type name in the following format: - - type="[namespace.class], [assembly name], - Version=[version], Culture=[culture], - PublicKeyToken=[public token]" - - For example: - - type="MyProject.Domain.LineItem, MyProject.Domain, - Version=1.2.3300.0, Culture=neutral, - PublicKeyToken=b03f455f11d50a3a" - - The strongly typed name is desired, although it is also legitimate to use the shorter style assembly type name: - - type="MyProject.Domain.LineItem, MyProject.Domain" - - - -
    - - - Predefined type aliases - - The framework predefines some aliases that you can use in your - DataMapper configuration and data map files, as shown in Table - 4.9. - Predefined Aliases - - - - - CLR Type - - Alias - - - - - - System.ArrayList - - list - - - - System.Boolean - - Boolean, bool - - - - System.Byte - - Byte, byte - - - - System.Char - - Char, char - - - - System.DateTime - - dateTime, date - - - - System.Decimal - - Decimal, decimal - - - - System.Double - - Double, double - - - - System.Guid - - guid - - - - System.Hashtable - - map, hashmap, hashtable - - - - System.Int16 - - Int16, short, Short - - - - System.Int32 - - Int32, int, Int, integer, Integer - - - - System.Int64 - - Int64, long, Long - - - - System.SByte - - SByte, sbyte - - - - System.Single - - Float, float, Single, single - - - - System.String - - String, string - - - - System.TimeSpan - - N/A - - - - System.UInt16 - - Short, short - - - - System.UInt32 - - Uint, uint - - - - System.UInt64 - - Ulong, ulong - - - -
    -
    -
    - - - The <typeHandler> Element - - The <typeHandler> element allows for the configuration and - use of a Custom Type Handler (see the Custom Type Handler section). - This extends the DataMapper's capabilities in handling types that are - specific to your database provider, are not handled by your database - provider, or just happen to be a part of your application - design. <typeHandler type="guid" dbType="Varchar2" callback="GuidVarchar"/> - The DataMapper for .NET allows for zero or more - <typeAlias> elements to appear in the Data Map definition - file, within an enclosing <alias> element. - - - - <typeHandler> attributes - - The <typeHandler> element has three attributes: - Attributes of the <typeAlias> element - - - - - Attribute - - Description - - - - - - type - - Refers to the name of the type to - handletype="guid" - - - - dbType - - Indicates the provider dbType to - handledbType="Varchar2"Note: - Omit this attribute if you want the type handler to - replace the default MyBATIS type handler. - - - - callback - - The alias of the custom type handler class - namecallback="GuidVarchar" - - - -
    -
    -
    - - - The <database> Element - - The <database> element encloses elements that configure - the database system for use by the framework. These database - configuration elements are the <provider> and <datasource> - elements. - - - The <provider> Element - - If the default provider is being used, the <provider> - element is optional. Or, if several providers are available, one may - be selected using the provider element without modifying the - providers.config file. <provider name="OleDb1.1" /> - - - - The <datasource> element - - The <datasource> element specifies the ADO.NET - connection string. Example 4.2, shows sample elements for SQL - Server, Oracle, Access, MySql, and PostgreSQL. - Sample <datasource> and <provider> elements - (.NET) - - <!-- The ${properties} are defined in an external file, --> -<!-- but the values could also be coded inline. --> - -<!-- Connecting to SQL Server --> -<database> - <provider name="sqlServer1.1" /> - <dataSource name="NPetstore" default="true" - connectionString="data source=(local)\NetSDK;database=${database}; - user id=${username};password=${password};"/> -</database> - -<!-- Connecting to Oracle --> -<database> - <provider name="oracleClient1.0"/> - <dataSource name="MyBATISNet" - connectionString="Data Source=${datasource};User Id=${userid};Password=${password}"/> -</database> - -<!-- Connecting to Access --> -<database> - <provider name="OleDb1.1" /> - <dataSource name="NPetstore" default="true" - connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=${database}"/> -</database> - -<!-- Connecting to a MySQL database --> -<database> - <provider name="ByteFx" /> - <dataSource name="NPetstore" default="true" - connectionString="Host=${host};Database=${database}; - Password=${password};Username=${username}" /> -</database> - -<!-- Connecting to a PostgreSQL database --> -<database> - <provider name="PostgreSql0.7" /> - <dataSource name="NPetstore" default="true" - connectionString="Server=${server};Port=5432;User Id=${userid};Password=${password}; - Database=${database};" /> -</database> - - - - - - The <sqlMap> Element - - On a daily basis, most of your work will be with the Data Maps, - which are covered by Section 3. The Data Maps define the actual SQL - statements or stored procedures used by your application. The - parameter and result objects are also defined as part of the Data Map. - As your application grows, you may have several varieties of Data Map. - To help you keep your Data Maps organized, you can create any number - of Data Map definition files and incorporate them by reference in the - DataMapper configuration. All of the definition files used by a - DataMapper instance must be listed in the configuration file. - - Example 4.3 shows <sqlMap> elements for loading a set of - Data Map definitions. Note that the <sqlMap> elements are nested - in a <sqlMaps> element. For more about Data Map definition - files, see Section 3. - Specifying sqlMap locations - - <!-- Relative path from the project root directory using a property variable --> -<sqlMaps> - <sqlMap resource="${root}Maps/Account.xml"/> - <sqlMap resource="${root}Maps/Category.xml"/> - <sqlMap resource="${root}Maps/Product.xml"/> -</sqlMaps> - -<!-- Embedded resources using [extendednamespace.]filename, assemblyname --> -<sqlMaps> - <sqlMap embedded="Maps.Account.xml, MyApp.Data"/> - <sqlMap embedded="Maps.Category.xml, MyApp.Data"/> - <sqlMap embedded="Maps.Product.xml, MyApp.Data"/> -</sqlMaps> - -<!-- Full URL with a property variable --> -<sqlMaps> - <sqlMap url="C:/${projectdir}/MyApp/Maps/Account.xml"/> - <sqlMap url="C:/${projectdir}/MyApp/Maps/Category.xml"/> - <sqlMap url="C:/${projectdir}/MyApp/Maps/Product.xml"/> -</sqlMaps> - - - - Since the application root directory location differs by - project type (Windows, Web, or library), it is best to use a - properties variable to indicate the relative path when using the - <sqlMap> "resource" attribute. Having a variable defined in a - properties file makes it easy to change the path to all your Data - Mapper configuration resources in one location (note the - ${projectdir} and ${root} variables in the example above). - - -
    -
    - - - Programming with MyBATIS DataMapper: The .NET API - - The MyBATIS.NET DataMapper API provides four core functions: - - - build a SqlMapper instance from a - configuration file - - - - execute an update query (including insert and delete). - - - - execute a select query for a single object - - - - execute a select query for a list of objects - - - - The API also provides support for retrieving paginated lists and - managing transactions. - - - Building a SqlMapper Instance - - - In prior versions of the DataMapper, the - SqlMapper class was responsible for - configuration. This has been superceded by a new configuration API - found within the DomSqlMapBuilder class. Old - configuration method signatures have remained the same, but there are - new methods that have been added for more flexibility. These methods - support the loading of configuration information through a - Stream, Uri, - FileInfo, or XmlDocument - instance. - - - An XML document is a wonderful tool for describing a database - configuration (Section 4.3) or defining a set of data mappings (Section - 3), but you can't execute XML. In order to use the - MyBATIS.NET configuration and definitions in your .NET application, you - need a class you can call. - - The framework provides service methods that you can call which - read the configuration file (and any of its definition files) and builds - a SqlMapper object. The - SqlMapper object provides access to the rest of - the framework. The SqlMapper is designed to be - multi-threaded and long-lived, and so makes for a good singleton. - Example 76 shows a singleton Mapper that is bundled with the - framework. - - - A Mapper singleton you can call from your own - applications - - [C#] -using MyBATISNet.Common.Utilities; -using MyBATISNet.DataMapper; -using MyBATISNet.DataMapper.Configuration; - -namespace MyBATISNet.DataMapper -{ - public class Mapper - { - private static volatile ISqlMapper _mapper = null; - - protected static void Configure (object obj) - { - _mapper = null; - } - - protected static void InitMapper() - { - ConfigureHandler handler = new ConfigureHandler(Configure); - DomSqlMapBuilder builder = new DomSqlMapBuilder(); - _mapper = builder.ConfigureAndWatch(handler); - } - - public static ISqlMapper Instance() - { - if (_mapper == null) - { - lock (typeof (SqlMapper)) - { - if (_mapper == null) // double-check - { - InitMapper(); - } - } - } - return _mapper; - } - - public static ISqlMapper Get() - { - return Instance(); - } - } -} - - - To obtain the ISqlMapper instance, just - call - - [C#] -ISqlMapper mapper = Mapper.Instance(); - - anywhere in your application, and specify one of the - SqlMapper methods (see Section 5.3.2) . Here's an - example: - - [C#] -IList list = Mapper.Instance().QueryForList("PermitNoForYearList", values); - - The first time Mapper.Instance() is - called, the DomSqlMapBuilder object will look for - the SqlMap.config file in the default location for - the type of project it is being used in and build a SqlMapper instance - from that configuration. On subsequent calls, the cached - mapper instance will be reused. The - DomSqlMapBuilder.ConfigureAndWatch() method - monitors changes to the configuration files. If the configuration or - definitions files change, the SqlMapper will be - safely reloaded. This is particularly useful in development, when you - might make a change to a data map definition and want to see it take - effect without restarting a debugging session. Likewise, in production, - it can allow you to make changes to the definitions without reloading - the rest of the application. - - - If you are using NUnit to test your mappings, you can run a test - suite, make changes to the XML mapping document, and run the test - again. NUnit will reload the configuration automatically. - - - - The ConfigureAndWatch method requires that your SqlMap.config - file and data map files are accessible through the application's file - system to be able to track file changes. - - - If for some reason you do not want to monitor changes to the - configuration, you can create your own Mapper - class, and use the Configure method - instead: - - [C#] -ISqlMapper mapper = builder.Configure(); - - - Multiple Databases - - If you need access to more than one database from the same - application, create a DataMapper configuration file for that database - and another Mapper class to go with it. In the - new Mapper class, change the call to - ConfigureAndWatch to - - [C#] -ISqlMapper mapper = builder.ConfigureAndWatch("anotherSqlMapConfig.config", handler); - - and substitute the name of your configuration file. Each - database then has their own singleton you can call from your - application: - - [C#] -ISqlMapper sqlServer = SqlServerMapper.Get(); -ISqlMapper access = AccessMapper.Get(); - - - - DomSqlMapBuilder Configuration Options - - MyBATIS offers you a plethora of other options for loading your - SqlMap.config file such as loading it through a - Stream, Uri, - FileInfo, or XmlDocument - instance. All of these methods are available through the - DomSqlMapBuilder API for creating a - SqlMapper instance. - - As seen in the prior section, the basic - DomSqlMapBuilder.Configure() call will look - for a file named SqlMap.config in your - application's root directory. This directory's location differs by - project type but is normally the directory where you place your - web.config or app.config file. - - - Basic SqlMapper Configuration Call - - ISqlMapper mapper = builder.Configure(); - - - If you have named your configuration file something other than - SqlMap.config or if you have located your configuration file in a - directory other than the application root directory, you can also pass - in a relative or absolute file path to the - Configure method. - - - SqlMapper Configuration through an absolute or relative file - path - - /* Configure a SqlMapper from a file path. - Uses a relative resource path from your application root - or an absolute file path such as "file:\\c:\dir\a.config" */ -ISqlMapper mapper = builder.Configure(strPath); - - - - Since the application root directory location differs by - project type (Windows, Web, or library), you can use an AppSettings - key for defining a relative path to your SqlMap.config file. Having - this key defined makes it easy to change the path without having to - recompile your code: - - mapper = builder.Configure( - ConfigurationSettings.AppSettings["rootPath"]+"SqlMap.config"); - - - Aside from using a simple string filepath, you can also pass in - a FileInfo or Uri - instance for the DomSqlMapBuilder to use in - locating your SqlMap.config file. - - - SqlMapper Configuration with a FileInfo or Uri - instance - - /* Configure a SqlMapper with FileInfo. */ -FileInfo aFileInfo = someSupportClass.GetDynamicFileInfo(); -ISqlMapper mapper = builder.Configure(aFileInfo); - -/* Configure a SqlMapper through a Uri. */ -Uri aUri = someSupportClass.GetDynamicUri(); -ISqlMapper anotherMapper = builder.Configure(aUri); - - - If you find that you already have loaded your DataMapper - configuration information as an XmlDocument or - Stream instance within your application, the - DomSqlMapBuilder provides - Configure overloads for those types as - well. - - - SqlMapper Configuration with an XmlDocument or Stream - - /* Configure a SqlMapper with an XmlDocument */ -XmlDocument anXmlDoc = someSupportClass.GetDynamicXmlDocument(); -ISqlMapper mapper = builder.Configure(anXmlDoc); - -/* Configure a SqlMapper from a stream. */ -Stream aStream = someSupportClass.GetDynamicStream(); -ISqlMapper anotherMapper = builder.Configure(aStream); - - - The DomSqlMapBuilder API provides - ConfigureAndWatch methods that can be used to - monitor changes to the configuration files. This is particularly - useful when using a singleton such as the - Mapper class shown in the prior section. The - example Mapper singleton allows a reconfigured - SqlMapper instance to be reloaded on the - fly. - - - Mapper ConfigureHandler delegate - - ... - protected static void Configure (object obj) - { - _mapper = null; - } - - protected static void InitMapper() - { - ConfigureHandler handler = new ConfigureHandler(Configure); - DomSqlMapBuilder builder = new DomSqlMapBuilder(); - _mapper = builder.ConfigureAndWatch(handler); - } -... - - - If you use a custom singleton, you will need to pass a - ConfigureHandler (callback delegate) to the - DomSqlMapBuilder so that it knows the method - for resetting your application's SqlMapper - instance. In the Mapper's case, its - Configure method is used as the callback - delegate. - - Since the configuration files need to be watched for changes, - your SqlMap.config file must be accessible through the file system. - This means that configuration is limited to the three methods shown - below. - - - DomSqlMapBuilder ConfigureAndWatch methods - - /* Configure and monitor the configuration file for modifications - and automatically reconfigure the SqlMapper. - This basic ConfigureAndWatch method looks for a file with the - default name of SqlMap.config in the application root directory. */ -public ISqlMapper ConfigureAndWatch(ConfigureHandler configureDelegate) - -/* Configure and monitor the configuration file for modifications - and automatically reconfigure the SqlMapper. - Uses a relative path from your application root - or an absolute file path such as "file:\\c:\dir\a.config" */ -public ISqlMapper ConfigureAndWatch( string resource, ConfigureHandler configureDelegate ) - -/* Configure and monitor the configuration file for modifications - and automatically reconfigure the SqlMapper. - Uses a FileInfo instance for your config file. */ -public ISqlMapper ConfigureAndWatch( FileInfo resource, ConfigureHandler configureDelegate ) - - - - - DomSqlMapBuilder : Advanced settings - Before launching the 'Configure' method to build the ISqlMapper instance, you can set those porperties. - - - - Advanced settings - - - - - Propertie - - Description - - - - - - Properties - - Allow to set properties before configuration. Those properties will be added to the properties list defined in the properties.config. -NameValueCollection properties = new NameValueCollection(); -properties.Add("connectionString", "..."); -builder.Properties = properties; - -ISqlMapper mapper = builder.Configure("sqlMap.config"); - - - - GetAccessorFactory - - Allows to set a custom get accessor factory before configuration, see IGetAccessorFactory interface which defines the contract for the factory responsible to build set accessor for a member object in MyBATIS. - - - - SetAccessorFactory - - Allows to set a custom set accessor factory before configuration, see ISetAccessorFactory interface which defines the contract for the factory responsible to build get accessor for a member object in MyBATIS. - - - - ObjectFactory - Allows to set a custom object factory before configuration, see IObjectFactory interface which defines the contract for the factory responsible for object creation in MyBATIS. - - - - SqlMapper - Allows to set a custom SqlMapper before configuration, see ISqlMapper interface. - - - - ValidateSqlMapConfig - Enable whether or not the validation of configuration document before configuration - - - -
    -
    - -
    -
    - - - Exploring the DataMapper API through the SqlMapper - - The ISqlMapper instance acts as a facade to - provide access the rest of the DataMapper framework. The DataMapper API - methods are shown in Example 4.11. - - - The DataMapper API for .NET - - [C#] - -/* Query API */ -public object Insert(string statementName, object parameterObject); -public int Update(string statementName, object parameterObject); -public int Delete(string statementName, object parameterObject); - -public object QueryForObject(string statementName, object parameterObject); -public T QueryForObject<T>(string statementName, object parameterObject); -public object QueryForObject(string statementName, object parameterObject, object resultObject); -public T QueryForObject<T>(string statementName, object parameterObject, T resultObject); - -public IList QueryForList(string statementName, object parameterObject); -public IList<T> QueryForList<T>(string statementName, object parameterObject); -public void QueryForList(string statementName, object parameterObject, IList resultObject); -public void QueryForList<T>(string statementName, object parameterObject, IList<T> resultObject); -public IList QueryForList(string statementName, object parameterObject, - int skipResults, int maxResults); -public IList<T> QueryForList<T>(string statementName, object parameterObject, - int skipResults, int maxResults); - -public IList QueryWithRowDelegate(string statementName, object parameterObject, - RowDelegate rowDelegate); -public IList<T> QueryWithRowDelegate<T>(string statementName, object parameterObject, - SqlMapper.RowDelegate<T> rowDelegate); - -[Obsolete] -public PaginatedList QueryForPaginatedList(String statementName, object parameterObject, - int pageSize); - -public IDictionary QueryForDictionary(string statementName, object parameterObject, - string keyProperty) -IDictionary<K, V> QueryForDictionary<K, V>(string statementName, object parameterObject, - string keyProperty); -public IDictionary QueryForDictionary(string statementName, object parameterObject, - string keyProperty, string valueProperty) -public IDictionary<K, V> QueryForDictionary<K, V>(string statementName, object parameterObject, - string keyProperty, string valueProperty); -public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty) -public IDictionary QueryForMap(string statementName, object parameterObject, - string keyProperty, string valueProperty) - -/* Connection API */ -public void OpenConnection() -public void CloseConnection() - -/* Transaction API */ -public void BeginTransaction() -public void BeginTransaction(bool openConnection) -public void BeginTransaction(IsolationLevel isolationLevel) -public void BeginTransaction(bool openConnection, IsolationLevel isolationLevel) - -public void CommitTransaction() -public void CommitTransaction(bool closeConnection) - -public void RollBackTransaction() -public void RollBackTransaction(bool closeConnection) - - - Note that each of the API methods accept the name of the Mapped - Statement as the first parameter. The statementName - parameter corresponds to the id of the Mapped - Statement in the Data Map definition (see Section 3.3). In each case, - a parameterObject also may be passed. If the - Mapped Statement expects no parameters, a null - parameterObject may be passed. If a statement - does expect parameters, then a valid - parameterObject is required. The following - sections describe how the API methods work. - - - The DatatMapper component store his working ISqlMapSession on different session store. - On Web environnement, the session is stored Http.Request.Items. - On windows environnement on the current thread. - You can configure the session storage by specifing the property ISessionStore on ISqlMapper. - This will allow to set a custom session store like the HybridWebThreadSessionStore - This is used for scenarios where most of the you need per request session, but you also does some work outside a - request (in a thread pool thread, for instance). - - Set it after the configuration and before use of the ISqlMapper. - - Custom ISessionStore - - -sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); -... -sqlMapper.QueryOject(...) - - - - - - Insert, Update, Delete - - public object Insert(string statementName, - object parameterObject); -public int Update(string statementName, - object parameterObject); -public int Delete(string statementName, - object parameterObject); - - If a Mapped Statement uses one of the <insert>, - <update>, or <delete> statement-types, then it should use - the corresponding API method. The <insert> element supports a - nested <selectKey> element for generating primary keys (see - Section 3.3.3). If the <selectKey> stanza is used, then - Insert returns the generated key; otherwise a - null object is returned. Both the Update and - Delete methods return the number of rows - affected by the statement. - - - - QueryForObject - - public object QueryForObject(string statementName, - object parameterObject); -public object QueryForObject(string statementName, - object parameterObject, - object resultObject); - -public T QueryForObject<T>(string statementName, object parameterObject); -public T QueryForObject<T>(string statementName, object parameterObject, T resultObject); - - - If a Mapped Statement is expected to select a single row, then - call it using QueryForObject. Since the - Mapped Statement definition specifies the result class expected, the - framework can both create and populate the result class for you. - Alternatively, if you need to manage the result object yourself, say - because it is being populated by more than one statement, you can use - the alternate form and pass your resultObject - as the third parameter. - - - - QueryForList - - public IList QueryForList(string statementName, - object parameterObject); -public void QueryForList(string statementName, - object parameterObject, - IList resultObject); -public IList QueryForList(string statementName, - object parameterObject, - int skipResults, - int maxResults); - -public IList<T> QueryForList<T>(string statementName, object parameterObject); -public void QueryForList<T>(string statementName, - object parameterObject, - IList<T> resultObject); -public IList<T> QueryForList<T>(string statementName, - object parameterObject, - int skipResults, int maxResults); - - - If a Mapped Statement is expected to select multiple rows, then - call it using QueryForList . Each entry in - the list will be an result object populated from the corresponding row - of the query result. If you need to manage the resultObject yourself, - then it can be passed as the third parameter. - - If you need to obtain a partial result, the third form takes the - number of records to skip (the starting point) and the maximum number - to return, as the skipResults and - maxResults parameters. The - PaginatedList method provides the same - functionality but in a more convenient wrapper. - - - The - QueryWithRowDelegate method also works with - multiple rows, but provides a post-processing feature. - - - - - QueryWithRowDelegate - - public delegate void RowDelegate(object obj, - IList list); - -public IList QueryWithRowDelegate(string statementName, - object parameterObject, - RowDelegate rowDelegate); - -public IList<T> QueryWithRowDelegate<T>(string statementName, object parameterObject, - SqlMapper.RowDelegate<T> rowDelegate); - - - No matter how well our database is designed or how cleverly we - describe our maps, the result objects we get back may not be ideal. - You may need to perform some post-processing task on the result - objects. You might even want to omit an entry omitted from the list. - Or, you might want to use the result object to create some other, more - useful object. To save filtering the result objects from to one list - to another, you can pass a RowDelegate to the - method to do the dirty work. The SqlMapper will - go through each of the result objects and give the delegate a chance - to modify the object and determine if the object should be added to - the IList that will be returned. - - It is your responsibility to add the objects you want - returned to the list. If an object is not added, it is not - returned. - - - - - QueryForMapWithRowDelegate - - public delegate void DictionaryRowDelegate(object key, - object value, - object parameterObject, - IDictionary dictionary); - -public IDictionary QueryForMapWithRowDelegate(string statementName, - object parameterObject, - string keyProperty, - string valueProperty, - DictionaryRowDelegate rowDelegate); - - No matter how well our database is designed or how cleverly we - describe our maps, the result objects we get back may not be ideal. - You may need to perform some post-processing task on the result - objects. You might even want to omit an entry omitted from the - dictionary. Or, you might want to use the result object to create some - other, more useful object. To save filtering the result objects from - to one dictionary to another, you can pass a - DictionaryRowDelegate to the method to do the - dirty work. The SqlMapper will go through each - of the result objects and give the delegate a chance to modify the - object and determine if the object should be added to the - IDictionary that will be returned. - - It is your responsibility to add the objects you want - returned to the dictionary. If an object is not added, it is not - returned. - - - - - QueryForPaginatedList - - - The method PaginatedList has been made as obsolete and will not be supported in future version. - - - public PaginatedList QueryForPaginatedList(string statementName, - object parameterObject, - int pageSize); - - We live in an age of information overflow. A database query - often returns more hits than users want to see at once, and our - requirements may say that we need to offer a long list of results a - "page" at a time. If the query returns 1000 hits, we might need to - present the hits to the user in sets of fifty, and let them move back - and forth between the sets. Since this is such a common requirement, - the framework provides a convenience method. - - The PaginatedList interface includes - methods for navigating through pages - (nextPage(), - previousPage(), gotoPage()) and - also checking the status of the page - (isFirstPage(), - isMiddlePage(), - isLastPage(), - isNextPageAvailable(), - isPreviousPageAvailable(), - getPageIndex(), - getPageSize()). Although the total number of - records available is not accessible from the - PaginatedList interface, this should be easily - accomplished by simply executing a second statement that counts the - expected results. Too much overhead would be associated with the - PaginatedList otherwise. - The PaginatedList method is - convenient, but note that a larger set will first be returned by - the database provider and the smaller set extracted by the - framework. The higher the page, the larger set that will be - returned and thrown away. For very large sets, you may want to use - a stored procedure or your own query that uses - skipResults and - maxResults as parameters. Unfortunately, - the semantics for the returning partial data sets is not - standardized, so PaginatedList is the best - we can do within the scope of a framework. - - - - - QueryForDictionary, QueryForMap - - public IDictionary QueryForDictionary(string statementName, - object parameterObject, - string keyProperty) -public IDictionary<K, V> QueryForDictionary<K, V>(string statementName, - object parameterObject, - string keyProperty); -public IDictionary QueryForDictionary(string statementName, - object parameterObject, - string keyProperty, - string valueProperty) -public IDictionary<K, V> QueryForDictionary<K, V>(string statementName, - object parameterObject, - string keyProperty, - string valueProperty); - -public IDictionary QueryForMap(string statementName, - object parameterObject, - string keyProperty) -public IDictionary QueryForMap(string statementName, - object parameterObject, - string keyProperty, - string valueProperty) - - The QueryForList methods return the - result objects within a IList instance. - Alternatively, the QueryForDictionary returns - a IDictionary instance. The value of - each entry is one of the result objects. The key to each entry is - indicated by the keyProperty parameter. This is - the name of the one of the properties of the result object, the value - of which is used as the key for each entry. For example, If you needed - a set of Employee objects, you might want them - returned as a IDictionary keyed by each - object's EmployeeNumber property. - - If you don't need the entire result object in your - Dictionary, you can add the - valueProperty parameter to indicate which - result object property should be the value of an entry. For example, - you might just want the EmployeeName keyed by - EmployeeNumber. - You do not need to use this method just to obtain an - IDictionary result object. As - explained in Section 3.5, the result object for any query can be a - property object or a IDictionary - instance. This method is used to generate a - new - IDictionary result object from a - property object or (another) - IDictionary object. In this case, - the key is a property you specify, and the value is the row from - the result set. - - - The QueryforMap methods provide the - same functionality but under a different name, for the sake of - consistency with the Java implementation. (The .NET - IDictionary interface is equivalent to - the Java Map interface.) - - - - - Session - - In the MyBATIS DataMapper framework, a session is a container for - an ADO connection and transaction. - The DataMapper's IDalSession implements the - IDisposable interface. So you can use it with the - using syntax. - - - using instruction - - [C#] -using ( IDalSession session = sqlMap.OpenConnection() ) -{ - Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; -} - - - - Sessions cannot be nested. An exception will be thrown if you - call - BeginTransaction/OpenConnection - from the same thread more than once or call - CommitTransaction or - RollbackTransaction first. In other words, - each thread can have at most one session open, - per SqlMapper instance. - - - - - Connection - - The DataMapper API includes methods to demarcate connection - boundaries. // Open a session : Open an ADO connection -public void OpenConnection() -// Close a session : Close the associated ADO connection -public void CloseConnection() - - - Connection example - - [C#] -sqlMap.OpenConnection() -Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; -sqlMap.CloseConnection() - -// Same thing with using instruction -using ( IDalSession session = sqlMap.OpenConnection() ) -{ - Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; -} - - - - - Automatic Session - - By default, calling any of the API methods (see Section 4.4.2) on - a SqlMapper instance will auto-open/close a - connection. This means that each call to these methods will be a single - unit of work. For many cases, this simple approach may be sufficient. - But it is not ideal if you have a number of statements that must execute - as a single unit of work, which is to say, succeed or fail as a group. - For cases like these, you can use explicit - transactions. - - An example of using automatic session is shown as Example - 4.14. - - - Using automatic session - - [C#] -Item item = (Item) sqlMap.executeQueryForObject ("GetItem", itemId); -item.Description = "test"; -// No session demarcated, so open/close connection will be automatic (implied) -sqlMap.Update("UpdateItem", item); -item.Description = newDescription; -item.Description = "test2"; -// No transaction demarcated, so open/close connection will be automatic (implied) -sqlMap.Update("UpdateItem", item); - - - - Be careful to consider sessions when framing your queries. - Automatic sessions are convenient, but you will run into trouble if - your unit of work requires more than a single update to the database. - In Example 4.14, if the second call to - "UpdateItem" fails, the item description will - still be updated with the first new description of - “TX1”. Not what a user might expect. - - - - - Transaction - - The DataMapper API includes methods to demarcate transactional - boundaries. A transaction can be started, committed and/or rolled back. - You can call the transaction methods from the - SqlMapper instance. -// Begin a transactional session : Open a connection and begin an ADO transaction -public void BeginTransaction() -// Begin a transactional session : Open a connection is specified and begin an ADO transaction -public void BeginTransaction(bool openConnection) -// Begin a transactional session : Open a connection and begin an ADO transaction -// with the specified IsolationLevel -public void BeginTransaction(IsolationLevel isolationLevel) -// Begin a transactional session : Open a connection is specified and begin an ADO transaction -// with the specified IsolationLevel -public void BeginTransaction(bool openConnection, IsolationLevel isolationLevel) - - -// Commit a session : Commit the ADO transaction and close the connection -public void CommitTransaction() -// Commit a session : Commit the ADO transaction and close the connection if specified -public void CommitTransaction(bool closeConnection) -// RollBack a session : RollBack the ADO transaction and close the connection -public void RollBackTransaction() -// RollBack a session : RollBack the ADO transaction and close the connection if specified -public void RollBackTransaction(bool closeConnection) - - An example of using transactions is shown as Example 4.15. - - - Using transactions - - [C#] -try - { - sqlMap.BeginTransaction(); - Item item = (Item) sqlMap.QueryForObject("getItem", itemId); - item.Description = newDescription; - sqlMap.Update("updateItem", item); - sqlMap.CommitTransaction(); - } -catch { - sqlMap.RollBackTransaction(); -} - -// With "using" syntax -using ( IDalSession session = sqlMap.BeginTransaction() ) -{ - Item item = (Item) sqlMap.QueryForObject("getItem", itemId); - item.Description = newDescription; - sqlMap.Update("updateItem", item); - - session.Complete(); // Commit -} - - - - - - - - Distributed Transactions - - Distributed transactions are transactions that can span multiple - resource managers, such as SQL Server and Oracle, and reconcile - transactions among them. - - MyBATIS.NET introduces a new - TransactionScope class mimicking the new - TransactionScope found in the - System.Transactions namespace (.NET Framework - 2.0). This class supports MSMQ, ADO.NET, SqlServer, and DTC transaction - models. This is a simple managed interface to COM+'s SWC (Services - Without Components) Transactions. It can be used only by developers - using .NET 1.1 and Windows XP SP2 or Windows Server 2003 since it - implements distributed transactional support using the - ServiceDomain class. - - Usage is simple, as seen in the following example where a code - block is made transactional à la Indigo (moving to Indigo will be easier - since it is the same API): - - - Using distributed transactions - - [C#] -using MyBATISNet.Common.Transaction; - -using (TransactionScope tx = new TransactionScope()) -{ - sqlMapSqlServer.OpenConnection(); - // Transaction will be automatically associated - account = sqlMapSqlServer.QueryForObject("GetAccount", accountId) as Account; - account.FirstName = "Gilles"; - sqlMapSqlServer.Update(account); - sqlMapSqlServer.CloseConnection(); - - sqlMapOracle.OpenConnection(); - // Transaction will be automatically associated - product = sqlMapOracle.QueryForObject("GetProduct", productId) as Product; - product.Quantity = 1000; - sqlMapOracle.Update(product); - sqlMapOracle.CloseConnection(); - - tx.Complete(); // Commit -} - - It is important to make sure that each instance of this class - gets Close()'d. The easiest way to ensure - that each instance is closed is with the using - statement in C#. When Dispose is called on - the transaction scope at the end of the using code - block, the ambient transaction will be commited - only if the Complete() method has been - called. - - - - This TransactionScope class does not - support a nested transaction scope with different transaction - options. - - - - - Coding Examples [TODO: Expand in to a Cookbook of practical - examples] - - - Executing Update (insert, update, delete) - - [C#] -Product product = new Product(); -product.Id = 1; -product.Description = “Shih Tzu”; -int key = sqlMap.Insert (“insertProduct”, product); - - Executing Query for Object (select) - - [C#] -int key = 1; -Product product = sqlMap.QueryForObject (“getProduct”, key) as Product; - - Executing Query for Object (select) With Preallocated Result - Object - - [C#] -Customer customer = new Customer(); -sqlMap.BeginTransaction(); -sqlMap.QueryForObject(“getCust”, parameterObject, customer); -sqlMap.QueryForObject(“getAddr”, parameterObject, customer); -sqlMap.CommitTransaction(); - - Executing Query for List (select) - - [C#] -IList list = sqlMap.QueryForList (“getProductList”, null); - - Auto-Open/Close - - [C#] -// When OpenConnection is not called, the statements will auto-Open/Close. -int key = sqlMap.Insert (“insertProduct”, product); - - Executing Query for List (select) With Result - Boundaries - - [C#] -List list = sqlMap.queryForList (“getProductList”, null, 0, 40); - - Executing Query with a RowHandler (select) - - [C#] -public void RowHandler(object obj, IList list) -{ - Product product = (Product) object; - product.Quantity = 10000; -} - -SqlMapper.RowDelegate handler = new SqlMapper.RowDelegate(this.RowHandler); -IList list = sqlMap.QueryWithRowDelegate("getProductList", null, handler); - - - Executing Query for Paginated List (select) - - [C#] -PaginatedList list = sqlMap.QueryForPaginatedList (“getProductList”, null, 10); -list.NextPage(); -list.PreviousPage(); - - Executing Query for Map - - [C#] -IDictionary map = sqlMap.QueryForMap (“getProductList”, null, “productCode”); -Product p = (Product) map[“EST-93”]; - - -
    - - - Logging SqlMap Activity - - The MyBATIS DataMapper framework records its interaction with the - database through an internal logging mechanism patterned after Apache - Log4Net. The internal logging mechanism can use one of the three built-in - loggers (NoOpLogger, ConsoleOutLogger, TraceLogger) or external logging - packages such as Apache Log4Net. In order for MyBATIS to generate log - messages, the application's config file (App.Config or Web.Config) must - contain an appropriate configSection node: - - - MyBATIS Configuration Section Handler for logging - - <configSections> - <sectionGroup name="MyBATIS"> - <section name="logging" type="MyBATISNet.Common.Logging.ConfigurationSectionHandler, MyBATISNet.Common" /> - </sectionGroup> -</configSections> - - - The application's config file must declare one logger - implementation. See the examples below on how to configure one of the - three built-in loggers. - - <MyBATIS> - <logging> - <logFactoryAdapter type="MyBATISNet.Common.Logging.Impl.ConsoleOutLoggerFA, MyBATISNet.Common"> - <arg key="showLogName" value="true" /> - <arg key="showDataTime" value="true" /> - <arg key="level" value="ALL" /> - <arg key="dateTimeFormat" value="yyyy/MM/dd HH:mm:ss:SSS" /> - </logFactoryAdapter> - </logging> -</MyBATIS> -<MyBATIS> - <logging> - <logFactoryAdapter type="MyBATISNet.Common.Logging.Impl.NoOpLoggerFA, MyBATISNet.Common" /> - </logging> -</MyBATIS> -<MyBATIS> - <logging> - <logFactoryAdapter type="MyBATISNet.Common.Logging.Impl.TraceLoggerFA, MyBATISNet.Common" /> - </logging> -</MyBATIS> - - To configure MyBATIS to use another logger implementation, simple - specify the appropriate logFactoryAdapter type. To use Apache Log4Net with - the MyBATIS DataMapper framework, use the following configuration - setting: - - <MyBATIS> - <logging> - <logFactoryAdapter type="MyBATISNet.Common.Logging.Impl.Log4NetLoggerFA, MyBATISNet.Common.Logging.Log4Net"> - <arg key="configType" value="inline" /> - </logFactoryAdapter> - </logging> -</MyBATIS> - - <MyBATIS> - <logging> - <logFactoryAdapter type="MyBATISNet.Common.Logging.Impl.Log4NetLoggerFA, MyBATISNet.Common.Logging.Log4Net"> - <arg key="configType" value="file" /> - <arg key="configFile" value="log4Net.config" /> - </logFactoryAdapter> - </logging> -</MyBATIS> - - The Log4NetLoggerFA supports the following values for the - configTypes argument: - Valid configType values - - - - - configType - - Description - - - - - - inline - - log4net node will use the log4net node in the - App.Config/Web.Config file when it is configured - - - - file - - (also requires configFile argument) - log4net will use an - external file for its configuration - - - - file-watch - - (also requires configFile argument) - log4net will use - an external file for its configuration and will re-configure - itself if this file changes - - - - external - - MyBATIS will not attempt to configure log4net. - - - -
    - - - Sample Logging Configurations - - The simplest logging configuration is to output log messages to - Console.Out: - - <configuration> - <configSections> - <sectionGroup name="MyBATIS"> - <section name="logging" type="MyBATISNet.Common.Logging.ConfigurationSectionHandler, MyBATISNet.Common" /> - </sectionGroup> - </configSections> - <MyBATIS> - <logging> - <logFactoryAdapter type="MyBATISNet.Common.Logging.Impl.ConsoleLoggerFA, MyBATISNet.Common.Logging" /> - </logging> - </MyBATIS> -</configuration> - - A common logging configuration is to use Apache Log4Net. To use - Log4Net with your own application, you need to provide your own Log4Net - configuration. You can do this by adding a configuration file for your - assembly that includes a <log4Net> element. The configuration file - is named after your assembly but adds a .config - extension, and is stored in the same folder as your assembly. This is an - example of a basic Log4Net configuration block - (MyBATISNet.DataMapper.Test.dll.Config) that also creates a log4net.txt - which contains debug information from log4net. If log4net is not - producing output, check the log4net.txt file. - - <configuration> - <configSections> - <sectionGroup name="MyBATIS"> - <section name="logging" type="MyBATISNet.Common.Logging.ConfigurationSectionHandler, MyBATISNet.Common" /> - </sectionGroup> - <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> - </configSections> - <appSettings> - <add key="log4net.Internal.Debug" value="true"/> - </appSettings> - <system.diagnostics> - <trace autoflush="true"> - <listeners> - <add name="textWriterTraceListener" - type="System.Diagnostics.TextWriterTraceListener" - initializeData="C:\\inetpub\\wwwroot\\log4net.txt" /> - </listeners> - </trace> - </system.diagnostics> - <MyBATIS> - <logging> - <logFactoryAdapter type="MyBATISNet.Common.Logging.Impl.Log4NetLoggerFA, MyBATISNet.Common.Logging.Log4Net"> - <arg key="configType" value="inline" /> - </logFactoryAdapter> - </logging> - </MyBATIS> - <log4net> - <appender name="FileAppender" type="log4net.Appender.FileAppender"> - <file value="log.txt" /> - <appendToFile value="true" /> - <layout type="log4net.Layout.SimpleLayout" /> - </appender> - <root> - <level value="ALL" /> - <appender-ref ref="FileAppender" /> - </root> - </log4net> -</configuration> - - - A complete Log4Net configuration block - (MyBATISNet.DataMapper.Test.dll.Config) - - <configuration> - <!-- Register a section handler for the log4net section --> - <configSections> - <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" /> - </configSections> - <appSettings> - <!-- To enable internal log4net logging specify the following appSettings key --> - <!-- <add key="log4net.Internal.Debug" value="true"/> --> - </appSettings> - - <!-- This section contains the log4net configuration settings --> - <log4net> - <!-- Define some output appenders --> - <appender name="RollingLogFileAppender" type="log4net.Appender.RollingFileAppender"> - <param name="File" value="log.txt" /> - <param name="AppendToFile" value="true" /> - <param name="MaxSizeRollBackups" value="2" /> - <param name="MaximumFileSize" value="100KB" /> - <param name="RollingStyle" value="Size" /> - <param name="StaticLogFileName" value="true" /> - <layout type="log4net.Layout.PatternLayout"> - <param name="Header" value="[Header]\r\n" /> - <param name="Footer" value="[Footer]\r\n" /> - <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] - %m%n" /> - </layout> - </appender> - <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender"> - <layout type="log4net.Layout.PatternLayout"> - <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] &lt;%X{auth}&gt; - %m%n" /> - </layout> - </appender> - - <!-- OFF, FATAL, ERROR, WARN, INFO, DEBUG, ALL --> - <!-- Set root logger level to ERROR and its appenders --> - <root> - <level value="ERROR" /> - <appender-ref ref="RollingLogFileAppender" /> - <appender-ref ref="ConsoleAppender" /> - </root> - - <!-- Print only messages of level DEBUG or above in the packages --> - <logger name="MyBATISNet.DataMapper.Commands.DefaultPreparedCommand"> - <level value="DEBUG" /> - </logger> - <logger name="MyBATISNet.DataMapper.Configuration.Cache.CacheModel"> - <level value="DEBUG" /> - </logger> - <logger name="MyBATISNet.DataMapper.LazyLoadList"> - <level value="DEBUG" /> - </logger> - <logger name="MyBATISNet.DataMapper.SqlMapSession"> - <level value="DEBUG" /> - </logger> - <logger name="MyBATISNet.Common.Transaction.TransactionScope"> - <level value="DEBUG" /> - </logger> - <logger name="MyBATISNet.DataAccess.DaoSession"> - <level value="DEBUG" /> - </logger> - <logger name="MyBATISNet.DataAccess.Configuration.DaoProxy"> - <level value="DEBUG" /> - </logger> - <logger name="MyBATISNet.DataMapper.Configuration.Statements.PreparedStatementFactory"> - <level value="OFF" /> - </logger> - <logger name="MyBATISNet.DataMapper.Commands.IPreparedCommand"> - <level value="OFF" /> - </logger> - </log4net> -</configuration> - - - To log all Prepared SQL command text, enable the logger for - MyBATISNet.DataMapper.Configuration.Statements.DefaultPreparedCommand. - This will display the statement, parameters, and parameter types used by - the DataMapper. - - - Sample DefaultPreparedCommand logger output - - 2005-06-08 01:39:33 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand - -Statement Id: [User.Update] PreparedStatement : [UPDATE [User] SET [DateLastUpdated] = NOW() WHERE [UserId] = ?] -2005-06-08 01:39:43 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand - -Statement Id: [User.Update] Parameters: [param0=[UserId,1]] -2005-06-08 01:39:53 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand - -Statement Id: [User.Update] Types: [param0=[String, System.Int32]] - - - - If your statements are named the same across all sqlMap files, its - possible to filter log messages when using Apache Log4Net. The example - below only logs Insert, Update, and Delete statements sent to the - database. Select or GetMany statements are not logged: - - - Sample Apache Log4Net appender node that will log Insert, - Update, and Delete statements to a file - - <appender name="FileAppender" type="log4net.Appender.FileAppender"> - <file value="InsertsUpdatesDeletes.txt" /> - <layout type="log4net.Layout.SimpleLayout" /> - <filter type="log4net.Filter.StringMatchFilter"> - <regExToMatch value="^(?!Statement Id:)|Statement Id: \[\w+?\.(?:Insert|Update|Delete)" /> - </filter> - <filter type="log4net.Filter.DenyAllFilter" /> -</appender> - If you would like to log cache usage in your application, - enable the logger for - MyBATISNet.DataMapper.Configuration.Cache.CacheModel. - - - Sample CacheModel logger output - - 2005-06-08 01:38:34,403 [3648] DEBUG MyBATISNet.DataMapper.Configuration.Cache.CacheModel - -Flush cacheModel named Account.account-cache for statement 'UpdateAccountViaParameterMap' - - - To keep track of DataMapper session information, enable the logger - for MyBATISNet.DataMapper.SqlMapSession. - - - Sample SqlMapSession logger output - - 2005-06-08 01:39:42,660 [3872] DEBUG MyBATISNet.DataMapper.SqlMapSession [] - - Open Connection "3194" - to "Microsoft SQL Server 7.0/2000, provider V1.0.5000.0 in framework .NET V1.1". -2005-06-08 01:39:42,660 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand [] - - PreparedStatement : [select * from Orders where Order_ID = @param0 ] -2005-06-08 01:39:42,660 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand [] - - Parameters: [@param0=[value,1]] -2005-06-08 01:39:42,660 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand [] - - Types: [@param0=[Int32, System.Int32]] -2005-06-08 01:39:42,676 [3872] DEBUG MyBATISNet.DataMapper.SqlMapSession [] - - Close Connection "3194" to - "Microsoft SQL Server 7.0/2000, provider V1.0.5000.0 in framework .NET V1.1". - - - To get information about lazyload usage by the DataMapper, enable - the logger for - MyBATISNet.DataMapper.LazyLoadList. - - - Sample LazyLoadList logger output - - 2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.LazyLoadList [] - - Proxyfying call to get_Count -2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.LazyLoadList [] - - Proxyfying call, query statement GetLineItemsForOrder -2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.SqlMapSession [] - - Open Connection "3463" to - "Microsoft SQL Server 7.0/2000, provider V1.0.5000.0 in framework .NET V1.1". -2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand [] - - PreparedStatement : [select LineItem_ID as Id, LineItem_Code as Code, - LineItem_Quantity as Quantity, LineItem_Price as Price - from LineItems where Order_ID = @param0 ] -2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand [] - - Parameters: [@param0=[value,1]] -2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.Commands.DefaultPreparedCommand [] - - Types: [@param0=[Int32, System.Int32]] -2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.SqlMapSession [] - - Close Connection "3463" to - "Microsoft SQL Server 7.0/2000, provider V1.0.5000.0 in framework .NET V1.1". -2005-06-08 01:39:42,316 [3872] DEBUG MyBATISNet.DataMapper.LazyLoadList [] - - End of proxyfied call to get_Count - - -
    -
    \ No newline at end of file diff --git a/docs/dataMapperGuide/src/en/images/DevGuide-1.gif b/docs/dataMapperGuide/src/en/images/DevGuide-1.gif deleted file mode 100644 index 8b8cfeef6c3a3de8707f8497487d8a55f18a1324..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 44214 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 diff --git a/docs/dataMapperGuide/src/en/images/ibatisnet.gif b/docs/dataMapperGuide/src/en/images/ibatisnet.gif deleted file mode 100644 index 163852ffec2a9424ec943e7a04dcfd25f445337f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1728 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 diff --git a/docs/dataMapperGuide/src/en/index.xml b/docs/dataMapperGuide/src/en/index.xml deleted file mode 100644 index 70f878a..0000000 --- a/docs/dataMapperGuide/src/en/index.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - -]> - - - iBATIS.NET - DataMapper Application Framework - DataMapper Developer Guide - Version 1.6.3 - October 2011 - - - Michael - McCurrey - - - Gilles - Bayon - - - Clinton - Begin - - - Roberto - Rabe - - - - - Copies of this document may be made for your own use and for - distribution to others, provided that you do not charge any fee for such - copies and further provided that each copy contains this Copyright - Notice, whether distributed in print or electronically. - - - - - &introduction; - &architecture; - &working; - &dotnet; - &xsdConfig; - &xsdSqlMap; - diff --git a/docs/dataMapperGuide/src/en/introduction.xml b/docs/dataMapperGuide/src/en/introduction.xml deleted file mode 100644 index 8717114..0000000 --- a/docs/dataMapperGuide/src/en/introduction.xml +++ /dev/null @@ -1,117 +0,0 @@ - - - Introduction - - - Overview - - The MyBATIS DataMapper framework makes it easier to use a database - with a Java or .NET application. MyBATIS DataMapper couples objects with - stored procedures or SQL statements using a XML descriptor. Simplicity is - the biggest advantage of the MyBATIS DataMapper over object relational - mapping tools. To use MyBATIS DataMapper you rely on your own objects, XML, - and SQL. There is little to learn that you don't already know. With MyBATIS - DataMapper you have the full power of both SQL and stored procedures at - your fingertips. - - - - What's covered here - - This Guide covers the .NET implementations of MyBATIS DataMapper. The - Java implementation offers the same services with some changes in the - API. - - Since MyBATIS relies on an XML descriptor to create the mappings, - much of the material applies to both implementations. - - For installation instructions, see the section called the .NET - Developer Guide. - - A Tutorial is also available. We recommend reviewing the Tutorial - for your platform before reading this Guide. - - - If you would like to get the latest development (unreleased) - version of this Guide, please see the MyBATIS - Wiki FAQ. The FAQ entry explains how you can access our SVN - source repository and generate CHM and PDF files of the latest - development documentation for the DataMapper. - - - - - Release change log - - - Version 1.6.0 - - - Resolution of N+1 select problem using groupBy attribute - - - Added support of reuse SQL fragement via <include/> tag - - - Added lazy load support for single class - - - Added support for IDictionary<K, V> QueryForDictionary<K, V>(...) - - - Marked QueryForPaginatedList as obsolete - - - Allowed procedure statement without parameterMap - - - Removed obsoletes methods on SqlMapper : - Configure(XmlDocument document), Configure(), - Configure(string resource), - ConfigureAndWatch(ConfigureHandler configureDelegate), - ConfigureAndWatch(string resource, ConfigureHandler configureDelegate) - - - Extended use of ISqlMapper in DataMapper + allowed use of a custom ISqlMapper. - - - Allowed custom ISessionStore. - - - - - - - License Information - - MyBATIS.NET is licensed according to the terms of the Apache License, - Version 2.0. The full text of this license are available online at http://www.apache.org/licenses/LICENSE-2.0 - (TXT - or HTML). You - can also view the full text of any of these licenses in the doc - subdirectory of the MyBATIS.NET distribution. - - - - Support - - Mailing lists and bug trackers are available (courtesy of Apache - Software Foundation) at MyBATIS’s Apache project page. Just direct your - browser to http://MyBATIS.apache.org/. - - - - Disclaimer - -

    - MyBATIS MAKES NO WARRANTIES, EXPRESS OR IMPLIED, AS TO THE - INFORMATION IN THIS DOCUMENT. The names of actual companies and products - mentioned herein may be the trademarks of their respective - owners. -
    - - \ No newline at end of file diff --git a/docs/dataMapperGuide/src/en/working.xml b/docs/dataMapperGuide/src/en/working.xml deleted file mode 100644 index 0b4f724..0000000 --- a/docs/dataMapperGuide/src/en/working.xml +++ /dev/null @@ -1,4245 +0,0 @@ - - - Working with Data Maps - - - Introduction - - If you want to know how to configure and install MyBATIS, see the - Developer Guide section for your platform. But if you want to know how - MyBATIS really works, continue from here. - - The Data Map definition file is where the interesting stuff happens. - Here, you define how your application interacts with your database. As - mentioned, the Data Map definition is an XML descriptor file. By using a - service routine provided by MyBATIS, the XML descriptors are rendered into - a client object (or Mapper). To access your Data - Maps, your application calls the client object and passes in the name of - the statement you need. - - The real work of using MyBATIS is not so much in the application - code, but in the XML descriptors that MyBATIS renders. Instead of monkeying - with application source code, you monkey with XML descriptors instead. The - benefit is that the XML descriptors are much better suited to the task of - mapping your object properties to database entities. At least, that's our - own experience with our own applications. Of course, your mileage may - vary. - - - - What's in a Data Map definition file, anyway? - - If you read the Tutorial, you've already seen some simple Data Map - examples, like the one shown in Example 2.1. - A simple Data Map (.NET) - - <?xml version="1.0" encoding="UTF-8" ?> - <sqlMap namespace="LineItem" -xmlns="http://MyBATIS.apache.org/mapping" -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > - - <!--Type aliases allow you to use a shorter name for long fully qualified class names.--> - <alias> - <typeAlias alias="LineItem" type="NPetshop.Domain.Billing.LineItem, NPetshop.Domain" /> - </alias> - - <statements> - <insert id="InsertLineItem" parameterClass="LineItem"> - INSERT INTO [LinesItem] - (Order_Id, LineItem_LineNum, Item_Id, LineItem_Quantity, LineItem_UnitPrice) - VALUES - (#Order.Id#, #LineNumber#, #Item.Id#, #Quantity#, #Item.ListPrice#) - </insert> - </statements> -</sqlMap> - - - This map takes some properties from a LineItem instance and merges - the values into the SQL statement. The value-add is that our SQL in - separated from our program code, and we can pass our LineItem instance - directly to a library method: - - C# -Mapper.Instance().Insert("InsertLineItem",lineItem); - - No fuss, no muss. Likewise, see Example 3.2 for a simple select - statement. - - In Example 3.1, we use SQL aliasing to map columns to our object - properties and an MyBATIS inline parameter (see sidebar) to insert a - runtime value. Easy as pie. - - - A Quick Glance at Inline Parameters - - Say we have a mapped statement element that looks like - this: - - <statement id="InsertProduct"> - insert into Products (Product_Id, Product_Description) - values (#Id#, #Description#); -</statement> - - The inline parameters here are #Id# and #Description#. Let's also - say that we have an object with the properties Id - and Description. If we set the object properties - to 5 and "dog", - respectively, and passed the object to the mapped statement, we'd end up - with a runtime query that looked like this: - - insert into Products (Product_Id, Product_Description) values (5, ‘dog'); - - For more about inline parameters, see Section 3.4. - - - But, what if you wanted some ice cream with that pie? And maybe a - cherry on top? What if we wanted to cache the result of the select? Or, - what if we didn't want to use SQL aliasing or named parameters. (Say, - because we were using pre-existing SQL that we didn't want to touch.) - Example 3.2 shows a Data Map that specifies a cache, and uses a - <parameterMap> and a <resultMap> to keep our SQL - pristine. - - - A Data Map definition file with some bells and whistles - - <?xml version="1.0" encoding="UTF-8" ?> - <sqlMap namespace="Product" -xmlns="http://MyBATIS.apache.org/mapping" -xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > - - <alias> - <typeAlias alias="Product" type="Example.Domain.Product, Example.Domain" /> - </alias> - - <cacheModels> - <cacheModel id="productCache" implementation="LRU"> - <flushInterval hours="24"/> - <property name="CacheSize" value="1000" /> - </cacheModel> - </cacheModels> - - <resultMaps> - <resultMap id="productResult" class="Product"> - <result property="Id" column="Product_Id"/> - <result property="Description" column="Product_Description"/> - </resultMap> - </resultMaps> - - <statements> - <select id="GetProduct" parameterMap="productParam" cacheModel="productCache"> - select * from Products where Product_Id = ? - </select> - </statements> - - <parameterMaps> - <parameterMap id="productParam" class="Product"> - <parameter property="Id"/> - </parameterMap> - <parameterMaps> - -</sqlMap> - In Example 3.2, <parameterMap> maps the SQL - "?" to the product - Id property. The <resultMap> maps the columns - to our object properties. The <cacheModel> keeps the result of the - last one thousand of these queries in active memory for up to 24 - hours. - - Example 3.2 is longer and more complex than Example 3.1, but - considering what you get in return, it seems like a fair trade. (A bargain - even.) - - Many agile developers would start with - something like Example 3.1 and add features like caching later. If you - changed the Data Map from Example 3.1 to Example 3.2, you would not have - to touch your application source code at all. You can start simple and add - complexity only when it is needed. - - A single Data Map definition file can contain as many Cache Models, - Type Aliases, Result Maps, Parameter Maps, and Mapped Statements - (including stored procedures), as you like. Everything is loaded into the - same configuration, so you can define elements in one Data Map and then - use them in another. Use discretion and organize the statements and maps - appropriately for your application by finding some logical way to group - them. - - - - Mapped Statements - - Mapped Statements can hold any SQL statement and can use Parameter - Maps and Result Maps for input and output. (A stored procedure is a - specialized form of a statement. See section 3.3.1 and 3.3.2 for more - information.) - - If the case is simple, the Mapped Statement can reference the - parameter and result classes directly. Mapped Statements support caching - through reference to a Cache Model element. The following example shows - the syntax for a statement element. - Statement element syntax - - <statement id="statement.name" - [parameterMap="parameterMap.name"] - [parameterClass="alias"] - [resultMap="resultMap.name"] - [resultClass="class.name|alias"] - [listClass="class.name|alias"] - [cacheModel="cache.name"] - [extends="statement.name"] -> - - select * from Products where Product_Id = [?|#propertyName#] - order by [$simpleDynamic$] - -</statement> - - - In Example 3.3, the [bracketed] parts are optional, and some options - are mutually exclusive. It is perfectly legal to have a Mapped Statement - as simple as shown by Example 3.4. - A simplistic Mapped Statement - - <statement id="InsertTestProduct" > - insert into Products (Product_Id, Product_Description) values (1, "Shih Tzu") -</statement> - - - Example 3.4 is obviously unlikely, unless you are running a test. - But it does shows that you can use MyBATIS to execute arbitrary SQL - statements. More likely, you will use the object mapping features with - Parameter Maps (Section 3.4) and Result Maps (Section 3.5) since that's - where the magic happens. - - - Statement Types - - The <statement> element is a general "catch all" element - that can be used for any type of SQL statement. Generally it is a good - idea to use one of the more specific statement-type elements. The more - specific elements provided better error-checking and even more - functionality. (For example, the insert statement can return a - database-generated key.) Table 3.1 summarizes the statement-type - elements and their supported attributes and features. - - - The six statement-type elements - - - - - Statement Element - - Attributes - - Child Elements - - Methods - - - - - - <statement> - - id -parameterClass -resultClass -listClass -parameterMap -resultMap -cacheModel - - All dynamic elements - - Insert -Update -Delete -All query methods - - - - <insert> - - id -parameterClass -parameterMap - - All dynamic elements -<selectKey> -<generate> - - Insert -Update -Delete - - - - <update> - - id -parameterClass -parameterMap -extends - - All dynamic elements -<generate> - - Insert -Update -Delete - - - - <delete> - - id -parameterClass -parameterMap -extends - - All dynamic elements -<generate> - - Insert -Update -Delete - - - - <select> - - id -parameterClass -resultClass -listClass -parameterMap -resultMap -cacheModel -extends - - All dynamic elements -<generate> - - All query methods - - - - <procedure> - - id -parameterMap -resultClass -resultMap -cacheModel - - All dynamic elements - - Insert -Update -Delete -All query methods - - - -
    The various attributes used by statement-type elements are - covered in Section 3.3.4.
    -
    - - - Stored Procedures - - MyBATIS DataMapper treats stored procedures as yet another - statement type. Example 3.5 shows a simple Data Map hosting a stored - procedure. - A Data Map using a stored procedure - - <!-- Microsot SQL Server --> -<procedure id="SwapEmailAddresses" parameterMap="swap-params"> - ps_swap_email_address -</procedure> -... -<parameterMap id="swap-params"> - <parameter property="email1" column="First_Email" /> - <parameter property="email2" column="Second_Email" /> -</parameterMap> - -<!-- Oracle with MS OracleClient provider --> -<procedure id="InsertCategory" parameterMap="insert-params"> - prc_InsertCategory -</procedure> -... -<parameterMap id="insert-params"> - <parameter property="Name" column="p_Category_Name"/> - <parameter property="GuidString" column="p_Category_Guid" dbType="VarChar"/> - <parameter property="Id" column="p_Category_Id" dbType="Int32" type="Int"/> -</parameterMap> - -<!-- Oracle with ODP.NET 10g provider --> -<statement id="InsertAccount" parameterMap="insert-params"> - prc_InsertAccount -</statement> -... -<parameterMap id="insert-params"> - <parameter property="Id" dbType="Int32"/> - <parameter property="FirstName" dbType="VarChar2" size="32"/> - <parameter property="LastName" dbType="VarChar2" size="32"/> - <parameter property="EmailAddress" dbType="VarChar2" size="128"/> -</parameterMap> - - The idea behind Example 3.5 is that calling the stored - procedure SwapEmailAddresses would exchange two - email addresses between two columns in a database table and also in the - parameter object (a HashTable). The parameter - object is only modified if the parameter mappings mode attribute is set - to InputOutput or Output. - Otherwise they are left unchanged. Of course, immutable parameter - objects (e.g. String) cannot be modified. - For .NET, the parameterMap attribute is required. The DBType, - parameter direction, size, precision, and scale are usually - auto-discovered by the framework (via the CommandBuilder) depending - on your provider. - If your stored procedure have no parmeters, the parameterMap attribute on the procedure tag is optionnal. - - - - - The SQL - - If you are not using stored procedures, the most important part of - a statement-type element is the SQL. You can use any SQL statement that - is valid for your database system. Since MyBATIS passes the SQL through - to the standard libraries ( ADO.NET), you can use any statement with - MyBATIS that you could use without MyBATIS. You can use whatever functions - your database system supports, and even send multiple statements, so - long as your driver or provider supports them. - - If standard, static SQL isn't enough, MyBATIS can help you build a - dynamic SQL statement. See Section 3.9 for more about Dynamic - SQL. - - - Reusing SQL Fragments - - When writing SqlMaps, you often encounter duplicate fragments of SQL, for example a FROM-clause or - constraint-statement. MyBATIS offers a simple yet powerful tag to reuse them. For the sake of simplicity, let's - assume we want to get some items and we want to do a count on them. Normally, you would write - something like this : - - - Reusing SQL Fragments (Before) - - <select id="SelectItemCount" resultClass="int"> -SELECT COUNT(*) AS total -FROM items -WHERE parentid = 6 -</select> - -<select id="SelectItems" resultClass="Item"> -SELECT id, name -FROM items -WHERE parentid = 6 -</select> - - - To eliminate this duplication, we use the tags <sql> and <include>. The <sql> tag contains the fragment to reuse, the <include> tag includes such a fragment in a statement. For example: - - - Reusing SQL Fragments (After) - - <sql id="selectItem_fragment"> -FROM items -WHERE parentid = 6 -</sql> - -<select id="selectItemCount" resultClass="int"> -SELECT COUNT(*) AS total -<include refid="selectItem_fragment"/> -</select> - -<select id="selectItems" resultClass="Item"> -SELECT id, name -<include refid="selectItem_fragment"/> -</select> - - - The <include> tag is namespace aware so you can refer to fragments even when they are located in another map (however, due to the way MyBATIS loads the SqlMaps, the included fragment should be loaded before the including statement). - The fragments are included and processed on query-execution so parameters can be used too : - - -<sql id="selectItem_fragment"> -FROM items -WHERE parentid = #value# -</sql> - -<select id="selectItemCount" parameterClass="int" resultClass="int"> -SELECT COUNT(*) AS total -<include refid="selectItem_fragment"/> -</select> - -<select id="selectItems" parameterClass="int" resultClass="Item"> -SELECT id, name -<include refid="selectItem_fragment"/> -</select> - - - In many case, you can also use the extends attribute on statement tag to achieve the same goal. - - - - - Escaping XML symbols - - Because you are combining SQL and XML in a single document, - conflicts can occur. The most common conflict is the greater-than and - less-than symbols (><). SQL statements use these symbols as - operators, but they are reserved symbols in XML. A simple solution is - to escape the SQL statements that uses XML - reserved symbols within a CDATA element. Example 3.6 demonstrates - this. - Using CDATA to "escape" SQL code - - <statement id="SelectPersonsByAge" parameterClass="int" resultClass="Person"> - <![CDATA[ - SELECT * FROM PERSON WHERE AGE > #value# - ]]> -</statement> - - - - - Auto-Generated Keys - - Many database systems support auto-generation of primary key - fields, as a vendor extension. Some vendors pre-generate keys (e.g. - Oracle), some vendors post-generate keys (e.g. MS-SQL Server and - MySQL). In either case, you can obtain a pre-generated key using a - <selectKey> stanza within an <insert> element. Example 3.7 - shows an <insert> statement for either approach. - <insert> statements using <selectKey> - stanzas - - <!—Oracle SEQUENCE Example using .NET 1.1 System.Data.OracleClient --> -<insert id="insertProduct-ORACLE" parameterClass="product"> - <selectKey resultClass="int" type="pre" property="Id" > - SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL - </selectKey> - insert into PRODUCT (PRD_ID,PRD_DESCRIPTION) values (#id#,#description#) -</insert> - -<!— Microsoft SQL Server IDENTITY Column Example --> -<insert id="insertProduct-MS-SQL" parameterClass="product"> - insert into PRODUCT (PRD_DESCRIPTION) - values (#description#) - <selectKey resultClass="int" type="post" property="id" > - select @@IDENTITY as value - </selectKey> -</insert> - -<!-- MySQL Example --> -<insert id="insertProduct-MYSQL" parameterClass="product"> - insert into PRODUCT (PRD_DESCRIPTION) - values (#description#) - <selectKey resultClass="int" type="post" property="id" > - select LAST_INSERT_ID() as value - </selectKey> -</insert> - - - - - <generate> tag - - You can use MyBATIS to execute any SQL statement your application - requires. When the requirements for a statement are simple and - obvious, you may not even need to write a SQL statement at all. The - <generate> tag can be used to create simple SQL statements - automatically, based on a <parameterMap> element. The four CRUD - statement types (insert, select, update, and delete) are supported. - For a select, you can select all or select by a key (or keys). Example - 3.8 shows an example of generating the usual array of CRUD - statements. - - - Creating the "usual suspects" with the <generate> - tag - - -<parameterMaps> - <parameterMap id="insert-generate-params"> - <parameter property="Name" column="Category_Name"/> - <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/> - </parameterMap> - - <parameterMap id="update-generate-params" extends="insert-generate-params"> - <parameter property="Id" column="Category_Id" /> - </parameterMap> - - <parameterMap id="delete-generate-params"> - <parameter property="Id" column="Category_Id" /> - <parameter property="Name" column="Category_Name"/> - </parameterMap> - - <parameterMap id="select-generate-params"> - <parameter property="Id" column="Category_Id" /> - <parameter property="Name" column="Category_Name"/> - <parameter property="Guid" column="Category_Guid" dbType="UniqueIdentifier"/> - </parameterMap> - -</parameterMaps> - -<statements> - - <update id="UpdateCategoryGenerate" parameterMap="update-generate-params"> - <generate table="Categories" by="Category_Id"/> - </update> - - <delete id="DeleteCategoryGenerate" parameterMap="delete-generate-params"> - <generate table="Categories" by="Category_Id, Category_Name"/> - </delete> - - <select id="SelectByPKCategoryGenerate" resultClass="Category" parameterClass="Category" - parameterMap="select-generate-params"> - <generate table="Categories" by="Category_Id"/> - </select> - - <select id="SelectAllCategoryGenerate" resultClass="Category" - parameterMap="select-generate-params"> - <generate table="Categories" /> - </select> - - <insert id="InsertCategoryGenerate" parameterMap="insert-generate-params"> - <selectKey property="Id" type="post" resultClass="int"> - select @@IDENTITY as value - </selectKey> - <generate table="Categories" /> - </insert> - -</statements> - - - - The SQL is generated when the DataMapper instance is built, - so there is no performance impact at execution time. - The tag generates ANSI SQL, which should work with any - compliant database. Special types, such as blobs, are not supported, - and vendor-specific types are also not supported. But, the generate - tag does keep the simple things simple. - - - The intended use of the <generate> tag is to save - developers the trouble of coding mundane SQL statements (and only - mundane statements). It is not meant as a object-to-relational - mapping tool. There are many frameworks that provide extensive - object-to-relational mapping features. The <generate> tag is - not a replacement for any of those. When the <generate> tag - does not suit your needs, use a conventional statement - instead. - - - - <generate> tag attributes - - The generate tag supports two attributes : - - - <generate> attributes - - - - - Attribute - - Description - - Required - - - - - - table - - specifies the table name to use in the SQL - statement. - - yes - - - - by - - specifies the columns to use in a WHERE - clause - - no - - - -
    -
    -
    -
    - - - Statement-type Element Attributes - - The six statement-type elements take various attributes. See - Section 3.3.1 for a table itemizing which attributes each element-type - accepts. The individual attributes are described in the sections that - follow. - - - id - - The required id attribute provides a name - for this statement, which must be unique within this - <SqlMap>. - - - - parameterMap - - A Parameter Map defines an ordered list of values that match up - with the "?" placeholders of a standard, - parameterized query statement. Example 3.9 shows a - <parameterMap> and a corresponding <statement>. - A parameterMap and corresponding statement - - <parameterMap id="insert-product-param" class="Product"> - <parameter property="id"/> - <parameter property="description"/> -</parameterMap> - -<statement id="insertProduct" parameterMap="insert-product-param"> - insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) values (?,?); -</statement> - - - In Example 3.9, the Parameter Map describes two parameters that - will match, in order, two placeholders in the SQL statement. The first - "?" is replaced by the value of the - id property. The second is replaced with the - description property. - - MyBATIS also supports named, inline parameters, which most - developers seem to prefer. However, Parameter Maps are useful when the - SQL must be kept in a standard form or when extra information needs to - be provided. For more about Parameter Maps see Section 3.4. - - - - parameterClass - - If a parameterMap attribute is not specified, you may specify a - parameterClass instead and use inline parameters (see Section 3.4.3 ). - The value of the parameterClass attribute can be a Type Alias or the - fully qualified name of a class. Example 3.10 shows a statement using - a fully-qualified name versus an alias. - Ways to specify a parameterClass - - <!-- fully qualified classname --> -<statement id="statementName" parameterClass="Examples.Domain.Product, Examples.Domain"> - insert into PRODUCT values (#id#, #description#, #price#) -</statement> - -<!-- typeAlias (defined elsewhere) --> -<statement id="statementName" parameterClass="Product"> - insert into PRODUCT values (#id#, #description#, #price#) -</statement> - - - - - resultMap - - A Result Map lets you control how data is extracted from the - result of a query, and how the columns are mapped to object - properties. Example 3.11 shows a <resultMap> element and a - corresponding <statement> element. - - - A <resultMap> and corresponding - <statement> - - <resultMap id="select-product-result" class="product"> - <result property="id" column="PRD_ID"/> - <result property="description" column="PRD_DESCRIPTION"/> -</resultMap> - -<statement id="selectProduct" resultMap="select-product-result"> - select * from PRODUCT -</statement> - - In Example 3.11, the result of the SQL query will be mapped - to an instance of the Product class using the - "select-product-result" <resultMap>. The <resultMap> - says to populate the id property from the - PRD_ID column, and to populate the - description property from the - PRD_DESCRIPTION column. - In Example 3.11, note that using " select * - " is supported. If you want all the columns, you - don't need to map them all individually. (Though many - developers consider it a good practice to always specify the - columns expected.) - - - For more about Result Maps, see Section 3.5. - - - - - resultClass - - If a resultMap is not specified, you may specify a resultClass - instead. The value of the resultClass attribute can be a Type Alias or - the fully qualified name of a class. The class specified will be - automatically mapped to the columns in the result, based on the result - metadata. The following example shows a <statement> element with - a resultClass attribute. - - - A <statement >element with resultClass - attribute - - <statement id="SelectPerson" parameterClass="int" resultClass="Person"> - SELECT - PER_ID as Id, - PER_FIRST_NAME as FirstName, - PER_LAST_NAME as LastName, - PER_BIRTH_DATE as BirthDate, - PER_WEIGHT_KG as WeightInKilograms, - PER_HEIGHT_M as HeightInMeters - FROM PERSON - WHERE PER_ID = #value# -</statement> - In Example 3.12, the Person class - has properties including: Id, - FirstName, LastName, - BirthDate, - WeightInKilograms, and - HeightInMeters. Each of these corresponds with - the column aliases described by the SQL select statement using the - "as" keyword –a standard SQL feature. When - executed, a Person object is instantiated and - populated by matching the object property names to the (aliased) - column names from the query. - - Using SQL aliases to map columns to properties saves defining a - <resultMap> element, but there are limitations. There is no way - to specify the types of the output columns (if needed), there is no - way to automatically load related data such as complex properties, and - there is a slight performance consequence from accessing the result - metadata. Architecturally, using aliases this way mixes - database logic with reporting - logic, making the query harder to read and maintain. You - can overcome these limitations with an explicit Result Map (Section - 3.5). - - - - listClass - - In addition to providing the ability to return an IList of - objects, the DataMapper supports the use of a strongly-typed custom - collection: a class that implements the - System.Collections.CollectionBase abstract class. The following is an - example of a CollectionBase class that can be used with the - DataMapper. - - - A System.Collections.CollectionBase implementation - - using System; -using System.Collections; - -namespace WebShop.Domain -{ - public class AccountCollection : CollectionBase - { - public AccountCollection() {} - - public Account this[int index] - { - get { return (Account)List[index]; } - set { List[index] = value; } - } - - public int Add(Account value) - { - return List.Add(value); - } - - public void AddRange(Account[] value) - { - for (int i = 0; i < value.Length; i++) - { - Add(value[i]); - } - } - - public void AddRange(AccountCollection value) - { - for (int i = 0; i < value.Count; i++) - { - Add(value[i]); - } - } - - public bool Contains(Account value) - { - return List.Contains(value); - } - - public void CopyTo(Account[] array, int index) - { - List.CopyTo(array, index); - } - - public int IndexOf(Account value) - { - return List.IndexOf(value); - } - - public void Insert(int index, Account value) - { - Account.Insert(index, value); - } - - public void Remove(Account value) - { - Account.Remove(value); - } - } -} - - - A CollectionBase class can be specified for a select statement - through the listClass attribute. The value of the listClass attribute - can be a Type Alias or the fully qualified name of a class. The - statement should also indicate the resultClass so that the DataMapper - knows how to handle the type of objects in the collection. The - resultClass specified will be automatically mapped to the columns in - the result, based on the result metadata. The following example shows - a <statement> element with a listClass attribute. - - - A <statement >element with listClass - attribute - - <statement id="GetAllAccounts" - listClass="AccountCollection" - resultClass="Account"> - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - order by Account_LastName, Account_FirstName -</statement> - - - - - cacheModel - - If you want to cache the result of a query, you can specify a - Cache Model as part of the <statement> element. Example 3.15 - shows a <cacheModel> element and a corresponding - <statement>. - - - A <cacheModel> element with its corresponding - <statement> - - <cacheModel id="product-cache" implementation="LRU"> - <flushInterval hours="24"/> - <flushOnExecute statement="insertProduct"/> - <flushOnExecute statement="updateProduct"/> - <flushOnExecute statement="deleteProduct"/> - <property name="size" value="1000" /> -</cacheModel> - -<statement id="selectProductList" parameterClass="int" cacheModel="product-cache"> - select * from PRODUCT where PRD_CAT_ID = #value# -</statement> - - In Example 3.15, a cache is defined for products that uses a - LRU reference type and flushes every 24 hours or whenever - associated update statements are executed. For more about Cache - Models, see Section 3.8. - - - - - extends - - When writing Sql, you often encounter duplicate fragments of - SQL. MyBATIS offers a simple yet powerful attribute to reuse - them. - - -<select id="GetAllAccounts" - resultMap="indexed-account-result"> -select - Account_ID, - Account_FirstName, - Account_LastName, - Account_Email -from Accounts -</select> - -<select id="GetAllAccountsOrderByName" - extends="GetAllAccounts" - resultMap="indexed-account-result"> - order by Account_FirstName -</select> - - -
    - - - Parameter Maps and Inline Parameters - - Most SQL statements are useful because we can pass them values at - runtime. Someone wants a database record with the ID - 42, and we need to merge that ID number - into a select statement. A list of one or more parameters are passed at - runtime, and each placeholder is replaced in turn. This is simple but - labor intensive, since developers spend a lot of time counting symbols to - make sure everything is in sync. - - - Preceding sections briefly touched on inline parameters, which - automatically map properties to named parameters. Many MyBATIS - developers prefer this approach. But others prefer to stick to the - standard, anonymous approach to SQL parameters by using parameter - maps. Sometimes people need to retain the purity of the SQL - statements; other times they need the detailed specification offered - by parameter maps due to database or provider-specific information - that needs to be used. - - - A Parameter Map defines an ordered list of values that match up with - the placeholders of a parameterized query statement. While the attributes - specified by the map still need to be in the correct order, each parameter - is named. You can populate the underlying class in any order, and the - Parameter Map ensures each value is passed in the correct order. - - - Dynamic Mapped Statements (Section 3.9) can't use Parameter - Maps. Being dynamic, the number of parameters will change and defeat - the purpose of a Parameter Map. Depending on your provider, this may - hinder your ability to use Dynamic Mapped Statements if your provider - requires the use of some of the attributes, such as size or scale, - that a <parameter> provides. - - - Parameter Maps can be provided as an external element and - inline. Example 3.16 shows an external Parameter - Map. - An external Parameter Map - - <parameterMap id="parameterMapIdentifier" - [class="fullyQualifiedClassName, assembly|typeAlias"] - [extends="[sqlMapNamespace.]parameterMapId"]> - <parameter - property ="propertyName" - [column="columnName"] - [direction="Input|Output|InputOutput"] - [dbType="databaseType"] - [type="propertyCLRType"] - [nullValue="nullValueReplacement"] - [size="columnSize"] - [precision="columnPrecision"] - [scale="columnScale"] - [typeHandler="fullyQualifiedClassName, assembly|typeAlias"] - <parameter ... ... /> - <parameter ... ... /> -</parameterMap> - - - In Example 3.16, the parts in [brackets] are optional. The - parameterMap element only requires the id - attribute. The class attribute is optional but - recommended. The class attribute helps to validate - the incoming parameter and optimizes performance. Example 3.17 shows a - typical <parameterMap>. - A typical <parameterMap> element - - <parameterMap id="insert-product-param" class="Product"> - <parameter property="description" /> - <parameter property="id"/> -</parameterMap> - -<statement id="insertProduct" parameterMap="insert-product-param"> - insert into PRODUCT (PRD_DESCRIPTION, PRD_ID) values (?,?); -</statement> - - - - Parameter Map names are always local to the Data Map definition - file where they are defined. You can refer to a Parameter Map in - another Data Map definition file by prefixing the - id of the Parameter Map with the namespace of - the Data Map (set in the <sqlMap> root element). If the - Parameter Map in Example 3.17 were in a Data Map named "Product", it - could be referenced from another file using - "Product.insert-product-param". - - - - <parameterMap> attributes - - The <parameterMap> element accepts three attributes: - id (required), class - (optional), and extends (optional). - - - id - - The required id attribute provides a unique identifier for the - <parameterMap> within this Data Map. - - - - class - - The optional class attribute specifies an - object class to use with this <parameterMap>. The full classname - and assembly or an alias must be specified. Any class can be - used. - - - The parameter class must be a property object or - IDictionary instance. - - - - - extends - - The optional extends attribute can be set - to the name of another parameterMap upon which to base this - parameterMap. All properties of the super - parameterMap will be included as part of this parameterMap, and values - from the super parameterMap are set before any - values specified by this parameterMap. The effect is similar to - extending a class. - - - - - <parameter> Elements - - The <parameterMap> element holds one or more parameter child - elements that map object properties to placeholders in a SQL statement. - The sections that follow describe each of the attributes. - - - property - - The property attribute of - <parameter> is the name of a field or property of the parameter object. - It may also be the name of an entry in a - IDictionary object. The name can be - used more than once depending on the number of times it is needed in - the statement. (In an update, you might set a column that is also part - of the where clause.) - - - - column - - The column attribute is used to define to - the name of a parameter used by a stored procedure. - - - - direction - - The direction attribute may be used to - indicate a stored procedure parameter's direction. - - - Parameter direction attribute values - - - - - Value - - Description - - - - - - Input - - input-only - - - - Output - - output-only - - - - InputOutput - - bidirectional - - - -
    -
    - - - dbType - - The dbType attribute is used to - explicitly specify the database column type of the parameter to be set - by this property. For certain operations, some ADO.NET providers are - not able to determine the type of a column, and the type must be - specified. - - This attribute is normally only required if the column is - nullable. Although, another reason to use the dbType attribute is to - explicitly specify date types. Whereas .NET only has one Date value - type (System.DateTime), most SQL databases have - more than one. Usually, a database has at least three different types - (DATE, DATETIME, - TIMESTAMP). In order for the value to map - correctly, you might need to specify the column's dbType, - - - Most providers only need the dbType specified for nullable - columns. In this case, you only need to specify the type for the - columns that are nullable. - - - The dbType attribute can be set to any - string value that matches a constant in the specific data type enum of - the used provider such as System.Data.SqlDbType - for Microsoft Sql Server. Section 3.6 describes the types that are - supported by the framework. - - - - type - - The type attribute is used to specify the - CLR type of the parameter's property. This - attribute is useful when passing InputOutput and Output parameters - into stored procedures. The framework uses the specified - type to properly handle and set the parameter - object's properties with the procedure's output values after - execution. - - Normally, the type can be derived from a property through - reflection, but certain mappings that use objects such as a Map cannot - provide the property type to the framework. If the attribute type is - not set and the framework cannot otherwise determine the type, the - type is assumed to be an Object. Section 6 details the CLR types and - available aliases that have pre-built support in the framework. - - - - nullValue - - The nullValue attribute can be set to any - valid value (based on property type). The - nullValue attribute is used to specify an - outgoing null value replacement. What this means is that when the - value is detected in the object property, a NULL - will be written to the database (the opposite behavior of an inbound - null value replacement). This allows you to use a - magic null number in your application for types - that do not support null values (such as int, - double, float). When - these types of properties contain a matching null value (–9999), a - NULL will be written to the database instead of - the value. - - - - size - - The size attribute sets the maximum size - of the data within the column. - - - - precision - - The precision attribute is used to set - the maximum number of digits used to represent the property - value. - - - - scale - - The scale attribute sets the number of - decimal places used to resolve the property value. - - - - typeHandler<!-- <emphasis role="new">New !</emphasis> --><!-- <inlinegraphic fileref="images/new.gif" format="GIF"/> --><!-- <mediaobject> <imageobject><imagedata fileref="images/new.gif" format="GIF" /></imageobject></mediaobject> --> - - The typeHandler attribute allows the use - of a Custom Type Handler (see the Custom Type Handler section). This - allows you to extend the DataMapper's capabilities in handling types - that are specific to your database provider, are not handled by your - database provider, or just happen to be a part of your application - design. You can create custom type handlers to deal with storing and - retrieving booleans and Guids from your database for example. - -
    - - - Inline Parameter Maps - - If you prefer to use inline parameters instead of parameter maps, - you can add extra type information inline too. The inline parameter map - syntax lets you embed the property name, the property type, the column - type, and a null value replacement into a parametrized SQL statement. - The next four examples shows statements written with inline - parameters. - A <statement> using inline parameters - - <statement id="insertProduct" parameterClass="Product"> - insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) - values (#id#, #description#) -</statement> - - - The following example shows how dbTypes can be declared - inline. - - - A <statement> using an inline parameter map with a - type - - <statement id="insertProduct" parameterClass="Product"> - insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) - values (#id:int#, #description:VarChar#) -</statement> - - - The next example shows how dbTypes and null value replacements can - also be declared inline. - - - A <statement> using an inline parameter map with a null - value replacement - - <statement id="insertProduct" parameterClass="Product"> - insert into PRODUCT (PRD_ID, PRD_DESCRIPTION) - values (#id:int:-999999#, #description:VarChar#) -</statement> - - - Like the DataMapper for Java, there is an alternate inline syntax - that allows the specification of the property, type, dbType, and null - value replacement. The following example shows that syntax in - use. - - - A <statement> using alternate inline syntax with - property, type, dbType, and null value replacement - - <update id="UpdateAccountViaInlineParameters" parameterClass="Account"> - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress,type=string,dbType=Varchar,nullValue=no_email@provided.com# - where - Account_ID = #Id# -</update> - - - - When using inline parameters, you cannot specify the null - value replacement without also specifying the dbType. You must - specify both due to the parsing order. - - For round-trip transparency of null - values, you must also specify database columns null value - replacements in your Result Map (see Section 3.5). - - Inline parameter maps are handy for small jobs, but when there - are a lot of type descriptors and null value replacements in a - complex statement, an industrial-strength, external parameterMap can - be easer. - - - - - Standard Type Parameters - - In practice, you will find that many statements take a single - parameter, often an Integer or a - String. Rather than wrap a single value in - another object, you can use the standard library object - (String, Integer, et - cetera) as the parameter directly. Example 3.22 shows a statement using - a standard type parameter. - A <statement> using standard type parameters - - <statement id="getProduct" parameterClass="System.Int32"> - select * from PRODUCT where PRD_ID = #value# -</statement> - - - Assuming PRD_ID is a numeric type, when a - call is made to this Mapped Statement, a standard Integer object can be - passed in. The #value# parameter will be replaced - with the value of the Integer instance. The name - value is simply a placeholder, you can use another - moniker of your choice. Result Maps support primitive types as results - as well. - - For your convenience, primitive types are aliased by the - framework. For example, int can be used in place - of System.Integer. For a complete list, see - Section 3.6, "Supported Types for Parameter Maps and Result - Maps". - - - - Map or IDictionary Type Parameters - - You can also pass a IDictionary - instance as a parameter object. This would usually be a - HashTable. Example 3.23 shows a <statement> - using an IDictionary for a - parameterClass. - - - A <statement> using a Map or IDictionary for a - parameterClass - - <statement id="getProduct" parameterClass="System.Collections.IDictionary"> - select * from PRODUCT - where PRD_CAT_ID = #catId# - and PRD_CODE = #code# -</statement> - - - In Example 3.23, notice that the SQL in this Mapped Statement - looks like any other. There is no difference in how the inline - parameters are used. If a HashTable instance is - passed, it must contain keys named catId and - code. The values referenced by those keys must be - of the appropriate type for the column, just as they would be if passed - from a properties object. - - For your convenience, IDictionary - types are aliased by the framework. So, map or - HashTable can be used in place of - System.Collections.Hashtable. For a complete list - of aliases, see Section 3.6, "Supported Types for Parameter Maps and - Result Maps". - -
    - - - Result Maps - - Section 3.4 describes Parameter Maps and Inline parameters, which - map object properties to parameters in a database query. Result Maps - finish the job by mapping the result of a database query (a set of - columns) to object properties. Next to Mapped Statements, the Result Map - is probably one of the most commonly used and most important features to - understand. - - A Result Map lets you control how data is extracted from the result - of a query, and how the columns are mapped to object properties. A Result - Map can describe the column type, a null value replacement, and complex - property mappings including Collections. Example 3.24 shows the structure - of a <resultMap> element. - The structure of a <resultMap> element. - - <resultMap id="resultMapIdentifier" - [class="fullyQualifiedClassName, assembly|typeAlias"] - [extends="[sqlMapNamespace.]resultMapId"]> - - <constructor > - <argument property="argumentName" - column="columnName" - [columnIndex="columnIndex"] - [dbType="databaseType"] - [type="propertyCLRType"] - [resultMapping="resultMapName"] - [nullValue="nullValueReplacement"] - [select="someOtherStatementName"] - [typeHandler="fullyQualifiedClassName, assembly|typeAlias"] /> - </constructor > - - <result property="propertyName" - column="columnName" - [columnIndex="columnIndex"] - [dbType="databaseType"] - [type="propertyCLRType"] - [resultMapping="resultMapName"] - [nullValue="nullValueReplacement"] - [select="someOtherStatementName"] - [lazyLoad="true|false"] - [typeHandler="fullyQualifiedClassName, assembly|typeAlias"] - /> - <result ... .../> - <result ... .../> - // Inheritance support - <discriminator column="columnName" - [type|typeHandler="fullyQualifiedClassName, assembly|typeAlias"] - /> - <subMap value="discriminatorValue" - resultMapping="resultMapName" - /> - <subMap .../> -</resultMap> - - In Example 3.24, the [brackets] indicate optional attributes. - The id attribute is required and provides a name - for the statement to reference. The class attribute is also required, and - specifies a Type Alias or the fully qualified name of a class. This is the - class that will be instantiated and populated based on the result mappings - it contains. - - The resultMap can contain any number of property mappings that map - object properties to the columns of a result element. The property - mappings are applied, and the columns are read, in the order that they are - defined. Mainting the element order ensures consistent results between - different drivers and providers. - As with parameter classes, the result class must be a .NET - object or IDictionary instance. - - - - Extending resultMaps - - The optional extends attribute can be set to the name of another - resultMap upon which to base this resultMap. All properties of the - "super" resultMap will be included as part of this resultMap, and values - from the "super" resultMap are set before any values specified by this - resultMap. The effect is similar to extending a class. - The "super" resultMap must be defined in the file - before the extending resultMap. The classes for - the super and sub resultMaps need not be the same, and do not need - to be related in any way. - - - - - <resultMap> attributes - - The <resultMap> element accepts three attributes: - id (required), class - (optional), and extends (optional). - - - id - - The required id attribute provides a - unique identifier for the <resultMap> within this Data - Map. - - - - class - - The optional class attribute specifies an - object class to use with this <resultMap>. The full classname or - an alias must be specified. Any class can be used. - - - As with parameter classes, the result classes must be a .NET - object or IDictionary instance. - - - - - extends - - The optional extends attribute allows the - result map to inherit all of the properties of the "super" resultMap - that it extends. - - - - groupBy - - The optional groupBy attribute specifies a list of .NET property names of the result object build by the resultMap. They are used to identify unique rows in the returned result set. Rows with equal values for the specified properties will only generate one result object. Use groupBy in combination with nested resultMaps to solve the N+1 query problem. Exemple : "Id" or "Desciption, Date".(see paragraph 3.5.13). - - - - - <constructor> element - - The <constructor> element must match the signature of one of the result class constructor. If specify, this element is used by MyBATIS to instanciate the result object. - - The <constructor> element holds one or more <argument> - child elements that map SQL resultsets to object argument constructor. - - - - Constructor element example - - <resultMap id="account-result-constructor" class="Account" > - <constructor> - <argument argumentName="id" column="Account_ID"/> - <argument argumentName="firstName" column="Account_FirstName"/> - <argument argumentName="lastName" column="Account_LastName"/> - </constructor> - <result property="EmailAddress" column="Account_Email" nullValue="no_email@provided.com"/> - <result property="BannerOption" column="Account_Banner_Option" dbType="Varchar" type="bool"/> - <result property="CartOption" column="Account_Cart_Option" typeHandler="HundredsBool"/> -</resultMap> - - - - - argumentName - - The argumentName attribute is the name of a - constructor argument of the result object that will be returned by the Mapped - Statement. - - - - column - - The column attribute value is the name of - the column in the result set from which the value will be used to - populate the argument. - - - - columnIndex - - As an optional (minimal) performance enhancement, the - columnIndex attribute value is the index of the - column in the ResultSet from which the value will be used to populate - the object argument. This is not likely needed in 99% of applications - and sacrifices maintainability and readability for speed. Some - providers may not realize any performance benefit, while others will - speed up dramatically. - - - - dbType - - The dbType attribute is used to explicitly specify the database - column type of the ResultSet column that will be used to populate the - argument. Although Result Maps do not have the same - difficulties with null values, specifying the type can be useful for - certain mapping types such as Date properties. Because an application - language has one Date value type and SQL databases may have many - (usually at least 3), specifying the date may become necessary in some - cases to ensure that dates (or other types) are set correctly. - Similarly, String types may be populated by a VarChar, Char or CLOB, - so specifying the type might be needed in those cases too. - - - - type - - The type attribute is used to explicitly specify the CLR - argument type. Normally this can be derived - from a argument through reflection, but certain mappings that use - objects such as a Map cannot provide the type to the framework. If the - attribute type is not set and the framework cannot otherwise determine - the type, the type is assumed to be Object. Section 6 details the CLR - types and available aliases that are supported by the - framework. - - - - resultMapping - - The resultMapping attribute can be set to - the name of another resultMap used to fill the argument. If the - resultMap is in an other mapping file, you must specified the fully - qualified name. - - - - nullValue - - The nullValue attribute can be set to any - valid value (based on argument type). The result element's - nullValue attribute is used to specify an - inbound null value replacement. What this means is that when the value - is detected in a query's result column, the corresponding object - argument will be set to the the nullValue - attribute's value. This allows you to use a "magic" null number in - your application for types that do not support null values (such as - int, double, - float). - - - - - select - - The select attribute is used to describe a relationship between - objects and to automatically load complex (i.e. user defined) property - types. The value of the statement property must be the name of another - mapped statement. The value of the database column (the column - attribute) that is defined in the same property element as this - statement attribute will be passed to the related mapped statement as - the parameter. More information about supported primitive types and - complex property mappings/relationships is discussed later in this - document. The lazyLoad attribute can be specified with the - select - - - - typeHandler - - The typeHandler attribute allows the use of a Custom Type - Handler (see the Custom Type Handler section). This allows you to - extend the DataMapper's capabilities in handling types that are - specific to your database provider, are not handled by your database - provider, or just happen to be a part of your application design. You - can create custom type handlers to deal with storing and retrieving - booleans and Guids from your database for example. - - - - <result> Elements - - The <resultMap> element holds one or more <result> - child elements that map SQL resultsets to object properties. - - - property - - The property attribute is the name of a - field or a property of the result object that will be returned by the Mapped - Statement. The name can be used more than once depending on the number - of times it is needed to populate the results. - - - - column - - The column attribute value is the name of - the column in the result set from which the value will be used to - populate the property. - - - - columnIndex - - As an optional (minimal) performance enhancement, the - columnIndex attribute value is the index of the - column in the ResultSet from which the value will be used to populate - the object property. This is not likely needed in 99% of applications - and sacrifices maintainability and readability for speed. Some - providers may not realize any performance benefit, while others will - speed up dramatically. - - - - dbType - - The dbType attribute is used to explicitly specify the database - column type of the ResultSet column that will be used to populate the - object property. Although Result Maps do not have the same - difficulties with null values, specifying the type can be useful for - certain mapping types such as Date properties. Because an application - language has one Date value type and SQL databases may have many - (usually at least 3), specifying the date may become necessary in some - cases to ensure that dates (or other types) are set correctly. - Similarly, String types may be populated by a VarChar, Char or CLOB, - so specifying the type might be needed in those cases too. - - - - type - - The type attribute is used to explicitly specify the CLR - property type of the parameter to be set. Normally this can be derived - from a property through reflection, but certain mappings that use - objects such as a Map cannot provide the type to the framework. If the - attribute type is not set and the framework cannot otherwise determine - the type, the type is assumed to be Object. Section 6 details the CLR - types and available aliases that are supported by the - framework. - - - - resultMapping - - The resultMapping attribute can be set to - the name of another resultMap used to fill the property. If the - resultMap is in an other mapping file, you must specified the fully - qualified name as : resultMapping="[namespace.sqlMap.]resultMappingId" - -resultMapping="Newspaper" -<!--resultMapping with a fully qualified name.--> -resultMapping="LineItem.LineItem" - - - - - nullValue - - The nullValue attribute can be set to any - valid value (based on property type). The result element's - nullValue attribute is used to specify an - inbound null value replacement. What this means is that when the value - is detected in a query's result column, the corresponding object - property will be set to the the nullValue - attribute's value. This allows you to use a "magic" null number in - your application for types that do not support null values (such as - int, double, - float). - - If your database has a NULLABLE column, but you want your - application to represent NULL with a constant value, you can specify - it in the Result Map as shown in Example 3.25. - - - Specifying a nullvalue attribute in a Result Map - - <resultMap id="get-product-result" class="product"> - <result property="id" column="PRD_ID"/> - <result property="description" column="PRD_DESCRIPTION"/> - <result property="subCode" column="PRD_SUB_CODE" nullValue="-9999"/> -</resultMap> - - - In Example 3.25, if PRD_SUB_CODE is read as NULL, then the - subCode property will be set to the value of -9999. This allows you to - use a primitive type in your .NET class to represent a NULLABLE column - in the database. Remember that if you want this to work for queries as - well as updates/inserts, you must also specify the nullValue in the - Parameter Map (discussed earlier in this document). - - - - select - - The select attribute is used to describe a relationship between - objects and to automatically load complex (i.e. user defined) property - types. The value of the statement property must be the name of another - mapped statement. The value of the database column (the column - attribute) that is defined in the same property element as this - statement attribute will be passed to the related mapped statement as - the parameter. More information about supported primitive types and - complex property mappings/relationships is discussed later in this - document. The lazyLoad attribute can be specified with the - select - - - - lazyLoad - - Use the lazyLoad attribute with the select attribute to indicate - whether or not the select statement's results should be lazy loaded. - This can provide a performance boost by delaying the loading of the - select statement's results until they are needed/accessed. - - Lazy loading is supported transparently for IList and IList<T> implementation. - Lazy loading is supported on strongly typed collection via Castle.DynamicProxy component. In this case you must set the listClass attribute and declare all methods/properties of the typed collection that you want to proxy as virtual. - Lazy loading is supported on concrete class via Castle.DynamicProxy component. In this case, you must declare all methods/properties of the class that you want to proxy as virtual. - - - - Sample of strongly typed collection used with proxy call - - -[C#] - -[Serializable] -public class LineItemCollection : CollectionBase -{ - public LineItemCollection() {} - - public virtual LineItem this[int index] - { - get { return (LineItem)List[index]; } - set { List[index] = value; } - } - - public virtual int Add(LineItem value) - { - return List.Add(value); - } - - public virtual void AddRange(LineItem[] value) - { - for (int i = 0; i < value.Length; i++) - { - Add(value[i]); - } - } - - public virtual void AddRange(LineItemCollection value) - { - for (int i = 0; i < value.Count; i++) - { - Add(value[i]); - } - } - - public virtual bool Contains(LineItem value) - { - return List.Contains(value); - } - - public virtual void CopyTo(LineItem[] array, int index) - { - List.CopyTo(array, index); - } - - public virtual int IndexOf(LineItem value) - { - return List.IndexOf(value); - } - - public virtual void Insert(int index, LineItem value) - { - List.Insert(index, value); - } - - public virtual void Remove(LineItem value) - { - List.Remove(value); - } - - public new virtual int Count - { - get {return this.List.Count;} - } -} - - - - Concrete class - - -[C#] - -[Serializable] -public class Person -{ -... - public virtual string Name - { - get {return _name;} - } -... -} - - - - - - typeHandler - - The typeHandler attribute allows the use of a Custom Type - Handler (see the Custom Type Handler section). This allows you to - extend the DataMapper's capabilities in handling types that are - specific to your database provider, are not handled by your database - provider, or just happen to be a part of your application design. You - can create custom type handlers to deal with storing and retrieving - booleans and Guids from your database for example. - - - - - Custom Type Handlers - - A custom type handler allows you to extend the DataMapper's - capabilities in handling types that are specific to your database - provider, not handled by your database provider, or just happen to be - part of your application design. The .NET DataMapper provides an - interface, MyBATISNet.DataMappers.TypeHandlers.ITypeHandlerCallback, for - you to use in implementing your custom type handler. - - - ITypeHandlerCallback interface - - using System.Data; -using MyBATISNet.DataMapper.Configuration.ParameterMapping; - - -namespace MyBATISNet.DataMapper.TypeHandlers -{ - public interface ITypeHandlerCallback - { - void SetParameter(IParameterSetter setter, object parameter); - - object GetResult(IResultGetter getter); - - object ValueOf(string s); - } -} - The SetParameter method allows you - to process a <statement> parameter's value before it is added as - an IDbCommand parameter. This enables you to do any necessary type - conversion and clean-up before the DataMapper gets to work. If needed, - you also have access to the underlying IDataParameter through the - setter.DataParameter property. - - The GetResult method allows you to - process a database result value right after it has been retrieved by the - DataMapper and before it is used in your resultClass, resultMap, or - listClass. If needed, you also have access to the underlying IDataReader - through the getter.DataReader property. - - The ValueOf method allows you to compare - a string representation of a value with one that you are expecting and - can handle appropriately. Typically, this is useful for translating a - null value, but if your application or database will not support a null - value, you can basically return the given string. When presented with an - unexpected value, you can throw an appropriate exception. - - One scenario that is familiar to .NET developers is the handling - of a Guid type/structure. Many providers do not handle Guid class - properties well, and developers may be faced with littering their domain - objects with an additional set of property accessors to translate Guid - properties into strings and strings into Guids. - - public class BudgetObjectCode -{ - private string _code; - private string _description; - private Guid _guidProperty; - -... - - public Guid GuidProperty { - get { return _guidProperty; } - set { _guidProperty = value; } - } - - public string GuidPropertyString { - get { return _guidProperty.ToString(); } - set { - if (value == null) { - _guidProperty = Guid.Empty; - } - else { - _guidProperty = new Guid(value.ToString()); - } - } - } -... -} - - We can use a custom type handler to clean up this domain class. - First, we define a string that will represent a null Guid value - (Guid.Empty). We can then use that constant in our ValueOf null value - comparison for the DataMapper to eventually use in setting our domain - class' Guid properties. Implementing the GetResult and SetParameter - methods is straightforward since we had been basically doing the same - translation in our domain class' GuidPropertyString accessors. - - - Guid String Type Handler - - using System; -using MyBATISNet.DataMapper.TypeHandlers; - -namespace BigApp.Common.TypeHandlers -{ - /// <summary> - /// GuidVarcharTypeHandlerCallback. - /// </summary> - public class GuidVarcharTypeHandlerCallback : ITypeHandlerCallback - { - private const string GUIDNULL = "00000000-0000-0000-0000-000000000000"; - - public object ValueOf(string nullValue) - { - if (GUIDNULL.Equals(nullValue)) - { - return Guid.Empty; - } - else - { - throw new Exception( - "Unexpected value " + nullValue + - " found where "+GUIDNULL+" was expected to represent a null value."); - } - } - - public object GetResult(IResultGetter getter) - { - try { - Guid result = new Guid(getter.Value.ToString()); - return result; - } - catch - { - throw new Exception( - "Unexpected value " + getter.Value.ToString() + - " found where a valid GUID string value was expected."); - } - } - - public void SetParameter(IParameterSetter setter, object parameter) - { - setter.Value = parameter.ToString(); - } - - } -} - - - With our custom type handler, we can clean up our domain class and - use the handler in our SqlMaps. To do that, we have two options in - configuring our custom type handler to be used by the DataMapper. We can - simply add it as a <typeAlias> and use it when needed in a - parameterMap or resultMap. - - - Aliased Custom Type Handler in a SqlMap.xml file - - <alias> - <typeAlias alias="GuidVarchar" - type="BigApp.Common.TypeHandlers.GuidVarcharTypeHandlerCallback, - BigApp.Common"/> -</alias> - -<resultMaps> - <resultMap id="boc-result" class="BudgetObjectCode"> - <result property="Code" column="BOC_CODE" dbType="Varchar2"/> - <result property="Description" column="BOC_DESC" dbType="Varchar2"/> - <result property="GuidProperty" column="BOC_GUID" typeHandler="GuidVarchar"/> - </resultMap> -</resultMaps> - - - Or we can specify it as a basic <typeHandler> for all Guid - types mapped in our SqlMap files. <typeHandler> in - SqlMap.config - - - <typeHandler> in SqlMap.config - - [Our SqlMap.config] -<alias> - <typeAlias alias="GuidVarchar" - type="BigApp.Common.TypeHandlers.GuidVarcharTypeHandlerCallback, - BigApp.Common"/> -</alias> - -<typeHandlers> - <typeHandler type="guid" dbType="Varchar2" callback="GuidVarchar"/> -</typeHandlers> - - -[One of our SqlMap.xml files] -<parameterMaps> - <parameterMap id="boc-params"> - <parameter property="Code" dbType="Varchar2" size="10"/> - <parameter property="Description" dbType="Varchar2" size="100"/> - <parameter property="GuidProperty" dbType="Varchar2" type="guid"/> - </parameterMap> -</parameterMaps> - -<resultMaps> - <resultMap id="boc-result" class="BudgetObjectCode"> - <result property="Code" column="BOC_CODE" dbType="Varchar2"/> - <result property="Description" column="BOC_DESC" dbType="Varchar2"/> - <result property="GuidProperty" column="BOC_GUID" dbType="Varchar2" type="guid"/> - </resultMap> -</resultMaps> - - - - - Inheritance Mapping - - The MyBATIS DataMapper supports the implementation of - object-oriented inheritance (subclassing) in your object model. There - are several developer options for mapping entity classes and subclasses - to database results: - - resultMap for each class - - - - resultMap with submaps for a class hierarchy - - - - resultMap with extended resultMaps for each subclass - - You can use the most efficient mapping strategies from - a SQL and query performance perspective when using the inheritance - mappings of the DataMapper. To implement an inheritance mapping, the - resultMap must define one or more columns in your query's resultset that - will serve to identify which resultMap should be used to map each result - record to a specific subclass. In many cases, you will use one column - value for the DataMapper to use in identifying the proper resultMap and - subclass. This column is known as a discriminator. - - For example, we have a table defined in a database that contains - Document records. There are five table columns used to store Document - IDs, Titles, Types, PageNumbers, and Cities. Perhaps this table belongs - to a legacy database, and we need to create an application using this - table with a domain model that defines a class hierarchy of different - types of Documents. Or perhaps we are creating a new application and - database and just want to persist the data found in a set of related - classes into one table. In either case, the DataMapper's inheritance - mapping feature can help. - - // Database table Document -CREATE TABLE [Documents] ( - [Document_ID] [int] NOT NULL , - [Document_Title] [varchar] (32) NULL , - [Document_Type] [varchar] (32) NULL , - [Document_PageNumber] [int] NULL , - [Document_City] [varchar] (32) NULL -) - - To illustrate this, let's take a look at a few example classes - shown below that have a relationship through inheritance and whose - properties can be persisted into our Documents table. First, we have a - base Document class that has Id and Title properties. Next, we have a - Book class that inherits from Document and contains an additional - property called PageNumber. Last, we have a Newspaper class that also - inherits from Document and contains a City property. - - - Documents, Books, and Newspapers! - - // C# class -public class Document -{ - private int _id = -1; - private string _title = string.Empty; - - public int Id - { - get { return _id; } - set { _id = value; } - } - - public string Title - { - get { return _title; } - set { _title = value; } - } -} - -public class Book : Document -{ - private int _pageNumber = -1; - - public int PageNumber - { - get { return _pageNumber; } - set { _pageNumber = value; } - } -} - -public class Newspaper : Document -{ - private string _city = string.Empty; - - public string City - { - get { return _city; } - set { _city = value; } - } -} - Now that we have our classes and database table, we can - start working on our mappings. We can create one <select> - statement that returns all columns in the table. To help the DataMapper - discriminate between the different Document records, we're going to - indicate that the Document_Type column holds values that will - distinguish one record from another for mapping the results into our - class hierarchy. - - // Document mapping file -<select id="GetAllDocument" resultMap="document"> - select - Document_Id, Document_Title, Document_Type, - Document_PageNumber, Document_City - from Documents - order by Document_Type, Document_Id -</select> - -<resultMap id="document" class="Document"> - <result property="Id" column="Document_ID"/> - <result property="Title" column="Document_Title"/> - <discriminator column="Document_Type" type="string"/> - <subMap value="Book" resultMapping="book"/> - <subMap value="Newspaper" resultMapping="newspaper"/> -</resultMap> - -<resultMap id="book" class="Book" extends="document"> - <property="PageNumber" column="Document_PageNumber"/> -</resultMap> - -<resultMap id="newspaper" class="Newspaper" extends="document"> - <property="City" column="Document_City"/> -</resultMap> - - The DataMapper compares the data found in the discriminator column - to the different <submap> values using the column value's string - equivalence. Based on this string value, MyBATIS DataMapper will use the - resultMap named "Book" or "Newspaper" as defined in the <submap> - elements or it will use the "super" resultMap "Document" if neither of - the submap values satisfy the comparison. With these resultMaps, we can - implement an object-oriented inheritance mapping to our database - table. - - If you want to use custom logic, you can use the typeHandler - attribute of the <discriminator> element to specify a custom type - handler for the discriminator column. - - - Complex disciminator usage with Custom Type Handler - - <alias> - <typeAlias alias="CustomInheritance" - type="MyBATISNet.DataMapper.Test.Domain.CustomInheritance, MyBATISNet.DataMapper.Test"/> -</alias> - -<resultMaps> - <resultMap id="document-custom-formula" class="Document"> - <result property="Id" column="Document_ID"/> - <result property="Title" column="Document_Title"/> - <discriminator column="Document_Type" typeHandler="CustomInheritance"/> - <subMap value="Book" resultMapping="book"/> - <subMap value="Newspaper" resultMapping="newspaper"/> - </resultMap> -</resultMaps> - - - The value of the typeHandler attribute specifies which of our - classes implements the ITypeHandlerCallback interface. This interface - furnishes a GetResult method for coding custom logic to read the column - result value and return a value for the DataMapper to use in its - comparison to the resultMap's defined <submap> values. - - - Example ITypeHandlerCallback interface implementation - - public class CustomInheritance : ITypeHandlerCallback -{ - #region ITypeHandlerCallback members - - public object ValueOf(string nullValue) - { - throw new NotImplementedException(); - } - - public object GetResult(IResultGetter getter) - { - string type = getter.Value.ToString(); - - if (type=="Monograph" || type=="Book") - { - return "Book"; - } - else if (type=="Tabloid" || type=="Broadsheet" || type=="Newspaper") - { - return "Newspaper"; - } - else - { - return "Document"; - } - - } - - public void SetParameter(IParameterSetter setter, object parameter) - { - throw new NotImplementedException(); - } - #endregion -} - - - - - Implicit Result Maps - - If the columns returned by a SQL statement match the result - object, you may not need an explicit Result Map. If you have control - over the relational schema, you might be able to name the columns so - they also work as property names. In Example 3.33, the column names and - property names already match, so a result map is not needed. - A Mapped Statement that doesn't need a Result Map - - <statement id="selectProduct" resultClass="Product"> - select - id, - description - from PRODUCT - where id = #value# -</statement> - - - Another way to skip a result map is to use column aliasing to make - the column names match the properties names, as shown in Example - 3.34. - - - A Mapped Statement using column alaising instead of a Result - Map - - <statement id="selectProduct" resultClass="Product"> - select - PRD_ID as id, - PRD_DESCRIPTION as description - from PRODUCT - where PRD_ID = #value# -</statement> - - - Of course, these techniques will not work if you need to specify a - column type, a null value, or any other property attributes. - - Case sensitivity can also be an issue with implicit result maps. - Conceivably, you could have an object with a "FirstName" property and a - "Firstname" property. When MyBATIS tries to match property and column, - the heurstic is case-insensitive and we cannot guarantee which property - would match. (Of course, very few developers would have two property - names that were so simiilar.) - - A final issue is that there is some performance overhead when - MyBATIS has to map the column and property names automatically. The - difference can be dramatic if using a third-party NET database provider - with poor support for ResultSetMetaData. - - - - Primitive Results (i.e. String, Integer, Boolean) - - Many times, we don't need to return an object with multiple - properties. We just need a String, Integer, Boolean, and so forth. If - you don't need to populate an object, MyBATIS can return one of the - primitive types instead. If you just need the value, you can use a - standard type as a result class, as shown in Example 3.35. - Selecting a standard type - - <select id="selectProductCount" resultClass="System.Int32"> - select count(1) - from PRODUCT -</select> - - - If need be, you can refer to the standard type using a marker - token, "value", as shown by Example 3.36. - - - Loading a simple list of product descriptions - - <resultMap id="select-product-result" resultClass="System.String"> - <result property="value" column="PRD_DESCRIPTION"/> -</resultMap> - - - - - Maps with ResultMaps - - Instead of a rich object, sometimes all you might need is a simple - key/value list of the data, where each property is an entry on the list. - If so, Result Maps can populate a IDictionary instance as easily as - property objects. The syntax for using a IDictionary is identical to the - rich object syntax. As shown in Example 3.37, only the result object - changes. - - - Result Maps can use generic "entry-type" objects - - <resultMap id="select-product-result" class="HashTable"> - <result property="id" column="PRD_ID"/> - <result property="code" column="PRD_CODE"/> - <result property="description" column="PRD_DESCRIPTION"/> - <result property="suggestedPrice" column="PRD_SUGGESTED_PRICE"/> -</resultMap> - - - In Example 3.37, an instance of HashTable would be created for - each row in the result set and populated with the Product data. The - property name attributes, like id, - code, and so forth, would be the key of the - entry, and the value of the mapped columns would be the value of the - entry. - - As shown in Example 3.38, you can also use an implicit Result Map - with a IDictionary type. - - - Implicit Result Maps can use "entry-type" objects too - - <statement id="selectProductCount" resultClass="HashTable"> - select * from PRODUCT -</statement> - - - What set of entries is returned by Example xx depends on what - columns are in the result set. If the set of column changes (because - columns are added or removed), the new set of entries would - automatically be returned. - - - Certain providers may return column names in upper case or - lower case format. When accessing values with such a provider, you - will have to pass the Hashtable or HashMap key name in the expected - case. - - - - - Complex Properties - - In a relational database, one table will often refer to another. - Likewise, some of your business objects may include another object or - list of objects. Types that nest other types are called "complex types". - You may not want a statement to return a simple type, but a fully-formed - compex type. - - In the database, a related column is usually represented via a 1:1 - relationship, or a 1:M relationship where the class that holds the - complex property is from the "many side" of the relationship and the - property itself is from the "one side" of the relationship. The column - returned from the database will not be the property we want; it is a key - to be used in another query. - - From the framework's perspective, the problem is not so much - loading a complex type, but loading each "complex property". To solve - this problem, you can specify in the Result Map a statement to run to - load a given property. In Example 3.39, the "category" property of the - "select-product-result" element is a complex property. - A Result Map with a Complex Property - - -<resultMaps> - <resultMap id="select-product-result" class="product"> - <result property="id" column="PRD_ID"/> - <result property="description" column="PRD_DESCRIPTION"/> - <result property="category" column="PRD_CAT_ID" select="selectCategory"/> - </resultMap> - - <resultMap id="select-category-result" class="category"> - <result property="id" column="CAT_ID"/> - <result property="description" column="CAT_DESCRIPTION"/> - </resultMap> -</resultMaps> - -<statements> - <select id="selectProduct" parameterClass="int" resultMap="select-product-result"> - select * from PRODUCT where PRD_ID = #value# - </select> - - <select id="selectCategory" parameterClass="int" resultMap="select-category-result"> - select * from CATEGORY where CAT_ID = #value# - </select> -</statements> - - In Example 3.39, the framework will use the - "selectCategory" statement to populate the "category" property. The - value of each category is passed to the "selectCategory" statement, and - the object returned is set to the category property. When the process - completes, each Product instance will have the the appropriate category - object instance set. - - - - Avoiding N+1 Selects (1:1) - - A problem with Example 3.39 may be that whenever you load a - Product, two statements execute: one for the Product and one for the - Category. For a single Product, this issue may seem trivial. But if you - load 10 products, then 11 statements execute. For 100 Products, instead - of one statement product statement executing, a total of 101 statements - execute. The number of statements executing for Example 3.40 will always - be N+1: 100+1=101. - - - N+1 Selects (1:1) - - -<resultMaps> - <resultMap id="select-product-result" class="product"> - <result property="id" column="PRD_ID"/> - <result property="description" column="PRD_DESCRIPTION"/> - <result property="category" column="PRD_CAT_ID" select="selectCategory"/> - </resultMap> - - <resultMap id="select-category-result" class="category"> - <result property="id" column="CAT_ID"/> - <result property="description" column="CAT_DESCRIPTION"/> - </resultMap> -</resultMaps> - -<statements> - <!-- This statement executes 1 time --> - <select id="selectProducts" parameterClass="int" resultMap="select-product-result"> - select * from PRODUCT - </select> - - <!-- This statement executes N times (once for each product returned above) --> - <select id="selectCategory" parameterClass="int" resultMap="select-category-result"> - select * from CATEGORY where CAT_ID = #value# - </select> -</statements> - - - - One way to mitigate the problem is to cache the "selectCategory" - statement . We might have a hundred products, but there might only be - five categories. Instead of running a SQL query or stored procedure, the - framework will return the category object from it cache. A 101 - statements would still run, but they would not be hitting the database. - (See Section 3.8 for more about caches.) - - Another solution is to use a standard SQL join to return the - columns you need from the another table. A join can bring all the - columns we need over from the database in a single query. When you have - a nested object, you can reference nested properties using a dotted - notation, like "category.description". - - Example 3.41 solves the same problem as Example 3.40, but uses a - join instead of nested properties. - - - Resolving complex properties with a join - - -<resultMaps> - <resultMap id="select-product-result" class="product"> - <result property="id" column="PRD_ID"/> - <result property="description" column="PRD_DESCRIPTION"/> - <result property="category" resultMapping="Category.CategoryResult" /> - </resultMap> -</resultMaps> - -<statements> - <statement id="selectProduct" parameterClass="int" resultMap="select-product-result"> - select * - from PRODUCT, CATEGORY - where PRD_CAT_ID=CAT_ID - and PRD_ID = #value# - </statement> -</statements> - - - - - Lazy Loading vs. Joins (1:1) - - It's important to note that using a join is not always better. - If you are in a situation where it is rare to access the related - object (e.g. the category property of the Product class) then it might - actually be faster to avoid the join and the unnecessary loading of - all category properties. This is especially true for database designs - that involve outer joins or nullable and/or non-indexed columns. In - these situations it might be better to use the sub-select solution - with lazy loading enabled. The general rule of thumb is: use the join - if you're more likely going to access the associated properties than - not. Otherwise, only use it if lazy loading is not an option. - - If you're having trouble deciding which way to go, don't worry. - No matter which way you go, you can always change it without impacting - your application source code. Example 3.40 and 3.41 result in exactly - the same object graph and are loaded using the exact same method call - from the application. The only consideration is that if you were to - enable caching, then the using the separate select (not the join) - solution could result in a cached instance being returned. But more - often than not, that won't cause a problem (your application shouldn't - be dependent on instance level equality i.e. "=="). - - - - - Complex Collection Properties - - It is also possible to load properties that represent lists of - complex objects. In the database the data would be represented by a M:M - relationship, or a 1:M relationship where the class containing the list - is on the "one side" of the relationship and the objects in the list are - on the "many side". To load an IList of objects, there is no change to - the statement (see example above). The only difference required to cause - the MyBATIS DataMapper framework to load the property as an IList is that - the property on the business object must be of type - System.Collections.IList. For example, if a Category has a IList of - Product instances, the mapping would look like this (assuming Category - has a property called "ProductList" of - System.Collections.IList.): - - - Mapping that creates a list of complex objects - - -<resultMaps> - - <resultMap id="select-category-result" class="Category"> - <result property="Id" column="CAT_ID"/> - <result property="Description" column="CAT_DESCRIPTION"/> - <result property="ProductList" column="CAT_ID" select="selectProductsByCatId"/> - </resultMap> - - <resultMap id="select-product-result" class="Product"> - <result property="Id" column="PRD_ID"/> - <result property="Description" column="PRD_DESCRIPTION"/> - </resultMap> -<resultMaps> - -<statements> - - <statement id="selectCategory" parameterClass="int" resultMap="select-category-result"> - select * from CATEGORY where CAT_ID = #value# - </statement> - - <statement id="selectProductsByCatId" parameterClass="int" resultMap="select-product-result"> - select * from PRODUCT where PRD_CAT_ID = #value# - </statement> -</statements> - - - - - Avoiding N+1 Select Lists (1:M and M:N) - - This is similar to the 1:1 situation above, but is of even greater - concern due to the potentially large amount of data involved. The - problem with the solution above is that whenever you load a Category, - two SQL statements are actually being run (one for the Category and one - for the list of associated Products). This problem seems trivial when - loading a single Category, but if you were to run a query that loaded - ten (10) Categories, a separate query would be run for each Category to - load its associated list of Products. This results in eleven (11) - queries total: one for the list of Categories and one for each Category - returned to load each related list of Products (N+1 or in this case - 10+1=11). To make this situation worse, we're dealing with potentially - large lists of data. - - - N+1 Select Lists (1:M and M:N), example of problem - - -<resultMaps> - - <resultMap id="select-category-result" class="Category"> - <result property="Id" column="CAT_ID"/> - <result property="Description" column="CAT_DESCRIPTION"/> - <result property="ProductList" column="CAT_ID" select="selectProductsByCatId"/> - </resultMap> - - <resultMap id="Product-result" class="Product"> - <result property="Id" column="PRD_ID"/> - <result property="Description" column="PRD_DESCRIPTION"/> - </resultMap> -<resultMaps> - -<statements> - - <!-- This statement executes 1 time --> - <statement id="selectCategory" parameterClass="int" resultMap="select-category-result"> - select * from CATEGORY where CAT_ID = #value# - </statement> - - <!-- This statement executes N times (once for each category returned above) - and returns a list of Products (1:M) --> - <statement id="selectProductsByCatId" parameterClass="int" resultMap="select-product-result"> - select * from PRODUCT where PRD_CAT_ID = #value# - </statement> -</statements> - - - MyBATIS fully solves the N+1 selects problem. Here is the same example solved : - - - N+1 Select Lists (1:M and M:N) resolution - - -<sqlMap namespace="ProductCategory"> -<resultMaps> - - <resultMap id="Category-result" class="Category" groupBy="Id"> - <result property="Id" column="CAT_ID"/> - <result property="Description" column="CAT_DESCRIPTION"/> - <result property="ProductList" resultMapping="ProductCategory.Product-result"/> - </resultMap> - - <resultMap id="Product-result" class="Product"> - <result property="Id" column="PRD_ID"/> - <result property="Description" column="PRD_DESCRIPTION"/> - </resultMap> -<resultMaps> - -<statements> - - <!-- This statement executes 1 time --> - <statement id="SelectCategory" parameterClass="int" resultMap="Category-result"> - select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION - from CATEGORY C - left outer join PRODUCT P - on C.CAT_ID = P.PRD_CAT_ID - where CAT_ID = #value# - </statement> - - - - -When you call... -IList myList = sqlMap.QueryForList("SelectCategory", 1002); -...the main query is executed, and the results are stored in the myList variable containing .NET type -"Category" element . Each object in that List will have a "ProductList" property that is also a List -populated from the same query, but using the "Product-result" result map to populate the element in the child -list. So, you end up with a list containing sub-lists, and only one database query is executed. -The important items here are the... -groupBy="Id" -...attribute and the... -<result property="ProductList" resultMapping="ProductCategory.Product-result"/> -...property mapping in the "Category-result" result map. One other important detail is that the result mapping -for the ProductList property is namespace aware - had it been simply "Product-result" it would not work. -Using this approach, you can solve any N+1 problem of any depth or breadth. - - - Lazy Loading vs. Joins (1:M and M:N) - - As with the 1:1 situation described previously, it's important - to note that using a join is not always better. This is even more true - for collection properties than it was for individual value properties - due to the greater amount of data. If you are in a situation where it - is rare to access the related object (e.g. the ProductList property of - the Category class) then it might actually be faster to avoid the join - and the unnecessary loading of the list of products. This is - especially true for database designs that involve outer joins or - nullable and/or non-indexed columns. In these situations it might be - better to use the sub-select solution with the lazy loading. The - general rule of thumb is: use the join if you're more likely going to - access the associated properties than not. Otherwise, only use it if - lazy loading is not an option. - - As mentioned earlier, if you're having trouble deciding which - way to go, don't worry. No matter which way you go, you can always - change it without impacting your .NET code. The two examples above - would result in exactly the same object graph and are loaded using the - exact same method call. The only consideration is that if you were to - enable caching, then the using the separate select (not the join) - solution could result in a cached instance being returned. But more - often than not, that won't cause a problem (your application should - not be dependent on instance level equality i.e. "=="). - - - - - Composite Keys or Multiple Complex Parameters Properties - - You might have noticed that in the above examples there is only a - single key being used as specified in the resultMap by the column - attribute. This would suggest that only a single column can be - associated to a related mapped statement. However, there is an alternate - syntax that allows multiple columns to be passed to the related mapped - statement. This comes in handy for situations where a composite key - relationship exists, or even if you simply want to use a parameter of - some name other than #value#. The alternate syntax for the column - attribute is simply param1=column1, param2=column2, …, paramN=columnN. - Consider the example below where the PAYMENT table is keyed by both - Customer ID and Order ID: - - - Mapping a composite key - - -<resultMaps> - <resultMap id="select-order-result" class="order"> - <result property="id" column="ORD_ID"/> - <result property="customerId" column="ORD_CST_ID"/> - ... - <result property="payments" column="itemId=ORD_ID, custId=ORD_CST_ID" - select="selectOrderPayments"/> - </resultMap> -<resultMaps> - -<statements> - - <statement id="selectOrderPayments" resultMap="select-payment-result"> - select * from PAYMENT - where PAY_ORD_ID = #itemId# - and PAY_CST_ID = #custId# - </statement> -</statements> - - - Optionally you can just specify the column names as long as - they're in the same order as the parameters. For example: - - - ORD_ID, ORD_CST_ID - - - As usual, this is a slight performance gain with an impact on - readability and maintainability. - - Important! Currently the MyBATIS DataMapper framework does not - automatically resolve circular relationships. Be aware of this when - implementing parent/child relationships (trees). An easy workaround is - to simply define a second result map for one of the cases that does not - load the parent object (or vice versa), or use a join as described in - the "N+1 avoidance" solutions. - Result Map names are always local to the Data Map definition - file that they are defined in. You can refer to a Result Map in - another Data Map definition file by prefixing the name of the Result - Map with the namespace of the SqlMap set in the <sqlMap> root - element. - - - - - - Supported Types for Parameter Maps and Result Maps - - Table 3.4 shows the basic Supported Types for Parameter Maps and - Result Maps for .NET. You can extend the framework's support for - additional types by using a Custom Type Handler. - - - Nuallable type from .NET 2.0 are fully supported by MyBATIS.NET. - - - - - Supported Types for Parameter Maps and Result Maps - (.NET) - - - - - CLR Type - - Object/Map Property Mapping - - Result Class/Parameter Class** - - Type Alias** - - - - - - System.ArrayList - - Yes - - Yes - - list - - - - System.Boolean - - Yes - - Yes - - Boolean, bool - - - - System.Byte - - Yes - - Yes - - Byte, byte - - - - System.Char - - Yes - - Yes - - Char, char - - - - System.DateTime - - Yes - - Yes - - dateTime, date - - - - System.Decimal - - Yes - - Yes - - Decimal, decimal - - - - System.Double - - Yes - - Yes - - Double, double - - - - System.Guid - - Yes - - Yes - - guid - - - - System.Hashtable - - Yes - - Yes - - map, hashmap, hashtable - - - - System.Int16 - - Yes - - Yes - - Int16, short, Short - - - - System.Int32 - - Yes - - Yes - - Int32, int, Int, integer, Integer - - - - System.Int64 - - Yes - - Yes - - Int64, long, Long - - - - System.SByte - - Yes - - Yes - - SByte, sbyte - - - - System.Single - - Yes - - Yes - - Float, float, Single, single - - - - System.String - - Yes - - Yes - - String, string - - - - System.TimeSpan - - Yes - - Yes - - N/A - - - - System.UInt16 - - Yes - - Yes - - Short, short - - - - System.UInt32 - - Yes - - Yes - - Uint, uint - - - - System.UInt64 - - Yes - - Yes - - Ulong, ulong - - - - Nullable<bool> - - Yes - - Yes - - bool? - - - Nullable<byte> - - Yes - - Yes - - byte? - - - Nullable<char> - - Yes - - Yes - - char? - - - Nullable<DateTime> - - Yes - - Yes - - DateTime? - - - Nullable<decimal> - - Yes - - Yes - - decimal? - - - Nullable<double> - - Yes - - Yes - - double? - - - Nullable<Int16> - - Yes - - Yes - - Int16? - - - Nullable<Int32> - - Yes - - Yes - - Int32? - - - Nullable<Int64> - - Yes - - Yes - - Int64? - - - Nullable<SByte> - - Yes - - Yes - - SByte? - - - Nullable<Single> - - Yes - - Yes - - Single? - - - Nullable<UInt16> - - Yes - - Yes - - UInt16? - - - Nullable<UInt32> - - Yes - - Yes - - UInt32? - - - Nullable<UInt64> - - Yes - - Yes - - UInt64? - - - -
    -
    - - - Supported database types for Parameter Maps and Result Maps - - Table 3.5 shows the basic Supported DbTypes for Parameter Maps and - Result Maps for .NET that come with the System.Data and - System.Data.OracleClient assemblies. See the .NET Developer Guide section - on configuring the DataMapper to work with your provider's DbTypes. - - - Nuallable type from .NET 2.0 are fully supported by MyBATIS.NET. - - - The .NET Framework data provider type of a Parameter object is - inferred from the .NET Framework type of the Value of the Parameter - object, or from the DbType of the Parameter object. The following table - shows the inferred Parameter type based on the object passed as the - Parameter value or the specified DbType. You may specify the type of a - Parameter in a generic fashion by setting the DbType property of the - Parameter object to a particular System.Data.DbType specific to your - database. - Supported DbTypes for Parameter Maps and Result Maps - (.NET) - - - - - CLR Type - - MyBATIS support - - SqlDbType - - OleDbType - - OdbcType - - OracleType - - - - - - Byte[] - - Yes - - Binary, Image, VarBinary - - Binary, VarBinary - - Binary, Image, VarBinary - - Raw - - - - Boolean, bool? - - Yes - - Bit - - Boolean - - Bit - - Byte - - - - Byte, byte? - - Yes - - TinyInt - - - - - TinyInt - - Byte - - - - DateTime, DateTime? - - Yes - - DateTime, SmallDateTime - - Date - - Date, DateTime, SmallDateTime, Time - - DateTime - - - - char, char? - - Yes - - Not supported - - Char - - Char - - Byte - - - - Decimal, decimal? - - Yes - - Decimal, Money, SmallMoney - - Decimal, Currency, Numeric - - Decimal, Numeric - - Number - - - - Double, double? - - Yes - - Float - - Double - - Double - - Double - - - - Guid, Guid? - - Yes - - UniqueIdentifier - - Guid - - UniqueIdentifier - - Raw - - - - Int16, Int16? - - Yes - - SmallInt - - SmallIInt - - SmallInt - - Int16 - - - - Int32, Int32? - - Yes - - Int - - Integer - - Int - - Int32 - - - - Int64, Int64? - - Yes - - BigInt - - BigInt - - BigInt - - Number - - - - Single, Single? - - Yes - - Real - - Single - - Real - - Float - - - - String - - Yes - - Char, Nchar, NVarchar, Text, VarChar - - Char, VarChar - - Char, NChar, NText, NVarChar, Text, VarChar - - NVarChar, VarChar - - - - TimeSpan - - No - - Not supported - - DBTime - - Time - - DateTime - - - - UInt16, UInt16? - - yes - - Int - - - - - - - - UInt16 - - - - UInt32, UInt32? - - yes - - Decimal - - - - - - - - UInt32 - - - - UInt64, UInt64? - - yes - - Decimal - - - - - - - - Number - - - -
    -
    - - - Cache Models - - Some values in a database are know to change slower than others. To - improve performance, many developers like to cache often-used data to - avoid making unnecessary trips back to the database. MyBATIS provides its - own caching system, that you configure through a <cacheModel> - element. - - The results from a query Mapped Statement can be cached simply by - specifying the cacheModel parameter in the statement tag (seen above). A - cache model is a configured cache that is defined within your DataMapper - configuration file. Cache models are configured using the cacheModel - element as follows: - - - Configuation a cache using the Cache Model element - - <cacheModel id="product-cache" implementation="LRU" readOnly="true" serialize="false"> - <flushInterval hours="24"/> - <flushOnExecute statement="insertProduct"/> - <flushOnExecute statement="updateProduct"/> - <flushOnExecute statement="deleteProduct"/> - <property name="CacheSize" value="100"/> -</cacheModel> - - - The cache model above will create an instance of a cache named - "product-cache" that uses a Least Recently Used (LRU) implementation. The - value of the type attribute is either a fully qualified class name, or an - alias for one of the included implementations (see below). Based on the - flush elements specified within the cache model, this cache will be - flushed every 24 hours. There can be only one flush interval element and - it can be set using hours, minutes, seconds or milliseconds. In addition - the cache will be flushed whenever the insertProduct, updateProduct, or - deleteProduct mapped statements are executed. There can be any number of - "flush on execute" elements specified for a cache. Some cache - implementations may need additional properties, such as the ‘cache-size' - property demonstrated above. In the case of the LRU cache, the size - determines the number of entries to store in the cache. Once a cache model - is configured, you can specify the cache model to be used by a mapped - statement, for example: - - - Specifying a Cache Model from a Mapped Statement - - <statement id="getProductList" cacheModel="product-cache"> - select * from PRODUCT where PRD_CAT_ID = #value# -</statement> - - - - - - Read-Only vs. Read/Write - - The framework supports both read-only and read/write caches. Read-only caches are shared among all users and therefore offer greater performance benefit. However, objects read from a read-only cache should not be modified. Instead, a new object should be read from the database (or a read/write cache) for updating. On the other hand, if there is an intention to use objects for retrieval and modification, a read/write cache is recommended (i.e. required). To use a read-only cache, set readOnly="true" on the cache model element. To use a read/write cache, set readOnly="false". The default is read-only (true). - - - - - - Serializable Read/Write Caches - - As you may agree, caching per-session as described above may offer little benefit to global application performance. Another type of read/write cache that can offer a performance benefit to the entire application (i.e. not just per session) is a serializable read/write cache. This cache will return different instances (copies) of the cached object to each session. Therefore each session can safely modify the instance returned. Realize the difference in semantics here, usually you would expect the same instance to be returned from a cache, but in this case you'll get a different one. Also note that every object stored by a serializable cache must be serializable. This means that you will have difficulty using both lazy loading features combined with a serializable cache, because lazy proxies are not serializable. The best way to figure out what combination of caching, lazy loading and table joining is simply to try it out. To use a serializable cache, set readOnly="false" and serialize="true". By default cache models are read-only and non-serializable. Read-only caches will not be serialized (there's no benefit). - - - - Cache Implementation - - The cache model uses a pluggable framework for supporting - different types of caches. The choice of cache is specified in the - "implementation" attribute of the cacheModel element as discussed above. - The class name specified must be an implementation of the - ICacheController interface, or one of the three aliases discussed below. - Further configuration parameters can be passed to the implementation via - the property elements contained within the body of the cacheModel. - Currently there are 3 implementations included with the .NET - distribution. These are as follows: - - - - "MEMORY" - - The MEMORY cache implementation uses reference types to manage the - cache behavior. That is, the garbage collector effectively determines - what stays in the cache or otherwise. The MEMORY cache is a good choice - for applications that don't have an identifiable pattern of object - reuse, or applications where memory is scarce. - - The MEMORY implementation is configured as follows: - - - Configuring a memory-type cache - - <cacheModel id="product-cache" implementation="MEMORY" > - <flushInterval hours="24"/> - <flushOnExecute statement="insertProduct"/> - <flushOnExecute statement="updateProduct"/> - <flushOnExecute statement="deleteProduct"/> - <property name="Type" value="WEAK"/> -</cacheModel> - - - Only a single property is recognized by the MEMORY cache - implementation. This property, named 'reference-type' must be set to a - value of STRONG, SOFT, or WEAK. - - The following table describes the different reference types that - can be used for a MEMORY cache. - Reference types that can be used for a MEMORY cache - - - - - Type - - Description - - - - - - WEAK (default) - - This reference type is probably the best choice in most - cases and is the default if the reference-type is not - specified. It will increase performance for popular results, - but it will absolutely release the memory to be used in - allocating other objects, assuming that the results are not - currently in use. - - - - SOFT (currently Java only) - - This reference type will reduce the likelihood of - running out of memory in case the results are not currently in - use and the memory is needed for other objects. However, this - is not the most aggressive reference type in that regard and - memory still might be allocated and made unavailable for more - important objects. - - - - STRONG - - This reference type will guarantee that the results - stay in memory until the cache is explicitly flushed (e.g. by - time interval or flush on execute). This is ideal for results - that are: 1) very small, 2) absolutely static, and 3) used - very often. The advantage is that performance will be very - good for this particular query. The disadvantage is that if - the memory used by these results is needed, then it will not - be released to make room for other objects (possibly more - important objects). - - - -
    -
    - - - "LRU" - - The LRU cache implementation uses an Least Recently Used algorithm - to determines how objects are automatically removed from the cache. When - the cache becomes over full, the object that was accessed least recently - will be removed from the cache. This way, if there is a particular - object that is often referred to, it will stay in the cache with the - least chance of being removed. The LRU cache makes a good choice for - applications that have patterns of usage where certain objects may be - popular to one or more users over a longer period of time (e.g. - navigating back and forth between paginated lists, popular search keys - etc.). - - The LRU implementation is configured as follows: - - - Configuring a LRU type cache - - <cacheModel id="product-cache" implementation="LRU" > - <flushInterval hours="24"/> - <flushOnExecute statement="insertProduct"/> - <flushOnExecute statement="updateProduct"/> - <flushOnExecute statement="deleteProduct"/> - <property name="CacheSize" value="100"/> -</cacheModel> - - - Only a single property is recognized by the LRU cache - implementation. This property, named CacheSize must be set to an integer - value representing the maximum number of objects to hold in the cache at - once. An important thing to remember here is that an object can be - anything from a single String instance to an ArrayList of object. So - take care not to store too much in your cache and risk running out of - memory! - - - - "FIFO" - - The FIFO cache implementation uses an First In First Out algorithm - to determines how objects are automatically removed from the cache. When - the cache becomes over full, the oldest object will be removed from the - cache. The FIFO cache is good for usage patterns where a particular - query will be referenced a few times in quick succession, but then - possibly not for some time later. - - The FIFO implementation is configured as follows: - - - Configuring a FIFO type cache - - <cacheModel id="product-cache" implementation="FIFO" > - <flushInterval hours="24"/> - <flushOnExecute statement="insertProduct"/> - <flushOnExecute statement="updateProduct"/> - <flushOnExecute statement="deleteProduct"/> - <property name="CacheSize" value="100"/> -</cacheModel> - - - Only a single property is recognized by the FIFO cache - implementation. This property, named CacheSize must be set to an integer - value representing the maximum number of objects to hold in the cache at - once. An important thing to remember here is that an object can be - anything from a single String instance to an ArrayList of object. So - take care not to store too much in your cache and risk running out of - memory - -
    - - - Dynamic SQL - - A very common problem with working directly with ADO is dynamic SQL. - It is normally very difficult to work with SQL statements that change not - only the values of parameters, but which parameters and columns are - included at all. The typical solution is usually a mess of conditional - if-else statements and horrid string concatenations. The desired result is - often a query by example, where a query can be built to find objects that - are similar to the example object. The MyBATIS DataMapper API provides a - relatively elegant solution that can be applied to any mapped statement - element. Here is a simple example: - - - A simple dynamic select sttatement, with two possible - outcomes - - <select id="dynamicGetAccountList" cacheModel="account-cache" parameterClass="Account" resultMap="account-result" > - select * from ACCOUNT - <isGreaterThan prepend="and" property="Id" compareValue="0"> - where ACC_ID = #Id# - </isGreaterThan> - order by ACC_LAST_NAME -</select> - - - In the above example, there are two possible statements that could - be created depending on the state of the Id property of the parameter - object. If the Id parameter is greater than 0, then the statement will be - created as follows: - - - select * from ACCOUNT where ACC_ID = ? - - - Or if the Id parameter is 0 or less, the statement will look as - follows. - - - select * from ACCOUNT - - - The immediate usefulness of this might not become apparent until a - more complex situation is encountered. For example, the following is a - somewhat more complex example. - - - A complex dynamic select statement, with 16 possible - outcomes - - <select id="dynamicGetAccountList" parameterClass="Account" resultMap="account-result" > - select * from ACCOUNT - <dynamic prepend="WHERE"> - <isNotNull prepend="AND" property="FirstName"> - ( ACC_FIRST_NAME = #FirstName# - <isNotNull prepend="OR" property="LastName"> - ACC_LAST_NAME = #LastName# - </isNotNull> - ) - </isNotNull> - <isNotNull prepend="AND" property="EmailAddress"> - ACC_EMAIL like #EmailAddress# - </isNotNull> - <isGreaterThan prepend="AND" property="Id" compareValue="0"> - ACC_ID = #Id# - </isGreaterThan> - </dynamic> - order by ACC_LAST_NAME -</select> - - - Depending on the situation, there could be as many as 16 different - SQL queries generated from the above dynamic statement. To code the - if-else structures and string concatenations could get quite messy and - require hundreds of lines of code. - - Using dynamic statements is as simple as inserting some conditional - tags around the dynamic parts of your SQL. For example: - - - Creating a dynamic statement with conditional tags - - <statement id="someName" parameterClass="Account" resultMap="account-result" > - select * from ACCOUNT - <dynamic prepend="where"> - <isGreaterThan prepend="and" property="id" compareValue="0"> - ACC_ID = #id# - </isGreaterThan> - <isNotNull prepend="and" property="lastName"> - ACC_LAST_NAME = #lastName# - </isNotNull> - </dynamic> -order by ACC_LAST_NAME -</statement> - - - In the above statement, the <dynamic> element demarcates a - section of the SQL that is dynamic. The dynamic element is optional and - provides a way to manage a prepend in cases where the prepend ("WHERE") - should not be included unless the contained conditions append to the - statement. The statement section can contain any number of conditional - elements (see below) that will determine whether the contained SQL code - will be included in the statement. All of the conditional elements work - based on the state of the parameter object passed into the query. Both the - dynamic element and the conditional elements have a "prepend" attribute. - The prepend attribute is a part of the code that is free to be overridden - by the a parent element's prepend if necessary. In the above example the - "where" prepend will override the first true conditional prepend. This is - necessary to ensure that the SQL statement is built properly. For example, - in the case of the first true condition, there is no need for the AND, and - in fact it would break the statement. The following sections describe the - various kinds of elements, including Binary Conditionals, Unary - Conditionals, and Iterate. - - - Binary Conditional Elements - - Binary conditional elements compare a property value to a static - value or another property value. If the result is true, the body content - is included in the SQL query. - - - Binary Conditional Attributes: - - - prepend – the overridable SQL part that will be prepended to - the statement (optional) - - property – the property to be compared (required) - - compareProperty – the other property to be compared - (required or compareValue) - - compareValue – the value to be compared (required or - compareProperty) - - - - Binary conditional attributes - - - - - Element - - Description - - - - - - <isEqual> - - Checks the equality of a property and a value, or - another property. Example Usage:<isEqual prepend="AND" - property="status" - compareValue="Y"> -MARRIED = ‘TRUE' -</isEqual> - - - - <isNotEqual> - - Checks the inequality of a property and a value, or - another property. Example Usage:<isNotEqual prepend="AND" - property="status" - compareValue="N"> -MARRIED = ‘FALSE' -</isNotEqual> - - - - <isGreaterThan> - - Checks if a property is greater than a value or another - property. Example Usage:<isGreaterThan prepend="AND" - property="age" - compareValue="18"> -ADOLESCENT = ‘FALSE' -</isGreaterThan> - - - - <isGreaterEqual> - - Checks if a property is greater than or equal to a - value or another property. Example Usage:<isGreaterEqual prepend="AND" - property="shoeSize" - compareValue="12"> -BIGFOOT = ‘TRUE' -</isGreaterEqual> - - - - <isLessEqual> - - Checks if a property is less than or equal to a value - or another property. Example Usage: <isLessEqual prepend="AND" - property="age" - compareValue="18"> -ADOLESCENT = ‘TRUE' -</isLessEqual> - - - -
    -
    -
    - - - Unary Conditional Elements - - Unary conditional elements check the state of a property for a - specific condition. - - - Unary Conditional Attributes: - - - prepend – the overridable SQL part that will be prepended to - the statement (optional) - - property – the property to be checked (required) - - - - Unary conditional attributes - - - - - Element - - Description - - - - - - <isPropertyAvailable> - - Checks if a property is available (i.e is a property of - the parameter object). Example Usage: <isPropertyAvailable property="id" > - ACCOUNT_ID=#id# -</isPropertyAvailable> - - - - <isNotPropertyAvailable> - - Checks if a property is unavailable (i.e not a property - of the parameter object). Example Usage: <isNotPropertyAvailable property="age" > - STATUS='New' -</isNotEmpty> - - - - <isNull> - - Checks if a property is null. Example Usage: - <isNull prepend="AND" property="order.id" > - ACCOUNT.ACCOUNT_ID = ORDER.ACCOUNT_ID(+) -</isNotEmpty> - - - - <isNotNull> - - Checks if a property is not null. Example Usage: - <isNotNull prepend="AND" property="order.id" > - ORDER.ORDER_ID = #order.id# -</isNotEmpty> - - - - <isEmpty> - - Checks to see if the value of a Collection, String - property is null or empty ("" or size() < 1). Example - Usage: <isEmpty property="firstName" > - LIMIT 0, 20 -</isNotEmpty> - - - - <isNotEmpty> - - Checks to see if the value of a Collection, String - property is not null and not empty ("" or size() < 1). - Example Usage: <isNotEmpty prepend="AND" property="firstName" > - FIRST_NAME LIKE '%$FirstName$%' -</isNotEmpty> - - - -
    -
    -
    - - - Parameter Present Elements - - These elements check for parameter object existence. - - - Parameter Present Attributes: - - prepend – the overridable SQL part that will be prepended to the - statement (optional) - Testing to see if a parameter is present - - - - - Element - - Description - - - - - - <isParameterPresent> - - Checks to see if the parameter object is present (not - null).<isParameterPresent prepend="AND"> - EMPLOYEE_TYPE = #empType# -</isParameterPresent> - - - - <isNotParameterPresent> - - Checks to see if the parameter object is not present - (null). Example Usage:<isNotParameterPresent prepend="AND"> - EMPLOYEE_TYPE = ‘DEFAULT' -</isNotParameterPresent> - - - -
    -
    -
    - - - Iterate Element - - This tag will iterate over a collection and repeat the body - content for each item in a List - - - Iterate Attributes: - - - prepend – the overridable SQL part that will be prepended to - the statement (optional) - - property – a property of type IList that is to be iterated - over (required) - - open – the string with which to open the entire block of - iterations, useful for brackets (optional) - - close – the string with which to close the entire block of - iterations, useful for brackets (optional) - - conjunction – the string to be applied in between each - iteration, useful for AND and OR (optional) - - - - Creating a list of conditional clauses - - - - - Element - - Description - - - - - - <iterate> - - Iterates over a property that is of type IList - Example Usage:<iterate prepend="AND" property="UserNameList" - open="(" close=")" conjunction="OR"> - username=#UserNameList[]# -</iterate>Note: It is very important to include the - square brackets[] at the end of the List property name when - using the Iterate element. These brackets distinguish this - object as an List to keep the parser from simply outputting - the List as a string. - - - -
    -
    -
    - - - Simple Dynamic SQL Elements - - Despite the power of the full Dynamic Mapped Statement API - discussed above, sometimes you just need a simple, small piece of your - SQL to be dynamic. For this, SQL statements and statements can contain - simple dynamic SQL elements to help implement dynamic order by clauses, - dynamic select columns or pretty much any part of the SQL statement. The - concept works much like inline parameter maps, but uses a slightly - different syntax. Consider the following example: - - - A dynamic element that changes the collating order - - <statement id="getProduct" resultMap="get-product-result"> - select * from PRODUCT order by $preferredOrder$ -</statement> - - - In the above example the preferredOrder dynamic element will be - replaced by the value of the preferredOrder property of the parameter - object (just like a parameter map). The difference is that this is a - fundamental change to the SQL statement itself, which is much more - serious than simply setting a parameter value. A mistake made in a - Dynamic SQL Element can introduce security, performance and stability - risks. Take care to do a lot of redundant checks to ensure that the - simple dynamic SQL elements are being used appropriately. Also, be - mindful of your design, as there is potential for database specifics to - encroach on your business object model. For example, you may not want a - column name intended for an order by clause to end up as a property in - your business object, or as a field value on your server page. - - Simple dynamic elements can be included within <statements> - and come in handy when there is a need to modify the SQL statement - itself. For example: - - - A dynamic element that changes the comparison operator - - -<statement id="getProduct" resultMap="get-product-result"> - SELECT * FROM PRODUCT - <dynamic prepend="WHERE"> - <isNotEmpty property="Description"> - PRD_DESCRIPTION $operator$ #Description# - </isNotEmpty> - </dynamic> -</statement> - - - In the above example the operator property of the parameter object - will be used to replace the $operator$ token. So if the operator - property was equal to LIKE and the description property was equal to - %dog%, then the SQL statement generated would be: - - - SELECT * FROM PRODUCT WHERE PRD_DESCRIPTION LIKE ‘%dog%' - - -
    -
    \ No newline at end of file diff --git a/docs/dataMapperGuide/src/en/xsd-config-template.xml b/docs/dataMapperGuide/src/en/xsd-config-template.xml deleted file mode 100644 index 98f49be..0000000 --- a/docs/dataMapperGuide/src/en/xsd-config-template.xml +++ /dev/null @@ -1,4 +0,0 @@ - - iBATIS.NET's <literal>SqlMapConfig.xsd</literal> - - diff --git a/docs/dataMapperGuide/src/en/xsd-sqlMap-template.xml b/docs/dataMapperGuide/src/en/xsd-sqlMap-template.xml deleted file mode 100644 index 667b67d..0000000 --- a/docs/dataMapperGuide/src/en/xsd-sqlMap-template.xml +++ /dev/null @@ -1,4 +0,0 @@ - - iBATIS.NET's <literal>SqlMap.xsd</literal> - - diff --git a/docs/dataMapperGuide/styles/fopdf.xsl b/docs/dataMapperGuide/styles/fopdf.xsl deleted file mode 100644 index 4dbfa8e..0000000 --- a/docs/dataMapperGuide/styles/fopdf.xsl +++ /dev/null @@ -1,578 +0,0 @@ - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Copyright 2003-2005 The Apache Software Foundation - - - Authors - - - - , - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataMapper Guide - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bold - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 0 - 1 - - 1 - - - - - - book toc - - - - 2 - - - - - - - - - - 0 - 0 - 0 - - - 5mm - 10mm - 10mm - - 15mm - 10mm - 0mm - - 18mm - 18mm - - - 0pc - - - - - left - false - - - 11 - 8 - - - 1.4 - - - - - - - 0.8em - - - - - - 15.5cm - - - - 4pt - 4pt - 4pt - 4pt - - - - 1.0pt - 1.0pt - - - - - 1 - - - - - - - - left - bold - - - pt - - - - - - - - - - - - - - - 0.8em - 0.8em - 0.8em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.6em - 0.6em - 0.6em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.4em - 0.4em - 0.4em - - - pt - - 0.1em - 0.1em - 0.1em - - - - - bold - - - pt - - false - 0.4em - 0.6em - 0.8em - - - - - - - - - pt - - wrap - - - - 1em - 1em - 1em - - - #444444 - solid - 0.1pt - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - - - - 1 - - #F0F0F0 - - - - - - 0 - 1 - - - 90 - - - - - '1' - &admon_gfx_path; - - - - - - figure after - example before - equation before - table before - procedure before - - - - 1 - - - - 0.8em - 0.8em - 0.8em - 0.1em - 0.1em - 0.1em - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/dataMapperGuide/styles/html.css b/docs/dataMapperGuide/styles/html.css deleted file mode 100644 index 932e90e..0000000 --- a/docs/dataMapperGuide/styles/html.css +++ /dev/null @@ -1,252 +0,0 @@ -body { - background: #FFFFFF; - font-family: sans-serif; - scrollbar-arrow-color: #000000; - scrollbar-base-color: #003300; - scrollbar-dark-shadow-color: #999900; - scrollbar-track-color: #808080; - scrollbar-face-color: #DEDEDE; - scrollbar-shadow-color: #DDDDDD; - scrollbar-highlight-color: #CCCCCC; - scrollbar-3d-light-color: #003300; -} - - -A:link{COLOR: #5E741C; TEXT-DECORATION: underline;} -A:visited{COLOR: #5E741C; TEXT-DECORATION: underline;} -A:hover{COLOR: #FF6600; TEXT-DECORATION: underline;} - -P, DL, DT, DD, BLOCKQUOTE { - color: #000000; - margin-bottom: 3px; - margin-top: 3px; - padding-top: 0px; - text-align: left; - /*border: 1px solid black;*/ -} - -OL, UL, P { - margin-top: 6px; - margin-bottom: 6px; -} - -P, BLOCKQUOTE { - font-size: 90%; -} - -P.releaseinfo { - font-size: 120%; font-weight: bold; - font-family: Arial, helvetica, sans-serif; - padding-top: 10px; -} - -P.pubdate { - font-size: 120%; font-weight: bold; - font-family: Arial, helvetica, sans-serif; -} - - - -TD, SPAN { - color: #000000; -} - -BLOCKQUOTE { - margin-right: 0px; -} - -H1, H2, H3, H4, H5, H6 { - margin-top:0px; - padding-top:14px; - font-family: Arial, helvetica, sans-serif; - margin-bottom: 0px; -} - -H2.title { - font-weight:800; - margin-bottom: 8px; -} - -H2.subtitle { - font-weight:800; - margin-bottom: 20px; -} - -H3.author { - color: #000000; - font-weight:500; - margin-top:0px; - padding-top:0px; - font-family: Arial, helvetica, sans-serif; - margin-bottom: 0px; -} - -TABLE { - border-collapse: collapse; - border: 1px thin #eeeeee; - empty-cells: hide; - border-style : groove; - border-spacing: 0px; -} - -TH { - background-color: #EBEBEC; -} - -td { -border : 2px; -border-color : #eeeeee; -border-style : groove; -border-spacing: 0px; -font-size: 80%; - padding: 4pt; -} - - -H1 { - font-size: 150%; -} -H2 { - font-size: 110%; -} -H3 { - font-size: 100%; font-weight: bold; -} -H4 { - font-size: 90%; font-weight: bold; -} -H5 { - font-size: 90%; font-style: italic; -} -H6 { - font-size: 100%; font-style: italic; -} - -TT { - font-size: 90%; - font-family: "Courier New", Courier, monospace; - color: #000000; -} - -.navheader, .navfooter { - background-color: #ffffff; -} -.navheader TABLE { - background-color: #D4D5D8; -} -.navheader th { - background-color: #D4D5D8; -} -.navheader td { - border : 0px; -} -.navfooter TABLE { - background-color: #D4D5D8; -} -.navfooter th { - background-color: #D4D5D8; -} -.navfooter td { - border : 0px; -} - -PRE { - font-size: 90%; - padding: 5px; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC; - background-color: #F4F4F4; -} - -UL, OL, LI { - list-style: disc; -} - -HR { - width: 100%; - height: 1px; - background-color: #CCCCCC; - border-width: 0px; - padding: 0px; - color: #CCCCCC; -} - -.variablelist { - padding-top: 10; - padding-bottom:10; - margin:0; -} - -/*(.itemizedlist, UL { - padding-top: 0; - padding-bottom:0; - margin:0; -}*/ - -.term { - font-weight:bold; -} - -.mediaobject { - padding-top: 30px; - padding-bottom: 30px; -} - -.legalnotice { - font-size: 70%; -} - - -.sidebar { - background-color: #E5ECF9; - padding: 0.25cm; -} - -.programlisting { - font-family: courier; - font-size: 11px; - font-weight: normal; - font-family: Lucida Console, monospace; - background-color: #EEEEEE; - padding: 0.25cm; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC - } - -.comment { - color: #008000; -} - -.blue { - color: #0000FF; -} - -.cache { - color: #FF9900; -} - -.alias { - color: #FF0000; -} - -.parameterMap { - color: #800080; -} - -.resultmap { - color: #3366FF; -} - -.statement { - color: #339966; -} -.new { - border:thin solid black; - background-color:#FFF09E -} -.updated { - border:thin solid black; - background-color:#33FF33 -} \ No newline at end of file diff --git a/docs/dataMapperGuide/styles/html.xsl b/docs/dataMapperGuide/styles/html.xsl deleted file mode 100644 index fd18670..0000000 --- a/docs/dataMapperGuide/styles/html.xsl +++ /dev/null @@ -1,75 +0,0 @@ - - - - - - - - 1 - 0 - 1 - 0 - - - 1 - - - - - - book toc - - - - 5 - - - - - - 1 - - - - - - - - - images/ - - - 90 - - - - - - figure after - example before - equation before - table before - procedure before - - - - - - - - - - \ No newline at end of file diff --git a/docs/doc.build b/docs/doc.build deleted file mode 100644 index 6c34d6a..0000000 --- a/docs/doc.build +++ /dev/null @@ -1,249 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/doc.build.include.windows b/docs/doc.build.include.windows deleted file mode 100644 index af98a57..0000000 --- a/docs/doc.build.include.windows +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - diff --git a/docs/docbook/dtd/40chg.txt b/docs/docbook/dtd/40chg.txt deleted file mode 100644 index f1c720a..0000000 --- a/docs/docbook/dtd/40chg.txt +++ /dev/null @@ -1,53 +0,0 @@ -19 June 2000 - -Changes from DocBook V3.1 to DocBook XML V4.1: - -Global: - -- Broad changes required for XML compatibility -- Added a *provisional* set of character entities based on the ISO - entity sets. The DocBook TC is not willing to accept the long-term - responsibility for defining and maintaining these sets. The TC - will ask OASIS to form a new TC for this purpose. - -Markup: - -- RFE 17: Added a common attribute 'Condition' for generic effectivity -- RFE 38: The nav.class elements (ToC|LoT|Index|Glossary|Bibliography) are - now allowed at the beginning and end of components and sections -- RFE 58: The 'optmult' and 'reqmult' attribute values have been - removed from Group -- RFE 65: Added several class attribute values to Filename and SystemItem - at the request of the Linux community -- RFE 73: Removed BookBiblio and SeriesInfo -- RFE 81: Added SidebarInfo to Sidebar -- RFE 87: Added 'xmlpi' and 'emptytag' as class values of SGMLTag -- RFE 92: Added 'CO' to Synopsis and LiteralLayout -- RFE 99: Added SimpleMsgEntry as an alternative to MsgEntry in order - to provide a simpler MsgSet construct -- RFE 103: Added RevDescription as an alternative to RevRemark in - RevHistory; this allows longer descriptive text in a revision -- RFE 104: Added 'Specification' to the list of document classes on Article -- RFE 108: Allow admonitions in Answers -- RFE 110: Allow a RevHistory on QandAEntry -- RFE 115: Allow optional Title on OrderedList and ItemizedList -- RFE 116: Added LineNumbering attribute to linespecific environments for - presentation of line numbers -- Added a common attribute 'Security' for effectivity -- Added synopsis markup for modern programming languages (e.g, object - oriented languages like Java, C++, and IDL) -- Renamed DocInfo to PrefaceInfo, ChapterInfo, AppendixInfo, etc. -- Comment was renamed Remark -- InterfaceDefinition was removed - -Other: - -- RFE 88: Added PEs to include/ignore dbnotn.mod and dbcent.mod -- RFE 102: Fixed some outstanding namecase problems -- RFE 105: Added PNG notation -- RFE 106: Removed some odd *.content PEs that interfered with - customization layers -- RFE 109: Added FPI to content of dbgenent.mod (for consistency) -- RFE 111: Added the Euro symbol -- Fixed bug in cals-tbl.dtd; a model group was used for the element - declaration, but the attlist declaration used "Table" literally. diff --git a/docs/docbook/dtd/41chg.txt b/docs/docbook/dtd/41chg.txt deleted file mode 100644 index 4bb6b91..0000000 --- a/docs/docbook/dtd/41chg.txt +++ /dev/null @@ -1,18 +0,0 @@ -27 Aug 2000 - -Changes from DocBook V4.1.1 to DocBook V4.1.2: - -- Fixed broken ISO FPIs in docbook.cat introduced by - careless search-and-replace. - -Changes from DocBook V4.0 to DocBook V4.1.1: - -- Removed some 4.0 future use comments that had accidentally - been left in the DTD -- Fixed system identifiers in docbook.cat -- Added version information to all the ent/*.ent files -- Fixed a number of numeric character references in the ent/*.ent files -- Fixed a couple of incorrect FPIs. -- Renamed dbgenent.ent to dbgenent.mod for parity with SGML version - -See 40chg.txt for a list of the significant changes. diff --git a/docs/docbook/dtd/ChangeLog b/docs/docbook/dtd/ChangeLog deleted file mode 100644 index b203c1b..0000000 --- a/docs/docbook/dtd/ChangeLog +++ /dev/null @@ -1,118 +0,0 @@ -2000-08-27 Norman Walsh - - * 41chg.txt, readme.txt: Updated descriptions - - * calstblx.dtd, dbcentx.mod, dbgenent.mod, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbook.cat: - Updated version numbers - - * docbook.cat: Fixed stupid search-and-replace error in ISO FPIs - - * docbookx.dtd: DocBook XML V4.1.2 released - -2000-08-12 Norman Walsh - - * 40chg.txt: Updated; changed version number - - * 41chg.txt: Added note about renaming dbgenent - - * 41chg.txt, readme.txt: Updated; changed version number, release date - - * calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbook.cat: - Changed version number - - * dbgenent.ent, dbgenent.mod: Renamed .ent to .mod - - * docbookx.dtd: DocBook XML V4.1.1 released - - * docbookx.dtd: Fixed system identifier for dbgenent.ent to dbgenent.mod - -2000-07-06 Norman Walsh - - * 40chg.txt, 41chg.txt, calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbook.cat, readme.txt: - Changed version numbers to 4.1.1beta1 - - * docbook.cat: Fixed incorrect system identifiers - - * docbookx.dtd: Version 4.1.1beta1 released - -2000-06-19 Norman Walsh - - * 40chg.txt: Added notes about comment and interfacedefinition - - * 41chg.txt: New file. - - * calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbook.cat, docbookx.dtd, readme.txt: - Updated version numbers to 4.1 - - * dbgenent.ent: Fixed FPI; added 'XML' - - * dbhierx.mod: Removed 4.0 future use comments - - * dbpoolx.mod: Removed 4.0 future use comments; fixed table model selection comment; fixed 'Norman Walsh' FPIs - - * docbook.cat: New file. - -2000-05-18 Norman Walsh - - * 40chg.txt, calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbookx.dtd, readme.txt: - Removed references to beta6 - - * docbookx.dtd: DocBook XML V4.0 released. - -2000-04-10 Norman Walsh - - * 40chg.txt, calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbookx.dtd, readme.txt: - Updated release date and version to 4.0beta6 - - * dbpoolx.mod: Added support for EBNF hook; fixed equation content bug - -2000-04-03 Norman Walsh - - * 40chg.txt: Added note about renaming DocInfo to *Info. - - * 40chg.txt, calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbookx.dtd, readme.txt: - Updated version numbers - -2000-03-30 Norman Walsh - - * dbpoolx.mod: Removed beginpage from highlights.mix; it's excluded in the SGML version. - -2000-03-24 Norman Walsh - - * 40chg.txt, calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbookx.dtd, readme.txt: - Updated version numbers - - * dbefsyn.mod: Removed - - * dbpoolx.mod: Removed ELEMENT from comments to ease text searching of the DTD. - Merged dbefsyn.mod into dbpoolx.mod - Added Modifier as an optional element at the end of MethodSynopsis - and MethodParam. - -2000-03-07 Norman Walsh - - * 40chg.txt: New file. - - * 40chg.txt, calstblx.dtd, dbcentx.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbookx.dtd, readme.txt, soextblx.dtd: - Updated internal versions to beta3 - -2000-03-03 Norman Walsh - - * dbpoolx.mod: Removed erroneous comment about inline synopses - -2000-03-02 Norman Walsh - - * calstblx.dtd, dbcentx.mod, dbefsyn.mod, dbgenent.ent, dbhierx.mod, dbnotnx.mod, dbpoolx.mod, docbookx.dtd, readme.txt, soextblx.dtd: - New file. - - * dbefsyn.mod, dbpoolx.mod: Added ooclass, oointerface, and ooexception as wrappers for modifiers - and names in classsynopsis. Also allow them inline. - - Fixed SGML PE parsing problem with hook PEs. - - * dbhierx.mod, dbpoolx.mod: Added hook PEs for future module extension - - * dbpoolx.mod: Removed unused PEs for equation content - - * dbpoolx.mod: Made primary optional (XML has no #CONREF) - diff --git a/docs/docbook/dtd/calstblx.dtd b/docs/docbook/dtd/calstblx.dtd deleted file mode 100644 index 2b75079..0000000 --- a/docs/docbook/dtd/calstblx.dtd +++ /dev/null @@ -1,199 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/dbcentx.mod b/docs/docbook/dtd/dbcentx.mod deleted file mode 100644 index 55cdc81..0000000 --- a/docs/docbook/dtd/dbcentx.mod +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - -%ISOamsa; -]]> - - - -%ISOamsb; -]]> - - - -%ISOamsc; -]]> - - - -%ISOamsn; -]]> - - - -%ISOamso; -]]> - - - -%ISOamsr; -]]> - - - -%ISObox; -]]> - - - -%ISOcyr1; -]]> - - - -%ISOcyr2; -]]> - - - -%ISOdia; -]]> - - - -%ISOgrk1; -]]> - - - -%ISOgrk2; -]]> - - - -%ISOgrk3; -]]> - - - -%ISOgrk4; -]]> - - - -%ISOlat1; -]]> - - - -%ISOlat2; -]]> - - - -%ISOnum; -]]> - - - -%ISOpub; -]]> - - - -%ISOtech; -]]> - - - diff --git a/docs/docbook/dtd/dbgenent.mod b/docs/docbook/dtd/dbgenent.mod deleted file mode 100644 index 5dc9a41..0000000 --- a/docs/docbook/dtd/dbgenent.mod +++ /dev/null @@ -1,41 +0,0 @@ - - - - - - - - - - - diff --git a/docs/docbook/dtd/dbhierx.mod b/docs/docbook/dtd/dbhierx.mod deleted file mode 100644 index 5cc4195..0000000 --- a/docs/docbook/dtd/dbhierx.mod +++ /dev/null @@ -1,2074 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%rdbhier; -]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%rdbhier2; -]]> - - - - - - - - - - - - - - - - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> -]]> - - - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - -]]> - - - -]]> - - - - - - -]]> - - - -]]> - - - - - - -]]> - - - -]]> - - - - - - -]]> - - - -]]> - - - - - - -]]> - - - -]]> - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - - -]]> - - - -]]> - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - -]]> - - - -]]> - - - - - -]]> - - - -]]> - - - - - -]]> - -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> -]]> - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - - - -]]> - - - - - - - -]]> -]]> - - - diff --git a/docs/docbook/dtd/dbnotnx.mod b/docs/docbook/dtd/dbnotnx.mod deleted file mode 100644 index 0ea4c44..0000000 --- a/docs/docbook/dtd/dbnotnx.mod +++ /dev/null @@ -1,97 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/dbpoolx.mod b/docs/docbook/dtd/dbpoolx.mod deleted file mode 100644 index 9fe5d9a..0000000 --- a/docs/docbook/dtd/dbpoolx.mod +++ /dev/null @@ -1,7516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -%rdbpool; -]]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> - - - - -]]> - - - -]]> - - - - -]]> - - - -]]> - - - - -]]> - - - -]]> - - - - -]]> - - - -]]> - -]]> - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> -]]> - - - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> -]]> - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - -]]> - - - -]]> - - -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - - -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - - - - - -]]> - - - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - - - - - - - - - - - - - - - - - - -]]> - - - - - - - - - - - - - - - - - - - - - - - - -]]> - -%tablemodel; - -]]> - - - - - - - - -]]> - - - - - - - - - -]]> -]]> - - - - - - - - - - - - -]]> - - - -]]> - - -]]> - - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - - - -]]> - - - -]]> - ]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - - - -]]> - - - -]]> - ]]> - - -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - ]]> - - - - -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - - - -]]> - - - -]]> - ]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> - -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> - - - - - - - -]]> - - - -]]> - ]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - ]]> - - -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - -]]> - - - - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - -]]> -]]> - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - -]]> - - - -]]> - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - -]]> -]]> - - - - - - - - - -]]> - - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - - - -]]> - - - - - - - -]]> -]]> - - - - - - - -]]> - - - - - - -]]> -]]> - - - - - - - - - - -]]> - - - - - - - - - - -]]> -]]> - - - - - - - - -]]> - - - - -]]> - - - - -]]> - - - - -]]> - - - - -]]> - - - - -]]> - -]]> - - - - - - - -]]> - - - -]]> - - - -]]> - - - -]]> -]]> -]]> - - - diff --git a/docs/docbook/dtd/docbook.cat b/docs/docbook/dtd/docbook.cat deleted file mode 100644 index c24e5df..0000000 --- a/docs/docbook/dtd/docbook.cat +++ /dev/null @@ -1,59 +0,0 @@ - -- ...................................................................... -- - -- Catalog data for DocBook XML V4.1.2 .................................... -- - -- File docbook.cat ..................................................... -- - - -- Please direct all questions, bug reports, or suggestions for - changes to the docbook@lists.oasis-open.org mailing list. For more - information, see http://www.oasis-open.org/. - -- - - -- This is the catalog data file for DocBook XML V4.1.2. It is provided as - a convenience in building your own catalog files. You need not use - the filenames listed here, and need not use the filename method of - identifying storage objects at all. See the documentation for - detailed information on the files associated with the DocBook DTD. - See SGML Open Technical Resolution 9401 for detailed information - on supplying and using catalog data. - -- - - -- ...................................................................... -- - -- DocBook driver file .................................................. -- - -PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN" "docbookx.dtd" - - -- ...................................................................... -- - -- DocBook modules ...................................................... -- - -PUBLIC "-//OASIS//DTD DocBook XML CALS Table Model V4.1.2//EN" "calstblx.dtd" -PUBLIC "-//OASIS//DTD XML Exchange Table Model 19990315//EN" "soextblx.dtd" -PUBLIC "-//OASIS//ELEMENTS DocBook XML Information Pool V4.1.2//EN" "dbpoolx.mod" -PUBLIC "-//OASIS//ELEMENTS DocBook XML Document Hierarchy V4.1.2//EN" "dbhierx.mod" -PUBLIC "-//OASIS//ENTITIES DocBook XML Additional General Entities V4.1.2//EN" "dbgenent.mod" -PUBLIC "-//OASIS//ENTITIES DocBook XML Notations V4.1.2//EN" "dbnotnx.mod" -PUBLIC "-//OASIS//ENTITIES DocBook XML Character Entities V4.1.2//EN" "dbcentx.mod" - - -- ...................................................................... -- - -- ISO entity sets ...................................................... -- - -PUBLIC "ISO 8879:1986//ENTITIES Diacritical Marks//EN" "ent/iso-dia.ent" -PUBLIC "ISO 8879:1986//ENTITIES Numeric and Special Graphic//EN" "ent/iso-num.ent" -PUBLIC "ISO 8879:1986//ENTITIES Publishing//EN" "ent/iso-pub.ent" -PUBLIC "ISO 8879:1986//ENTITIES General Technical//EN" "ent/iso-tech.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN" "ent/iso-lat1.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Latin 2//EN" "ent/iso-lat2.ent" -PUBLIC "ISO 8879:1986//ENTITIES Greek Letters//EN" "ent/iso-grk1.ent" -PUBLIC "ISO 8879:1986//ENTITIES Monotoniko Greek//EN" "ent/iso-grk2.ent" -PUBLIC "ISO 8879:1986//ENTITIES Greek Symbols//EN" "ent/iso-grk3.ent" -PUBLIC "ISO 8879:1986//ENTITIES Alternative Greek Symbols//EN" "ent/iso-grk4.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Arrow Relations//EN" "ent/iso-amsa.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Binary Operators//EN" "ent/iso-amsb.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Delimiters//EN" "ent/iso-amsc.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Negated Relations//EN" "ent/iso-amsn.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Ordinary//EN" "ent/iso-amso.ent" -PUBLIC "ISO 8879:1986//ENTITIES Added Math Symbols: Relations//EN" "ent/iso-amsr.ent" -PUBLIC "ISO 8879:1986//ENTITIES Box and Line Drawing//EN" "ent/iso-box.ent" -PUBLIC "ISO 8879:1986//ENTITIES Russian Cyrillic//EN" "ent/iso-cyr1.ent" -PUBLIC "ISO 8879:1986//ENTITIES Non-Russian Cyrillic//EN" "ent/iso-cyr2.ent" - - -- End of catalog data for DocBook XML V4.1.2 ............................. -- - -- ...................................................................... -- diff --git a/docs/docbook/dtd/docbookx.dtd b/docs/docbook/dtd/docbookx.dtd deleted file mode 100644 index ad0081e..0000000 --- a/docs/docbook/dtd/docbookx.dtd +++ /dev/null @@ -1,125 +0,0 @@ - - - - - - - - - - - - - - - -%dbnotn; -]]> - - - - - - - -%dbcent; -]]> - - - - - - - - -%dbpool; -]]> - - - - - - -%rdbmods; -]]> - - - - - -%dbhier; -]]> - - - - - - -%dbgenent; -]]> - - - diff --git a/docs/docbook/dtd/ent/iso-amsa.ent b/docs/docbook/dtd/ent/iso-amsa.ent deleted file mode 100644 index 1b64b46..0000000 --- a/docs/docbook/dtd/ent/iso-amsa.ent +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-amsb.ent b/docs/docbook/dtd/ent/iso-amsb.ent deleted file mode 100644 index 38bd2e7..0000000 --- a/docs/docbook/dtd/ent/iso-amsb.ent +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-amsc.ent b/docs/docbook/dtd/ent/iso-amsc.ent deleted file mode 100644 index 8485fe3..0000000 --- a/docs/docbook/dtd/ent/iso-amsc.ent +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-amsn.ent b/docs/docbook/dtd/ent/iso-amsn.ent deleted file mode 100644 index 7e9d578..0000000 --- a/docs/docbook/dtd/ent/iso-amsn.ent +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-amso.ent b/docs/docbook/dtd/ent/iso-amso.ent deleted file mode 100644 index 61f5c4d..0000000 --- a/docs/docbook/dtd/ent/iso-amso.ent +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-amsr.ent b/docs/docbook/dtd/ent/iso-amsr.ent deleted file mode 100644 index 9ef9da0..0000000 --- a/docs/docbook/dtd/ent/iso-amsr.ent +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-box.ent b/docs/docbook/dtd/ent/iso-box.ent deleted file mode 100644 index 1f87530..0000000 --- a/docs/docbook/dtd/ent/iso-box.ent +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-cyr1.ent b/docs/docbook/dtd/ent/iso-cyr1.ent deleted file mode 100644 index 2516f8e..0000000 --- a/docs/docbook/dtd/ent/iso-cyr1.ent +++ /dev/null @@ -1,72 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-cyr2.ent b/docs/docbook/dtd/ent/iso-cyr2.ent deleted file mode 100644 index 3edbde0..0000000 --- a/docs/docbook/dtd/ent/iso-cyr2.ent +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-dia.ent b/docs/docbook/dtd/ent/iso-dia.ent deleted file mode 100644 index 3a4b55c..0000000 --- a/docs/docbook/dtd/ent/iso-dia.ent +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-grk1.ent b/docs/docbook/dtd/ent/iso-grk1.ent deleted file mode 100644 index b040985..0000000 --- a/docs/docbook/dtd/ent/iso-grk1.ent +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-grk2.ent b/docs/docbook/dtd/ent/iso-grk2.ent deleted file mode 100644 index 63de411..0000000 --- a/docs/docbook/dtd/ent/iso-grk2.ent +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-grk3.ent b/docs/docbook/dtd/ent/iso-grk3.ent deleted file mode 100644 index b59c53c..0000000 --- a/docs/docbook/dtd/ent/iso-grk3.ent +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-grk4.ent b/docs/docbook/dtd/ent/iso-grk4.ent deleted file mode 100644 index ace7c81..0000000 --- a/docs/docbook/dtd/ent/iso-grk4.ent +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-lat1.ent b/docs/docbook/dtd/ent/iso-lat1.ent deleted file mode 100644 index 2ec16ff..0000000 --- a/docs/docbook/dtd/ent/iso-lat1.ent +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-lat2.ent b/docs/docbook/dtd/ent/iso-lat2.ent deleted file mode 100644 index e94ec18..0000000 --- a/docs/docbook/dtd/ent/iso-lat2.ent +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-num.ent b/docs/docbook/dtd/ent/iso-num.ent deleted file mode 100644 index 7f4844c..0000000 --- a/docs/docbook/dtd/ent/iso-num.ent +++ /dev/null @@ -1,81 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-pub.ent b/docs/docbook/dtd/ent/iso-pub.ent deleted file mode 100644 index 56ede36..0000000 --- a/docs/docbook/dtd/ent/iso-pub.ent +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/ent/iso-tech.ent b/docs/docbook/dtd/ent/iso-tech.ent deleted file mode 100644 index 7264f6b..0000000 --- a/docs/docbook/dtd/ent/iso-tech.ent +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/dtd/readme.txt b/docs/docbook/dtd/readme.txt deleted file mode 100644 index 383f7fe..0000000 --- a/docs/docbook/dtd/readme.txt +++ /dev/null @@ -1,16 +0,0 @@ -README for DocBook XML V4.1.2 - -This is DocBook XML V4.1.2, released 27 Aug 2000. - -See 41chg.txt for information about what has changed since DocBook 4.0. - -For more information about DocBook, please see - - http://www.oasis-open.org/docbook/ - -a partial mirror of the official DocBook site is available at - - http://docbook.org/ - -Please send all questions, comments, concerns, and bug reports to the -DocBook mailing list: docbook@lists.oasis-open.org diff --git a/docs/docbook/dtd/soextblx.dtd b/docs/docbook/dtd/soextblx.dtd deleted file mode 100644 index e4ea0ed..0000000 --- a/docs/docbook/dtd/soextblx.dtd +++ /dev/null @@ -1,308 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/docbook/readme.txt b/docs/docbook/readme.txt deleted file mode 100644 index 69989f5..0000000 --- a/docs/docbook/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -This directory is where we'll hold the Docbook reference libraries and DTD(Document Type Definition). - - http://www.docbook.org diff --git a/docs/docbook/styles/readme.txt b/docs/docbook/styles/readme.txt deleted file mode 100644 index 6d29b7b..0000000 --- a/docs/docbook/styles/readme.txt +++ /dev/null @@ -1 +0,0 @@ -This is the placeholder for the docbook stylesheets (docbook-xsl-ns). \ No newline at end of file diff --git a/docs/favicon.ico b/docs/favicon.ico deleted file mode 100644 index 161bcf7841cb95d326d9729fb0000941cef010d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmcIiyKVw85Znt$i7TjRC~{@~0Yy+;gB1ES`4%kk0ioT3FQGA2+AEUc3QLrfNHkYO z+061d+ZUu%tZ%$Kp7HuDnJB}^^FC?p?uZ7+Pe2Y#fQ-7Bi7d41VIe}X_LMNAB^)TsBsHWP6w-$U*}emq-5YDhJteeZ$Sa@ diff --git a/docs/fop/readme.txt b/docs/fop/readme.txt deleted file mode 100644 index 385262d..0000000 --- a/docs/fop/readme.txt +++ /dev/null @@ -1,14 +0,0 @@ -This directory is a optential placeholder for the Fop libraries. You can install -your FOP distirbution here or elsewhere. Just make sure you adjust the path to -FOP in the build script at the root of this documentation bundle. You should normally -perform changes of this nature only in ..\doc.build.include.windows. - -FOP (Formatting Objects Processor) is used to transform FO files to files of other formats. -In this tutorial it is used to transform FO output produced by xsltproc into PDF -which is a well known format considered by many to be aesthetically pleasing. -The Unix and Windows installation paths are very similar, the differences -will be mentioned where appropriate. - -Download the latest version of the Fop application, from http://xml.apache.org/fop/. - - diff --git a/docs/skin/breadcrumbs-optimized.js b/docs/skin/breadcrumbs-optimized.js deleted file mode 100644 index bf0c44f..0000000 --- a/docs/skin/breadcrumbs-optimized.js +++ /dev/null @@ -1,67 +0,0 @@ -var PREPREND_CRUMBS=new Array(); -PREPREND_CRUMBS.push(new Array("Apache","http://www.apache.org/")); -PREPREND_CRUMBS.push(new Array("Jakarta","http://jakarta.apache.org/")); -var DISPLAY_SEPARATOR=" > "; -var DISPLAY_PREPREND=""; -var DISPLAY_POSTPREND=":"; -var CSS_CLASS_CRUMB="breadcrumb"; -var CSS_CLASS_TRAIL="breadcrumbTrail"; -var CSS_CLASS_SEPARATOR="crumbSeparator"; -var FILE_EXTENSIONS=new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" ); -var PATH_SEPARATOR="/"; - -function sc(s) { - var l=s.toLowerCase(); - return l.substr(0,1).toUpperCase()+l.substr(1); -} -function getdirs() { - var t=document.location.pathname.split(PATH_SEPARATOR); - var lc=t[t.length-1]; - for(var i=0;i < FILE_EXTENSIONS.length;i++) - { - if(lc.indexOf(FILE_EXTENSIONS[i])) - return t.slice(1,t.length-1); } - return t.slice(1,t.length); -} -function getcrumbs( d ) -{ - var pre = "/"; - var post = "/"; - var c = new Array(); - if( d != null ) - { - for(var i=0;i < d.length;i++) { - pre+=d[i]+postfix; - c.push(new Array(d[i],pre)); } - } - if(PREPREND_CRUMBS.length > 0 ) - return PREPREND_CRUMBS.concat( c ); - return c; -} -function gettrail( c ) -{ - var h=DISPLAY_PREPREND; - for(var i=0;i < c.length;i++) - { - h+='
    '+sc(c[i][0])+''; - if(i!=(c.length-1)) - h+=DISPLAY_SEPARATOR; } - return h+DISPLAY_POSTPREND; -} - -function gettrailXHTML( c ) -{ - var h=''+DISPLAY_PREPREND; - for(var i=0;i < c.length;i++) - { - h+=''+sc(c[i][0])+''; - if(i!=(c.length-1)) - h+=''+DISPLAY_SEPARATOR+''; } - return h+DISPLAY_POSTPREND+''; -} - -if(document.location.href.toLowerCase().indexOf("http://")==-1) - document.write(gettrail(getcrumbs())); -else - document.write(gettrail(getcrumbs(getdirs()))); - diff --git a/docs/skin/breadcrumbs.js b/docs/skin/breadcrumbs.js deleted file mode 100644 index e2e6c3e..0000000 --- a/docs/skin/breadcrumbs.js +++ /dev/null @@ -1,267 +0,0 @@ -/* - - ============================================================================ - The Apache Software License, Version 1.1 - ============================================================================ - - Copyright (C) 2004 The Apache Software Foundation. All rights reserved. - - Redistribution and use in source and binary forms, with or without modifica- - tion, are permitted provided that the following conditions are met: - - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - - 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - - 3. The end-user documentation included with the redistribution, if any, must - include the following acknowledgment: "This product includes software - developed by the Apache Software Foundation (http://www.apache.org/)." - Alternately, this acknowledgment may appear in the software itself, if - and wherever such third-party acknowledgments normally appear. - - 4. The names "Apache Forrest" and "Apache Software Foundation" - must not be used to endorse or promote products derived from this software - without prior written permission. For written permission, please contact - apache@apache.org. - - 5. Products derived from this software may not be called "Apache", nor may - "Apache" appear in their name, without prior written permission of the - Apache Software Foundation. - - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - This software consists of voluntary contributions made by many individuals - on behalf of the Apache Software Foundation. For more information on the - Apache Software Foundation, please see . - -*/ - -/** - * This script, when included in a html file, builds a neat breadcrumb trail - * based on its url. That is, if it doesn't contains bugs (I'm relatively - * sure it does). - * - * Typical usage: - * - * - *@author Leo Simons (main author) - *@author Nicola Ken Barozzi (integration in skin) - *@created July 12, 2002 - *@version 1.0 - */ - -/** - * IE 5 on Mac doesn't know Array.push. - * - * Implement it - courtesy to fritz. - */ -var abc = new Array(); -if (!abc.push) { - Array.prototype.push = function(what){this[this.length]=what} -} - -/* ======================================================================== - CONSTANTS - ======================================================================== */ - -/** - * Two-dimensional array containing extra crumbs to place at the front of - * the trail. Specify first the name of the crumb, then the URI that belongs - * to it. You'll need to modify this for every domain or subdomain where - * you use this script (you can leave it as an empty array if you wish) - */ -var PREPREND_CRUMBS = new Array(); - if(!(""=="")){ - PREPREND_CRUMBS.push( new Array( "", "" ) ); - } - if(!(""=="")){ - PREPREND_CRUMBS.push( new Array( "", "" ) ); - } - if(!(""=="")){ - PREPREND_CRUMBS.push( new Array( "", "" ) ); - } - -/** - * String to include between crumbs: - */ -var DISPLAY_SEPARATOR = " > "; -/** - * String to include at the beginning of the trail - */ -var DISPLAY_PREPREND = ""; -/** - * String to include at the end of the trail - */ -var DISPLAY_POSTPREND = ""; - -/** - * CSS Class to use for a single crumb: - */ -var CSS_CLASS_CRUMB = "breadcrumb"; - -/** - * CSS Class to use for the complete trail: - */ -var CSS_CLASS_TRAIL = "breadcrumbTrail"; - -/** - * CSS Class to use for crumb separator: - */ -var CSS_CLASS_SEPARATOR = "crumbSeparator"; - -/** - * Array of strings containing common file extensions. We use this to - * determine what part of the url to ignore (if it contains one of the - * string specified here, we ignore it). - */ -var FILE_EXTENSIONS = new Array( ".html", ".htm", ".jsp", ".php", ".php3", ".php4" ); - -/** - * String that separates parts of the breadcrumb trail from each other. - * When this is no longer a slash, I'm sure I'll be old and grey. - */ -var PATH_SEPARATOR = "/"; - -/* ======================================================================== - UTILITY FUNCTIONS - ======================================================================== */ -/** - * Capitalize first letter of the provided string and return the modified - * string. - */ -function sentenceCase( string ) -{ return string; - //var lower = string.toLowerCase(); - //return lower.substr(0,1).toUpperCase() + lower.substr(1); -} - -/** - * Returns an array containing the names of all the directories in the - * current document URL - */ -function getDirectoriesInURL() -{ - var trail = document.location.pathname.split( PATH_SEPARATOR ); - - // check whether last section is a file or a directory - var lastcrumb = trail[trail.length-1]; - for( var i = 0; i < FILE_EXTENSIONS.length; i++ ) - { - if( lastcrumb.indexOf( FILE_EXTENSIONS[i] ) ) - { - // it is, remove it and send results - return trail.slice( 1, trail.length-1 ); - } - } - - // it's not; send the trail unmodified - return trail.slice( 1, trail.length ); -} - -/* ======================================================================== - BREADCRUMB FUNCTIONALITY - ======================================================================== */ -/** - * Return a two-dimensional array describing the breadcrumbs based on the - * array of directories passed in. - */ -function getBreadcrumbs( dirs ) -{ - var prefix = "/"; - var postfix = "/"; - - // the array we will return - var crumbs = new Array(); - - if( dirs != null ) - { - for( var i = 0; i < dirs.length; i++ ) - { - prefix += dirs[i] + postfix; - crumbs.push( new Array( dirs[i], prefix ) ); - } - } - - // preprend the PREPREND_CRUMBS - if(PREPREND_CRUMBS.length > 0 ) - { - return PREPREND_CRUMBS.concat( crumbs ); - } - - return crumbs; -} - -/** - * Return a string containing a simple text breadcrumb trail based on the - * two-dimensional array passed in. - */ -function getCrumbTrail( crumbs ) -{ - var xhtml = DISPLAY_PREPREND; - - for( var i = 0; i < crumbs.length; i++ ) - { - xhtml += ''; - xhtml += unescape( crumbs[i][0] ) + ''; - if( i != (crumbs.length-1) ) - { - xhtml += DISPLAY_SEPARATOR; - } - } - - xhtml += DISPLAY_POSTPREND; - - return xhtml; -} - -/** - * Return a string containing an XHTML breadcrumb trail based on the - * two-dimensional array passed in. - */ -function getCrumbTrailXHTML( crumbs ) -{ - var xhtml = ''; - xhtml += DISPLAY_PREPREND; - - for( var i = 0; i < crumbs.length; i++ ) - { - xhtml += ''; - xhtml += unescape( crumbs[i][0] ) + ''; - if( i != (crumbs.length-1) ) - { - xhtml += '' + DISPLAY_SEPARATOR + ''; - } - } - - xhtml += DISPLAY_POSTPREND; - xhtml += ''; - - return xhtml; -} - -/* ======================================================================== - PRINT BREADCRUMB TRAIL - ======================================================================== */ - -// check if we're local; if so, only print the PREPREND_CRUMBS -if( document.location.href.toLowerCase().indexOf( "http://" ) == -1 ) -{ - document.write( getCrumbTrail( getBreadcrumbs() ) ); -} -else -{ - document.write( getCrumbTrail( getBreadcrumbs( getDirectoriesInURL() ) ) ); -} - diff --git a/docs/skin/images/chapter.gif b/docs/skin/images/chapter.gif deleted file mode 100644 index 72b8f01ffbd904f6bc198d6c4b17622e159d9ed1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55 zcmZ?wbhEHbWMN=unE0RJ|Ns9C3=9Vj8~~DvKUo+V7?>DzfNTbkJOdL)3!hr%o7Gb^ G7_0%K1r3q_ diff --git a/docs/skin/images/chapter_open.gif b/docs/skin/images/chapter_open.gif deleted file mode 100644 index 56acd7e79cef4d3af546cc38869c843df6d762af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55 zcmZ?wbhEHbWM^PunE0RJ|NsBz@4RJTU^sB#fZ|UUMg|6E1|1-m0VL1B#L*+)Y?;M- IQ-i@80Q^o5mH+?% diff --git a/docs/skin/images/current.gif b/docs/skin/images/current.gif deleted file mode 100644 index af0f64fb2439a4677be9e988952233908ae3ffb3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 60 zcmZ?wbhEHb(l%9@1H+^e(dfEI}6T_cR71S@O;mhE!4{9oHY31msD(>O)?bj2sYUWGloD#_-Jfl0kb*?^_ z$ikY%lb7m=F6^E)d2-*pu0^ZoZ1rm1+q!1$hJCZw>`p7)v3btHuDz2^&t*1fKDp$= z)=PR{c%-q e!NFoi0gadw8x}gZ=5l$=@z}WNXs03rgEat=0@_&s diff --git a/docs/skin/images/favicon.ico b/docs/skin/images/favicon.ico deleted file mode 100644 index 161bcf7841cb95d326d9729fb0000941cef010d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 766 zcmcIiyKVw85Znt$i7TjRC~{@~0Yy+;gB1ES`4%kk0ioT3FQGA2+AEUc3QLrfNHkYO z+061d+ZUu%tZ%$Kp7HuDnJB}^^FC?p?uZ7+Pe2Y#fQ-7Bi7d41VIe}X_LMNAB^)TsBsHWP6w-$U*}emq-5YDhJteeZ$Sa@ diff --git a/docs/skin/images/label.gif b/docs/skin/images/label.gif deleted file mode 100644 index bc4cb58978b90aa35d00abdd007bf3280e9481f5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54 zcmZ?wbhEHb wY1Eq;))ggp>4l!#Bc_9j0(k-=)>HEteNGhYV>qM`5FqCn&%!v9!->Hf0A%AdIsgCw diff --git a/docs/skin/images/menu-right.gif b/docs/skin/images/menu-right.gif deleted file mode 100644 index 879c028069f7e72d643327aae97a25afeb334a0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 176 zcmZ?wbhEHbDzfNY>F3y{s)qT5szz+epk Dc}xrv diff --git a/docs/skin/images/pdfdoc.gif b/docs/skin/images/pdfdoc.gif deleted file mode 100644 index 00dee28aad446d961c01450fae86a39f71506c40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 457 zcmZ?wbhEHbRA5kGXklO|E-Y?oYx)2G`~Uy{=ggZE6d3gP@7FJ1zMMOM?)md;|Neb5 zG%)=2>(l%9@1H+^e(d%3QEFmIYKlU6W=V!Z zNJgrHyQgmegW^vXMlJ?<1|6VrK&L1$FtGl6px)<@FfXI3FXuO-lg{}=3HMzd?lO3L zx#dpZ)!#>X+9eqkW%l(1I5n-57OUryPc+E=w4h68?FNn6<<|>(K4x18^eZg5rKQDV z@3BU);Ba$^U{iBTYg?00eqp0fAGlb2V`vgV!7II9RxpeOA6%*z! z3|=zZZ0U+wy{kFbDhu{6-#B;oyajyQm3B_wwP9ud)!}=UVM1;xs>^9?e~YDa&(ms`M23tynMtd zBjq3o`n}ocQSKm@lYj+NTmZ@xk6H+e9Xb+?eFj m6JT-u?3~D87X}uGW-eJT5e-Wr)=65ir?#xT#IMM}U=08!4(Bld diff --git a/docs/skin/images/printer.gif b/docs/skin/images/printer.gif deleted file mode 100644 index 5021187b064c981bfa6688696d7144557468aaeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 438 zcmZ?wbhEHbRA7*0IP#z2KM*i5+`E78+VyMa&YwHSV0i5Kv8~&-E?u^C&b&EOrcG&S zYbh=)PM*h*oS4i2RBAAXfq~(`fdfF27@+u*g^__lh(QOW7-S~{>;DBReJP%LD^{+1 zWwb0OW|y(&kV>k zoOo=K^QXOuJ0Hm{NahgWnfSbCS&!m_J#TnkY(62tR9SRN+sgHj0JFEIS?oy@Hx34C E05v70Bme*a diff --git a/docs/skin/images/search-left.gif b/docs/skin/images/search-left.gif deleted file mode 100644 index cb204461f84b0c470a682ac9a37781ffb1438364..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmZ?wbhEHb=-0wSpj3#MiYJ$y2Y^Pr3%gEatQ CCLMwR diff --git a/docs/skin/images/search-right.gif b/docs/skin/images/search-right.gif deleted file mode 100644 index 100557317c5aef89705f18c88684051ec645c2a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 112 zcmZ?wbhEHb!8G13vI&>S09)aTos>_v8u~!d(FaQw$~Qjd--}=p+}Y3oz4l#jMXl#4$}=e zr=MOjvAxGldiShPo-T&{9{%4%Ys5C5EhyfjS=}1HD&*$xllifKLRN3vAf1;MURF~Z cEZiZi*J4m>-_ustk~^_ltaApRBqxJ40IWnujsO4v diff --git a/docs/skin/images/spacer.gif b/docs/skin/images/spacer.gif deleted file mode 100644 index 35d42e808f0a8017b8d52a06be2f8fec0b466a66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43 scmZ?wbhEHbWMp7uXkcLY|NlP&1B2pE7Dgb&paUX6G7L;iE{qJ;0LZEa`2YX_ diff --git a/docs/skin/images/tab-left.gif b/docs/skin/images/tab-left.gif deleted file mode 100644 index 1bfd754405ced74a3d51d9e80f402c82697ef904..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHbWMyDwSj51v>Bs|3*W`Jd&Na{2n%}mV0R|L*vVfU7AQGgOftg#vN{Ge4 M!9q>IjFG__0D#R78~^|S diff --git a/docs/skin/images/tab-right.gif b/docs/skin/images/tab-right.gif deleted file mode 100644 index 6803a85611933e2a0002e2500dcd849e04aacce2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHbWMyDwSj51v>Bs|3*W`Jd&Na{2n%}mV0R|L*vVfU7AQGgOftg!Fn8)wn MPK|aJB}N8o0F0Ioga7~l diff --git a/docs/skin/images/tabSel-left.gif b/docs/skin/images/tabSel-left.gif deleted file mode 100644 index 46abc4dd48a5822c9bd3f568a09ab4a65cf591ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHbWMyDwSj52Klhd#1n(PqY;GWiL9a+f$1ByRcz)T$w2~x|z%q^iM%wpi6 Lp(bI*$Y2cs-a-n} diff --git a/docs/skin/images/tabSel-right.gif b/docs/skin/images/tabSel-right.gif deleted file mode 100644 index 881f74c1d45cda8e4caf6fc63b9ad936439787fc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70 zcmZ?wbhEHbWMyDwSj52Klhd#1n(PqY;GWiL9a+f$1ByRcz)T$w2~x|z%xxjW<9BeU LMk|XlBZD;n>%)Ny!GVlSJK8mpb&TtF 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 IbxsLQ074N#oB#j- diff --git a/docs/skin/images/xmldoc.gif b/docs/skin/images/xmldoc.gif deleted file mode 100644 index ca1224f61f15032439564542f57d501d5cf54b6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 647 zcmZ?wbhEHbRA5kGSjxaqTv*)F*7E=V_y7O@&zUzTC@|>n->+Z3d^vai-0|ZF9zVYQ z{P{IYOY?vKz7-Ya$;!$Y8W{HVb;`&{7Z&FJ`t|Ak`}fbEKR#i|247#_j*iy(^XL2f`-g-Cb#}G_!ROC!X3d(lYSofmyLM$|Wf>bApFMka%a-L* zQc~&Z>1WUGOHYrVHLK6p*WK7yUrI`1`;P4m4Gmzo0iA~(DgG06E=o--Nlj5G&n(GM z2+2rQaQE~LU{L(Y!pOy7&!7Wz4bZC!3=C}l4$S|+&LPo%;z{9&93j>VD?$ubL~*h% z7dCiX#u=eI`E{=pUl5a$PF%zb6qC`S(^p(YuHP2qAU6MIRkj>f>{N6`=TlY zg@g-5;zY$b#1k0Gd@Fd_1o;JnBmzX4X3R>MmmJH**B&dnb>{4K&J}TzK`Xay-|4hF zxNF6#12Yfhr3P=EAtqLG`bdD(7HJvT8QhmA1aeAq%1H}K^F5PaC9iPt633NFMI|0V zP8mTNWtpw=vKQ|@sO@%o)X1zM!=myee4)#3*7uJbImH*w&)mJh={Qfpwa=1j zVwTNZcQ%=v(oYdH=*`%;faTK4`K!#1cCBRM78i@#&|o-umG7p==q(e{4!ZJ4Y9G*& zjTW2LC0Vlj;Eaz=Y+G0D-^An-&HRE((lAEl>eee7<{f$w3cZS(-v%(g6DyBCDE9Jt eDx<)PxU;*qW?#L+bz+|H?rm>xIyW&eSOWkroh0x8 diff --git a/docs/skin/page.css b/docs/skin/page.css deleted file mode 100644 index 83db960..0000000 --- a/docs/skin/page.css +++ /dev/null @@ -1,71 +0,0 @@ -body { background-color: #FFFFFF; margin: 0px 0px 0px 0px; font-family: Verdana, Helvetica, sans-serif; font-size : 100%; } - -a:link { color: #0F3660; } -a:visited { color: #009999; } -a:active { color: #000066; } -a:hover { color: #000066; } - -img { border: 0; } - -.menu { background-color: #4C6C8F; margin: 0px; padding: 3px 8px 5px 3px; font-size : 90%; } -.menu a:link { color: #FFFFFF; text-decoration : none; } -.menu a:visited { color: #FFFFFF; text-decoration : none; } -.menu a:hover { color: #FFCC00; text-decoration : none; } -.menu ul { margin: 0px 0px 0px 20px; padding: 0px; } -.menu li { list-style-image: url('images/label.gif'); font-weight : bold; } -.menu ul ul li .sel { list-style-image: url('images/current.gif'); font-weight : normal; } -.menu ul ul li { list-style-image: url('images/page.gif'); font-weight : normal; } - -.menu .base-seleted {color: #000000; } -.menu .base-not-selected { font-family: Verdana, Helvetica, sans-serif; } - -.tab { font-size : 85%; border: 0 } -.tab a:link { text-decoration : none; } -.tab a:visited { text-decoration : none; color: #2A4A6D } -.tab a:hover { color: #000066; } - -table .title { background-color: #FFFFFF; width:100%; border: 0px; } -.dida { font-size: 80%; } - -.pre { white-space: pre;} - -.content { padding: 5px 5px 5px 10px; font : small Verdana, Helvetica, sans-serif; font-size : 90%; } -.content .ForrestTable { width: 100%; background-color: #7099C5; color: #ffffff; font-size : 90%;} -.content .ForrestTable th a:link { color: white; } -.content .ForrestTable th a:visited { color: #cfdced; } -.content .ForrestTable th a:active { color: #000066; } -.content .ForrestTable th a:hover { color: #000066; } -.content .ForrestTable caption { text-align: left; color: black; font-weight: bold; } -.content .ForrestTable th { text-align: center; } -.content .ForrestTable td { background-color: #f0f0ff; color: black; } -.content .attribution { text-align: right; font-style: italic; font-size: 90% } - -.frame { margin: 5px 20px 5px 20px; font-size: 90%; } -.frame .content { margin: 0px; } - -.note { border: solid 1px #7099C5; background-color: #f0f0ff; } -.note .label { background-color: #7099C5; color: #ffffff; } - -.warning { border: solid 1px #D00000; background-color: #fff0f0; } -.warning .label { background-color: #D00000; color: #ffffff; } - -.fixme { border: solid 1px #C6C600; background-color: #FAF9C3; } -.fixme .label { background-color: #C6C600; color: #ffffff; } - -.code { border-color: #CFDCED; border-style: solid; border-width: 1px; } -.codefrag { font-family: "Courier New", Courier, monospace; } - -.highlight { background-color: yellow; } - -.minitoc {margin: 5px 5px 5px 40px;} - -.dtdElement { width: 100%; font-size: 90%; background-color : #ffffff; } - -.dtdTag { color: #990000; text-transform : uppercase; font-style : normal; font-size : 120%; font-weight : bold; } - - -@media print { - .menu { - display: none; - } -} diff --git a/docs/tutorial/src/en/images/figure01.gif b/docs/tutorial/src/en/images/figure01.gif deleted file mode 100644 index 84f171d871e6a19339b7dd8812965d7cd09df2c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15329 zcmeI2Wmg2^KUsA!vXhxHI_RgERQxgS)#s%)DIp z-*}%|N1e61_x{jpbyat-T`i{|%P(NAfkN`?7U@3=`kx2=F9f|D1qF4!*ivWF(Amoj zQdk($DJIg((pv%~1QHSg6A3|pd5VO2i-~zlfQdlDL|~HaVv^j_(A<(RBbd2vxwvix zxNa4>5RwA7l9G~`lDh(u2t~zHNkxQ(2ExF=L($+?(Ewp#VZm(Sz-4i3;o!jK;344P zXW)Q%!NJ49!ox$-BTUgFOv5A0z$4bc1L5a^2=fb5^oxB#!!OprFV?~j5f&D!@gK{D>8#MxWEQnU~nNA3@>AP_L*#crVx1Qe=40@a{_YA{1JxS$3CP>UBNp->PM z3Wh=3|Uix(AuIdH)oUQ`n1pa}Dj zgn7KE2F$|%=4SwdfnhKRY^4yk0)(xAVJi^WE(C^v!Vs_(4~-Q+gB3rEl`xByScjEZ zkCkM#i*T|n3_Aa=L#h2&izU>644-39ON!gfzzSlLDF z?jlZ4L4~I)u+!a@)6?D47rTX=-a=1rcTaCmPZ77Lh!@|zy*<7C&k(nW-T&kzNl$MP z|IHx~FX8blC#N7NDCp(7 zXTLlIDxa+~>xrgRYN(j6vz;oV_X7bJ8(lYtvXs*7b&7>96;aTS-sZ8%nvq5I?5V3{ z@_X1DR`(Zp^iR3Dc6<0QkHgAHbKUM(j#LblN=yCzREcJ}$!H7caJJfFc;~6& zW@EwMV`nAnvFKE@^9{`ckzURp9?Kgh-M~G9QJL;H5@{U%6IXk4bq=dgaO>^qS`R$t zgIasr{pH?Nx#?It`0@5^b2wY=!<+oayUWAXv5t$jq zlYnD#$^ETPi4g?}%PqPYGP_$iDRsu5b*j-6+l?ruqLPhhwuZfp7)}V&W-Kqvb~BED zr(`o;_-1eOw>UcUR)RFK-PRv@2GRm|pQYgSB(-*$ZBm;cd2~{J%k*tRzFy1Tce;tM zHj;=_?RL^_i%NGg92@p`GF>6eyMXU7EXHJ?ozmTZ{x|!(*+J+mdpTjm_ItUJ3}t(H zv3v)6`3bTt`vpJSB??o_zm;wm>9eix6QVbpg}za;bld*>F@rQBDY@a`pd4NeVL7a* zhuI$jn|8_$E8A|$7?nHGAMumBiCM>!{hv1DYq~CKdf&)mPK1^eWU%azTk1s8l(%~w z9yhMZGH*9+r8=B6?-iAwv>Y`Yp0u7pSWnxoU=CF+T07;Z?N2v{ryWQbY-gRQ?;X#& zFc~XcyAb?S5frvLxmNGA9rsJ$$dIg$h-vXXx%Lw2F75Y`x)^PXt#jt%a`*3TT(EPl z(nd4Y1zjl6uRnR9)=N&Cb(a*H46-TvtTzd^!wkUtif!a2+suob00DG410Z&jv=9ODi9lZ@n`e;Md{?RysbLE4n|3WFE|-vVJ>dF_UwADN{|;Hb0jW#;dP z_4#q)ng#7HO+`-mkJ==CY_Umy6z*0Bze_Y((OFRAz?X8xt%DU*taGs>0A`%|P15R+ z%^U>3tuVX>LwK+=d8TbuEYhxzSa?5oDAqO`_1jko^XX_9osLi>^+bZRR(^*xvwS|u zgdN)W-y}1~Y;cwsTU{ z?uFL!>jRU`-y$iI%?qVpW$HvVe6Hf@Q|CpU{KbzcMeTU!V3u3o7d%H;T|Qm@k40z{ zTE?3XHH(NWh?<0c9Gg^l-LnmKcSg;Bv&u8L@5 z-V{fDNgy# zL|2`o5)cVB&Q5NzC{+1YX~})=H3vp}d=ioUg9%K)7~?wZ0?7gydSazGo_f`EKrgC0`O5{`y zG%_EiOH@H+^K@YDdY=;gCgfNPim*kuA6S*Lp>Y;*76ykpZ`+z^hU5Pj>9=jn{qZ>= zttVLCXSr`t=5R>Lbu>}Ip~F0jtipym9@|S=#2f{ohwqIz$)>fAu!vv%l}KcPdCG@mT@Vlv(QT04p z>FI;wKzI43H<|F8(QUVA0sLw5xjCviN-BGuGN?p}}R0GQ7#f(EVD^IjlYZ z6!%%_#~akK3x%bP?Ox(Y4)@@g;JG%UgtKlmhyKg1Uh|QKm~q;?Hq1^z6x1LfvZ000 zgT29S@)^I}p*B*kCQP(psTzE|?ts~l8gkR{GvKpk#{)|}6>3a%gh)lG=Ur-d^5)&E z(*QNUPLqwhGkP>bEBMc+txv0hu+#Pv<4+G4-XET3!m4=2T`<>L1D^))+wXVP5D$w8 z_}y3s{B{fhe|-54APGX|4?@)oLiY*6{2PSb6ofnQQ$UBsihxbY3{Ae;M}pG_apo(7 z6iiXad?^+D%PW}e7OP>6`_2+KSr-Ro0;`e$)A$VEBZ$Vv3^kF5miP*P(#`LYfnXB} zS-Kjt^84$`X>{*SuWk%vM;m-?aX&ds8pjCz0h=&!CW1vIWO>)X<@aGyJ{Zm30XLnm z1zi2nb=u6= z9F9%RiN0|g2(M%e$7_m=or{dWi%cMiO5~49){9D=i$qYPDg~kG6R?G91xq8L^0*3B z6-NOE*mC)!N%t@iYglz>K8as`G@Ido#Bq=(uz&=ZMo6JtBp7n)p~L1#-Tbk=da>wc zA9!gfO2RPB`;p}dDCLom-`XlguAvVP#8Rurm4w;Nxy5y_qqD7r&f3P!M`BJe#Z9co z%`s6-@W;6YVY+o9TLfVWB%loajq~fYJ+zH4u|%6YN1>)hndL`c|7+F#=J%!EZv;ug zY-GY2)9>}%_$!|TfgnX`SB!nV_*wpVLj4a^_kXBK6KMq!=|~gPd=i<`6S3~_CB#{j zsJV5=;clF=s1nrC1^mA3`^=ooNpY6JeCfgYvsg*g*j)Ki^-PvEK`|BMnChMC;JcXo ziyuSgv04JL^gmMc(o+nYQ;g6=`~+Kzg!% zdg_n#zv<~2&FL3^qIf$|#Hms91Tv)6GsMqQ^L>Qe^u=-nG79W6N)%AO?7t2pzzpHU zY!bjsq{jL~fR%uR^_u`Q4hhp!91W%aZ)Xz)>{U8o9ss=ujFV>|XVKl`V^C)< zz?-v{O0zJ6LL-B+mIeMT-e*<4fBlUB?JG6fkpP+|0h$Rxw(&Tc5fYkK0$x8UMw|eN z)dt1g8_Fjd3S90SRD&FJ-yF=09PA8gmie654><&6xrBnbc)p=1Z)k{F2ne`wiCfru zsxiP#*>0}rbBQd>-I#AP@>p8(*cS3Q9`ZQJ^0@``QTH&0*D?5_89dZ!JjU}y%d$V) zqEmGJQSLd6@3#d zvNR~N_AN3opx0F_a9k+T&p{I>OR;uEQ&unb@-6nsDE4hB_FpItd?*egD+v)SfrlBC z{PHb{%qWR&DT!SuiGL_bAS+E2EKN2jP4zAPn^Bt4QW}X}Olyz6NKlq1SXN+AR^(e& zl2KOHQdY50R{2m?O;%njSYB^X-r!r_lu_Q&Qr@;u-u_VDNmkJ*<;6^ zl@2UaKp!f`$$*oBz-a>@%ojM90bFPSE=89O4OJ|YRc;7YZW&bW_*U*^R35Zc9vuLO z$qJ6isxAbpt_-Sfe5>v!z~f5E%|=UmE~p1 ztSzB_tyPOGP*?!R4-opak%ml4Iwq&w4?D~~;C^aszHW)g9zm|98mp5$rH3Vfg z9~pL{`*&gbd0XhjNx(L}?abm0R9V_1pcagPqQLxp&Tk4{w=%y9!u6gXD z^Y3N?bhC_9GqiPcJauzY^z1Bja~t*W`S}D&w)b5A)j|>1thT2A?cuZT_+I$Ynx|BP= zu#ScckIYe&U8amW9F3f^6q`|WS}k^LRkV~o42KO5_mYh)2@ftVK@E>av&o=0IPDsl zjYUdjdlaLG{-b9jgQrhp{A^(dR}%38(td$+ld_}$bkK%%afcV6I>4C2NdnI4wFTSlbFlR zZ$_uKGbgc(%h>RyE;71qA10;2-P~FAym+JdDjhpVgK)qY3mD87Fu7Jfs+l!?h24o8 zGi?;tt;8-&6;L6#3}%Rf{d}CdtC%qls6sl!msP1Udxm`!hN&!%;T?C-1Po%~H4&*a zKD5nvjaIs`&$1fMhU0bn7{eff)AfS0q2Reo-?_-F+E3u74DdW)dH&z?d=7BFVrWEI zc@7CUyed2uZ(NZOP?P3g4pf=nw4YCVo^hz%I zj{)mkoSVERn|y(r{Qouu+c$+*Hbvo^;#6CbqFd4?Te5*$^8dCJ+qaZOHy6N7DpcE2 z?XOv=R@qF}cLdkVqPO(}*Q3}r)nb=19Oon0=V!5rv`%0j1GYI#Rxc?xyNt)FMEXSl zudiKouf*{Y3A=DV4t(U?T`i^^G@~6W(JEV$?T3+_%jXRj=&0Gh+-pvPU2$ByAQUNa zjJ`8M$ARq-c$*uz8QFYi#&^$NbtL*<-84mo!M`#9M|qAT%tW-Q>Ul!wc*Z&te4AM& z?$F%Ky6(0zVKCZrny{ORghDRDJQc18D8h){t;_KE=N^CJ07cO9nhpnAFrZ3 zzHI(vxO^6ULAYYl7>oft+*7Sx{MXb9ZN2xe{QWQYDhG?UT3SBr)t5Cq1SdYqtK-Ar z`l*%5nZVEyH1N*@w+36Q~{1tIz zIjvU&XK*C?pVB1NXg5fEY?TcjPCH9}HM`Kdyuh;shchA8^Bz{{bnE4*b6cs&dGX@Z zz++9`bJeTU%Tu9C(oa`&<&7vV+jH@k!I>=$ugkGq%5YZ8K0OaE99_fU2MzX1%j6SV zY!glJ#!J=-2eGz?n2x)}n$De=;8Yqi3IdGP>1KIjl3dAsf3of!-ZBUdF6mIgeeYnx2Ql?@mpw5`VTbP+mugUNUC===p^2ZI{N#r$4Wm z;I7jCzop;0UXY$)gm+wK{Jtwxd-#W#;Ag*#_<16TbLl@^zceUlB( zaGt(_NGx*MjlcJemEUlq2-$UjzVFJx`1n-3XV|$Ry0vP1+Tdma29@kj^F;xEQ#PYX zf=)MY=Nqh*TRl}^0YdH^YE2PB>zF^X9JWuen5b zfm{}s!QgN*Q`T0O{k}dPO|NvyHpixwI8C|i_ME-~rA*N{!FT1b`xZpj;h9;5F196@ z&lS1+V)`P!ZZwD+|I1{9rn+$NYs2cgqZ9YD&N&L{1YYb9jtOl5>S=-=lxq!wUMw{> z^|lF(!-Uog&ZY4NED>BT83Lyzg+@=G7;}*wB(v8d8+?}4&0AsEiGtBZp&a?~f*Q5` zxz$Q%-LK3a)P+zZ!u|}M6Kbi7aQ%@|WG(`PD6+(t3>{?u3#w;=MjbH2gT-ng(MTZ} z9P%G2>-jCYq$cPJhU<=7l4E*tV{q8p2-$llC&Ue7&nBd0rZvX9Wu@w6@vyX~r`~*s zt zr%h+tO8-M7EP?J`?H5Vn9#cv_n}Bt?O;Phs{(=yZ=x6-0Dx=3eI5PyLif#NdIFG%P zChLa@hsLY~O@q4<1*^>Y+Bsca)4@qWJeLDex&NGlk^tQOYmF3m!9iPy1&-*yvK(^thQAg38A{qs~Niq)nD6 z;Jjue8%$8QD7?j8Upz*xd}8-*adv-LQ0}p5K^EZ;njI|~RUa2t%en#RTs_w**tuWt zPnZj9U%mU%q0`eci%Z(nt+Ya(*KX4u$YfQ#+wON7BPeX+_I~U@?~<}{mrYQ0p!3x; z!&+y=H@b_u?YxEn%$IK9ZpTlA$mA*lRX%Ii>C}aBa0LmD=U!{VJkGS}VTMXyQov24 zYO`6ZhF+tA?+Yj-u_x)qHscJ_n#QNP>0GKk`65BwFdp9hY6ZtiF98|dS&%j}SF-Fj z0acM8L;&?0YR`L)zH{YJxu*z`>GR*i^Z8T=y$$`fSHFj^IU{v@zY&8X`^aRg=ybH! zUZ>^veQ=(L4JZG$;RRu!YnX^*7Pg?+=9d$6uZr>Rp&{;TBH;Wr@yipH?wW79xf|nfy(06K$|j zVYwimis^`&XiO6ShkQYFMXwcyXS0&Y&16~!Dg%cQ+^+M(_17Rjtw^rl`a_z0Q}Us7 z8)WS117*TrX?Lk*$y_;61xKn_m~gH6`vg?oQ>OsCN86kTA94Pyv8>ZD8{usMHDB7K zUj^T-MJJMm&Pl(fo$jqMm{q^R*2_UAB?%^L4_5ufH=TyX& zUV!;QVYF?qL{7$DBc(;F$oGVXCfr`DP*6LzcDigOq=<~`uad7%D5^TVz%185jVGBHE1hDIey(R+Mm>E z7}s_%$oDg*26?tl&p7$?37N>d-!OH`xcG+u)z*GUY9jqk5qOoqF!+iobivrc1LS9X zb~D@h^ju|d|F{HCobAMrb=4m66Tjx0>zX2}^i#-O-XCIC{jPZIe_3BFx}Vnh7M;@z zh_mvX=+n8feBwy-auKFpU48+su~xXE@SB^d1frXC=kY=guV&Voi0-zMS0_G$Na=^Yg@p+ zu$`h%G33)bHsQE((VONfvre7hqSo zi77t@CGbPk!{~Tv_*Fz4zr81)p(y=cYXvw|!q7=mwA^U^N7DCG`OSDA#H(S^-!Xc6 zdJ&&spwWTM+3hi6Y5QiVc>;Li4zDv@I)U@Gf!R;pTu_!Rb8ojUoSgku$(NqnZ`;rD z&OC|QmeGHH>D~mM{Xp@z60NP%i70o9)?M02+v4jvJU;#DVYIdnYigH*y8Qm_zeX?D z+#$B&mXb-a#f;xHtWV|f_dUf9{;f*yqMwzi#^r_>hM+T#$z>>!$hxd4|0H?kRa_%r zpZ2HVV3w$7hUW5)R)4dJr?W*=3t?&KU54?!VzMWddH6lzq`-Cypo9_EqB!K5}4C;8+yd=IruX)yJ9M$=4MhMe7!@xlcZJYP5=6v5MU& ziQgHDp*wcm$A~>7bz&BDqKAp&0K{=C#G!Q^);&DNWEDExY|ru)p86FKdk&=OoOz8J z-Rd6x82lq-83Ve7*CR)mc+THJGoJNxVE}Em8E!(y4V5Dua&|0 zBZc%&MU{8aTNxBP(G>{En*N7MvEFWRM{f3`?$5kZ+`>IlyuH$v($e31W&C^j*rXM- zq!cZCKA<*t__b%DFbK94JtY9(XZVkatfF*0pLuvBwE9p!_A2&Dlh;ej#P-RC^%?;B zlMm*VCwqc?QSJvA%FS%jdoR`Ip4aBSs(UNl=dV?ZyxAXL z&-ydDF9cU1jAAg9S0VhZf`QRMa<5E;gFMhrUZ9uWI~h~-vO$bo{P2N;fV>{*Y9KqT z)rGhJ+LW=NEitDPck^zkcbV?&%6KaB_>7^ArFIj#dC#ooTY|Axbj^T1D(9e z`HsWAv5G2TN?wjkwhnoAF?KU!!S=7;aI_LtgYQxh=VsFc0 zo7mEYpniy|K`s4ifojeWzg3UwHSMTSxndMqTXzqG(*}c!VA=t%+CRaDOD#1;!EXK| z)z)t!v#cediY4I&V~>s{7Q@iz7Lt+X~)kcM)s%y^ouqu_`6?WbziS6ynVgostTm;Fk2@cnX2DGaXk- zd9X6Qt3E>3cz-=?cscnAZHn{V6c_yz_h(HriSE7puOd@;_t75Zg96!FRP> zJax2-liIvhBG*&0?rNV!Ce7I(-+HUbXE;U7A(WK7l08$JxZ+}{(%DZ_th}F6gL!F> z$HljsB}Qw2LH$&j{XV7r9}3x6!>5HjCwVR>6br#hanYU$Gx~)y2A~v5I&ydjmQ$8)e$1Tl zgppan3^3AR2Wu)=X)`V>usLbl8MldQ6FJ1aGA*3-1?l>xBI>&yu2vw-yt&<%@xC@J;U}yd=d2X zQX#sa$lNwN;)!`OEwZ_oLhP8)xxZQS>FaYNAan|4jZ% z%bK^xqc41BEhvo7e4Z}>D@W2NILyZwLjFYw)7$2b0mt z77ou0hL``ATNw?qr`N_A#e6o(>olIf#vKVTC~MPMdVrQ;s`Y*xqr+Zir(EupNv3U% z`=oEw<{CHthqyandDaydyi7K=MhRMvT6J3LL0jq?rRV}L8cD2zjVYF8<_9@V?acK# z>~LpONJp(|?kGy`V?`c~Om+$la#NCPxsp?7QksKtE3uL|?`e$g3AUnAQ`uRXuu^VR zR%gZu&*YaECo<4#jrF()!rWq{UYVYQ^w*E4mypK~$khQXcng8sxg@UC9jepV`D>La!VNh%X5G)qn*linIvJ=gevp3uRZl7-l8ej;sa->e_B-hpYj z`+2SE%{Q@?bq2l-M$xR3IpPQU-~FtlPxK~qEEPR05=7V75XrApg$3LU7TU{}th}4q zlAG-Z=Gf4;7|>0j_~hd~ivXH$I;7?zRAw&?LI3l_lTmX$69O9al^xeD)Vi-7Wv#!#x6H7u+R3b->nrlPR<_pU)BJ1t492z)GABqX*6Tmm5NqvyYpnI1 z%Xcy-DE;^#x>U=FhyMa4jA$8Qqg;4z16+vOQHnCOZ-KJLMX? zMOF(1Df4UY1}3uRavquwWPSYL$tT)cLGYe%-=1cLrvK62Z>qf~T(cjA`P#qc!>spM zI7V69*>PB>`S`WWAVf09oSGopfbTFZBVNgH9T|^lS(Um^ukCWl?4q3ZNV)C8E9V~r z_P#9E_*`*mfGrs=cLA^gd?9UrWf|bgL9T3ZNJCj@U~U0AZLKp+4Fk3pw4y6>fI|xA z*(|SlZJVX4t+g}|8wRndcTl`Oa78|(RatN6D<)BQKqZT{%^5j+&nWa7;fk7e`sNmmD5AYnmGe13 zZ27Rs2d}pTf9SEhUH2cae!3$T|J^+ zhA~3$y_-<~Woh+Ei@S|bm`zQBjjHJpqm$!No<{6jTa6A@>D}wEhF5O0N)e^K5aq!-?5{>3(FG zX#We;DYw4-xaid~dE*0jsdK*dLdW->*70KWv;X>x?F+DvuQ+HX_Ngek&6#%W7rv8A zy7bF-d5pi})b(kW$!lQ9Xp|+hN^xjuKltYib1=P=dhbbve^30;^-=ama{nns_IJz= zo;~q^%z8jjm8VpzXS@mPTf^JL_xoY9D*wD|?*sF#nNCy1+!9S4=mg8JCx+BE6~Cf9 zKr(Mj#H!tFziW_$D=~!ucOR6R!c1%<^3=Q(<$O^domx>F+9>qP7+Xti9?xqZP`|kP z>G?$w__?imM~meFW=^uUoyP4f9~%q-FHuw zc7D4aH?rlB$n)p`;o2Na);C6LN9^c#j4;R zI+0q({R{e$zuY#H6{Kzyt$?EiP@PTHI)4I-#ouq1y@Q3EzcWz@=ZL4U zpkZq9JlVkqT-Qdb5WRwQtpqF!_4c#1R;=GG6_OS+x}6+uIab!w{ZM8h#;(d9N1#?mD6nlq`htD3{MSdVe%` zYJng9!38dScVV4X=W;6g&8gWVz2CA*`_}_G)5Oca}qY$cJcd?i-@2~&bExo0Q_!=@t<11|NV_TVJMTa`o*mrO< z_IZYcIv%C=j$Zoe?dB_OV%zJ^Oyac!sPOv*0jp%1Uwd>uJ`V!lvTd;inVk3*7$(!h zSX!7|%+Y0yoRC@4nDWs|bGyFJfH_sHy%TlGd~<#^+SumV7n79~`!d=W0>72g=Lxk4 zvH~3h4zeYXsC0J9<_I)m~1FfC~u>0u9!<<-!B`uZ7z!wI0piM?Lc zG=~AcNcy{c2mxy+r!>n*cPOhV)a21QZBhgK6Zl#*nZ4kbVp)D;^g=#VENek?3@(Ob zgN`qpwb07h!#;TE(DSAv=Je;Eiy;?hLWef4er%B?mwp-|MYl>~j~F)(+VZvw&iy7VX2G+~ai{MZPR^dm4XP`3wf0&JpZBe_113 zrsQ9zJXYBmb$H*-zZS{^=a-3aA#dDBFbr(iOml!|t3HVsaIHo?f(7;sY)o2q5*L;4 z_exr+uJ)_MDqAMSpet|}ORirm&2tUkl$Gv@{Gws{`F_v$gLz^nb%RgVSML`2~9VSeoA=lgzgMC$S3 zSpD8T}pcD=UgKyhjQ^l|I)+z6hkE|hzWj| zNT*)8MujTo5#>kzVNje#TUYF{%i{gv{w&cC3dEly7> zpFA8UK(>wJws823A`P=&c%?Ybe|nSn-JM+e=vQS=z|vhT{{ZC)-0hDB>(;I!af?vd z_#a8f0{Uwd1+O=F&QTPDf|ATbUlVJSi-hS}G)srHYim;~{pr~(n1}TzYf~HA=s7$} zhm9|4)ADc&P4$$Bk~%|Xp`c4g$uam8MEy)>M~$$419H^qfYL1nJZ5W z{5{N2x5PTYjxeL(R4LTcH;Hc8l2Le*dF;nz-M^bQM$!BzF8_WL_g`aEJVlPpi!M4WqlKGidmycEmipTznC1`%dO&9cdq z+WJC{<-OdUi^=rK`XW9sv#LkgRF>k~Je25H>Y*&txr88iiL3~VMpD^yAvdU0HGoAc zpJk?015~C1X3?oDn*q9emR{_$==HF`Y7#*e)*`G1;r5>+YC%Bf09K<-mf7Y>P^A}` zRb)1L7JLD!3VdcYLt&lkA|%ez*<}7kR6f_o-B1$`EQzCHollVUs!iRtwffXLH)7vV z_x3ZC58rTZBC(dt=*4K$ZOu98=JscROS0sr%I8^0h%77=H8oDX6v7^ysxu3mV^XaOUu;{lk~e z*MY8H=MJl=JZateplY}G%A@E~O+Bw6XRZ>sMsILZdtt{6FaHW|+-LANvO|tzp2;lc z?R_$aW}y792vjMnn)=<1*`vJJ$bP)m&k=`k34|I!Y2RNBD5u86|EPd6qD&8Fy@^Wh zE457GY#!GA#hum>YsD1P3}O-``_cGko6Rq2)B;kJ8Ng=q3&IDTvAoP!XSNbrt%ELY z)n#-6EI1h74lJNv#bY^HKG8m8daZcm^yAvGU6M>1>(r+=+bznv@Id2st^iWUYGU37 zqB*j=rJIIE$~HvfKSXWHcJ20bsyrrN!RbGjohsWZSv(9kGLNaB(G{0 zDK2SeTX)btJ?8LG-2~kFk666ywU&c#s=oL&ft{U75m^^(pWwq0E`GZG@cnj|=l#`_ zAK`UW7oHt~Mdqz>?v$3r&6Cg{IBhfXCq3%Yc7Kid1)4X1DrA=|Ix)(NsR>ft&T^ob(UqFR$R5 zIrQ$?*z*~T+SF=h%pdSVk~u4CY(g!}A{aKU9>$FhPO47apPU1IGwc;=lRj#@{k3rL zT9oHXSbCcDaVpkE&YRkI_{2JdgfK#gHc={xCmszN@%kH`TuBjgGjkd@nqO4m(*x+Jg7(N=JqQfMema`98&lkcoicF$1-rg?#BeuVdu zz-VX$KM=UD(fFEun4F_MNn4Pop@Wz&jhNHuY?OSa4K~jUw#&m|*zlVmrXJG5TF9YK zr4`*?H_pxTaLdE3{T7~uN{3EM0axX5!p-|W!tSojAv(-qKa!q>OG_QXjQf#`IG>B^ zBR4}nH^)aFzWhrb(T}{c`MjzhKkMXwHu=bBozLg|@rzgfm%xwwzw-IxKMJJg3;g>i zShV@s1otDSBxn0aVMx9(x`hxdUu5N@=uW=q$w#r9d@=Y(ar6T5*K`uZ1rk(rk_-is z9CT8A1yZ7P(y|58s&q0s1u`advepH%4Idjxg5?6~b*u|@oauGF3UveN^?nuV#nbDj7V7__Hz+DJsH8V+pw~x7MH2dd D6<2XH diff --git a/docs/tutorial/src/en/images/figure02.gif b/docs/tutorial/src/en/images/figure02.gif deleted file mode 100644 index a61687fa5c64a7f0ffaf462c72b1cd64624e3963..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5148 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 diff --git a/docs/tutorial/src/en/index.xml b/docs/tutorial/src/en/index.xml deleted file mode 100644 index 33574df..0000000 --- a/docs/tutorial/src/en/index.xml +++ /dev/null @@ -1,34 +0,0 @@ - - -]> - - - iBATIS.NET Tutorial - Data Mapper Tutorial - Version 1.2.1 - June 9 2005 - - - Ted - Husted - - - Clinton - Begin - - - - - Copies of this document may be made for your own use and for - distribution to others, provided that you do not charge any fee for such - copies and further provided that each copy contains this Copyright - Notice, whether distributed in print or electronically. - - - - - - &tutorial; - - \ No newline at end of file diff --git a/docs/tutorial/src/en/tutorial.xml b/docs/tutorial/src/en/tutorial.xml deleted file mode 100644 index 21cff7d..0000000 --- a/docs/tutorial/src/en/tutorial.xml +++ /dev/null @@ -1,1054 +0,0 @@ - - - iBATIS.NET Data Mapper Tutorial - - - Introduction - - - License Information - - iBATIS.NET is licensed according to the terms of the Apache - License, Version 2.0. The full text of this license are available online - at http://www.apache.org/licenses/LICENSE-2.0 - (TXT - or HTML). You - can also view the full text of any of these licenses in the doc - subdirectory of the iBATIS.NET distribution. - - - - Disclaimer - -
    - iBATIS MAKES NO WARRANTIES, EXPRESS OR IMPLIED, AS TO THE - INFORMATION IN THIS DOCUMENT. The names of actual companies and - products mentioned herein may be the trademarks of their respective - owners. -
    -
    - - - Remark - - Original writing by Clinton Begin. Adaptation by Ted Husted and - Gilles Bayon with the aimiable permission of Clinton Begin. - -
    - - - Welcome - - This tutorial takes an "over-the-shoulder" Cookbook approach. We'll - define a simple data access problem and use iBATIS to solve it for - us. - - - - Test first! - - Let's say that our most important client has a database and one of - the tables in the database is a list of people. Our client tells - us: - - We would like to use a web application to display the people - in this table and to add, edit, and delete individual - records. - - Not a complicated story, but it will cover the CRUD most developers - want to learn first. :) Let's start with the people table that the client - mentioned. Since we're keeping it simple, we'll say it's a table in an - Access database. The table definition is shown as Example 1. - - - The Person Table - - Name Type Size -PER_ID Long Integer 4 -PER_FIRST_NAME Text 40 -PER_LAST_NAME Text 40 -PER_BIRTH_DATE Date/Time 8 -PER_WEIGHT_KG Double 8 -PER_HEIGHT_M Double 8 - - - The first thing our story says is that client would like to display - a list of people. Example 2 shows our test for that. - - - PersonTest.cs - - using System.Collections; -using IBatisNet.DataMapper; -using NUnit.Framework; - -namespace iBatisTutorial.Model -{ - [TestFixture] - public class PersonTest - { - [Test] - public void PersonList () - { - // try it - IList people = Mapper.Instance().QueryForList("SelectAll",null); - - // test it - Assert.IsNotNull(people,"Person list not returned"); - Assert.IsTrue(people.Count>0,"Person list is empty"); - Person person = (Person) people[0]; - Assert.IsNotNull(person,"Person not returned"); - } - } -} - - - Well, Example 2 sure looks easy enough! We ask a method to "select - all", and it returns a list of person objects. But, what code do we need - to write to pass this test? - - Let's see. The test uses a list of person objects. We could start - with a blank object, just to satisfy the test, and add the display - properties later. But let's be naughty and skip a step. Our fully-formed - person object is shown in Example 3. - - - Person.cs - - using System; -namespace iBatisTutorial.Model -{ - public class Person - { - private int _Id; - private string _FirstName; - private string _LastName; - private DateTime _BirthDate; - private double _WeightInKilograms; - private double _HeightInMeters; - - public int Id - { - get{ return _Id; } - set{ _Id = value; } - } - -// Other public properties for the private fields ... - - } -} - - - OK, that was fun! The Assert class is built into NUnit, so to - compile Example 2, we just need the Mapper object - and QueryForList method. Wonderfully, the iBATIS - DataMapper framework has a Mapper class built into - it that will work just fine for for us to use in this tutorial, so we - don't need to write that either. When the - Mapper.Instance() method is called, an instance of - the iBATIS SqlMapper class is returned that has - various methods available such as QueryForList. - In this example, the iBATIS - SqlMapper.QueryForList method executes our SQL - statement (or stored procedure) and returns the result as a list. Each row - in the result becomes an entry in the list. Along with - QueryForList, there are also - Delete, Insert, - Select, QueryForObject, - QueryForPaginatedList and a few other methods in - the iBATIS API. (See Chapter 4 in the iBATIS DataMapper Developer Guide - for details.) - - Looking at Example 2, we see that the - QueryForList method takes the name of the - statement we want to run and any runtime values (stored in a parameter - object) that the statement may need. Since a "SelectAll" statement - wouldn't need any runtime values, we pass null in our test. - - OK. Easy enough. But where does iBATIS get the "SelectAll" - statement? Some systems try to generate SQL statements for you, but iBATIS - specializes in data mapping, not code generation. It's our job (or the job - of our database administrator) to craft the SQL or provide a stored - procedure. We then describe the statement in an XML element, like the one - shown in Example 4. - - - We use XML elements to map a database statement to an application - object - - <typeAlias alias="Person" type="iBatisTutorial.Model.Person, iBatisTutorial.Model" /> - - <resultMap id="SelectResult" class="Person"> - <result property="Id" column="PER_ID" /> - <result property="FirstName" column="PER_FIRST_NAME" /> - <result property="LastName" column="PER_LAST_NAME" /> - <result property="BirthDate" column="PER_BIRTH_DATE" /> - <result property="WeightInKilograms" column="PER_WEIGHT_KG" /> - <result property="HeightInMeters" column="PER_HEIGHT_M" /> - </resultMap> - - <select id="SelectAll" resultMap="SelectResult"> - select - PER_ID, - PER_FIRST_NAME, - PER_LAST_NAME, - PER_BIRTH_DATE, - PER_WEIGHT_KG, - PER_HEIGHT_M - from PERSON - </select> - - - - Since this is a very simple case, iBATIS could in fact generate - this SQL for us. In Example 4, we could have also written the select - statement this way: <select id="SelectAll" resultMap="SelectResult"> - <generate table="PERSON" /> - </select> - - Using the columns from the ResultMap, iBATIS would generate the - SQL statement for us. But this feature only works with the simplest of - SQL statements. Most often, you will write your own SQL statement or - pass parameters to a stored procedure. (See Section 3 in the - DataMapper Developers Guide for more about the generate tag.) - The iBATIS mapping documents can hold several sets of related - elements, like those shown in Example 4. We can also have as many mapping - documents as we need to help organize our code. Additionally, having - multiple mapping documents is handy when several developers are working on - the project at once. - - So, the framework gets the SQL code for the query from the mapping, - and plugs it into a prepared statement. But, how does iBATIS know where to - find the table's datasource? - - Surprise! More XML! You can define a configuration file for each - datasource your application uses. Example 5 shows a configuration file for - our Access database. - - - SqlMap.config - a configuration file for our Access - database - - <?xml version="1.0" encoding="UTF-8" ?> -<sqlMapConfig - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="SqlMapConfig.xsd"> - - <properties resource="properties.config"/> - - <settings> - <setting useStatementNamespaces="false"/> - <setting cacheModelsEnabled="false"/> - </settings> - - <database> - <provider name="OleDb1.1"/> - <dataSource name="iBatisTutorial" - connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\tutorial\WebView\Resources\iBatisTutorial.mdb"/> - </database> - - <sqlMaps> - <sqlMap resource="${root}Resources/PersonHelper.xml"/> - </sqlMaps> - -</sqlMapConfig> - - - Of course, besides Access through OLEDB, other ADO.NET providers are - supported, including SQL Server, Oracle, MySQL, and generic ODBC - providers. (See Section 5 in the Developers Guide for details.) - - The last part of the configuration file ("sqlMaps") is where we list - our mapping documents, like the one shown back in Example 4. We can list - as many documents as we need here, and they will all be read when the - configuration is parsed. - - - Did you notice the ${root} variable placed in - the path to PersonHelper.xml? This variable is defined as a - "key-value" pair in a properties.config file. We - are using this properties variable since the application root - directory differs by project type (Web, Windows, and library) and can - cause lots of headaches when trying to figure out relative paths from - that root directory. Typically, the application root directory is - where you place your web.config or - app.config file. If we deploy this project as - part of an NUnit test library one day and as part of a Web app the - next day, we can easily switch our root path from "../../" to "./" in - one location, our properties.config file, by using this variable. - Otherwise, we would have to change all the relative paths defined in - our SqlMap.config file. See the DataMapper Guide - for more details on using properties files. - OK, so how does the configuration get parsed? - - Look back at Example 2. The heart of the code is the call to the - "Mapper" object (under the remark "try it"). The - Mapper object is a singleton that handles the - instantiation and configuration of an iBATIS - SqlMapper object, which provides a facade to the - iBATIS DataMapper framework API. The first time that the - Mapper is called, it reads in the - sqlMap.config file and associated mapping documents - to create an instance of the SqlMapper class. On - subsequent calls, it reuses the SqlMapper object so - that the configuration is re-read only when files change. - - The framework comes bundled with a default - Mapper class for you to use immediately to get - access to the iBATIS SqlMapper object. If you want - to use a different name other than sqlMap.config for - the configuration file, or need to use more than one database and have one - SqlMapper per database, you can also write your own - class to mimic the role of the Mapper class view by - copying and modifying the standard version. - - Example 6 shows the code for the standard - Mapper class that comes with the framework. - - - The standard "Mapper" facade for providing access to the data - maps - - using IBatisNet.Common.Utilities; -using IBatisNet.DataMapper; - -namespace IBatisNet.DataMapper -{ - public class Mapper - { - private static volatile SqlMapper _mapper = null; - - protected static void Configure (object obj) - { - _mapper = (SqlMapper) obj; - } - - protected static void InitMapper() - { - ConfigureHandler handler = new ConfigureHandler (Configure); - _mapper = SqlMapper.ConfigureAndWatch (handler); - } - - public static SqlMapper Instance() - { - if (_mapper == null) - { - lock (typeof (SqlMapper)) - { - if (_mapper == null) // double-check - InitMapper(); - } - } - return _mapper; - } - - public static SqlMapper Get() - { - return Instance(); - } - } -} - - - If you wanted to use a second database, you could load another - configuration by changing the call to the - SqlMapper.ConfigureAndWatch() method. There's - another method signature that takes a file name, which you can use to - specify another configuration, as so:_mapperTwo = SqlMapper.ConfigureAndWatch ("sqlmap2.config", handler);You - can access as many different database configurations as you need, just by - setting up additional SqlMapper instances using - different configuration files. Each configured - SqlMapper instance acts as a facade for accessing a - datasource. As far as our application knows, the - SqlMapper *is* the datasource. Behind the - SqlMapper facade, you can change the location of - the database, or switch between SQL statements and stored procedures, with - zero-changes to your application code. - - If we put this all together into a solution, we can "green bar" our - test, as shown by Figure 1. If you'd like to see that bar for yourself, - open the iBatisNet Tutorial solution available from the website - <http://sf.net/projects/ibatisnet>. If you do, you'll note that we - set up the solution using two projects. A "Model" project for our business - and database code and corresponding unit tests, and a "WebView" project - for our user interface. (After extracting the solution, set Web Sharing - for the "WebView" folder as "iBatisTutorial". See the ReadMe.txt file - included in the solution for other setup instructions.) - -
    - Green Bar! - - - - - - -
    -
    - - - Playtest second! - - Now that we have a passing test, we setup a page to display our list - of people. Example 7 shows the ASPX code for our display page. The key - piece is the DataGrid. - - - ASPX page for our Person list - - <%@ Page language="c#" Codebehind="Person.aspx.cs" AutoEventWireup="false" Inherits="iBatisTutorial.Web.Forms.PersonPage" %> -<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > -<html> - <head> - <title>Person</title> - <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1"> - <meta name="CODE_LANGUAGE" Content="C#"> - <meta name=vs_defaultClientScript content="JavaScript"> - <meta name=vs_targetSchema content="http://schemas.microsoft.com/intellisense/ie5"> - </head> - <body> - <form id="Person" method="post" runat="server"> - <asp:Panel ID="pnlList" Runat="server"> - <h1>Person List</h1> - <asp:DataGrid id="dgList" Runat="server"></asp:DataGrid> - </asp:Panel> - </form> - </body> -</html> - - - Of course, we still need to populate that DataGrid. Example 8 shows - the code-behind. The operative method is - List_Load. The rest is supporting code. - - - Code-behind class for our Person list page - - using System; -using System.Web.UI; -using System.Web.UI.WebControls; -using IBatisNet.DataMapper; - -namespace iBatisTutorial.Web.Forms -{ - public class PersonPage : Page - { - - #region panel: List - - protected Panel pnlList; - protected DataGrid dgList; - - private void List_Load () - { - dgList.DataSource = Mapper.Instance().QueryForList("SelectAll",null); - dgList.DataBind(); - } - - #endregion - - private void Page_Load(object sender, System.EventArgs e) - { - if (!IsPostBack) - { - List_Load (); - } - } - - #region Web Form Designer generated code - override protected void OnInit(EventArgs e) - { - InitializeComponent(); - base.OnInit(e); - } - - private void InitializeComponent() - { - this.Load += new System.EventHandler(this.Page_Load); - } - #endregion - } -} - - - If we run this now, we'll get a list like the one shown in Figure - 2. - -
    - A quick-and-dirty Person List - - - - - - -
    - - Not pretty, but at least we have a starting point. The DataGrid is a - flexible control, and we can always adjust the column order and headings - by changing the ASPX file. The point of this exercise is to get the data - to the grid so we can refine it later. -
    - - - Test, test, again ... - - Of course, tweaking the Person List display is not going to be the - end of it. Clients always want more, and now ours wants to edit, add, or - delete records. Let's write some tests for these new tasks, as shown in - Example 9. - - - New stories, new tests - - [Test] - public void PersonUpdate () - { - const string EXPECT = "Clinton"; - const string EDITED = "Notnilc"; - // get it - Person person = new Person(); - person.Id = 1; - person = (Person) Mapper.Instance().QueryForObject("Select",1); - // test it - Assert.IsNotNull(person,"Missing person"); - Assert.IsTrue(EXPECT.Equals(person.FirstName),"Mistaken identity"); - //change it - person.FirstName = EDITED; - Mapper.Instance().Update("Update",person); - // get it again some - person = (Person) Mapper.Instance().QueryForObject("Select",1); - // test it - Assert.IsTrue(EDITED.Equals(person.FirstName),"Same old, same old?"); - // change it back - person.FirstName = EXPECT; - Mapper.Instance().Update("Update",person); - } - - [Test] - public void PersonInsertDelete () - { - // insert it - Person person = new Person(); - person.Id = -1; - Mapper.Instance().Insert("Insert",person); - // delete it - int count = Mapper.Instance().Delete("Delete",-1); - Assert.IsTrue(count>0,"Nothing to delete"); - } - - - Not the best tests ever written, but for now, they will do :) - - To make the new tests work, we'll need some new mapping statements. - Example 10 shows the complete mapper document that we've called - PersonHelper.xml. - - - The new and improved mapper document - - <xml version="1.0" encoding="utf-8" ?> - -<sqlMap - namespace="Person" - xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:noNamespaceSchemaLocation="SqlMap.xsd"> - - <alias> - <typeAlias alias="Person" type="iBatisTutorial.Model.Person, iBatisTutorial.Model" /> - </alias> - - <resultMaps> - <resultMap id="SelectResult" class="Person"> - <result property="Id" column="PER_ID" /> - <result property="FirstName" column="PER_FIRST_NAME" /> - <result property="LastName" column="PER_LAST_NAME" /> - <result property="BirthDate" column="PER_BIRTH_DATE" /> - <result property="WeightInKilograms" column="PER_WEIGHT_KG" /> - <result property="HeightInMeters" column="PER_HEIGHT_M" /> - </resultMap> - </resultMaps> - - <statements> - - <select id="Select" parameterClass="int" resultMap="SelectResult"> - select - PER_ID, - PER_FIRST_NAME, - PER_LAST_NAME, - PER_BIRTH_DATE, - PER_WEIGHT_KG, - PER_HEIGHT_M - from PERSON - <dynamic prepend="WHERE"> - <isParameterPresent> - PER_ID = #value# - </isParameterPresent> - </dynamic> - </select> - - <insert id="Insert" parameterClass="Person"> - insert into PERSON - (PER_ID, PER_FIRST_NAME, PER_LAST_NAME, - PER_BIRTH_DATE, PER_WEIGHT_KG, PER_HEIGHT_M) - values - (#Id#, #FirstName#, #LastName#, - #BirthDate#, #WeightInKilograms#, #HeightInMeters#) - </insert> - - <update id="Update" parameterClass="Person"> - update PERSON set - PER_FIRST_NAME = #FirstName#, - PER_LAST_NAME = #LastName#, - PER_BIRTH_DATE = #BirthDate#, - PER_WEIGHT_KG = #WeightInKilograms#, - PER_HEIGHT_M = #HeightInMeters# - where PER_ID = #Id# - </update> - - <delete id="Delete" parameterClass="int"> - delete from PERSON - where PER_ID = #value# - </delete> - - </statements> -</sqlMap> - - - - Of course, the statements in Example 10 are so simple that - iBATIS could generate the SQL for us. Since your own applications are - liable to be more complex, we continue to use manual SQL in the - examples. - - - Hmm. So, what's with this <isParameterPresent> tag in the - <select> element? The <isParameterPresent> tag is an example - of Dynamic SQL. Rather than have nearly identical statements for SelectAll - and SelectById, we can use Dynamic SQL to let the same statement serve - both purposes. If Id is null, the WHERE clause is omitted. Otherwise, the - WHERE clause is included. Dynamic SQL is even more useful for "Query By - Example" stories. (See Section 3.9 in the DataMapper Developer Guide for - more.) - - Why bother? Because with the dynamic clause, we can use a single - Select statement for SelectAll or SelectById. Since both invocations are - suppose to return the same result, using one statement instead of two - reduces redundancy and saves maintenance. - - Well, waddya know, if run our tests now, we are favored with a green - bar!. It all works! - Though, of course, things usually do not work perfectly the - first time! We have to fix this and that, and try, try, again. But - NUnit makes trying again quick and easy. For changes to the XML - mapping documents, we do not even have to recompile. We can just - update the XML and rerun the tests! No muss, no fuss. - - - Turning back to our ASP.NET page, we can revamp the DataGrid to - allow in-place editing and deleting. To add records, we provide a button - after the grid that inserts a blank person for client to edit. The ASPX - code is shown as Example 11. - - - ASPX code for our enhanced DataGrid - - <asp:DataGrid id="dgList" Runat="server" - AutoGenerateColumns=False - DataKeyField="Id" - OnEditCommand="List_Edit" - OnCancelCommand="List_Cancel" - OnUpdateCommand="List_Update" - OnDeleteCommand="List_Delete"> - <Columns> - <asp:BoundColumn DataField="FirstName" HeaderText="First"></asp:BoundColumn> - <asp:BoundColumn DataField="LastName" HeaderText="Last"></asp:BoundColumn> - <asp:BoundColumn DataField="HeightInMeters" HeaderText="Height"></asp:BoundColumn> - <asp:BoundColumn DataField="WeightInKilograms" HeaderText="Weight"></asp:BoundColumn> - <asp:EditCommandColumn ButtonType="PushButton" EditText="Edit" CancelText="Cancel" UpdateText="Save"> - </asp:EditCommandColumn> - <asp:ButtonColumn ButtonType="PushButton" Text="Delete" CommandName="Delete"> - </asp:ButtonColumn> - </Columns> - </asp:DataGrid> - <p><asp:Button ID="btnAdd" Runat="server"></asp:Button></p> - - - Example 12 shows the corresponding methods from the - code-behind. - - - The code-behind methods for our new DataGrid - - #region panel: List - - protected Panel pnlList; - protected DataGrid dgList; - protected Button btnAdd; - - private void List_Init() - { - btnAdd.Text ="Add New Person"; - this.btnAdd.Click += new EventHandler(List_Add); - } - - private void List_Load () - { - dgList.DataSource = Mapper.Instance().QueryForList("Select",null); - dgList.DataBind(); - } - - protected void List_Delete(object source, DataGridCommandEventArgs e) - { - int id = GetKey(dgList,e); - Mapper.Instance().Delete("Delete",id); - List_Load(); - } - - protected void List_Edit(object source, DataGridCommandEventArgs e) - { - dgList.EditItemIndex = e.Item.ItemIndex; - List_Load(); - } - - protected void List_Update(object source, DataGridCommandEventArgs e) - { - Person person = new Person(); - person.Id = GetKey(dgList,e); - person.FirstName = GetText(e,0); - person.LastName = GetText(e,1); - person.HeightInMeters = GetDouble(e,2); - person.WeightInKilograms = GetDouble(e,3); - Mapper.Instance().Update("Update",person); - List_Load(); - } - - protected void List_Cancel(object source, DataGridCommandEventArgs e) - { - dgList.EditItemIndex = -1; - List_Load(); - } - - private int GetKey(DataGrid dg, DataGridCommandEventArgs e) - { - return (Int32) dg.DataKeys[e.Item.DataSetIndex]; - } - - private string GetText(DataGridCommandEventArgs e, int v) - { - return ((TextBox) e.Item.Cells[v].Controls[0]).Text; - } - - private double GetDouble(DataGridCommandEventArgs e, int v) - { - return Convert.ToDouble(GetText(e,v)); - } - - protected void List_Add (object source, EventArgs e) - { - Person person = new Person(); - person.FirstName = "--New Person--"; - Mapper.Instance().Insert("Insert", person); - List_Load (); - } - - #endregion - - private void Page_Load(object sender, System.EventArgs e) - { - List_Init(); - if (!IsPostBack) - { - List_Load (); - } - } - - // Web Form Designer generated code ... - - - OK, we are CRUD complete! There's more we could do here. In - particular, we should add validation methods to prevent client from - entering alphabetic characters where only numbers can live. But, that's - ASP.NET grunt-work, and this is an iBATIS DataMapper - tutorial. So, for now, we can stand tall and proudly declare: - Mission accomplished! - - - - Then, refactor - - Well, almost accomplished. The story is - complete from client's perspective, but I really don't like spelling out - the statement names in so many places. Mistyping the name is a bug waiting - to happen. Let's encapsulate the statements we want to call in a helper - class, so we only spell out the statement name in one place. Example 13 - shows our PersonHelper class. - PersonHelper.cs - A helper class for accessing the - database - - using System.Collections; - -namespace iBatisTutorial.Model -{ - - public class PersonHelper : Helper - { - - public Person Select(int id) - { - return (Person) Mapper().QueryForObject("Select",id); - } - - public IList SelectAll() - { - return Mapper().QueryForList("Select",null); - } - - public int Insert(Person person) - { - Mapper().Insert("Insert",person); - // Insert is designed so that it can return the new key - // but we are not utilizing that feature here - return 1; - } - - public int Update(Person person) - { - return Mapper().Update("Update",person); - } - - public int Delete(int id) - { - return Mapper().Delete("Delete",id); - } - -} - - - In a larger application, there would be several other "business" - objects, like "Person", and several other helper objects. Knowing this, we - setup a base Helper class. Our Helper base class, shown in Example 14, - provides the Mapper method that hooks up our application with - iBATIS. - - - Helper.cs -- Our only link to iBATIS - - using IBatisNet.DataMapper; - -namespace iBatisTutorial.Model -{ - public class Helper - { - public SqlMapper Mapper () - { - return IBatisNet.DataMapper.Mapper.Instance (); - } - } -} - - - We could now go back and do a straight-forward refactoring. - Everywhere we called, say: - - Mapper.Get().Update("Update",person); - - we could now call: - - PersonHelper helper = new PersonHelper(); helper.Update(person); - - Hmm. Better in terms of being strongly typed, worse in terms of - object management. Now we have to create an instance of PersonHelper to - make a data access call. Example 15 shows an alternative solution: Use a - singleton to instantiate our helper class one time. - - - Helpers.cs - A singleton "concierge" for our Helper - classes. - - namespace iBatisTutorial.Model { - public class Helpers - { - private static volatile PersonHelper _PersonHelper = null; - public static PersonHelper Person () - { - if (_PersonHelper == null) - { - lock (typeof (PersonHelper)) - { - if (_PersonHelper == null) // double-check - _PersonHelper = new PersonHelper(); - } - } - return _PersonHelper; - } - } -} - - - Now if we do a refactoring, we can replace: - - Mapper.Instance().Update("Update",person);with - - Helpers.Person().Update(person);If - we had another helper, say for pets, we could add that to the Helper class - and also be able to call: - - Helpers.Pet().Update(pet);and so - forth. As shown in Figure 3, we can also make full use of Intellisense in - selecting both a helper class and its methods. - -
    - Intellisense works great with our Helper singleton! - - - - - - -
    - - Figure 4 shows the Subversion DIFF report after refactoring for the - Helper classes. The lines that changed are emphasized. - -
    - Refactoring the Person test class - - Index: C:/projects/SourceForge/ibatisnet/Tutorial2/Model/PersonTest.cs -=================================================================== ---- C:/projects/SourceForge/ibatisnet/Tutorial2/Model/PersonTest.cs (revision 196) -+++ C:/projects/SourceForge/ibatisnet/Tutorial2/Model/PersonTest.cs (working copy) -@@ -1,5 +1,5 @@ - using System.Collections; --using IBatisNet.DataMapper; -+using iBatisTutorial.Model; - using NUnit.Framework; - - namespace iBatisTutorial.Model -@@ -11,7 +11,7 @@ - public void PersonList () - { - // try it -- IList people = Mapper.Instance().QueryForList("Select",null); -+ IList people = Helpers.Person().SelectAll(); - // test it - Assert.IsNotNull(people,"Person list not returned"); -@@ -28,7 +28,7 @@ - - // get it - Person person = new Person(); -- person = (Person) Mapper.Instance().QueryForObject("Select",1); -+ person = Helpers.Person().Select(1); - - // test it - Assert.IsNotNull(person,"Missing person"); -@@ -36,17 +36,17 @@ - - //change it - person.FirstName = EDITED; -- Mapper.Instance().Update("Update",person); -+ Helpers.Person().Update(person); - - // get it again -- Mapper.Instance().Insert("Insert",person); -+ Helpers.Person().Insert(person); -- person = (Person) Mapper.Instance().QueryForObject("Select",1); -+ person = Helpers.Person().Select(1); - - // test it - Assert.IsTrue(EDITED.Equals(person.FirstName),"Same old, same old?"); - - // change it back - person.FirstName = EXPECT; -- Mapper.Instance().Update("Update",person); -+ Helpers.Person().Update(person); - } - - [Test] -@@ -55,9 +55,9 @@ - // insert it - Person person = new Person(); - person.Id = -1; -- Mapper.Instance().Insert("Insert",person); -+ Helpers.Person().Insert(person); - // delete it -- int count = Mapper.Instance().Delete("Delete",-1); -+ int count = Helpers.Person().Delete(person.Id); - Assert.IsTrue(count>0,"Nothing to delete"); - } - } -
    - - Now, all our references are to our own Helper singleton rather than - the iBATIS Mapper class. Figure 5 shows the same type of DIFF report for - our ASP.NET code-behind file. The ASP.NET page is unchanged. (Ahh,the - beauty of code-behind!) - -
    - Refactoring the Person list code-behind class. - - Index: C:/projects/SourceForge/ibatisnet/Tutorial2/WebView/Forms/Person.aspx.cs -=================================================================== ---- C:/projects/SourceForge/ibatisnet/Tutorial2/WebView/Forms/Person.aspx.cs (revision 196) -+++ C:/projects/SourceForge/ibatisnet/Tutorial2/WebView/Forms/Person.aspx.cs (working copy) -@@ -1,13 +1,10 @@ - using System; - using System.Web.UI; - using System.Web.UI.WebControls; --using IBatisNet.DataMapper; - using iBatisTutorial.Model; - - namespace iBatisTutorial.Web.Forms - { - public class PersonPage : Page - { - -@@ -25,14 +22,14 @@ - - private void List_Load () - { -- dgList.DataSource = Mapper.Instance().QueryForList("Select",null); -+ dgList.DataSource = Helpers.Person().SelectAll(); - dgList.DataBind(); - } - - protected void List_Delete(object source, DataGridCommandEventArgs e) - { - int id = GetKey(dgList,e); -- Mapper.Instance().Delete("Delete",id); -+ Helpers.Person().Delete(id); - List_Load(); - } - -@@ -50,7 +47,7 @@ - person.LastName = GetText(e,1); - person.HeightInMeters = GetDouble(e,2); - person.WeightInKilograms = GetDouble(e,3); -- Mapper.Instance().Update("Update",person); -+ Helpers.Person().Update(person); - List_Load(); - } - -@@ -79,7 +76,7 @@ - { - Person person = new Person(); - person.FirstName = "--New Person--"; -- Mapper.Instance().Insert("Insert",person); -+ Helpers.Person().Insert(person); - List_Load(); - } -
    - - Note that adding the Helper singleton let us remove all iBATIS - framework semantics from the Test and code-behind classes. Looking at the - classes, you can't tell what data persistence system (if any) is being - used. All you see is a call to some Helper. In my book, that's a good - thing! - - Now I'm happy, and ready to move on to the next story ... As for - you, if you've liked what you've seen so far, please move on to the - DataMapper Developers Guide. There are many more goodies in store. -
    -
    \ No newline at end of file diff --git a/docs/tutorial/styles/fopdf.xsl b/docs/tutorial/styles/fopdf.xsl deleted file mode 100644 index 8326b94..0000000 --- a/docs/tutorial/styles/fopdf.xsl +++ /dev/null @@ -1,547 +0,0 @@ - - - - - - -]> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DataMapper Turorial - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1 - 0 - 1 - - 1 - - - - - - book toc - - - - 2 - - - - - - - - - - 0 - 0 - 0 - - - 5mm - 10mm - 10mm - - 15mm - 10mm - 0mm - - 18mm - 18mm - - - 0pc - - - - - left - false - - - 11 - 8 - - - 1.4 - - - - - - - 0.8em - - - - - - 15.5cm - - - - 4pt - 4pt - 4pt - 4pt - - - - 1.0pt - 1.0pt - - - - - 1 - - - - - - - - left - bold - - - pt - - - - - - - - - - - - - - - 0.8em - 0.8em - 0.8em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.6em - 0.6em - 0.6em - - - pt - - 0.1em - 0.1em - 0.1em - - - 0.4em - 0.4em - 0.4em - - - pt - - 0.1em - 0.1em - 0.1em - - - - - bold - - - pt - - false - 0.4em - 0.6em - 0.8em - - - - - - - - - pt - - wrap - - - - 1em - 1em - 1em - - - #444444 - solid - 0.1pt - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - 0.5em - - - - 1 - - #F0F0F0 - - - - - - 0 - 1 - - - 90 - - - - - '1' - &admon_gfx_path; - - - - - - figure after - example before - equation before - table before - procedure before - - - - 1 - - - - 0.8em - 0.8em - 0.8em - 0.1em - 0.1em - 0.1em - - - - - - - - - - - - - - - - - - - - - - diff --git a/docs/tutorial/styles/html.css b/docs/tutorial/styles/html.css deleted file mode 100644 index ee476d0..0000000 --- a/docs/tutorial/styles/html.css +++ /dev/null @@ -1,225 +0,0 @@ -body { - background: #FFFFFF; - font-family: sans-serif; - scrollbar-arrow-color: #000000; - scrollbar-base-color: #003300; - scrollbar-dark-shadow-color: #999900; - scrollbar-track-color: #808080; - scrollbar-face-color: #DEDEDE; - scrollbar-shadow-color: #DDDDDD; - scrollbar-highlight-color: #CCCCCC; - scrollbar-3d-light-color: #003300; -} - - -A:link{COLOR: #5E741C; TEXT-DECORATION: underline;} -A:visited{COLOR: #5E741C; TEXT-DECORATION: underline;} -A:hover{COLOR: #FF6600; TEXT-DECORATION: underline;} - -P, DL, DT, DD, BLOCKQUOTE { - color: #000000; - margin-bottom: 3px; - margin-top: 3px; - padding-top: 0px; - text-align: left; - /*border: 1px solid black;*/ -} - -OL, UL, P { - margin-top: 6px; - margin-bottom: 6px; -} - -P, BLOCKQUOTE { - font-size: 90%; -} - -P.releaseinfo { - font-size: 120%; font-weight: bold; - font-family: Arial, helvetica, sans-serif; - padding-top: 10px; -} - -P.pubdate { - font-size: 120%; font-weight: bold; - font-family: Arial, helvetica, sans-serif; -} - - - -TD, SPAN { - color: #000000; -} - -BLOCKQUOTE { - margin-right: 0px; -} - -H1, H2, H3, H4, H5, H6 { - margin-top:0px; - padding-top:14px; - font-family: Arial, helvetica, sans-serif; - margin-bottom: 0px; -} - -H2.title { - font-weight:800; - margin-bottom: 8px; -} - -H2.subtitle { - font-weight:800; - margin-bottom: 20px; -} - -H3.author { - color: #000000; - font-weight:500; - margin-top:0px; - padding-top:0px; - font-family: Arial, helvetica, sans-serif; - margin-bottom: 0px; -} - -TABLE { - border-collapse: collapse; - border: 1px thin #eeeeee; - empty-cells: hide; - border-style : groove; - border-spacing: 0px; -} - -TH { - background-color: #EBEBEC; -} - -td { -border : 2px; -border-color : #eeeeee; -border-style : groove; -border-spacing: 0px; -font-size: 80%; - padding: 4pt; -} - - -H1 { - font-size: 150%; -} -H2 { - font-size: 110%; -} -H3 { - font-size: 100%; font-weight: bold; -} -H4 { - font-size: 90%; font-weight: bold; -} -H5 { - font-size: 90%; font-style: italic; -} -H6 { - font-size: 100%; font-style: italic; -} - -TT { - font-size: 90%; - font-family: "Courier New", Courier, monospace; - color: #000000; -} - -.navheader, .navfooter { - background-color: #ffffff; -} -.navheader TABLE { - background-color: #D4D5D8; -} -.navheader th { - background-color: #D4D5D8; -} -.navheader td { - border : 0px; -} -.navfooter TABLE { - background-color: #D4D5D8; -} -.navfooter th { - background-color: #D4D5D8; -} -.navfooter td { - border : 0px; -} - -PRE { - font-size: 90%; - padding: 5px; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC; - background-color: #F4F4F4; -} - -UL, OL, LI { - list-style: disc; -} - -HR { - width: 100%; - height: 1px; - background-color: #CCCCCC; - border-width: 0px; - padding: 0px; - color: #CCCCCC; -} - -.variablelist { - padding-top: 10; - padding-bottom:10; - margin:0; -} - -/*(.itemizedlist, UL { - padding-top: 0; - padding-bottom:0; - margin:0; -}*/ - -.term { - font-weight:bold; -} - -.mediaobject { - padding-top: 30px; - padding-bottom: 30px; -} - -.legalnotice { - font-size: 70%; -} - - -.sidebar { - background-color: #E5ECF9; - padding: 0.25cm; -} - -.programlisting { - font-family: courier; - font-size: 11px; - font-weight: normal; - font-family: Lucida Console, monospace; - background-color: #EEEEEE; - padding: 0.25cm; - border-style: solid; - border-width: 1px; - border-color: #CCCCCC - } - -.comment { - color: #008000; -} - -.blue { - color: #0000FF; - font-weight: bold; -} \ No newline at end of file diff --git a/docs/tutorial/styles/html.xsl b/docs/tutorial/styles/html.xsl deleted file mode 100644 index 0099a44..0000000 --- a/docs/tutorial/styles/html.xsl +++ /dev/null @@ -1,76 +0,0 @@ - - - - - - - - 1 - 0 - 1 - 0 - - - 1 - - - - - - book toc - - - - 5 - - - - - - 1 - - - - - - - - - images/ - - - 90 - - - - - - figure after - example before - equation before - table before - procedure before - - - - - - - - - - \ No newline at end of file diff --git a/docs/xsltproc/readme.txt b/docs/xsltproc/readme.txt deleted file mode 100644 index cdec1b8..0000000 --- a/docs/xsltproc/readme.txt +++ /dev/null @@ -1,27 +0,0 @@ -This directory is a potential placeholder for the xsltproc executables and -libraries. - -Windows -======= -To install on a Windows machine one needs to download the Windows binaries and -libraries. - -These can be obtained from http://www.zlatkovic.com/pub/libxml/ or -ftp://xmlsoft.org/win32/. - -Download the following: - - iconv-1.9.1.win32.zip - libxml2-2.6.15.win32.zip - libxmlsec-1.2.6.win32.zip - libxslt-1.1.12.win32.zip - zlib-1.2.1.win32.zip - -Unzip all and put the content in the location of your choice. Make sure that the -path to the EXE dans DLLs in each folder are on your path. One easy way to do -this is to copy all EXEs and DLLs in a single directory, and add that directory -to your path. - - - - diff --git a/src/Common.sln b/src/Common.sln deleted file mode 100644 index d937035..0000000 --- a/src/Common.sln +++ /dev/null @@ -1,45 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common", "IBatisNet.Common\IBatisNet.Common.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Test", "IBatisNet.Common.Test\IBatisNet.Common.Test.csproj", "{5961F3DE-CB5E-40FE-AE89-D00D6E453907}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess", "IBatisNet.DataAccess\IBatisNet.DataAccess.csproj", "{BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper", "IBatisNet.DataMapper\IBatisNet.DataMapper.csproj", "{72F70057-B2E1-4DAD-BA6C-E2962745EEA5}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.ActiveCfg = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.Build.0 = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.ActiveCfg = Release|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.Build.0 = Release|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug.ActiveCfg = Debug|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug.Build.0 = Debug|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release.ActiveCfg = Release|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release.Build.0 = Release|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.ActiveCfg = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.Build.0 = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.ActiveCfg = Release|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.Build.0 = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.ActiveCfg = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.Build.0 = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.ActiveCfg = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/src/CommonAssemblyInfo.cs b/src/CommonAssemblyInfo.cs deleted file mode 100644 index ca30244..0000000 --- a/src/CommonAssemblyInfo.cs +++ /dev/null @@ -1,48 +0,0 @@ -using System; -using System.Reflection; -using System.Runtime.CompilerServices; - -[assembly: CLSCompliant(true)] - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyCompany("http://ibatis.apache.org/")] -[assembly: AssemblyProduct("iBATIS.NET")] -[assembly: AssemblyCopyright("Copyright 2007,2006 The Apache Software Foundation")] -[assembly: AssemblyTrademark("Licensed under the Apache License, Version 2.0")] -[assembly: AssemblyCulture("")] - - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -#if STRONG -[assembly: AssemblyConfiguration("net-1.1.win32; Release")] -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("..\\..\\..\\AssemblyKey.snk")] -#endif \ No newline at end of file diff --git a/src/DataAccess-Release.sln b/src/DataAccess-Release.sln deleted file mode 100644 index c36306e..0000000 --- a/src/DataAccess-Release.sln +++ /dev/null @@ -1,45 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess", "IBatisNet.DataAccess\IBatisNet.DataAccess.csproj", "{BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common", "IBatisNet.Common\IBatisNet.Common.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper", "IBatisNet.DataMapper\IBatisNet.DataMapper.csproj", "{72F70057-B2E1-4DAD-BA6C-E2962745EEA5}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.ActiveCfg = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.Build.0 = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.ActiveCfg = Release|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.Build.0 = Release|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.ActiveCfg = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.Build.0 = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.ActiveCfg = Release|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.Build.0 = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.ActiveCfg = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.Build.0 = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.ActiveCfg = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.Build.0 = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.ActiveCfg = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.Build.0 = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.ActiveCfg = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/src/DataAccess.sln b/src/DataAccess.sln deleted file mode 100644 index 9b7b559..0000000 --- a/src/DataAccess.sln +++ /dev/null @@ -1,53 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess", "IBatisNet.DataAccess\IBatisNet.DataAccess.csproj", "{BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common", "IBatisNet.Common\IBatisNet.Common.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper", "IBatisNet.DataMapper\IBatisNet.DataMapper.csproj", "{72F70057-B2E1-4DAD-BA6C-E2962745EEA5}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess.Test", "IBatisNet.DataAccess.Test\IBatisNet.DataAccess.Test.csproj", "{888FE332-F7B7-4248-AEE1-73E14EB9C042}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.ActiveCfg = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.Build.0 = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.ActiveCfg = Release|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.Build.0 = Release|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.ActiveCfg = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.Build.0 = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.ActiveCfg = Release|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.Build.0 = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.ActiveCfg = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.Build.0 = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.ActiveCfg = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.Build.0 = Release|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug.ActiveCfg = Debug|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug.Build.0 = Debug|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release.ActiveCfg = Release|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release.Build.0 = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.ActiveCfg = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.Build.0 = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.ActiveCfg = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/src/DataMapper.2003.sln b/src/DataMapper.2003.sln deleted file mode 100644 index 7c2d142..0000000 --- a/src/DataMapper.2003.sln +++ /dev/null @@ -1,45 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common", "IBatisNet.Common\IBatisNet.Common.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper", "IBatisNet.DataMapper\IBatisNet.DataMapper.csproj", "{72F70057-B2E1-4DAD-BA6C-E2962745EEA5}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.Test", "IBatisNet.DataMapper.Test\IBatisNet.DataMapper.Test.csproj", "{998B79D9-800F-493F-A263-306F06906E2F}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.ActiveCfg = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.Build.0 = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.ActiveCfg = Release|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.Build.0 = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.ActiveCfg = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.Build.0 = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.ActiveCfg = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.Build.0 = Release|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Debug.ActiveCfg = Debug|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Debug.Build.0 = Debug|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Release.ActiveCfg = Release|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Release.Build.0 = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.ActiveCfg = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.Build.0 = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.ActiveCfg = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection -EndGlobal diff --git a/src/DataMapper.2005.sln b/src/DataMapper.2005.sln deleted file mode 100644 index 4198e93..0000000 --- a/src/DataMapper.2005.sln +++ /dev/null @@ -1,38 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.2005", "IBatisNet.Common\IBatisNet.Common.2005.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.20005", "IBatisNet.DataMapper\IBatisNet.DataMapper.20005.csproj", "{F3E45F39-3224-4EAD-B138-EB5CC0E32824}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.Test.2005", "IBatisNet.DataMapper.Test\IBatisNet.DataMapper.Test.2005.csproj", "{998B79D9-800F-493F-A263-306F06906E2F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net.2005", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.2005.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.Build.0 = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.Build.0 = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.Build.0 = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/src/DataMapper.2008.sln b/src/DataMapper.2008.sln deleted file mode 100644 index 801dfb9..0000000 --- a/src/DataMapper.2008.sln +++ /dev/null @@ -1,38 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 10.00 -# Visual Studio 2008 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.2005", "IBatisNet.Common\IBatisNet.Common.2005.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.20005", "IBatisNet.DataMapper\IBatisNet.DataMapper.20005.csproj", "{F3E45F39-3224-4EAD-B138-EB5CC0E32824}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.Test.2005", "IBatisNet.DataMapper.Test\IBatisNet.DataMapper.Test.2005.csproj", "{998B79D9-800F-493F-A263-306F06906E2F}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net.2005", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.2005.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.Build.0 = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.Build.0 = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.Build.0 = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/src/External-Bin/Net/1.1/Castle.DynamicProxy.dll b/src/External-Bin/Net/1.1/Castle.DynamicProxy.dll deleted file mode 100644 index deec2aec07b41fec83c8a1b146f2e130d7ef17d2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69632 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 DvrLYo diff --git a/src/External-Bin/Net/1.1/Castle.DynamicProxy.license.txt b/src/External-Bin/Net/1.1/Castle.DynamicProxy.license.txt deleted file mode 100644 index d3bdda2..0000000 --- a/src/External-Bin/Net/1.1/Castle.DynamicProxy.license.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2004 DigitalCraftsmen - http://www.digitalcraftsmen.com.br/ - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/src/External-Bin/Net/1.1/License.txt b/src/External-Bin/Net/1.1/License.txt deleted file mode 100644 index 0c25280..0000000 --- a/src/External-Bin/Net/1.1/License.txt +++ /dev/null @@ -1,13 +0,0 @@ -Copyright 2004-2005 Castle Project - http://www.castleproject.org/ - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/src/External-Bin/Net/1.1/log4net.dll b/src/External-Bin/Net/1.1/log4net.dll deleted file mode 100644 index 995816f27bd1f38f4d6505fd42314e5b3872b3b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266240 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 Ni-B1T{J)8T{|UPv&?o=^ diff --git a/src/External-Bin/Net/1.1/log4net.license.txt b/src/External-Bin/Net/1.1/log4net.license.txt deleted file mode 100644 index 007db57..0000000 --- a/src/External-Bin/Net/1.1/log4net.license.txt +++ /dev/null @@ -1,48 +0,0 @@ -/* - * ============================================================================ - * The Apache Software License, Version 1.1 - * ============================================================================ - * - * Copyright (C) 1999 The Apache Software Foundation. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without modifica- - * tion, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - * 3. The end-user documentation included with the redistribution, if any, must - * include the following acknowledgment: "This product includes software - * developed by the Apache Software Foundation (http://www.apache.org/)." - * Alternately, this acknowledgment may appear in the software itself, if - * and wherever such third-party acknowledgments normally appear. - * - * 4. The names "log4j" and "Apache Software Foundation" must not be used to - * endorse or promote products derived from this software without prior - * written permission. For written permission, please contact - * apache@apache.org. - * - * 5. Products derived from this software may not be called "Apache", nor may - * "Apache" appear in their name, without prior written permission of the - * Apache Software Foundation. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND - * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLU- - * DING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON - * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * This software consists of voluntary contributions made by many individuals - * on behalf of the Apache Software Foundation. For more information on the - * Apache Software Foundation, please see . - * - */ diff --git a/src/External-Bin/Net/1.1/log4net.xml b/src/External-Bin/Net/1.1/log4net.xml deleted file mode 100644 index b8fd000..0000000 --- a/src/External-Bin/Net/1.1/log4net.xml +++ /dev/null @@ -1,28655 +0,0 @@ - - - - log4net - - - - - Appender that logs to a database. - - - - appends logging events to a table within a - database. The appender can be configured to specify the connection - string by setting the property. - The connection type (provider) can be specified by setting the - property. For more information on database connection strings for - your specific database see http://www.connectionstrings.com/. - - - Records are written into the database either using a prepared - statement or a stored procedure. The property - is set to (System.Data.CommandType.Text) to specify a prepared statement - or to (System.Data.CommandType.StoredProcedure) to specify a stored - procedure. - - - The prepared statement text or the name of the stored procedure - must be set in the property. - - - The prepared statement or stored procedure can take a number - of parameters. Parameters are added using the - method. This adds a single to the - ordered list of parameters. The - type may be subclassed if required to provide database specific - functionality. The specifies - the parameter name, database type, size, and how the value should - be generated using a . - - - - An example of a SQL Server table that could be logged to: - - CREATE TABLE [dbo].[Log] ( - [ID] [int] IDENTITY (1, 1) NOT NULL , - [Date] [datetime] NOT NULL , - [Thread] [varchar] (255) NOT NULL , - [Level] [varchar] (20) NOT NULL , - [Logger] [varchar] (255) NOT NULL , - [Message] [varchar] (4000) NOT NULL - ) ON [PRIMARY] - - - - An example configuration to log to the above table: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Julian Biddle - Nicko Cadell - Gert Driesen - Lance Nehring - - - - Abstract base class implementation of that - buffers events in a fixed size buffer. - - - - This base class should be used by appenders that need to buffer a - number of events before logging them. For example the - buffers events and then submits the entire contents of the buffer to - the underlying database in one go. - - - Subclasses should override the - method to deliver the buffered events. - - The BufferingAppenderSkeleton maintains a fixed size cyclic - buffer of events. The size of the buffer is set using - the property. - - A is used to inspect - each event as it arrives in the appender. If the - triggers, then the current buffer is sent immediately - (see ). Otherwise the event - is stored in the buffer. For example, an evaluator can be used to - deliver the events immediately when an ERROR event arrives. - - - The buffering appender can be configured in a mode. - By default the appender is NOT lossy. When the buffer is full all - the buffered events are sent with . - If the property is set to true then the - buffer will not be sent when it is full, and new events arriving - in the appender will overwrite the oldest event in the buffer. - In lossy mode the buffer will only be sent when the - triggers. This can be useful behavior when you need to know about - ERROR events but not about events with a lower level, configure an - evaluator that will trigger when an ERROR event arrives, the whole - buffer will be sent which gives a history of events leading up to - the ERROR event. - - - Nicko Cadell - Gert Driesen - - - - Abstract base class implementation of . - - - - This class provides the code for common functionality, such - as support for threshold filtering and support for general filters. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface for your own strategies for printing log statements. - - - - Implementors should consider extending the - class which provides a default implementation of this interface. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Log the logging event in Appender specific way. - - The event to log - - - This method is called to log a message into this appender. - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - The name uniquely identifies the appender. - - - - - Interface for appenders that support bulk logging. - - - - This interface extends the interface to - support bulk logging of objects. Appenders - should only implement this interface if they can bulk log efficiently. - - - Nicko Cadell - - - - Log the array of logging events in Appender specific way. - - The events to log - - - This method is called to log an array of events into this appender. - - - - - - Interface used to delay activate a configured object. - - - - This allows an object to defer activation of its options until all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - - If a component implements this interface then the method - must be called by the container after its all the configured properties have been set - and before the component can be used. - - - Nicko Cadell - - - - Activate the options that were previously set with calls to properties. - - - - This allows an object to defer activation of its options until all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - - If a component implements this interface then this method must be called - after its properties have been set before the component can be used. - - - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - Default constructor - - - Empty default constructor - - - - - Finalizes this appender by calling the implementation's - method. - - - - If this appender has not been closed then the Finalize method - will call . - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Closes the appender and release resources. - - - - Release any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - This method cannot be overridden by subclasses. This method - delegates the closing of the appender to the - method which must be overridden in the subclass. - - - - - - Performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific - method. - - The event to log. - - - This method cannot be overridden by derived classes. A - derived class should override the method - which is called by this method. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - Calls and checks that - it returns true. - - - - - If all of the above steps succeed then the - will be passed to the abstract method. - - - - - - Performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific - method. - - The array of events to log. - - - This method cannot be overridden by derived classes. A - derived class should override the method - which is called by this method. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - Calls and checks that - it returns true. - - - - - If all of the above steps succeed then the - will be passed to the method. - - - - - - Test if the logging event should we output by this appender - - the event to test - true if the event should be output, false if the event should be ignored - - - This method checks the logging event against the threshold level set - on this appender and also against the filters specified on this - appender. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - - - - - Adds a filter to the end of the filter chain. - - the filter to add to this appender - - - The Filters are organized in a linked list. - - - Setting this property causes the new filter to be pushed onto the - back of the filter chain. - - - - - - Clears the filter list for this appender. - - - - Clears the filter list for this appender. - - - - - - Checks if the message level is below this appender's threshold. - - to test against. - - - If there is no threshold set, then the return value is always true. - - - - true if the meets the - requirements of this appender. - - - - - Is called when the appender is closed. Derived classes should override - this method if resources need to be released. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Subclasses of should implement this method - to perform actual logging. - - The event to append. - - - A subclass must implement this method to perform - logging of the . - - This method will be called by - if all the conditions listed for that method are met. - - - To restrict the logging of events in the appender - override the method. - - - - - - Append a bulk array of logging events. - - the array of logging events - - - This base class implementation calls the - method for each element in the bulk array. - - - A sub class that can better process a bulk array of events should - override this method in addition to . - - - - - - Called before as a precondition. - - - - This method is called by - before the call to the abstract method. - - - This method can be overridden in a subclass to extend the checks - made before the event is passed to the method. - - - A subclass should ensure that they delegate this call to - this base class if it is overridden. - - - true if the call to should proceed. - - - - Renders the to a string. - - The event to render. - The event rendered as a string. - - - Helper method to render a to - a string. This appender must have a - set to render the to - a string. - - If there is exception data in the logging event and - the layout does not process the exception, this method - will append the exception text to the rendered string. - - - Where possible use the alternative version of this method - . - That method streams the rendering onto an existing Writer - which can give better performance if the caller already has - a open and ready for writing. - - - - - - Renders the to a string. - - The event to render. - The TextWriter to write the formatted event to - - - Helper method to render a to - a string. This appender must have a - set to render the to - a string. - - If there is exception data in the logging event and - the layout does not process the exception, this method - will append the exception text to the rendered string. - - - Use this method in preference to - where possible. If, however, the caller needs to render the event - to a string then does - provide an efficient mechanism for doing so. - - - - - - The layout of this appender. - - - See for more information. - - - - - The name of this appender. - - - See for more information. - - - - - The level threshold of this appender. - - - - There is no level threshold filtering by default. - - - See for more information. - - - - - - It is assumed and enforced that errorHandler is never null. - - - - It is assumed and enforced that errorHandler is never null. - - - See for more information. - - - - - - The first filter in the filter chain. - - - - Set to null initially. - - - See for more information. - - - - - - The last filter in the filter chain. - - - See for more information. - - - - - Flag indicating if this appender is closed. - - - See for more information. - - - - - The guard prevents an appender from repeatedly calling its own DoAppend method - - - - - StringWriter used to render events - - - - - Gets or sets the threshold of this appender. - - - The threshold of the appender. - - - - All log events with lower level than the threshold level are ignored - by the appender. - - - In configuration files this option is specified by setting the - value of the option to a level - string, such as "DEBUG", "INFO" and so on. - - - - - - Gets or sets the for this appender. - - The of the appender - - - The provides a default - implementation for the property. - - - - - - The filter chain. - - The head of the filter chain filter chain. - - - Returns the head Filter. The Filters are organized in a linked list - and so all Filters on this Appender are available through the result. - - - - - - Gets or sets the for this appender. - - The layout of the appender. - - - See for more information. - - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - - The name uniquely identifies the appender. - - - - - - Tests if this appender requires a to be set. - - - - In the rather exceptional case, where the appender - implementation admits a layout but can also work without it, - then the appender should return true. - - - This default implementation always returns true. - - - - true if the appender requires a layout object, otherwise false. - - - - - The default buffer size. - - - The default size of the cyclic buffer used to store events. - This is set to 512 by default. - - - - - Initializes a new instance of the class. - - - - Protected default constructor to allow subclassing. - - - - - - Initializes a new instance of the class. - - the events passed through this appender must be - fixed by the time that they arrive in the derived class' SendBuffer method. - - - Protected constructor to allow subclassing. - - - The should be set if the subclass - expects the events delivered to be fixed even if the - is set to zero, i.e. when no buffering occurs. - - - - - - Flush the currently buffered events - - - - Flushes any events that have been buffered. - - - If the appender is buffering in mode then the contents - of the buffer will NOT be flushed to the appender. - - - - - - Flush the currently buffered events - - set to true to flush the buffer of lossy events - - - Flushes events that have been buffered. If is - false then events will only be flushed if this buffer is non-lossy mode. - - - If the appender is buffering in mode then the contents - of the buffer will only be flushed if is true. - In this case the contents of the buffer will be tested against the - and if triggering will be output. All other buffered - events will be discarded. - - - If is true then the buffer will always - be emptied by calling this method. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Close this appender instance. - - - - Close this appender instance. If this appender is marked - as not then the remaining events in - the buffer must be sent when the appender is closed. - - - - - - This method is called by the method. - - the event to log - - - Stores the in the cyclic buffer. - - - The buffer will be sent (i.e. passed to the - method) if one of the following conditions is met: - - - - The cyclic buffer is full and this appender is - marked as not lossy (see ) - - - An is set and - it is triggered for the - specified. - - - - Before the event is stored in the buffer it is fixed - (see ) to ensure that - any data referenced by the event will be valid when the buffer - is processed. - - - - - - Sends the contents of the buffer. - - The first logging event. - The buffer containing the events that need to be send. - - - The subclass must override . - - - - - - Sends the events. - - The events that need to be send. - - - The subclass must override this method to process the buffered events. - - - - - - The size of the cyclic buffer used to hold the logging events. - - - Set to by default. - - - - - The cyclic buffer used to store the logging events. - - - - - The triggering event evaluator that causes the buffer to be sent immediately. - - - The object that is used to determine if an event causes the entire - buffer to be sent immediately. This field can be null, which - indicates that event triggering is not to be done. The evaluator - can be set using the property. If this appender - has the ( property) set to - true then an must be set. - - - - - Indicates if the appender should overwrite events in the cyclic buffer - when it becomes full, or if the buffer should be flushed when the - buffer is full. - - - If this field is set to true then an must - be set. - - - - - The triggering event evaluator filters discarded events. - - - The object that is used to determine if an event that is discarded should - really be discarded or if it should be sent to the appenders. - This field can be null, which indicates that all discarded events will - be discarded. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - The events delivered to the subclass must be fixed. - - - - - Gets or sets a value that indicates whether the appender is lossy. - - - true if the appender is lossy, otherwise false. The default is false. - - - - This appender uses a buffer to store logging events before - delivering them. A triggering event causes the whole buffer - to be send to the remote sink. If the buffer overruns before - a triggering event then logging events could be lost. Set - to false to prevent logging events - from being lost. - - If is set to true then an - must be specified. - - - - - Gets or sets the size of the cyclic buffer used to hold the - logging events. - - - The size of the cyclic buffer used to hold the logging events. - - - - The option takes a positive integer - representing the maximum number of logging events to collect in - a cyclic buffer. When the is reached, - oldest events are deleted as new events are added to the - buffer. By default the size of the cyclic buffer is 512 events. - - - If the is set to a value less than - or equal to 1 then no buffering will occur. The logging event - will be delivered synchronously (depending on the - and properties). Otherwise the event will - be buffered. - - - - - - Gets or sets the that causes the - buffer to be sent immediately. - - - The that causes the buffer to be - sent immediately. - - - - The evaluator will be called for each event that is appended to this - appender. If the evaluator triggers then the current buffer will - immediately be sent (see ). - - If is set to true then an - must be specified. - - - - - Gets or sets the value of the to use. - - - The value of the to use. - - - - The evaluator will be called for each event that is discarded from this - appender. If the evaluator triggers then the current buffer will immediately - be sent (see ). - - - - - - Gets or sets a value indicating if only part of the logging event data - should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the - event data to be fixed and serialized. This will improve performance. - - - See for more information. - - - - - - Gets or sets a the fields that will be fixed in the event - - - The event fields that will be fixed before the event is buffered - - - - The logging event needs to have certain thread specific values - captured before it can be buffered. See - for details. - - - - - - - Initializes a new instance of the class. - - - Public default constructor to initialize a new instance of this class. - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Override the parent method to close the database - - - - Closes the database command and database connection. - - - - - - Inserts the events into the database. - - The events to insert into the database. - - - Insert all the events specified in the - array into the database. - - - - - - Adds a parameter to the command. - - The parameter to add to the command. - - - Adds a parameter to the ordered list of command parameters. - - - - - - Writes the events to the database using the transaction specified. - - The transaction that the events will be executed under. - The array of events to insert into the database. - - - The transaction argument can be null if the appender has been - configured not to use transactions. See - property for more information. - - - - - - Formats the log message into database statement text. - - The event being logged. - - This method can be overridden by subclasses to provide - more control over the format of the database statement. - - - Text that can be passed to a . - - - - - Connects to the database. - - - - - Retrieves the class type of the ADO.NET provider. - - - - Gets the Type of the ADO.NET provider to use to connect to the - database. This method resolves the type specified in the - property. - - - Subclasses can override this method to return a different type - if necessary. - - - The of the ADO.NET provider - - - - Prepares the database command and initialize the parameters. - - - - - Flag to indicate if we are using a command object - - - - Set to true when the appender is to use a prepared - statement or stored procedure to insert into the database. - - - - - - The list of objects. - - - - The list of objects. - - - - - - The security context to use for privileged calls - - - - - The that will be used - to insert logging events into a database. - - - - - The database command. - - - - - Database connection string. - - - - - String type name of the type name. - - - - - The text of the command. - - - - - The command type. - - - - - Indicates whether to use transactions when writing to the database. - - - - - Indicates whether to use transactions when writing to the database. - - - - - Gets or sets the database connection string that is used to connect to - the database. - - - The database connection string used to connect to the database. - - - - The connections string is specific to the connection type. - See for more information. - - - Connection string for MS Access via ODBC: - "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" - - Another connection string for MS Access via ODBC: - "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" - - Connection string for MS Access via OLE DB: - "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" - - - - - Gets or sets the type name of the connection - that should be created. - - - The type name of the connection. - - - - The type name of the ADO.NET provider to use. - - - The default is to use the OLE DB provider. - - - Use the OLE DB Provider. This is the default value. - System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the MS SQL Server Provider. - System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the ODBC Provider. - Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral - This is an optional package that you can download from - http://msdn.microsoft.com/downloads - search for ODBC .NET Data Provider. - - Use the Oracle Provider. - System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - This is an optional package that you can download from - http://msdn.microsoft.com/downloads - search for .NET Managed Provider for Oracle. - - - - - Gets or sets the command text that is used to insert logging events - into the database. - - - The command text used to insert logging events into the database. - - - - Either the text of the prepared statement or the - name of the stored procedure to execute to write into - the database. - - - The property determines if - this text is a prepared statement or a stored procedure. - - - - - - Gets or sets the command type to execute. - - - The command type to execute. - - - - This value may be either (System.Data.CommandType.Text) to specify - that the is a prepared statement to execute, - or (System.Data.CommandType.StoredProcedure) to specify that the - property is the name of a stored procedure - to execute. - - - The default value is (System.Data.CommandType.Text). - - - - - - Should transactions be used to insert logging events in the database. - - - true if transactions should be used to insert logging events in - the database, otherwise false. The default value is true. - - - - Gets or sets a value that indicates whether transactions should be used - to insert logging events in the database. - - - When set a single transaction will be used to insert the buffered events - into the database. Otherwise each event will be inserted without using - an explicit transaction. - - - - - - Gets or sets the used to call the NetSend method. - - - The used to call the NetSend method. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - Should this appender try to reconnect to the database on error. - - - true if the appender should try to reconnect to the database after an - error has occurred, otherwise false. The default value is false, - i.e. not to try to reconnect. - - - - The default behaviour is for the appender not to try to reconnect to the - database if an error occurs. Subsequent logging events are discarded. - - - To force the appender to attempt to reconnect to the database set this - property to true. - - - When the appender attempts to connect to the database there may be a - delay of up to the connection timeout specified in the connection string. - This delay will block the calling application's thread. - Until the connection can be reestablished this potential delay may occur multiple times. - - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to insert - logging events into a database. Classes deriving from - can use this property to get or set this . Use the - underlying returned from if - you require access beyond that which provides. - - - - - Parameter type used by the . - - - - This class provides the basic database parameter properties - as defined by the interface. - - This type can be subclassed to provide database specific - functionality. The two methods that are called externally are - and . - - - - - - Initializes a new instance of the class. - - - Default constructor for the AdoNetAppenderParameter class. - - - - - Prepare the specified database command object. - - The command to prepare. - - - Prepares the database command object by adding - this parameter to its collection of parameters. - - - - - - Renders the logging event and set the parameter value in the command. - - The command containing the parameter. - The event to be rendered. - - - Renders the logging event using this parameters layout - object. Sets the value of the parameter on the command object. - - - - - - The name of this parameter. - - - - - The database type for this parameter. - - - - - Flag to infer type rather than use the DbType - - - - - The precision for this parameter. - - - - - The scale for this parameter. - - - - - The size for this parameter. - - - - - The to use to render the - logging event into an object for this parameter. - - - - - Gets or sets the name of this parameter. - - - The name of this parameter. - - - - The name of this parameter. The parameter name - must match up to a named parameter to the SQL stored procedure - or prepared statement. - - - - - - Gets or sets the database type for this parameter. - - - The database type for this parameter. - - - - The database type for this parameter. This property should - be set to the database type from the - enumeration. See . - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the type from the value. - - - - - - - Gets or sets the precision for this parameter. - - - The precision for this parameter. - - - - The maximum number of digits used to represent the Value. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the precision from the value. - - - - - - - Gets or sets the scale for this parameter. - - - The scale for this parameter. - - - - The number of decimal places to which Value is resolved. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the scale from the value. - - - - - - - Gets or sets the size for this parameter. - - - The size for this parameter. - - - - The maximum size, in bytes, of the data within the column. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the size from the value. - - - - - - - Gets or sets the to use to - render the logging event into an object for this - parameter. - - - The used to render the - logging event into an object for this parameter. - - - - The that renders the value for this - parameter. - - - The can be used to adapt - any into a - for use in the property. - - - - - - Appends logging events to the terminal using ANSI color escape sequences. - - - - AnsiColorTerminalAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. It also allows the color of a specific level of message to be set. - - - This appender expects the terminal to understand the VT100 control set - in order to interpret the color codes. If the terminal or console does not - understand the control codes the behavior is not defined. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes each message to the System.Console.Out or - System.Console.Error that is set at the time the event is appended. - Therefore it is possible to programmatically redirect the output of this appender - (for example NUnit does this to capture program output). While this is the desired - behavior of this appender it may have security implications in your application. - - - When configuring the ANSI colored terminal appender, a mapping should be - specified to map a logging level to a color. For example: - - - - - - - - - - - - - - - The Level is the standard log4net logging level and ForeColor and BackColor can be any - of the following values: - - Blue - Green - Red - White - Yellow - Purple - Cyan - - These color values cannot be combined together to make new colors. - - - The attributes can be any combination of the following: - - Brightforeground is brighter - Dimforeground is dimmer - Underscoremessage is underlined - Blinkforeground is blinking (does not work on all terminals) - Reverseforeground and background are reversed - Hiddenoutput is hidden - Strikethroughmessage has a line through it - - While any of these attributes may be combined together not all combinations - work well together, for example setting both Bright and Dim attributes makes - no sense. - - - Patrick Wagstrom - Nicko Cadell - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Ansi code to reset terminal - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Add a mapping of level to color - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the foreground and background colours - for a level. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to color mappings set on this appender. - - - - - - Flag to write output to the error stream rather than the standard output stream - - - - - Mapping from level object to color value - - - - - Target is the value of the console output stream. - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - The enum of possible display attributes - - - - The following flags can be combined together to - form the ANSI color attributes. - - - - - - - text is bright - - - - - text is dim - - - - - text is underlined - - - - - text is blinking - - - Not all terminals support this attribute - - - - - text and background colors are reversed - - - - - text is hidden - - - - - text is displayed with a strikethrough - - - - - The enum of possible foreground or background color values for - use with the color mapping method - - - - The output can be in one for the following ANSI colors. - - - - - - - color is black - - - - - color is red - - - - - color is green - - - - - color is yellow - - - - - color is blue - - - - - color is magenta - - - - - color is cyan - - - - - color is white - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and the color it should be displayed in. - - - - - - An entry in the - - - - This is an abstract base class for types that are stored in the - object. - - - Nicko Cadell - - - - Default protected constructor - - - - Default protected constructor - - - - - - Initialize any options defined on this entry - - - - Should be overridden by any classes that need to initialise based on their options - - - - - - The level that is the key for this mapping - - - The that is the key for this mapping - - - - Get or set the that is the key for this - mapping subclass. - - - - - - Initialize the options for the object - - - - Combine the and together - and append the attributes. - - - - - - The mapped foreground color for the specified level - - - - Required property. - The mapped foreground color for the specified level - - - - - - The mapped background color for the specified level - - - - Required property. - The mapped background color for the specified level - - - - - - The color attributes for the specified level - - - - Required property. - The color attributes for the specified level - - - - - - The combined , and - suitable for setting the ansi terminal color. - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a AppenderCollection instance. - - list to create a readonly wrapper arround - - An AppenderCollection wrapper that is read-only. - - - - - An empty readonly static AppenderCollection - - - - - Initializes a new instance of the AppenderCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the AppenderCollection class - that has the specified initial capacity. - - - The number of elements that the new AppenderCollection is initially capable of storing. - - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified AppenderCollection. - - The AppenderCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - - Copies the entire AppenderCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire AppenderCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the AppenderCollection. - - The to be added to the end of the AppenderCollection. - The index at which the value has been added. - - - - Removes all elements from the AppenderCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the AppenderCollection. - - The to check for. - true if is found in the AppenderCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the AppenderCollection. - - The to locate in the AppenderCollection. - - The zero-based index of the first occurrence of - in the entire AppenderCollection, if found; otherwise, -1. - - - - - Inserts an element into the AppenderCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the AppenderCollection. - - The to remove from the AppenderCollection. - - The specified was not found in the AppenderCollection. - - - - - Removes the element at the specified index of the AppenderCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the AppenderCollection. - - An for the entire AppenderCollection. - - - - Adds the elements of another AppenderCollection to the current AppenderCollection. - - The AppenderCollection whose elements should be added to the end of the current AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a array to the current AppenderCollection. - - The array whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a collection to the current AppenderCollection. - - The collection whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Sets the capacity to the actual number of elements. - - - - - Return the collection elements as an array - - the array - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the AppenderCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the AppenderCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - - A value - - - - - Supports simple iteration over a . - - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - - - - - Appends log events to the ASP.NET system. - - - - - Diagnostic information and tracing messages that you specify are appended to the output - of the page that is sent to the requesting browser. Optionally, you can view this information - from a separate trace viewer (Trace.axd) that displays trace information for every page in a - given application. - - - Trace statements are processed and displayed only when tracing is enabled. You can control - whether tracing is displayed to a page, to the trace viewer, or both. - - - The logging event is passed to the or - method depending on the level of the logging event. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Write the logging event to the ASP.NET trace - - the event to log - - - Write the logging event to the ASP.NET trace - HttpContext.Current.Trace - (). - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Buffers events and then forwards them to attached appenders. - - - - The events are buffered in this appender until conditions are - met to allow the appender to deliver the events to the attached - appenders. See for the - conditions that cause the buffer to be sent. - - The forwarding appender can be used to specify different - thresholds and filters for the same appender at different locations - within the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Interface for attaching appenders to objects. - - - - Interface for attaching, removing and retrieving appenders. - - - Nicko Cadell - Gert Driesen - - - - Attaches an appender. - - The appender to add. - - - Add the specified appender. The implementation may - choose to allow or deny duplicate appenders. - - - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - Returns an attached appender with the specified. - If no appender with the specified name is found null will be - returned. - - - - - - Removes all attached appenders. - - - - Removes and closes all attached appenders - - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Gets all attached appenders. - - - A collection of attached appenders. - - - - Gets a collection of attached appenders. - If there are no attached appenders the - implementation should return an empty - collection rather than null. - - - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Send the events. - - The events that need to be send. - - - Forwards the events to the attached appenders. - - - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - Get the named appender attached to this buffering appender. - - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Appends logging events to the console. - - - - ColoredConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. It also allows the color of a specific type of message to be set. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes directly to the application's attached console - not to the System.Console.Out or System.Console.Error TextWriter. - The System.Console.Out and System.Console.Error streams can be - programmatically redirected (for example NUnit does this to capture program output). - This appender will ignore these redirections because it needs to use Win32 - API calls to colorize the output. To respect these redirections the - must be used. - - - When configuring the colored console appender, mapping should be - specified to map a logging level to a color. For example: - - - - - - - - - - - - - - The Level is the standard log4net logging level and ForeColor and BackColor can be any - combination of the following values: - - Blue - Green - Red - White - Yellow - Purple - Cyan - HighIntensity - - - - Rick Hobbs - Nicko Cadell - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - Add a mapping of level to color - done by the config file - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the foreground and background colors - for a level. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to color mappings set on this appender. - - - - - - Flag to write output to the error stream rather than the standard output stream - - - - - Mapping from level object to color value - - - - - The console output stream writer to write to - - - - This writer is not thread safe. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - The enum of possible color values for use with the color mapping method - - - - The following flags can be combined together to - form the colors. - - - - - - - color is blue - - - - - color is green - - - - - color is red - - - - - color is white - - - - - color is yellow - - - - - color is purple - - - - - color is cyan - - - - - color is intensified - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and the color it should be displayed in. - - - - - - Initialize the options for the object - - - - Combine the and together. - - - - - - The mapped foreground color for the specified level - - - - Required property. - The mapped foreground color for the specified level. - - - - - - The mapped background color for the specified level - - - - Required property. - The mapped background color for the specified level. - - - - - - The combined and suitable for - setting the console color. - - - - - Appends logging events to the console. - - - - ConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes each message to the System.Console.Out or - System.Console.Error that is set at the time the event is appended. - Therefore it is possible to programmatically redirect the output of this appender - (for example NUnit does this to capture program output). While this is the desired - behavior of this appender it may have security implications in your application. - - - Nicko Cadell - Gert Driesen - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appends log events to the system. - - - - The application configuration file can be used to control what listeners - are actually used. See the MSDN documentation for the - class for details on configuring the - debug system. - - - Events are written using the - method. The event's logger name is passed as the value for the category name to the Write method. - - - Nicko Cadell - - - - Initializes a new instance of the . - - - - Default constructor. - - - - - - Initializes a new instance of the - with a specified layout. - - The layout to use with this appender. - - - Obsolete constructor. - - - - - - Writes the logging event to the system. - - The event to log. - - - Writes the logging event to the system. - If is true then the - is called. - - - - - - Immediate flush means that the underlying writer or output stream - will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logs events are not actually written to persistent media if and - when the application crashes. - - - The default value is true. - - - - - Gets or sets a value that indicates whether the appender will - flush at the end of each write. - - - The default behavior is to flush at the end of each - write. If the option is set tofalse, then the underlying - stream can defer writing to physical medium to a later time. - - - Avoiding the flush operation at the end of each append results - in a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Writes events to the system event log. - - - - The EventID of the event log entry can be - set using the EventLogEventID property () - on the . - - - There is a limit of 32K characters for an event log message - - - When configuring the EventLogAppender a mapping can be - specified to map a logging level to an event log entry type. For example: - - - <mapping> - <level value="ERROR" /> - <eventLogEntryType value="Error" /> - </mapping> - <mapping> - <level value="DEBUG" /> - <eventLogEntryType value="Information" /> - </mapping> - - - The Level is the standard log4net logging level and eventLogEntryType can be any value - from the enum, i.e.: - - Erroran error event - Warninga warning event - Informationan informational event - - - - Aspi Havewala - Douglas de la Torre - Nicko Cadell - Gert Driesen - Thomas Voss - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initializes a new instance of the class - with the specified . - - The to use with this appender. - - - Obsolete constructor. - - - - - - Add a mapping of level to - done by the config file - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the event log entry type for a level. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Create an event log source - - - Uses different API calls under NET_2_0 - - - - - This method is called by the - method. - - the event to log - - Writes the event to the system event log using the - . - - If the event has an EventID property (see ) - set then this integer will be used as the event log event id. - - - There is a limit of 32K characters for an event log message - - - - - - Get the equivalent for a - - the Level to convert to an EventLogEntryType - The equivalent for a - - Because there are fewer applicable - values to use in logging levels than there are in the - this is a one way mapping. There is - a loss of information during the conversion. - - - - - The log name is the section in the event logs where the messages - are stored. - - - - - Name of the application to use when logging. This appears in the - application column of the event log named by . - - - - - The name of the machine which holds the event log. This is - currently only allowed to be '.' i.e. the current machine. - - - - - Mapping from level object to EventLogEntryType - - - - - The security context to use for privileged calls - - - - - The name of the log where messages will be stored. - - - The string name of the log where messages will be stored. - - - This is the name of the log as it appears in the Event Viewer - tree. The default value is to log into the Application - log, this is where most applications write their events. However - if you need a separate log for your application (or applications) - then you should set the appropriately. - This should not be used to distinguish your event log messages - from those of other applications, the - property should be used to distinguish events. This property should be - used to group together events into a single log. - - - - - - Property used to set the Application name. This appears in the - event logs when logging. - - - The string used to distinguish events from different sources. - - - Sets the event log source property. - - - - - This property is used to return the name of the computer to use - when accessing the event logs. Currently, this is the current - computer, denoted by a dot "." - - - The string name of the machine holding the event log that - will be logged into. - - - This property cannot be changed. It is currently set to '.' - i.e. the local machine. This may be changed in future. - - - - - Gets or sets the used to write to the EventLog. - - - The used to write to the EventLog. - - - - The system security context used to write to the EventLog. - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and its event log entry type. - - - - - - The for this entry - - - - Required property. - The for this entry - - - - - - Appends logging events to a file. - - - - Logging events are sent to the file specified by - the property. - - - The file can be opened in either append or overwrite mode - by specifying the property. - If the file path is relative it is taken as relative from - the application base directory. The file encoding can be - specified by setting the property. - - - The layout's and - values will be written each time the file is opened and closed - respectively. If the property is - then the file may contain multiple copies of the header and footer. - - - This appender will first try to open the file for writing when - is called. This will typically be during configuration. - If the file cannot be opened for writing the appender will attempt - to open the file again each time a message is logged to the appender. - If the file cannot be opened for writing when a message is logged then - the message will be discarded by this appender. - - - The supports pluggable file locking models via - the property. - The default behavior, implemented by - is to obtain an exclusive write lock on the file until this appender is closed. - The alternative model, , only holds a - write lock while the appender is writing a logging event. - - - Nicko Cadell - Gert Driesen - Rodrigo B. de Oliveira - Douglas de la Torre - Niall Daley - - - - Sends logging events to a . - - - - An Appender that writes to a . - - - This appender may be used stand alone if initialized with an appropriate - writer, however it is typically used as a base class for an appender that - can open a to write to. - - - Nicko Cadell - Gert Driesen - Douglas de la Torre - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initializes a new instance of the class and - sets the output destination to a new initialized - with the specified . - - The layout to use with this appender. - The to output to. - - - Obsolete constructor. - - - - - - Initializes a new instance of the class and sets - the output destination to the specified . - - The layout to use with this appender - The to output to - - The must have been previously opened. - - - - Obsolete constructor. - - - - - - This method determines if there is a sense in attempting to append. - - - - This method checked if an output target has been set and if a - layout has been set. - - - false if any of the preconditions fail. - - - - This method is called by the - method. - - The event to log. - - - Writes a log statement to the output stream if the output stream exists - and is writable. - - - The format of the output will depend on the appender's layout. - - - - - - This method is called by the - method. - - The array of events to log. - - - This method writes all the bulk logged events to the output writer - before flushing the stream. - - - - - - Close this appender instance. The underlying stream or writer is also closed. - - - Closed appenders cannot be reused. - - - - - Writes the footer and closes the underlying . - - - - Writes the footer and closes the underlying . - - - - - - Closes the underlying . - - - - Closes the underlying . - - - - - - Clears internal references to the underlying - and other variables. - - - - Subclasses can override this method for an alternate closing behavior. - - - - - - Writes a footer as produced by the embedded layout's property. - - - - Writes a footer as produced by the embedded layout's property. - - - - - - Writes a header produced by the embedded layout's property. - - - - Writes a header produced by the embedded layout's property. - - - - - - Called to allow a subclass to lazily initialize the writer - - - - This method is called when an event is logged and the or - have not been set. This allows a subclass to - attempt to initialize the writer multiple times. - - - - - - This is the where logging events - will be written to. - - - - - Immediate flush means that the underlying - or output stream will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logging events are not actually persisted if and when the application - crashes. - - - The default value is true. - - - - - - Gets or set whether the appender will flush at the end - of each append operation. - - - - The default behavior is to flush at the end of each - append operation. - - - If this option is set to false, then the underlying - stream can defer persisting the logging event to a later - time. - - - - Avoiding the flush operation at the end of each append results in - a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - Sets the where the log output will go. - - - - The specified must be open and writable. - - - The will be closed when the appender - instance is closed. - - - Note: Logging to an unopened will fail. - - - - - - Gets or set the and the underlying - , if any, for this appender. - - - The for this appender. - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Gets or sets the where logging events - will be written to. - - - The where logging events are written. - - - - This is the where logging events - will be written to. - - - - - - Default constructor - - - - Default constructor - - - - - - Construct a new appender using the layout, file and append mode. - - the layout to use with this appender - the full path to the file to write to - flag to indicate if the file should be appended to - - - Obsolete constructor. - - - - - - Construct a new appender using the layout and file specified. - The file will be appended to. - - the layout to use with this appender - the full path to the file to write to - - - Obsolete constructor. - - - - - - Activate the options on the file appender. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - This will cause the file to be opened. - - - - - - Closes any previously opened file and calls the parent's . - - - - Resets the filename and the file stream. - - - - - - Called to initialize the file writer - - - - Will be called for each logged message until the file is - successfully opened. - - - - - - This method is called by the - method. - - The event to log. - - - Writes a log statement to the output stream if the output stream exists - and is writable. - - - The format of the output will depend on the appender's layout. - - - - - - This method is called by the - method. - - The array of events to log. - - - Acquires the output file locks once before writing all the events to - the stream. - - - - - - Writes a footer as produced by the embedded layout's property. - - - - Writes a footer as produced by the embedded layout's property. - - - - - - Writes a header produced by the embedded layout's property. - - - - Writes a header produced by the embedded layout's property. - - - - - - Closes the underlying . - - - - Closes the underlying . - - - - - - Closes the previously opened file. - - - - Writes the to the file and then - closes the file. - - - - - - Sets and opens the file where the log output will go. The specified file must be writable. - - The path to the log file. Must be a fully qualified path. - If true will append to fileName. Otherwise will truncate fileName - - - Calls but guarantees not to throw an exception. - Errors are passed to the . - - - - - - Sets and opens the file where the log output will go. The specified file must be writable. - - The path to the log file. Must be a fully qualified path. - If true will append to fileName. Otherwise will truncate fileName - - - If there was already an opened file, then the previous file - is closed first. - - - This method will ensure that the directory structure - for the specified exists. - - - - - - Sets the quiet writer used for file output - - the file stream that has been opened for writing - - - This implementation of creates a - over the and passes it to the - method. - - - This method can be overridden by sub classes that want to wrap the - in some way, for example to encrypt the output - data using a System.Security.Cryptography.CryptoStream. - - - - - - Sets the quiet writer being used. - - the writer over the file stream that has been opened for writing - - - This method can be overridden by sub classes that want to - wrap the in some way. - - - - - - Convert a path into a fully qualified path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - - - - Flag to indicate if we should append to the file - or overwrite the file. The default is to append. - - - - - The name of the log file. - - - - - The encoding to use for the file stream. - - - - - The security context to use for privileged calls - - - - - The stream to log to. Has added locking semantics - - - - - The locking model to use - - - - - Gets or sets the path to the file that logging will be written to. - - - The path to the file that logging will be written to. - - - - If the path is relative it is taken as relative from - the application base directory. - - - - - - Gets or sets a flag that indicates whether the file should be - appended to or overwritten. - - - Indicates whether the file should be appended to or overwritten. - - - - If the value is set to false then the file will be overwritten, if - it is set to true then the file will be appended to. - - The default value is true. - - - - - Gets or sets used to write to the file. - - - The used to write to the file. - - - - The default encoding set is - which is the encoding for the system's current ANSI code page. - - - - - - Gets or sets the used to write to the file. - - - The used to write to the file. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - Gets or sets the used to handle locking of the file. - - - The used to lock the file. - - - - Gets or sets the used to handle locking of the file. - - - There are two built in locking models, and . - The former locks the file from the start of logging to the end and the - later lock only for the minimal amount of time when logging each message. - - - The default locking model is the . - - - - - - Write only that uses the - to manage access to an underlying resource. - - - - - True asynchronous writes are not supported, the implementation forces a synchronous write. - - - - - Exception base type for log4net. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - A message to include with the exception. - - - Initializes a new instance of the class with - the specified message. - - - - - - Constructor - - A message to include with the exception. - A nested exception to include. - - - Initializes a new instance of the class - with the specified message and inner exception. - - - - - - Serialization constructor - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Locking model base class - - - - Base class for the locking models available to the derived loggers. - - - - - - Open the output file - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Acquire the lock on the file in preparation for writing to it. - Return a stream pointing to the file. - must be called to release the lock on the output file. - - - - - - Release the lock on the file - - - - Release the lock on the file. No further writes will be made to the - stream until is called again. - - - - - - Gets or sets the for this LockingModel - - - The for this LockingModel - - - - The file appender this locking model is attached to and working on - behalf of. - - - The file appender is used to locate the security context and the error handler to use. - - - The value of this property will be set before is - called. - - - - - - Hold an exclusive lock on the output file - - - - Open the file once for writing and hold it open until is called. - Maintains an exclusive lock on the file during this time. - - - - - - Open the file specified and prepare for logging. - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Does nothing. The lock is already taken - - - - - - Release the lock on the file - - - - Does nothing. The lock will be released when the file is closed. - - - - - - Acquires the file lock for each write - - - - Opens the file once for each / cycle, - thus holding the lock for the minimal amount of time. This method of locking - is considerably slower than but allows - other processes to move/delete the log file whilst logging continues. - - - - - - Prepares to open the file when the first message is logged. - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Acquire the lock on the file in preparation for writing to it. - Return a stream pointing to the file. - must be called to release the lock on the output file. - - - - - - Release the lock on the file - - - - Release the lock on the file. No further writes will be made to the - stream until is called again. - - - - - - This appender forwards logging events to attached appenders. - - - - The forwarding appender can be used to specify different thresholds - and filters for the same appender at different locations within the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Forward the logging event to the attached appenders - - The event to log. - - - Delivers the logging event to all the attached appenders. - - - - - - Forward the logging events to the attached appenders - - The array of events to log. - - - Delivers the logging events to all the attached appenders. - - - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - Get the named appender attached to this appender. - - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Logs events to a local syslog service. - - - - This appender uses the POSIX libc library functions openlog, syslog, and closelog. - If these functions are not available on the local system then this appender will not work! - - - The functions openlog, syslog, and closelog are specified in SUSv2 and - POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. - - - This appender talks to a local syslog service. If you need to log to a remote syslog - daemon and you cannot configure your local syslog service to do this you may be - able to use the to log via UDP. - - - Syslog messages must have a facility and and a severity. The severity - is derived from the Level of the logging event. - The facility must be chosen from the set of defined syslog - values. The facilities list is predefined - and cannot be extended. - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - Rob Lyon - Nicko Cadell - - - - Initializes a new instance of the class. - - - This instance of the class is set up to write - to a local syslog service. - - - - - Add a mapping of level to severity - - The mapping to add - - - Adds a to this appender. - - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to a remote syslog daemon. - - - The format of the output will depend on the appender's layout. - - - - - - Close the syslog when the appender is closed - - - - Close the syslog when the appender is closed - - - - - - Translates a log4net level to a syslog severity. - - A log4net level. - A syslog severity. - - - Translates a log4net level to a syslog severity. - - - - - - Generate a syslog priority. - - The syslog facility. - The syslog severity. - A syslog priority. - - - - The facility. The default facility is . - - - - - The message identity - - - - - Marshaled handle to the identity string. We have to hold on to the - string as the openlog and syslog APIs just hold the - pointer to the ident and dereference it for each log message. - - - - - Mapping from level object to syslog severity - - - - - Open connection to system logger. - - - - - Generate a log message. - - - - The libc syslog method takes a format string and a variable argument list similar - to the classic printf function. As this type of vararg list is not supported - by C# we need to specify the arguments explicitly. Here we have specified the - format string with a single message argument. The caller must set the format - string to "%s". - - - - - - Close descriptor used to write to system logger. - - - - - Message identity - - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - - - - Syslog facility - - - Set to one of the values. The list of - facilities is predefined and cannot be extended. The default value - is . - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - syslog severities - - - - The log4net Level maps to a syslog severity using the - method and the - class. The severity is set on . - - - - - - system is unusable - - - - - action must be taken immediately - - - - - critical conditions - - - - - error conditions - - - - - warning conditions - - - - - normal but significant condition - - - - - informational - - - - - debug-level messages - - - - - syslog facilities - - - - The syslog facility defines which subsystem the logging comes from. - This is set on the property. - - - - - - kernel messages - - - - - random user-level messages - - - - - mail system - - - - - system daemons - - - - - security/authorization messages - - - - - messages generated internally by syslogd - - - - - line printer subsystem - - - - - network news subsystem - - - - - UUCP subsystem - - - - - clock (cron/at) daemon - - - - - security/authorization messages (private) - - - - - ftp daemon - - - - - NTP subsystem - - - - - log audit - - - - - log alert - - - - - clock daemon - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - - - The mapped syslog severity for the specified level - - - - Required property. - The mapped syslog severity for the specified level - - - - - - Stores logging events in an array. - - - - The memory appender stores all the logging events - that are appended in an in-memory array. - - - Use the method to get - the current list of events that have been appended. - - - Use the method to clear the - current list of events. - - - Julian Biddle - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Gets the events that have been logged. - - The events that have been logged - - - Gets the events that have been logged. - - - - - - This method is called by the method. - - the event to log - - Stores the in the events list. - - - - - Clear the list of events - - - Clear the list of events - - - - - The list of events that have been appended. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - Gets or sets a value indicating whether only part of the logging event - data should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the event - data to be fixed and stored in the appender, hereby improving performance. - - - See for more information. - - - - - - Gets or sets the fields that will be fixed in the event - - - - The logging event needs to have certain thread specific values - captured before it can be buffered. See - for details. - - - - - - Logs entries by sending network messages using the - native function. - - - - You can send messages only to names that are active - on the network. If you send the message to a user name, - that user must be logged on and running the Messenger - service to receive the message. - - - The receiver will get a top most window displaying the - messages one at a time, therefore this appender should - not be used to deliver a high volume of messages. - - - The following table lists some possible uses for this appender : - - - - - Action - Property Value(s) - - - Send a message to a user account on the local machine - - - = <name of the local machine> - - - = <user name> - - - - - Send a message to a user account on a remote machine - - - = <name of the remote machine> - - - = <user name> - - - - - Send a message to a domain user account - - - = <name of a domain controller | uninitialized> - - - = <user name> - - - - - Send a message to all the names in a workgroup or domain - - - = <workgroup name | domain name>* - - - - - Send a message from the local machine to a remote machine - - - = <name of the local machine | uninitialized> - - - = <name of the remote machine> - - - - - - - Note : security restrictions apply for sending - network messages, see - for more information. - - - - - An example configuration section to log information - using this appender from the local machine, named - LOCAL_PC, to machine OPERATOR_PC : - - - - - - - - - - Nicko Cadell - Gert Driesen - - - - The DNS or NetBIOS name of the server on which the function is to execute. - - - - - The sender of the network message. - - - - - The message alias to which the message should be sent. - - - - - The security context to use for privileged calls - - - - - Initializes the appender. - - - The default constructor initializes all fields to their default values. - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The appender will be ignored if no was specified. - - - The required property was not specified. - - - - This method is called by the method. - - The event to log. - - - Sends the event using a network message. - - - - - - Sends a buffer of information to a registered message alias. - - The DNS or NetBIOS name of the server on which the function is to execute. - The message alias to which the message buffer should be sent - The originator of the message. - The message text. - The length, in bytes, of the message text. - - - The following restrictions apply for sending network messages: - - - - - Platform - Requirements - - - Windows NT - - - No special group membership is required to send a network message. - - - Admin, Accounts, Print, or Server Operator group membership is required to - successfully send a network message on a remote server. - - - - - Windows 2000 or later - - - If you send a message on a domain controller that is running Active Directory, - access is allowed or denied based on the access control list (ACL) for the securable - object. The default ACL permits only Domain Admins and Account Operators to send a network message. - - - On a member server or workstation, only Administrators and Server Operators can send a network message. - - - - - - - For more information see Security Requirements for the Network Management Functions. - - - - - If the function succeeds, the return value is zero. - - - - - - Gets or sets the sender of the message. - - - The sender of the message. - - - If this property is not specified, the message is sent from the local computer. - - - - - Gets or sets the message alias to which the message should be sent. - - - The recipient of the message. - - - This property should always be specified in order to send a message. - - - - - Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. - - - DNS or NetBIOS name of the remote server on which the function is to execute. - - - - For Windows NT 4.0 and earlier, the string should begin with \\. - - - If this property is not specified, the local computer is used. - - - - - - Gets or sets the used to call the NetSend method. - - - The used to call the NetSend method. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appends log events to the OutputDebugString system. - - - - OutputDebugStringAppender appends log events to the - OutputDebugString system. - - - The string is passed to the native OutputDebugString - function. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Write the logging event to the output debug string API - - the event to log - - - Write the logging event to the output debug string API - - - - - - Stub for OutputDebugString native method - - the string to output - - - Stub for OutputDebugString native method - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Logs events to a remote syslog daemon. - - - - The BSD syslog protocol is used to remotely log to - a syslog daemon. The syslogd listens for for messages - on UDP port 514. - - - The syslog UDP protocol is not authenticated. Most syslog daemons - do not accept remote log messages because of the security implications. - You may be able to use the LocalSyslogAppender to talk to a local - syslog service. - - - There is an RFC 3164 that claims to document the BSD Syslog Protocol. - This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. - This appender generates what the RFC calls an "Original Device Message", - i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation - this format of message will be accepted by all current syslog daemon - implementations. The daemon will attach the current time and the source - hostname or IP address to any messages received. - - - Syslog messages must have a facility and and a severity. The severity - is derived from the Level of the logging event. - The facility must be chosen from the set of defined syslog - values. The facilities list is predefined - and cannot be extended. - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - Rob Lyon - Nicko Cadell - - - - Sends logging events as connectionless UDP datagrams to a remote host or a - multicast group using an . - - - - UDP guarantees neither that messages arrive, nor that they arrive in the correct order. - - - To view the logging results, a custom application can be developed that listens for logging - events. - - - When decoding events send via this appender remember to use the same encoding - to decode the events as was used to send the events. See the - property to specify the encoding to use. - - - - This example shows how to log receive logging events that are sent - on IP address 244.0.0.1 and port 8080 to the console. The event is - encoded in the packet as a unicode string and it is decoded as such. - - IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - UdpClient udpClient; - byte[] buffer; - string loggingEvent; - - try - { - udpClient = new UdpClient(8080); - - while(true) - { - buffer = udpClient.Receive(ref remoteEndPoint); - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); - Console.WriteLine(loggingEvent); - } - } - catch(Exception e) - { - Console.WriteLine(e.ToString()); - } - - - Dim remoteEndPoint as IPEndPoint - Dim udpClient as UdpClient - Dim buffer as Byte() - Dim loggingEvent as String - - Try - remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) - udpClient = new UdpClient(8080) - - While True - buffer = udpClient.Receive(ByRef remoteEndPoint) - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) - Console.WriteLine(loggingEvent) - Wend - Catch e As Exception - Console.WriteLine(e.ToString()) - End Try - - - An example configuration section to log information using this appender to the - IP 224.0.0.1 on port 8080: - - - - - - - - - - Gert Driesen - Nicko Cadell - - - - Initializes a new instance of the class. - - - The default constructor initializes all fields to their default values. - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The appender will be ignored if no was specified or - an invalid remote or local TCP port number was specified. - - - The required property was not specified. - The TCP port number assigned to or is less than or greater than . - - - - This method is called by the method. - - The event to log. - - - Sends the event using an UDP datagram. - - - Exceptions are passed to the . - - - - - - Closes the UDP connection and releases all resources associated with - this instance. - - - - Disables the underlying and releases all managed - and unmanaged resources associated with the . - - - - - - Initializes the underlying connection. - - - - The underlying is initialized and binds to the - port number from which you intend to communicate. - - - Exceptions are passed to the . - - - - - - The IP address of the remote host or multicast group to which - the logging event will be sent. - - - - - The TCP port number of the remote host or multicast group to - which the logging event will be sent. - - - - - The cached remote endpoint to which the logging events will be sent. - - - - - The TCP port number from which the will communicate. - - - - - The instance that will be used for sending the - logging events. - - - - - The encoding to use for the packet. - - - - - Gets or sets the IP address of the remote host or multicast group to which - the underlying should sent the logging event. - - - The IP address of the remote host or multicast group to which the logging event - will be sent. - - - - Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to - 239.255.255.255). Multicast packets can pass across different networks through routers, so - it is possible to use multicasts in an Internet scenario as long as your network provider - supports multicasting. - - - Hosts that want to receive particular multicast messages must register their interest by joining - the multicast group. Multicast messages are not sent to networks where no host has joined - the multicast group. Class D IP addresses are used for multicast groups, to differentiate - them from normal host addresses, allowing nodes to easily detect if a message is of interest. - - - Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: - - - - - IP Address - Description - - - 224.0.0.1 - - - Sends a message to all system on the subnet. - - - - - 224.0.0.2 - - - Sends a message to all routers on the subnet. - - - - - 224.0.0.12 - - - The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. - - - - - - - A complete list of actually reserved multicast addresses and their owners in the ranges - defined by RFC 3171 can be found at the IANA web site. - - - The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative - addresses. These addresses can be reused with other local groups. Routers are typically - configured with filters to prevent multicast traffic in this range from flowing outside - of the local network. - - - - - - Gets or sets the TCP port number of the remote host or multicast group to which - the underlying should sent the logging event. - - - An integer value in the range to - indicating the TCP port number of the remote host or multicast group to which the logging event - will be sent. - - - The underlying will send messages to this TCP port number - on the remote host or multicast group. - - The value specified is less than or greater than . - - - - Gets or sets the TCP port number from which the underlying will communicate. - - - An integer value in the range to - indicating the TCP port number from which the underlying will communicate. - - - - The underlying will bind to this port for sending messages. - - - Setting the value to 0 (the default) will cause the udp client not to bind to - a local port. - - - The value specified is less than or greater than . - - - - Gets or sets used to write the packets. - - - The used to write the packets. - - - - The used to write the packets. - - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to send logging events - over a network. Classes deriving from can use this - property to get or set this . Use the underlying - returned from if you require access beyond that which - provides. - - - - - Gets or sets the cached remote endpoint to which the logging events should be sent. - - - The cached remote endpoint to which the logging events will be sent. - - - The method will initialize the remote endpoint - with the values of the and - properties. - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Syslog port 514 - - - - - Initializes a new instance of the class. - - - This instance of the class is set up to write - to a remote syslog daemon. - - - - - Add a mapping of level to severity - - The mapping to add - - - Add a mapping to this appender. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to a remote syslog daemon. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to syslog severity mappings set on this appender. - - - - - - Translates a log4net level to a syslog severity. - - A log4net level. - A syslog severity. - - - Translates a log4net level to a syslog severity. - - - - - - Generate a syslog priority. - - The syslog facility. - The syslog severity. - A syslog priority. - - - Generate a syslog priority. - - - - - - The facility. The default facility is . - - - - - The message identity - - - - - Mapping from level object to syslog severity - - - - - Message identity - - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - - - - Syslog facility - - - Set to one of the values. The list of - facilities is predefined and cannot be extended. The default value - is . - - - - - syslog severities - - - - The syslog severities. - - - - - - system is unusable - - - - - action must be taken immediately - - - - - critical conditions - - - - - error conditions - - - - - warning conditions - - - - - normal but significant condition - - - - - informational - - - - - debug-level messages - - - - - syslog facilities - - - - The syslog facilities - - - - - - kernel messages - - - - - random user-level messages - - - - - mail system - - - - - system daemons - - - - - security/authorization messages - - - - - messages generated internally by syslogd - - - - - line printer subsystem - - - - - network news subsystem - - - - - UUCP subsystem - - - - - clock (cron/at) daemon - - - - - security/authorization messages (private) - - - - - ftp daemon - - - - - NTP subsystem - - - - - log audit - - - - - log alert - - - - - clock daemon - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - - - The mapped syslog severity for the specified level - - - - Required property. - The mapped syslog severity for the specified level - - - - - - Delivers logging events to a remote logging sink. - - - - This Appender is designed to deliver events to a remote sink. - That is any object that implements the - interface. It delivers the events using .NET remoting. The - object to deliver events to is specified by setting the - appenders property. - - The RemotingAppender buffers events before sending them. This allows it to - make more efficient use of the remoting infrastructure. - - Once the buffer is full the events are still not sent immediately. - They are scheduled to be sent using a pool thread. The effect is that - the send occurs asynchronously. This is very important for a - number of non obvious reasons. The remoting infrastructure will - flow thread local variables (stored in the ), - if they are marked as , across the - remoting boundary. If the server is not contactable then - the remoting infrastructure will clear the - objects from the . To prevent a logging failure from - having side effects on the calling application the remoting call must be made - from a separate thread to the one used by the application. A - thread is used for this. If no thread is available then - the events will block in the thread pool manager until a thread is available. - - Because the events are sent asynchronously using pool threads it is possible to close - this appender before all the queued events have been sent. - When closing the appender attempts to wait until all the queued events have been sent, but - this will timeout after 30 seconds regardless. - - If this appender is being closed because the - event has fired it may not be possible to send all the queued events. During process - exit the runtime limits the time that a - event handler is allowed to run for. If the runtime terminates the threads before - the queued events have been sent then they will be lost. To ensure that all events - are sent the appender must be closed before the application exits. See - for details on how to shutdown - log4net programmatically. - - - Nicko Cadell - Gert Driesen - Daniel Cazzulino - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Send the contents of the buffer to the remote sink. - - - The events are not sent immediately. They are scheduled to be sent - using a pool thread. The effect is that the send occurs asynchronously. - This is very important for a number of non obvious reasons. The remoting - infrastructure will flow thread local variables (stored in the ), - if they are marked as , across the - remoting boundary. If the server is not contactable then - the remoting infrastructure will clear the - objects from the . To prevent a logging failure from - having side effects on the calling application the remoting call must be made - from a separate thread to the one used by the application. A - thread is used for this. If no thread is available then - the events will block in the thread pool manager until a thread is available. - - The events to send. - - - - Override base class close. - - - - This method waits while there are queued work items. The events are - sent asynchronously using work items. These items - will be sent once a thread pool thread is available to send them, therefore - it is possible to close the appender before all the queued events have been - sent. - - This method attempts to wait until all the queued events have been sent, but this - method will timeout after 30 seconds regardless. - - If the appender is being closed because the - event has fired it may not be possible to send all the queued events. During process - exit the runtime limits the time that a - event handler is allowed to run for. - - - - - A work item is being queued into the thread pool - - - - - A work item from the thread pool has completed - - - - - Send the contents of the buffer to the remote sink. - - - This method is designed to be used with the . - This method expects to be passed an array of - objects in the state param. - - the logging events to send - - - - The URL of the remote sink. - - - - - The local proxy (.NET remoting) for the remote logging sink. - - - - - The number of queued callbacks currently waiting or executing - - - - - Event used to signal when there are no queued work items - - - This event is set when there are no queued work items. In this - state it is safe to close the appender. - - - - - Gets or sets the URL of the well-known object that will accept - the logging events. - - - The well-known URL of the remote sink. - - - - The URL of the remoting sink that will accept logging events. - The sink must implement the - interface. - - - - - - Interface used to deliver objects to a remote sink. - - - This interface must be implemented by a remoting sink - if the is to be used - to deliver logging events to the sink. - - - - - Delivers logging events to the remote sink - - Array of events to log. - - - Delivers logging events to the remote sink - - - - - - Appender that rolls log files based on size or date or both. - - - - RollingFileAppender can roll log files based on size or date or both - depending on the setting of the property. - When set to the log file will be rolled - once its size exceeds the . - When set to the log file will be rolled - once the date boundary specified in the property - is crossed. - When set to the log file will be - rolled once the date boundary specified in the property - is crossed, but within a date boundary the file will also be rolled - once its size exceeds the . - When set to the log file will be rolled when - the appender is configured. This effectively means that the log file can be - rolled once per program execution. - - - A of few additional optional features have been added: - - Attach date pattern for current log file - Backup number increments for newer files - Infinite number of backups by file size - - - - - - For large or infinite numbers of backup files a - greater than zero is highly recommended, otherwise all the backup files need - to be renamed each time a new backup is created. - - - When Date/Time based rolling is used setting - to will reduce the number of file renamings to few or none. - - - - - - Changing or without clearing - the log file directory of backup files will cause unexpected and unwanted side effects. - - - - - If Date/Time based rolling is enabled this appender will attempt to roll existing files - in the directory without a Date/Time tag based on the last write date of the base log file. - The appender only rolls the log file when a message is logged. If Date/Time based rolling - is enabled then the appender will not roll the log file at the Date/Time boundary but - at the point when the next message is logged after the boundary has been crossed. - - - - The extends the and - has the same behavior when opening the log file. - The appender will first try to open the file for writing when - is called. This will typically be during configuration. - If the file cannot be opened for writing the appender will attempt - to open the file again each time a message is logged to the appender. - If the file cannot be opened for writing when a message is logged then - the message will be discarded by this appender. - - - When rolling a backup file necessitates deleting an older backup file the - file to be deleted is moved to a temporary name before being deleted. - - - - - A maximum number of backup files when rolling on date/time boundaries is not supported. - - - - Nicko Cadell - Gert Driesen - Aspi Havewala - Douglas de la Torre - Edward Smit - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Sets the quiet writer being used. - - - This method can be overridden by sub classes. - - the writer to set - - - - Write out a logging event. - - the event to write to file. - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Write out an array of logging events. - - the events to write to file. - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Performs any required rolling before outputting the next event - - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Creates and opens the file for logging. If - is false then the fully qualified name is determined and used. - - the name of the file to open - true to append to existing file - - This method will ensure that the directory structure - for the specified exists. - - - - - Get the current output file name - - the base file name - the output file name - - The output file name is based on the base fileName specified. - If is set then the output - file name is the same as the base file passed in. Otherwise - the output file depends on the date pattern, on the count - direction or both. - - - - - Determines curSizeRollBackups (only within the current roll point) - - - - - Generates a wildcard pattern that can be used to find all files - that are similar to the base file name. - - - - - - - Builds a list of filenames for all files matching the base filename plus a file - pattern. - - - - - - - Initiates a roll over if needed for crossing a date boundary since the last run. - - - - - Initializes based on existing conditions at time of . - - - - Initializes based on existing conditions at time of . - The following is done - - determine curSizeRollBackups (only within the current roll point) - initiates a roll over if needed for crossing a date boundary since the last run. - - - - - - - Does the work of bumping the 'current' file counter higher - to the highest count when an incremental file name is seen. - The highest count is either the first file (when count direction - is greater than 0) or the last file (when count direction less than 0). - In either case, we want to know the highest count that is present. - - - - - - - Takes a list of files and a base file name, and looks for - 'incremented' versions of the base file. Bumps the max - count up to the highest count seen. - - - - - - - Calculates the RollPoint for the datePattern supplied. - - the date pattern to calculate the check period for - The RollPoint that is most accurate for the date pattern supplied - - Essentially the date pattern is examined to determine what the - most suitable roll point is. The roll point chosen is the roll point - with the smallest period that can be detected using the date pattern - supplied. i.e. if the date pattern only outputs the year, month, day - and hour then the smallest roll point that can be detected would be - and hourly roll point as minutes could not be detected. - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Sets initial conditions including date/time roll over information, first check, - scheduledFilename, and calls to initialize - the current number of backups. - - - - - - Rollover the file(s) to date/time tagged file(s). - - set to true if the file to be rolled is currently open - - - Rollover the file(s) to date/time tagged file(s). - Resets curSizeRollBackups. - If fileIsOpen is set then the new file is opened (through SafeOpenFile). - - - - - - Renames file to file . - - Name of existing file to roll. - New name for file. - - - Renames file to file . It - also checks for existence of target file and deletes if it does. - - - - - - Test if a file exists at a specified path - - the path to the file - true if the file exists - - - Test if a file exists at a specified path - - - - - - Deletes the specified file if it exists. - - The file to delete. - - - Delete a file if is exists. - The file is first moved to a new filename then deleted. - This allows the file to be removed even when it cannot - be deleted, but it still can be moved. - - - - - - Implements file roll base on file size. - - - - If the maximum number of size based backups is reached - (curSizeRollBackups == maxSizeRollBackups) then the oldest - file is deleted -- its index determined by the sign of countDirection. - If countDirection < 0, then files - {File.1, ..., File.curSizeRollBackups -1} - are renamed to {File.2, ..., - File.curSizeRollBackups}. Moreover, File is - renamed File.1 and closed. - - - A new file is created to receive further log output. - - - If maxSizeRollBackups is equal to zero, then the - File is truncated with no backup files created. - - - If maxSizeRollBackups < 0, then File is - renamed if needed and no files are deleted. - - - - - - Implements file roll. - - the base name to rename - - - If the maximum number of size based backups is reached - (curSizeRollBackups == maxSizeRollBackups) then the oldest - file is deleted -- its index determined by the sign of countDirection. - If countDirection < 0, then files - {File.1, ..., File.curSizeRollBackups -1} - are renamed to {File.2, ..., - File.curSizeRollBackups}. - - - If maxSizeRollBackups is equal to zero, then the - File is truncated with no backup files created. - - - If maxSizeRollBackups < 0, then File is - renamed if needed and no files are deleted. - - - This is called by to rename the files. - - - - - - Get the start time of the next window for the current rollpoint - - the current date - the type of roll point we are working with - the start time for the next roll point an interval after the currentDateTime date - - - Returns the date of the next roll point after the currentDateTime date passed to the method. - - - The basic strategy is to subtract the time parts that are less significant - than the rollpoint from the current time. This should roll the time back to - the start of the time window for the current rollpoint. Then we add 1 window - worth of time and get the start time of the next window for the rollpoint. - - - - - - This object supplies the current date/time. Allows test code to plug in - a method to control this class when testing date/time based rolling. - - - - - The date pattern. By default, the pattern is set to ".yyyy-MM-dd" - meaning daily rollover. - - - - - The actual formatted filename that is currently being written to - or will be the file transferred to on roll over - (based on staticLogFileName). - - - - - The timestamp when we shall next recompute the filename. - - - - - Holds date of last roll over - - - - - The type of rolling done - - - - - The default maximum file size is 10MB - - - - - There is zero backup files by default - - - - - How many sized based backups have been made so far - - - - - The rolling file count direction. - - - - - The rolling mode used in this appender. - - - - - Cache flag set if we are rolling by date. - - - - - Cache flag set if we are rolling by size. - - - - - Value indicating whether to always log to the same file. - - - - - FileName provided in configuration. Used for rolling properly - - - - - The 1st of January 1970 in UTC - - - - - Gets or sets the date pattern to be used for generating file names - when rolling over on date. - - - The date pattern to be used for generating file names when rolling - over on date. - - - - Takes a string in the same format as expected by - . - - - This property determines the rollover schedule when rolling over - on date. - - - - - - Gets or sets the maximum number of backup files that are kept before - the oldest is erased. - - - The maximum number of backup files that are kept before the oldest is - erased. - - - - If set to zero, then there will be no backup files and the log file - will be truncated when it reaches . - - - If a negative number is supplied then no deletions will be made. Note - that this could result in very slow performance as a large number of - files are rolled over unless is used. - - - The maximum applies to each time based group of files and - not the total. - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size in bytes that the output file is allowed to reach before being - rolled over to backup files. - - - - This property is equivalent to except - that it is required for differentiating the setter taking a - argument from the setter taking a - argument. - - - The default maximum file size is 10MB (10*1024*1024). - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size that the output file is allowed to reach before being - rolled over to backup files. - - - - This property allows you to specify the maximum size with the - suffixes "KB", "MB" or "GB" so that the size is interpreted being - expressed respectively in kilobytes, megabytes or gigabytes. - - - For example, the value "10KB" will be interpreted as 10240 bytes. - - - The default maximum file size is 10MB. - - - If you have the option to set the maximum file size programmatically - consider using the property instead as this - allows you to set the size in bytes as a . - - - - - - Gets or sets the rolling file count direction. - - - The rolling file count direction. - - - - Indicates if the current file is the lowest numbered file or the - highest numbered file. - - - By default newer files have lower numbers ( < 0), - i.e. log.1 is most recent, log.5 is the 5th backup, etc... - - - >= 0 does the opposite i.e. - log.1 is the first backup made, log.5 is the 5th backup made, etc. - For infinite backups use >= 0 to reduce - rollover costs. - - The default file count direction is -1. - - - - - Gets or sets the rolling style. - - The rolling style. - - - The default rolling style is . - - - When set to this appender's - property is set to false, otherwise - the appender would append to a single file rather than rolling - the file each time it is opened. - - - - - - Gets or sets a value indicating whether to always log to - the same file. - - - true if always should be logged to the same file, otherwise false. - - - - By default file.log is always the current file. Optionally - file.log.yyyy-mm-dd for current formatted datePattern can by the currently - logging file (or file.log.curSizeRollBackup or even - file.log.yyyy-mm-dd.curSizeRollBackup). - - - This will make time based rollovers with a large number of backups - much faster as the appender it won't have to rename all the backups! - - - - - - Style of rolling to use - - - - Style of rolling to use - - - - - - Roll files once per program execution - - - - Roll files once per program execution. - Well really once each time this appender is - configured. - - - Setting this option also sets AppendToFile to - false on the RollingFileAppender, otherwise - this appender would just be a normal file appender. - - - - - - Roll files based only on the size of the file - - - - - Roll files based only on the date - - - - - Roll files based on both the size and date of the file - - - - - The code assumes that the following 'time' constants are in a increasing sequence. - - - - The code assumes that the following 'time' constants are in a increasing sequence. - - - - - - Roll the log not based on the date - - - - - Roll the log for each minute - - - - - Roll the log for each hour - - - - - Roll the log twice a day (midday and midnight) - - - - - Roll the log each day (midnight) - - - - - Roll the log each week - - - - - Roll the log each month - - - - - This interface is used to supply Date/Time information to the . - - - This interface is used to supply Date/Time information to the . - Used primarily to allow test classes to plug themselves in so they can - supply test date/times. - - - - - Gets the current time. - - The current time. - - - Gets the current time. - - - - - - Default implementation of that returns the current time. - - - - - Gets the current time. - - The current time. - - - Gets the current time. - - - - - - Send an e-mail when a specific logging event occurs, typically on errors - or fatal errors. - - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. - For these features to be enabled you need to ensure that you are using a version of - the log4net assembly that is built against the MS .NET 1.1 framework and that you are - running the your application on the MS .NET 1.1 runtime. On all other platforms only sending - unauthenticated messages to a server listening on port 25 (the default) is supported. - - - Authentication is supported by setting the property to - either or . - If using authentication then the - and properties must also be set. - - - To set the SMTP server port use the property. The default port is 25. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Default constructor - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - - Send the email message - - the body text to include in the mail - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses. - - - A semicolon-delimited list of e-mail addresses. - - - - A semicolon-delimited list of recipient e-mail addresses. - - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - The e-mail address of the sender. - - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - The subject line of the e-mail message. - - - - - - Gets or sets the name of the SMTP relay mail server to use to send - the e-mail messages. - - - The name of the e-mail relay server. If SmtpServer is not set, the - name of the local SMTP server is used. - - - - The name of the e-mail relay server. If SmtpServer is not set, the - name of the local SMTP server is used. - - - - - - Obsolete - - - Use the BufferingAppenderSkeleton Fix methods instead - - - - Obsolete property. - - - - - - The mode to use to authentication with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - Valid Authentication mode values are: , - , and . - The default value is . When using - you must specify the - and to use to authenticate. - When using the Windows credentials for the current - thread, if impersonating, or the process will be used to authenticate. - - - - - - The username to use to authenticate with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - A and must be specified when - is set to , - otherwise the username will be ignored. - - - - - - The password to use to authenticate with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - A and must be specified when - is set to , - otherwise the password will be ignored. - - - - - - The port on which the SMTP server is listening - - - Server Port is only available on the MS .NET 1.1 runtime. - - The port on which the SMTP server is listening. The default - port is 25. The Port can only be changed when running on - the MS .NET 1.1 runtime. - - - - - - Gets or sets the priority of the e-mail message - - - One of the values. - - - - Sets the priority of the e-mails generated by this - appender. The default priority is . - - - If you are using this appender to report errors then - you may want to set the priority to . - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Values for the property. - - - - SMTP authentication modes. - - - - - - No authentication - - - - - Basic authentication. - - - Requires a username and password to be supplied - - - - - Integrated authentication - - - Uses the Windows credentials from the current thread or process to authenticate. - - - - - Send an email when a specific logging event occurs, typically on errors - or fatal errors. Rather than sending via smtp it writes a file into the - directory specified by . This allows services such - as the IIS SMTP agent to manage sending the messages. - - - - The configuration for this appender is identical to that of the SMTPAppender, - except that instead of specifying the SMTPAppender.SMTPHost you specify - . - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - Niall Daley - Nicko Cadell - - - - Default constructor - - - - Default constructor - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - Sends the contents of the cyclic buffer as an e-mail message. - - - - - - Activate the options on this appender. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Convert a path into a fully qualified path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - - - - The security context to use for privileged calls - - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses. - - - A semicolon-delimited list of e-mail addresses. - - - - A semicolon-delimited list of e-mail addresses. - - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - The e-mail address of the sender. - - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - The subject line of the e-mail message. - - - - - - Gets or sets the path to write the messages to. - - - - Gets or sets the path to write the messages to. This should be the same - as that used by the agent sending the messages. - - - - - - Gets or sets the used to write to the pickup directory. - - - The used to write to the pickup directory. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appender that allows clients to connect via Telnet to receive log messages - - - - The TelnetAppender accepts socket connections and streams logging messages - back to the client. - The output is provided in a telnet-friendly way so that a log can be monitored - over a TCP/IP socket. - This allows simple remote monitoring of application logging. - - - The default is 23 (the telnet port). - - - Keith Long - Nicko Cadell - - - - Default constructor - - - - Default constructor - - - - - - Overrides the parent method to close the socket handler - - - - Closes all the outstanding connections. - - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Create the socket handler and wait for connections - - - - - - Writes the logging event to each connected client. - - The event to log. - - - Writes the logging event to each connected client. - - - - - - Gets or sets the TCP port number on which this will listen for connections. - - - An integer value in the range to - indicating the TCP port number on which this will listen for connections. - - - - The default value is 23 (the telnet port). - - - The value specified is less than - or greater than . - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Helper class to manage connected clients - - - - The SocketHandler class is used to accept connections from - clients. It is threaded so that clients can connect/disconnect - asynchronously. - - - - - - Opens a new server port on - - the local port to listen on for connections - - - Creates a socket handler on the specified local server port. - - - - - - Sends a string message to each of the connected clients - - the text to send - - - Sends a string message to each of the connected clients - - - - - - Add a client to the internal clients list - - client to add - - - - Remove a client from the internal clients list - - client to remove - - - - Callback used to accept a connection on the server socket - - The result of the asynchronous operation - - - On connection adds to the list of connections - if there are two many open connections you will be disconnected - - - - - - Close all network connections - - - - Make sure we close all network connections - - - - - - Test if this handler has active connections - - - true if this handler has active connections - - - - This property will be true while this handler has - active connections, that is at least one connection that - the handler will attempt to send a message to. - - - - - - Class that represents a client connected to this handler - - - - Class that represents a client connected to this handler - - - - - - Create this for the specified - - the client's socket - - - Opens a stream writer on the socket. - - - - - - Write a string to the client - - string to send - - - Write a string to the client - - - - - - Cleanup the clients connection - - - - Close the socket connection. - - - - - - Appends log events to the system. - - - - The application configuration file can be used to control what listeners - are actually used. See the MSDN documentation for the - class for details on configuring the - trace system. - - - Events are written using the System.Diagnostics.Trace.Write(string,string) - method. The event's logger name is passed as the value for the category name to the Write method. - - - Compact Framework
    - The Compact Framework does not support the - class for any operation except Assert. When using the Compact Framework this - appender will write to the system rather than - the Trace system. This appender will therefore behave like the . -
    -
    - Douglas de la Torre - Nicko Cadell - Gert Driesen -
    - - - Initializes a new instance of the . - - - - Default constructor. - - - - - - Initializes a new instance of the - with a specified layout. - - The layout to use with this appender. - - - Obsolete constructor. - - - - - - Writes the logging event to the system. - - The event to log. - - - Writes the logging event to the system. - - - - - - Immediate flush means that the underlying writer or output stream - will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logs events are not actually written to persistent media if and - when the application crashes. - - - The default value is true. - - - - - Gets or sets a value that indicates whether the appender will - flush at the end of each write. - - - The default behavior is to flush at the end of each - write. If the option is set tofalse, then the underlying - stream can defer writing to physical medium to a later time. - - - Avoiding the flush operation at the end of each append results - in a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Assembly level attribute that specifies a domain to alias to this assembly's repository. - - - - AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. - - - An assembly's logger repository is defined by its , - however this can be overridden by an assembly loaded before the target assembly. - - - An assembly can alias another assembly's domain to its repository by - specifying this attribute with the name of the target domain. - - - This attribute can only be specified on the assembly and may be used - as many times as necessary to alias all the required domains. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute that specifies a repository to alias to this assembly's repository. - - - - An assembly's logger repository is defined by its , - however this can be overridden by an assembly loaded before the target assembly. - - - An assembly can alias another assembly's repository to its repository by - specifying this attribute with the name of the target repository. - - - This attribute can only be specified on the assembly and may be used - as many times as necessary to alias all the required repositories. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class with - the specified repository to alias to this assembly's repository. - - The repository to alias to this assemby's repository. - - - Initializes a new instance of the class with - the specified repository to alias to this assembly's repository. - - - - - - Gets or sets the repository to alias to this assemby's repository. - - - The repository to alias to this assemby's repository. - - - - The name of the repository to alias to this assemby's repository. - - - - - - Initializes a new instance of the class with - the specified domain to alias to this assembly's repository. - - The domain to alias to this assemby's repository. - - - Obsolete. Use instead of . - - - - - - Use this class to quickly configure a . - - - - Allows very simple programmatic configuration of log4net. - - - Only one appender can be configured using this configurator. - The appender is set at the root of the hierarchy and all logging - events will be delivered to that appender. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Initializes the log4net system with a default configuration. - - - - Initializes the log4net logging system using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the log4net system using the specified appender. - - The appender to use to log all logging events. - - - Initializes the log4net system using the specified appender. - - - - - - Initializes the with a default configuration. - - The repository to configure. - - - Initializes the specified repository using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the using the specified appender. - - The repository to configure. - The appender to use to log all logging events. - - - Initializes the using the specified appender. - - - - - - Base class for all log4net configuration attributes. - - - This is an abstract class that must be extended by - specific configurators. This attribute allows the - configurator to be parameterized by an assembly level - attribute. - - Nicko Cadell - Gert Driesen - - - - Constructor used by subclasses. - - the ordering priority for this configurator - - - The is used to order the configurator - attributes before they are invoked. Higher priority configurators are executed - before lower priority ones. - - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - Abstract method implemented by a subclass. When this method is called - the subclass should configure the . - - - - - - Compare this instance to another ConfiguratorAttribute - - the object to compare to - see - - - Compares the priorities of the two instances. - Sorts by priority in descending order. Objects with the same priority are - randomly ordered. - - - - - - Assembly level attribute that specifies the logging domain for the assembly. - - - - DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - Assemblies are mapped to logging domains. Each domain has its own - logging repository. This attribute specified on the assembly controls - the configuration of the domain. The property specifies the name - of the domain that this assembly is a part of. The - specifies the type of the repository objects to create for the domain. If - this attribute is not specified and a is not specified - then the assembly will be part of the default shared logging domain. - - - This attribute can only be specified on the assembly and may only be used - once per assembly. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute that specifies the logging repository for the assembly. - - - - Assemblies are mapped to logging repository. This attribute specified - on the assembly controls - the configuration of the repository. The property specifies the name - of the repository that this assembly is a part of. The - specifies the type of the object - to create for the assembly. If this attribute is not specified or a - is not specified then the assembly will be part of the default shared logging repository. - - - This attribute can only be specified on the assembly and may only be used - once per assembly. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initialize a new instance of the class - with the name of the repository. - - The name of the repository. - - - Initialize the attribute with the name for the assembly's repository. - - - - - - Gets or sets the name of the logging repository. - - - The string name to use as the name of the repository associated with this - assembly. - - - - This value does not have to be unique. Several assemblies can share the - same repository. They will share the logging configuration of the repository. - - - - - - Gets or sets the type of repository to create for this assembly. - - - The type of repository to create for this assembly. - - - - The type of the repository to create for the assembly. - The type must implement the - interface. - - - This will be the type of repository created when - the repository is created. If multiple assemblies reference the - same repository then the repository is only created once using the - of the first assembly to call into the - repository. - - - - - - Initializes a new instance of the class. - - - - Obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - - - - Initialize a new instance of the class - with the name of the domain. - - The name of the domain. - - - Obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - - - - Use this class to initialize the log4net environment using an Xml tree. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - Configures a using an Xml tree. - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - - - Automatically configures the log4net system based on the - application's configuration settings. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - - - Automatically configures the using settings - stored in the application's configuration file. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - The repository to configure. - - - - Configures log4net using a log4net element - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Loads the log4net configuration from the XML element - supplied as . - - The element to parse. - - - - Configures the using the specified XML - element. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Loads the log4net configuration from the XML element - supplied as . - - The repository to configure. - The element to parse. - - - - Configures log4net using the specified configuration file. - - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures log4net using the specified configuration file. - - A stream to load the XML configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The stream to load the XML configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures log4net using the file specified, monitors the file for changes - and reloads the configuration if a change is detected. - - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the using the file specified, - monitors the file for changes and reloads the configuration if a change - is detected. - - The repository to configure. - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Assembly level attribute to configure the . - - - - AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute to configure the . - - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - If neither of the or - properties are set the configuration is loaded from the application's .config file. - If set the property takes priority over the - property. The property - specifies a path to a file to load the config from. The path is relative to the - application's base directory; . - The property is used as a postfix to the assembly file name. - The config file must be located in the application's base directory; . - For example in a console application setting the to - config has the same effect as not specifying the or - properties. - - - The property can be set to cause the - to watch the configuration file for changes. - - - - Log4net will only look for assembly level configuration attributes once. - When using the log4net assembly level attributes to control the configuration - of log4net you must ensure that the first call to any of the - methods is made from the assembly with the configuration - attributes. - - - If you cannot guarantee the order in which log4net calls will be made from - different assemblies you must use programmatic configuration instead, i.e. - call the method directly. - - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Default constructor - - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - Configure the repository using the . - The specified must extend the - class otherwise the will not be able to - configure it. - - - The does not extend . - - - - Attempt to load configuration from the local file system - - The assembly that this attribute was defined on. - The repository to configure. - - - - Configure the specified repository using a - - The repository to configure. - the FileInfo pointing to the config file - - - - Attempt to load configuration from a URI - - The assembly that this attribute was defined on. - The repository to configure. - - - - Gets or sets the filename of the configuration file. - - - The filename of the configuration file. - - - - If specified, this is the name of the configuration file to use with - the . This file path is relative to the - application base directory (). - - - The takes priority over the . - - - - - - Gets or sets the extension of the configuration file. - - - The extension of the configuration file. - - - - If specified this is the extension for the configuration file. - The path to the config file is built by using the application - base directory (), - the assembly file name and the config file extension. - - - If the is set to MyExt then - possible config file names would be: MyConsoleApp.exe.MyExt or - MyClassLibrary.dll.MyExt. - - - The takes priority over the . - - - - - - Gets or sets a value indicating whether to watch the configuration file. - - - true if the configuration should be watched, false otherwise. - - - - If this flag is specified and set to true then the framework - will watch the configuration file and will reload the config each time - the file is modified. - - - The config file can only be watched if it is loaded from local disk. - In a No-Touch (Smart Client) deployment where the application is downloaded - from a web server the config file may not reside on the local disk - and therefore it may not be able to watch it. - - - Watching configuration is not supported on the SSCLI. - - - - - - Class to register for the log4net section of the configuration file - - - The log4net section of the configuration file needs to have a section - handler registered. This is the section handler used. It simply returns - the XML element that is the root of the section. - - - Example of registering the log4net section handler : - - - -
    - - - log4net configuration XML goes here - - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Parses the configuration section. - - The configuration settings in a corresponding parent configuration section. - The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. - The for the log4net section. - The for the log4net section. - - - Returns the containing the configuration data, - - - - - - Assembly level attribute that specifies a plugin to attach to - the repository. - - - - Specifies the type of a plugin to create and attach to the - assembly's repository. The plugin type must implement the - interface. - - - Nicko Cadell - Gert Driesen - - - - Interface used to create plugins. - - - - Interface used to create a plugin. - - - Nicko Cadell - Gert Driesen - - - - Creates the plugin object. - - the new plugin instance - - - Create and return a new plugin instance. - - - - - - Initializes a new instance of the class - with the specified type. - - The type name of plugin to create. - - - Create the attribute with the plugin type specified. - - - Where possible use the constructor that takes a . - - - - - - Initializes a new instance of the class - with the specified type. - - The type of plugin to create. - - - Create the attribute with the plugin type specified. - - - - - - Creates the plugin object defined by this attribute. - - - - Creates the instance of the object as - specified by this attribute. - - - The plugin object. - - - - Returns a representation of the properties of this object. - - - - Overrides base class method to - return a representation of the properties of this object. - - - A representation of the properties of this object - - - - Gets or sets the type for the plugin. - - - The type for the plugin. - - - - The type for the plugin. - - - - - - Gets or sets the type name for the plugin. - - - The type name for the plugin. - - - - The type name for the plugin. - - - Where possible use the property instead. - - - - - - Assembly level attribute to configure the . - - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - Nicko Cadell - - - - Construct provider attribute with type specified - - the type of the provider to use - - - The provider specified must subclass the - class. - - - - - - Configures the SecurityContextProvider - - The assembly that this attribute was defined on. - The repository to configure. - - - Creates a provider instance from the specified. - Sets this as the default security context provider . - - - - - - Gets or sets the type of the provider to use. - - - the type of the provider to use. - - - - The provider specified must subclass the - class. - - - - - - Use this class to initialize the log4net environment using an Xml tree. - - - - Configures a using an Xml tree. - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - - - Automatically configures the log4net system based on the - application's configuration settings. - - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - To use this method to configure log4net you must specify - the section - handler for the log4net configuration section. See the - for an example. - - - - - - - Automatically configures the using settings - stored in the application's configuration file. - - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - To use this method to configure log4net you must specify - the section - handler for the log4net configuration section. See the - for an example. - - - The repository to configure. - - - - Configures log4net using a log4net element - - - - Loads the log4net configuration from the XML element - supplied as . - - - The element to parse. - - - - Configures the using the specified XML - element. - - - Loads the log4net configuration from the XML element - supplied as . - - The repository to configure. - The element to parse. - - - - Configures log4net using the specified configuration file. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The first element matching <configuration> will be read as the - configuration. If this file is also a .NET .config file then you must specify - a configuration section for the log4net element otherwise .NET will - complain. Set the type for the section handler to , for example: - - -
    - - - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures log4net using the specified configuration URI. - - A URI to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The must support the URI scheme specified. - - - - - - Configures log4net using the specified configuration data stream. - - A stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The first element matching <configuration> will be read as the - configuration. If this file is also a .NET .config file then you must specify - a configuration section for the log4net element otherwise .NET will - complain. Set the type for the section handler to , for example: - - -
    - - - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures the using the specified configuration - URI. - - The repository to configure. - A URI to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The must support the URI scheme specified. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures log4net using the file specified, monitors the file for changes - and reloads the configuration if a change is detected. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the using the file specified, - monitors the file for changes and reloads the configuration if a change - is detected. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the specified repository using a log4net element. - - The hierarchy to configure. - The element to parse. - - - Loads the log4net configuration from the XML element - supplied as . - - - This method is ultimately called by one of the Configure methods - to load the configuration from an . - - - - - - Class used to watch config files. - - - - Uses the to monitor - changes to a specified file. Because multiple change notifications - may be raised when the file is modified, a timer is used to - compress the notifications into a single event. The timer - waits for time before delivering - the event notification. If any further - change notifications arrive while the timer is waiting it - is reset and waits again for to - elapse. - - - - - - The default amount of time to wait after receiving notification - before reloading the config file. - - - - - Watch a specified config file used to configure a repository - - The repository to configure. - The configuration file to watch. - - - Watch a specified config file used to configure a repository - - - - - - Holds the FileInfo used to configure the XmlConfigurator - - - - - Holds the repository being configured. - - - - - The timer used to compress the notification events. - - - - - Initializes a new instance of the class. - - The repository to configure. - The configuration file to watch. - - - Initializes a new instance of the class. - - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - - This handler reloads the configuration from the file when the event is fired. - - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - - This handler reloads the configuration from the file when the event is fired. - - - - - - Called by the timer when the configuration has been updated. - - null - - - - The implementation of the interface suitable - for use with the compact framework - - - - This implementation is a simple - mapping between repository name and - object. - - - The .NET Compact Framework 1.0 does not support retrieving assembly - level attributes therefore unlike the DefaultRepositorySelector - this selector does not examine the calling assembly for attributes. - - - Nicko Cadell - - - - Interface used by the to select the . - - - - The uses a - to specify the policy for selecting the correct - to return to the caller. - - - Nicko Cadell - Gert Driesen - - - - Gets the for the specified assembly. - - The assembly to use to lookup to the - The for the assembly. - - - Gets the for the specified assembly. - - - How the association between and - is made is not defined. The implementation may choose any method for - this association. The results of this method must be repeatable, i.e. - when called again with the same arguments the result must be the - save value. - - - - - - Gets the named . - - The name to use to lookup to the . - The named - - Lookup a named . This is the repository created by - calling . - - - - - Creates a new repository for the assembly specified. - - The assembly to use to create the domain to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - How the association between and - is made is not defined. The implementation may choose any method for - this association. - - - - - - Creates a new repository with the name specified. - - The name to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the name - specified such that a call to with the - same name will return the same repository instance. - - - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets an array of all currently defined repositories. - - - An array of the instances created by - this . - - - Gets an array of all of the repositories created by this selector. - - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - Create a new repository selector - - the type of the repositories to create, must implement - - - Create an new compact repository selector. - The default type for repositories must be specified, - an appropriate value would be . - - - throw if is null - throw if does not implement - - - - Get the for the specified assembly - - not used - The default - - - The argument is not used. This selector does not create a - separate repository for each assembly. - - - As a named repository is not specified the default repository is - returned. The default repository is named log4net-default-repository. - - - - - - Get the named - - the name of the repository to lookup - The named - - - Get the named . The default - repository is log4net-default-repository. Other repositories - must be created using the . - If the named repository does not exist an exception is thrown. - - - throw if is null - throw if the does not exist - - - - Create a new repository for the assembly specified - - not used - the type of repository to create, must implement - the repository created - - - The argument is not used. This selector does not create a - separate repository for each assembly. - - - If the is null then the - default repository type specified to the constructor is used. - - - As a named repository is not specified the default repository is - returned. The default repository is named log4net-default-repository. - - - - - - Create a new repository for the repository specified - - the repository to associate with the - the type of repository to create, must implement . - If this param is null then the default repository type is used. - the repository created - - - The created will be associated with the repository - specified such that a call to with the - same repository specified will return the same repository instance. - - - If the named repository already exists an exception will be thrown. - - - If is null then the default - repository type specified to the constructor is used. - - - throw if is null - throw if the already exists - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets a list of objects - - an array of all known objects - - - Gets an array of all of the repositories created by this selector. - - - - - - Notify the registered listeners that the repository has been created - - The repository that has been created - - - Raises the LoggerRepositoryCreatedEvent - event. - - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - The default implementation of the interface. - - - - Uses attributes defined on the calling assembly to determine how to - configure the hierarchy for the repository. - - - Nicko Cadell - Gert Driesen - - - - Creates a new repository selector. - - The type of the repositories to create, must implement - - - Create an new repository selector. - The default type for repositories must be specified, - an appropriate value would be . - - - is . - does not implement . - - - - Gets the for the specified assembly. - - The assembly use to lookup the . - - - The type of the created and the repository - to create can be overridden by specifying the - attribute on the . - - - The default values are to use the - implementation of the interface and to use the - as the name of the repository. - - - The created will be automatically configured using - any attributes defined on - the . - - - The for the assembly - is . - - - - Gets the for the specified repository. - - The repository to use to lookup the . - The for the specified repository. - - - Returns the named repository. If is null - a is thrown. If the repository - does not exist a is thrown. - - - Use to create a repository. - - - is . - does not exist. - - - - Create a new repository for the assembly specified - - the assembly to use to create the repository to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the repository to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the repository. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - is . - - - - Creates a new repository for the assembly specified. - - the assembly to use to create the repository to associate with the . - The type of repository to create, must implement . - The name to assign to the created repository - Set to true to read and apply the assembly attributes - The repository created. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the repository to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the repository. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - is . - - - - Creates a new repository for the specified repository. - - The repository to associate with the . - The type of repository to create, must implement . - If this param is then the default repository type is used. - The new repository. - - - The created will be associated with the repository - specified such that a call to with the - same repository specified will return the same repository instance. - - - is . - already exists. - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets a list of objects - - an array of all known objects - - - Gets an array of all of the repositories created by this selector. - - - - - - Aliases a repository to an existing repository. - - The repository to alias. - The repository that the repository is aliased to. - - - The repository specified will be aliased to the repository when created. - The repository must not already exist. - - - When the repository is created it must utilize the same repository type as - the repository it is aliased to, otherwise the aliasing will fail. - - - - is . - -or- - is . - - - - - Notifies the registered listeners that the repository has been created. - - The repository that has been created. - - - Raises the event. - - - - - - Gets the repository name and repository type for the specified assembly. - - The assembly that has a . - in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. - in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. - is . - - - - Configures the repository using information from the assembly. - - The assembly containing - attributes which define the configuration for the repository. - The repository to configure. - - is . - -or- - is . - - - - - Loads the attribute defined plugins on the assembly. - - The assembly that contains the attributes. - The repository to add the plugins to. - - is . - -or- - is . - - - - - Loads the attribute defined aliases on the assembly. - - The assembly that contains the attributes. - The repository to alias to. - - is . - -or- - is . - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - Defined error codes that can be passed to the method. - - - - Values passed to the method. - - - Nicko Cadell - - - - A general error - - - - - Error while writing output - - - - - Failed to flush file - - - - - Failed to close file - - - - - Unable to open output file - - - - - No layout specified - - - - - Failed to parse address - - - - - Appenders may delegate their error handling to an . - - - - Error handling is a particularly tedious to get right because by - definition errors are hard to predict and to reproduce. - - - Nicko Cadell - Gert Driesen - - - - Handles the error and information about the error condition is passed as - a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - The error code associated with the error. - - - Handles the error and information about the error condition is passed as - a parameter. - - - - - - Prints the error message passed as a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - - - See . - - - - - - Prints the error message passed as a parameter. - - The message associated with the error. - - - See . - - - - - - Interface for objects that require fixing. - - - - Interface that indicates that the object requires fixing before it - can be taken outside the context of the appender's - method. - - - When objects that implement this interface are stored - in the context properties maps - and - are fixed - (see ) the - method will be called. - - - Nicko Cadell - - - - Get a portable version of this object - - the portable instance of this object - - - Get a portable instance object that represents the current - state of this object. The portable object can be stored - and logged from any thread with identical results. - - - - - - Interface that all loggers implement - - - - This interface supports logging events and testing if a level - is enabled for logging. - - - These methods will not throw exceptions. Note to implementor, ensure - that the implementation of these methods cannot allow an exception - to be thrown to the caller. - - - Nicko Cadell - Gert Driesen - - - - This generic form is intended to be used by wrappers. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - the exception to log, including its stack trace. Pass null to not log an exception. - - - Generates a logging event for the specified using - the and . - - - - - - This is the most generic printing method that is intended to be used - by wrappers. - - The event being logged. - - - Logs the specified logging event through this logger. - - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - Test if this logger is going to log events of the specified . - - - - - - Gets the name of the logger. - - - The name of the logger. - - - - The name of this logger - - - - - - Gets the where this - Logger instance is attached to. - - - The that this logger belongs to. - - - - Gets the where this - Logger instance is attached to. - - - - - - Base interface for all wrappers - - - - Base interface for all wrappers. - - - All wrappers must implement this interface. - - - Nicko Cadell - - - - Get the implementation behind this wrapper object. - - - The object that in implementing this object. - - - - The object that in implementing this - object. The Logger object may not - be the same object as this object because of logger decorators. - This gets the actual underlying objects that is used to process - the log events. - - - - - - Delegate used to handle logger repository creation event notifications - - The which created the repository. - The event args - that holds the instance that has been created. - - - Delegate used to handle logger repository creation event notifications. - - - - - - Provides data for the event. - - - - A - event is raised every time a is created. - - - - - - The created - - - - - Construct instance using specified - - the that has been created - - - Construct instance using specified - - - - - - The that has been created - - - The that has been created - - - - The that has been created - - - - - - Test if an triggers an action - - - - Implementations of this interface allow certain appenders to decide - when to perform an appender specific action. - - - The action or behavior triggered is defined by the implementation. - - - Nicko Cadell - - - - Test if this event triggers the action - - The event to check - true if this event triggers the action, otherwise false - - - Return true if this event triggers the action - - - - - - Defines the default set of levels recognized by the system. - - - - Each has an associated . - - - Levels have a numeric that defines the relative - ordering between levels. Two Levels with the same - are deemed to be equivalent. - - - The levels that are recognized by log4net are set for each - and each repository can have different levels defined. The levels are stored - in the on the repository. Levels are - looked up by name from the . - - - When logging at level INFO the actual level used is not but - the value of LoggerRepository.LevelMap["INFO"]. The default value for this is - , but this can be changed by reconfiguring the level map. - - - Each level has a in addition to its . The - is the string that is written into the output log. By default - the display name is the same as the level name, but this can be used to alias levels - or to localize the log output. - - - Some of the predefined levels recognized by the system are: - - - - . - - - . - - - . - - - . - - - . - - - . - - - . - - - - Nicko Cadell - Gert Driesen - - - - Constructor - - Integer value for this level, higher values represent more severe levels. - The string name of this level. - The display name for this level. This may be localized or otherwise different from the name - - - Initializes a new instance of the class with - the specified level name and value. - - - - - - Constructor - - Integer value for this level, higher values represent more severe levels. - The string name of this level. - - - Initializes a new instance of the class with - the specified level name and value. - - - - - - Returns the representation of the current - . - - - A representation of the current . - - - - Returns the level . - - - - - - Compares levels. - - The object to compare against. - true if the objects are equal. - - - Compares the levels of instances, and - defers to base class if the target object is not a - instance. - - - - - - Returns a hash code - - A hash code for the current . - - - Returns a hash code suitable for use in hashing algorithms and data - structures like a hash table. - - - Returns the hash code of the level . - - - - - - Compares this instance to a specified object and returns an - indication of their relative values. - - A instance or to compare with this instance. - - A 32-bit signed integer that indicates the relative order of the - values compared. The return value has these meanings: - - - Value - Meaning - - - Less than zero - This instance is less than . - - - Zero - This instance is equal to . - - - Greater than zero - - This instance is greater than . - -or- - is . - - - - - - - must be an instance of - or ; otherwise, an exception is thrown. - - - is not a . - - - - Returns a value indicating whether a specified - is greater than another specified . - - A - A - - true if is greater than - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is less than another specified . - - A - A - - true if is less than - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is greater than or equal to another specified . - - A - A - - true if is greater than or equal to - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is less than or equal to another specified . - - A - A - - true if is less than or equal to - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether two specified - objects have the same value. - - A or . - A or . - - true if the value of is the same as the - value of ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether two specified - objects have different values. - - A or . - A or . - - true if the value of is different from - the value of ; otherwise, false. - - - - Compares two levels. - - - - - - Compares two specified instances. - - The first to compare. - The second to compare. - - A 32-bit signed integer that indicates the relative order of the - two values compared. The return value has these meanings: - - - Value - Meaning - - - Less than zero - is less than . - - - Zero - is equal to . - - - Greater than zero - is greater than . - - - - - - Compares two levels. - - - - - - The level designates a higher level than all the rest. - - - - - The level designates very severe error events. - System unusable, emergencies. - - - - - The level designates very severe error events - that will presumably lead the application to abort. - - - - - The level designates very severe error events. - Take immediate action, alerts. - - - - - The level designates very severe error events. - Critical condition, critical. - - - - - The level designates very severe error events. - - - - - The level designates error events that might - still allow the application to continue running. - - - - - The level designates potentially harmful - situations. - - - - - The level designates informational messages - that highlight the progress of the application at the highest level. - - - - - The level designates informational messages that - highlight the progress of the application at coarse-grained level. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates the lowest level possible. - - - - - Gets the name of this level. - - - The name of this level. - - - - Gets the name of this level. - - - - - - Gets the value of this level. - - - The value of this level. - - - - Gets the value of this level. - - - - - - Gets the display name of this level. - - - The display name of this level. - - - - Gets the display name of this level. - - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a LevelCollection instance. - - list to create a readonly wrapper arround - - A LevelCollection wrapper that is read-only. - - - - - Initializes a new instance of the LevelCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the LevelCollection class - that has the specified initial capacity. - - - The number of elements that the new LevelCollection is initially capable of storing. - - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified LevelCollection. - - The LevelCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - Copies the entire LevelCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire LevelCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the LevelCollection. - - The to be added to the end of the LevelCollection. - The index at which the value has been added. - - - - Removes all elements from the LevelCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the LevelCollection. - - The to check for. - true if is found in the LevelCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the LevelCollection. - - The to locate in the LevelCollection. - - The zero-based index of the first occurrence of - in the entire LevelCollection, if found; otherwise, -1. - - - - - Inserts an element into the LevelCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the LevelCollection. - - The to remove from the LevelCollection. - - The specified was not found in the LevelCollection. - - - - - Removes the element at the specified index of the LevelCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the LevelCollection. - - An for the entire LevelCollection. - - - - Adds the elements of another LevelCollection to the current LevelCollection. - - The LevelCollection whose elements should be added to the end of the current LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a array to the current LevelCollection. - - The array whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a collection to the current LevelCollection. - - The collection whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the LevelCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the LevelCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - A value - - - - - Supports simple iteration over a . - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - An evaluator that triggers at a threshold level - - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - Nicko Cadell - - - - The threshold for triggering - - - - - Create a new evaluator using the threshold. - - - - Create a new evaluator using the threshold. - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Create a new evaluator using the specified threshold. - - the threshold to trigger at - - - Create a new evaluator using the specified threshold. - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Is this the triggering event? - - The event to check - This method returns true, if the event level - is equal or higher than the . - Otherwise it returns false - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - the threshold to trigger at - - - The that will cause this evaluator to trigger - - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Mapping between string name and Level object - - - - Mapping between string name and object. - This mapping is held separately for each . - The level name is case insensitive. - - - Nicko Cadell - - - - Mapping from level name to Level object. The - level name is case insensitive - - - - - Construct the level map - - - - Construct the level map. - - - - - - Clear the internal maps of all levels - - - - Clear the internal maps of all levels - - - - - - Create a new Level and add it to the map - - the string to display for the Level - the level value to give to the Level - - - Create a new Level and add it to the map - - - - - - - Create a new Level and add it to the map - - the string to display for the Level - the level value to give to the Level - the display name to give to the Level - - - Create a new Level and add it to the map - - - - - - Add a Level to the map - - the Level to add - - - Add a Level to the map - - - - - - Lookup a named level from the map - - the name of the level to lookup is taken from this level. - If the level is not set on the map then this level is added - the level in the map with the name specified - - - Lookup a named level from the map. The name of the level to lookup is taken - from the property of the - argument. - - - If no level with the specified name is found then the - argument is added to the level map - and returned. - - - - - - Lookup a by name - - The name of the Level to lookup - a Level from the map with the name specified - - - Returns the from the - map with the name specified. If the no level is - found then null is returned. - - - - - - Return all possible levels as a list of Level objects. - - all possible levels as a list of Level objects - - - Return all possible levels as a list of Level objects. - - - - - - The internal representation of caller location information. - - - - This class uses the System.Diagnostics.StackTrace class to generate - a call stack. The caller's information is then extracted from this stack. - - - The System.Diagnostics.StackTrace class is not supported on the - .NET Compact Framework 1.0 therefore caller location information is not - available on that framework. - - - The System.Diagnostics.StackTrace class has this to say about Release builds: - - - "StackTrace information will be most informative with Debug build configurations. - By default, Debug builds include debug symbols, while Release builds do not. The - debug symbols contain most of the file, method name, line number, and column - information used in constructing StackFrame and StackTrace objects. StackTrace - might not report as many method calls as expected, due to code transformations - that occur during optimization." - - - This means that in a Release build the caller information may be incomplete or may - not exist at all! Therefore caller location information cannot be relied upon in a Release build. - - - Nicko Cadell - Gert Driesen - - - - When location information is not available the constant - NA is returned. Current value of this string - constant is ?. - - - - - Constructor - - The declaring type of the method that is - the stack boundary into the logging system for this call. - - - Initializes a new instance of the - class based on the current thread. - - - - - - Constructor - - The fully qualified class name. - The method name. - The file name. - The line number of the method within the file. - - - Initializes a new instance of the - class with the specified data. - - - - - - Gets the fully qualified class name of the caller making the logging - request. - - - The fully qualified class name of the caller making the logging - request. - - - - Gets the fully qualified class name of the caller making the logging - request. - - - - - - Gets the file name of the caller. - - - The file name of the caller. - - - - Gets the file name of the caller. - - - - - - Gets the line number of the caller. - - - The line number of the caller. - - - - Gets the line number of the caller. - - - - - - Gets the method name of the caller. - - - The method name of the caller. - - - - Gets the method name of the caller. - - - - - - Gets all available caller information - - - All available caller information, in the format - fully.qualified.classname.of.caller.methodName(Filename:line) - - - - Gets all available caller information, in the format - fully.qualified.classname.of.caller.methodName(Filename:line) - - - - - - Static manager that controls the creation of repositories - - - - Static manager that controls the creation of repositories - - - This class is used by the wrapper managers (e.g. ) - to provide access to the objects. - - - This manager also holds the that is used to - lookup and create repositories. The selector can be set either programmatically using - the property, or by setting the log4net.RepositorySelector - AppSetting in the applications config file to the fully qualified type name of the - selector to use. - - - Nicko Cadell - Gert Driesen - - - - Private constructor to prevent instances. Only static methods should be used. - - - - Private constructor to prevent instances. Only static methods should be used. - - - - - - Hook the shutdown event - - - - On the full .NET runtime, the static constructor hooks up the - AppDomain.ProcessExit and AppDomain.DomainUnload> events. - These are used to shutdown the log4net system as the application exits. - - - - - - Register for ProcessExit and DomainUnload events on the AppDomain - - - - This needs to be in a separate method because the events make - a LinkDemand for the ControlAppDomain SecurityPermission. Because - this is a LinkDemand it is demanded at JIT time. Therefore we cannot - catch the exception in the method itself, we have to catch it in the - caller. - - - - - - Return the default instance. - - the repository to lookup in - Return the default instance - - - Gets the for the repository specified - by the argument. - - - - - - Returns the default instance. - - The assembly to use to lookup the repository. - The default instance. - - - - Return the default instance. - - the repository to lookup in - Return the default instance - - - Gets the for the repository specified - by the argument. - - - - - - Returns the default instance. - - The assembly to use to lookup the repository. - The default instance. - - - Returns the default instance. - - - - - - Returns the named logger if it exists. - - The repository to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified repository. - - - - If the named logger exists (in the specified repository) then it - returns a reference to the logger, otherwise it returns - null. - - - - - - Returns the named logger if it exists. - - The assembly to use to lookup the repository. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified assembly's repository. - - - - If the named logger exists (in the specified assembly's repository) then it - returns a reference to the logger, otherwise it returns - null. - - - - - - Returns all the currently defined loggers in the specified repository. - - The repository to lookup in. - All the defined loggers. - - - The root logger is not included in the returned array. - - - - - - Returns all the currently defined loggers in the specified assembly's repository. - - The assembly to use to lookup the repository. - All the defined loggers. - - - The root logger is not included in the returned array. - - - - - - Retrieves or creates a named logger. - - The repository to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - - - - Retrieves or creates a named logger. - - The assembly to use to lookup the repository. - The name of the logger to retrieve. - The logger with the name specified. - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - - - - Shorthand for . - - The repository to lookup in. - The of which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - Gets the logger for the fully qualified name of the type specified. - - - - - - Shorthand for . - - the assembly to use to lookup the repository - The of which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - Gets the logger for the fully qualified name of the type specified. - - - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - The repository to shutdown. - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - The assembly to use to lookup the repository. - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the repository. The repository is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Resets all values contained in this repository instance to their defaults. - - The repository to reset. - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - - - - Resets all values contained in this repository instance to their defaults. - - The assembly to use to lookup the repository to reset. - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - - - - Creates a repository with the specified name. - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name. - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The name must be unique. Repositories cannot be redefined. - An Exception will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The name must be unique. Repositories cannot be redefined. - An Exception will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository for the specified assembly and repository type. - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Creates a repository for the specified assembly and repository type. - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Gets an array of all currently defined repositories. - - An array of all the known objects. - - - Gets an array of all currently defined repositories. - - - - - - Internal method to get pertinent version info. - - A string of version info. - - - - Called when the event fires - - the that is exiting - null - - - Called when the event fires. - - - When the event is triggered the log4net system is . - - - - - - Called when the event fires - - the that is exiting - null - - - Called when the event fires. - - - When the event is triggered the log4net system is . - - - - - - Initialize the default repository selector - - - - - Gets or sets the repository selector used by the . - - - The repository selector used by the . - - - - The repository selector () is used by - the to create and select repositories - (). - - - The caller to supplies either a string name - or an assembly (if not supplied the assembly is inferred using - ). - - - This context is used by the selector to lookup a specific repository. - - - For the full .NET Framework, the default repository is DefaultRepositorySelector; - for the .NET Compact Framework CompactRepositorySelector is the default - repository. - - - - - - Implementation of the interface. - - - - This class should be used as the base for all wrapper implementations. - - - Nicko Cadell - Gert Driesen - - - - Constructs a new wrapper for the specified logger. - - The logger to wrap. - - - Constructs a new wrapper for the specified logger. - - - - - - The logger that this object is wrapping - - - - - Gets the implementation behind this wrapper object. - - - The object that this object is implementing. - - - - The Logger object may not be the same object as this object - because of logger decorators. - - - This gets the actual underlying objects that is used to process - the log events. - - - - - - Portable data structure used by - - - - Portable data structure used by - - - Nicko Cadell - - - - The logger name. - - - - The logger name. - - - - - - Level of logging event. - - - - Level of logging event. Level cannot be Serializable - because it is a flyweight. Due to its special serialization it - cannot be declared final either. - - - - - - The application supplied message. - - - - The application supplied message of logging event. - - - - - - The name of thread - - - - The name of thread in which this logging event was generated - - - - - - The time the event was logged - - - - The TimeStamp is stored in the local time zone for this computer. - - - - - - Location information for the caller. - - - - Location information for the caller. - - - - - - String representation of the user - - - - String representation of the user's windows name, - like DOMAIN\username - - - - - - String representation of the identity. - - - - String representation of the current thread's principal identity. - - - - - - The string representation of the exception - - - - The string representation of the exception - - - - - - String representation of the AppDomain. - - - - String representation of the AppDomain. - - - - - - Additional event specific properties - - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - - - - Flags passed to the property - - - - Flags passed to the property - - - Nicko Cadell - - - - Fix the MDC - - - - - Fix the NDC - - - - - Fix the rendered message - - - - - Fix the thread name - - - - - Fix the callers location information - - - CAUTION: Very slow to generate - - - - - Fix the callers windows user name - - - CAUTION: Slow to generate - - - - - Fix the domain friendly name - - - - - Fix the callers principal name - - - CAUTION: May be slow to generate - - - - - Fix the exception text - - - - - Fix the event properties - - - - - No fields fixed - - - - - All fields fixed - - - - - Partial fields fixed - - - - This set of partial fields gives good performance. The following fields are fixed: - - - - - - - - - - - - - The internal representation of logging events. - - - - When an affirmative decision is made to log then a - instance is created. This instance - is passed around to the different log4net components. - - - This class is of concern to those wishing to extend log4net. - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - Nicko Cadell - Gert Driesen - Douglas de la Torre - Daniel Cazzulino - - - - The key into the Properties map for the host name value. - - - - - The key into the Properties map for the thread identity value. - - - - - The key into the Properties map for the user name value. - - - - - Initializes a new instance of the class - from the supplied parameters. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - The name of the logger of this event. - The level of this event. - The message of this event. - The exception for this event. - - - Except , and , - all fields of LoggingEvent are filled when actually needed. Call - to cache all data locally - to prevent inconsistencies. - - This method is called by the log4net framework - to create a logging event. - - - - - - Initializes a new instance of the class - using specific data. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - Data used to initialize the logging event. - The fields in the struct that have already been fixed. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - The parameter should be used to specify which fields in the - struct have been preset. Fields not specified in the - will be captured from the environment if requested or fixed. - - - - - - Initializes a new instance of the class - using specific data. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - Data used to initialize the logging event. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - This constructor sets this objects flags to , - this assumes that all the data relating to this event is passed in via the - parameter and no other data should be captured from the environment. - - - - - - Initializes a new instance of the class - using specific data. - - Data used to initialize the logging event. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - This constructor sets this objects flags to , - this assumes that all the data relating to this event is passed in via the - parameter and no other data should be captured from the environment. - - - - - - Serialization constructor - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Ensure that the repository is set. - - the value for the repository - - - - Write the rendered message to a TextWriter - - the writer to write the message to - - - Unlike the property this method - does store the message data in the internal cache. Therefore - if called only once this method should be faster than the - property, however if the message is - to be accessed multiple times then the property will be more efficient. - - - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - The data in this event must be fixed before it can be serialized. - - - The method must be called during the - method call if this event - is to be used outside that method. - - - - - - Gets the portable data for this . - - The for this event. - - - A new can be constructed using a - instance. - - - Does a fix of the data - in the logging event before returning the event data. - - - - - - Gets the portable data for this . - - The set of data to ensure is fixed in the LoggingEventData - The for this event. - - - A new can be constructed using a - instance. - - - - - - Returns this event's exception's rendered using the - . - - - This event's exception's rendered using the . - - - - Obsolete. Use instead. - - - - - - Returns this event's exception's rendered using the - . - - - This event's exception's rendered using the . - - - - Returns this event's exception's rendered using the - . - - - - - - Fix instance fields that hold volatile data. - - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - incurred by calling but it - is essential to maintaining data consistency. - - - Calling is equivalent to - calling passing the parameter - false. - - - See for more - information. - - - - - - Fixes instance fields that hold volatile data. - - Set to true to not fix data that takes a long time to fix. - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - The param controls the data that - is fixed. Some of the data that can be fixed takes a long time to - generate, therefore if you do not require those settings to be fixed - they can be ignored by setting the param - to true. This setting will ignore the - and settings. - - - Set to false to ensure that all - settings are fixed. - - - - - - Fix the fields specified by the parameter - - the fields to fix - - - Only fields specified in the will be fixed. - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - - Lookup a composite property in this event - - the key for the property to lookup - the value for the property - - - This event has composite properties that combine together properties from - several different contexts in the following order: - - - this events properties - - This event has that can be set. These - properties are specific to this event only. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - - - Get all the composite properties in this event - - the containing all the properties - - - See for details of the composite properties - stored by the event. - - - This method returns a single containing all the - properties defined for this event. - - - - - - The internal logging event data. - - - - - The internal logging event data. - - - - - The internal logging event data. - - - - - The fully qualified Type of the calling - logger class in the stack frame (i.e. the declaring type of the method). - - - - - The application supplied message of logging event. - - - - - The exception that was thrown. - - - This is not serialized. The string representation - is serialized instead. - - - - - The repository that generated the logging event - - - This is not serialized. - - - - - The fix state for this event - - - These flags indicate which fields have been fixed. - Not serialized. - - - - - Indicated that the internal cache is updateable (ie not fixed) - - - This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler - changes in the caching strategy. - - - - - Gets the time when the current process started. - - - This is the time when this process started. - - - - The TimeStamp is stored in the local time zone for this computer. - - - Tries to get the start time for the current process. - Failing that it returns the time of the first call to - this property. - - - Note that AppDomains may be loaded and unloaded within the - same process without the process terminating and therefore - without the process start time being reset. - - - - - - Gets the of the logging event. - - - The of the logging event. - - - - Gets the of the logging event. - - - - - - Gets the time of the logging event. - - - The time of the logging event. - - - - The TimeStamp is stored in the local time zone for this computer. - - - - - - Gets the name of the logger that logged the event. - - - The name of the logger that logged the event. - - - - Gets the name of the logger that logged the event. - - - - - - Gets the location information for this logging event. - - - The location information for this logging event. - - - - The collected information is cached for future use. - - - See the class for more information on - supported frameworks and the different behavior in Debug and - Release builds. - - - - - - Gets the message object used to initialize this event. - - - The message object used to initialize this event. - - - - Gets the message object used to initialize this event. - Note that this event may not have a valid message object. - If the event is serialized the message object will not - be transferred. To get the text of the message the - property must be used - not this property. - - - If there is no defined message object for this event then - null will be returned. - - - - - - Gets the exception object used to initialize this event. - - - The exception object used to initialize this event. - - - - Gets the exception object used to initialize this event. - Note that this event may not have a valid exception object. - If the event is serialized the exception object will not - be transferred. To get the text of the exception the - method must be used - not this property. - - - If there is no defined exception object for this event then - null will be returned. - - - - - - The that this event was created in. - - - - The that this event was created in. - - - - - - Gets the message, rendered through the . - - - The message rendered through the . - - - - The collected information is cached for future use. - - - - - - Gets the name of the current thread. - - - The name of the current thread, or the thread ID when - the name is not available. - - - - The collected information is cached for future use. - - - - - - Gets the name of the current user. - - - The name of the current user, or NOT AVAILABLE when the - underlying runtime has no support for retrieving the name of the - current user. - - - - Calls WindowsIdentity.GetCurrent().Name to get the name of - the current windows user. - - - To improve performance, we could cache the string representation of - the name, and reuse that as long as the identity stayed constant. - Once the identity changed, we would need to re-assign and re-render - the string. - - - However, the WindowsIdentity.GetCurrent() call seems to - return different objects every time, so the current implementation - doesn't do this type of caching. - - - Timing for these operations: - - - - Method - Results - - - WindowsIdentity.GetCurrent() - 10000 loops, 00:00:00.2031250 seconds - - - WindowsIdentity.GetCurrent().Name - 10000 loops, 00:00:08.0468750 seconds - - - - This means we could speed things up almost 40 times by caching the - value of the WindowsIdentity.GetCurrent().Name property, since - this takes (8.04-0.20) = 7.84375 seconds. - - - - - - Gets the identity of the current thread principal. - - - The string name of the identity of the current thread principal. - - - - Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get - the name of the current thread principal. - - - - - - Gets the AppDomain friendly name. - - - The AppDomain friendly name. - - - - Gets the AppDomain friendly name. - - - - - - Additional event specific properties. - - - Additional event specific properties. - - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - This property is for events that have been added directly to - this event. The aggregate properties (which include these - event properties) can be retrieved using - and . - - - Once the properties have been fixed this property - returns the combined cached properties. This ensures that updates to - this property are always reflected in the underlying storage. When - returning the combined properties there may be more keys in the - Dictionary than expected. - - - - - - The fixed fields in this event - - - The set of fields that are fixed in this event - - - - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - - Implementation of wrapper interface. - - - - This implementation of the interface - forwards to the held by the base class. - - - This logger has methods to allow the caller to log at the following - levels: - - - - DEBUG - - The and methods log messages - at the DEBUG level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - INFO - - The and methods log messages - at the INFO level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - WARN - - The and methods log messages - at the WARN level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - ERROR - - The and methods log messages - at the ERROR level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - FATAL - - The and methods log messages - at the FATAL level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - - The values for these levels and their semantic meanings can be changed by - configuring the for the repository. - - - Nicko Cadell - Gert Driesen - - - - The ILog interface is use by application to log messages into - the log4net framework. - - - - Use the to obtain logger instances - that implement this interface. The - static method is used to get logger instances. - - - This class contains methods for logging at different levels and also - has properties for determining if those logging levels are - enabled in the current configuration. - - - This interface can be implemented in different ways. This documentation - specifies reasonable behavior that a caller can expect from the actual - implementation, however different implementations reserve the right to - do things differently. - - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - Nicko Cadell - Gert Driesen - - - Log a message object with the level. - - Log a message object with the level. - - The message object to log. - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Logs a message object with the level. - - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Logs a message object with the INFO level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Log a message object with the level. - - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Logs a message object with the level. - - The message object to log. - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Log a message object with the level. - - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - For some ILog interface log, when you write: - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, string construction and concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed (who isn't), then you should write: - - - if (log.IsDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in and once in - the . This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. This is the preferred style of logging. - - Alternatively if your logger is available statically then the is debug - enabled state can be stored in a static variable like this: - - - private static readonly bool isDebugEnabled = log.IsDebugEnabled; - - - Then when you come to log you can write: - - - if (isDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way the debug enabled state is only queried once - when the class is loaded. Using a private static readonly - variable is the most efficient because it is a run time constant - and can be heavily optimized by the JIT compiler. - - - Of course if you use a static readonly variable to - hold the enabled state of the logger then you cannot - change the enabled state at runtime to vary the logging - that is produced. You have to decide if you need absolute - speed or runtime flexibility. - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Construct a new wrapper for the specified logger. - - The logger to wrap. - - - Construct a new wrapper for the specified logger. - - - - - - Virtual method called when the configuration of the repository changes - - the repository holding the levels - - - Virtual method called when the configuration of the repository changes - - - - - - Logs a message object with the DEBUG level. - - The message object to log. - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - DEBUG level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the DEBUG level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the DEBUG level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the INFO level. - - The message object to log. - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - INFO level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the INFO level. - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the INFO level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the WARN level. - - the message object to log - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - WARN level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the WARN level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the WARN level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the ERROR level. - - The message object to log. - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - ERROR level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the ERROR level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the ERROR level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the FATAL level. - - The message object to log. - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - FATAL level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the FATAL level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the FATAL level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Event handler for the event - - the repository - Empty - - - - The fully qualified name of this declaring type not the type of any subclass. - - - - - Checks if this logger is enabled for the DEBUG - level. - - - true if this logger is enabled for DEBUG events, - false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - - For some log Logger object, when you write: - - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed, then you should write: - - - if (log.IsDebugEnabled()) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in IsDebugEnabled and once in - the Debug. This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. - - - - - - Checks if this logger is enabled for the INFO level. - - - true if this logger is enabled for INFO events, - false otherwise. - - - - See for more information and examples - of using this method. - - - - - - - Checks if this logger is enabled for the WARN level. - - - true if this logger is enabled for WARN events, - false otherwise. - - - - See for more information and examples - of using this method. - - - - - - - Checks if this logger is enabled for the ERROR level. - - - true if this logger is enabled for ERROR events, - false otherwise. - - - - See for more information and examples of using this method. - - - - - - - Checks if this logger is enabled for the FATAL level. - - - true if this logger is enabled for FATAL events, - false otherwise. - - - - See for more information and examples of using this method. - - - - - - - A SecurityContext used by log4net when interacting with protected resources - - - - A SecurityContext used by log4net when interacting with protected resources - for example with operating system services. This can be used to impersonate - a principal that has been granted privileges on the system resources. - - - Nicko Cadell - - - - Impersonate this SecurityContext - - State supplied by the caller - An instance that will - revoke the impersonation of this SecurityContext, or null - - - Impersonate this security context. Further calls on the current - thread should now be made in the security context provided - by this object. When the result - method is called the security - context of the thread should be reverted to the state it was in - before was called. - - - - - - The providers default instances. - - - - A configured component that interacts with potentially protected system - resources uses a to provide the elevated - privileges required. If the object has - been not been explicitly provided to the component then the component - will request one from this . - - - By default the is - an instance of which returns only - objects. This is a reasonable default - where the privileges required are not know by the system. - - - This default behavior can be overridden by subclassing the - and overriding the method to return - the desired objects. The default provider - can be replaced by programmatically setting the value of the - property. - - - An alternative is to use the log4net.Config.SecurityContextProviderAttribute - This attribute can be applied to an assembly in the same way as the - log4net.Config.XmlConfiguratorAttribute". The attribute takes - the type to use as the as an argument. - - - Nicko Cadell - - - - The default provider - - - - - Protected default constructor to allow subclassing - - - - Protected default constructor to allow subclassing - - - - - - Create a SecurityContext for a consumer - - The consumer requesting the SecurityContext - An impersonation context - - - The default implementation is to return a . - - - Subclasses should override this method to provide their own - behavior. - - - - - - Gets or sets the default SecurityContextProvider - - - The default SecurityContextProvider - - - - The default provider is used by configured components that - require a and have not had one - given to them. - - - By default this is an instance of - that returns objects. - - - The default provider can be set programmatically by setting - the value of this property to a sub class of - that has the desired behavior. - - - - - - Delegate used to handle creation of new wrappers. - - The logger to wrap in a wrapper. - - - Delegate used to handle creation of new wrappers. This delegate - is called from the - method to construct the wrapper for the specified logger. - - - The delegate to use is supplied to the - constructor. - - - - - - Maps between logger objects and wrapper objects. - - - - This class maintains a mapping between objects and - objects. Use the method to - lookup the for the specified . - - - New wrapper instances are created by the - method. The default behavior is for this method to delegate construction - of the wrapper to the delegate supplied - to the constructor. This allows specialization of the behavior without - requiring subclassing of this type. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the - - The handler to use to create the wrapper objects. - - - Initializes a new instance of the class with - the specified handler to create the wrapper objects. - - - - - - Gets the wrapper object for the specified logger. - - The wrapper object for the specified logger - - - If the logger is null then the corresponding wrapper is null. - - - Looks up the wrapper it it has previously been requested and - returns it. If the wrapper has never been requested before then - the virtual method is - called. - - - - - - Creates the wrapper object for the specified logger. - - The logger to wrap in a wrapper. - The wrapper object for the logger. - - - This implementation uses the - passed to the constructor to create the wrapper. This method - can be overridden in a subclass. - - - - - - Called when a monitored repository shutdown event is received. - - The that is shutting down - - - This method is called when a that this - is holding loggers for has signaled its shutdown - event . The default - behavior of this method is to release the references to the loggers - and their wrappers generated for this repository. - - - - - - Event handler for repository shutdown event. - - The sender of the event. - The event args. - - - - Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings - - - - - The handler to use to create the extension wrapper objects. - - - - - Internal reference to the delegate used to register for repository shutdown events. - - - - - Gets the map of logger repositories. - - - Map of logger repositories. - - - - Gets the hashtable that is keyed on . The - values are hashtables keyed on with the - value being the corresponding . - - - - - - Formats a as "HH:mm:ss,fff". - - - - Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". - - - Nicko Cadell - Gert Driesen - - - - Render a as a string. - - - - Interface to abstract the rendering of a - instance into a string. - - - The method is used to render the - date to a text writer. - - - Nicko Cadell - Gert Driesen - - - - Formats the specified date as a string. - - The date to format. - The writer to write to. - - - Format the as a string and write it - to the provided. - - - - - - String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. - - - - - String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. - - - - - String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. - - - - - Renders the date into a string. Format is "HH:mm:ss". - - The date to render into a string. - The string builder to write to. - - - Subclasses should override this method to render the date - into a string using a precision up to the second. This method - will be called at most once per second and the result will be - reused if it is needed again during the same second. - - - - - - Renders the date into a string. Format is "HH:mm:ss,fff". - - The date to render into a string. - The writer to write to. - - - Uses the method to generate the - time string up to the seconds and then appends the current - milliseconds. The results from are - cached and is called at most once - per second. - - - Sub classes should override - rather than . - - - - - - Last stored time with precision up to the second. - - - - - Last stored time with precision up to the second, formatted - as a string. - - - - - Last stored time with precision up to the second, formatted - as a string. - - - - - Formats a as "dd MMM yyyy HH:mm:ss,fff" - - - - Formats a in the format - "dd MMM yyyy HH:mm:ss,fff" for example, - "06 Nov 1994 15:49:37,459". - - - Nicko Cadell - Gert Driesen - Angelika Schnagl - - - - Default constructor. - - - - Initializes a new instance of the class. - - - - - - Formats the date without the milliseconds part - - The date to format. - The string builder to write to. - - - Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" - for example, "06 Nov 1994 15:49:37". - - - The base class will append the ",fff" milliseconds section. - This method will only be called at most once per second. - - - - - - The format info for the invariant culture. - - - - - Formats the as "yyyy-MM-dd HH:mm:ss,fff". - - - - Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Formats the date without the milliseconds part - - The date to format. - The string builder to write to. - - - Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". - - - The base class will append the ",fff" milliseconds section. - This method will only be called at most once per second. - - - - - - Formats the using the method. - - - - Formats the using the method. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The format string. - - - Initializes a new instance of the class - with the specified format string. - - - The format string must be compatible with the options - that can be supplied to . - - - - - - Formats the date using . - - The date to convert to a string. - The writer to write to. - - - Uses the date format string supplied to the constructor to call - the method to format the date. - - - - - - The format string used to format the . - - - - The format string must be compatible with the options - that can be supplied to . - - - - - - This filter drops all . - - - - You can add this filter to the end of a filter chain to - switch from the default "accept all unless instructed otherwise" - filtering behavior to a "deny all unless instructed otherwise" - behavior. - - - Nicko Cadell - Gert Driesen - - - - Subclass this type to implement customized logging event filtering - - - - Users should extend this class to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - - The method must return one - of the integer constants , - or . - - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behavior is to log all logging events. - - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface to provide customized logging event filtering - - - - Users should implement this interface to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - - The method must return one - of the integer constants , - or . - - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behavior is to log all logging events. - - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - Nicko Cadell - Gert Driesen - - - - Decide if the logging event should be logged through an appender. - - The LoggingEvent to decide upon - The decision of the filter - - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - - - - - Property to get and set the next filter - - - The next filter in the chain - - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - - Points to the next filter in the filter chain. - - - - See for more information. - - - - - - Initialize the filter with the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Typically filter's options become active immediately on set, - however this method must still be called. - - - - - - Decide if the should be logged through an appender. - - The to decide upon - The decision of the filter - - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - - This method is marked abstract and must be implemented - in a subclass. - - - - - - Property to get and set the next filter - - - The next filter in the chain - - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - - Default constructor - - - - - Always returns the integer constant - - the LoggingEvent to filter - Always returns - - - Ignores the event being logged and just returns - . This can be used to change the default filter - chain behavior from to . This filter - should only be used as the last filter in the chain - as any further filters will be ignored! - - - - - - The return result from - - - - The return result from - - - - - - The log event must be dropped immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This filter is neutral with respect to the log event. - The remaining filters, if any, should be consulted for a final decision. - - - - - The log event must be logged immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This is a very simple filter based on matching. - - - - The filter admits two options and - . If there is an exact match between the value - of the option and the of the - , then the method returns in - case the option value is set - to true, if it is false then - is returned. If the does not match then - the result will be . - - - Nicko Cadell - Gert Driesen - - - - flag to indicate if the filter should on a match - - - - - the to match against - - - - - Default constructor - - - - - Tests if the of the logging event matches that of the filter - - the event to filter - see remarks - - - If the of the event matches the level of the - filter then the result of the function depends on the - value of . If it is true then - the function will return , it it is false then it - will return . If the does not match then - the result will be . - - - - - - when matching - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - The that the filter will match - - - - The level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - This is a simple filter based on matching. - - - - The filter admits three options and - that determine the range of priorities that are matched, and - . If there is a match between the range - of priorities and the of the , then the - method returns in case the - option value is set to true, if it is false - then is returned. If there is no match, is returned. - - - Nicko Cadell - Gert Driesen - - - - Flag to indicate the behavior when matching a - - - - - the minimum value to match - - - - - the maximum value to match - - - - - Default constructor - - - - - Check if the event should be logged. - - the logging event to check - see remarks - - - If the of the logging event is outside the range - matched by this filter then - is returned. If the is matched then the value of - is checked. If it is true then - is returned, otherwise - is returned. - - - - - - when matching and - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - Set the minimum matched - - - - The minimum level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - Sets the maximum matched - - - - The maximum level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - Simple filter to match a string in the event's logger name. - - - - The works very similar to the . It admits two - options and . If the - of the starts - with the value of the option, then the - method returns in - case the option value is set to true, - if it is false then is returned. - - - Daniel Cazzulino - - - - Flag to indicate the behavior when we have a match - - - - - The logger name string to substring match against the event - - - - - Default constructor - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The rendered message is matched against the . - If the equals the beginning of - the incoming () - then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - when matching - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - The that the filter will match - - - - This filter will attempt to match this value against logger name in - the following way. The match will be done against the beginning of the - logger name (using ). The match is - case sensitive. If a match is found then - the result depends on the value of . - - - - - - Simple filter to match a keyed string in the - - - - Simple filter to match a keyed string in the - - - As the MDC has been replaced with layered properties the - should be used instead. - - - Nicko Cadell - Gert Driesen - - - - Simple filter to match a string an event property - - - - Simple filter to match a string in the value for a - specific event property - - - Nicko Cadell - - - - Simple filter to match a string in the rendered message - - - - Simple filter to match a string in the rendered message - - - Nicko Cadell - Gert Driesen - - - - Flag to indicate the behavior when we have a match - - - - - The string to substring match against the message - - - - - A string regex to match - - - - - A regex object to match (generated from m_stringRegexToMatch) - - - - - Default constructor - - - - - Initialize and precompile the Regex if required - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The rendered message is matched against the . - If the occurs as a substring within - the message then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - when matching or - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - Sets the static string to match - - - - The string that will be substring matched against - the rendered message. If the message contains this - string then the filter will match. If a match is found then - the result depends on the value of . - - - One of or - must be specified. - - - - - - Sets the regular expression to match - - - - The regular expression pattern that will be matched against - the rendered message. If the message matches this - pattern then the filter will match. If a match is found then - the result depends on the value of . - - - One of or - must be specified. - - - - - - The key to use to lookup the string from the event properties - - - - - Default constructor - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The event property for the is matched against - the . - If the occurs as a substring within - the property value then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - The key to lookup in the event properties and then match against. - - - - The key name to use to lookup in the properties map of the - . The match will be performed against - the value of this property if it exists. - - - - - - Simple filter to match a string in the - - - - Simple filter to match a string in the - - - As the MDC has been replaced with named stacks stored in the - properties collections the should - be used instead. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Sets the to "NDC". - - - - - - Write the event appdomain name to the output - - - - Writes the to the output writer. - - - Daniel Cazzulino - Nicko Cadell - - - - Abstract class that provides the formatting functionality that - derived classes need. - - - Conversion specifiers in a conversion patterns are parsed to - individual PatternConverters. Each of which is responsible for - converting a logging event in a converter specific manner. - - Nicko Cadell - - - - Abstract class that provides the formatting functionality that - derived classes need. - - - - Conversion specifiers in a conversion patterns are parsed to - individual PatternConverters. Each of which is responsible for - converting a logging event in a converter specific manner. - - - Nicko Cadell - Gert Driesen - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - Protected constructor - - - - Initializes a new instance of the class. - - - - - - Evaluate this pattern converter and write the output to a writer. - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the appropriate way. - - - - - - Set the next pattern converter in the chains - - the pattern converter that should follow this converter in the chain - the next converter - - - The PatternConverter can merge with its neighbor during this method (or a sub class). - Therefore the return value may or may not be the value of the argument passed in. - - - - - - Write the pattern converter to the writer with appropriate formatting - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - This method calls to allow the subclass to perform - appropriate conversion of the pattern converter. If formatting options have - been specified via the then this method will - apply those formattings before writing the output. - - - - - - Fast space padding method. - - to which the spaces will be appended. - The number of spaces to be padded. - - - Fast space padding method. - - - - - - The option string to the converter - - - - - Write an dictionary to a - - the writer to write to - a to use for object conversion - the value to write to the writer - - - Writes the to a writer in the form: - - - {key1=value1, key2=value2, key3=value3} - - - If the specified - is not null then it is used to render the key and value to text, otherwise - the object's ToString method is called. - - - - - - Write an object to a - - the writer to write to - a to use for object conversion - the value to write to the writer - - - Writes the Object to a writer. If the specified - is not null then it is used to render the object to text, otherwise - the object's ToString method is called. - - - - - - Get the next pattern converter in the chain - - - the next pattern converter in the chain - - - - Get the next pattern converter in the chain - - - - - - Gets or sets the formatting info for this converter - - - The formatting info for this converter - - - - Gets or sets the formatting info for this converter - - - - - - Gets or sets the option value for this converter - - - The option for this converter - - - - Gets or sets the option value for this converter - - - - - - Initializes a new instance of the class. - - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - that will receive the formatted result. - The on which the pattern converter should be executed. - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - - Flag indicating if this converter handles exceptions - - - false if this converter handles exceptions - - - - - Flag indicating if this converter handles the logging event exception - - false if this converter handles the logging event exception - - - If this converter handles the exception object contained within - , then this property should be set to - false. Otherwise, if the layout ignores the exception - object, then the property should be set to true. - - - Set this value to override a this default setting. The default - value is true, this converter does not handle the exception. - - - - - - Write the event appdomain name to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the output . - - - - - - Date pattern converter, uses a to format - the date of a . - - - - Render the to the writer as a string. - - - The value of the determines - the formatting of the date. The following values are allowed: - - - Option value - Output - - - ISO8601 - - Uses the formatter. - Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. - - - - DATE - - Uses the formatter. - Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". - - - - ABSOLUTE - - Uses the formatter. - Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". - - - - other - - Any other pattern string uses the formatter. - This formatter passes the pattern string to the - method. - For details on valid patterns see - DateTimeFormatInfo Class. - - - - - - The is in the local time zone and is rendered in that zone. - To output the time in Universal time see . - - - Nicko Cadell - - - - The used to render the date to a string - - - - The used to render the date to a string - - - - - - Initialize the converter pattern based on the property. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Convert the pattern into the rendered message - - that will receive the formatted result. - the event being logged - - - Pass the to the - for it to render it to the writer. - - - The passed is in the local time zone. - - - - - - Write the exception text to the output - - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - - - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - Nicko Cadell - - - - Default constructor - - - - - Write the exception text to the output - - that will receive the formatted result. - the event being logged - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - - - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - - - - Writes the caller location file name to the output - - - - Writes the value of the for - the event to the output writer. - - - Nicko Cadell - - - - Write the caller location file name to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the for - the to the output . - - - - - - Write the caller location info to the output - - - - Writes the to the output writer. - - - Nicko Cadell - - - - Write the caller location info to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the output writer. - - - - - - Writes the event identity to the output - - - - Writes the value of the to - the output writer. - - - Daniel Cazzulino - Nicko Cadell - - - - Writes the event identity to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the - to - the output . - - - - - - Write the event level to the output - - - - Writes the display name of the event - to the writer. - - - Nicko Cadell - - - - Write the event level to the output - - that will receive the formatted result. - the event being logged - - - Writes the of the - to the . - - - - - - Write the caller location line number to the output - - - - Writes the value of the for - the event to the output writer. - - - Nicko Cadell - - - - Write the caller location line number to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the for - the to the output . - - - - - - Converter for logger name - - - - Outputs the of the event. - - - Nicko Cadell - - - - Converter to output and truncate '.' separated strings - - - - This abstract class supports truncating a '.' separated string - to show a specified number of elements from the right hand side. - This is used to truncate class names that are fully qualified. - - - Subclasses should override the method to - return the fully qualified string. - - - Nicko Cadell - - - - Initialize the converter - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Get the fully qualified string data - - the event being logged - the fully qualified name - - - Overridden by subclasses to get the fully qualified name before the - precision is applied to it. - - - Return the fully qualified '.' (dot/period) separated string. - - - - - - Convert the pattern to the rendered message - - that will receive the formatted result. - the event being logged - - Render the to the precision - specified by the property. - - - - - Gets the fully qualified name of the logger - - the event being logged - The fully qualified logger name - - - Returns the of the . - - - - - - Writes the event message to the output - - - - Uses the method - to write out the event message. - - - Nicko Cadell - - - - Writes the event message to the output - - that will receive the formatted result. - the event being logged - - - Uses the method - to write out the event message. - - - - - - Write the method name to the output - - - - Writes the caller location to - the output. - - - Nicko Cadell - - - - Write the method name to the output - - that will receive the formatted result. - the event being logged - - - Writes the caller location to - the output. - - - - - - Converter to include event NDC - - - - Outputs the value of the event property named NDC. - - - The should be used instead. - - - Nicko Cadell - - - - Write the event NDC to the output - - that will receive the formatted result. - the event being logged - - - As the thread context stacks are now stored in named event properties - this converter simply looks up the value of the NDC property. - - - The should be used instead. - - - - - - Property pattern converter - - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - Nicko Cadell - - - - Write the property value to the output - - that will receive the formatted result. - the event being logged - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - - - - Converter to output the relative time of the event - - - - Converter to output the time of the event relative to the start of the program. - - - Nicko Cadell - - - - Write the relative time to the output - - that will receive the formatted result. - the event being logged - - - Writes out the relative time of the event in milliseconds. - That is the number of milliseconds between the event - and the . - - - - - - Helper method to get the time difference between two DateTime objects - - start time (in the current local time zone) - end time (in the current local time zone) - the time difference in milliseconds - - - - Converter to include event thread name - - - - Writes the to the output. - - - Nicko Cadell - - - - Write the ThreadName to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the . - - - - - - Pattern converter for the class name - - - - Outputs the of the event. - - - Nicko Cadell - - - - Gets the fully qualified name of the class - - the event being logged - The fully qualified type name for the caller location - - - Returns the of the . - - - - - - Converter to include event user name - - Douglas de la Torre - Nicko Cadell - - - - Convert the pattern to the rendered message - - that will receive the formatted result. - the event being logged - - - - Write the TimeStamp to the output - - - - Date pattern converter, uses a to format - the date of a . - - - Uses a to format the - in Universal time. - - - See the for details on the date pattern syntax. - - - - Nicko Cadell - - - - Write the TimeStamp to the output - - that will receive the formatted result. - the event being logged - - - Pass the to the - for it to render it to the writer. - - - The passed is in the local time zone, this is converted - to Universal time before it is rendered. - - - - - - - A Layout that renders only the Exception text from the logging event - - - - A Layout that renders only the Exception text from the logging event. - - - This Layout should only be used with appenders that utilize multiple - layouts (e.g. ). - - - Nicko Cadell - Gert Driesen - - - - Extend this abstract class to create your own log layout format. - - - - This is the base implementation of the - interface. Most layout objects should extend this class. - - - - - - Subclasses must implement the - method. - - - Subclasses should set the in their default - constructor. - - - - Nicko Cadell - Gert Driesen - - - - Interface implemented by layout objects - - - - An object is used to format a - as text. The method is called by an - appender to transform the into a string. - - - The layout can also supply and - text that is appender before any events and after all the events respectively. - - - Nicko Cadell - Gert Driesen - - - - Implement this method to create your own layout format. - - The TextWriter to write the formatted event to - The event to format - - - This method is called by an appender to format - the as text and output to a writer. - - - If the caller does not have a and prefers the - event to be formatted as a then the following - code can be used to format the event into a . - - - StringWriter writer = new StringWriter(); - Layout.Format(writer, loggingEvent); - string formattedEvent = writer.ToString(); - - - - - - The content type output by this layout. - - The content type - - - The content type output by this layout. - - - This is a MIME type e.g. "text/plain". - - - - - - The header for the layout format. - - the layout header - - - The Header text will be appended before any logging events - are formatted and appended. - - - - - - The footer for the layout format. - - the layout footer - - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - - Flag indicating if this layout handle exceptions - - false if this layout handles exceptions - - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - - - - - The header text - - - - See for more information. - - - - - - The footer text - - - - See for more information. - - - - - - Flag indicating if this layout handles exceptions - - - - false if this layout handles exceptions - - - - - - Empty default constructor - - - - Empty default constructor - - - - - - Activate component options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - This method must be implemented by the subclass. - - - - - - Implement this method to create your own layout format. - - The TextWriter to write the formatted event to - The event to format - - - This method is called by an appender to format - the as text. - - - - - - The content type output by this layout. - - The content type is "text/plain" - - - The content type output by this layout. - - - This base class uses the value "text/plain". - To change this value a subclass must override this - property. - - - - - - The header for the layout format. - - the layout header - - - The Header text will be appended before any logging events - are formatted and appended. - - - - - - The footer for the layout format. - - the layout footer - - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - - Flag indicating if this layout handles exceptions - - false if this layout handles exceptions - - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - - Set this value to override a this default setting. The default - value is true, this layout does not handle the exception. - - - - - - Default constructor - - - - Constructs a ExceptionLayout - - - - - - Activate component options - - - - Part of the component activation - framework. - - - This method does nothing as options become effective immediately. - - - - - - Gets the exception text from the logging event - - The TextWriter to write the formatted event to - the event being logged - - - Write the exception string to the . - The exception string is retrieved from . - - - - - - Interface for raw layout objects - - - - Interface used to format a - to an object. - - - This interface should not be confused with the - interface. This interface is used in - only certain specialized situations where a raw object is - required rather than a formatted string. The - is not generally useful than this interface. - - - Nicko Cadell - Gert Driesen - - - - Implement this method to create your own layout format. - - The event to format - returns the formatted event - - - Implement this method to create your own layout format. - - - - - - Adapts any to a - - - - Where an is required this adapter - allows a to be specified. - - - Nicko Cadell - Gert Driesen - - - - The layout to adapt - - - - - Construct a new adapter - - the layout to adapt - - - Create the adapter for the specified . - - - - - - Format the logging event as an object. - - The event to format - returns the formatted event - - - Format the logging event as an object. - - - Uses the object supplied to - the constructor to perform the formatting. - - - - - - A flexible layout configurable with pattern string. - - - - The goal of this class is to a - as a string. The results - depend on the conversion pattern. - - - The conversion pattern is closely related to the conversion - pattern of the printf function in C. A conversion pattern is - composed of literal text and format control expressions called - conversion specifiers. - - - You are free to insert any literal text within the conversion - pattern. - - - Each conversion specifier starts with a percent sign (%) and is - followed by optional format modifiers and a conversion - pattern name. The conversion pattern name specifies the type of - data, e.g. logger, level, date, thread name. The format - modifiers control such things as field width, padding, left and - right justification. The following is a simple example. - - - Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume - that the log4net environment was set to use a PatternLayout. Then the - statements - - - ILog log = LogManager.GetLogger(typeof(TestApp)); - log.Debug("Message 1"); - log.Warn("Message 2"); - - would yield the output - - DEBUG [main]: Message 1 - WARN [main]: Message 2 - - - Note that there is no explicit separator between text and - conversion specifiers. The pattern parser knows when it has reached - the end of a conversion specifier when it reads a conversion - character. In the example above the conversion specifier - %-5level means the level of the logging event should be left - justified to a width of five characters. - - - The recognized conversion pattern names are: - - - - Conversion Pattern Name - Effect - - - a - Equivalent to appdomain - - - appdomain - - Used to output the friendly name of the AppDomain where the - logging event was generated. - - - - c - Equivalent to logger - - - C - Equivalent to type - - - class - Equivalent to type - - - d - Equivalent to date - - - date - - - Used to output the date of the logging event in the local time zone. - To output the date in universal time use the %utcdate pattern. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %date{HH:mm:ss,fff} or - %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %date{ISO8601} or %date{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - exception - - - Used to output the exception passed in with the log message. - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - - - F - Equivalent to file - - - file - - - Used to output the file name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - identity - - - Used to output the user name for the currently active user - (Principal.Identity.Name). - - - WARNING Generating caller information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - - - l - Equivalent to location - - - L - Equivalent to line - - - location - - - Used to output location information of the caller which generated - the logging event. - - - The location information depends on the CLI implementation but - usually consists of the fully qualified name of the calling - method followed by the callers source the file name and line - number between parentheses. - - - The location information can be very useful. However, its - generation is extremely slow. Its use should be avoided - unless execution speed is not an issue. - - - See the note below on the availability of caller location information. - - - - - level - - - Used to output the level of the logging event. - - - - - line - - - Used to output the line number from where the logging request - was issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - logger - - - Used to output the logger of the logging event. The - logger conversion specifier can be optionally followed by - precision specifier, that is a decimal constant in - brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the logger name will be - printed. By default the logger name is printed in full. - - - For example, for the logger name "a.b.c" the pattern - %logger{2} will output "b.c". - - - - - m - Equivalent to message - - - M - Equivalent to method - - - message - - - Used to output the application supplied message associated with - the logging event. - - - - - mdc - - - The MDC (old name for the ThreadContext.Properties) is now part of the - combined event properties. This pattern is supported for compatibility - but is equivalent to property. - - - - - method - - - Used to output the method name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - n - Equivalent to newline - - - newline - - - Outputs the platform dependent line separator character or - characters. - - - This conversion pattern offers the same performance as using - non-portable line separator strings such as "\n", or "\r\n". - Thus, it is the preferred way of specifying a line separator. - - - - - ndc - - - Used to output the NDC (nested diagnostic context) associated - with the thread that generated the logging event. - - - - - p - Equivalent to level - - - P - Equivalent to property - - - properties - Equivalent to property - - - property - - - Used to output the an event specific property. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %property{user} would include the value - from the property that is keyed by the string 'user'. Each property value - that is to be included in the log must be specified separately. - Properties are added to events by loggers or appenders. By default - the log4net:HostName property is set to the name of machine on - which the event was originally logged. - - - If no key is specified, e.g. %property then all the keys and their - values are printed in a comma separated list. - - - The properties of an event are combined from a number of different - contexts. These are listed below in the order in which they are searched. - - - - the event properties - - The event has that can be set. These - properties are specific to this event only. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - - r - Equivalent to timestamp - - - t - Equivalent to thread - - - timestamp - - - Used to output the number of milliseconds elapsed since the start - of the application until the creation of the logging event. - - - - - thread - - - Used to output the name of the thread that generated the - logging event. Uses the thread number if no name is available. - - - - - type - - - Used to output the fully qualified type name of the caller - issuing the logging request. This conversion specifier - can be optionally followed by precision specifier, that - is a decimal constant in brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the class name will be - printed. By default the class name is output in fully qualified form. - - - For example, for the class name "log4net.Layout.PatternLayout", the - pattern %type{1} will output "PatternLayout". - - - WARNING Generating the caller class information is - slow. Thus, its use should be avoided unless execution speed is - not an issue. - - - See the note below on the availability of caller location information. - - - - - u - Equivalent to identity - - - username - - - Used to output the WindowsIdentity for the currently - active user. - - - WARNING Generating caller WindowsIdentity information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - - - utcdate - - - Used to output the date of the logging event in universal time. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %utcdate{HH:mm:ss,fff} or - %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %utcdate{ISO8601} or %utcdate{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - w - Equivalent to username - - - x - Equivalent to ndc - - - X - Equivalent to mdc - - - % - - - The sequence %% outputs a single percent sign. - - - - - - The single letter patterns are deprecated in favor of the - longer more descriptive pattern names. - - - By default the relevant information is output as is. However, - with the aid of format modifiers it is possible to change the - minimum field width, the maximum field width and justification. - - - The optional format modifier is placed between the percent sign - and the conversion pattern name. - - - The first optional format modifier is the left justification - flag which is just the minus (-) character. Then comes the - optional minimum field width modifier. This is a decimal - constant that represents the minimum number of characters to - output. If the data item requires fewer characters, it is padded on - either the left or the right until the minimum width is - reached. The default is to pad on the left (right justify) but you - can specify right padding with the left justification flag. The - padding character is space. If the data item is larger than the - minimum field width, the field is expanded to accommodate the - data. The value is never truncated. - - - This behavior can be changed using the maximum field - width modifier which is designated by a period followed by a - decimal constant. If the data item is longer than the maximum - field, then the extra characters are removed from the - beginning of the data item and not from the end. For - example, it the maximum field width is eight and the data item is - ten characters long, then the first two characters of the data item - are dropped. This behavior deviates from the printf function in C - where truncation is done from the end. - - - Below are various format modifier examples for the logger - conversion specifier. - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Format modifierleft justifyminimum widthmaximum widthcomment
    %20loggerfalse20none - - Left pad with spaces if the logger name is less than 20 - characters long. - -
    %-20loggertrue20none - - Right pad with spaces if the logger - name is less than 20 characters long. - -
    %.30loggerNAnone30 - - Truncate from the beginning if the logger - name is longer than 30 characters. - -
    %20.30loggerfalse2030 - - Left pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
    %-20.30loggertrue2030 - - Right pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
    -
    - - Note about caller location information.
    - The following patterns %type %file %line %method %location %class %C %F %L %l %M - all generate caller location information. - Location information uses the System.Diagnostics.StackTrace class to generate - a call stack. The caller's information is then extracted from this stack. -
    - - - The System.Diagnostics.StackTrace class is not supported on the - .NET Compact Framework 1.0 therefore caller location information is not - available on that framework. - - - - - The System.Diagnostics.StackTrace class has this to say about Release builds: - - - "StackTrace information will be most informative with Debug build configurations. - By default, Debug builds include debug symbols, while Release builds do not. The - debug symbols contain most of the file, method name, line number, and column - information used in constructing StackFrame and StackTrace objects. StackTrace - might not report as many method calls as expected, due to code transformations - that occur during optimization." - - - This means that in a Release build the caller information may be incomplete or may - not exist at all! Therefore caller location information cannot be relied upon in a Release build. - - - - Additional pattern converters may be registered with a specific - instance using the method. - -
    - - This is a more detailed pattern. - %timestamp [%thread] %level %logger %ndc - %message%newline - - - A similar pattern except that the relative time is - right padded if less than 6 digits, thread name is right padded if - less than 15 characters and truncated if longer and the logger - name is left padded if shorter than 30 characters and truncated if - longer. - %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline - - Nicko Cadell - Gert Driesen - Douglas de la Torre - Daniel Cazzulino -
    - - - Default pattern string for log output. - - - - Default pattern string for log output. - Currently set to the string "%message%newline" - which just prints the application supplied message. - - - - - - A detailed conversion pattern - - - - A conversion pattern which includes Time, Thread, Logger, and Nested Context. - Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. - - - - - - Internal map of converter identifiers to converter types. - - - - This static map is overridden by the m_converterRegistry instance map - - - - - - the pattern - - - - - the head of the pattern converter chain - - - - - patterns defined on this PatternLayout only - - - - - Initialize the global registry - - - - Defines the builtin global rules. - - - - - - Constructs a PatternLayout using the DefaultConversionPattern - - - - The default pattern just produces the application supplied message. - - - Note to Inheritors: This constructor calls the virtual method - . If you override this method be - aware that it will be called before your is called constructor. - - - As per the contract the - method must be called after the properties on this object have been - configured. - - - - - - Constructs a PatternLayout using the supplied conversion pattern - - the pattern to use - - - Note to Inheritors: This constructor calls the virtual method - . If you override this method be - aware that it will be called before your is called constructor. - - - When using this constructor the method - need not be called. This may not be the case when using a subclass. - - - - - - Create the pattern parser instance - - the pattern to parse - The that will format the event - - - Creates the used to parse the conversion string. Sets the - global and instance rules on the . - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a formatted string as specified by the conversion pattern. - - the event being logged - The TextWriter to write the formatted event to - - - Parse the using the patter format - specified in the property. - - - - - - Add a converter to this PatternLayout - - the converter info - - - This version of the method is used by the configurator. - Programmatic users should use the alternative method. - - - - - - Add a converter to this PatternLayout - - the name of the conversion pattern for this converter - the type of the converter - - - Add a named pattern converter to this instance. This - converter will be used in the formatting of the event. - This method must be called before . - - - The specified must extend the - type. - - - - - - The pattern formatting string - - - - The ConversionPattern option. This is the string which - controls formatting and consists of a mix of literal content and - conversion specifiers. - - - - - - Wrapper class used to map converter names to converter types - - - - Pattern converter info class used during configuration to - pass to the - method. - - - - - - default constructor - - - - - Gets or sets the name of the conversion pattern - - - - The name of the pattern in the format string - - - - - - Gets or sets the type of the converter - - - - The value specified must extend the - type. - - - - - - Type converter for the interface - - - - Used to convert objects to the interface. - Supports converting from the interface to - the interface using the . - - - Nicko Cadell - Gert Driesen - - - - Interface supported by type converters - - - - This interface supports conversion from arbitrary types - to a single target type. See . - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Test if the can be converted to the - type supported by this converter. - - - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - Converts the to the type supported - by this converter. - - - - - - Can the sourceType be converted to an - - the source to be to be converted - true if the source type can be converted to - - - Test if the can be converted to a - . Only is supported - as the . - - - - - - Convert the value to a object - - the value to convert - the object - - - Convert the object to a - object. If the object - is a then the - is used to adapt between the two interfaces, otherwise an - exception is thrown. - - - - - - Extract the value of a property from the - - - - Extract the value of a property from the - - - Nicko Cadell - - - - Constructs a RawPropertyLayout - - - - - Lookup the property for - - The event to format - returns property value - - - Looks up and returns the object value of the property - named . If there is no property defined - with than name then null will be returned. - - - - - - The name of the value to lookup in the LoggingEvent Properties collection. - - - Value to lookup in the LoggingEvent Properties collection - - - - String name of the property to lookup in the . - - - - - - Extract the date from the - - - - Extract the date from the - - - Nicko Cadell - Gert Driesen - - - - Constructs a RawTimeStampLayout - - - - - Gets the as a . - - The event to format - returns the time stamp - - - Gets the as a . - - - The time stamp is in local time. To format the time stamp - in universal time use . - - - - - - Extract the date from the - - - - Extract the date from the - - - Nicko Cadell - Gert Driesen - - - - Constructs a RawUtcTimeStampLayout - - - - - Gets the as a . - - The event to format - returns the time stamp - - - Gets the as a . - - - The time stamp is in universal time. To format the time stamp - in local time use . - - - - - - A very simple layout - - - - SimpleLayout consists of the level of the log statement, - followed by " - " and then the log message itself. For example, - - DEBUG - Hello world - - - - Nicko Cadell - Gert Driesen - - - - Constructs a SimpleLayout - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a simple formatted output. - - the event being logged - The TextWriter to write the formatted event to - - - Formats the event as the level of the even, - followed by " - " and then the log message itself. The - output is terminated by a newline. - - - - - - Layout that formats the log events as XML elements. - - - - The output of the consists of a series of - log4net:event elements. It does not output a complete well-formed XML - file. The output is designed to be included as an external entity - in a separate file to form a correct XML file. - - - For example, if abc is the name of the file where - the output goes, then a well-formed XML file would - be: - - - <?xml version="1.0" ?> - - <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> - - <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> - &data; - </log4net:events> - - - This approach enforces the independence of the - and the appender where it is embedded. - - - The version attribute helps components to correctly - interpret output generated by . The value of - this attribute should be "1.2" for release 1.2 and later. - - - Alternatively the Header and Footer properties can be - configured to output the correct XML header, open tag and close tag. - When setting the Header and Footer properties it is essential - that the underlying data store not be appendable otherwise the data - will become invalid XML. - - - Nicko Cadell - Gert Driesen - - - - Layout that formats the log events as XML elements. - - - - This is an abstract class that must be subclassed by an implementation - to conform to a specific schema. - - - Deriving classes must implement the method. - - - Nicko Cadell - Gert Driesen - - - - Protected constructor to support subclasses - - - - Initializes a new instance of the class - with no location info. - - - - - - Protected constructor to support subclasses - - - - The parameter determines whether - location information will be output by the layout. If - is set to true, then the - file name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a formatted string. - - The event being logged. - The TextWriter to write the formatted event to - - - Format the and write it to the . - - - This method creates an that writes to the - . The is passed - to the method. Subclasses should override the - method rather than this method. - - - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - Subclasses should override this method to format - the as XML. - - - - - - Flag to indicate if location information should be included in - the XML events. - - - - - Writer adapter that ignores Close - - - - - The string to replace invalid chars with - - - - - Gets a value indicating whether to include location information in - the XML events. - - - true if location information should be included in the XML - events; otherwise, false. - - - - If is set to true, then the file - name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - The string to replace characters that can not be expressed in XML with. - - - Not all characters may be expressed in XML. This property contains the - string to replace those that can not with. This defaults to a ?. Set it - to the empty string to simply remove offending characters. For more - details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets - Character replacement will occur in the log message, the property names - and the property values. - - - - - - - Gets the content type output by this layout. - - - As this is the XML layout, the value is always "text/xml". - - - - As this is the XML layout, the value is always "text/xml". - - - - - - Constructs an XmlLayout - - - - - Constructs an XmlLayout. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SmtpAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Builds a cache of the element names - - - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - Override the base class method - to write the to the . - - - - - - The prefix to use for all generated element names - - - - - The prefix to use for all element names - - - - The default prefix is log4net. Set this property - to change the prefix. If the prefix is set to an empty string - then no prefix will be written. - - - - - - Set whether or not to base64 encode the message. - - - - By default the log message will be written as text to the xml - output. This can cause problems when the message contains binary - data. By setting this to true the contents of the message will be - base64 encoded. If this is set then invalid character replacement - (see ) will not be performed - on the log message. - - - - - - Set whether or not to base64 encode the property values. - - - - By default the properties will be written as text to the xml - output. This can cause problems when one or more properties contain - binary data. By setting this to true the values of the properties - will be base64 encoded. If this is set then invalid character replacement - (see ) will not be performed - on the property values. - - - - - - Layout that formats the log events as XML elements compatible with the log4j schema - - - - Formats the log events according to the http://logging.apache.org/log4j schema. - - - Nicko Cadell - - - - The 1st of January 1970 in UTC - - - - - Constructs an XMLLayoutSchemaLog4j - - - - - Constructs an XMLLayoutSchemaLog4j. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Actually do the writing of the xml - - the writer to use - the event to write - - - Generate XML that is compatible with the log4j schema. - - - - - - The version of the log4j schema to use. - - - - Only version 1.2 of the log4j schema is supported. - - - - - - The default object Renderer. - - - - The default renderer supports rendering objects and collections to strings. - - - See the method for details of the output. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface in order to render objects as strings - - - - Certain types require special case conversion to - string form. This conversion is done by an object renderer. - Object renderers implement the - interface. - - - Nicko Cadell - Gert Driesen - - - - Render the object to a string - - The map used to lookup renderers - The object to render - The writer to render to - - - Render the object to a - string. - - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - - - - - Default constructor - - - - Default constructor - - - - - - Render the object to a string - - The map used to lookup renderers - The object to render - The writer to render to - - - Render the object to a string. - - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - - The default renderer supports rendering objects to strings as follows: - - - - Value - Rendered String - - - null - - "(null)" - - - - - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. - - - For example: int[] {1, 2, 3}. - - - If the array is not one dimensional the - Array.ToString() is returned. - - - - - , & - - - Rendered as an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. - - - For example: {a, b, c}. - - - All collection classes that implement its subclasses, - or generic equivalents all implement the interface. - - - - - - - - Rendered as the key, an equals sign ('='), and the value (using the appropriate - renderer). - - - For example: key=value. - - - - - other - - Object.ToString() - - - - - - - - Render the array argument into a string - - The map used to lookup renderers - the array to render - The writer to render to - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - int[] {1, 2, 3}. - - - If the array is not one dimensional the - Array.ToString() is returned. - - - - - - Render the enumerator argument into a string - - The map used to lookup renderers - the enumerator to render - The writer to render to - - - Rendered as an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - {a, b, c}. - - - - - - Render the DictionaryEntry argument into a string - - The map used to lookup renderers - the DictionaryEntry to render - The writer to render to - - - Render the key, an equals sign ('='), and the value (using the appropriate - renderer). For example: key=value. - - - - - - Map class objects to an . - - - - Maintains a mapping between types that require special - rendering and the that - is used to render them. - - - The method is used to render an - object using the appropriate renderers defined in this map. - - - Nicko Cadell - Gert Driesen - - - - Default Constructor - - - - Default constructor. - - - - - - Render using the appropriate renderer. - - the object to render to a string - the object rendered as a string - - - This is a convenience method used to render an object to a string. - The alternative method - should be used when streaming output to a . - - - - - - Render using the appropriate renderer. - - the object to render to a string - The writer to render to - - - Find the appropriate renderer for the type of the - parameter. This is accomplished by calling the - method. Once a renderer is found, it is - applied on the object and the result is returned - as a . - - - - - - Gets the renderer for the specified object type - - the object to lookup the renderer for - the renderer for - - - Gets the renderer for the specified object type. - - - Syntactic sugar method that calls - with the type of the object parameter. - - - - - - Gets the renderer for the specified type - - the type to lookup the renderer for - the renderer for the specified type - - - Returns the renderer for the specified type. - If no specific renderer has been defined the - will be returned. - - - - - - Internal function to recursively search interfaces - - the type to lookup the renderer for - the renderer for the specified type - - - - Clear the map of renderers - - - - Clear the custom renderers defined by using - . The - cannot be removed. - - - - - - Register an for . - - the type that will be rendered by - the renderer for - - - Register an object renderer for a specific source type. - This renderer will be returned from a call to - specifying the same as an argument. - - - - - - Get the default renderer instance - - the default renderer - - - Get the default renderer - - - - - - Interface implemented by logger repository plugins. - - - - Plugins define additional behavior that can be associated - with a . - The held by the - property is used to store the plugins for a repository. - - - The log4net.Config.PluginAttribute can be used to - attach plugins to repositories created using configuration - attributes. - - - Nicko Cadell - Gert Driesen - - - - Attaches the plugin to the specified . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - This method is called to notify the plugin that - it should stop operating and should detach from - the repository. - - - - - - Gets the name of the plugin. - - - The name of the plugin. - - - - Plugins are stored in the - keyed by name. Each plugin instance attached to a - repository must be a unique name. - - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a PluginCollection instance. - - list to create a readonly wrapper arround - - A PluginCollection wrapper that is read-only. - - - - - Initializes a new instance of the PluginCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the PluginCollection class - that has the specified initial capacity. - - - The number of elements that the new PluginCollection is initially capable of storing. - - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified PluginCollection. - - The PluginCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - - Copies the entire PluginCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire PluginCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the PluginCollection. - - The to be added to the end of the PluginCollection. - The index at which the value has been added. - - - - Removes all elements from the PluginCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the PluginCollection. - - The to check for. - true if is found in the PluginCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the PluginCollection. - - The to locate in the PluginCollection. - - The zero-based index of the first occurrence of - in the entire PluginCollection, if found; otherwise, -1. - - - - - Inserts an element into the PluginCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the PluginCollection. - - The to remove from the PluginCollection. - - The specified was not found in the PluginCollection. - - - - - Removes the element at the specified index of the PluginCollection. - - The zero-based index of the element to remove. - - is less than zero. - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the PluginCollection. - - An for the entire PluginCollection. - - - - Adds the elements of another PluginCollection to the current PluginCollection. - - The PluginCollection whose elements should be added to the end of the current PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a array to the current PluginCollection. - - The array whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a collection to the current PluginCollection. - - The collection whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the PluginCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - An object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - - The at the specified index. - - The zero-based index of the element to get or set. - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false. - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false. - - - - Gets or sets the number of elements the PluginCollection can contain. - - - The number of elements the PluginCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - - A value - - - - - Supports simple iteration over a . - - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - The current element in the collection. - - - - - - - - Map of repository plugins. - - - - This class is a name keyed map of the plugins that are - attached to a repository. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The repository that the plugins should be attached to. - - - Initialize a new instance of the class with a - repository that the plugins should be attached to. - - - - - - Adds a to the map. - - The to add to the map. - - - The will be attached to the repository when added. - - - If there already exists a plugin with the same name - attached to the repository then the old plugin will - be and replaced with - the new plugin. - - - - - - Removes a from the map. - - The to remove from the map. - - - Remove a specific plugin from this map. - - - - - - Gets a by name. - - The name of the to lookup. - - The from the map with the name specified, or - null if no plugin is found. - - - - Lookup a plugin by name. If the plugin is not found null - will be returned. - - - - - - Gets all possible plugins as a list of objects. - - All possible plugins as a list of objects. - - - Get a collection of all the plugins defined in this map. - - - - - - Base implementation of - - - - Default abstract implementation of the - interface. This base class can be used by implementors - of the interface. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - the name of the plugin - - Initializes a new Plugin with the specified name. - - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - This method is called to notify the plugin that - it should stop operating and should detach from - the repository. - - - - - - The name of this plugin. - - - - - The repository this plugin is attached to. - - - - - Gets or sets the name of the plugin. - - - The name of the plugin. - - - - Plugins are stored in the - keyed by name. Each plugin instance attached to a - repository must be a unique name. - - - The name of the plugin must not change one the - plugin has been attached to a repository. - - - - - - The repository for this plugin - - - The that this plugin is attached to. - - - - Gets or sets the that this plugin is - attached to. - - - - - - Plugin that listens for events from the - - - - This plugin publishes an instance of - on a specified . This listens for logging events delivered from - a remote . - - - When an event is received it is relogged within the attached repository - as if it had been raised locally. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Initializes a new instance of the class. - - - The property must be set. - - - - - - Construct with sink Uri. - - The name to publish the sink under in the remoting infrastructure. - See for more details. - - - Initializes a new instance of the class - with specified name. - - - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - When the plugin is shutdown the remote logging - sink is disconnected. - - - - - - Gets or sets the URI of this sink. - - - The URI of this sink. - - - - This is the name under which the object is marshaled. - - - - - - - Delivers objects to a remote sink. - - - - Internal class used to listen for logging events - and deliver them to the local repository. - - - - - - Constructor - - The repository to log to. - - - Initializes a new instance of the for the - specified . - - - - - - Logs the events to the repository. - - The events to log. - - - The events passed are logged to the - - - - - - Obtains a lifetime service object to control the lifetime - policy for this instance. - - null to indicate that this instance should live forever. - - - Obtains a lifetime service object to control the lifetime - policy for this instance. This object should live forever - therefore this implementation returns null. - - - - - - The underlying that events should - be logged to. - - - - - Default implementation of - - - - This default implementation of the - interface is used to create the default subclass - of the object. - - - Nicko Cadell - Gert Driesen - - - - Interface abstracts creation of instances - - - - This interface is used by the to - create new objects. - - - The method is called - to create a named . - - - Implement this interface to create new subclasses of . - - - Nicko Cadell - Gert Driesen - - - - Create a new instance - - The name of the . - The instance for the specified name. - - - Create a new instance with the - specified name. - - - Called by the to create - new named instances. - - - If the is null then the root logger - must be returned. - - - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Create a new instance - - The name of the . - The instance for the specified name. - - - Create a new instance with the - specified name. - - - Called by the to create - new named instances. - - - If the is null then the root logger - must be returned. - - - - - - Default internal subclass of - - - - This subclass has no additional behavior over the - class but does allow instances - to be created. - - - - - - Implementation of used by - - - - Internal class used to provide implementation of - interface. Applications should use to get - logger instances. - - - This is one of the central classes in the log4net implementation. One of the - distinctive features of log4net are hierarchical loggers and their - evaluation. The organizes the - instances into a rooted tree hierarchy. - - - The class is abstract. Only concrete subclasses of - can be created. The - is used to create instances of this type for the . - - - Nicko Cadell - Gert Driesen - Aspi Havewala - Douglas de la Torre - - - - This constructor created a new instance and - sets its name. - - The name of the . - - - This constructor is protected and designed to be used by - a subclass that is not abstract. - - - Loggers are constructed by - objects. See for the default - logger creator. - - - - - - Add to the list of appenders of this - Logger instance. - - An appender to add to this logger - - - Add to the list of appenders of this - Logger instance. - - - If is already in the list of - appenders, then it won't be added again. - - - - - - Look for the appender named as name - - The name of the appender to lookup - The appender with the name specified, or null. - - - Returns the named appender, or null if the appender is not found. - - - - - - Remove all previously added appenders from this Logger instance. - - - - Remove all previously added appenders from this Logger instance. - - - This is useful when re-reading configuration information. - - - - - - Remove the appender passed as parameter form the list of appenders. - - The appender to remove - The appender removed from the list - - - Remove the appender passed as parameter form the list of appenders. - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Remove the appender passed as parameter form the list of appenders. - - The name of the appender to remove - The appender removed from the list - - - Remove the named appender passed as parameter form the list of appenders. - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - This generic form is intended to be used by wrappers. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generate a logging event for the specified using - the and . - - - This method must not throw any exception to the caller. - - - - - - This is the most generic printing method that is intended to be used - by wrappers. - - The event being logged. - - - Logs the specified logging event through this logger. - - - This method must not throw any exception to the caller. - - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - Test if this logger is going to log events of the specified . - - - This method must not throw any exception to the caller. - - - - - - Deliver the to the attached appenders. - - The event to log. - - - Call the appenders in the hierarchy starting at - this. If no appenders could be found, emit a - warning. - - - This method calls all the appenders inherited from the - hierarchy circumventing any evaluation of whether to log or not - to log the particular log request. - - - - - - Closes all attached appenders implementing the interface. - - - - Used to ensure that the appenders are correctly shutdown. - - - - - - This is the most generic printing method. This generic form is intended to be used by wrappers - - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generate a logging event for the specified using - the . - - - - - - Creates a new logging event and logs the event without further checks. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generates a logging event and delivers it to the attached - appenders. - - - - - - Creates a new logging event and logs the event without further checks. - - The event being logged. - - - Delivers the logging event to the attached appenders. - - - - - - The fully qualified type of the Logger class. - - - - - The name of this logger. - - - - - The assigned level of this logger. - - - - The level variable need not be - assigned a value in which case it is inherited - form the hierarchy. - - - - - - The parent of this logger. - - - - The parent of this logger. - All loggers have at least one ancestor which is the root logger. - - - - - - Loggers need to know what Hierarchy they are in. - - - - Loggers need to know what Hierarchy they are in. - The hierarchy that this logger is a member of is stored - here. - - - - - - Helper implementation of the interface - - - - - Flag indicating if child loggers inherit their parents appenders - - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - - Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl - - - - - Gets or sets the parent logger in the hierarchy. - - - The parent logger in the hierarchy. - - - - Part of the Composite pattern that makes the hierarchy. - The hierarchy is parent linked rather than child linked. - - - - - - Gets or sets a value indicating if child loggers inherit their parent's appenders. - - - true if child loggers inherit their parent's appenders. - - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - - Gets the effective level for this logger. - - The nearest level in the logger hierarchy. - - - Starting from this logger, searches the logger hierarchy for a - non-null level and returns it. Otherwise, returns the level of the - root logger. - - The Logger class is designed so that this method executes as - quickly as possible. - - - - - Gets or sets the where this - Logger instance is attached to. - - The hierarchy that this logger belongs to. - - - This logger must be attached to a single . - - - - - - Gets or sets the assigned , if any, for this Logger. - - - The of this logger. - - - - The assigned can be null. - - - - - - Get the appenders contained in this logger as an - . - - A collection of the appenders in this logger - - - Get the appenders contained in this logger as an - . If no appenders - can be found, then a is returned. - - - - - - Gets the logger name. - - - The name of the logger. - - - - The name of this logger - - - - - - Gets the where this - Logger instance is attached to. - - - The that this logger belongs to. - - - - Gets the where this - Logger instance is attached to. - - - - - - Construct a new Logger - - the name of the logger - - - Initializes a new instance of the class - with the specified name. - - - - - - Delegate used to handle logger creation event notifications. - - The in which the has been created. - The event args that hold the instance that has been created. - - - Delegate used to handle logger creation event notifications. - - - - - - Provides data for the event. - - - - A event is raised every time a - is created. - - - - - - The created - - - - - Constructor - - The that has been created. - - - Initializes a new instance of the event argument - class,with the specified . - - - - - - Gets the that has been created. - - - The that has been created. - - - - The that has been created. - - - - - - Hierarchical organization of loggers - - - - The casual user should not have to deal with this class - directly. - - - This class is specialized in retrieving loggers by name and - also maintaining the logger hierarchy. Implements the - interface. - - - The structure of the logger hierarchy is maintained by the - method. The hierarchy is such that children - link to their parent but parents do not have any references to their - children. Moreover, loggers can be instantiated in any order, in - particular descendant before ancestor. - - - In case a descendant is created before a particular ancestor, - then it creates a provision node for the ancestor and adds itself - to the provision node. Other descendants of the same ancestor add - themselves to the previously created provision node. - - - Nicko Cadell - Gert Driesen - - - - Base implementation of - - - - Default abstract implementation of the interface. - - - Skeleton implementation of the interface. - All types can extend this type. - - - Nicko Cadell - Gert Driesen - - - - Interface implemented by logger repositories. - - - - This interface is implemented by logger repositories. e.g. - . - - - This interface is used by the - to obtain interfaces. - - - Nicko Cadell - Gert Driesen - - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - The name of the logger to lookup - The Logger object with the name specified - - - If the names logger exists it is returned, otherwise - null is returned. - - - - - - Returns all the currently defined loggers as an Array. - - All the defined loggers - - - Returns all the currently defined loggers as an Array. - - - - - - Returns a named logger instance - - The name of the logger to retrieve - The logger object with the name specified - - - Returns a named logger instance. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - - - Shutdown the repository - - - Shutting down a repository will safely close and remove - all appenders in all loggers including the root logger. - - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - - The method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Reset the repositories configuration to a default state - - - - Reset all values contained in this instance to their - default state. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are configured as an Array. - - All the Appenders - - - Returns all the Appenders that are configured as an Array. - - - - - - The name of the repository - - - The name of the repository - - - - The name of the repository. - - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - - RendererMap accesses the object renderer map for this repository. - - - The RendererMap holds a mapping between types and - objects. - - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - The plugin map holds the instances - that have been attached to this repository. - - - - - - Get the level map for the Repository. - - - - Get the level map for the Repository. - - - The level map defines the mappings between - level names and objects in - this repository. - - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - The threshold for all events in this repository. - - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - Flag indicates if this repository has been configured. - - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - Event raised when the repository has been shutdown. - - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - Event raised when the repository's configuration has been - reset to default. - - - - - - Event to notify that the repository has had its configuration changed. - - - Event to notify that the repository has had its configuration changed. - - - - Event raised when the repository's configuration has been changed. - - - - - - Repository specific properties - - - Repository specific properties - - - - These properties can be specified on a repository specific basis. - - - - - - Default Constructor - - - - Initializes the repository with default (empty) properties. - - - - - - Construct the repository using specific properties - - the properties to set for this repository - - - Initializes the repository with specified properties. - - - - - - Test if logger exists - - The name of the logger to lookup - The Logger object with the name specified - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - - - - - Returns all the currently defined loggers in the repository - - All the defined loggers - - - Returns all the currently defined loggers in the repository as an Array. - - - - - - Return a new logger instance - - The name of the logger to retrieve - The logger object with the name specified - - - Return a new logger instance. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - - - - Shutdown the repository - - - - Shutdown the repository. Can be overridden in a subclass. - This base class implementation notifies the - listeners and all attached plugins of the shutdown event. - - - - - - Reset the repositories configuration to a default state - - - - Reset all values contained in this instance to their - default state. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the logEvent through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are configured as an Array. - - All the Appenders - - - Returns all the Appenders that are configured as an Array. - - - - - - Adds an object renderer for a specific class. - - The type that will be rendered by the renderer supplied. - The object renderer used to render the object. - - - Adds an object renderer for a specific class. - - - - - - Notify the registered listeners that the repository is shutting down - - Empty EventArgs - - - Notify any listeners that this repository is shutting down. - - - - - - Notify the registered listeners that the repository has had its configuration reset - - Empty EventArgs - - - Notify any listeners that this repository's configuration has been reset. - - - - - - Notify the registered listeners that the repository has had its configuration changed - - Empty EventArgs - - - Notify any listeners that this repository's configuration has changed. - - - - - - Raise a configuration changed event on this repository - - EventArgs.Empty - - - Applications that programmatically change the configuration of the repository should - raise this event notification to notify listeners. - - - - - - The name of the repository - - - The string name of the repository - - - - The name of this repository. The name is - used to store and lookup the repositories - stored by the . - - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - The threshold for all events in this repository - - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - - RendererMap accesses the object renderer map for this repository. - - - The RendererMap holds a mapping between types and - objects. - - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - The plugin map holds the instances - that have been attached to this repository. - - - - - - Get the level map for the Repository. - - - - Get the level map for the Repository. - - - The level map defines the mappings between - level names and objects in - this repository. - - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - Flag indicates if this repository has been configured. - - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - Event raised when the repository has been shutdown. - - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - Event raised when the repository's configuration has been - reset to default. - - - - - - Event to notify that the repository has had its configuration changed. - - - Event to notify that the repository has had its configuration changed. - - - - Event raised when the repository's configuration has been changed. - - - - - - Repository specific properties - - - Repository specific properties - - - These properties can be specified on a repository specific basis - - - - - Basic Configurator interface for repositories - - - - Interface used by basic configurator to configure a - with a default . - - - A should implement this interface to support - configuration by the . - - - Nicko Cadell - Gert Driesen - - - - Initialize the repository using the specified appender - - the appender to use to log all logging events - - - Configure the repository to route all logging events to the - specified appender. - - - - - - Configure repository using XML - - - - Interface used by Xml configurator to configure a . - - - A should implement this interface to support - configuration by the . - - - Nicko Cadell - Gert Driesen - - - - Initialize the repository using the specified config - - the element containing the root of the config - - - The schema for the XML configuration data is defined by - the implementation. - - - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Construct with properties - - The properties to pass to this repository. - - - Initializes a new instance of the class. - - - - - - Construct with a logger factory - - The factory to use to create new logger instances. - - - Initializes a new instance of the class with - the specified . - - - - - - Construct with properties and a logger factory - - The properties to pass to this repository. - The factory to use to create new logger instances. - - - Initializes a new instance of the class with - the specified . - - - - - - Test if a logger exists - - The name of the logger to lookup - The Logger object with the name specified - - - Check if the named logger exists in the hierarchy. If so return - its reference, otherwise returns null. - - - - - - Returns all the currently defined loggers in the hierarchy as an Array - - All the defined loggers - - - Returns all the currently defined loggers in the hierarchy as an Array. - The root logger is not included in the returned - enumeration. - - - - - - Return a new logger instance named as the first parameter using - the default factory. - - - - Return a new logger instance named as the first parameter using - the default factory. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - The name of the logger to retrieve - The logger object with the name specified - - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - - The Shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Reset all values contained in this hierarchy instance to their default. - - - - Reset all values contained in this hierarchy instance to their - default. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the logEvent through this hierarchy. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are currently configured - - An array containing all the currently configured appenders - - - Returns all the instances that are currently configured. - All the loggers are searched for appenders. The appenders may also be containers - for appenders and these are also searched for additional loggers. - - - The list returned is unordered but does not contain duplicates. - - - - - - Collect the appenders from an . - The appender may also be a container. - - - - - - - Collect the appenders from an container - - - - - - - Initialize the log4net system using the specified appender - - the appender to use to log all logging events - - - - Initialize the log4net system using the specified appender - - the appender to use to log all logging events - - - This method provides the same functionality as the - method implemented - on this object, but it is protected and therefore can be called by subclasses. - - - - - - Initialize the log4net system using the specified config - - the element containing the root of the config - - - - Initialize the log4net system using the specified config - - the element containing the root of the config - - - This method provides the same functionality as the - method implemented - on this object, but it is protected and therefore can be called by subclasses. - - - - - - Test if this hierarchy is disabled for the specified . - - The level to check against. - - true if the repository is disabled for the level argument, false otherwise. - - - - If this hierarchy has not been configured then this method will - always return true. - - - This method will return true if this repository is - disabled for level object passed as parameter and - false otherwise. - - - See also the property. - - - - - - Clear all logger definitions from the internal hashtable - - - - This call will clear all logger definitions from the internal - hashtable. Invoking this method will irrevocably mess up the - logger hierarchy. - - - You should really know what you are doing before - invoking this method. - - - - - - Return a new logger instance named as the first parameter using - . - - The name of the logger to retrieve - The factory that will make the new logger instance - The logger object with the name specified - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated by the - parameter and linked with its existing - ancestors as well as children. - - - - - - Sends a logger creation event to all registered listeners - - The newly created logger - - Raises the logger creation event. - - - - - Updates all the parents of the specified logger - - The logger to update the parents for - - - This method loops through all the potential parents of - . There 3 possible cases: - - - - No entry for the potential parent of exists - - We create a ProvisionNode for this potential - parent and insert in that provision node. - - - - The entry is of type Logger for the potential parent. - - The entry is 's nearest existing parent. We - update 's parent field with this entry. We also break from - he loop because updating our parent's parent is our parent's - responsibility. - - - - The entry is of type ProvisionNode for this potential parent. - - We add to the list of children for this - potential parent. - - - - - - - - Replace a with a in the hierarchy. - - - - - - We update the links for all the children that placed themselves - in the provision node 'pn'. The second argument 'log' is a - reference for the newly created Logger, parent of all the - children in 'pn'. - - - We loop on all the children 'c' in 'pn'. - - - If the child 'c' has been already linked to a child of - 'log' then there is no need to update 'c'. - - - Otherwise, we set log's parent field to c's parent and set - c's parent field to log. - - - - - - Define or redefine a Level using the values in the argument - - the level values - - - Define or redefine a Level using the values in the argument - - - Supports setting levels via the configuration file. - - - - - - Set a Property using the values in the argument - - the property value - - - Set a Property using the values in the argument. - - - Supports setting property values via the configuration file. - - - - - - Event used to notify that a logger has been created. - - - - Event raised when a logger is created. - - - - - - Has no appender warning been emitted - - - - Flag to indicate if we have already issued a warning - about not having an appender warning. - - - - - - Get the root of this hierarchy - - - - Get the root of this hierarchy. - - - - - - Gets or sets the default instance. - - The default - - - The logger factory is used to create logger instances. - - - - - - A class to hold the value, name and display name for a level - - - - A class to hold the value, name and display name for a level - - - - - - Override Object.ToString to return sensible debug info - - string info about this object - - - - Value of the level - - - - If the value is not set (defaults to -1) the value will be looked - up for the current level with the same name. - - - - - - Name of the level - - - The name of the level - - - - The name of the level. - - - - - - Display name for the level - - - The display name of the level - - - - The display name of the level. - - - - - - A class to hold the key and data for a property set in the config file - - - - A class to hold the key and data for a property set in the config file - - - - - - Override Object.ToString to return sensible debug info - - string info about this object - - - - Property Key - - - Property Key - - - - Property Key. - - - - - - Property Value - - - Property Value - - - - Property Value. - - - - - - Used internally to accelerate hash table searches. - - - - Internal class used to improve performance of - string keyed hashtables. - - - The hashcode of the string is cached for reuse. - The string is stored as an interned value. - When comparing two objects for equality - the reference equality of the interned strings is compared. - - - Nicko Cadell - Gert Driesen - - - - Construct key with string name - - - - Initializes a new instance of the class - with the specified name. - - - Stores the hashcode of the string and interns - the string key to optimize comparisons. - - - The Compact Framework 1.0 the - method does not work. On the Compact Framework - the string keys are not interned nor are they - compared by reference. - - - The name of the logger. - - - - Returns a hash code for the current instance. - - A hash code for the current instance. - - - Returns the cached hashcode. - - - - - - Determines whether two instances - are equal. - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - Compares the references of the interned strings. - - - - - - Provision nodes are used where no logger instance has been specified - - - - instances are used in the - when there is no specified - for that node. - - - A provision node holds a list of child loggers on behalf of - a logger that does not exist. - - - Nicko Cadell - Gert Driesen - - - - Create a new provision node with child node - - A child logger to add to this node. - - - Initializes a new instance of the class - with the specified child logger. - - - - - - The sits at the root of the logger hierarchy tree. - - - - The is a regular except - that it provides several guarantees. - - - First, it cannot be assigned a null - level. Second, since the root logger cannot have a parent, the - property always returns the value of the - level field without walking the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Construct a - - The level to assign to the root logger. - - - Initializes a new instance of the class with - the specified logging level. - - - The root logger names itself as "root". However, the root - logger cannot be retrieved by name. - - - - - - Gets the assigned level value without walking the logger hierarchy. - - The assigned level value without walking the logger hierarchy. - - - Because the root logger cannot have a parent and its level - must not be null this property just returns the - value of . - - - - - - Gets or sets the assigned for the root logger. - - - The of the root logger. - - - - Setting the level of the root logger to a null reference - may have catastrophic results. We prevent this here. - - - - - - Initializes the log4net environment using an XML DOM. - - - - Configures a using an XML DOM. - - - Nicko Cadell - Gert Driesen - - - - Construct the configurator for a hierarchy - - The hierarchy to build. - - - Initializes a new instance of the class - with the specified . - - - - - - Configure the hierarchy by parsing a DOM tree of XML elements. - - The root element to parse. - - - Configure the hierarchy by parsing a DOM tree of XML elements. - - - - - - Parse appenders by IDREF. - - The appender ref element. - The instance of the appender that the ref refers to. - - - Parse an XML element that represents an appender and return - the appender. - - - - - - Parses an appender element. - - The appender element. - The appender instance or null when parsing failed. - - - Parse an XML element that represents an appender and return - the appender instance. - - - - - - Parses a logger element. - - The logger element. - - - Parse an XML element that represents a logger. - - - - - - Parses the root logger element. - - The root element. - - - Parse an XML element that represents the root logger. - - - - - - Parses the children of a logger element. - - The category element. - The logger instance. - Flag to indicate if the logger is the root logger. - - - Parse the child elements of a <logger> element. - - - - - - Parses an object renderer. - - The renderer element. - - - Parse an XML element that represents a renderer. - - - - - - Parses a level element. - - The level element. - The logger object to set the level on. - Flag to indicate if the logger is the root logger. - - - Parse an XML element that represents a level. - - - - - - Sets a parameter on an object. - - The parameter element. - The object to set the parameter on. - - The parameter name must correspond to a writable property - on the object. The value of the parameter is a string, - therefore this function will attempt to set a string - property first. If unable to set a string property it - will inspect the property and its argument type. It will - attempt to call a static method called Parse on the - type of the property. This method will take a single - string argument and return a value that can be used to - set the property. - - - - - Test if an element has no attributes or child elements - - the element to inspect - true if the element has any attributes or child elements, false otherwise - - - - Test if a is constructible with Activator.CreateInstance. - - the type to inspect - true if the type is creatable using a default constructor, false otherwise - - - - Look for a method on the that matches the supplied - - the type that has the method - the name of the method - the method info found - - - The method must be a public instance method on the . - The method must be named or "Add" followed by . - The method must take a single parameter. - - - - - - Converts a string value to a target type. - - The type of object to convert the string to. - The string value to use as the value of the object. - - - An object of type with value or - null when the conversion could not be performed. - - - - - - Creates an object as specified in XML. - - The XML element that contains the definition of the object. - The object type to use if not explicitly specified. - The type that the returned object must be or must inherit from. - The object or null - - - Parse an XML element and create an object instance based on the configuration - data. - - - The type of the instance may be specified in the XML. If not - specified then the is used - as the type. However the type is specified it must support the - type. - - - - - - key: appenderName, value: appender. - - - - - The Hierarchy being configured. - - - - - Delegate used to handle logger repository shutdown event notifications - - The that is shutting down. - Empty event args - - - Delegate used to handle logger repository shutdown event notifications. - - - - - - Delegate used to handle logger repository configuration reset event notifications - - The that has had its configuration reset. - Empty event args - - - Delegate used to handle logger repository configuration reset event notifications. - - - - - - Delegate used to handle event notifications for logger repository configuration changes. - - The that has had its configuration changed. - Empty event arguments. - - - Delegate used to handle event notifications for logger repository configuration changes. - - - - - - Write the name of the current AppDomain to the output - - - - Write the name of the current AppDomain to the output writer - - - Nicko Cadell - - - - Write the name of the current AppDomain to the output - - the writer to write to - null, state is not set - - - Writes name of the current AppDomain to the output . - - - - - - Write the current date to the output - - - - Date pattern converter, uses a to format - the current date and time to the writer as a string. - - - The value of the determines - the formatting of the date. The following values are allowed: - - - Option value - Output - - - ISO8601 - - Uses the formatter. - Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. - - - - DATE - - Uses the formatter. - Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". - - - - ABSOLUTE - - Uses the formatter. - Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". - - - - other - - Any other pattern string uses the formatter. - This formatter passes the pattern string to the - method. - For details on valid patterns see - DateTimeFormatInfo Class. - - - - - - The date and time is in the local time zone and is rendered in that zone. - To output the time in Universal time see . - - - Nicko Cadell - - - - The used to render the date to a string - - - - The used to render the date to a string - - - - - - Initialize the converter options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write the current date to the output - - that will receive the formatted result. - null, state is not set - - - Pass the current date and time to the - for it to render it to the writer. - - - The date and time passed is in the local time zone. - - - - - - Write an environment variable to the output - - - - Write an environment variable to the output writer. - The value of the determines - the name of the variable to output. - - - Nicko Cadell - - - - Write an environment variable to the output - - the writer to write to - null, state is not set - - - Writes the environment variable to the output . - The name of the environment variable to output must be set - using the - property. - - - - - - Write the current thread identity to the output - - - - Write the current thread identity to the output writer - - - Nicko Cadell - - - - Write the current thread identity to the output - - the writer to write to - null, state is not set - - - Writes the current thread identity to the output . - - - - - - Pattern converter for literal string instances in the pattern - - - - Writes the literal string value specified in the - property to - the output. - - - Nicko Cadell - - - - Set the next converter in the chain - - The next pattern converter in the chain - The next pattern converter - - - Special case the building of the pattern converter chain - for instances. Two adjacent - literals in the pattern can be represented by a single combined - pattern converter. This implementation detects when a - is added to the chain - after this converter and combines its value with this converter's - literal value. - - - - - - Write the literal to the output - - the writer to write to - null, not set - - - Override the formatting behavior to ignore the FormattingInfo - because we have a literal instead. - - - Writes the value of - to the output . - - - - - - Convert this pattern into the rendered message - - that will receive the formatted result. - null, not set - - - This method is not used. - - - - - - Writes a newline to the output - - - - Writes the system dependent line terminator to the output. - This behavior can be overridden by setting the : - - - - Option Value - Output - - - DOS - DOS or Windows line terminator "\r\n" - - - UNIX - UNIX line terminator "\n" - - - - Nicko Cadell - - - - Initialize the converter - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write the current process ID to the output - - - - Write the current process ID to the output writer - - - Nicko Cadell - - - - Write the current process ID to the output - - the writer to write to - null, state is not set - - - Write the current process ID to the output . - - - - - - Property pattern converter - - - - This pattern converter reads the thread and global properties. - The thread properties take priority over global properties. - See for details of the - thread properties. See for - details of the global properties. - - - If the is specified then that will be used to - lookup a single property. If no is specified - then all properties will be dumped as a list of key value pairs. - - - Nicko Cadell - - - - Write the property value to the output - - that will receive the formatted result. - null, state is not set - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - - - - A Pattern converter that generates a string of random characters - - - - The converter generates a string of random characters. By default - the string is length 4. This can be changed by setting the - to the string value of the length required. - - - The random characters in the string are limited to uppercase letters - and numbers only. - - - The random number generator used by this class is not cryptographically secure. - - - Nicko Cadell - - - - Shared random number generator - - - - - Length of random string to generate. Default length 4. - - - - - Initialize the converter options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write a randoim string to the output - - the writer to write to - null, state is not set - - - Write a randoim string to the output . - - - - - - Write the current threads username to the output - - - - Write the current threads username to the output writer - - - Nicko Cadell - - - - Write the current threads username to the output - - the writer to write to - null, state is not set - - - Write the current threads username to the output . - - - - - - Write the UTC date time to the output - - - - Date pattern converter, uses a to format - the current date and time in Universal time. - - - See the for details on the date pattern syntax. - - - - Nicko Cadell - - - - Write the current date and time to the output - - that will receive the formatted result. - null, state is not set - - - Pass the current date and time to the - for it to render it to the writer. - - - The date is in Universal time when it is rendered. - - - - - - - Type converter for Boolean. - - - - Supports conversion from string to bool type. - - - - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - Uses the method to convert the - argument to a . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Exception base type for conversion errors. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - A message to include with the exception. - - - Initializes a new instance of the class - with the specified message. - - - - - - Constructor - - A message to include with the exception. - A nested exception to include. - - - Initializes a new instance of the class - with the specified message and inner exception. - - - - - - Serialization constructor - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Creates a new instance of the class. - - The conversion destination type. - The value to convert. - An instance of the . - - - Creates a new instance of the class. - - - - - - Creates a new instance of the class. - - The conversion destination type. - The value to convert. - A nested exception to include. - An instance of the . - - - Creates a new instance of the class. - - - - - - Register of type converters for specific types. - - - - Maintains a registry of type converters used to convert between - types. - - - Use the and - methods to register new converters. - The and methods - lookup appropriate converters to use. - - - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - Initializes a new instance of the class. - - - - - Static constructor. - - - - This constructor defines the intrinsic type converters. - - - - - - Adds a converter for a specific type. - - The type being converted to. - The type converter to use to convert to the destination type. - - - Adds a converter instance for a specific type. - - - - - - Adds a converter for a specific type. - - The type being converted to. - The type of the type converter to use to convert to the destination type. - - - Adds a converter for a specific type. - - - - - - Gets the type converter to use to convert values to the destination type. - - The type being converted from. - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - Gets the type converter to use to convert values to the destination type. - - - - - - Gets the type converter to use to convert values to the destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - Gets the type converter to use to convert values to the destination type. - - - - - - Lookups the type converter to use as specified by the attributes on the - destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - - Creates the instance of the type converter. - - The type of the type converter. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - The type specified for the type converter must implement - the or interfaces - and must have a public default (no argument) constructor. - - - - - - Mapping from to type converter. - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to an encoding - the encoding - - - Uses the method to - convert the argument to an . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Interface supported by type converters - - - - This interface supports conversion from a single type to arbitrary types. - See . - - - Nicko Cadell - - - - Returns whether this converter can convert the object to the specified type - - A Type that represents the type you want to convert to - true if the conversion is possible - - - Test if the type supported by this converter can be converted to the - . - - - - - - Converts the given value object to the specified type, using the arguments - - the object to convert - The Type to convert the value parameter to - the converted object - - - Converts the (which must be of the type supported - by this converter) to the specified.. - - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to an IPAddress - the IPAddress - - - Uses the method to convert the - argument to an . - If that fails then the string is resolved as a DNS hostname. - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - The string is used as the - of the . - - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a PatternLayout - the PatternLayout - - - Creates and returns a new using - the as the - . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Convert between string and - - - - Supports conversion from string to type, - and from a type to a string. - - - The string is used as the - of the . - - - - - - Nicko Cadell - - - - Can the target type be converted to the type supported by this object - - A that represents the type you want to convert to - true if the conversion is possible - - - Returns true if the is - assignable from a type. - - - - - - Converts the given value object to the specified type, using the arguments - - the object to convert - The Type to convert the value parameter to - the converted object - - - Uses the method to convert the - argument to a . - - - - The object cannot be converted to the - . To check for this condition use the - method. - - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a PatternString - the PatternString - - - Creates and returns a new using - the as the - . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a Type - the Type - - - Uses the method to convert the - argument to a . - Additional effort is made to locate partially specified types - by searching the loaded assemblies. - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Attribute used to associate a type converter - - - - Class and Interface level attribute that specifies a type converter - to use with the associated type. - - - To associate a type converter with a target type apply a - TypeConverterAttribute to the target type. Specify the - type of the type converter on the attribute. - - - Nicko Cadell - Gert Driesen - - - - The string type name of the type converter - - - - - Default constructor - - - - Default constructor - - - - - - Create a new type converter attribute for the specified type name - - The string type name of the type converter - - - The type specified must implement the - or the interfaces. - - - - - - Create a new type converter attribute for the specified type - - The type of the type converter - - - The type specified must implement the - or the interfaces. - - - - - - The string type name of the type converter - - - The string type name of the type converter - - - - The type specified must implement the - or the interfaces. - - - - - - A straightforward implementation of the interface. - - - - This is the default implementation of the - interface. Implementors of the interface - should aggregate an instance of this type. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Append on on all attached appenders. - - The event being logged. - The number of appenders called. - - - Calls the method on all - attached appenders. - - - - - - Append on on all attached appenders. - - The array of events being logged. - The number of appenders called. - - - Calls the method on all - attached appenders. - - - - - - Calls the DoAppende method on the with - the objects supplied. - - The appender - The events - - - If the supports the - interface then the will be passed - through using that interface. Otherwise the - objects in the array will be passed one at a time. - - - - - - Attaches an appender. - - The appender to add. - - - If the appender is already in the list it won't be added again. - - - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - Lookup an attached appender by name. - - - - - - Removes all attached appenders. - - - - Removes and closes all attached appenders - - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - List of appenders - - - - - Array of appenders, used to cache the m_appenderList - - - - - Gets all attached appenders. - - - A collection of attached appenders, or null if there - are no attached appenders. - - - - The read only collection of all currently attached appenders. - - - - - - This class aggregates several PropertiesDictionary collections together. - - - - Provides a dictionary style lookup over an ordered list of - collections. - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Add a Properties Dictionary to this composite collection - - the properties to add - - - Properties dictionaries added first take precedence over dictionaries added - later. - - - - - - Flatten this composite collection into a single properties dictionary - - the flattened dictionary - - - Reduces the collection of ordered dictionaries to a single dictionary - containing the resultant values for the keys. - - - - - - Gets the value of a property - - - The value for the property with the specified key - - - - Looks up the value for the specified. - The collections are searched - in the order in which they were added to this collection. The value - returned is the value held by the first collection that contains - the specified key. - - - If none of the collections contain the specified key then - null is returned. - - - - - - Base class for Context Properties implementations - - - - This class defines a basic property get set accessor - - - Nicko Cadell - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Gets or sets the value of a property - - - - - - Subclass of that maintains a count of - the number of bytes written. - - - - This writer counts the number of bytes written. - - - Nicko Cadell - Gert Driesen - - - - that does not leak exceptions - - - - does not throw exceptions when things go wrong. - Instead, it delegates error handling to its . - - - Nicko Cadell - Gert Driesen - - - - Adapter that extends and forwards all - messages to an instance of . - - - - Adapter that extends and forwards all - messages to an instance of . - - - Nicko Cadell - - - - The writer to forward messages to - - - - - Create an instance of that forwards all - messages to a . - - The to forward to - - - Create an instance of that forwards all - messages to a . - - - - - - Closes the writer and releases any system resources associated with the writer - - - - - - - - - Dispose this writer - - flag indicating if we are being disposed - - - Dispose this writer - - - - - - Flushes any buffered output - - - - Clears all buffers for the writer and causes any buffered data to be written - to the underlying device - - - - - - Writes a character to the wrapped TextWriter - - the value to write to the TextWriter - - - Writes a character to the wrapped TextWriter - - - - - - Writes a character buffer to the wrapped TextWriter - - the data buffer - the start index - the number of characters to write - - - Writes a character buffer to the wrapped TextWriter - - - - - - Writes a string to the wrapped TextWriter - - the value to write to the TextWriter - - - Writes a string to the wrapped TextWriter - - - - - - Gets or sets the underlying . - - - The underlying . - - - - Gets or sets the underlying . - - - - - - The Encoding in which the output is written - - - The - - - - The Encoding in which the output is written - - - - - - Gets an object that controls formatting - - - The format provider - - - - Gets an object that controls formatting - - - - - - Gets or sets the line terminator string used by the TextWriter - - - The line terminator to use - - - - Gets or sets the line terminator string used by the TextWriter - - - - - - Constructor - - the writer to actually write to - the error handler to report error to - - - Create a new QuietTextWriter using a writer and error handler - - - - - - Writes a character to the underlying writer - - the char to write - - - Writes a character to the underlying writer - - - - - - Writes a buffer to the underlying writer - - the buffer to write - the start index to write from - the number of characters to write - - - Writes a buffer to the underlying writer - - - - - - Writes a string to the output. - - The string data to write to the output. - - - Writes a string to the output. - - - - - - Closes the underlying output writer. - - - - Closes the underlying output writer. - - - - - - The error handler instance to pass all errors to - - - - - Flag to indicate if this writer is closed - - - - - Gets or sets the error handler that all errors are passed to. - - - The error handler that all errors are passed to. - - - - Gets or sets the error handler that all errors are passed to. - - - - - - Gets a value indicating whether this writer is closed. - - - true if this writer is closed, otherwise false. - - - - Gets a value indicating whether this writer is closed. - - - - - - Constructor - - The to actually write to. - The to report errors to. - - - Creates a new instance of the class - with the specified and . - - - - - - Writes a character to the underlying writer and counts the number of bytes written. - - the char to write - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Writes a buffer to the underlying writer and counts the number of bytes written. - - the buffer to write - the start index to write from - the number of characters to write - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Writes a string to the output and counts the number of bytes written. - - The string data to write to the output. - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Total number of bytes written. - - - - - Gets or sets the total number of bytes written. - - - The total number of bytes written. - - - - Gets or sets the total number of bytes written. - - - - - - A fixed size rolling buffer of logging events. - - - - An array backed fixed size leaky bucket. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The maximum number of logging events in the buffer. - - - Initializes a new instance of the class with - the specified maximum number of buffered logging events. - - - The argument is not a positive integer. - - - - Appends a to the buffer. - - The event to append to the buffer. - The event discarded from the buffer, if the buffer is full, otherwise null. - - - Append an event to the buffer. If the buffer still contains free space then - null is returned. If the buffer is full then an event will be dropped - to make space for the new event, the event dropped is returned. - - - - - - Get and remove the oldest event in the buffer. - - The oldest logging event in the buffer - - - Gets the oldest (first) logging event in the buffer and removes it - from the buffer. - - - - - - Pops all the logging events from the buffer into an array. - - An array of all the logging events in the buffer. - - - Get all the events in the buffer and clear the buffer. - - - - - - Clear the buffer - - - - Clear the buffer of all events. The events in the buffer are lost. - - - - - - Gets the th oldest event currently in the buffer. - - The th oldest event currently in the buffer. - - - If is outside the range 0 to the number of events - currently in the buffer, then null is returned. - - - - - - Gets the maximum size of the buffer. - - The maximum size of the buffer. - - - Gets the maximum size of the buffer - - - - - - Gets the number of logging events in the buffer. - - The number of logging events in the buffer. - - - This number is guaranteed to be in the range 0 to - (inclusive). - - - - - - An always empty . - - - - A singleton implementation of the - interface that always represents an empty collection. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - As the collection is empty no values are copied into the array. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - The singleton instance of the empty collection. - - - - - Gets the singleton instance of the empty collection. - - The singleton instance of the empty collection. - - - Gets the singleton instance of the empty collection. - - - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - - For the this property is always true. - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - As the collection is empty the is always 0. - - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - As the collection is empty and thread safe and synchronized this instance is also - the object. - - - - - - An always empty . - - - - A singleton implementation of the - interface that always represents an empty collection. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - As the collection is empty no values are copied into the array. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - Adds an element with the provided key and value to the - . - - The to use as the key of the element to add. - The to use as the value of the element to add. - - - As the collection is empty no new values can be added. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - Removes all elements from the . - - - - As the collection is empty no values can be removed. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - Determines whether the contains an element - with the specified key. - - The key to locate in the . - false - - - As the collection is empty the method always returns false. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - Removes the element with the specified key from the . - - The key of the element to remove. - - - As the collection is empty no values can be removed. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - The singleton instance of the empty dictionary. - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - - For the this property is always true. - - - - - - Gets the number of elements contained in the - - - The number of elements contained in the . - - - - As the collection is empty the is always 0. - - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - As the collection is empty and thread safe and synchronized this instance is also - the object. - - - - - - Gets a value indicating whether the has a fixed size. - - true - - - As the collection is empty always returns true. - - - - - - Gets a value indicating whether the is read-only. - - true - - - As the collection is empty always returns true. - - - - - - Gets an containing the keys of the . - - An containing the keys of the . - - - As the collection is empty a is returned. - - - - - - Gets an containing the values of the . - - An containing the values of the . - - - As the collection is empty a is returned. - - - - - - Gets or sets the element with the specified key. - - The key of the element to get or set. - null - - - As the collection is empty no values can be looked up or stored. - If the index getter is called then null is returned. - A is thrown if the setter is called. - - - This dictionary is always empty and cannot be modified. - - - - Contain the information obtained when parsing formatting modifiers - in conversion modifiers. - - - - Holds the formatting information extracted from the format string by - the . This is used by the - objects when rendering the output. - - - Nicko Cadell - Gert Driesen - - - - Defaut Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - - - Initializes a new instance of the class - with the specified parameters. - - - - - - Gets or sets the minimum value. - - - The minimum value. - - - - Gets or sets the minimum value. - - - - - - Gets or sets the maximum value. - - - The maximum value. - - - - Gets or sets the maximum value. - - - - - - Gets or sets a flag indicating whether left align is enabled - or not. - - - A flag indicating whether left align is enabled or not. - - - - Gets or sets a flag indicating whether left align is enabled or not. - - - - - - Implementation of Properties collection for the - - - - This class implements a properties collection that is thread safe and supports both - storing properties and capturing a read only copy of the current propertied. - - - This class is optimized to the scenario where the properties are read frequently - and are modified infrequently. - - - Nicko Cadell - - - - The read only copy of the properties. - - - - This variable is declared volatile to prevent the compiler and JIT from - reordering reads and writes of this thread performed on different threads. - - - - - - Lock object used to synchronize updates within this instance - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property from the global context - - the key for the entry to remove - - - Removing an entry from the global context properties is relatively expensive compared - with reading a value. - - - - - - Clear the global context properties - - - - - Get a readonly immutable copy of the properties - - the current global context properties - - - This implementation is fast because the GlobalContextProperties class - stores a readonly copy of the properties. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Reading the value for a key is faster than setting the value. - When the value is written a new read only copy of - the properties is created. - - - - - - Manages a mapping from levels to - - - - Manages an ordered mapping from instances - to subclasses. - - - Nicko Cadell - - - - Default constructor - - - - Initialise a new instance of . - - - - - - Add a to this mapping - - the entry to add - - - If a has previously been added - for the same then that entry will be - overwritten. - - - - - - Lookup the mapping for the specified level - - the level to lookup - the for the level or null if no mapping found - - - Lookup the value for the specified level. Finds the nearest - mapping value for the level that is equal to or less than the - specified. - - - If no mapping could be found then null is returned. - - - - - - Initialize options - - - - Caches the sorted list of in an array - - - - - - Implementation of Properties collection for the - - - - Class implements a collection of properties that is specific to each thread. - The class is not synchronized as each thread has its own . - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property - - the key for the entry to remove - - - Remove the value for the specified from the context. - - - - - - Clear all the context properties - - - - Clear all the context properties - - - - - - Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. - - create the dictionary if it does not exist, otherwise return null if is does not exist - the properties for this thread - - - The collection returned is only to be used on the calling thread. If the - caller needs to share the collection between different threads then the - caller must clone the collection before doings so. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Get or set the property value for the specified. - - - - - - Outputs log statements from within the log4net assembly. - - - - Log4net components cannot make log4net logging calls. However, it is - sometimes useful for the user to learn about what log4net is - doing. - - - All log4net internal debug calls go to the standard output stream - whereas internal error messages are sent to the standard error output - stream. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Static constructor that initializes logging by reading - settings from the application configuration file. - - - - The log4net.Internal.Debug application setting - controls internal debugging. This setting should be set - to true to enable debugging. - - - The log4net.Internal.Quiet application setting - suppresses all internal logging including error messages. - This setting should be set to true to enable message - suppression. - - - - - - Writes log4net internal debug messages to the - standard output stream. - - The message to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal debug messages to the - standard output stream. - - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The message to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The message to log. - An exception to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The message to log. - - - All internal error messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes output to the standard output stream. - - The message to log. - - - Writes to both Console.Out and System.Diagnostics.Trace. - Note that the System.Diagnostics.Trace is not supported - on the Compact Framework. - - - If the AppDomain is not configured with a config file then - the call to System.Diagnostics.Trace may fail. This is only - an issue if you are programmatically creating your own AppDomains. - - - - - - Writes output to the standard error stream. - - The message to log. - - - Writes to both Console.Error and System.Diagnostics.Trace. - Note that the System.Diagnostics.Trace is not supported - on the Compact Framework. - - - If the AppDomain is not configured with a config file then - the call to System.Diagnostics.Trace may fail. This is only - an issue if you are programmatically creating your own AppDomains. - - - - - - Default debug level - - - - - In quietMode not even errors generate any output. - - - - - Gets or sets a value indicating whether log4net internal logging - is enabled or disabled. - - - true if log4net internal logging is enabled, otherwise - false. - - - - When set to true, internal debug level logging will be - displayed. - - - This value can be set by setting the application setting - log4net.Internal.Debug in the application configuration - file. - - - The default value is false, i.e. debugging is - disabled. - - - - - The following example enables internal debugging using the - application configuration file : - - - - - - - - - - - - - Gets or sets a value indicating whether log4net should generate no output - from internal logging, not even for errors. - - - true if log4net should generate no output at all from internal - logging, otherwise false. - - - - When set to true will cause internal logging at all levels to be - suppressed. This means that no warning or error reports will be logged. - This option overrides the setting and - disables all debug also. - - This value can be set by setting the application setting - log4net.Internal.Quiet in the application configuration file. - - - The default value is false, i.e. internal logging is not - disabled. - - - - The following example disables internal logging using the - application configuration file : - - - - - - - - - - - - Test if LogLog.Debug is enabled for output. - - - true if Debug is enabled - - - - Test if LogLog.Debug is enabled for output. - - - - - - Test if LogLog.Warn is enabled for output. - - - true if Warn is enabled - - - - Test if LogLog.Warn is enabled for output. - - - - - - Test if LogLog.Error is enabled for output. - - - true if Error is enabled - - - - Test if LogLog.Error is enabled for output. - - - - - - Represents a native error code and message. - - - - Represents a Win32 platform native error. - - - Nicko Cadell - Gert Driesen - - - - Create an instance of the class with the specified - error number and message. - - The number of the native error. - The message of the native error. - - - Create an instance of the class with the specified - error number and message. - - - - - - Create a new instance of the class for the last Windows error. - - - An instance of the class for the last windows error. - - - - The message for the error number is lookup up using the - native Win32 FormatMessage function. - - - - - - Create a new instance of the class. - - the error number for the native error - - An instance of the class for the specified - error number. - - - - The message for the specified error number is lookup up using the - native Win32 FormatMessage function. - - - - - - Retrieves the message corresponding with a Win32 message identifier. - - Message identifier for the requested message. - - The message corresponding with the specified message identifier. - - - - The message will be searched for in system message-table resource(s) - using the native FormatMessage function. - - - - - - Return error information string - - error information string - - - Return error information string - - - - - - Formats a message string. - - Formatting options, and how to interpret the parameter. - Location of the message definition. - Message identifier for the requested message. - Language identifier for the requested message. - If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . - If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. - Pointer to an array of values that are used as insert values in the formatted message. - - - The function requires a message definition as input. The message definition can come from a - buffer passed into the function. It can come from a message table resource in an - already-loaded module. Or the caller can ask the function to search the system's message - table resource(s) for the message definition. The function finds the message definition - in a message table resource based on a message identifier and a language identifier. - The function copies the formatted message text to an output buffer, processing any embedded - insert sequences if requested. - - - To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. - - - - - If the function succeeds, the return value is the number of TCHARs stored in the output - buffer, excluding the terminating null character. - - - If the function fails, the return value is zero. To get extended error information, - call . - - - - - - Gets the number of the native error. - - - The number of the native error. - - - - Gets the number of the native error. - - - - - - Gets the message of the native error. - - - The message of the native error. - - - - - Gets the message of the native error. - - - - - An always empty . - - - - A singleton implementation of the over a collection - that is empty and not modifiable. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Test if the enumerator can advance, if so advance. - - false as the cannot advance. - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will always return false. - - - - - - Resets the enumerator back to the start. - - - - As the enumerator is over an empty collection does nothing. - - - - - - The singleton instance of the . - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current key from the enumerator. - - - Throws an exception because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current value from the enumerator. - - The current value from the enumerator. - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current entry from the enumerator. - - - Throws an because the - never has a current entry. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - An always empty . - - - - A singleton implementation of the over a collection - that is empty and not modifiable. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Test if the enumerator can advance, if so advance - - false as the cannot advance. - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will always return false. - - - - - - Resets the enumerator back to the start. - - - - As the enumerator is over an empty collection does nothing. - - - - - - The singleton instance of the . - - - - - Get the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - A SecurityContext used when a SecurityContext is not required - - - - The is a no-op implementation of the - base class. It is used where a - is required but one has not been provided. - - - Nicko Cadell - - - - Singleton instance of - - - - Singleton instance of - - - - - - Private constructor - - - - Private constructor for singleton pattern. - - - - - - Impersonate this SecurityContext - - State supplied by the caller - null - - - No impersonation is done and null is always returned. - - - - - - Implements log4net's default error handling policy which consists - of emitting a message for the first error in an appender and - ignoring all subsequent errors. - - - - The error message is printed on the standard error output stream. - - - This policy aims at protecting an otherwise working application - from being flooded with error messages when logging fails. - - - Nicko Cadell - Gert Driesen - - - - Default Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - The prefix to use for each message. - - - Initializes a new instance of the class - with the specified prefix. - - - - - - Log an Error - - The error message. - The exception. - The internal error code. - - - Prints the message and the stack trace of the exception on the standard - error output stream. - - - - - - Log an Error - - The error message. - The exception. - - - Prints the message and the stack trace of the exception on the standard - error output stream. - - - - - - Log an error - - The error message. - - - Print a the error message passed as parameter on the standard - error output stream. - - - - - - Flag to indicate if it is the first error - - - - - String to prefix each message with - - - - - Is error logging enabled - - - - Is error logging enabled. Logging is only enabled for the - first error delivered to the . - - - - - - A convenience class to convert property values to specific types. - - - - Utility functions for converting types and parsing values. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Converts a string to a value. - - String to convert. - The default value. - The value of . - - - If is "true", then true is returned. - If is "false", then false is returned. - Otherwise, is returned. - - - - - - Parses a file size into a number. - - String to parse. - The default value. - The value of . - - - Parses a file size of the form: number[KB|MB|GB] into a - long value. It is scaled with the appropriate multiplier. - - - is returned when - cannot be converted to a value. - - - - - - Converts a string to an object. - - The target type to convert to. - The string to convert to an object. - - The object converted from a string or null when the - conversion failed. - - - - Converts a string to an object. Uses the converter registry to try - to convert the string value into the specified target type. - - - - - - Checks if there is an appropriate type conversion from the source type to the target type. - - The type to convert from. - The type to convert to. - true if there is a conversion from the source type to the target type. - - Checks if there is an appropriate type conversion from the source type to the target type. - - - - - - - Converts an object to the target type. - - The object to convert to the target type. - The type to convert to. - The converted object. - - - Converts an object to the target type. - - - - - - Instantiates an object given a class name. - - The fully qualified class name of the object to instantiate. - The class to which the new object should belong. - The object to return in case of non-fulfillment. - - An instance of the or - if the object could not be instantiated. - - - - Checks that the is a subclass of - . If that test fails or the object could - not be instantiated, then is returned. - - - - - - Performs variable substitution in string from the - values of keys found in . - - The string on which variable substitution is performed. - The dictionary to use to lookup variables. - The result of the substitutions. - - - The variable substitution delimiters are ${ and }. - - - For example, if props contains key=value, then the call - - - - string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); - - - - will set the variable s to "Value of key is value.". - - - If no value could be found for the specified key, then substitution - defaults to an empty string. - - - For example, if system properties contains no value for the key - "nonExistentKey", then the call - - - - string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); - - - - will set s to "Value of nonExistentKey is []". - - - An Exception is thrown if contains a start - delimiter "${" which is not balanced by a stop delimiter "}". - - - - - - Converts the string representation of the name or numeric value of one or - more enumerated constants to an equivalent enumerated object. - - The type to convert to. - The enum string value. - If true, ignore case; otherwise, regard case. - An object of type whose value is represented by . - - - - Most of the work of the class - is delegated to the PatternParser class. - - - - The PatternParser processes a pattern string and - returns a chain of objects. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The pattern to parse. - - - Initializes a new instance of the class - with the specified pattern string. - - - - - - Parses the pattern into a chain of pattern converters. - - The head of a chain of pattern converters. - - - Parses the pattern into a chain of pattern converters. - - - - - - Build the unified cache of converters from the static and instance maps - - the list of all the converter names - - - Build the unified cache of converters from the static and instance maps - - - - - - Internal method to parse the specified pattern to find specified matches - - the pattern to parse - the converter names to match in the pattern - - - The matches param must be sorted such that longer strings come before shorter ones. - - - - - - Process a parsed literal - - the literal text - - - - Process a parsed converter pattern - - the name of the converter - the optional option for the converter - the formatting info for the converter - - - - Resets the internal state of the parser and adds the specified pattern converter - to the chain. - - The pattern converter to add. - - - - The first pattern converter in the chain - - - - - the last pattern converter in the chain - - - - - The pattern - - - - - Internal map of converter identifiers to converter types - - - - This map overrides the static s_globalRulesRegistry map. - - - - - - Get the converter registry used by this parser - - - The converter registry used by this parser - - - - Get the converter registry used by this parser - - - - - - Sort strings by length - - - - that orders strings by string length. - The longest strings are placed first - - - - - - This class implements a patterned string. - - - - This string has embedded patterns that are resolved and expanded - when the string is formatted. - - - This class functions similarly to the - in that it accepts a pattern and renders it to a string. Unlike the - however the PatternString - does not render the properties of a specific but - of the process in general. - - - The recognized conversion pattern names are: - - - - Conversion Pattern Name - Effect - - - appdomain - - - Used to output the friendly name of the current AppDomain. - - - - - date - - - Used to output the date of the logging event in the local time zone. - To output the date in universal time use the %utcdate pattern. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %date{HH:mm:ss,fff} or - %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %date{ISO8601} or %date{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - env - - - Used to output the a specific environment variable. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %env{COMPUTERNAME} would include the value - of the COMPUTERNAME environment variable. - - - The env pattern is not supported on the .NET Compact Framework. - - - - - identity - - - Used to output the user name for the currently active user - (Principal.Identity.Name). - - - - - newline - - - Outputs the platform dependent line separator character or - characters. - - - This conversion pattern name offers the same performance as using - non-portable line separator strings such as "\n", or "\r\n". - Thus, it is the preferred way of specifying a line separator. - - - - - processid - - - Used to output the system process ID for the current process. - - - - - property - - - Used to output a specific context property. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %property{user} would include the value - from the property that is keyed by the string 'user'. Each property value - that is to be included in the log must be specified separately. - Properties are stored in logging contexts. By default - the log4net:HostName property is set to the name of machine on - which the event was originally logged. - - - If no key is specified, e.g. %property then all the keys and their - values are printed in a comma separated list. - - - The properties of an event are combined from a number of different - contexts. These are listed below in the order in which they are searched. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - random - - - Used to output a random string of characters. The string is made up of - uppercase letters and numbers. By default the string is 4 characters long. - The length of the string can be specified within braces directly following the - pattern specifier, e.g. %random{8} would output an 8 character string. - - - - - username - - - Used to output the WindowsIdentity for the currently - active user. - - - - - utcdate - - - Used to output the date of the logging event in universal time. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %utcdate{HH:mm:ss,fff} or - %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %utcdate{ISO8601} or %utcdate{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - % - - - The sequence %% outputs a single percent sign. - - - - - - Additional pattern converters may be registered with a specific - instance using or - . - - - See the for details on the - format modifiers supported by the patterns. - - - Nicko Cadell - - - - Internal map of converter identifiers to converter types. - - - - - the pattern - - - - - the head of the pattern converter chain - - - - - patterns defined on this PatternString only - - - - - Initialize the global registry - - - - - Default constructor - - - - Initialize a new instance of - - - - - - Constructs a PatternString - - The pattern to use with this PatternString - - - Initialize a new instance of with the pattern specified. - - - - - - Initialize object options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Create the used to parse the pattern - - the pattern to parse - The - - - Returns PatternParser used to parse the conversion string. Subclasses - may override this to return a subclass of PatternParser which recognize - custom conversion pattern name. - - - - - - Produces a formatted string as specified by the conversion pattern. - - The TextWriter to write the formatted event to - - - Format the pattern to the . - - - - - - Format the pattern as a string - - the pattern formatted as a string - - - Format the pattern to a string. - - - - - - Add a converter to this PatternString - - the converter info - - - This version of the method is used by the configurator. - Programmatic users should use the alternative method. - - - - - - Add a converter to this PatternString - - the name of the conversion pattern for this converter - the type of the converter - - - Add a converter to this PatternString - - - - - - Gets or sets the pattern formatting string - - - The pattern formatting string - - - - The ConversionPattern option. This is the string which - controls formatting and consists of a mix of literal content and - conversion specifiers. - - - - - - Wrapper class used to map converter names to converter types - - - - Wrapper class used to map converter names to converter types - - - - - - default constructor - - - - - Gets or sets the name of the conversion pattern - - - The name of the conversion pattern - - - - Gets or sets the name of the conversion pattern - - - - - - Gets or sets the type of the converter - - - The type of the converter - - - - Gets or sets the type of the converter - - - - - - String keyed object map. - - - - While this collection is serializable only member - objects that are serializable will - be serialized along with this collection. - - - Nicko Cadell - Gert Driesen - - - - String keyed object map that is read only. - - - - This collection is readonly and cannot be modified. - - - While this collection is serializable only member - objects that are serializable will - be serialized along with this collection. - - - Nicko Cadell - Gert Driesen - - - - The Hashtable used to store the properties data - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Copy Constructor - - properties to copy - - - Initializes a new instance of the class. - - - - - - Deserialization constructor - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Gets the key names. - - An array of all the keys. - - - Gets the key names. - - - - - - Test if the dictionary contains a specified key - - the key to look for - true if the dictionary contains the specified key - - - Test if the dictionary contains a specified key - - - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - Serializes this object into the provided. - - - - - - See - - - - - See - - - - - - See - - - - - - - Remove all properties from the properties collection - - - - - See - - - - - - - See - - - - - - - See - - - - - Gets or sets the value of the property with the specified key. - - - The value of the property with the specified key. - - The key of the property to get or set. - - - The property value will only be serialized if it is serializable. - If it cannot be serialized it will be silently ignored if - a serialization operation is performed. - - - - - - The hashtable used to store the properties - - - The internal collection used to store the properties - - - - The hashtable used to store the properties - - - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - The number of properties in this collection - - - - - See - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - properties to copy - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class - with serialized data. - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Because this class is sealed the serialization constructor is private. - - - - - - Remove the entry with the specified key from this dictionary - - the key for the entry to remove - - - Remove the entry with the specified key from this dictionary - - - - - - See - - an enumerator - - - Returns a over the contest of this collection. - - - - - - See - - the key to remove - - - Remove the entry with the specified key from this dictionary - - - - - - See - - the key to lookup in the collection - true if the collection contains the specified key - - - Test if this collection contains a specified key. - - - - - - Remove all properties from the properties collection - - - - Remove all properties from the properties collection - - - - - - See - - the key - the value to store for the key - - - Store a value for the specified . - - - Thrown if the is not a string - - - - See - - - - - - - See - - - - - Gets or sets the value of the property with the specified key. - - - The value of the property with the specified key. - - The key of the property to get or set. - - - The property value will only be serialized if it is serializable. - If it cannot be serialized it will be silently ignored if - a serialization operation is performed. - - - - - - See - - - false - - - - This collection is modifiable. This property always - returns false. - - - - - - See - - - The value for the key specified. - - - - Get or set a value for the specified . - - - Thrown if the is not a string - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - A that ignores the message - - - - This writer is used in special cases where it is necessary - to protect a writer from being closed by a client. - - - Nicko Cadell - - - - Constructor - - the writer to actually write to - - - Create a new ProtectCloseTextWriter using a writer - - - - - - Attach this instance to a different underlying - - the writer to attach to - - - Attach this instance to a different underlying - - - - - - Does not close the underlying output writer. - - - - Does not close the underlying output writer. - This method does nothing. - - - - - - Defines a lock that supports single writers and multiple readers - - - - ReaderWriterLock is used to synchronize access to a resource. - At any given time, it allows either concurrent read access for - multiple threads, or write access for a single thread. In a - situation where a resource is changed infrequently, a - ReaderWriterLock provides better throughput than a simple - one-at-a-time lock, such as . - - - If a platform does not support a System.Threading.ReaderWriterLock - implementation then all readers and writers are serialized. Therefore - the caller must not rely on multiple simultaneous readers. - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Acquires a reader lock - - - - blocks if a different thread has the writer - lock, or if at least one thread is waiting for the writer lock. - - - - - - Decrements the lock count - - - - decrements the lock count. When the count - reaches zero, the lock is released. - - - - - - Acquires the writer lock - - - - This method blocks if another thread has a reader lock or writer lock. - - - - - - Decrements the lock count on the writer lock - - - - ReleaseWriterLock decrements the writer lock count. - When the count reaches zero, the writer lock is released. - - - - - - A that can be and reused - - - - A that can be and reused. - This uses a single buffer for string operations. - - - Nicko Cadell - - - - Create an instance of - - the format provider to use - - - Create an instance of - - - - - - Override Dispose to prevent closing of writer - - flag - - - Override Dispose to prevent closing of writer - - - - - - Reset this string writer so that it can be reused. - - the maximum buffer capacity before it is trimmed - the default size to make the buffer - - - Reset this string writer so that it can be reused. - The internal buffers are cleared and reset. - - - - - - Utility class for system specific information. - - - - Utility class of static methods for system specific information. - - - Nicko Cadell - Gert Driesen - Alexey Solofnenko - - - - Private constructor to prevent instances. - - - - Only static methods are exposed from this type. - - - - - - Initialize default values for private static fields. - - - - Only static methods are exposed from this type. - - - - - - Gets the assembly location path for the specified assembly. - - The assembly to get the location for. - The location of the assembly. - - - This method does not guarantee to return the correct path - to the assembly. If only tries to give an indication as to - where the assembly was loaded from. - - - - - - Gets the fully qualified name of the , including - the name of the assembly from which the was - loaded. - - The to get the fully qualified name for. - The fully qualified name for the . - - - This is equivalent to the Type.AssemblyQualifiedName property, - but this method works on the .NET Compact Framework 1.0 as well as - the full .NET runtime. - - - - - - Gets the short name of the . - - The to get the name for. - The short name of the . - - - The short name of the assembly is the - without the version, culture, or public key. i.e. it is just the - assembly's file name without the extension. - - - Use this rather than Assembly.GetName().Name because that - is not available on the Compact Framework. - - - Because of a FileIOPermission security demand we cannot do - the obvious Assembly.GetName().Name. We are allowed to get - the of the assembly so we - start from there and strip out just the assembly name. - - - - - - Gets the file name portion of the , including the extension. - - The to get the file name for. - The file name of the assembly. - - - Gets the file name portion of the , including the extension. - - - - - - Loads the type specified in the type string. - - A sibling type to use to load the type. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified, it will be loaded from the assembly - containing the specified relative type. If the type is not found in the assembly - then all the loaded assemblies will be searched for the type. - - - - - - Loads the type specified in the type string. - - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the - assembly that is directly calling this method. If the type is not found - in the assembly then all the loaded assemblies will be searched for the type. - - - - - - Loads the type specified in the type string. - - An assembly to load the type from. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the specified - assembly. If the type is not found in the assembly then all the loaded assemblies - will be searched for the type. - - - - - - Generate a new guid - - A new Guid - - - Generate a new guid - - - - - - Create an - - The name of the parameter that caused the exception - The value of the argument that causes this exception - The message that describes the error - the ArgumentOutOfRangeException object - - - Create a new instance of the class - with a specified error message, the parameter name, and the value - of the argument. - - - The Compact Framework does not support the 3 parameter constructor for the - type. This method provides an - implementation that works for all platforms. - - - - - - Parse a string into an value - - the string to parse - out param where the parsed value is placed - true if the string was able to be parsed into an integer - - - Attempts to parse the string into an integer. If the string cannot - be parsed then this method returns false. The method does not throw an exception. - - - - - - Parse a string into an value - - the string to parse - out param where the parsed value is placed - true if the string was able to be parsed into an integer - - - Attempts to parse the string into an integer. If the string cannot - be parsed then this method returns false. The method does not throw an exception. - - - - - - Lookup an application setting - - the application settings key to lookup - the value for the key, or null - - - Configuration APIs are not supported under the Compact Framework - - - - - - Convert a path into a fully qualified local file path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - The path specified must be a local file path, a URI is not supported. - - - - - - Creates a new case-insensitive instance of the class with the default initial capacity. - - A new case-insensitive instance of the class with the default initial capacity - - - The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. - - - - - - Gets an empty array of types. - - - - The Type.EmptyTypes field is not available on - the .NET Compact Framework 1.0. - - - - - - Cache the host name for the current machine - - - - - Cache the application friendly name - - - - - Text to output when a null is encountered. - - - - - Text to output when an unsupported feature is requested. - - - - - Start time for the current process. - - - - - Gets the system dependent line terminator. - - - The system dependent line terminator. - - - - Gets the system dependent line terminator. - - - - - - Gets the base directory for this . - - The base directory path for the current . - - - Gets the base directory for this . - - - The value returned may be either a local file path or a URI. - - - - - - Gets the path to the configuration file for the current . - - The path to the configuration file for the current . - - - The .NET Compact Framework 1.0 does not have a concept of a configuration - file. For this runtime, we use the entry assembly location as the root for - the configuration file name. - - - The value returned may be either a local file path or a URI. - - - - - - Gets the path to the file that first executed in the current . - - The path to the entry assembly. - - - Gets the path to the file that first executed in the current . - - - - - - Gets the ID of the current thread. - - The ID of the current thread. - - - On the .NET framework, the AppDomain.GetCurrentThreadId method - is used to obtain the thread ID for the current thread. This is the - operating system ID for the thread. - - - On the .NET Compact Framework 1.0 it is not possible to get the - operating system thread ID for the current thread. The native method - GetCurrentThreadId is implemented inline in a header file - and cannot be called. - - - On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this - gives a stable id unrelated to the operating system thread ID which may - change if the runtime is using fibers. - - - - - - Get the host name or machine name for the current machine - - - The hostname or machine name - - - - Get the host name or machine name for the current machine - - - The host name () or - the machine name (Environment.MachineName) for - the current machine, or if neither of these are available - then NOT AVAILABLE is returned. - - - - - - Get this application's friendly name - - - The friendly name of this application as a string - - - - If available the name of the application is retrieved from - the AppDomain using AppDomain.CurrentDomain.FriendlyName. - - - Otherwise the file name of the entry assembly is used. - - - - - - Get the start time for the current process. - - - - This is the time at which the log4net library was loaded into the - AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime - this is not the start time for the current process. - - - The log4net library should be loaded by an application early during its - startup, therefore this start time should be a good approximation for - the actual start time. - - - Note that AppDomains may be loaded and unloaded within the - same process without the process terminating, however this start time - will be set per AppDomain. - - - - - - Text to output when a null is encountered. - - - - Use this value to indicate a null has been encountered while - outputting a string representation of an item. - - - The default value is (null). This value can be overridden by specifying - a value for the log4net.NullText appSetting in the application's - .config file. - - - - - - Text to output when an unsupported feature is requested. - - - - Use this value when an unsupported feature is requested. - - - The default value is NOT AVAILABLE. This value can be overridden by specifying - a value for the log4net.NotAvailableText appSetting in the application's - .config file. - - - - - - Utility class that represents a format string. - - - - Utility class that represents a format string. - - - Nicko Cadell - - - - Initialise the - - An that supplies culture-specific formatting information. - A containing zero or more format items. - An array containing zero or more objects to format. - - - - Format the string and arguments - - the formatted string - - - - Replaces the format item in a specified with the text equivalent - of the value of a corresponding instance in a specified array. - A specified parameter supplies culture-specific formatting information. - - An that supplies culture-specific formatting information. - A containing zero or more format items. - An array containing zero or more objects to format. - - A copy of format in which the format items have been replaced by the - equivalent of the corresponding instances of in args. - - - - This method does not throw exceptions. If an exception thrown while formatting the result the - exception and arguments are returned in the result string. - - - - - - Process an error during StringFormat - - - - - Dump the contents of an array into a string builder - - - - - Dump an object to a string - - - - - Implementation of Properties collection for the - - - - Class implements a collection of properties that is specific to each thread. - The class is not synchronized as each thread has its own . - - - Nicko Cadell - - - - The thread local data slot to use to store a PropertiesDictionary. - - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property - - the key for the entry to remove - - - Remove a property - - - - - - Clear all properties - - - - Clear all properties - - - - - - Get the PropertiesDictionary for this thread. - - create the dictionary if it does not exist, otherwise return null if is does not exist - the properties for this thread - - - The collection returned is only to be used on the calling thread. If the - caller needs to share the collection between different threads then the - caller must clone the collection before doing so. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Gets or sets the value of a property - - - - - - Implementation of Stack for the - - - - Implementation of Stack for the - - - Nicko Cadell - - - - The stack store. - - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Clears all the contextual information held in this stack. - - - - Clears all the contextual information held in this stack. - Only call this if you think that this tread is being reused after - a previous call execution which may not have completed correctly. - You do not need to use this method if you always guarantee to call - the method of the - returned from even in exceptional circumstances, - for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) - syntax. - - - - - - Removes the top context from this stack. - - The message in the context that was removed from the top of this stack. - - - Remove the top context from this stack, and return - it to the caller. If this stack is empty then an - empty string (not ) is returned. - - - - - - Pushes a new context message into this stack. - - The new context message. - - An that can be used to clean up the context stack. - - - - Pushes a new context onto this stack. An - is returned that can be used to clean up this stack. This - can be easily combined with the using keyword to scope the - context. - - - Simple example of using the Push method with the using keyword. - - using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) - { - log.Warn("This should have an ThreadContext Stack message"); - } - - - - - - Gets the current context information for this stack. - - The current context information. - - - - Gets the current context information for this stack. - - Gets the current context information - - - Gets the current context information for this stack. - - - - - - Get a portable version of this object - - the portable instance of this object - - - Get a cross thread portable version of this object - - - - - - The number of messages in the stack - - - The current number of messages in the stack - - - - The current number of messages in the stack. That is - the number of times has been called - minus the number of times has been called. - - - - - - Gets and sets the internal stack used by this - - The internal storage stack - - - This property is provided only to support backward compatability - of the . Tytpically the internal stack should not - be modified. - - - - - - Inner class used to represent a single context frame in the stack. - - - - Inner class used to represent a single context frame in the stack. - - - - - - Constructor - - The message for this context. - The parent context in the chain. - - - Initializes a new instance of the class - with the specified message and parent context. - - - - - - Get the message. - - The message. - - - Get the message. - - - - - - Gets the full text of the context down to the root level. - - - The full text of the context down to the root level. - - - - Gets the full text of the context down to the root level. - - - - - - Struct returned from the method. - - - - This struct implements the and is designed to be used - with the pattern to remove the stack frame at the end of the scope. - - - - - - The ThreadContextStack internal stack - - - - - The depth to trim the stack to when this instance is disposed - - - - - Constructor - - The internal stack used by the ThreadContextStack. - The depth to return the stack to when this object is disposed. - - - Initializes a new instance of the class with - the specified stack and return depth. - - - - - - Returns the stack to the correct depth. - - - - Returns the stack to the correct depth. - - - - - - Implementation of Stacks collection for the - - - - Implementation of Stacks collection for the - - - Nicko Cadell - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Gets the named thread context stack - - - The named stack - - - - Gets the named thread context stack - - - - - - Utility class for transforming strings. - - - - Utility class for transforming strings. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Write a string to an - - the writer to write to - the string to write - The string to replace non XML compliant chars with - - - The test is escaped either using XML escape entities - or using CDATA sections. - - - - - - Replace invalid XML characters in text string - - the XML text input string - the string to use in place of invalid characters - A string that does not contain invalid XML characters. - - - Certain Unicode code points are not allowed in the XML InfoSet, for - details see: http://www.w3.org/TR/REC-xml/#charsets. - - - This method replaces any illegal characters in the input string - with the mask string specified. - - - - - - Count the number of times that the substring occurs in the text - - the text to search - the substring to find - the number of times the substring occurs in the text - - - The substring is assumed to be non repeating within itself. - - - - - - Impersonate a Windows Account - - - - This impersonates a Windows account. - - - How the impersonation is done depends on the value of . - This allows the context to either impersonate a set of user credentials specified - using username, domain name and password or to revert to the process credentials. - - - - - - Default constructor - - - - Default constructor - - - - - - Initialize the SecurityContext based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The security context will try to Logon the specified user account and - capture a primary token for impersonation. - - - The required , - or properties were not specified. - - - - Impersonate the Windows account specified by the and properties. - - caller provided state - - An instance that will revoke the impersonation of this SecurityContext - - - - Depending on the property either - impersonate a user using credentials supplied or revert - to the process credentials. - - - - - - Create a given the userName, domainName and password. - - the user name - the domain name - the password - the for the account specified - - - Uses the Windows API call LogonUser to get a principal token for the account. This - token is used to initialize the WindowsIdentity. - - - - - - Gets or sets the impersonation mode for this security context - - - The impersonation mode for this security context - - - - Impersonate either a user with user credentials or - revert this thread to the credentials of the process. - The value is one of the - enum. - - - The default value is - - - When the mode is set to - the user's credentials are established using the - , and - values. - - - When the mode is set to - no other properties need to be set. If the calling thread is - impersonating then it will be reverted back to the process credentials. - - - - - - Gets or sets the Windows username for this security context - - - The Windows username for this security context - - - - This property must be set if - is set to (the default setting). - - - - - - Gets or sets the Windows domain name for this security context - - - The Windows domain name for this security context - - - - The default value for is the local machine name - taken from the property. - - - This property must be set if - is set to (the default setting). - - - - - - Sets the password for the Windows account specified by the and properties. - - - The password for the Windows account specified by the and properties. - - - - This property must be set if - is set to (the default setting). - - - - - - The impersonation modes for the - - - - See the property for - details. - - - - - - Impersonate a user using the credentials supplied - - - - - Revert this the thread to the credentials of the process - - - - - Adds to - - - - Helper class to expose the - through the interface. - - - - - - Constructor - - the impersonation context being wrapped - - - Constructor - - - - - - Revert the impersonation - - - - Revert the impersonation - - - - - - The log4net Global Context. - - - - The GlobalContext provides a location for global debugging - information to be stored. - - - The global context has a properties map and these properties can - be included in the output of log messages. The - supports selecting and outputing these properties. - - - By default the log4net:HostName property is set to the name of - the current machine. - - - - - GlobalContext.Properties["hostname"] = Environment.MachineName; - - - - Nicko Cadell - - - - Private Constructor. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - The global context properties instance - - - - - The global properties map. - - - The global properties map. - - - - The global properties map. - - - - - - The log4net Logical Thread Context. - - - - The LogicalThreadContext provides a location for specific debugging - information to be stored. - The LogicalThreadContext properties override any or - properties with the same name. - - - The Logical Thread Context has a properties map and a stack. - The properties and stack can - be included in the output of log messages. The - supports selecting and outputting these properties. - - - The Logical Thread Context provides a diagnostic context for the current call context. - This is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The Logical Thread Context is managed on a per basis. - - - Example of using the thread context properties to store a username. - - LogicalThreadContext.Properties["user"] = userName; - log.Info("This log message has a LogicalThreadContext Property called 'user'"); - - - Example of how to push a message into the context stack - - using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) - { - log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); - - } // at the end of the using block the message is automatically popped - - - - Nicko Cadell - - - - Private Constructor. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - The thread context properties instance - - - - - The thread context stacks instance - - - - - The thread properties map - - - The thread properties map - - - - The LogicalThreadContext properties override any - or properties with the same name. - - - - - - The thread stacks - - - stack map - - - - The logical thread stacks. - - - - - - This class is used by client applications to request logger instances. - - - - This class has static methods that are used by a client to request - a logger instance. The method is - used to retrieve a logger. - - - See the interface for more details. - - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - Returns the named logger if it exists. - - Returns the named logger if it exists. - - - - If the named logger exists (in the default repository) then it - returns a reference to the logger, otherwise it returns null. - - - The fully qualified logger name to look for. - The logger found, or null if no logger could be found. - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the specified repository) then it - returns a reference to the logger, otherwise it returns - null. - - - The repository to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the logger doesn't exist in the specified - repository. - - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the repository for the specified assembly) then it - returns a reference to the logger, otherwise it returns - null. - - - The assembly to use to lookup the repository. - The fully qualified logger name to look for. - - The logger, or null if the logger doesn't exist in the specified - assembly's repository. - - - - Get the currently defined loggers. - - Returns all the currently defined loggers in the default repository. - - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified repository. - - The repository to lookup in. - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified assembly's repository. - - The assembly to use to lookup the repository. - - The root logger is not included in the returned array. - - All the defined loggers. - - - Get or create a logger. - - Retrieves or creates a named logger. - - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The repository to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The assembly to use to lookup the repository. - The name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Get the logger for the fully qualified name of the type specified. - - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The repository to lookup in. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The assembly to use to lookup the repository. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - Shutdown a logger repository. - - Shuts down the default repository. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - default repository. - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The repository to shutdown. - - - - Shuts down the repository specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository. The repository is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The assembly to use to lookup the repository. - - - Reset the configuration of a repository - - Resets all values contained in this repository instance to their defaults. - - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The repository to reset. - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The assembly to use to lookup the repository to reset. - - - Get the logger repository. - - Returns the default instance. - - - - Gets the for the repository specified - by the callers assembly (). - - - The instance for the default repository. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The repository to lookup in. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The assembly to use to lookup the repository. - - - Get a logger repository. - - Returns the default instance. - - - - Gets the for the repository specified - by the callers assembly (). - - - The instance for the default repository. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The repository to lookup in. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The assembly to use to lookup the repository. - - - Create a domain - - Creates a repository with the specified repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to will return - the same repository instance. - - - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - Create a logger repository. - - Creates a repository with the specified repository type. - - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The created will be associated with the repository - specified such that a call to will return - the same repository instance. - - - - - - Creates a repository with the specified name. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name. - - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - The specified repository already exists. - - - - Creates a repository for the specified assembly and repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - - Creates a repository for the specified assembly and repository type. - - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - - Gets the list of currently defined repositories. - - - - Get an array of all the objects that have been created. - - - An array of all the known objects. - - - - Looks up the wrapper object for the logger specified. - - The logger to get the wrapper for. - The wrapper for the logger specified. - - - - Looks up the wrapper objects for the loggers specified. - - The loggers to get the wrappers for. - The wrapper objects for the loggers specified. - - - - Create the objects used by - this manager. - - The logger to wrap. - The wrapper for the logger specified. - - - - The wrapper map to use to hold the objects. - - - - - Implementation of Mapped Diagnostic Contexts. - - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - The MDC class is similar to the class except that it is - based on a map instead of a stack. It provides mapped - diagnostic contexts. A Mapped Diagnostic Context, or - MDC in short, is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The MDC is managed on a per thread basis. - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Gets the context value identified by the parameter. - - The key to lookup in the MDC. - The string value held for the key, or a null reference if no corresponding value is found. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - If the parameter does not look up to a - previously defined context then null will be returned. - - - - - - Add an entry to the MDC - - The key to store the value under. - The value to store. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Puts a context value (the parameter) as identified - with the parameter into the current thread's - context map. - - - If a value is already defined for the - specified then the value will be replaced. If the - is specified as null then the key value mapping will be removed. - - - - - - Removes the key value mapping for the key specified. - - The key to remove. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Remove the specified entry from this thread's MDC - - - - - - Clear all entries in the MDC - - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Remove all the entries from this thread's MDC - - - - - - Implementation of Nested Diagnostic Contexts. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - A Nested Diagnostic Context, or NDC in short, is an instrument - to distinguish interleaved log output from different sources. Log - output is typically interleaved when a server handles multiple - clients near-simultaneously. - - - Interleaved log output can still be meaningful if each log entry - from different contexts had a distinctive stamp. This is where NDCs - come into play. - - - Note that NDCs are managed on a per thread basis. The NDC class - is made up of static methods that operate on the context of the - calling thread. - - - How to push a message into the context - - using(NDC.Push("my context message")) - { - ... all log calls will have 'my context message' included ... - - } // at the end of the using block the message is automatically removed - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Clears all the contextual information held on the current thread. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Clears the stack of NDC data held on the current thread. - - - - - - Creates a clone of the stack of context information. - - A clone of the context info for this thread. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - The results of this method can be passed to the - method to allow child threads to inherit the context of their - parent thread. - - - - - - Inherits the contextual information from another thread. - - The context stack to inherit. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - This thread will use the context information from the stack - supplied. This can be used to initialize child threads with - the same contextual information as their parent threads. These - contexts will NOT be shared. Any further contexts that - are pushed onto the stack will not be visible to the other. - Call to obtain a stack to pass to - this method. - - - - - - Removes the top context from the stack. - - - The message in the context that was removed from the top - of the stack. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Remove the top context from the stack, and return - it to the caller. If the stack is empty then an - empty string (not null) is returned. - - - - - - Pushes a new context message. - - The new context message. - - An that can be used to clean up - the context stack. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Pushes a new context onto the context stack. An - is returned that can be used to clean up the context stack. This - can be easily combined with the using keyword to scope the - context. - - - Simple example of using the Push method with the using keyword. - - using(log4net.NDC.Push("NDC_Message")) - { - log.Warn("This should have an NDC message"); - } - - - - - - Removes the context information for this thread. It is - not required to call this method. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - This method is not implemented. - - - - - - Forces the stack depth to be at most . - - The maximum depth of the stack - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Forces the stack depth to be at most . - This may truncate the head of the stack. This only affects the - stack in the current thread. Also it does not prevent it from - growing, it only sets the maximum depth at the time of the - call. This can be used to return to a known context depth. - - - - - - Gets the current context depth. - - The current context depth. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - The number of context values pushed onto the context stack. - - - Used to record the current depth of the context. This can then - be restored using the method. - - - - - - - The log4net Thread Context. - - - - The ThreadContext provides a location for thread specific debugging - information to be stored. - The ThreadContext properties override any - properties with the same name. - - - The thread context has a properties map and a stack. - The properties and stack can - be included in the output of log messages. The - supports selecting and outputting these properties. - - - The Thread Context provides a diagnostic context for the current thread. - This is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The Thread Context is managed on a per thread basis. - - - Example of using the thread context properties to store a username. - - ThreadContext.Properties["user"] = userName; - log.Info("This log message has a ThreadContext Property called 'user'"); - - - Example of how to push a message into the context stack - - using(ThreadContext.Stacks["NDC"].Push("my context message")) - { - log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); - - } // at the end of the using block the message is automatically popped - - - - Nicko Cadell - - - - Private Constructor. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - The thread context properties instance - - - - - The thread context stacks instance - - - - - The thread properties map - - - The thread properties map - - - - The ThreadContext properties override any - properties with the same name. - - - - - - The thread stacks - - - stack map - - - - The thread local stacks. - - - - - diff --git a/src/External-Bin/Net/1.1/readme.txt b/src/External-Bin/Net/1.1/readme.txt deleted file mode 100644 index 78bf2e9..0000000 --- a/src/External-Bin/Net/1.1/readme.txt +++ /dev/null @@ -1,8 +0,0 @@ - -Log4NET 1.2.10.0 -=================== -log4net.dll - -Castle dynamic proxy 1.1.5.0 -============================ -Castle.DynamicProxy.dll \ No newline at end of file diff --git a/src/External-Bin/Net/2.0/Castle.Core.dll b/src/External-Bin/Net/2.0/Castle.Core.dll deleted file mode 100644 index 0207baeae72b38d760b2fa2be7c7c85e4022fcf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 296960 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. - * - */ diff --git a/src/External-Bin/Net/2.0/log4net.xml b/src/External-Bin/Net/2.0/log4net.xml deleted file mode 100644 index db9e99f..0000000 --- a/src/External-Bin/Net/2.0/log4net.xml +++ /dev/null @@ -1,28655 +0,0 @@ - - - - log4net - - - - - Appender that logs to a database. - - - - appends logging events to a table within a - database. The appender can be configured to specify the connection - string by setting the property. - The connection type (provider) can be specified by setting the - property. For more information on database connection strings for - your specific database see http://www.connectionstrings.com/. - - - Records are written into the database either using a prepared - statement or a stored procedure. The property - is set to (System.Data.CommandType.Text) to specify a prepared statement - or to (System.Data.CommandType.StoredProcedure) to specify a stored - procedure. - - - The prepared statement text or the name of the stored procedure - must be set in the property. - - - The prepared statement or stored procedure can take a number - of parameters. Parameters are added using the - method. This adds a single to the - ordered list of parameters. The - type may be subclassed if required to provide database specific - functionality. The specifies - the parameter name, database type, size, and how the value should - be generated using a . - - - - An example of a SQL Server table that could be logged to: - - CREATE TABLE [dbo].[Log] ( - [ID] [int] IDENTITY (1, 1) NOT NULL , - [Date] [datetime] NOT NULL , - [Thread] [varchar] (255) NOT NULL , - [Level] [varchar] (20) NOT NULL , - [Logger] [varchar] (255) NOT NULL , - [Message] [varchar] (4000) NOT NULL - ) ON [PRIMARY] - - - - An example configuration to log to the above table: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Julian Biddle - Nicko Cadell - Gert Driesen - Lance Nehring - - - - Abstract base class implementation of that - buffers events in a fixed size buffer. - - - - This base class should be used by appenders that need to buffer a - number of events before logging them. For example the - buffers events and then submits the entire contents of the buffer to - the underlying database in one go. - - - Subclasses should override the - method to deliver the buffered events. - - The BufferingAppenderSkeleton maintains a fixed size cyclic - buffer of events. The size of the buffer is set using - the property. - - A is used to inspect - each event as it arrives in the appender. If the - triggers, then the current buffer is sent immediately - (see ). Otherwise the event - is stored in the buffer. For example, an evaluator can be used to - deliver the events immediately when an ERROR event arrives. - - - The buffering appender can be configured in a mode. - By default the appender is NOT lossy. When the buffer is full all - the buffered events are sent with . - If the property is set to true then the - buffer will not be sent when it is full, and new events arriving - in the appender will overwrite the oldest event in the buffer. - In lossy mode the buffer will only be sent when the - triggers. This can be useful behavior when you need to know about - ERROR events but not about events with a lower level, configure an - evaluator that will trigger when an ERROR event arrives, the whole - buffer will be sent which gives a history of events leading up to - the ERROR event. - - - Nicko Cadell - Gert Driesen - - - - Abstract base class implementation of . - - - - This class provides the code for common functionality, such - as support for threshold filtering and support for general filters. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface for your own strategies for printing log statements. - - - - Implementors should consider extending the - class which provides a default implementation of this interface. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Log the logging event in Appender specific way. - - The event to log - - - This method is called to log a message into this appender. - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - The name uniquely identifies the appender. - - - - - Interface for appenders that support bulk logging. - - - - This interface extends the interface to - support bulk logging of objects. Appenders - should only implement this interface if they can bulk log efficiently. - - - Nicko Cadell - - - - Log the array of logging events in Appender specific way. - - The events to log - - - This method is called to log an array of events into this appender. - - - - - - Interface used to delay activate a configured object. - - - - This allows an object to defer activation of its options until all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - - If a component implements this interface then the method - must be called by the container after its all the configured properties have been set - and before the component can be used. - - - Nicko Cadell - - - - Activate the options that were previously set with calls to properties. - - - - This allows an object to defer activation of its options until all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - - If a component implements this interface then this method must be called - after its properties have been set before the component can be used. - - - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - Default constructor - - - Empty default constructor - - - - - Finalizes this appender by calling the implementation's - method. - - - - If this appender has not been closed then the Finalize method - will call . - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Closes the appender and release resources. - - - - Release any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - This method cannot be overridden by subclasses. This method - delegates the closing of the appender to the - method which must be overridden in the subclass. - - - - - - Performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific - method. - - The event to log. - - - This method cannot be overridden by derived classes. A - derived class should override the method - which is called by this method. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - Calls and checks that - it returns true. - - - - - If all of the above steps succeed then the - will be passed to the abstract method. - - - - - - Performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific - method. - - The array of events to log. - - - This method cannot be overridden by derived classes. A - derived class should override the method - which is called by this method. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - Calls and checks that - it returns true. - - - - - If all of the above steps succeed then the - will be passed to the method. - - - - - - Test if the logging event should we output by this appender - - the event to test - true if the event should be output, false if the event should be ignored - - - This method checks the logging event against the threshold level set - on this appender and also against the filters specified on this - appender. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - - - - - Adds a filter to the end of the filter chain. - - the filter to add to this appender - - - The Filters are organized in a linked list. - - - Setting this property causes the new filter to be pushed onto the - back of the filter chain. - - - - - - Clears the filter list for this appender. - - - - Clears the filter list for this appender. - - - - - - Checks if the message level is below this appender's threshold. - - to test against. - - - If there is no threshold set, then the return value is always true. - - - - true if the meets the - requirements of this appender. - - - - - Is called when the appender is closed. Derived classes should override - this method if resources need to be released. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Subclasses of should implement this method - to perform actual logging. - - The event to append. - - - A subclass must implement this method to perform - logging of the . - - This method will be called by - if all the conditions listed for that method are met. - - - To restrict the logging of events in the appender - override the method. - - - - - - Append a bulk array of logging events. - - the array of logging events - - - This base class implementation calls the - method for each element in the bulk array. - - - A sub class that can better process a bulk array of events should - override this method in addition to . - - - - - - Called before as a precondition. - - - - This method is called by - before the call to the abstract method. - - - This method can be overridden in a subclass to extend the checks - made before the event is passed to the method. - - - A subclass should ensure that they delegate this call to - this base class if it is overridden. - - - true if the call to should proceed. - - - - Renders the to a string. - - The event to render. - The event rendered as a string. - - - Helper method to render a to - a string. This appender must have a - set to render the to - a string. - - If there is exception data in the logging event and - the layout does not process the exception, this method - will append the exception text to the rendered string. - - - Where possible use the alternative version of this method - . - That method streams the rendering onto an existing Writer - which can give better performance if the caller already has - a open and ready for writing. - - - - - - Renders the to a string. - - The event to render. - The TextWriter to write the formatted event to - - - Helper method to render a to - a string. This appender must have a - set to render the to - a string. - - If there is exception data in the logging event and - the layout does not process the exception, this method - will append the exception text to the rendered string. - - - Use this method in preference to - where possible. If, however, the caller needs to render the event - to a string then does - provide an efficient mechanism for doing so. - - - - - - The layout of this appender. - - - See for more information. - - - - - The name of this appender. - - - See for more information. - - - - - The level threshold of this appender. - - - - There is no level threshold filtering by default. - - - See for more information. - - - - - - It is assumed and enforced that errorHandler is never null. - - - - It is assumed and enforced that errorHandler is never null. - - - See for more information. - - - - - - The first filter in the filter chain. - - - - Set to null initially. - - - See for more information. - - - - - - The last filter in the filter chain. - - - See for more information. - - - - - Flag indicating if this appender is closed. - - - See for more information. - - - - - The guard prevents an appender from repeatedly calling its own DoAppend method - - - - - StringWriter used to render events - - - - - Gets or sets the threshold of this appender. - - - The threshold of the appender. - - - - All log events with lower level than the threshold level are ignored - by the appender. - - - In configuration files this option is specified by setting the - value of the option to a level - string, such as "DEBUG", "INFO" and so on. - - - - - - Gets or sets the for this appender. - - The of the appender - - - The provides a default - implementation for the property. - - - - - - The filter chain. - - The head of the filter chain filter chain. - - - Returns the head Filter. The Filters are organized in a linked list - and so all Filters on this Appender are available through the result. - - - - - - Gets or sets the for this appender. - - The layout of the appender. - - - See for more information. - - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - - The name uniquely identifies the appender. - - - - - - Tests if this appender requires a to be set. - - - - In the rather exceptional case, where the appender - implementation admits a layout but can also work without it, - then the appender should return true. - - - This default implementation always returns true. - - - - true if the appender requires a layout object, otherwise false. - - - - - The default buffer size. - - - The default size of the cyclic buffer used to store events. - This is set to 512 by default. - - - - - Initializes a new instance of the class. - - - - Protected default constructor to allow subclassing. - - - - - - Initializes a new instance of the class. - - the events passed through this appender must be - fixed by the time that they arrive in the derived class' SendBuffer method. - - - Protected constructor to allow subclassing. - - - The should be set if the subclass - expects the events delivered to be fixed even if the - is set to zero, i.e. when no buffering occurs. - - - - - - Flush the currently buffered events - - - - Flushes any events that have been buffered. - - - If the appender is buffering in mode then the contents - of the buffer will NOT be flushed to the appender. - - - - - - Flush the currently buffered events - - set to true to flush the buffer of lossy events - - - Flushes events that have been buffered. If is - false then events will only be flushed if this buffer is non-lossy mode. - - - If the appender is buffering in mode then the contents - of the buffer will only be flushed if is true. - In this case the contents of the buffer will be tested against the - and if triggering will be output. All other buffered - events will be discarded. - - - If is true then the buffer will always - be emptied by calling this method. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Close this appender instance. - - - - Close this appender instance. If this appender is marked - as not then the remaining events in - the buffer must be sent when the appender is closed. - - - - - - This method is called by the method. - - the event to log - - - Stores the in the cyclic buffer. - - - The buffer will be sent (i.e. passed to the - method) if one of the following conditions is met: - - - - The cyclic buffer is full and this appender is - marked as not lossy (see ) - - - An is set and - it is triggered for the - specified. - - - - Before the event is stored in the buffer it is fixed - (see ) to ensure that - any data referenced by the event will be valid when the buffer - is processed. - - - - - - Sends the contents of the buffer. - - The first logging event. - The buffer containing the events that need to be send. - - - The subclass must override . - - - - - - Sends the events. - - The events that need to be send. - - - The subclass must override this method to process the buffered events. - - - - - - The size of the cyclic buffer used to hold the logging events. - - - Set to by default. - - - - - The cyclic buffer used to store the logging events. - - - - - The triggering event evaluator that causes the buffer to be sent immediately. - - - The object that is used to determine if an event causes the entire - buffer to be sent immediately. This field can be null, which - indicates that event triggering is not to be done. The evaluator - can be set using the property. If this appender - has the ( property) set to - true then an must be set. - - - - - Indicates if the appender should overwrite events in the cyclic buffer - when it becomes full, or if the buffer should be flushed when the - buffer is full. - - - If this field is set to true then an must - be set. - - - - - The triggering event evaluator filters discarded events. - - - The object that is used to determine if an event that is discarded should - really be discarded or if it should be sent to the appenders. - This field can be null, which indicates that all discarded events will - be discarded. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - The events delivered to the subclass must be fixed. - - - - - Gets or sets a value that indicates whether the appender is lossy. - - - true if the appender is lossy, otherwise false. The default is false. - - - - This appender uses a buffer to store logging events before - delivering them. A triggering event causes the whole buffer - to be send to the remote sink. If the buffer overruns before - a triggering event then logging events could be lost. Set - to false to prevent logging events - from being lost. - - If is set to true then an - must be specified. - - - - - Gets or sets the size of the cyclic buffer used to hold the - logging events. - - - The size of the cyclic buffer used to hold the logging events. - - - - The option takes a positive integer - representing the maximum number of logging events to collect in - a cyclic buffer. When the is reached, - oldest events are deleted as new events are added to the - buffer. By default the size of the cyclic buffer is 512 events. - - - If the is set to a value less than - or equal to 1 then no buffering will occur. The logging event - will be delivered synchronously (depending on the - and properties). Otherwise the event will - be buffered. - - - - - - Gets or sets the that causes the - buffer to be sent immediately. - - - The that causes the buffer to be - sent immediately. - - - - The evaluator will be called for each event that is appended to this - appender. If the evaluator triggers then the current buffer will - immediately be sent (see ). - - If is set to true then an - must be specified. - - - - - Gets or sets the value of the to use. - - - The value of the to use. - - - - The evaluator will be called for each event that is discarded from this - appender. If the evaluator triggers then the current buffer will immediately - be sent (see ). - - - - - - Gets or sets a value indicating if only part of the logging event data - should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the - event data to be fixed and serialized. This will improve performance. - - - See for more information. - - - - - - Gets or sets a the fields that will be fixed in the event - - - The event fields that will be fixed before the event is buffered - - - - The logging event needs to have certain thread specific values - captured before it can be buffered. See - for details. - - - - - - - Initializes a new instance of the class. - - - Public default constructor to initialize a new instance of this class. - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Override the parent method to close the database - - - - Closes the database command and database connection. - - - - - - Inserts the events into the database. - - The events to insert into the database. - - - Insert all the events specified in the - array into the database. - - - - - - Adds a parameter to the command. - - The parameter to add to the command. - - - Adds a parameter to the ordered list of command parameters. - - - - - - Writes the events to the database using the transaction specified. - - The transaction that the events will be executed under. - The array of events to insert into the database. - - - The transaction argument can be null if the appender has been - configured not to use transactions. See - property for more information. - - - - - - Formats the log message into database statement text. - - The event being logged. - - This method can be overridden by subclasses to provide - more control over the format of the database statement. - - - Text that can be passed to a . - - - - - Connects to the database. - - - - - Retrieves the class type of the ADO.NET provider. - - - - Gets the Type of the ADO.NET provider to use to connect to the - database. This method resolves the type specified in the - property. - - - Subclasses can override this method to return a different type - if necessary. - - - The of the ADO.NET provider - - - - Prepares the database command and initialize the parameters. - - - - - Flag to indicate if we are using a command object - - - - Set to true when the appender is to use a prepared - statement or stored procedure to insert into the database. - - - - - - The list of objects. - - - - The list of objects. - - - - - - The security context to use for privileged calls - - - - - The that will be used - to insert logging events into a database. - - - - - The database command. - - - - - Database connection string. - - - - - String type name of the type name. - - - - - The text of the command. - - - - - The command type. - - - - - Indicates whether to use transactions when writing to the database. - - - - - Indicates whether to use transactions when writing to the database. - - - - - Gets or sets the database connection string that is used to connect to - the database. - - - The database connection string used to connect to the database. - - - - The connections string is specific to the connection type. - See for more information. - - - Connection string for MS Access via ODBC: - "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" - - Another connection string for MS Access via ODBC: - "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" - - Connection string for MS Access via OLE DB: - "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" - - - - - Gets or sets the type name of the connection - that should be created. - - - The type name of the connection. - - - - The type name of the ADO.NET provider to use. - - - The default is to use the OLE DB provider. - - - Use the OLE DB Provider. This is the default value. - System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the MS SQL Server Provider. - System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the ODBC Provider. - Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral - This is an optional package that you can download from - http://msdn.microsoft.com/downloads - search for ODBC .NET Data Provider. - - Use the Oracle Provider. - System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - This is an optional package that you can download from - http://msdn.microsoft.com/downloads - search for .NET Managed Provider for Oracle. - - - - - Gets or sets the command text that is used to insert logging events - into the database. - - - The command text used to insert logging events into the database. - - - - Either the text of the prepared statement or the - name of the stored procedure to execute to write into - the database. - - - The property determines if - this text is a prepared statement or a stored procedure. - - - - - - Gets or sets the command type to execute. - - - The command type to execute. - - - - This value may be either (System.Data.CommandType.Text) to specify - that the is a prepared statement to execute, - or (System.Data.CommandType.StoredProcedure) to specify that the - property is the name of a stored procedure - to execute. - - - The default value is (System.Data.CommandType.Text). - - - - - - Should transactions be used to insert logging events in the database. - - - true if transactions should be used to insert logging events in - the database, otherwise false. The default value is true. - - - - Gets or sets a value that indicates whether transactions should be used - to insert logging events in the database. - - - When set a single transaction will be used to insert the buffered events - into the database. Otherwise each event will be inserted without using - an explicit transaction. - - - - - - Gets or sets the used to call the NetSend method. - - - The used to call the NetSend method. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - Should this appender try to reconnect to the database on error. - - - true if the appender should try to reconnect to the database after an - error has occurred, otherwise false. The default value is false, - i.e. not to try to reconnect. - - - - The default behaviour is for the appender not to try to reconnect to the - database if an error occurs. Subsequent logging events are discarded. - - - To force the appender to attempt to reconnect to the database set this - property to true. - - - When the appender attempts to connect to the database there may be a - delay of up to the connection timeout specified in the connection string. - This delay will block the calling application's thread. - Until the connection can be reestablished this potential delay may occur multiple times. - - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to insert - logging events into a database. Classes deriving from - can use this property to get or set this . Use the - underlying returned from if - you require access beyond that which provides. - - - - - Parameter type used by the . - - - - This class provides the basic database parameter properties - as defined by the interface. - - This type can be subclassed to provide database specific - functionality. The two methods that are called externally are - and . - - - - - - Initializes a new instance of the class. - - - Default constructor for the AdoNetAppenderParameter class. - - - - - Prepare the specified database command object. - - The command to prepare. - - - Prepares the database command object by adding - this parameter to its collection of parameters. - - - - - - Renders the logging event and set the parameter value in the command. - - The command containing the parameter. - The event to be rendered. - - - Renders the logging event using this parameters layout - object. Sets the value of the parameter on the command object. - - - - - - The name of this parameter. - - - - - The database type for this parameter. - - - - - Flag to infer type rather than use the DbType - - - - - The precision for this parameter. - - - - - The scale for this parameter. - - - - - The size for this parameter. - - - - - The to use to render the - logging event into an object for this parameter. - - - - - Gets or sets the name of this parameter. - - - The name of this parameter. - - - - The name of this parameter. The parameter name - must match up to a named parameter to the SQL stored procedure - or prepared statement. - - - - - - Gets or sets the database type for this parameter. - - - The database type for this parameter. - - - - The database type for this parameter. This property should - be set to the database type from the - enumeration. See . - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the type from the value. - - - - - - - Gets or sets the precision for this parameter. - - - The precision for this parameter. - - - - The maximum number of digits used to represent the Value. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the precision from the value. - - - - - - - Gets or sets the scale for this parameter. - - - The scale for this parameter. - - - - The number of decimal places to which Value is resolved. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the scale from the value. - - - - - - - Gets or sets the size for this parameter. - - - The size for this parameter. - - - - The maximum size, in bytes, of the data within the column. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the size from the value. - - - - - - - Gets or sets the to use to - render the logging event into an object for this - parameter. - - - The used to render the - logging event into an object for this parameter. - - - - The that renders the value for this - parameter. - - - The can be used to adapt - any into a - for use in the property. - - - - - - Appends logging events to the terminal using ANSI color escape sequences. - - - - AnsiColorTerminalAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. It also allows the color of a specific level of message to be set. - - - This appender expects the terminal to understand the VT100 control set - in order to interpret the color codes. If the terminal or console does not - understand the control codes the behavior is not defined. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes each message to the System.Console.Out or - System.Console.Error that is set at the time the event is appended. - Therefore it is possible to programmatically redirect the output of this appender - (for example NUnit does this to capture program output). While this is the desired - behavior of this appender it may have security implications in your application. - - - When configuring the ANSI colored terminal appender, a mapping should be - specified to map a logging level to a color. For example: - - - - - - - - - - - - - - - The Level is the standard log4net logging level and ForeColor and BackColor can be any - of the following values: - - Blue - Green - Red - White - Yellow - Purple - Cyan - - These color values cannot be combined together to make new colors. - - - The attributes can be any combination of the following: - - Brightforeground is brighter - Dimforeground is dimmer - Underscoremessage is underlined - Blinkforeground is blinking (does not work on all terminals) - Reverseforeground and background are reversed - Hiddenoutput is hidden - Strikethroughmessage has a line through it - - While any of these attributes may be combined together not all combinations - work well together, for example setting both Bright and Dim attributes makes - no sense. - - - Patrick Wagstrom - Nicko Cadell - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Ansi code to reset terminal - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Add a mapping of level to color - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the foreground and background colours - for a level. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to color mappings set on this appender. - - - - - - Flag to write output to the error stream rather than the standard output stream - - - - - Mapping from level object to color value - - - - - Target is the value of the console output stream. - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - The enum of possible display attributes - - - - The following flags can be combined together to - form the ANSI color attributes. - - - - - - - text is bright - - - - - text is dim - - - - - text is underlined - - - - - text is blinking - - - Not all terminals support this attribute - - - - - text and background colors are reversed - - - - - text is hidden - - - - - text is displayed with a strikethrough - - - - - The enum of possible foreground or background color values for - use with the color mapping method - - - - The output can be in one for the following ANSI colors. - - - - - - - color is black - - - - - color is red - - - - - color is green - - - - - color is yellow - - - - - color is blue - - - - - color is magenta - - - - - color is cyan - - - - - color is white - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and the color it should be displayed in. - - - - - - An entry in the - - - - This is an abstract base class for types that are stored in the - object. - - - Nicko Cadell - - - - Default protected constructor - - - - Default protected constructor - - - - - - Initialize any options defined on this entry - - - - Should be overridden by any classes that need to initialise based on their options - - - - - - The level that is the key for this mapping - - - The that is the key for this mapping - - - - Get or set the that is the key for this - mapping subclass. - - - - - - Initialize the options for the object - - - - Combine the and together - and append the attributes. - - - - - - The mapped foreground color for the specified level - - - - Required property. - The mapped foreground color for the specified level - - - - - - The mapped background color for the specified level - - - - Required property. - The mapped background color for the specified level - - - - - - The color attributes for the specified level - - - - Required property. - The color attributes for the specified level - - - - - - The combined , and - suitable for setting the ansi terminal color. - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a AppenderCollection instance. - - list to create a readonly wrapper arround - - An AppenderCollection wrapper that is read-only. - - - - - An empty readonly static AppenderCollection - - - - - Initializes a new instance of the AppenderCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the AppenderCollection class - that has the specified initial capacity. - - - The number of elements that the new AppenderCollection is initially capable of storing. - - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified AppenderCollection. - - The AppenderCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - - Copies the entire AppenderCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire AppenderCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the AppenderCollection. - - The to be added to the end of the AppenderCollection. - The index at which the value has been added. - - - - Removes all elements from the AppenderCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the AppenderCollection. - - The to check for. - true if is found in the AppenderCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the AppenderCollection. - - The to locate in the AppenderCollection. - - The zero-based index of the first occurrence of - in the entire AppenderCollection, if found; otherwise, -1. - - - - - Inserts an element into the AppenderCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the AppenderCollection. - - The to remove from the AppenderCollection. - - The specified was not found in the AppenderCollection. - - - - - Removes the element at the specified index of the AppenderCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the AppenderCollection. - - An for the entire AppenderCollection. - - - - Adds the elements of another AppenderCollection to the current AppenderCollection. - - The AppenderCollection whose elements should be added to the end of the current AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a array to the current AppenderCollection. - - The array whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a collection to the current AppenderCollection. - - The collection whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Sets the capacity to the actual number of elements. - - - - - Return the collection elements as an array - - the array - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the AppenderCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the AppenderCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - - A value - - - - - Supports simple iteration over a . - - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - - - - - Appends log events to the ASP.NET system. - - - - - Diagnostic information and tracing messages that you specify are appended to the output - of the page that is sent to the requesting browser. Optionally, you can view this information - from a separate trace viewer (Trace.axd) that displays trace information for every page in a - given application. - - - Trace statements are processed and displayed only when tracing is enabled. You can control - whether tracing is displayed to a page, to the trace viewer, or both. - - - The logging event is passed to the or - method depending on the level of the logging event. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Write the logging event to the ASP.NET trace - - the event to log - - - Write the logging event to the ASP.NET trace - HttpContext.Current.Trace - (). - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Buffers events and then forwards them to attached appenders. - - - - The events are buffered in this appender until conditions are - met to allow the appender to deliver the events to the attached - appenders. See for the - conditions that cause the buffer to be sent. - - The forwarding appender can be used to specify different - thresholds and filters for the same appender at different locations - within the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Interface for attaching appenders to objects. - - - - Interface for attaching, removing and retrieving appenders. - - - Nicko Cadell - Gert Driesen - - - - Attaches an appender. - - The appender to add. - - - Add the specified appender. The implementation may - choose to allow or deny duplicate appenders. - - - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - Returns an attached appender with the specified. - If no appender with the specified name is found null will be - returned. - - - - - - Removes all attached appenders. - - - - Removes and closes all attached appenders - - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Gets all attached appenders. - - - A collection of attached appenders. - - - - Gets a collection of attached appenders. - If there are no attached appenders the - implementation should return an empty - collection rather than null. - - - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Send the events. - - The events that need to be send. - - - Forwards the events to the attached appenders. - - - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - Get the named appender attached to this buffering appender. - - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Appends logging events to the console. - - - - ColoredConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. It also allows the color of a specific type of message to be set. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes directly to the application's attached console - not to the System.Console.Out or System.Console.Error TextWriter. - The System.Console.Out and System.Console.Error streams can be - programmatically redirected (for example NUnit does this to capture program output). - This appender will ignore these redirections because it needs to use Win32 - API calls to colorize the output. To respect these redirections the - must be used. - - - When configuring the colored console appender, mapping should be - specified to map a logging level to a color. For example: - - - - - - - - - - - - - - The Level is the standard log4net logging level and ForeColor and BackColor can be any - combination of the following values: - - Blue - Green - Red - White - Yellow - Purple - Cyan - HighIntensity - - - - Rick Hobbs - Nicko Cadell - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - Add a mapping of level to color - done by the config file - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the foreground and background colors - for a level. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to color mappings set on this appender. - - - - - - Flag to write output to the error stream rather than the standard output stream - - - - - Mapping from level object to color value - - - - - The console output stream writer to write to - - - - This writer is not thread safe. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - The enum of possible color values for use with the color mapping method - - - - The following flags can be combined together to - form the colors. - - - - - - - color is blue - - - - - color is green - - - - - color is red - - - - - color is white - - - - - color is yellow - - - - - color is purple - - - - - color is cyan - - - - - color is intensified - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and the color it should be displayed in. - - - - - - Initialize the options for the object - - - - Combine the and together. - - - - - - The mapped foreground color for the specified level - - - - Required property. - The mapped foreground color for the specified level. - - - - - - The mapped background color for the specified level - - - - Required property. - The mapped background color for the specified level. - - - - - - The combined and suitable for - setting the console color. - - - - - Appends logging events to the console. - - - - ConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes each message to the System.Console.Out or - System.Console.Error that is set at the time the event is appended. - Therefore it is possible to programmatically redirect the output of this appender - (for example NUnit does this to capture program output). While this is the desired - behavior of this appender it may have security implications in your application. - - - Nicko Cadell - Gert Driesen - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appends log events to the system. - - - - The application configuration file can be used to control what listeners - are actually used. See the MSDN documentation for the - class for details on configuring the - debug system. - - - Events are written using the - method. The event's logger name is passed as the value for the category name to the Write method. - - - Nicko Cadell - - - - Initializes a new instance of the . - - - - Default constructor. - - - - - - Initializes a new instance of the - with a specified layout. - - The layout to use with this appender. - - - Obsolete constructor. - - - - - - Writes the logging event to the system. - - The event to log. - - - Writes the logging event to the system. - If is true then the - is called. - - - - - - Immediate flush means that the underlying writer or output stream - will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logs events are not actually written to persistent media if and - when the application crashes. - - - The default value is true. - - - - - Gets or sets a value that indicates whether the appender will - flush at the end of each write. - - - The default behavior is to flush at the end of each - write. If the option is set tofalse, then the underlying - stream can defer writing to physical medium to a later time. - - - Avoiding the flush operation at the end of each append results - in a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Writes events to the system event log. - - - - The EventID of the event log entry can be - set using the EventLogEventID property () - on the . - - - There is a limit of 32K characters for an event log message - - - When configuring the EventLogAppender a mapping can be - specified to map a logging level to an event log entry type. For example: - - - <mapping> - <level value="ERROR" /> - <eventLogEntryType value="Error" /> - </mapping> - <mapping> - <level value="DEBUG" /> - <eventLogEntryType value="Information" /> - </mapping> - - - The Level is the standard log4net logging level and eventLogEntryType can be any value - from the enum, i.e.: - - Erroran error event - Warninga warning event - Informationan informational event - - - - Aspi Havewala - Douglas de la Torre - Nicko Cadell - Gert Driesen - Thomas Voss - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initializes a new instance of the class - with the specified . - - The to use with this appender. - - - Obsolete constructor. - - - - - - Add a mapping of level to - done by the config file - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the event log entry type for a level. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Create an event log source - - - Uses different API calls under NET_2_0 - - - - - This method is called by the - method. - - the event to log - - Writes the event to the system event log using the - . - - If the event has an EventID property (see ) - set then this integer will be used as the event log event id. - - - There is a limit of 32K characters for an event log message - - - - - - Get the equivalent for a - - the Level to convert to an EventLogEntryType - The equivalent for a - - Because there are fewer applicable - values to use in logging levels than there are in the - this is a one way mapping. There is - a loss of information during the conversion. - - - - - The log name is the section in the event logs where the messages - are stored. - - - - - Name of the application to use when logging. This appears in the - application column of the event log named by . - - - - - The name of the machine which holds the event log. This is - currently only allowed to be '.' i.e. the current machine. - - - - - Mapping from level object to EventLogEntryType - - - - - The security context to use for privileged calls - - - - - The name of the log where messages will be stored. - - - The string name of the log where messages will be stored. - - - This is the name of the log as it appears in the Event Viewer - tree. The default value is to log into the Application - log, this is where most applications write their events. However - if you need a separate log for your application (or applications) - then you should set the appropriately. - This should not be used to distinguish your event log messages - from those of other applications, the - property should be used to distinguish events. This property should be - used to group together events into a single log. - - - - - - Property used to set the Application name. This appears in the - event logs when logging. - - - The string used to distinguish events from different sources. - - - Sets the event log source property. - - - - - This property is used to return the name of the computer to use - when accessing the event logs. Currently, this is the current - computer, denoted by a dot "." - - - The string name of the machine holding the event log that - will be logged into. - - - This property cannot be changed. It is currently set to '.' - i.e. the local machine. This may be changed in future. - - - - - Gets or sets the used to write to the EventLog. - - - The used to write to the EventLog. - - - - The system security context used to write to the EventLog. - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and its event log entry type. - - - - - - The for this entry - - - - Required property. - The for this entry - - - - - - Appends logging events to a file. - - - - Logging events are sent to the file specified by - the property. - - - The file can be opened in either append or overwrite mode - by specifying the property. - If the file path is relative it is taken as relative from - the application base directory. The file encoding can be - specified by setting the property. - - - The layout's and - values will be written each time the file is opened and closed - respectively. If the property is - then the file may contain multiple copies of the header and footer. - - - This appender will first try to open the file for writing when - is called. This will typically be during configuration. - If the file cannot be opened for writing the appender will attempt - to open the file again each time a message is logged to the appender. - If the file cannot be opened for writing when a message is logged then - the message will be discarded by this appender. - - - The supports pluggable file locking models via - the property. - The default behavior, implemented by - is to obtain an exclusive write lock on the file until this appender is closed. - The alternative model, , only holds a - write lock while the appender is writing a logging event. - - - Nicko Cadell - Gert Driesen - Rodrigo B. de Oliveira - Douglas de la Torre - Niall Daley - - - - Sends logging events to a . - - - - An Appender that writes to a . - - - This appender may be used stand alone if initialized with an appropriate - writer, however it is typically used as a base class for an appender that - can open a to write to. - - - Nicko Cadell - Gert Driesen - Douglas de la Torre - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initializes a new instance of the class and - sets the output destination to a new initialized - with the specified . - - The layout to use with this appender. - The to output to. - - - Obsolete constructor. - - - - - - Initializes a new instance of the class and sets - the output destination to the specified . - - The layout to use with this appender - The to output to - - The must have been previously opened. - - - - Obsolete constructor. - - - - - - This method determines if there is a sense in attempting to append. - - - - This method checked if an output target has been set and if a - layout has been set. - - - false if any of the preconditions fail. - - - - This method is called by the - method. - - The event to log. - - - Writes a log statement to the output stream if the output stream exists - and is writable. - - - The format of the output will depend on the appender's layout. - - - - - - This method is called by the - method. - - The array of events to log. - - - This method writes all the bulk logged events to the output writer - before flushing the stream. - - - - - - Close this appender instance. The underlying stream or writer is also closed. - - - Closed appenders cannot be reused. - - - - - Writes the footer and closes the underlying . - - - - Writes the footer and closes the underlying . - - - - - - Closes the underlying . - - - - Closes the underlying . - - - - - - Clears internal references to the underlying - and other variables. - - - - Subclasses can override this method for an alternate closing behavior. - - - - - - Writes a footer as produced by the embedded layout's property. - - - - Writes a footer as produced by the embedded layout's property. - - - - - - Writes a header produced by the embedded layout's property. - - - - Writes a header produced by the embedded layout's property. - - - - - - Called to allow a subclass to lazily initialize the writer - - - - This method is called when an event is logged and the or - have not been set. This allows a subclass to - attempt to initialize the writer multiple times. - - - - - - This is the where logging events - will be written to. - - - - - Immediate flush means that the underlying - or output stream will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logging events are not actually persisted if and when the application - crashes. - - - The default value is true. - - - - - - Gets or set whether the appender will flush at the end - of each append operation. - - - - The default behavior is to flush at the end of each - append operation. - - - If this option is set to false, then the underlying - stream can defer persisting the logging event to a later - time. - - - - Avoiding the flush operation at the end of each append results in - a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - Sets the where the log output will go. - - - - The specified must be open and writable. - - - The will be closed when the appender - instance is closed. - - - Note: Logging to an unopened will fail. - - - - - - Gets or set the and the underlying - , if any, for this appender. - - - The for this appender. - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Gets or sets the where logging events - will be written to. - - - The where logging events are written. - - - - This is the where logging events - will be written to. - - - - - - Default constructor - - - - Default constructor - - - - - - Construct a new appender using the layout, file and append mode. - - the layout to use with this appender - the full path to the file to write to - flag to indicate if the file should be appended to - - - Obsolete constructor. - - - - - - Construct a new appender using the layout and file specified. - The file will be appended to. - - the layout to use with this appender - the full path to the file to write to - - - Obsolete constructor. - - - - - - Activate the options on the file appender. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - This will cause the file to be opened. - - - - - - Closes any previously opened file and calls the parent's . - - - - Resets the filename and the file stream. - - - - - - Called to initialize the file writer - - - - Will be called for each logged message until the file is - successfully opened. - - - - - - This method is called by the - method. - - The event to log. - - - Writes a log statement to the output stream if the output stream exists - and is writable. - - - The format of the output will depend on the appender's layout. - - - - - - This method is called by the - method. - - The array of events to log. - - - Acquires the output file locks once before writing all the events to - the stream. - - - - - - Writes a footer as produced by the embedded layout's property. - - - - Writes a footer as produced by the embedded layout's property. - - - - - - Writes a header produced by the embedded layout's property. - - - - Writes a header produced by the embedded layout's property. - - - - - - Closes the underlying . - - - - Closes the underlying . - - - - - - Closes the previously opened file. - - - - Writes the to the file and then - closes the file. - - - - - - Sets and opens the file where the log output will go. The specified file must be writable. - - The path to the log file. Must be a fully qualified path. - If true will append to fileName. Otherwise will truncate fileName - - - Calls but guarantees not to throw an exception. - Errors are passed to the . - - - - - - Sets and opens the file where the log output will go. The specified file must be writable. - - The path to the log file. Must be a fully qualified path. - If true will append to fileName. Otherwise will truncate fileName - - - If there was already an opened file, then the previous file - is closed first. - - - This method will ensure that the directory structure - for the specified exists. - - - - - - Sets the quiet writer used for file output - - the file stream that has been opened for writing - - - This implementation of creates a - over the and passes it to the - method. - - - This method can be overridden by sub classes that want to wrap the - in some way, for example to encrypt the output - data using a System.Security.Cryptography.CryptoStream. - - - - - - Sets the quiet writer being used. - - the writer over the file stream that has been opened for writing - - - This method can be overridden by sub classes that want to - wrap the in some way. - - - - - - Convert a path into a fully qualified path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - - - - Flag to indicate if we should append to the file - or overwrite the file. The default is to append. - - - - - The name of the log file. - - - - - The encoding to use for the file stream. - - - - - The security context to use for privileged calls - - - - - The stream to log to. Has added locking semantics - - - - - The locking model to use - - - - - Gets or sets the path to the file that logging will be written to. - - - The path to the file that logging will be written to. - - - - If the path is relative it is taken as relative from - the application base directory. - - - - - - Gets or sets a flag that indicates whether the file should be - appended to or overwritten. - - - Indicates whether the file should be appended to or overwritten. - - - - If the value is set to false then the file will be overwritten, if - it is set to true then the file will be appended to. - - The default value is true. - - - - - Gets or sets used to write to the file. - - - The used to write to the file. - - - - The default encoding set is - which is the encoding for the system's current ANSI code page. - - - - - - Gets or sets the used to write to the file. - - - The used to write to the file. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - Gets or sets the used to handle locking of the file. - - - The used to lock the file. - - - - Gets or sets the used to handle locking of the file. - - - There are two built in locking models, and . - The former locks the file from the start of logging to the end and the - later lock only for the minimal amount of time when logging each message. - - - The default locking model is the . - - - - - - Write only that uses the - to manage access to an underlying resource. - - - - - True asynchronous writes are not supported, the implementation forces a synchronous write. - - - - - Exception base type for log4net. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - A message to include with the exception. - - - Initializes a new instance of the class with - the specified message. - - - - - - Constructor - - A message to include with the exception. - A nested exception to include. - - - Initializes a new instance of the class - with the specified message and inner exception. - - - - - - Serialization constructor - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Locking model base class - - - - Base class for the locking models available to the derived loggers. - - - - - - Open the output file - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Acquire the lock on the file in preparation for writing to it. - Return a stream pointing to the file. - must be called to release the lock on the output file. - - - - - - Release the lock on the file - - - - Release the lock on the file. No further writes will be made to the - stream until is called again. - - - - - - Gets or sets the for this LockingModel - - - The for this LockingModel - - - - The file appender this locking model is attached to and working on - behalf of. - - - The file appender is used to locate the security context and the error handler to use. - - - The value of this property will be set before is - called. - - - - - - Hold an exclusive lock on the output file - - - - Open the file once for writing and hold it open until is called. - Maintains an exclusive lock on the file during this time. - - - - - - Open the file specified and prepare for logging. - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Does nothing. The lock is already taken - - - - - - Release the lock on the file - - - - Does nothing. The lock will be released when the file is closed. - - - - - - Acquires the file lock for each write - - - - Opens the file once for each / cycle, - thus holding the lock for the minimal amount of time. This method of locking - is considerably slower than but allows - other processes to move/delete the log file whilst logging continues. - - - - - - Prepares to open the file when the first message is logged. - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Acquire the lock on the file in preparation for writing to it. - Return a stream pointing to the file. - must be called to release the lock on the output file. - - - - - - Release the lock on the file - - - - Release the lock on the file. No further writes will be made to the - stream until is called again. - - - - - - This appender forwards logging events to attached appenders. - - - - The forwarding appender can be used to specify different thresholds - and filters for the same appender at different locations within the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Forward the logging event to the attached appenders - - The event to log. - - - Delivers the logging event to all the attached appenders. - - - - - - Forward the logging events to the attached appenders - - The array of events to log. - - - Delivers the logging events to all the attached appenders. - - - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - Get the named appender attached to this appender. - - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Logs events to a local syslog service. - - - - This appender uses the POSIX libc library functions openlog, syslog, and closelog. - If these functions are not available on the local system then this appender will not work! - - - The functions openlog, syslog, and closelog are specified in SUSv2 and - POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. - - - This appender talks to a local syslog service. If you need to log to a remote syslog - daemon and you cannot configure your local syslog service to do this you may be - able to use the to log via UDP. - - - Syslog messages must have a facility and and a severity. The severity - is derived from the Level of the logging event. - The facility must be chosen from the set of defined syslog - values. The facilities list is predefined - and cannot be extended. - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - Rob Lyon - Nicko Cadell - - - - Initializes a new instance of the class. - - - This instance of the class is set up to write - to a local syslog service. - - - - - Add a mapping of level to severity - - The mapping to add - - - Adds a to this appender. - - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to a remote syslog daemon. - - - The format of the output will depend on the appender's layout. - - - - - - Close the syslog when the appender is closed - - - - Close the syslog when the appender is closed - - - - - - Translates a log4net level to a syslog severity. - - A log4net level. - A syslog severity. - - - Translates a log4net level to a syslog severity. - - - - - - Generate a syslog priority. - - The syslog facility. - The syslog severity. - A syslog priority. - - - - The facility. The default facility is . - - - - - The message identity - - - - - Marshaled handle to the identity string. We have to hold on to the - string as the openlog and syslog APIs just hold the - pointer to the ident and dereference it for each log message. - - - - - Mapping from level object to syslog severity - - - - - Open connection to system logger. - - - - - Generate a log message. - - - - The libc syslog method takes a format string and a variable argument list similar - to the classic printf function. As this type of vararg list is not supported - by C# we need to specify the arguments explicitly. Here we have specified the - format string with a single message argument. The caller must set the format - string to "%s". - - - - - - Close descriptor used to write to system logger. - - - - - Message identity - - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - - - - Syslog facility - - - Set to one of the values. The list of - facilities is predefined and cannot be extended. The default value - is . - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - syslog severities - - - - The log4net Level maps to a syslog severity using the - method and the - class. The severity is set on . - - - - - - system is unusable - - - - - action must be taken immediately - - - - - critical conditions - - - - - error conditions - - - - - warning conditions - - - - - normal but significant condition - - - - - informational - - - - - debug-level messages - - - - - syslog facilities - - - - The syslog facility defines which subsystem the logging comes from. - This is set on the property. - - - - - - kernel messages - - - - - random user-level messages - - - - - mail system - - - - - system daemons - - - - - security/authorization messages - - - - - messages generated internally by syslogd - - - - - line printer subsystem - - - - - network news subsystem - - - - - UUCP subsystem - - - - - clock (cron/at) daemon - - - - - security/authorization messages (private) - - - - - ftp daemon - - - - - NTP subsystem - - - - - log audit - - - - - log alert - - - - - clock daemon - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - - - The mapped syslog severity for the specified level - - - - Required property. - The mapped syslog severity for the specified level - - - - - - Stores logging events in an array. - - - - The memory appender stores all the logging events - that are appended in an in-memory array. - - - Use the method to get - the current list of events that have been appended. - - - Use the method to clear the - current list of events. - - - Julian Biddle - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Gets the events that have been logged. - - The events that have been logged - - - Gets the events that have been logged. - - - - - - This method is called by the method. - - the event to log - - Stores the in the events list. - - - - - Clear the list of events - - - Clear the list of events - - - - - The list of events that have been appended. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - Gets or sets a value indicating whether only part of the logging event - data should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the event - data to be fixed and stored in the appender, hereby improving performance. - - - See for more information. - - - - - - Gets or sets the fields that will be fixed in the event - - - - The logging event needs to have certain thread specific values - captured before it can be buffered. See - for details. - - - - - - Logs entries by sending network messages using the - native function. - - - - You can send messages only to names that are active - on the network. If you send the message to a user name, - that user must be logged on and running the Messenger - service to receive the message. - - - The receiver will get a top most window displaying the - messages one at a time, therefore this appender should - not be used to deliver a high volume of messages. - - - The following table lists some possible uses for this appender : - - - - - Action - Property Value(s) - - - Send a message to a user account on the local machine - - - = <name of the local machine> - - - = <user name> - - - - - Send a message to a user account on a remote machine - - - = <name of the remote machine> - - - = <user name> - - - - - Send a message to a domain user account - - - = <name of a domain controller | uninitialized> - - - = <user name> - - - - - Send a message to all the names in a workgroup or domain - - - = <workgroup name | domain name>* - - - - - Send a message from the local machine to a remote machine - - - = <name of the local machine | uninitialized> - - - = <name of the remote machine> - - - - - - - Note : security restrictions apply for sending - network messages, see - for more information. - - - - - An example configuration section to log information - using this appender from the local machine, named - LOCAL_PC, to machine OPERATOR_PC : - - - - - - - - - - Nicko Cadell - Gert Driesen - - - - The DNS or NetBIOS name of the server on which the function is to execute. - - - - - The sender of the network message. - - - - - The message alias to which the message should be sent. - - - - - The security context to use for privileged calls - - - - - Initializes the appender. - - - The default constructor initializes all fields to their default values. - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The appender will be ignored if no was specified. - - - The required property was not specified. - - - - This method is called by the method. - - The event to log. - - - Sends the event using a network message. - - - - - - Sends a buffer of information to a registered message alias. - - The DNS or NetBIOS name of the server on which the function is to execute. - The message alias to which the message buffer should be sent - The originator of the message. - The message text. - The length, in bytes, of the message text. - - - The following restrictions apply for sending network messages: - - - - - Platform - Requirements - - - Windows NT - - - No special group membership is required to send a network message. - - - Admin, Accounts, Print, or Server Operator group membership is required to - successfully send a network message on a remote server. - - - - - Windows 2000 or later - - - If you send a message on a domain controller that is running Active Directory, - access is allowed or denied based on the access control list (ACL) for the securable - object. The default ACL permits only Domain Admins and Account Operators to send a network message. - - - On a member server or workstation, only Administrators and Server Operators can send a network message. - - - - - - - For more information see Security Requirements for the Network Management Functions. - - - - - If the function succeeds, the return value is zero. - - - - - - Gets or sets the sender of the message. - - - The sender of the message. - - - If this property is not specified, the message is sent from the local computer. - - - - - Gets or sets the message alias to which the message should be sent. - - - The recipient of the message. - - - This property should always be specified in order to send a message. - - - - - Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. - - - DNS or NetBIOS name of the remote server on which the function is to execute. - - - - For Windows NT 4.0 and earlier, the string should begin with \\. - - - If this property is not specified, the local computer is used. - - - - - - Gets or sets the used to call the NetSend method. - - - The used to call the NetSend method. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appends log events to the OutputDebugString system. - - - - OutputDebugStringAppender appends log events to the - OutputDebugString system. - - - The string is passed to the native OutputDebugString - function. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Write the logging event to the output debug string API - - the event to log - - - Write the logging event to the output debug string API - - - - - - Stub for OutputDebugString native method - - the string to output - - - Stub for OutputDebugString native method - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Logs events to a remote syslog daemon. - - - - The BSD syslog protocol is used to remotely log to - a syslog daemon. The syslogd listens for for messages - on UDP port 514. - - - The syslog UDP protocol is not authenticated. Most syslog daemons - do not accept remote log messages because of the security implications. - You may be able to use the LocalSyslogAppender to talk to a local - syslog service. - - - There is an RFC 3164 that claims to document the BSD Syslog Protocol. - This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. - This appender generates what the RFC calls an "Original Device Message", - i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation - this format of message will be accepted by all current syslog daemon - implementations. The daemon will attach the current time and the source - hostname or IP address to any messages received. - - - Syslog messages must have a facility and and a severity. The severity - is derived from the Level of the logging event. - The facility must be chosen from the set of defined syslog - values. The facilities list is predefined - and cannot be extended. - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - Rob Lyon - Nicko Cadell - - - - Sends logging events as connectionless UDP datagrams to a remote host or a - multicast group using an . - - - - UDP guarantees neither that messages arrive, nor that they arrive in the correct order. - - - To view the logging results, a custom application can be developed that listens for logging - events. - - - When decoding events send via this appender remember to use the same encoding - to decode the events as was used to send the events. See the - property to specify the encoding to use. - - - - This example shows how to log receive logging events that are sent - on IP address 244.0.0.1 and port 8080 to the console. The event is - encoded in the packet as a unicode string and it is decoded as such. - - IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - UdpClient udpClient; - byte[] buffer; - string loggingEvent; - - try - { - udpClient = new UdpClient(8080); - - while(true) - { - buffer = udpClient.Receive(ref remoteEndPoint); - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); - Console.WriteLine(loggingEvent); - } - } - catch(Exception e) - { - Console.WriteLine(e.ToString()); - } - - - Dim remoteEndPoint as IPEndPoint - Dim udpClient as UdpClient - Dim buffer as Byte() - Dim loggingEvent as String - - Try - remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) - udpClient = new UdpClient(8080) - - While True - buffer = udpClient.Receive(ByRef remoteEndPoint) - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) - Console.WriteLine(loggingEvent) - Wend - Catch e As Exception - Console.WriteLine(e.ToString()) - End Try - - - An example configuration section to log information using this appender to the - IP 224.0.0.1 on port 8080: - - - - - - - - - - Gert Driesen - Nicko Cadell - - - - Initializes a new instance of the class. - - - The default constructor initializes all fields to their default values. - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The appender will be ignored if no was specified or - an invalid remote or local TCP port number was specified. - - - The required property was not specified. - The TCP port number assigned to or is less than or greater than . - - - - This method is called by the method. - - The event to log. - - - Sends the event using an UDP datagram. - - - Exceptions are passed to the . - - - - - - Closes the UDP connection and releases all resources associated with - this instance. - - - - Disables the underlying and releases all managed - and unmanaged resources associated with the . - - - - - - Initializes the underlying connection. - - - - The underlying is initialized and binds to the - port number from which you intend to communicate. - - - Exceptions are passed to the . - - - - - - The IP address of the remote host or multicast group to which - the logging event will be sent. - - - - - The TCP port number of the remote host or multicast group to - which the logging event will be sent. - - - - - The cached remote endpoint to which the logging events will be sent. - - - - - The TCP port number from which the will communicate. - - - - - The instance that will be used for sending the - logging events. - - - - - The encoding to use for the packet. - - - - - Gets or sets the IP address of the remote host or multicast group to which - the underlying should sent the logging event. - - - The IP address of the remote host or multicast group to which the logging event - will be sent. - - - - Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to - 239.255.255.255). Multicast packets can pass across different networks through routers, so - it is possible to use multicasts in an Internet scenario as long as your network provider - supports multicasting. - - - Hosts that want to receive particular multicast messages must register their interest by joining - the multicast group. Multicast messages are not sent to networks where no host has joined - the multicast group. Class D IP addresses are used for multicast groups, to differentiate - them from normal host addresses, allowing nodes to easily detect if a message is of interest. - - - Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: - - - - - IP Address - Description - - - 224.0.0.1 - - - Sends a message to all system on the subnet. - - - - - 224.0.0.2 - - - Sends a message to all routers on the subnet. - - - - - 224.0.0.12 - - - The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. - - - - - - - A complete list of actually reserved multicast addresses and their owners in the ranges - defined by RFC 3171 can be found at the IANA web site. - - - The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative - addresses. These addresses can be reused with other local groups. Routers are typically - configured with filters to prevent multicast traffic in this range from flowing outside - of the local network. - - - - - - Gets or sets the TCP port number of the remote host or multicast group to which - the underlying should sent the logging event. - - - An integer value in the range to - indicating the TCP port number of the remote host or multicast group to which the logging event - will be sent. - - - The underlying will send messages to this TCP port number - on the remote host or multicast group. - - The value specified is less than or greater than . - - - - Gets or sets the TCP port number from which the underlying will communicate. - - - An integer value in the range to - indicating the TCP port number from which the underlying will communicate. - - - - The underlying will bind to this port for sending messages. - - - Setting the value to 0 (the default) will cause the udp client not to bind to - a local port. - - - The value specified is less than or greater than . - - - - Gets or sets used to write the packets. - - - The used to write the packets. - - - - The used to write the packets. - - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to send logging events - over a network. Classes deriving from can use this - property to get or set this . Use the underlying - returned from if you require access beyond that which - provides. - - - - - Gets or sets the cached remote endpoint to which the logging events should be sent. - - - The cached remote endpoint to which the logging events will be sent. - - - The method will initialize the remote endpoint - with the values of the and - properties. - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Syslog port 514 - - - - - Initializes a new instance of the class. - - - This instance of the class is set up to write - to a remote syslog daemon. - - - - - Add a mapping of level to severity - - The mapping to add - - - Add a mapping to this appender. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to a remote syslog daemon. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to syslog severity mappings set on this appender. - - - - - - Translates a log4net level to a syslog severity. - - A log4net level. - A syslog severity. - - - Translates a log4net level to a syslog severity. - - - - - - Generate a syslog priority. - - The syslog facility. - The syslog severity. - A syslog priority. - - - Generate a syslog priority. - - - - - - The facility. The default facility is . - - - - - The message identity - - - - - Mapping from level object to syslog severity - - - - - Message identity - - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - - - - Syslog facility - - - Set to one of the values. The list of - facilities is predefined and cannot be extended. The default value - is . - - - - - syslog severities - - - - The syslog severities. - - - - - - system is unusable - - - - - action must be taken immediately - - - - - critical conditions - - - - - error conditions - - - - - warning conditions - - - - - normal but significant condition - - - - - informational - - - - - debug-level messages - - - - - syslog facilities - - - - The syslog facilities - - - - - - kernel messages - - - - - random user-level messages - - - - - mail system - - - - - system daemons - - - - - security/authorization messages - - - - - messages generated internally by syslogd - - - - - line printer subsystem - - - - - network news subsystem - - - - - UUCP subsystem - - - - - clock (cron/at) daemon - - - - - security/authorization messages (private) - - - - - ftp daemon - - - - - NTP subsystem - - - - - log audit - - - - - log alert - - - - - clock daemon - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - - - The mapped syslog severity for the specified level - - - - Required property. - The mapped syslog severity for the specified level - - - - - - Delivers logging events to a remote logging sink. - - - - This Appender is designed to deliver events to a remote sink. - That is any object that implements the - interface. It delivers the events using .NET remoting. The - object to deliver events to is specified by setting the - appenders property. - - The RemotingAppender buffers events before sending them. This allows it to - make more efficient use of the remoting infrastructure. - - Once the buffer is full the events are still not sent immediately. - They are scheduled to be sent using a pool thread. The effect is that - the send occurs asynchronously. This is very important for a - number of non obvious reasons. The remoting infrastructure will - flow thread local variables (stored in the ), - if they are marked as , across the - remoting boundary. If the server is not contactable then - the remoting infrastructure will clear the - objects from the . To prevent a logging failure from - having side effects on the calling application the remoting call must be made - from a separate thread to the one used by the application. A - thread is used for this. If no thread is available then - the events will block in the thread pool manager until a thread is available. - - Because the events are sent asynchronously using pool threads it is possible to close - this appender before all the queued events have been sent. - When closing the appender attempts to wait until all the queued events have been sent, but - this will timeout after 30 seconds regardless. - - If this appender is being closed because the - event has fired it may not be possible to send all the queued events. During process - exit the runtime limits the time that a - event handler is allowed to run for. If the runtime terminates the threads before - the queued events have been sent then they will be lost. To ensure that all events - are sent the appender must be closed before the application exits. See - for details on how to shutdown - log4net programmatically. - - - Nicko Cadell - Gert Driesen - Daniel Cazzulino - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Send the contents of the buffer to the remote sink. - - - The events are not sent immediately. They are scheduled to be sent - using a pool thread. The effect is that the send occurs asynchronously. - This is very important for a number of non obvious reasons. The remoting - infrastructure will flow thread local variables (stored in the ), - if they are marked as , across the - remoting boundary. If the server is not contactable then - the remoting infrastructure will clear the - objects from the . To prevent a logging failure from - having side effects on the calling application the remoting call must be made - from a separate thread to the one used by the application. A - thread is used for this. If no thread is available then - the events will block in the thread pool manager until a thread is available. - - The events to send. - - - - Override base class close. - - - - This method waits while there are queued work items. The events are - sent asynchronously using work items. These items - will be sent once a thread pool thread is available to send them, therefore - it is possible to close the appender before all the queued events have been - sent. - - This method attempts to wait until all the queued events have been sent, but this - method will timeout after 30 seconds regardless. - - If the appender is being closed because the - event has fired it may not be possible to send all the queued events. During process - exit the runtime limits the time that a - event handler is allowed to run for. - - - - - A work item is being queued into the thread pool - - - - - A work item from the thread pool has completed - - - - - Send the contents of the buffer to the remote sink. - - - This method is designed to be used with the . - This method expects to be passed an array of - objects in the state param. - - the logging events to send - - - - The URL of the remote sink. - - - - - The local proxy (.NET remoting) for the remote logging sink. - - - - - The number of queued callbacks currently waiting or executing - - - - - Event used to signal when there are no queued work items - - - This event is set when there are no queued work items. In this - state it is safe to close the appender. - - - - - Gets or sets the URL of the well-known object that will accept - the logging events. - - - The well-known URL of the remote sink. - - - - The URL of the remoting sink that will accept logging events. - The sink must implement the - interface. - - - - - - Interface used to deliver objects to a remote sink. - - - This interface must be implemented by a remoting sink - if the is to be used - to deliver logging events to the sink. - - - - - Delivers logging events to the remote sink - - Array of events to log. - - - Delivers logging events to the remote sink - - - - - - Appender that rolls log files based on size or date or both. - - - - RollingFileAppender can roll log files based on size or date or both - depending on the setting of the property. - When set to the log file will be rolled - once its size exceeds the . - When set to the log file will be rolled - once the date boundary specified in the property - is crossed. - When set to the log file will be - rolled once the date boundary specified in the property - is crossed, but within a date boundary the file will also be rolled - once its size exceeds the . - When set to the log file will be rolled when - the appender is configured. This effectively means that the log file can be - rolled once per program execution. - - - A of few additional optional features have been added: - - Attach date pattern for current log file - Backup number increments for newer files - Infinite number of backups by file size - - - - - - For large or infinite numbers of backup files a - greater than zero is highly recommended, otherwise all the backup files need - to be renamed each time a new backup is created. - - - When Date/Time based rolling is used setting - to will reduce the number of file renamings to few or none. - - - - - - Changing or without clearing - the log file directory of backup files will cause unexpected and unwanted side effects. - - - - - If Date/Time based rolling is enabled this appender will attempt to roll existing files - in the directory without a Date/Time tag based on the last write date of the base log file. - The appender only rolls the log file when a message is logged. If Date/Time based rolling - is enabled then the appender will not roll the log file at the Date/Time boundary but - at the point when the next message is logged after the boundary has been crossed. - - - - The extends the and - has the same behavior when opening the log file. - The appender will first try to open the file for writing when - is called. This will typically be during configuration. - If the file cannot be opened for writing the appender will attempt - to open the file again each time a message is logged to the appender. - If the file cannot be opened for writing when a message is logged then - the message will be discarded by this appender. - - - When rolling a backup file necessitates deleting an older backup file the - file to be deleted is moved to a temporary name before being deleted. - - - - - A maximum number of backup files when rolling on date/time boundaries is not supported. - - - - Nicko Cadell - Gert Driesen - Aspi Havewala - Douglas de la Torre - Edward Smit - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Sets the quiet writer being used. - - - This method can be overridden by sub classes. - - the writer to set - - - - Write out a logging event. - - the event to write to file. - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Write out an array of logging events. - - the events to write to file. - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Performs any required rolling before outputting the next event - - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Creates and opens the file for logging. If - is false then the fully qualified name is determined and used. - - the name of the file to open - true to append to existing file - - This method will ensure that the directory structure - for the specified exists. - - - - - Get the current output file name - - the base file name - the output file name - - The output file name is based on the base fileName specified. - If is set then the output - file name is the same as the base file passed in. Otherwise - the output file depends on the date pattern, on the count - direction or both. - - - - - Determines curSizeRollBackups (only within the current roll point) - - - - - Generates a wildcard pattern that can be used to find all files - that are similar to the base file name. - - - - - - - Builds a list of filenames for all files matching the base filename plus a file - pattern. - - - - - - - Initiates a roll over if needed for crossing a date boundary since the last run. - - - - - Initializes based on existing conditions at time of . - - - - Initializes based on existing conditions at time of . - The following is done - - determine curSizeRollBackups (only within the current roll point) - initiates a roll over if needed for crossing a date boundary since the last run. - - - - - - - Does the work of bumping the 'current' file counter higher - to the highest count when an incremental file name is seen. - The highest count is either the first file (when count direction - is greater than 0) or the last file (when count direction less than 0). - In either case, we want to know the highest count that is present. - - - - - - - Takes a list of files and a base file name, and looks for - 'incremented' versions of the base file. Bumps the max - count up to the highest count seen. - - - - - - - Calculates the RollPoint for the datePattern supplied. - - the date pattern to calculate the check period for - The RollPoint that is most accurate for the date pattern supplied - - Essentially the date pattern is examined to determine what the - most suitable roll point is. The roll point chosen is the roll point - with the smallest period that can be detected using the date pattern - supplied. i.e. if the date pattern only outputs the year, month, day - and hour then the smallest roll point that can be detected would be - and hourly roll point as minutes could not be detected. - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Sets initial conditions including date/time roll over information, first check, - scheduledFilename, and calls to initialize - the current number of backups. - - - - - - Rollover the file(s) to date/time tagged file(s). - - set to true if the file to be rolled is currently open - - - Rollover the file(s) to date/time tagged file(s). - Resets curSizeRollBackups. - If fileIsOpen is set then the new file is opened (through SafeOpenFile). - - - - - - Renames file to file . - - Name of existing file to roll. - New name for file. - - - Renames file to file . It - also checks for existence of target file and deletes if it does. - - - - - - Test if a file exists at a specified path - - the path to the file - true if the file exists - - - Test if a file exists at a specified path - - - - - - Deletes the specified file if it exists. - - The file to delete. - - - Delete a file if is exists. - The file is first moved to a new filename then deleted. - This allows the file to be removed even when it cannot - be deleted, but it still can be moved. - - - - - - Implements file roll base on file size. - - - - If the maximum number of size based backups is reached - (curSizeRollBackups == maxSizeRollBackups) then the oldest - file is deleted -- its index determined by the sign of countDirection. - If countDirection < 0, then files - {File.1, ..., File.curSizeRollBackups -1} - are renamed to {File.2, ..., - File.curSizeRollBackups}. Moreover, File is - renamed File.1 and closed. - - - A new file is created to receive further log output. - - - If maxSizeRollBackups is equal to zero, then the - File is truncated with no backup files created. - - - If maxSizeRollBackups < 0, then File is - renamed if needed and no files are deleted. - - - - - - Implements file roll. - - the base name to rename - - - If the maximum number of size based backups is reached - (curSizeRollBackups == maxSizeRollBackups) then the oldest - file is deleted -- its index determined by the sign of countDirection. - If countDirection < 0, then files - {File.1, ..., File.curSizeRollBackups -1} - are renamed to {File.2, ..., - File.curSizeRollBackups}. - - - If maxSizeRollBackups is equal to zero, then the - File is truncated with no backup files created. - - - If maxSizeRollBackups < 0, then File is - renamed if needed and no files are deleted. - - - This is called by to rename the files. - - - - - - Get the start time of the next window for the current rollpoint - - the current date - the type of roll point we are working with - the start time for the next roll point an interval after the currentDateTime date - - - Returns the date of the next roll point after the currentDateTime date passed to the method. - - - The basic strategy is to subtract the time parts that are less significant - than the rollpoint from the current time. This should roll the time back to - the start of the time window for the current rollpoint. Then we add 1 window - worth of time and get the start time of the next window for the rollpoint. - - - - - - This object supplies the current date/time. Allows test code to plug in - a method to control this class when testing date/time based rolling. - - - - - The date pattern. By default, the pattern is set to ".yyyy-MM-dd" - meaning daily rollover. - - - - - The actual formatted filename that is currently being written to - or will be the file transferred to on roll over - (based on staticLogFileName). - - - - - The timestamp when we shall next recompute the filename. - - - - - Holds date of last roll over - - - - - The type of rolling done - - - - - The default maximum file size is 10MB - - - - - There is zero backup files by default - - - - - How many sized based backups have been made so far - - - - - The rolling file count direction. - - - - - The rolling mode used in this appender. - - - - - Cache flag set if we are rolling by date. - - - - - Cache flag set if we are rolling by size. - - - - - Value indicating whether to always log to the same file. - - - - - FileName provided in configuration. Used for rolling properly - - - - - The 1st of January 1970 in UTC - - - - - Gets or sets the date pattern to be used for generating file names - when rolling over on date. - - - The date pattern to be used for generating file names when rolling - over on date. - - - - Takes a string in the same format as expected by - . - - - This property determines the rollover schedule when rolling over - on date. - - - - - - Gets or sets the maximum number of backup files that are kept before - the oldest is erased. - - - The maximum number of backup files that are kept before the oldest is - erased. - - - - If set to zero, then there will be no backup files and the log file - will be truncated when it reaches . - - - If a negative number is supplied then no deletions will be made. Note - that this could result in very slow performance as a large number of - files are rolled over unless is used. - - - The maximum applies to each time based group of files and - not the total. - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size in bytes that the output file is allowed to reach before being - rolled over to backup files. - - - - This property is equivalent to except - that it is required for differentiating the setter taking a - argument from the setter taking a - argument. - - - The default maximum file size is 10MB (10*1024*1024). - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size that the output file is allowed to reach before being - rolled over to backup files. - - - - This property allows you to specify the maximum size with the - suffixes "KB", "MB" or "GB" so that the size is interpreted being - expressed respectively in kilobytes, megabytes or gigabytes. - - - For example, the value "10KB" will be interpreted as 10240 bytes. - - - The default maximum file size is 10MB. - - - If you have the option to set the maximum file size programmatically - consider using the property instead as this - allows you to set the size in bytes as a . - - - - - - Gets or sets the rolling file count direction. - - - The rolling file count direction. - - - - Indicates if the current file is the lowest numbered file or the - highest numbered file. - - - By default newer files have lower numbers ( < 0), - i.e. log.1 is most recent, log.5 is the 5th backup, etc... - - - >= 0 does the opposite i.e. - log.1 is the first backup made, log.5 is the 5th backup made, etc. - For infinite backups use >= 0 to reduce - rollover costs. - - The default file count direction is -1. - - - - - Gets or sets the rolling style. - - The rolling style. - - - The default rolling style is . - - - When set to this appender's - property is set to false, otherwise - the appender would append to a single file rather than rolling - the file each time it is opened. - - - - - - Gets or sets a value indicating whether to always log to - the same file. - - - true if always should be logged to the same file, otherwise false. - - - - By default file.log is always the current file. Optionally - file.log.yyyy-mm-dd for current formatted datePattern can by the currently - logging file (or file.log.curSizeRollBackup or even - file.log.yyyy-mm-dd.curSizeRollBackup). - - - This will make time based rollovers with a large number of backups - much faster as the appender it won't have to rename all the backups! - - - - - - Style of rolling to use - - - - Style of rolling to use - - - - - - Roll files once per program execution - - - - Roll files once per program execution. - Well really once each time this appender is - configured. - - - Setting this option also sets AppendToFile to - false on the RollingFileAppender, otherwise - this appender would just be a normal file appender. - - - - - - Roll files based only on the size of the file - - - - - Roll files based only on the date - - - - - Roll files based on both the size and date of the file - - - - - The code assumes that the following 'time' constants are in a increasing sequence. - - - - The code assumes that the following 'time' constants are in a increasing sequence. - - - - - - Roll the log not based on the date - - - - - Roll the log for each minute - - - - - Roll the log for each hour - - - - - Roll the log twice a day (midday and midnight) - - - - - Roll the log each day (midnight) - - - - - Roll the log each week - - - - - Roll the log each month - - - - - This interface is used to supply Date/Time information to the . - - - This interface is used to supply Date/Time information to the . - Used primarily to allow test classes to plug themselves in so they can - supply test date/times. - - - - - Gets the current time. - - The current time. - - - Gets the current time. - - - - - - Default implementation of that returns the current time. - - - - - Gets the current time. - - The current time. - - - Gets the current time. - - - - - - Send an e-mail when a specific logging event occurs, typically on errors - or fatal errors. - - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. - For these features to be enabled you need to ensure that you are using a version of - the log4net assembly that is built against the MS .NET 1.1 framework and that you are - running the your application on the MS .NET 1.1 runtime. On all other platforms only sending - unauthenticated messages to a server listening on port 25 (the default) is supported. - - - Authentication is supported by setting the property to - either or . - If using authentication then the - and properties must also be set. - - - To set the SMTP server port use the property. The default port is 25. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Default constructor - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - - Send the email message - - the body text to include in the mail - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses. - - - A semicolon-delimited list of e-mail addresses. - - - - A semicolon-delimited list of recipient e-mail addresses. - - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - The e-mail address of the sender. - - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - The subject line of the e-mail message. - - - - - - Gets or sets the name of the SMTP relay mail server to use to send - the e-mail messages. - - - The name of the e-mail relay server. If SmtpServer is not set, the - name of the local SMTP server is used. - - - - The name of the e-mail relay server. If SmtpServer is not set, the - name of the local SMTP server is used. - - - - - - Obsolete - - - Use the BufferingAppenderSkeleton Fix methods instead - - - - Obsolete property. - - - - - - The mode to use to authentication with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - Valid Authentication mode values are: , - , and . - The default value is . When using - you must specify the - and to use to authenticate. - When using the Windows credentials for the current - thread, if impersonating, or the process will be used to authenticate. - - - - - - The username to use to authenticate with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - A and must be specified when - is set to , - otherwise the username will be ignored. - - - - - - The password to use to authenticate with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - A and must be specified when - is set to , - otherwise the password will be ignored. - - - - - - The port on which the SMTP server is listening - - - Server Port is only available on the MS .NET 1.1 runtime. - - The port on which the SMTP server is listening. The default - port is 25. The Port can only be changed when running on - the MS .NET 1.1 runtime. - - - - - - Gets or sets the priority of the e-mail message - - - One of the values. - - - - Sets the priority of the e-mails generated by this - appender. The default priority is . - - - If you are using this appender to report errors then - you may want to set the priority to . - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Values for the property. - - - - SMTP authentication modes. - - - - - - No authentication - - - - - Basic authentication. - - - Requires a username and password to be supplied - - - - - Integrated authentication - - - Uses the Windows credentials from the current thread or process to authenticate. - - - - - Send an email when a specific logging event occurs, typically on errors - or fatal errors. Rather than sending via smtp it writes a file into the - directory specified by . This allows services such - as the IIS SMTP agent to manage sending the messages. - - - - The configuration for this appender is identical to that of the SMTPAppender, - except that instead of specifying the SMTPAppender.SMTPHost you specify - . - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - Niall Daley - Nicko Cadell - - - - Default constructor - - - - Default constructor - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - Sends the contents of the cyclic buffer as an e-mail message. - - - - - - Activate the options on this appender. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Convert a path into a fully qualified path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - - - - The security context to use for privileged calls - - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses. - - - A semicolon-delimited list of e-mail addresses. - - - - A semicolon-delimited list of e-mail addresses. - - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - The e-mail address of the sender. - - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - The subject line of the e-mail message. - - - - - - Gets or sets the path to write the messages to. - - - - Gets or sets the path to write the messages to. This should be the same - as that used by the agent sending the messages. - - - - - - Gets or sets the used to write to the pickup directory. - - - The used to write to the pickup directory. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appender that allows clients to connect via Telnet to receive log messages - - - - The TelnetAppender accepts socket connections and streams logging messages - back to the client. - The output is provided in a telnet-friendly way so that a log can be monitored - over a TCP/IP socket. - This allows simple remote monitoring of application logging. - - - The default is 23 (the telnet port). - - - Keith Long - Nicko Cadell - - - - Default constructor - - - - Default constructor - - - - - - Overrides the parent method to close the socket handler - - - - Closes all the outstanding connections. - - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Create the socket handler and wait for connections - - - - - - Writes the logging event to each connected client. - - The event to log. - - - Writes the logging event to each connected client. - - - - - - Gets or sets the TCP port number on which this will listen for connections. - - - An integer value in the range to - indicating the TCP port number on which this will listen for connections. - - - - The default value is 23 (the telnet port). - - - The value specified is less than - or greater than . - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Helper class to manage connected clients - - - - The SocketHandler class is used to accept connections from - clients. It is threaded so that clients can connect/disconnect - asynchronously. - - - - - - Opens a new server port on - - the local port to listen on for connections - - - Creates a socket handler on the specified local server port. - - - - - - Sends a string message to each of the connected clients - - the text to send - - - Sends a string message to each of the connected clients - - - - - - Add a client to the internal clients list - - client to add - - - - Remove a client from the internal clients list - - client to remove - - - - Callback used to accept a connection on the server socket - - The result of the asynchronous operation - - - On connection adds to the list of connections - if there are two many open connections you will be disconnected - - - - - - Close all network connections - - - - Make sure we close all network connections - - - - - - Test if this handler has active connections - - - true if this handler has active connections - - - - This property will be true while this handler has - active connections, that is at least one connection that - the handler will attempt to send a message to. - - - - - - Class that represents a client connected to this handler - - - - Class that represents a client connected to this handler - - - - - - Create this for the specified - - the client's socket - - - Opens a stream writer on the socket. - - - - - - Write a string to the client - - string to send - - - Write a string to the client - - - - - - Cleanup the clients connection - - - - Close the socket connection. - - - - - - Appends log events to the system. - - - - The application configuration file can be used to control what listeners - are actually used. See the MSDN documentation for the - class for details on configuring the - trace system. - - - Events are written using the System.Diagnostics.Trace.Write(string,string) - method. The event's logger name is passed as the value for the category name to the Write method. - - - Compact Framework
    - The Compact Framework does not support the - class for any operation except Assert. When using the Compact Framework this - appender will write to the system rather than - the Trace system. This appender will therefore behave like the . -
    -
    - Douglas de la Torre - Nicko Cadell - Gert Driesen -
    - - - Initializes a new instance of the . - - - - Default constructor. - - - - - - Initializes a new instance of the - with a specified layout. - - The layout to use with this appender. - - - Obsolete constructor. - - - - - - Writes the logging event to the system. - - The event to log. - - - Writes the logging event to the system. - - - - - - Immediate flush means that the underlying writer or output stream - will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logs events are not actually written to persistent media if and - when the application crashes. - - - The default value is true. - - - - - Gets or sets a value that indicates whether the appender will - flush at the end of each write. - - - The default behavior is to flush at the end of each - write. If the option is set tofalse, then the underlying - stream can defer writing to physical medium to a later time. - - - Avoiding the flush operation at the end of each append results - in a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Assembly level attribute that specifies a domain to alias to this assembly's repository. - - - - AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. - - - An assembly's logger repository is defined by its , - however this can be overridden by an assembly loaded before the target assembly. - - - An assembly can alias another assembly's domain to its repository by - specifying this attribute with the name of the target domain. - - - This attribute can only be specified on the assembly and may be used - as many times as necessary to alias all the required domains. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute that specifies a repository to alias to this assembly's repository. - - - - An assembly's logger repository is defined by its , - however this can be overridden by an assembly loaded before the target assembly. - - - An assembly can alias another assembly's repository to its repository by - specifying this attribute with the name of the target repository. - - - This attribute can only be specified on the assembly and may be used - as many times as necessary to alias all the required repositories. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class with - the specified repository to alias to this assembly's repository. - - The repository to alias to this assemby's repository. - - - Initializes a new instance of the class with - the specified repository to alias to this assembly's repository. - - - - - - Gets or sets the repository to alias to this assemby's repository. - - - The repository to alias to this assemby's repository. - - - - The name of the repository to alias to this assemby's repository. - - - - - - Initializes a new instance of the class with - the specified domain to alias to this assembly's repository. - - The domain to alias to this assemby's repository. - - - Obsolete. Use instead of . - - - - - - Use this class to quickly configure a . - - - - Allows very simple programmatic configuration of log4net. - - - Only one appender can be configured using this configurator. - The appender is set at the root of the hierarchy and all logging - events will be delivered to that appender. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Initializes the log4net system with a default configuration. - - - - Initializes the log4net logging system using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the log4net system using the specified appender. - - The appender to use to log all logging events. - - - Initializes the log4net system using the specified appender. - - - - - - Initializes the with a default configuration. - - The repository to configure. - - - Initializes the specified repository using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the using the specified appender. - - The repository to configure. - The appender to use to log all logging events. - - - Initializes the using the specified appender. - - - - - - Base class for all log4net configuration attributes. - - - This is an abstract class that must be extended by - specific configurators. This attribute allows the - configurator to be parameterized by an assembly level - attribute. - - Nicko Cadell - Gert Driesen - - - - Constructor used by subclasses. - - the ordering priority for this configurator - - - The is used to order the configurator - attributes before they are invoked. Higher priority configurators are executed - before lower priority ones. - - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - Abstract method implemented by a subclass. When this method is called - the subclass should configure the . - - - - - - Compare this instance to another ConfiguratorAttribute - - the object to compare to - see - - - Compares the priorities of the two instances. - Sorts by priority in descending order. Objects with the same priority are - randomly ordered. - - - - - - Assembly level attribute that specifies the logging domain for the assembly. - - - - DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - Assemblies are mapped to logging domains. Each domain has its own - logging repository. This attribute specified on the assembly controls - the configuration of the domain. The property specifies the name - of the domain that this assembly is a part of. The - specifies the type of the repository objects to create for the domain. If - this attribute is not specified and a is not specified - then the assembly will be part of the default shared logging domain. - - - This attribute can only be specified on the assembly and may only be used - once per assembly. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute that specifies the logging repository for the assembly. - - - - Assemblies are mapped to logging repository. This attribute specified - on the assembly controls - the configuration of the repository. The property specifies the name - of the repository that this assembly is a part of. The - specifies the type of the object - to create for the assembly. If this attribute is not specified or a - is not specified then the assembly will be part of the default shared logging repository. - - - This attribute can only be specified on the assembly and may only be used - once per assembly. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initialize a new instance of the class - with the name of the repository. - - The name of the repository. - - - Initialize the attribute with the name for the assembly's repository. - - - - - - Gets or sets the name of the logging repository. - - - The string name to use as the name of the repository associated with this - assembly. - - - - This value does not have to be unique. Several assemblies can share the - same repository. They will share the logging configuration of the repository. - - - - - - Gets or sets the type of repository to create for this assembly. - - - The type of repository to create for this assembly. - - - - The type of the repository to create for the assembly. - The type must implement the - interface. - - - This will be the type of repository created when - the repository is created. If multiple assemblies reference the - same repository then the repository is only created once using the - of the first assembly to call into the - repository. - - - - - - Initializes a new instance of the class. - - - - Obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - - - - Initialize a new instance of the class - with the name of the domain. - - The name of the domain. - - - Obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - - - - Use this class to initialize the log4net environment using an Xml tree. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - Configures a using an Xml tree. - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - - - Automatically configures the log4net system based on the - application's configuration settings. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - - - Automatically configures the using settings - stored in the application's configuration file. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - The repository to configure. - - - - Configures log4net using a log4net element - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Loads the log4net configuration from the XML element - supplied as . - - The element to parse. - - - - Configures the using the specified XML - element. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Loads the log4net configuration from the XML element - supplied as . - - The repository to configure. - The element to parse. - - - - Configures log4net using the specified configuration file. - - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures log4net using the specified configuration file. - - A stream to load the XML configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The stream to load the XML configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures log4net using the file specified, monitors the file for changes - and reloads the configuration if a change is detected. - - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the using the file specified, - monitors the file for changes and reloads the configuration if a change - is detected. - - The repository to configure. - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Assembly level attribute to configure the . - - - - AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute to configure the . - - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - If neither of the or - properties are set the configuration is loaded from the application's .config file. - If set the property takes priority over the - property. The property - specifies a path to a file to load the config from. The path is relative to the - application's base directory; . - The property is used as a postfix to the assembly file name. - The config file must be located in the application's base directory; . - For example in a console application setting the to - config has the same effect as not specifying the or - properties. - - - The property can be set to cause the - to watch the configuration file for changes. - - - - Log4net will only look for assembly level configuration attributes once. - When using the log4net assembly level attributes to control the configuration - of log4net you must ensure that the first call to any of the - methods is made from the assembly with the configuration - attributes. - - - If you cannot guarantee the order in which log4net calls will be made from - different assemblies you must use programmatic configuration instead, i.e. - call the method directly. - - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Default constructor - - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - Configure the repository using the . - The specified must extend the - class otherwise the will not be able to - configure it. - - - The does not extend . - - - - Attempt to load configuration from the local file system - - The assembly that this attribute was defined on. - The repository to configure. - - - - Configure the specified repository using a - - The repository to configure. - the FileInfo pointing to the config file - - - - Attempt to load configuration from a URI - - The assembly that this attribute was defined on. - The repository to configure. - - - - Gets or sets the filename of the configuration file. - - - The filename of the configuration file. - - - - If specified, this is the name of the configuration file to use with - the . This file path is relative to the - application base directory (). - - - The takes priority over the . - - - - - - Gets or sets the extension of the configuration file. - - - The extension of the configuration file. - - - - If specified this is the extension for the configuration file. - The path to the config file is built by using the application - base directory (), - the assembly file name and the config file extension. - - - If the is set to MyExt then - possible config file names would be: MyConsoleApp.exe.MyExt or - MyClassLibrary.dll.MyExt. - - - The takes priority over the . - - - - - - Gets or sets a value indicating whether to watch the configuration file. - - - true if the configuration should be watched, false otherwise. - - - - If this flag is specified and set to true then the framework - will watch the configuration file and will reload the config each time - the file is modified. - - - The config file can only be watched if it is loaded from local disk. - In a No-Touch (Smart Client) deployment where the application is downloaded - from a web server the config file may not reside on the local disk - and therefore it may not be able to watch it. - - - Watching configuration is not supported on the SSCLI. - - - - - - Class to register for the log4net section of the configuration file - - - The log4net section of the configuration file needs to have a section - handler registered. This is the section handler used. It simply returns - the XML element that is the root of the section. - - - Example of registering the log4net section handler : - - - -
    - - - log4net configuration XML goes here - - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Parses the configuration section. - - The configuration settings in a corresponding parent configuration section. - The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. - The for the log4net section. - The for the log4net section. - - - Returns the containing the configuration data, - - - - - - Assembly level attribute that specifies a plugin to attach to - the repository. - - - - Specifies the type of a plugin to create and attach to the - assembly's repository. The plugin type must implement the - interface. - - - Nicko Cadell - Gert Driesen - - - - Interface used to create plugins. - - - - Interface used to create a plugin. - - - Nicko Cadell - Gert Driesen - - - - Creates the plugin object. - - the new plugin instance - - - Create and return a new plugin instance. - - - - - - Initializes a new instance of the class - with the specified type. - - The type name of plugin to create. - - - Create the attribute with the plugin type specified. - - - Where possible use the constructor that takes a . - - - - - - Initializes a new instance of the class - with the specified type. - - The type of plugin to create. - - - Create the attribute with the plugin type specified. - - - - - - Creates the plugin object defined by this attribute. - - - - Creates the instance of the object as - specified by this attribute. - - - The plugin object. - - - - Returns a representation of the properties of this object. - - - - Overrides base class method to - return a representation of the properties of this object. - - - A representation of the properties of this object - - - - Gets or sets the type for the plugin. - - - The type for the plugin. - - - - The type for the plugin. - - - - - - Gets or sets the type name for the plugin. - - - The type name for the plugin. - - - - The type name for the plugin. - - - Where possible use the property instead. - - - - - - Assembly level attribute to configure the . - - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - Nicko Cadell - - - - Construct provider attribute with type specified - - the type of the provider to use - - - The provider specified must subclass the - class. - - - - - - Configures the SecurityContextProvider - - The assembly that this attribute was defined on. - The repository to configure. - - - Creates a provider instance from the specified. - Sets this as the default security context provider . - - - - - - Gets or sets the type of the provider to use. - - - the type of the provider to use. - - - - The provider specified must subclass the - class. - - - - - - Use this class to initialize the log4net environment using an Xml tree. - - - - Configures a using an Xml tree. - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - - - Automatically configures the log4net system based on the - application's configuration settings. - - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - To use this method to configure log4net you must specify - the section - handler for the log4net configuration section. See the - for an example. - - - - - - - Automatically configures the using settings - stored in the application's configuration file. - - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - To use this method to configure log4net you must specify - the section - handler for the log4net configuration section. See the - for an example. - - - The repository to configure. - - - - Configures log4net using a log4net element - - - - Loads the log4net configuration from the XML element - supplied as . - - - The element to parse. - - - - Configures the using the specified XML - element. - - - Loads the log4net configuration from the XML element - supplied as . - - The repository to configure. - The element to parse. - - - - Configures log4net using the specified configuration file. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The first element matching <configuration> will be read as the - configuration. If this file is also a .NET .config file then you must specify - a configuration section for the log4net element otherwise .NET will - complain. Set the type for the section handler to , for example: - - -
    - - - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures log4net using the specified configuration URI. - - A URI to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The must support the URI scheme specified. - - - - - - Configures log4net using the specified configuration data stream. - - A stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The first element matching <configuration> will be read as the - configuration. If this file is also a .NET .config file then you must specify - a configuration section for the log4net element otherwise .NET will - complain. Set the type for the section handler to , for example: - - -
    - - - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures the using the specified configuration - URI. - - The repository to configure. - A URI to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The must support the URI scheme specified. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures log4net using the file specified, monitors the file for changes - and reloads the configuration if a change is detected. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the using the file specified, - monitors the file for changes and reloads the configuration if a change - is detected. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the specified repository using a log4net element. - - The hierarchy to configure. - The element to parse. - - - Loads the log4net configuration from the XML element - supplied as . - - - This method is ultimately called by one of the Configure methods - to load the configuration from an . - - - - - - Class used to watch config files. - - - - Uses the to monitor - changes to a specified file. Because multiple change notifications - may be raised when the file is modified, a timer is used to - compress the notifications into a single event. The timer - waits for time before delivering - the event notification. If any further - change notifications arrive while the timer is waiting it - is reset and waits again for to - elapse. - - - - - - The default amount of time to wait after receiving notification - before reloading the config file. - - - - - Watch a specified config file used to configure a repository - - The repository to configure. - The configuration file to watch. - - - Watch a specified config file used to configure a repository - - - - - - Holds the FileInfo used to configure the XmlConfigurator - - - - - Holds the repository being configured. - - - - - The timer used to compress the notification events. - - - - - Initializes a new instance of the class. - - The repository to configure. - The configuration file to watch. - - - Initializes a new instance of the class. - - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - - This handler reloads the configuration from the file when the event is fired. - - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - - This handler reloads the configuration from the file when the event is fired. - - - - - - Called by the timer when the configuration has been updated. - - null - - - - The implementation of the interface suitable - for use with the compact framework - - - - This implementation is a simple - mapping between repository name and - object. - - - The .NET Compact Framework 1.0 does not support retrieving assembly - level attributes therefore unlike the DefaultRepositorySelector - this selector does not examine the calling assembly for attributes. - - - Nicko Cadell - - - - Interface used by the to select the . - - - - The uses a - to specify the policy for selecting the correct - to return to the caller. - - - Nicko Cadell - Gert Driesen - - - - Gets the for the specified assembly. - - The assembly to use to lookup to the - The for the assembly. - - - Gets the for the specified assembly. - - - How the association between and - is made is not defined. The implementation may choose any method for - this association. The results of this method must be repeatable, i.e. - when called again with the same arguments the result must be the - save value. - - - - - - Gets the named . - - The name to use to lookup to the . - The named - - Lookup a named . This is the repository created by - calling . - - - - - Creates a new repository for the assembly specified. - - The assembly to use to create the domain to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - How the association between and - is made is not defined. The implementation may choose any method for - this association. - - - - - - Creates a new repository with the name specified. - - The name to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the name - specified such that a call to with the - same name will return the same repository instance. - - - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets an array of all currently defined repositories. - - - An array of the instances created by - this . - - - Gets an array of all of the repositories created by this selector. - - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - Create a new repository selector - - the type of the repositories to create, must implement - - - Create an new compact repository selector. - The default type for repositories must be specified, - an appropriate value would be . - - - throw if is null - throw if does not implement - - - - Get the for the specified assembly - - not used - The default - - - The argument is not used. This selector does not create a - separate repository for each assembly. - - - As a named repository is not specified the default repository is - returned. The default repository is named log4net-default-repository. - - - - - - Get the named - - the name of the repository to lookup - The named - - - Get the named . The default - repository is log4net-default-repository. Other repositories - must be created using the . - If the named repository does not exist an exception is thrown. - - - throw if is null - throw if the does not exist - - - - Create a new repository for the assembly specified - - not used - the type of repository to create, must implement - the repository created - - - The argument is not used. This selector does not create a - separate repository for each assembly. - - - If the is null then the - default repository type specified to the constructor is used. - - - As a named repository is not specified the default repository is - returned. The default repository is named log4net-default-repository. - - - - - - Create a new repository for the repository specified - - the repository to associate with the - the type of repository to create, must implement . - If this param is null then the default repository type is used. - the repository created - - - The created will be associated with the repository - specified such that a call to with the - same repository specified will return the same repository instance. - - - If the named repository already exists an exception will be thrown. - - - If is null then the default - repository type specified to the constructor is used. - - - throw if is null - throw if the already exists - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets a list of objects - - an array of all known objects - - - Gets an array of all of the repositories created by this selector. - - - - - - Notify the registered listeners that the repository has been created - - The repository that has been created - - - Raises the LoggerRepositoryCreatedEvent - event. - - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - The default implementation of the interface. - - - - Uses attributes defined on the calling assembly to determine how to - configure the hierarchy for the repository. - - - Nicko Cadell - Gert Driesen - - - - Creates a new repository selector. - - The type of the repositories to create, must implement - - - Create an new repository selector. - The default type for repositories must be specified, - an appropriate value would be . - - - is . - does not implement . - - - - Gets the for the specified assembly. - - The assembly use to lookup the . - - - The type of the created and the repository - to create can be overridden by specifying the - attribute on the . - - - The default values are to use the - implementation of the interface and to use the - as the name of the repository. - - - The created will be automatically configured using - any attributes defined on - the . - - - The for the assembly - is . - - - - Gets the for the specified repository. - - The repository to use to lookup the . - The for the specified repository. - - - Returns the named repository. If is null - a is thrown. If the repository - does not exist a is thrown. - - - Use to create a repository. - - - is . - does not exist. - - - - Create a new repository for the assembly specified - - the assembly to use to create the repository to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the repository to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the repository. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - is . - - - - Creates a new repository for the assembly specified. - - the assembly to use to create the repository to associate with the . - The type of repository to create, must implement . - The name to assign to the created repository - Set to true to read and apply the assembly attributes - The repository created. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the repository to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the repository. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - is . - - - - Creates a new repository for the specified repository. - - The repository to associate with the . - The type of repository to create, must implement . - If this param is then the default repository type is used. - The new repository. - - - The created will be associated with the repository - specified such that a call to with the - same repository specified will return the same repository instance. - - - is . - already exists. - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets a list of objects - - an array of all known objects - - - Gets an array of all of the repositories created by this selector. - - - - - - Aliases a repository to an existing repository. - - The repository to alias. - The repository that the repository is aliased to. - - - The repository specified will be aliased to the repository when created. - The repository must not already exist. - - - When the repository is created it must utilize the same repository type as - the repository it is aliased to, otherwise the aliasing will fail. - - - - is . - -or- - is . - - - - - Notifies the registered listeners that the repository has been created. - - The repository that has been created. - - - Raises the event. - - - - - - Gets the repository name and repository type for the specified assembly. - - The assembly that has a . - in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. - in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. - is . - - - - Configures the repository using information from the assembly. - - The assembly containing - attributes which define the configuration for the repository. - The repository to configure. - - is . - -or- - is . - - - - - Loads the attribute defined plugins on the assembly. - - The assembly that contains the attributes. - The repository to add the plugins to. - - is . - -or- - is . - - - - - Loads the attribute defined aliases on the assembly. - - The assembly that contains the attributes. - The repository to alias to. - - is . - -or- - is . - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - Defined error codes that can be passed to the method. - - - - Values passed to the method. - - - Nicko Cadell - - - - A general error - - - - - Error while writing output - - - - - Failed to flush file - - - - - Failed to close file - - - - - Unable to open output file - - - - - No layout specified - - - - - Failed to parse address - - - - - Appenders may delegate their error handling to an . - - - - Error handling is a particularly tedious to get right because by - definition errors are hard to predict and to reproduce. - - - Nicko Cadell - Gert Driesen - - - - Handles the error and information about the error condition is passed as - a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - The error code associated with the error. - - - Handles the error and information about the error condition is passed as - a parameter. - - - - - - Prints the error message passed as a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - - - See . - - - - - - Prints the error message passed as a parameter. - - The message associated with the error. - - - See . - - - - - - Interface for objects that require fixing. - - - - Interface that indicates that the object requires fixing before it - can be taken outside the context of the appender's - method. - - - When objects that implement this interface are stored - in the context properties maps - and - are fixed - (see ) the - method will be called. - - - Nicko Cadell - - - - Get a portable version of this object - - the portable instance of this object - - - Get a portable instance object that represents the current - state of this object. The portable object can be stored - and logged from any thread with identical results. - - - - - - Interface that all loggers implement - - - - This interface supports logging events and testing if a level - is enabled for logging. - - - These methods will not throw exceptions. Note to implementor, ensure - that the implementation of these methods cannot allow an exception - to be thrown to the caller. - - - Nicko Cadell - Gert Driesen - - - - This generic form is intended to be used by wrappers. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - the exception to log, including its stack trace. Pass null to not log an exception. - - - Generates a logging event for the specified using - the and . - - - - - - This is the most generic printing method that is intended to be used - by wrappers. - - The event being logged. - - - Logs the specified logging event through this logger. - - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - Test if this logger is going to log events of the specified . - - - - - - Gets the name of the logger. - - - The name of the logger. - - - - The name of this logger - - - - - - Gets the where this - Logger instance is attached to. - - - The that this logger belongs to. - - - - Gets the where this - Logger instance is attached to. - - - - - - Base interface for all wrappers - - - - Base interface for all wrappers. - - - All wrappers must implement this interface. - - - Nicko Cadell - - - - Get the implementation behind this wrapper object. - - - The object that in implementing this object. - - - - The object that in implementing this - object. The Logger object may not - be the same object as this object because of logger decorators. - This gets the actual underlying objects that is used to process - the log events. - - - - - - Delegate used to handle logger repository creation event notifications - - The which created the repository. - The event args - that holds the instance that has been created. - - - Delegate used to handle logger repository creation event notifications. - - - - - - Provides data for the event. - - - - A - event is raised every time a is created. - - - - - - The created - - - - - Construct instance using specified - - the that has been created - - - Construct instance using specified - - - - - - The that has been created - - - The that has been created - - - - The that has been created - - - - - - Test if an triggers an action - - - - Implementations of this interface allow certain appenders to decide - when to perform an appender specific action. - - - The action or behavior triggered is defined by the implementation. - - - Nicko Cadell - - - - Test if this event triggers the action - - The event to check - true if this event triggers the action, otherwise false - - - Return true if this event triggers the action - - - - - - Defines the default set of levels recognized by the system. - - - - Each has an associated . - - - Levels have a numeric that defines the relative - ordering between levels. Two Levels with the same - are deemed to be equivalent. - - - The levels that are recognized by log4net are set for each - and each repository can have different levels defined. The levels are stored - in the on the repository. Levels are - looked up by name from the . - - - When logging at level INFO the actual level used is not but - the value of LoggerRepository.LevelMap["INFO"]. The default value for this is - , but this can be changed by reconfiguring the level map. - - - Each level has a in addition to its . The - is the string that is written into the output log. By default - the display name is the same as the level name, but this can be used to alias levels - or to localize the log output. - - - Some of the predefined levels recognized by the system are: - - - - . - - - . - - - . - - - . - - - . - - - . - - - . - - - - Nicko Cadell - Gert Driesen - - - - Constructor - - Integer value for this level, higher values represent more severe levels. - The string name of this level. - The display name for this level. This may be localized or otherwise different from the name - - - Initializes a new instance of the class with - the specified level name and value. - - - - - - Constructor - - Integer value for this level, higher values represent more severe levels. - The string name of this level. - - - Initializes a new instance of the class with - the specified level name and value. - - - - - - Returns the representation of the current - . - - - A representation of the current . - - - - Returns the level . - - - - - - Compares levels. - - The object to compare against. - true if the objects are equal. - - - Compares the levels of instances, and - defers to base class if the target object is not a - instance. - - - - - - Returns a hash code - - A hash code for the current . - - - Returns a hash code suitable for use in hashing algorithms and data - structures like a hash table. - - - Returns the hash code of the level . - - - - - - Compares this instance to a specified object and returns an - indication of their relative values. - - A instance or to compare with this instance. - - A 32-bit signed integer that indicates the relative order of the - values compared. The return value has these meanings: - - - Value - Meaning - - - Less than zero - This instance is less than . - - - Zero - This instance is equal to . - - - Greater than zero - - This instance is greater than . - -or- - is . - - - - - - - must be an instance of - or ; otherwise, an exception is thrown. - - - is not a . - - - - Returns a value indicating whether a specified - is greater than another specified . - - A - A - - true if is greater than - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is less than another specified . - - A - A - - true if is less than - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is greater than or equal to another specified . - - A - A - - true if is greater than or equal to - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is less than or equal to another specified . - - A - A - - true if is less than or equal to - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether two specified - objects have the same value. - - A or . - A or . - - true if the value of is the same as the - value of ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether two specified - objects have different values. - - A or . - A or . - - true if the value of is different from - the value of ; otherwise, false. - - - - Compares two levels. - - - - - - Compares two specified instances. - - The first to compare. - The second to compare. - - A 32-bit signed integer that indicates the relative order of the - two values compared. The return value has these meanings: - - - Value - Meaning - - - Less than zero - is less than . - - - Zero - is equal to . - - - Greater than zero - is greater than . - - - - - - Compares two levels. - - - - - - The level designates a higher level than all the rest. - - - - - The level designates very severe error events. - System unusable, emergencies. - - - - - The level designates very severe error events - that will presumably lead the application to abort. - - - - - The level designates very severe error events. - Take immediate action, alerts. - - - - - The level designates very severe error events. - Critical condition, critical. - - - - - The level designates very severe error events. - - - - - The level designates error events that might - still allow the application to continue running. - - - - - The level designates potentially harmful - situations. - - - - - The level designates informational messages - that highlight the progress of the application at the highest level. - - - - - The level designates informational messages that - highlight the progress of the application at coarse-grained level. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates the lowest level possible. - - - - - Gets the name of this level. - - - The name of this level. - - - - Gets the name of this level. - - - - - - Gets the value of this level. - - - The value of this level. - - - - Gets the value of this level. - - - - - - Gets the display name of this level. - - - The display name of this level. - - - - Gets the display name of this level. - - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a LevelCollection instance. - - list to create a readonly wrapper arround - - A LevelCollection wrapper that is read-only. - - - - - Initializes a new instance of the LevelCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the LevelCollection class - that has the specified initial capacity. - - - The number of elements that the new LevelCollection is initially capable of storing. - - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified LevelCollection. - - The LevelCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - Copies the entire LevelCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire LevelCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the LevelCollection. - - The to be added to the end of the LevelCollection. - The index at which the value has been added. - - - - Removes all elements from the LevelCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the LevelCollection. - - The to check for. - true if is found in the LevelCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the LevelCollection. - - The to locate in the LevelCollection. - - The zero-based index of the first occurrence of - in the entire LevelCollection, if found; otherwise, -1. - - - - - Inserts an element into the LevelCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the LevelCollection. - - The to remove from the LevelCollection. - - The specified was not found in the LevelCollection. - - - - - Removes the element at the specified index of the LevelCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the LevelCollection. - - An for the entire LevelCollection. - - - - Adds the elements of another LevelCollection to the current LevelCollection. - - The LevelCollection whose elements should be added to the end of the current LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a array to the current LevelCollection. - - The array whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a collection to the current LevelCollection. - - The collection whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the LevelCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the LevelCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - A value - - - - - Supports simple iteration over a . - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - An evaluator that triggers at a threshold level - - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - Nicko Cadell - - - - The threshold for triggering - - - - - Create a new evaluator using the threshold. - - - - Create a new evaluator using the threshold. - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Create a new evaluator using the specified threshold. - - the threshold to trigger at - - - Create a new evaluator using the specified threshold. - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Is this the triggering event? - - The event to check - This method returns true, if the event level - is equal or higher than the . - Otherwise it returns false - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - the threshold to trigger at - - - The that will cause this evaluator to trigger - - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Mapping between string name and Level object - - - - Mapping between string name and object. - This mapping is held separately for each . - The level name is case insensitive. - - - Nicko Cadell - - - - Mapping from level name to Level object. The - level name is case insensitive - - - - - Construct the level map - - - - Construct the level map. - - - - - - Clear the internal maps of all levels - - - - Clear the internal maps of all levels - - - - - - Create a new Level and add it to the map - - the string to display for the Level - the level value to give to the Level - - - Create a new Level and add it to the map - - - - - - - Create a new Level and add it to the map - - the string to display for the Level - the level value to give to the Level - the display name to give to the Level - - - Create a new Level and add it to the map - - - - - - Add a Level to the map - - the Level to add - - - Add a Level to the map - - - - - - Lookup a named level from the map - - the name of the level to lookup is taken from this level. - If the level is not set on the map then this level is added - the level in the map with the name specified - - - Lookup a named level from the map. The name of the level to lookup is taken - from the property of the - argument. - - - If no level with the specified name is found then the - argument is added to the level map - and returned. - - - - - - Lookup a by name - - The name of the Level to lookup - a Level from the map with the name specified - - - Returns the from the - map with the name specified. If the no level is - found then null is returned. - - - - - - Return all possible levels as a list of Level objects. - - all possible levels as a list of Level objects - - - Return all possible levels as a list of Level objects. - - - - - - The internal representation of caller location information. - - - - This class uses the System.Diagnostics.StackTrace class to generate - a call stack. The caller's information is then extracted from this stack. - - - The System.Diagnostics.StackTrace class is not supported on the - .NET Compact Framework 1.0 therefore caller location information is not - available on that framework. - - - The System.Diagnostics.StackTrace class has this to say about Release builds: - - - "StackTrace information will be most informative with Debug build configurations. - By default, Debug builds include debug symbols, while Release builds do not. The - debug symbols contain most of the file, method name, line number, and column - information used in constructing StackFrame and StackTrace objects. StackTrace - might not report as many method calls as expected, due to code transformations - that occur during optimization." - - - This means that in a Release build the caller information may be incomplete or may - not exist at all! Therefore caller location information cannot be relied upon in a Release build. - - - Nicko Cadell - Gert Driesen - - - - When location information is not available the constant - NA is returned. Current value of this string - constant is ?. - - - - - Constructor - - The declaring type of the method that is - the stack boundary into the logging system for this call. - - - Initializes a new instance of the - class based on the current thread. - - - - - - Constructor - - The fully qualified class name. - The method name. - The file name. - The line number of the method within the file. - - - Initializes a new instance of the - class with the specified data. - - - - - - Gets the fully qualified class name of the caller making the logging - request. - - - The fully qualified class name of the caller making the logging - request. - - - - Gets the fully qualified class name of the caller making the logging - request. - - - - - - Gets the file name of the caller. - - - The file name of the caller. - - - - Gets the file name of the caller. - - - - - - Gets the line number of the caller. - - - The line number of the caller. - - - - Gets the line number of the caller. - - - - - - Gets the method name of the caller. - - - The method name of the caller. - - - - Gets the method name of the caller. - - - - - - Gets all available caller information - - - All available caller information, in the format - fully.qualified.classname.of.caller.methodName(Filename:line) - - - - Gets all available caller information, in the format - fully.qualified.classname.of.caller.methodName(Filename:line) - - - - - - Static manager that controls the creation of repositories - - - - Static manager that controls the creation of repositories - - - This class is used by the wrapper managers (e.g. ) - to provide access to the objects. - - - This manager also holds the that is used to - lookup and create repositories. The selector can be set either programmatically using - the property, or by setting the log4net.RepositorySelector - AppSetting in the applications config file to the fully qualified type name of the - selector to use. - - - Nicko Cadell - Gert Driesen - - - - Private constructor to prevent instances. Only static methods should be used. - - - - Private constructor to prevent instances. Only static methods should be used. - - - - - - Hook the shutdown event - - - - On the full .NET runtime, the static constructor hooks up the - AppDomain.ProcessExit and AppDomain.DomainUnload> events. - These are used to shutdown the log4net system as the application exits. - - - - - - Register for ProcessExit and DomainUnload events on the AppDomain - - - - This needs to be in a separate method because the events make - a LinkDemand for the ControlAppDomain SecurityPermission. Because - this is a LinkDemand it is demanded at JIT time. Therefore we cannot - catch the exception in the method itself, we have to catch it in the - caller. - - - - - - Return the default instance. - - the repository to lookup in - Return the default instance - - - Gets the for the repository specified - by the argument. - - - - - - Returns the default instance. - - The assembly to use to lookup the repository. - The default instance. - - - - Return the default instance. - - the repository to lookup in - Return the default instance - - - Gets the for the repository specified - by the argument. - - - - - - Returns the default instance. - - The assembly to use to lookup the repository. - The default instance. - - - Returns the default instance. - - - - - - Returns the named logger if it exists. - - The repository to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified repository. - - - - If the named logger exists (in the specified repository) then it - returns a reference to the logger, otherwise it returns - null. - - - - - - Returns the named logger if it exists. - - The assembly to use to lookup the repository. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified assembly's repository. - - - - If the named logger exists (in the specified assembly's repository) then it - returns a reference to the logger, otherwise it returns - null. - - - - - - Returns all the currently defined loggers in the specified repository. - - The repository to lookup in. - All the defined loggers. - - - The root logger is not included in the returned array. - - - - - - Returns all the currently defined loggers in the specified assembly's repository. - - The assembly to use to lookup the repository. - All the defined loggers. - - - The root logger is not included in the returned array. - - - - - - Retrieves or creates a named logger. - - The repository to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - - - - Retrieves or creates a named logger. - - The assembly to use to lookup the repository. - The name of the logger to retrieve. - The logger with the name specified. - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - - - - Shorthand for . - - The repository to lookup in. - The of which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - Gets the logger for the fully qualified name of the type specified. - - - - - - Shorthand for . - - the assembly to use to lookup the repository - The of which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - Gets the logger for the fully qualified name of the type specified. - - - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - The repository to shutdown. - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - The assembly to use to lookup the repository. - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the repository. The repository is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Resets all values contained in this repository instance to their defaults. - - The repository to reset. - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - - - - Resets all values contained in this repository instance to their defaults. - - The assembly to use to lookup the repository to reset. - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - - - - Creates a repository with the specified name. - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name. - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The name must be unique. Repositories cannot be redefined. - An Exception will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The name must be unique. Repositories cannot be redefined. - An Exception will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository for the specified assembly and repository type. - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Creates a repository for the specified assembly and repository type. - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Gets an array of all currently defined repositories. - - An array of all the known objects. - - - Gets an array of all currently defined repositories. - - - - - - Internal method to get pertinent version info. - - A string of version info. - - - - Called when the event fires - - the that is exiting - null - - - Called when the event fires. - - - When the event is triggered the log4net system is . - - - - - - Called when the event fires - - the that is exiting - null - - - Called when the event fires. - - - When the event is triggered the log4net system is . - - - - - - Initialize the default repository selector - - - - - Gets or sets the repository selector used by the . - - - The repository selector used by the . - - - - The repository selector () is used by - the to create and select repositories - (). - - - The caller to supplies either a string name - or an assembly (if not supplied the assembly is inferred using - ). - - - This context is used by the selector to lookup a specific repository. - - - For the full .NET Framework, the default repository is DefaultRepositorySelector; - for the .NET Compact Framework CompactRepositorySelector is the default - repository. - - - - - - Implementation of the interface. - - - - This class should be used as the base for all wrapper implementations. - - - Nicko Cadell - Gert Driesen - - - - Constructs a new wrapper for the specified logger. - - The logger to wrap. - - - Constructs a new wrapper for the specified logger. - - - - - - The logger that this object is wrapping - - - - - Gets the implementation behind this wrapper object. - - - The object that this object is implementing. - - - - The Logger object may not be the same object as this object - because of logger decorators. - - - This gets the actual underlying objects that is used to process - the log events. - - - - - - Portable data structure used by - - - - Portable data structure used by - - - Nicko Cadell - - - - The logger name. - - - - The logger name. - - - - - - Level of logging event. - - - - Level of logging event. Level cannot be Serializable - because it is a flyweight. Due to its special serialization it - cannot be declared final either. - - - - - - The application supplied message. - - - - The application supplied message of logging event. - - - - - - The name of thread - - - - The name of thread in which this logging event was generated - - - - - - The time the event was logged - - - - The TimeStamp is stored in the local time zone for this computer. - - - - - - Location information for the caller. - - - - Location information for the caller. - - - - - - String representation of the user - - - - String representation of the user's windows name, - like DOMAIN\username - - - - - - String representation of the identity. - - - - String representation of the current thread's principal identity. - - - - - - The string representation of the exception - - - - The string representation of the exception - - - - - - String representation of the AppDomain. - - - - String representation of the AppDomain. - - - - - - Additional event specific properties - - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - - - - Flags passed to the property - - - - Flags passed to the property - - - Nicko Cadell - - - - Fix the MDC - - - - - Fix the NDC - - - - - Fix the rendered message - - - - - Fix the thread name - - - - - Fix the callers location information - - - CAUTION: Very slow to generate - - - - - Fix the callers windows user name - - - CAUTION: Slow to generate - - - - - Fix the domain friendly name - - - - - Fix the callers principal name - - - CAUTION: May be slow to generate - - - - - Fix the exception text - - - - - Fix the event properties - - - - - No fields fixed - - - - - All fields fixed - - - - - Partial fields fixed - - - - This set of partial fields gives good performance. The following fields are fixed: - - - - - - - - - - - - - The internal representation of logging events. - - - - When an affirmative decision is made to log then a - instance is created. This instance - is passed around to the different log4net components. - - - This class is of concern to those wishing to extend log4net. - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - Nicko Cadell - Gert Driesen - Douglas de la Torre - Daniel Cazzulino - - - - The key into the Properties map for the host name value. - - - - - The key into the Properties map for the thread identity value. - - - - - The key into the Properties map for the user name value. - - - - - Initializes a new instance of the class - from the supplied parameters. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - The name of the logger of this event. - The level of this event. - The message of this event. - The exception for this event. - - - Except , and , - all fields of LoggingEvent are filled when actually needed. Call - to cache all data locally - to prevent inconsistencies. - - This method is called by the log4net framework - to create a logging event. - - - - - - Initializes a new instance of the class - using specific data. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - Data used to initialize the logging event. - The fields in the struct that have already been fixed. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - The parameter should be used to specify which fields in the - struct have been preset. Fields not specified in the - will be captured from the environment if requested or fixed. - - - - - - Initializes a new instance of the class - using specific data. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - Data used to initialize the logging event. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - This constructor sets this objects flags to , - this assumes that all the data relating to this event is passed in via the - parameter and no other data should be captured from the environment. - - - - - - Initializes a new instance of the class - using specific data. - - Data used to initialize the logging event. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - This constructor sets this objects flags to , - this assumes that all the data relating to this event is passed in via the - parameter and no other data should be captured from the environment. - - - - - - Serialization constructor - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Ensure that the repository is set. - - the value for the repository - - - - Write the rendered message to a TextWriter - - the writer to write the message to - - - Unlike the property this method - does store the message data in the internal cache. Therefore - if called only once this method should be faster than the - property, however if the message is - to be accessed multiple times then the property will be more efficient. - - - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - The data in this event must be fixed before it can be serialized. - - - The method must be called during the - method call if this event - is to be used outside that method. - - - - - - Gets the portable data for this . - - The for this event. - - - A new can be constructed using a - instance. - - - Does a fix of the data - in the logging event before returning the event data. - - - - - - Gets the portable data for this . - - The set of data to ensure is fixed in the LoggingEventData - The for this event. - - - A new can be constructed using a - instance. - - - - - - Returns this event's exception's rendered using the - . - - - This event's exception's rendered using the . - - - - Obsolete. Use instead. - - - - - - Returns this event's exception's rendered using the - . - - - This event's exception's rendered using the . - - - - Returns this event's exception's rendered using the - . - - - - - - Fix instance fields that hold volatile data. - - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - incurred by calling but it - is essential to maintaining data consistency. - - - Calling is equivalent to - calling passing the parameter - false. - - - See for more - information. - - - - - - Fixes instance fields that hold volatile data. - - Set to true to not fix data that takes a long time to fix. - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - The param controls the data that - is fixed. Some of the data that can be fixed takes a long time to - generate, therefore if you do not require those settings to be fixed - they can be ignored by setting the param - to true. This setting will ignore the - and settings. - - - Set to false to ensure that all - settings are fixed. - - - - - - Fix the fields specified by the parameter - - the fields to fix - - - Only fields specified in the will be fixed. - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - - Lookup a composite property in this event - - the key for the property to lookup - the value for the property - - - This event has composite properties that combine together properties from - several different contexts in the following order: - - - this events properties - - This event has that can be set. These - properties are specific to this event only. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - - - Get all the composite properties in this event - - the containing all the properties - - - See for details of the composite properties - stored by the event. - - - This method returns a single containing all the - properties defined for this event. - - - - - - The internal logging event data. - - - - - The internal logging event data. - - - - - The internal logging event data. - - - - - The fully qualified Type of the calling - logger class in the stack frame (i.e. the declaring type of the method). - - - - - The application supplied message of logging event. - - - - - The exception that was thrown. - - - This is not serialized. The string representation - is serialized instead. - - - - - The repository that generated the logging event - - - This is not serialized. - - - - - The fix state for this event - - - These flags indicate which fields have been fixed. - Not serialized. - - - - - Indicated that the internal cache is updateable (ie not fixed) - - - This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler - changes in the caching strategy. - - - - - Gets the time when the current process started. - - - This is the time when this process started. - - - - The TimeStamp is stored in the local time zone for this computer. - - - Tries to get the start time for the current process. - Failing that it returns the time of the first call to - this property. - - - Note that AppDomains may be loaded and unloaded within the - same process without the process terminating and therefore - without the process start time being reset. - - - - - - Gets the of the logging event. - - - The of the logging event. - - - - Gets the of the logging event. - - - - - - Gets the time of the logging event. - - - The time of the logging event. - - - - The TimeStamp is stored in the local time zone for this computer. - - - - - - Gets the name of the logger that logged the event. - - - The name of the logger that logged the event. - - - - Gets the name of the logger that logged the event. - - - - - - Gets the location information for this logging event. - - - The location information for this logging event. - - - - The collected information is cached for future use. - - - See the class for more information on - supported frameworks and the different behavior in Debug and - Release builds. - - - - - - Gets the message object used to initialize this event. - - - The message object used to initialize this event. - - - - Gets the message object used to initialize this event. - Note that this event may not have a valid message object. - If the event is serialized the message object will not - be transferred. To get the text of the message the - property must be used - not this property. - - - If there is no defined message object for this event then - null will be returned. - - - - - - Gets the exception object used to initialize this event. - - - The exception object used to initialize this event. - - - - Gets the exception object used to initialize this event. - Note that this event may not have a valid exception object. - If the event is serialized the exception object will not - be transferred. To get the text of the exception the - method must be used - not this property. - - - If there is no defined exception object for this event then - null will be returned. - - - - - - The that this event was created in. - - - - The that this event was created in. - - - - - - Gets the message, rendered through the . - - - The message rendered through the . - - - - The collected information is cached for future use. - - - - - - Gets the name of the current thread. - - - The name of the current thread, or the thread ID when - the name is not available. - - - - The collected information is cached for future use. - - - - - - Gets the name of the current user. - - - The name of the current user, or NOT AVAILABLE when the - underlying runtime has no support for retrieving the name of the - current user. - - - - Calls WindowsIdentity.GetCurrent().Name to get the name of - the current windows user. - - - To improve performance, we could cache the string representation of - the name, and reuse that as long as the identity stayed constant. - Once the identity changed, we would need to re-assign and re-render - the string. - - - However, the WindowsIdentity.GetCurrent() call seems to - return different objects every time, so the current implementation - doesn't do this type of caching. - - - Timing for these operations: - - - - Method - Results - - - WindowsIdentity.GetCurrent() - 10000 loops, 00:00:00.2031250 seconds - - - WindowsIdentity.GetCurrent().Name - 10000 loops, 00:00:08.0468750 seconds - - - - This means we could speed things up almost 40 times by caching the - value of the WindowsIdentity.GetCurrent().Name property, since - this takes (8.04-0.20) = 7.84375 seconds. - - - - - - Gets the identity of the current thread principal. - - - The string name of the identity of the current thread principal. - - - - Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get - the name of the current thread principal. - - - - - - Gets the AppDomain friendly name. - - - The AppDomain friendly name. - - - - Gets the AppDomain friendly name. - - - - - - Additional event specific properties. - - - Additional event specific properties. - - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - This property is for events that have been added directly to - this event. The aggregate properties (which include these - event properties) can be retrieved using - and . - - - Once the properties have been fixed this property - returns the combined cached properties. This ensures that updates to - this property are always reflected in the underlying storage. When - returning the combined properties there may be more keys in the - Dictionary than expected. - - - - - - The fixed fields in this event - - - The set of fields that are fixed in this event - - - - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - - Implementation of wrapper interface. - - - - This implementation of the interface - forwards to the held by the base class. - - - This logger has methods to allow the caller to log at the following - levels: - - - - DEBUG - - The and methods log messages - at the DEBUG level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - INFO - - The and methods log messages - at the INFO level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - WARN - - The and methods log messages - at the WARN level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - ERROR - - The and methods log messages - at the ERROR level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - FATAL - - The and methods log messages - at the FATAL level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - - The values for these levels and their semantic meanings can be changed by - configuring the for the repository. - - - Nicko Cadell - Gert Driesen - - - - The ILog interface is use by application to log messages into - the log4net framework. - - - - Use the to obtain logger instances - that implement this interface. The - static method is used to get logger instances. - - - This class contains methods for logging at different levels and also - has properties for determining if those logging levels are - enabled in the current configuration. - - - This interface can be implemented in different ways. This documentation - specifies reasonable behavior that a caller can expect from the actual - implementation, however different implementations reserve the right to - do things differently. - - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - Nicko Cadell - Gert Driesen - - - Log a message object with the level. - - Log a message object with the level. - - The message object to log. - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Logs a message object with the level. - - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Logs a message object with the INFO level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Log a message object with the level. - - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Logs a message object with the level. - - The message object to log. - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Log a message object with the level. - - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - For some ILog interface log, when you write: - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, string construction and concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed (who isn't), then you should write: - - - if (log.IsDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in and once in - the . This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. This is the preferred style of logging. - - Alternatively if your logger is available statically then the is debug - enabled state can be stored in a static variable like this: - - - private static readonly bool isDebugEnabled = log.IsDebugEnabled; - - - Then when you come to log you can write: - - - if (isDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way the debug enabled state is only queried once - when the class is loaded. Using a private static readonly - variable is the most efficient because it is a run time constant - and can be heavily optimized by the JIT compiler. - - - Of course if you use a static readonly variable to - hold the enabled state of the logger then you cannot - change the enabled state at runtime to vary the logging - that is produced. You have to decide if you need absolute - speed or runtime flexibility. - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Construct a new wrapper for the specified logger. - - The logger to wrap. - - - Construct a new wrapper for the specified logger. - - - - - - Virtual method called when the configuration of the repository changes - - the repository holding the levels - - - Virtual method called when the configuration of the repository changes - - - - - - Logs a message object with the DEBUG level. - - The message object to log. - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - DEBUG level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the DEBUG level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the DEBUG level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the INFO level. - - The message object to log. - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - INFO level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the INFO level. - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the INFO level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the WARN level. - - the message object to log - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - WARN level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the WARN level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the WARN level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the ERROR level. - - The message object to log. - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - ERROR level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the ERROR level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the ERROR level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the FATAL level. - - The message object to log. - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - FATAL level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the FATAL level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the FATAL level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Event handler for the event - - the repository - Empty - - - - The fully qualified name of this declaring type not the type of any subclass. - - - - - Checks if this logger is enabled for the DEBUG - level. - - - true if this logger is enabled for DEBUG events, - false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - - For some log Logger object, when you write: - - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed, then you should write: - - - if (log.IsDebugEnabled()) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in IsDebugEnabled and once in - the Debug. This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. - - - - - - Checks if this logger is enabled for the INFO level. - - - true if this logger is enabled for INFO events, - false otherwise. - - - - See for more information and examples - of using this method. - - - - - - - Checks if this logger is enabled for the WARN level. - - - true if this logger is enabled for WARN events, - false otherwise. - - - - See for more information and examples - of using this method. - - - - - - - Checks if this logger is enabled for the ERROR level. - - - true if this logger is enabled for ERROR events, - false otherwise. - - - - See for more information and examples of using this method. - - - - - - - Checks if this logger is enabled for the FATAL level. - - - true if this logger is enabled for FATAL events, - false otherwise. - - - - See for more information and examples of using this method. - - - - - - - A SecurityContext used by log4net when interacting with protected resources - - - - A SecurityContext used by log4net when interacting with protected resources - for example with operating system services. This can be used to impersonate - a principal that has been granted privileges on the system resources. - - - Nicko Cadell - - - - Impersonate this SecurityContext - - State supplied by the caller - An instance that will - revoke the impersonation of this SecurityContext, or null - - - Impersonate this security context. Further calls on the current - thread should now be made in the security context provided - by this object. When the result - method is called the security - context of the thread should be reverted to the state it was in - before was called. - - - - - - The providers default instances. - - - - A configured component that interacts with potentially protected system - resources uses a to provide the elevated - privileges required. If the object has - been not been explicitly provided to the component then the component - will request one from this . - - - By default the is - an instance of which returns only - objects. This is a reasonable default - where the privileges required are not know by the system. - - - This default behavior can be overridden by subclassing the - and overriding the method to return - the desired objects. The default provider - can be replaced by programmatically setting the value of the - property. - - - An alternative is to use the log4net.Config.SecurityContextProviderAttribute - This attribute can be applied to an assembly in the same way as the - log4net.Config.XmlConfiguratorAttribute". The attribute takes - the type to use as the as an argument. - - - Nicko Cadell - - - - The default provider - - - - - Protected default constructor to allow subclassing - - - - Protected default constructor to allow subclassing - - - - - - Create a SecurityContext for a consumer - - The consumer requesting the SecurityContext - An impersonation context - - - The default implementation is to return a . - - - Subclasses should override this method to provide their own - behavior. - - - - - - Gets or sets the default SecurityContextProvider - - - The default SecurityContextProvider - - - - The default provider is used by configured components that - require a and have not had one - given to them. - - - By default this is an instance of - that returns objects. - - - The default provider can be set programmatically by setting - the value of this property to a sub class of - that has the desired behavior. - - - - - - Delegate used to handle creation of new wrappers. - - The logger to wrap in a wrapper. - - - Delegate used to handle creation of new wrappers. This delegate - is called from the - method to construct the wrapper for the specified logger. - - - The delegate to use is supplied to the - constructor. - - - - - - Maps between logger objects and wrapper objects. - - - - This class maintains a mapping between objects and - objects. Use the method to - lookup the for the specified . - - - New wrapper instances are created by the - method. The default behavior is for this method to delegate construction - of the wrapper to the delegate supplied - to the constructor. This allows specialization of the behavior without - requiring subclassing of this type. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the - - The handler to use to create the wrapper objects. - - - Initializes a new instance of the class with - the specified handler to create the wrapper objects. - - - - - - Gets the wrapper object for the specified logger. - - The wrapper object for the specified logger - - - If the logger is null then the corresponding wrapper is null. - - - Looks up the wrapper it it has previously been requested and - returns it. If the wrapper has never been requested before then - the virtual method is - called. - - - - - - Creates the wrapper object for the specified logger. - - The logger to wrap in a wrapper. - The wrapper object for the logger. - - - This implementation uses the - passed to the constructor to create the wrapper. This method - can be overridden in a subclass. - - - - - - Called when a monitored repository shutdown event is received. - - The that is shutting down - - - This method is called when a that this - is holding loggers for has signaled its shutdown - event . The default - behavior of this method is to release the references to the loggers - and their wrappers generated for this repository. - - - - - - Event handler for repository shutdown event. - - The sender of the event. - The event args. - - - - Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings - - - - - The handler to use to create the extension wrapper objects. - - - - - Internal reference to the delegate used to register for repository shutdown events. - - - - - Gets the map of logger repositories. - - - Map of logger repositories. - - - - Gets the hashtable that is keyed on . The - values are hashtables keyed on with the - value being the corresponding . - - - - - - Formats a as "HH:mm:ss,fff". - - - - Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". - - - Nicko Cadell - Gert Driesen - - - - Render a as a string. - - - - Interface to abstract the rendering of a - instance into a string. - - - The method is used to render the - date to a text writer. - - - Nicko Cadell - Gert Driesen - - - - Formats the specified date as a string. - - The date to format. - The writer to write to. - - - Format the as a string and write it - to the provided. - - - - - - String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. - - - - - String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. - - - - - String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. - - - - - Renders the date into a string. Format is "HH:mm:ss". - - The date to render into a string. - The string builder to write to. - - - Subclasses should override this method to render the date - into a string using a precision up to the second. This method - will be called at most once per second and the result will be - reused if it is needed again during the same second. - - - - - - Renders the date into a string. Format is "HH:mm:ss,fff". - - The date to render into a string. - The writer to write to. - - - Uses the method to generate the - time string up to the seconds and then appends the current - milliseconds. The results from are - cached and is called at most once - per second. - - - Sub classes should override - rather than . - - - - - - Last stored time with precision up to the second. - - - - - Last stored time with precision up to the second, formatted - as a string. - - - - - Last stored time with precision up to the second, formatted - as a string. - - - - - Formats a as "dd MMM yyyy HH:mm:ss,fff" - - - - Formats a in the format - "dd MMM yyyy HH:mm:ss,fff" for example, - "06 Nov 1994 15:49:37,459". - - - Nicko Cadell - Gert Driesen - Angelika Schnagl - - - - Default constructor. - - - - Initializes a new instance of the class. - - - - - - Formats the date without the milliseconds part - - The date to format. - The string builder to write to. - - - Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" - for example, "06 Nov 1994 15:49:37". - - - The base class will append the ",fff" milliseconds section. - This method will only be called at most once per second. - - - - - - The format info for the invariant culture. - - - - - Formats the as "yyyy-MM-dd HH:mm:ss,fff". - - - - Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Formats the date without the milliseconds part - - The date to format. - The string builder to write to. - - - Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". - - - The base class will append the ",fff" milliseconds section. - This method will only be called at most once per second. - - - - - - Formats the using the method. - - - - Formats the using the method. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The format string. - - - Initializes a new instance of the class - with the specified format string. - - - The format string must be compatible with the options - that can be supplied to . - - - - - - Formats the date using . - - The date to convert to a string. - The writer to write to. - - - Uses the date format string supplied to the constructor to call - the method to format the date. - - - - - - The format string used to format the . - - - - The format string must be compatible with the options - that can be supplied to . - - - - - - This filter drops all . - - - - You can add this filter to the end of a filter chain to - switch from the default "accept all unless instructed otherwise" - filtering behavior to a "deny all unless instructed otherwise" - behavior. - - - Nicko Cadell - Gert Driesen - - - - Subclass this type to implement customized logging event filtering - - - - Users should extend this class to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - - The method must return one - of the integer constants , - or . - - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behavior is to log all logging events. - - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface to provide customized logging event filtering - - - - Users should implement this interface to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - - The method must return one - of the integer constants , - or . - - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behavior is to log all logging events. - - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - Nicko Cadell - Gert Driesen - - - - Decide if the logging event should be logged through an appender. - - The LoggingEvent to decide upon - The decision of the filter - - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - - - - - Property to get and set the next filter - - - The next filter in the chain - - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - - Points to the next filter in the filter chain. - - - - See for more information. - - - - - - Initialize the filter with the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Typically filter's options become active immediately on set, - however this method must still be called. - - - - - - Decide if the should be logged through an appender. - - The to decide upon - The decision of the filter - - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - - This method is marked abstract and must be implemented - in a subclass. - - - - - - Property to get and set the next filter - - - The next filter in the chain - - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - - Default constructor - - - - - Always returns the integer constant - - the LoggingEvent to filter - Always returns - - - Ignores the event being logged and just returns - . This can be used to change the default filter - chain behavior from to . This filter - should only be used as the last filter in the chain - as any further filters will be ignored! - - - - - - The return result from - - - - The return result from - - - - - - The log event must be dropped immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This filter is neutral with respect to the log event. - The remaining filters, if any, should be consulted for a final decision. - - - - - The log event must be logged immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This is a very simple filter based on matching. - - - - The filter admits two options and - . If there is an exact match between the value - of the option and the of the - , then the method returns in - case the option value is set - to true, if it is false then - is returned. If the does not match then - the result will be . - - - Nicko Cadell - Gert Driesen - - - - flag to indicate if the filter should on a match - - - - - the to match against - - - - - Default constructor - - - - - Tests if the of the logging event matches that of the filter - - the event to filter - see remarks - - - If the of the event matches the level of the - filter then the result of the function depends on the - value of . If it is true then - the function will return , it it is false then it - will return . If the does not match then - the result will be . - - - - - - when matching - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - The that the filter will match - - - - The level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - This is a simple filter based on matching. - - - - The filter admits three options and - that determine the range of priorities that are matched, and - . If there is a match between the range - of priorities and the of the , then the - method returns in case the - option value is set to true, if it is false - then is returned. If there is no match, is returned. - - - Nicko Cadell - Gert Driesen - - - - Flag to indicate the behavior when matching a - - - - - the minimum value to match - - - - - the maximum value to match - - - - - Default constructor - - - - - Check if the event should be logged. - - the logging event to check - see remarks - - - If the of the logging event is outside the range - matched by this filter then - is returned. If the is matched then the value of - is checked. If it is true then - is returned, otherwise - is returned. - - - - - - when matching and - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - Set the minimum matched - - - - The minimum level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - Sets the maximum matched - - - - The maximum level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - Simple filter to match a string in the event's logger name. - - - - The works very similar to the . It admits two - options and . If the - of the starts - with the value of the option, then the - method returns in - case the option value is set to true, - if it is false then is returned. - - - Daniel Cazzulino - - - - Flag to indicate the behavior when we have a match - - - - - The logger name string to substring match against the event - - - - - Default constructor - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The rendered message is matched against the . - If the equals the beginning of - the incoming () - then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - when matching - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - The that the filter will match - - - - This filter will attempt to match this value against logger name in - the following way. The match will be done against the beginning of the - logger name (using ). The match is - case sensitive. If a match is found then - the result depends on the value of . - - - - - - Simple filter to match a keyed string in the - - - - Simple filter to match a keyed string in the - - - As the MDC has been replaced with layered properties the - should be used instead. - - - Nicko Cadell - Gert Driesen - - - - Simple filter to match a string an event property - - - - Simple filter to match a string in the value for a - specific event property - - - Nicko Cadell - - - - Simple filter to match a string in the rendered message - - - - Simple filter to match a string in the rendered message - - - Nicko Cadell - Gert Driesen - - - - Flag to indicate the behavior when we have a match - - - - - The string to substring match against the message - - - - - A string regex to match - - - - - A regex object to match (generated from m_stringRegexToMatch) - - - - - Default constructor - - - - - Initialize and precompile the Regex if required - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The rendered message is matched against the . - If the occurs as a substring within - the message then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - when matching or - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - Sets the static string to match - - - - The string that will be substring matched against - the rendered message. If the message contains this - string then the filter will match. If a match is found then - the result depends on the value of . - - - One of or - must be specified. - - - - - - Sets the regular expression to match - - - - The regular expression pattern that will be matched against - the rendered message. If the message matches this - pattern then the filter will match. If a match is found then - the result depends on the value of . - - - One of or - must be specified. - - - - - - The key to use to lookup the string from the event properties - - - - - Default constructor - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The event property for the is matched against - the . - If the occurs as a substring within - the property value then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - The key to lookup in the event properties and then match against. - - - - The key name to use to lookup in the properties map of the - . The match will be performed against - the value of this property if it exists. - - - - - - Simple filter to match a string in the - - - - Simple filter to match a string in the - - - As the MDC has been replaced with named stacks stored in the - properties collections the should - be used instead. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Sets the to "NDC". - - - - - - Write the event appdomain name to the output - - - - Writes the to the output writer. - - - Daniel Cazzulino - Nicko Cadell - - - - Abstract class that provides the formatting functionality that - derived classes need. - - - Conversion specifiers in a conversion patterns are parsed to - individual PatternConverters. Each of which is responsible for - converting a logging event in a converter specific manner. - - Nicko Cadell - - - - Abstract class that provides the formatting functionality that - derived classes need. - - - - Conversion specifiers in a conversion patterns are parsed to - individual PatternConverters. Each of which is responsible for - converting a logging event in a converter specific manner. - - - Nicko Cadell - Gert Driesen - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - Protected constructor - - - - Initializes a new instance of the class. - - - - - - Evaluate this pattern converter and write the output to a writer. - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the appropriate way. - - - - - - Set the next pattern converter in the chains - - the pattern converter that should follow this converter in the chain - the next converter - - - The PatternConverter can merge with its neighbor during this method (or a sub class). - Therefore the return value may or may not be the value of the argument passed in. - - - - - - Write the pattern converter to the writer with appropriate formatting - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - This method calls to allow the subclass to perform - appropriate conversion of the pattern converter. If formatting options have - been specified via the then this method will - apply those formattings before writing the output. - - - - - - Fast space padding method. - - to which the spaces will be appended. - The number of spaces to be padded. - - - Fast space padding method. - - - - - - The option string to the converter - - - - - Write an dictionary to a - - the writer to write to - a to use for object conversion - the value to write to the writer - - - Writes the to a writer in the form: - - - {key1=value1, key2=value2, key3=value3} - - - If the specified - is not null then it is used to render the key and value to text, otherwise - the object's ToString method is called. - - - - - - Write an object to a - - the writer to write to - a to use for object conversion - the value to write to the writer - - - Writes the Object to a writer. If the specified - is not null then it is used to render the object to text, otherwise - the object's ToString method is called. - - - - - - Get the next pattern converter in the chain - - - the next pattern converter in the chain - - - - Get the next pattern converter in the chain - - - - - - Gets or sets the formatting info for this converter - - - The formatting info for this converter - - - - Gets or sets the formatting info for this converter - - - - - - Gets or sets the option value for this converter - - - The option for this converter - - - - Gets or sets the option value for this converter - - - - - - Initializes a new instance of the class. - - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - that will receive the formatted result. - The on which the pattern converter should be executed. - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - - Flag indicating if this converter handles exceptions - - - false if this converter handles exceptions - - - - - Flag indicating if this converter handles the logging event exception - - false if this converter handles the logging event exception - - - If this converter handles the exception object contained within - , then this property should be set to - false. Otherwise, if the layout ignores the exception - object, then the property should be set to true. - - - Set this value to override a this default setting. The default - value is true, this converter does not handle the exception. - - - - - - Write the event appdomain name to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the output . - - - - - - Date pattern converter, uses a to format - the date of a . - - - - Render the to the writer as a string. - - - The value of the determines - the formatting of the date. The following values are allowed: - - - Option value - Output - - - ISO8601 - - Uses the formatter. - Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. - - - - DATE - - Uses the formatter. - Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". - - - - ABSOLUTE - - Uses the formatter. - Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". - - - - other - - Any other pattern string uses the formatter. - This formatter passes the pattern string to the - method. - For details on valid patterns see - DateTimeFormatInfo Class. - - - - - - The is in the local time zone and is rendered in that zone. - To output the time in Universal time see . - - - Nicko Cadell - - - - The used to render the date to a string - - - - The used to render the date to a string - - - - - - Initialize the converter pattern based on the property. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Convert the pattern into the rendered message - - that will receive the formatted result. - the event being logged - - - Pass the to the - for it to render it to the writer. - - - The passed is in the local time zone. - - - - - - Write the exception text to the output - - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - - - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - Nicko Cadell - - - - Default constructor - - - - - Write the exception text to the output - - that will receive the formatted result. - the event being logged - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - - - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - - - - Writes the caller location file name to the output - - - - Writes the value of the for - the event to the output writer. - - - Nicko Cadell - - - - Write the caller location file name to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the for - the to the output . - - - - - - Write the caller location info to the output - - - - Writes the to the output writer. - - - Nicko Cadell - - - - Write the caller location info to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the output writer. - - - - - - Writes the event identity to the output - - - - Writes the value of the to - the output writer. - - - Daniel Cazzulino - Nicko Cadell - - - - Writes the event identity to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the - to - the output . - - - - - - Write the event level to the output - - - - Writes the display name of the event - to the writer. - - - Nicko Cadell - - - - Write the event level to the output - - that will receive the formatted result. - the event being logged - - - Writes the of the - to the . - - - - - - Write the caller location line number to the output - - - - Writes the value of the for - the event to the output writer. - - - Nicko Cadell - - - - Write the caller location line number to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the for - the to the output . - - - - - - Converter for logger name - - - - Outputs the of the event. - - - Nicko Cadell - - - - Converter to output and truncate '.' separated strings - - - - This abstract class supports truncating a '.' separated string - to show a specified number of elements from the right hand side. - This is used to truncate class names that are fully qualified. - - - Subclasses should override the method to - return the fully qualified string. - - - Nicko Cadell - - - - Initialize the converter - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Get the fully qualified string data - - the event being logged - the fully qualified name - - - Overridden by subclasses to get the fully qualified name before the - precision is applied to it. - - - Return the fully qualified '.' (dot/period) separated string. - - - - - - Convert the pattern to the rendered message - - that will receive the formatted result. - the event being logged - - Render the to the precision - specified by the property. - - - - - Gets the fully qualified name of the logger - - the event being logged - The fully qualified logger name - - - Returns the of the . - - - - - - Writes the event message to the output - - - - Uses the method - to write out the event message. - - - Nicko Cadell - - - - Writes the event message to the output - - that will receive the formatted result. - the event being logged - - - Uses the method - to write out the event message. - - - - - - Write the method name to the output - - - - Writes the caller location to - the output. - - - Nicko Cadell - - - - Write the method name to the output - - that will receive the formatted result. - the event being logged - - - Writes the caller location to - the output. - - - - - - Converter to include event NDC - - - - Outputs the value of the event property named NDC. - - - The should be used instead. - - - Nicko Cadell - - - - Write the event NDC to the output - - that will receive the formatted result. - the event being logged - - - As the thread context stacks are now stored in named event properties - this converter simply looks up the value of the NDC property. - - - The should be used instead. - - - - - - Property pattern converter - - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - Nicko Cadell - - - - Write the property value to the output - - that will receive the formatted result. - the event being logged - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - - - - Converter to output the relative time of the event - - - - Converter to output the time of the event relative to the start of the program. - - - Nicko Cadell - - - - Write the relative time to the output - - that will receive the formatted result. - the event being logged - - - Writes out the relative time of the event in milliseconds. - That is the number of milliseconds between the event - and the . - - - - - - Helper method to get the time difference between two DateTime objects - - start time (in the current local time zone) - end time (in the current local time zone) - the time difference in milliseconds - - - - Converter to include event thread name - - - - Writes the to the output. - - - Nicko Cadell - - - - Write the ThreadName to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the . - - - - - - Pattern converter for the class name - - - - Outputs the of the event. - - - Nicko Cadell - - - - Gets the fully qualified name of the class - - the event being logged - The fully qualified type name for the caller location - - - Returns the of the . - - - - - - Converter to include event user name - - Douglas de la Torre - Nicko Cadell - - - - Convert the pattern to the rendered message - - that will receive the formatted result. - the event being logged - - - - Write the TimeStamp to the output - - - - Date pattern converter, uses a to format - the date of a . - - - Uses a to format the - in Universal time. - - - See the for details on the date pattern syntax. - - - - Nicko Cadell - - - - Write the TimeStamp to the output - - that will receive the formatted result. - the event being logged - - - Pass the to the - for it to render it to the writer. - - - The passed is in the local time zone, this is converted - to Universal time before it is rendered. - - - - - - - A Layout that renders only the Exception text from the logging event - - - - A Layout that renders only the Exception text from the logging event. - - - This Layout should only be used with appenders that utilize multiple - layouts (e.g. ). - - - Nicko Cadell - Gert Driesen - - - - Extend this abstract class to create your own log layout format. - - - - This is the base implementation of the - interface. Most layout objects should extend this class. - - - - - - Subclasses must implement the - method. - - - Subclasses should set the in their default - constructor. - - - - Nicko Cadell - Gert Driesen - - - - Interface implemented by layout objects - - - - An object is used to format a - as text. The method is called by an - appender to transform the into a string. - - - The layout can also supply and - text that is appender before any events and after all the events respectively. - - - Nicko Cadell - Gert Driesen - - - - Implement this method to create your own layout format. - - The TextWriter to write the formatted event to - The event to format - - - This method is called by an appender to format - the as text and output to a writer. - - - If the caller does not have a and prefers the - event to be formatted as a then the following - code can be used to format the event into a . - - - StringWriter writer = new StringWriter(); - Layout.Format(writer, loggingEvent); - string formattedEvent = writer.ToString(); - - - - - - The content type output by this layout. - - The content type - - - The content type output by this layout. - - - This is a MIME type e.g. "text/plain". - - - - - - The header for the layout format. - - the layout header - - - The Header text will be appended before any logging events - are formatted and appended. - - - - - - The footer for the layout format. - - the layout footer - - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - - Flag indicating if this layout handle exceptions - - false if this layout handles exceptions - - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - - - - - The header text - - - - See for more information. - - - - - - The footer text - - - - See for more information. - - - - - - Flag indicating if this layout handles exceptions - - - - false if this layout handles exceptions - - - - - - Empty default constructor - - - - Empty default constructor - - - - - - Activate component options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - This method must be implemented by the subclass. - - - - - - Implement this method to create your own layout format. - - The TextWriter to write the formatted event to - The event to format - - - This method is called by an appender to format - the as text. - - - - - - The content type output by this layout. - - The content type is "text/plain" - - - The content type output by this layout. - - - This base class uses the value "text/plain". - To change this value a subclass must override this - property. - - - - - - The header for the layout format. - - the layout header - - - The Header text will be appended before any logging events - are formatted and appended. - - - - - - The footer for the layout format. - - the layout footer - - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - - Flag indicating if this layout handles exceptions - - false if this layout handles exceptions - - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - - Set this value to override a this default setting. The default - value is true, this layout does not handle the exception. - - - - - - Default constructor - - - - Constructs a ExceptionLayout - - - - - - Activate component options - - - - Part of the component activation - framework. - - - This method does nothing as options become effective immediately. - - - - - - Gets the exception text from the logging event - - The TextWriter to write the formatted event to - the event being logged - - - Write the exception string to the . - The exception string is retrieved from . - - - - - - Interface for raw layout objects - - - - Interface used to format a - to an object. - - - This interface should not be confused with the - interface. This interface is used in - only certain specialized situations where a raw object is - required rather than a formatted string. The - is not generally useful than this interface. - - - Nicko Cadell - Gert Driesen - - - - Implement this method to create your own layout format. - - The event to format - returns the formatted event - - - Implement this method to create your own layout format. - - - - - - Adapts any to a - - - - Where an is required this adapter - allows a to be specified. - - - Nicko Cadell - Gert Driesen - - - - The layout to adapt - - - - - Construct a new adapter - - the layout to adapt - - - Create the adapter for the specified . - - - - - - Format the logging event as an object. - - The event to format - returns the formatted event - - - Format the logging event as an object. - - - Uses the object supplied to - the constructor to perform the formatting. - - - - - - A flexible layout configurable with pattern string. - - - - The goal of this class is to a - as a string. The results - depend on the conversion pattern. - - - The conversion pattern is closely related to the conversion - pattern of the printf function in C. A conversion pattern is - composed of literal text and format control expressions called - conversion specifiers. - - - You are free to insert any literal text within the conversion - pattern. - - - Each conversion specifier starts with a percent sign (%) and is - followed by optional format modifiers and a conversion - pattern name. The conversion pattern name specifies the type of - data, e.g. logger, level, date, thread name. The format - modifiers control such things as field width, padding, left and - right justification. The following is a simple example. - - - Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume - that the log4net environment was set to use a PatternLayout. Then the - statements - - - ILog log = LogManager.GetLogger(typeof(TestApp)); - log.Debug("Message 1"); - log.Warn("Message 2"); - - would yield the output - - DEBUG [main]: Message 1 - WARN [main]: Message 2 - - - Note that there is no explicit separator between text and - conversion specifiers. The pattern parser knows when it has reached - the end of a conversion specifier when it reads a conversion - character. In the example above the conversion specifier - %-5level means the level of the logging event should be left - justified to a width of five characters. - - - The recognized conversion pattern names are: - - - - Conversion Pattern Name - Effect - - - a - Equivalent to appdomain - - - appdomain - - Used to output the friendly name of the AppDomain where the - logging event was generated. - - - - c - Equivalent to logger - - - C - Equivalent to type - - - class - Equivalent to type - - - d - Equivalent to date - - - date - - - Used to output the date of the logging event in the local time zone. - To output the date in universal time use the %utcdate pattern. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %date{HH:mm:ss,fff} or - %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %date{ISO8601} or %date{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - exception - - - Used to output the exception passed in with the log message. - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - - - F - Equivalent to file - - - file - - - Used to output the file name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - identity - - - Used to output the user name for the currently active user - (Principal.Identity.Name). - - - WARNING Generating caller information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - - - l - Equivalent to location - - - L - Equivalent to line - - - location - - - Used to output location information of the caller which generated - the logging event. - - - The location information depends on the CLI implementation but - usually consists of the fully qualified name of the calling - method followed by the callers source the file name and line - number between parentheses. - - - The location information can be very useful. However, its - generation is extremely slow. Its use should be avoided - unless execution speed is not an issue. - - - See the note below on the availability of caller location information. - - - - - level - - - Used to output the level of the logging event. - - - - - line - - - Used to output the line number from where the logging request - was issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - logger - - - Used to output the logger of the logging event. The - logger conversion specifier can be optionally followed by - precision specifier, that is a decimal constant in - brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the logger name will be - printed. By default the logger name is printed in full. - - - For example, for the logger name "a.b.c" the pattern - %logger{2} will output "b.c". - - - - - m - Equivalent to message - - - M - Equivalent to method - - - message - - - Used to output the application supplied message associated with - the logging event. - - - - - mdc - - - The MDC (old name for the ThreadContext.Properties) is now part of the - combined event properties. This pattern is supported for compatibility - but is equivalent to property. - - - - - method - - - Used to output the method name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - n - Equivalent to newline - - - newline - - - Outputs the platform dependent line separator character or - characters. - - - This conversion pattern offers the same performance as using - non-portable line separator strings such as "\n", or "\r\n". - Thus, it is the preferred way of specifying a line separator. - - - - - ndc - - - Used to output the NDC (nested diagnostic context) associated - with the thread that generated the logging event. - - - - - p - Equivalent to level - - - P - Equivalent to property - - - properties - Equivalent to property - - - property - - - Used to output the an event specific property. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %property{user} would include the value - from the property that is keyed by the string 'user'. Each property value - that is to be included in the log must be specified separately. - Properties are added to events by loggers or appenders. By default - the log4net:HostName property is set to the name of machine on - which the event was originally logged. - - - If no key is specified, e.g. %property then all the keys and their - values are printed in a comma separated list. - - - The properties of an event are combined from a number of different - contexts. These are listed below in the order in which they are searched. - - - - the event properties - - The event has that can be set. These - properties are specific to this event only. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - - r - Equivalent to timestamp - - - t - Equivalent to thread - - - timestamp - - - Used to output the number of milliseconds elapsed since the start - of the application until the creation of the logging event. - - - - - thread - - - Used to output the name of the thread that generated the - logging event. Uses the thread number if no name is available. - - - - - type - - - Used to output the fully qualified type name of the caller - issuing the logging request. This conversion specifier - can be optionally followed by precision specifier, that - is a decimal constant in brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the class name will be - printed. By default the class name is output in fully qualified form. - - - For example, for the class name "log4net.Layout.PatternLayout", the - pattern %type{1} will output "PatternLayout". - - - WARNING Generating the caller class information is - slow. Thus, its use should be avoided unless execution speed is - not an issue. - - - See the note below on the availability of caller location information. - - - - - u - Equivalent to identity - - - username - - - Used to output the WindowsIdentity for the currently - active user. - - - WARNING Generating caller WindowsIdentity information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - - - utcdate - - - Used to output the date of the logging event in universal time. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %utcdate{HH:mm:ss,fff} or - %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %utcdate{ISO8601} or %utcdate{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - w - Equivalent to username - - - x - Equivalent to ndc - - - X - Equivalent to mdc - - - % - - - The sequence %% outputs a single percent sign. - - - - - - The single letter patterns are deprecated in favor of the - longer more descriptive pattern names. - - - By default the relevant information is output as is. However, - with the aid of format modifiers it is possible to change the - minimum field width, the maximum field width and justification. - - - The optional format modifier is placed between the percent sign - and the conversion pattern name. - - - The first optional format modifier is the left justification - flag which is just the minus (-) character. Then comes the - optional minimum field width modifier. This is a decimal - constant that represents the minimum number of characters to - output. If the data item requires fewer characters, it is padded on - either the left or the right until the minimum width is - reached. The default is to pad on the left (right justify) but you - can specify right padding with the left justification flag. The - padding character is space. If the data item is larger than the - minimum field width, the field is expanded to accommodate the - data. The value is never truncated. - - - This behavior can be changed using the maximum field - width modifier which is designated by a period followed by a - decimal constant. If the data item is longer than the maximum - field, then the extra characters are removed from the - beginning of the data item and not from the end. For - example, it the maximum field width is eight and the data item is - ten characters long, then the first two characters of the data item - are dropped. This behavior deviates from the printf function in C - where truncation is done from the end. - - - Below are various format modifier examples for the logger - conversion specifier. - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Format modifierleft justifyminimum widthmaximum widthcomment
    %20loggerfalse20none - - Left pad with spaces if the logger name is less than 20 - characters long. - -
    %-20loggertrue20none - - Right pad with spaces if the logger - name is less than 20 characters long. - -
    %.30loggerNAnone30 - - Truncate from the beginning if the logger - name is longer than 30 characters. - -
    %20.30loggerfalse2030 - - Left pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
    %-20.30loggertrue2030 - - Right pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
    -
    - - Note about caller location information.
    - The following patterns %type %file %line %method %location %class %C %F %L %l %M - all generate caller location information. - Location information uses the System.Diagnostics.StackTrace class to generate - a call stack. The caller's information is then extracted from this stack. -
    - - - The System.Diagnostics.StackTrace class is not supported on the - .NET Compact Framework 1.0 therefore caller location information is not - available on that framework. - - - - - The System.Diagnostics.StackTrace class has this to say about Release builds: - - - "StackTrace information will be most informative with Debug build configurations. - By default, Debug builds include debug symbols, while Release builds do not. The - debug symbols contain most of the file, method name, line number, and column - information used in constructing StackFrame and StackTrace objects. StackTrace - might not report as many method calls as expected, due to code transformations - that occur during optimization." - - - This means that in a Release build the caller information may be incomplete or may - not exist at all! Therefore caller location information cannot be relied upon in a Release build. - - - - Additional pattern converters may be registered with a specific - instance using the method. - -
    - - This is a more detailed pattern. - %timestamp [%thread] %level %logger %ndc - %message%newline - - - A similar pattern except that the relative time is - right padded if less than 6 digits, thread name is right padded if - less than 15 characters and truncated if longer and the logger - name is left padded if shorter than 30 characters and truncated if - longer. - %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline - - Nicko Cadell - Gert Driesen - Douglas de la Torre - Daniel Cazzulino -
    - - - Default pattern string for log output. - - - - Default pattern string for log output. - Currently set to the string "%message%newline" - which just prints the application supplied message. - - - - - - A detailed conversion pattern - - - - A conversion pattern which includes Time, Thread, Logger, and Nested Context. - Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. - - - - - - Internal map of converter identifiers to converter types. - - - - This static map is overridden by the m_converterRegistry instance map - - - - - - the pattern - - - - - the head of the pattern converter chain - - - - - patterns defined on this PatternLayout only - - - - - Initialize the global registry - - - - Defines the builtin global rules. - - - - - - Constructs a PatternLayout using the DefaultConversionPattern - - - - The default pattern just produces the application supplied message. - - - Note to Inheritors: This constructor calls the virtual method - . If you override this method be - aware that it will be called before your is called constructor. - - - As per the contract the - method must be called after the properties on this object have been - configured. - - - - - - Constructs a PatternLayout using the supplied conversion pattern - - the pattern to use - - - Note to Inheritors: This constructor calls the virtual method - . If you override this method be - aware that it will be called before your is called constructor. - - - When using this constructor the method - need not be called. This may not be the case when using a subclass. - - - - - - Create the pattern parser instance - - the pattern to parse - The that will format the event - - - Creates the used to parse the conversion string. Sets the - global and instance rules on the . - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a formatted string as specified by the conversion pattern. - - the event being logged - The TextWriter to write the formatted event to - - - Parse the using the patter format - specified in the property. - - - - - - Add a converter to this PatternLayout - - the converter info - - - This version of the method is used by the configurator. - Programmatic users should use the alternative method. - - - - - - Add a converter to this PatternLayout - - the name of the conversion pattern for this converter - the type of the converter - - - Add a named pattern converter to this instance. This - converter will be used in the formatting of the event. - This method must be called before . - - - The specified must extend the - type. - - - - - - The pattern formatting string - - - - The ConversionPattern option. This is the string which - controls formatting and consists of a mix of literal content and - conversion specifiers. - - - - - - Wrapper class used to map converter names to converter types - - - - Pattern converter info class used during configuration to - pass to the - method. - - - - - - default constructor - - - - - Gets or sets the name of the conversion pattern - - - - The name of the pattern in the format string - - - - - - Gets or sets the type of the converter - - - - The value specified must extend the - type. - - - - - - Type converter for the interface - - - - Used to convert objects to the interface. - Supports converting from the interface to - the interface using the . - - - Nicko Cadell - Gert Driesen - - - - Interface supported by type converters - - - - This interface supports conversion from arbitrary types - to a single target type. See . - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Test if the can be converted to the - type supported by this converter. - - - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - Converts the to the type supported - by this converter. - - - - - - Can the sourceType be converted to an - - the source to be to be converted - true if the source type can be converted to - - - Test if the can be converted to a - . Only is supported - as the . - - - - - - Convert the value to a object - - the value to convert - the object - - - Convert the object to a - object. If the object - is a then the - is used to adapt between the two interfaces, otherwise an - exception is thrown. - - - - - - Extract the value of a property from the - - - - Extract the value of a property from the - - - Nicko Cadell - - - - Constructs a RawPropertyLayout - - - - - Lookup the property for - - The event to format - returns property value - - - Looks up and returns the object value of the property - named . If there is no property defined - with than name then null will be returned. - - - - - - The name of the value to lookup in the LoggingEvent Properties collection. - - - Value to lookup in the LoggingEvent Properties collection - - - - String name of the property to lookup in the . - - - - - - Extract the date from the - - - - Extract the date from the - - - Nicko Cadell - Gert Driesen - - - - Constructs a RawTimeStampLayout - - - - - Gets the as a . - - The event to format - returns the time stamp - - - Gets the as a . - - - The time stamp is in local time. To format the time stamp - in universal time use . - - - - - - Extract the date from the - - - - Extract the date from the - - - Nicko Cadell - Gert Driesen - - - - Constructs a RawUtcTimeStampLayout - - - - - Gets the as a . - - The event to format - returns the time stamp - - - Gets the as a . - - - The time stamp is in universal time. To format the time stamp - in local time use . - - - - - - A very simple layout - - - - SimpleLayout consists of the level of the log statement, - followed by " - " and then the log message itself. For example, - - DEBUG - Hello world - - - - Nicko Cadell - Gert Driesen - - - - Constructs a SimpleLayout - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a simple formatted output. - - the event being logged - The TextWriter to write the formatted event to - - - Formats the event as the level of the even, - followed by " - " and then the log message itself. The - output is terminated by a newline. - - - - - - Layout that formats the log events as XML elements. - - - - The output of the consists of a series of - log4net:event elements. It does not output a complete well-formed XML - file. The output is designed to be included as an external entity - in a separate file to form a correct XML file. - - - For example, if abc is the name of the file where - the output goes, then a well-formed XML file would - be: - - - <?xml version="1.0" ?> - - <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> - - <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> - &data; - </log4net:events> - - - This approach enforces the independence of the - and the appender where it is embedded. - - - The version attribute helps components to correctly - interpret output generated by . The value of - this attribute should be "1.2" for release 1.2 and later. - - - Alternatively the Header and Footer properties can be - configured to output the correct XML header, open tag and close tag. - When setting the Header and Footer properties it is essential - that the underlying data store not be appendable otherwise the data - will become invalid XML. - - - Nicko Cadell - Gert Driesen - - - - Layout that formats the log events as XML elements. - - - - This is an abstract class that must be subclassed by an implementation - to conform to a specific schema. - - - Deriving classes must implement the method. - - - Nicko Cadell - Gert Driesen - - - - Protected constructor to support subclasses - - - - Initializes a new instance of the class - with no location info. - - - - - - Protected constructor to support subclasses - - - - The parameter determines whether - location information will be output by the layout. If - is set to true, then the - file name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a formatted string. - - The event being logged. - The TextWriter to write the formatted event to - - - Format the and write it to the . - - - This method creates an that writes to the - . The is passed - to the method. Subclasses should override the - method rather than this method. - - - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - Subclasses should override this method to format - the as XML. - - - - - - Flag to indicate if location information should be included in - the XML events. - - - - - Writer adapter that ignores Close - - - - - The string to replace invalid chars with - - - - - Gets a value indicating whether to include location information in - the XML events. - - - true if location information should be included in the XML - events; otherwise, false. - - - - If is set to true, then the file - name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - The string to replace characters that can not be expressed in XML with. - - - Not all characters may be expressed in XML. This property contains the - string to replace those that can not with. This defaults to a ?. Set it - to the empty string to simply remove offending characters. For more - details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets - Character replacement will occur in the log message, the property names - and the property values. - - - - - - - Gets the content type output by this layout. - - - As this is the XML layout, the value is always "text/xml". - - - - As this is the XML layout, the value is always "text/xml". - - - - - - Constructs an XmlLayout - - - - - Constructs an XmlLayout. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SmtpAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Builds a cache of the element names - - - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - Override the base class method - to write the to the . - - - - - - The prefix to use for all generated element names - - - - - The prefix to use for all element names - - - - The default prefix is log4net. Set this property - to change the prefix. If the prefix is set to an empty string - then no prefix will be written. - - - - - - Set whether or not to base64 encode the message. - - - - By default the log message will be written as text to the xml - output. This can cause problems when the message contains binary - data. By setting this to true the contents of the message will be - base64 encoded. If this is set then invalid character replacement - (see ) will not be performed - on the log message. - - - - - - Set whether or not to base64 encode the property values. - - - - By default the properties will be written as text to the xml - output. This can cause problems when one or more properties contain - binary data. By setting this to true the values of the properties - will be base64 encoded. If this is set then invalid character replacement - (see ) will not be performed - on the property values. - - - - - - Layout that formats the log events as XML elements compatible with the log4j schema - - - - Formats the log events according to the http://logging.apache.org/log4j schema. - - - Nicko Cadell - - - - The 1st of January 1970 in UTC - - - - - Constructs an XMLLayoutSchemaLog4j - - - - - Constructs an XMLLayoutSchemaLog4j. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Actually do the writing of the xml - - the writer to use - the event to write - - - Generate XML that is compatible with the log4j schema. - - - - - - The version of the log4j schema to use. - - - - Only version 1.2 of the log4j schema is supported. - - - - - - The default object Renderer. - - - - The default renderer supports rendering objects and collections to strings. - - - See the method for details of the output. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface in order to render objects as strings - - - - Certain types require special case conversion to - string form. This conversion is done by an object renderer. - Object renderers implement the - interface. - - - Nicko Cadell - Gert Driesen - - - - Render the object to a string - - The map used to lookup renderers - The object to render - The writer to render to - - - Render the object to a - string. - - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - - - - - Default constructor - - - - Default constructor - - - - - - Render the object to a string - - The map used to lookup renderers - The object to render - The writer to render to - - - Render the object to a string. - - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - - The default renderer supports rendering objects to strings as follows: - - - - Value - Rendered String - - - null - - "(null)" - - - - - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. - - - For example: int[] {1, 2, 3}. - - - If the array is not one dimensional the - Array.ToString() is returned. - - - - - , & - - - Rendered as an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. - - - For example: {a, b, c}. - - - All collection classes that implement its subclasses, - or generic equivalents all implement the interface. - - - - - - - - Rendered as the key, an equals sign ('='), and the value (using the appropriate - renderer). - - - For example: key=value. - - - - - other - - Object.ToString() - - - - - - - - Render the array argument into a string - - The map used to lookup renderers - the array to render - The writer to render to - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - int[] {1, 2, 3}. - - - If the array is not one dimensional the - Array.ToString() is returned. - - - - - - Render the enumerator argument into a string - - The map used to lookup renderers - the enumerator to render - The writer to render to - - - Rendered as an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - {a, b, c}. - - - - - - Render the DictionaryEntry argument into a string - - The map used to lookup renderers - the DictionaryEntry to render - The writer to render to - - - Render the key, an equals sign ('='), and the value (using the appropriate - renderer). For example: key=value. - - - - - - Map class objects to an . - - - - Maintains a mapping between types that require special - rendering and the that - is used to render them. - - - The method is used to render an - object using the appropriate renderers defined in this map. - - - Nicko Cadell - Gert Driesen - - - - Default Constructor - - - - Default constructor. - - - - - - Render using the appropriate renderer. - - the object to render to a string - the object rendered as a string - - - This is a convenience method used to render an object to a string. - The alternative method - should be used when streaming output to a . - - - - - - Render using the appropriate renderer. - - the object to render to a string - The writer to render to - - - Find the appropriate renderer for the type of the - parameter. This is accomplished by calling the - method. Once a renderer is found, it is - applied on the object and the result is returned - as a . - - - - - - Gets the renderer for the specified object type - - the object to lookup the renderer for - the renderer for - - - Gets the renderer for the specified object type. - - - Syntactic sugar method that calls - with the type of the object parameter. - - - - - - Gets the renderer for the specified type - - the type to lookup the renderer for - the renderer for the specified type - - - Returns the renderer for the specified type. - If no specific renderer has been defined the - will be returned. - - - - - - Internal function to recursively search interfaces - - the type to lookup the renderer for - the renderer for the specified type - - - - Clear the map of renderers - - - - Clear the custom renderers defined by using - . The - cannot be removed. - - - - - - Register an for . - - the type that will be rendered by - the renderer for - - - Register an object renderer for a specific source type. - This renderer will be returned from a call to - specifying the same as an argument. - - - - - - Get the default renderer instance - - the default renderer - - - Get the default renderer - - - - - - Interface implemented by logger repository plugins. - - - - Plugins define additional behavior that can be associated - with a . - The held by the - property is used to store the plugins for a repository. - - - The log4net.Config.PluginAttribute can be used to - attach plugins to repositories created using configuration - attributes. - - - Nicko Cadell - Gert Driesen - - - - Attaches the plugin to the specified . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - This method is called to notify the plugin that - it should stop operating and should detach from - the repository. - - - - - - Gets the name of the plugin. - - - The name of the plugin. - - - - Plugins are stored in the - keyed by name. Each plugin instance attached to a - repository must be a unique name. - - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a PluginCollection instance. - - list to create a readonly wrapper arround - - A PluginCollection wrapper that is read-only. - - - - - Initializes a new instance of the PluginCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the PluginCollection class - that has the specified initial capacity. - - - The number of elements that the new PluginCollection is initially capable of storing. - - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified PluginCollection. - - The PluginCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - - Copies the entire PluginCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire PluginCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the PluginCollection. - - The to be added to the end of the PluginCollection. - The index at which the value has been added. - - - - Removes all elements from the PluginCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the PluginCollection. - - The to check for. - true if is found in the PluginCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the PluginCollection. - - The to locate in the PluginCollection. - - The zero-based index of the first occurrence of - in the entire PluginCollection, if found; otherwise, -1. - - - - - Inserts an element into the PluginCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the PluginCollection. - - The to remove from the PluginCollection. - - The specified was not found in the PluginCollection. - - - - - Removes the element at the specified index of the PluginCollection. - - The zero-based index of the element to remove. - - is less than zero. - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the PluginCollection. - - An for the entire PluginCollection. - - - - Adds the elements of another PluginCollection to the current PluginCollection. - - The PluginCollection whose elements should be added to the end of the current PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a array to the current PluginCollection. - - The array whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a collection to the current PluginCollection. - - The collection whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the PluginCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - An object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - - The at the specified index. - - The zero-based index of the element to get or set. - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false. - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false. - - - - Gets or sets the number of elements the PluginCollection can contain. - - - The number of elements the PluginCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - - A value - - - - - Supports simple iteration over a . - - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - The current element in the collection. - - - - - - - - Map of repository plugins. - - - - This class is a name keyed map of the plugins that are - attached to a repository. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The repository that the plugins should be attached to. - - - Initialize a new instance of the class with a - repository that the plugins should be attached to. - - - - - - Adds a to the map. - - The to add to the map. - - - The will be attached to the repository when added. - - - If there already exists a plugin with the same name - attached to the repository then the old plugin will - be and replaced with - the new plugin. - - - - - - Removes a from the map. - - The to remove from the map. - - - Remove a specific plugin from this map. - - - - - - Gets a by name. - - The name of the to lookup. - - The from the map with the name specified, or - null if no plugin is found. - - - - Lookup a plugin by name. If the plugin is not found null - will be returned. - - - - - - Gets all possible plugins as a list of objects. - - All possible plugins as a list of objects. - - - Get a collection of all the plugins defined in this map. - - - - - - Base implementation of - - - - Default abstract implementation of the - interface. This base class can be used by implementors - of the interface. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - the name of the plugin - - Initializes a new Plugin with the specified name. - - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - This method is called to notify the plugin that - it should stop operating and should detach from - the repository. - - - - - - The name of this plugin. - - - - - The repository this plugin is attached to. - - - - - Gets or sets the name of the plugin. - - - The name of the plugin. - - - - Plugins are stored in the - keyed by name. Each plugin instance attached to a - repository must be a unique name. - - - The name of the plugin must not change one the - plugin has been attached to a repository. - - - - - - The repository for this plugin - - - The that this plugin is attached to. - - - - Gets or sets the that this plugin is - attached to. - - - - - - Plugin that listens for events from the - - - - This plugin publishes an instance of - on a specified . This listens for logging events delivered from - a remote . - - - When an event is received it is relogged within the attached repository - as if it had been raised locally. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Initializes a new instance of the class. - - - The property must be set. - - - - - - Construct with sink Uri. - - The name to publish the sink under in the remoting infrastructure. - See for more details. - - - Initializes a new instance of the class - with specified name. - - - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - When the plugin is shutdown the remote logging - sink is disconnected. - - - - - - Gets or sets the URI of this sink. - - - The URI of this sink. - - - - This is the name under which the object is marshaled. - - - - - - - Delivers objects to a remote sink. - - - - Internal class used to listen for logging events - and deliver them to the local repository. - - - - - - Constructor - - The repository to log to. - - - Initializes a new instance of the for the - specified . - - - - - - Logs the events to the repository. - - The events to log. - - - The events passed are logged to the - - - - - - Obtains a lifetime service object to control the lifetime - policy for this instance. - - null to indicate that this instance should live forever. - - - Obtains a lifetime service object to control the lifetime - policy for this instance. This object should live forever - therefore this implementation returns null. - - - - - - The underlying that events should - be logged to. - - - - - Default implementation of - - - - This default implementation of the - interface is used to create the default subclass - of the object. - - - Nicko Cadell - Gert Driesen - - - - Interface abstracts creation of instances - - - - This interface is used by the to - create new objects. - - - The method is called - to create a named . - - - Implement this interface to create new subclasses of . - - - Nicko Cadell - Gert Driesen - - - - Create a new instance - - The name of the . - The instance for the specified name. - - - Create a new instance with the - specified name. - - - Called by the to create - new named instances. - - - If the is null then the root logger - must be returned. - - - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Create a new instance - - The name of the . - The instance for the specified name. - - - Create a new instance with the - specified name. - - - Called by the to create - new named instances. - - - If the is null then the root logger - must be returned. - - - - - - Default internal subclass of - - - - This subclass has no additional behavior over the - class but does allow instances - to be created. - - - - - - Implementation of used by - - - - Internal class used to provide implementation of - interface. Applications should use to get - logger instances. - - - This is one of the central classes in the log4net implementation. One of the - distinctive features of log4net are hierarchical loggers and their - evaluation. The organizes the - instances into a rooted tree hierarchy. - - - The class is abstract. Only concrete subclasses of - can be created. The - is used to create instances of this type for the . - - - Nicko Cadell - Gert Driesen - Aspi Havewala - Douglas de la Torre - - - - This constructor created a new instance and - sets its name. - - The name of the . - - - This constructor is protected and designed to be used by - a subclass that is not abstract. - - - Loggers are constructed by - objects. See for the default - logger creator. - - - - - - Add to the list of appenders of this - Logger instance. - - An appender to add to this logger - - - Add to the list of appenders of this - Logger instance. - - - If is already in the list of - appenders, then it won't be added again. - - - - - - Look for the appender named as name - - The name of the appender to lookup - The appender with the name specified, or null. - - - Returns the named appender, or null if the appender is not found. - - - - - - Remove all previously added appenders from this Logger instance. - - - - Remove all previously added appenders from this Logger instance. - - - This is useful when re-reading configuration information. - - - - - - Remove the appender passed as parameter form the list of appenders. - - The appender to remove - The appender removed from the list - - - Remove the appender passed as parameter form the list of appenders. - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Remove the appender passed as parameter form the list of appenders. - - The name of the appender to remove - The appender removed from the list - - - Remove the named appender passed as parameter form the list of appenders. - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - This generic form is intended to be used by wrappers. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generate a logging event for the specified using - the and . - - - This method must not throw any exception to the caller. - - - - - - This is the most generic printing method that is intended to be used - by wrappers. - - The event being logged. - - - Logs the specified logging event through this logger. - - - This method must not throw any exception to the caller. - - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - Test if this logger is going to log events of the specified . - - - This method must not throw any exception to the caller. - - - - - - Deliver the to the attached appenders. - - The event to log. - - - Call the appenders in the hierarchy starting at - this. If no appenders could be found, emit a - warning. - - - This method calls all the appenders inherited from the - hierarchy circumventing any evaluation of whether to log or not - to log the particular log request. - - - - - - Closes all attached appenders implementing the interface. - - - - Used to ensure that the appenders are correctly shutdown. - - - - - - This is the most generic printing method. This generic form is intended to be used by wrappers - - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generate a logging event for the specified using - the . - - - - - - Creates a new logging event and logs the event without further checks. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generates a logging event and delivers it to the attached - appenders. - - - - - - Creates a new logging event and logs the event without further checks. - - The event being logged. - - - Delivers the logging event to the attached appenders. - - - - - - The fully qualified type of the Logger class. - - - - - The name of this logger. - - - - - The assigned level of this logger. - - - - The level variable need not be - assigned a value in which case it is inherited - form the hierarchy. - - - - - - The parent of this logger. - - - - The parent of this logger. - All loggers have at least one ancestor which is the root logger. - - - - - - Loggers need to know what Hierarchy they are in. - - - - Loggers need to know what Hierarchy they are in. - The hierarchy that this logger is a member of is stored - here. - - - - - - Helper implementation of the interface - - - - - Flag indicating if child loggers inherit their parents appenders - - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - - Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl - - - - - Gets or sets the parent logger in the hierarchy. - - - The parent logger in the hierarchy. - - - - Part of the Composite pattern that makes the hierarchy. - The hierarchy is parent linked rather than child linked. - - - - - - Gets or sets a value indicating if child loggers inherit their parent's appenders. - - - true if child loggers inherit their parent's appenders. - - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - - Gets the effective level for this logger. - - The nearest level in the logger hierarchy. - - - Starting from this logger, searches the logger hierarchy for a - non-null level and returns it. Otherwise, returns the level of the - root logger. - - The Logger class is designed so that this method executes as - quickly as possible. - - - - - Gets or sets the where this - Logger instance is attached to. - - The hierarchy that this logger belongs to. - - - This logger must be attached to a single . - - - - - - Gets or sets the assigned , if any, for this Logger. - - - The of this logger. - - - - The assigned can be null. - - - - - - Get the appenders contained in this logger as an - . - - A collection of the appenders in this logger - - - Get the appenders contained in this logger as an - . If no appenders - can be found, then a is returned. - - - - - - Gets the logger name. - - - The name of the logger. - - - - The name of this logger - - - - - - Gets the where this - Logger instance is attached to. - - - The that this logger belongs to. - - - - Gets the where this - Logger instance is attached to. - - - - - - Construct a new Logger - - the name of the logger - - - Initializes a new instance of the class - with the specified name. - - - - - - Delegate used to handle logger creation event notifications. - - The in which the has been created. - The event args that hold the instance that has been created. - - - Delegate used to handle logger creation event notifications. - - - - - - Provides data for the event. - - - - A event is raised every time a - is created. - - - - - - The created - - - - - Constructor - - The that has been created. - - - Initializes a new instance of the event argument - class,with the specified . - - - - - - Gets the that has been created. - - - The that has been created. - - - - The that has been created. - - - - - - Hierarchical organization of loggers - - - - The casual user should not have to deal with this class - directly. - - - This class is specialized in retrieving loggers by name and - also maintaining the logger hierarchy. Implements the - interface. - - - The structure of the logger hierarchy is maintained by the - method. The hierarchy is such that children - link to their parent but parents do not have any references to their - children. Moreover, loggers can be instantiated in any order, in - particular descendant before ancestor. - - - In case a descendant is created before a particular ancestor, - then it creates a provision node for the ancestor and adds itself - to the provision node. Other descendants of the same ancestor add - themselves to the previously created provision node. - - - Nicko Cadell - Gert Driesen - - - - Base implementation of - - - - Default abstract implementation of the interface. - - - Skeleton implementation of the interface. - All types can extend this type. - - - Nicko Cadell - Gert Driesen - - - - Interface implemented by logger repositories. - - - - This interface is implemented by logger repositories. e.g. - . - - - This interface is used by the - to obtain interfaces. - - - Nicko Cadell - Gert Driesen - - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - The name of the logger to lookup - The Logger object with the name specified - - - If the names logger exists it is returned, otherwise - null is returned. - - - - - - Returns all the currently defined loggers as an Array. - - All the defined loggers - - - Returns all the currently defined loggers as an Array. - - - - - - Returns a named logger instance - - The name of the logger to retrieve - The logger object with the name specified - - - Returns a named logger instance. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - - - Shutdown the repository - - - Shutting down a repository will safely close and remove - all appenders in all loggers including the root logger. - - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - - The method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Reset the repositories configuration to a default state - - - - Reset all values contained in this instance to their - default state. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are configured as an Array. - - All the Appenders - - - Returns all the Appenders that are configured as an Array. - - - - - - The name of the repository - - - The name of the repository - - - - The name of the repository. - - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - - RendererMap accesses the object renderer map for this repository. - - - The RendererMap holds a mapping between types and - objects. - - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - The plugin map holds the instances - that have been attached to this repository. - - - - - - Get the level map for the Repository. - - - - Get the level map for the Repository. - - - The level map defines the mappings between - level names and objects in - this repository. - - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - The threshold for all events in this repository. - - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - Flag indicates if this repository has been configured. - - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - Event raised when the repository has been shutdown. - - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - Event raised when the repository's configuration has been - reset to default. - - - - - - Event to notify that the repository has had its configuration changed. - - - Event to notify that the repository has had its configuration changed. - - - - Event raised when the repository's configuration has been changed. - - - - - - Repository specific properties - - - Repository specific properties - - - - These properties can be specified on a repository specific basis. - - - - - - Default Constructor - - - - Initializes the repository with default (empty) properties. - - - - - - Construct the repository using specific properties - - the properties to set for this repository - - - Initializes the repository with specified properties. - - - - - - Test if logger exists - - The name of the logger to lookup - The Logger object with the name specified - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - - - - - Returns all the currently defined loggers in the repository - - All the defined loggers - - - Returns all the currently defined loggers in the repository as an Array. - - - - - - Return a new logger instance - - The name of the logger to retrieve - The logger object with the name specified - - - Return a new logger instance. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - - - - Shutdown the repository - - - - Shutdown the repository. Can be overridden in a subclass. - This base class implementation notifies the - listeners and all attached plugins of the shutdown event. - - - - - - Reset the repositories configuration to a default state - - - - Reset all values contained in this instance to their - default state. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the logEvent through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are configured as an Array. - - All the Appenders - - - Returns all the Appenders that are configured as an Array. - - - - - - Adds an object renderer for a specific class. - - The type that will be rendered by the renderer supplied. - The object renderer used to render the object. - - - Adds an object renderer for a specific class. - - - - - - Notify the registered listeners that the repository is shutting down - - Empty EventArgs - - - Notify any listeners that this repository is shutting down. - - - - - - Notify the registered listeners that the repository has had its configuration reset - - Empty EventArgs - - - Notify any listeners that this repository's configuration has been reset. - - - - - - Notify the registered listeners that the repository has had its configuration changed - - Empty EventArgs - - - Notify any listeners that this repository's configuration has changed. - - - - - - Raise a configuration changed event on this repository - - EventArgs.Empty - - - Applications that programmatically change the configuration of the repository should - raise this event notification to notify listeners. - - - - - - The name of the repository - - - The string name of the repository - - - - The name of this repository. The name is - used to store and lookup the repositories - stored by the . - - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - The threshold for all events in this repository - - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - - RendererMap accesses the object renderer map for this repository. - - - The RendererMap holds a mapping between types and - objects. - - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - The plugin map holds the instances - that have been attached to this repository. - - - - - - Get the level map for the Repository. - - - - Get the level map for the Repository. - - - The level map defines the mappings between - level names and objects in - this repository. - - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - Flag indicates if this repository has been configured. - - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - Event raised when the repository has been shutdown. - - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - Event raised when the repository's configuration has been - reset to default. - - - - - - Event to notify that the repository has had its configuration changed. - - - Event to notify that the repository has had its configuration changed. - - - - Event raised when the repository's configuration has been changed. - - - - - - Repository specific properties - - - Repository specific properties - - - These properties can be specified on a repository specific basis - - - - - Basic Configurator interface for repositories - - - - Interface used by basic configurator to configure a - with a default . - - - A should implement this interface to support - configuration by the . - - - Nicko Cadell - Gert Driesen - - - - Initialize the repository using the specified appender - - the appender to use to log all logging events - - - Configure the repository to route all logging events to the - specified appender. - - - - - - Configure repository using XML - - - - Interface used by Xml configurator to configure a . - - - A should implement this interface to support - configuration by the . - - - Nicko Cadell - Gert Driesen - - - - Initialize the repository using the specified config - - the element containing the root of the config - - - The schema for the XML configuration data is defined by - the implementation. - - - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Construct with properties - - The properties to pass to this repository. - - - Initializes a new instance of the class. - - - - - - Construct with a logger factory - - The factory to use to create new logger instances. - - - Initializes a new instance of the class with - the specified . - - - - - - Construct with properties and a logger factory - - The properties to pass to this repository. - The factory to use to create new logger instances. - - - Initializes a new instance of the class with - the specified . - - - - - - Test if a logger exists - - The name of the logger to lookup - The Logger object with the name specified - - - Check if the named logger exists in the hierarchy. If so return - its reference, otherwise returns null. - - - - - - Returns all the currently defined loggers in the hierarchy as an Array - - All the defined loggers - - - Returns all the currently defined loggers in the hierarchy as an Array. - The root logger is not included in the returned - enumeration. - - - - - - Return a new logger instance named as the first parameter using - the default factory. - - - - Return a new logger instance named as the first parameter using - the default factory. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - The name of the logger to retrieve - The logger object with the name specified - - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - - The Shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Reset all values contained in this hierarchy instance to their default. - - - - Reset all values contained in this hierarchy instance to their - default. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the logEvent through this hierarchy. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are currently configured - - An array containing all the currently configured appenders - - - Returns all the instances that are currently configured. - All the loggers are searched for appenders. The appenders may also be containers - for appenders and these are also searched for additional loggers. - - - The list returned is unordered but does not contain duplicates. - - - - - - Collect the appenders from an . - The appender may also be a container. - - - - - - - Collect the appenders from an container - - - - - - - Initialize the log4net system using the specified appender - - the appender to use to log all logging events - - - - Initialize the log4net system using the specified appender - - the appender to use to log all logging events - - - This method provides the same functionality as the - method implemented - on this object, but it is protected and therefore can be called by subclasses. - - - - - - Initialize the log4net system using the specified config - - the element containing the root of the config - - - - Initialize the log4net system using the specified config - - the element containing the root of the config - - - This method provides the same functionality as the - method implemented - on this object, but it is protected and therefore can be called by subclasses. - - - - - - Test if this hierarchy is disabled for the specified . - - The level to check against. - - true if the repository is disabled for the level argument, false otherwise. - - - - If this hierarchy has not been configured then this method will - always return true. - - - This method will return true if this repository is - disabled for level object passed as parameter and - false otherwise. - - - See also the property. - - - - - - Clear all logger definitions from the internal hashtable - - - - This call will clear all logger definitions from the internal - hashtable. Invoking this method will irrevocably mess up the - logger hierarchy. - - - You should really know what you are doing before - invoking this method. - - - - - - Return a new logger instance named as the first parameter using - . - - The name of the logger to retrieve - The factory that will make the new logger instance - The logger object with the name specified - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated by the - parameter and linked with its existing - ancestors as well as children. - - - - - - Sends a logger creation event to all registered listeners - - The newly created logger - - Raises the logger creation event. - - - - - Updates all the parents of the specified logger - - The logger to update the parents for - - - This method loops through all the potential parents of - . There 3 possible cases: - - - - No entry for the potential parent of exists - - We create a ProvisionNode for this potential - parent and insert in that provision node. - - - - The entry is of type Logger for the potential parent. - - The entry is 's nearest existing parent. We - update 's parent field with this entry. We also break from - he loop because updating our parent's parent is our parent's - responsibility. - - - - The entry is of type ProvisionNode for this potential parent. - - We add to the list of children for this - potential parent. - - - - - - - - Replace a with a in the hierarchy. - - - - - - We update the links for all the children that placed themselves - in the provision node 'pn'. The second argument 'log' is a - reference for the newly created Logger, parent of all the - children in 'pn'. - - - We loop on all the children 'c' in 'pn'. - - - If the child 'c' has been already linked to a child of - 'log' then there is no need to update 'c'. - - - Otherwise, we set log's parent field to c's parent and set - c's parent field to log. - - - - - - Define or redefine a Level using the values in the argument - - the level values - - - Define or redefine a Level using the values in the argument - - - Supports setting levels via the configuration file. - - - - - - Set a Property using the values in the argument - - the property value - - - Set a Property using the values in the argument. - - - Supports setting property values via the configuration file. - - - - - - Event used to notify that a logger has been created. - - - - Event raised when a logger is created. - - - - - - Has no appender warning been emitted - - - - Flag to indicate if we have already issued a warning - about not having an appender warning. - - - - - - Get the root of this hierarchy - - - - Get the root of this hierarchy. - - - - - - Gets or sets the default instance. - - The default - - - The logger factory is used to create logger instances. - - - - - - A class to hold the value, name and display name for a level - - - - A class to hold the value, name and display name for a level - - - - - - Override Object.ToString to return sensible debug info - - string info about this object - - - - Value of the level - - - - If the value is not set (defaults to -1) the value will be looked - up for the current level with the same name. - - - - - - Name of the level - - - The name of the level - - - - The name of the level. - - - - - - Display name for the level - - - The display name of the level - - - - The display name of the level. - - - - - - A class to hold the key and data for a property set in the config file - - - - A class to hold the key and data for a property set in the config file - - - - - - Override Object.ToString to return sensible debug info - - string info about this object - - - - Property Key - - - Property Key - - - - Property Key. - - - - - - Property Value - - - Property Value - - - - Property Value. - - - - - - Used internally to accelerate hash table searches. - - - - Internal class used to improve performance of - string keyed hashtables. - - - The hashcode of the string is cached for reuse. - The string is stored as an interned value. - When comparing two objects for equality - the reference equality of the interned strings is compared. - - - Nicko Cadell - Gert Driesen - - - - Construct key with string name - - - - Initializes a new instance of the class - with the specified name. - - - Stores the hashcode of the string and interns - the string key to optimize comparisons. - - - The Compact Framework 1.0 the - method does not work. On the Compact Framework - the string keys are not interned nor are they - compared by reference. - - - The name of the logger. - - - - Returns a hash code for the current instance. - - A hash code for the current instance. - - - Returns the cached hashcode. - - - - - - Determines whether two instances - are equal. - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - Compares the references of the interned strings. - - - - - - Provision nodes are used where no logger instance has been specified - - - - instances are used in the - when there is no specified - for that node. - - - A provision node holds a list of child loggers on behalf of - a logger that does not exist. - - - Nicko Cadell - Gert Driesen - - - - Create a new provision node with child node - - A child logger to add to this node. - - - Initializes a new instance of the class - with the specified child logger. - - - - - - The sits at the root of the logger hierarchy tree. - - - - The is a regular except - that it provides several guarantees. - - - First, it cannot be assigned a null - level. Second, since the root logger cannot have a parent, the - property always returns the value of the - level field without walking the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Construct a - - The level to assign to the root logger. - - - Initializes a new instance of the class with - the specified logging level. - - - The root logger names itself as "root". However, the root - logger cannot be retrieved by name. - - - - - - Gets the assigned level value without walking the logger hierarchy. - - The assigned level value without walking the logger hierarchy. - - - Because the root logger cannot have a parent and its level - must not be null this property just returns the - value of . - - - - - - Gets or sets the assigned for the root logger. - - - The of the root logger. - - - - Setting the level of the root logger to a null reference - may have catastrophic results. We prevent this here. - - - - - - Initializes the log4net environment using an XML DOM. - - - - Configures a using an XML DOM. - - - Nicko Cadell - Gert Driesen - - - - Construct the configurator for a hierarchy - - The hierarchy to build. - - - Initializes a new instance of the class - with the specified . - - - - - - Configure the hierarchy by parsing a DOM tree of XML elements. - - The root element to parse. - - - Configure the hierarchy by parsing a DOM tree of XML elements. - - - - - - Parse appenders by IDREF. - - The appender ref element. - The instance of the appender that the ref refers to. - - - Parse an XML element that represents an appender and return - the appender. - - - - - - Parses an appender element. - - The appender element. - The appender instance or null when parsing failed. - - - Parse an XML element that represents an appender and return - the appender instance. - - - - - - Parses a logger element. - - The logger element. - - - Parse an XML element that represents a logger. - - - - - - Parses the root logger element. - - The root element. - - - Parse an XML element that represents the root logger. - - - - - - Parses the children of a logger element. - - The category element. - The logger instance. - Flag to indicate if the logger is the root logger. - - - Parse the child elements of a <logger> element. - - - - - - Parses an object renderer. - - The renderer element. - - - Parse an XML element that represents a renderer. - - - - - - Parses a level element. - - The level element. - The logger object to set the level on. - Flag to indicate if the logger is the root logger. - - - Parse an XML element that represents a level. - - - - - - Sets a parameter on an object. - - The parameter element. - The object to set the parameter on. - - The parameter name must correspond to a writable property - on the object. The value of the parameter is a string, - therefore this function will attempt to set a string - property first. If unable to set a string property it - will inspect the property and its argument type. It will - attempt to call a static method called Parse on the - type of the property. This method will take a single - string argument and return a value that can be used to - set the property. - - - - - Test if an element has no attributes or child elements - - the element to inspect - true if the element has any attributes or child elements, false otherwise - - - - Test if a is constructible with Activator.CreateInstance. - - the type to inspect - true if the type is creatable using a default constructor, false otherwise - - - - Look for a method on the that matches the supplied - - the type that has the method - the name of the method - the method info found - - - The method must be a public instance method on the . - The method must be named or "Add" followed by . - The method must take a single parameter. - - - - - - Converts a string value to a target type. - - The type of object to convert the string to. - The string value to use as the value of the object. - - - An object of type with value or - null when the conversion could not be performed. - - - - - - Creates an object as specified in XML. - - The XML element that contains the definition of the object. - The object type to use if not explicitly specified. - The type that the returned object must be or must inherit from. - The object or null - - - Parse an XML element and create an object instance based on the configuration - data. - - - The type of the instance may be specified in the XML. If not - specified then the is used - as the type. However the type is specified it must support the - type. - - - - - - key: appenderName, value: appender. - - - - - The Hierarchy being configured. - - - - - Delegate used to handle logger repository shutdown event notifications - - The that is shutting down. - Empty event args - - - Delegate used to handle logger repository shutdown event notifications. - - - - - - Delegate used to handle logger repository configuration reset event notifications - - The that has had its configuration reset. - Empty event args - - - Delegate used to handle logger repository configuration reset event notifications. - - - - - - Delegate used to handle event notifications for logger repository configuration changes. - - The that has had its configuration changed. - Empty event arguments. - - - Delegate used to handle event notifications for logger repository configuration changes. - - - - - - Write the name of the current AppDomain to the output - - - - Write the name of the current AppDomain to the output writer - - - Nicko Cadell - - - - Write the name of the current AppDomain to the output - - the writer to write to - null, state is not set - - - Writes name of the current AppDomain to the output . - - - - - - Write the current date to the output - - - - Date pattern converter, uses a to format - the current date and time to the writer as a string. - - - The value of the determines - the formatting of the date. The following values are allowed: - - - Option value - Output - - - ISO8601 - - Uses the formatter. - Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. - - - - DATE - - Uses the formatter. - Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". - - - - ABSOLUTE - - Uses the formatter. - Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". - - - - other - - Any other pattern string uses the formatter. - This formatter passes the pattern string to the - method. - For details on valid patterns see - DateTimeFormatInfo Class. - - - - - - The date and time is in the local time zone and is rendered in that zone. - To output the time in Universal time see . - - - Nicko Cadell - - - - The used to render the date to a string - - - - The used to render the date to a string - - - - - - Initialize the converter options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write the current date to the output - - that will receive the formatted result. - null, state is not set - - - Pass the current date and time to the - for it to render it to the writer. - - - The date and time passed is in the local time zone. - - - - - - Write an environment variable to the output - - - - Write an environment variable to the output writer. - The value of the determines - the name of the variable to output. - - - Nicko Cadell - - - - Write an environment variable to the output - - the writer to write to - null, state is not set - - - Writes the environment variable to the output . - The name of the environment variable to output must be set - using the - property. - - - - - - Write the current thread identity to the output - - - - Write the current thread identity to the output writer - - - Nicko Cadell - - - - Write the current thread identity to the output - - the writer to write to - null, state is not set - - - Writes the current thread identity to the output . - - - - - - Pattern converter for literal string instances in the pattern - - - - Writes the literal string value specified in the - property to - the output. - - - Nicko Cadell - - - - Set the next converter in the chain - - The next pattern converter in the chain - The next pattern converter - - - Special case the building of the pattern converter chain - for instances. Two adjacent - literals in the pattern can be represented by a single combined - pattern converter. This implementation detects when a - is added to the chain - after this converter and combines its value with this converter's - literal value. - - - - - - Write the literal to the output - - the writer to write to - null, not set - - - Override the formatting behavior to ignore the FormattingInfo - because we have a literal instead. - - - Writes the value of - to the output . - - - - - - Convert this pattern into the rendered message - - that will receive the formatted result. - null, not set - - - This method is not used. - - - - - - Writes a newline to the output - - - - Writes the system dependent line terminator to the output. - This behavior can be overridden by setting the : - - - - Option Value - Output - - - DOS - DOS or Windows line terminator "\r\n" - - - UNIX - UNIX line terminator "\n" - - - - Nicko Cadell - - - - Initialize the converter - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write the current process ID to the output - - - - Write the current process ID to the output writer - - - Nicko Cadell - - - - Write the current process ID to the output - - the writer to write to - null, state is not set - - - Write the current process ID to the output . - - - - - - Property pattern converter - - - - This pattern converter reads the thread and global properties. - The thread properties take priority over global properties. - See for details of the - thread properties. See for - details of the global properties. - - - If the is specified then that will be used to - lookup a single property. If no is specified - then all properties will be dumped as a list of key value pairs. - - - Nicko Cadell - - - - Write the property value to the output - - that will receive the formatted result. - null, state is not set - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - - - - A Pattern converter that generates a string of random characters - - - - The converter generates a string of random characters. By default - the string is length 4. This can be changed by setting the - to the string value of the length required. - - - The random characters in the string are limited to uppercase letters - and numbers only. - - - The random number generator used by this class is not cryptographically secure. - - - Nicko Cadell - - - - Shared random number generator - - - - - Length of random string to generate. Default length 4. - - - - - Initialize the converter options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write a randoim string to the output - - the writer to write to - null, state is not set - - - Write a randoim string to the output . - - - - - - Write the current threads username to the output - - - - Write the current threads username to the output writer - - - Nicko Cadell - - - - Write the current threads username to the output - - the writer to write to - null, state is not set - - - Write the current threads username to the output . - - - - - - Write the UTC date time to the output - - - - Date pattern converter, uses a to format - the current date and time in Universal time. - - - See the for details on the date pattern syntax. - - - - Nicko Cadell - - - - Write the current date and time to the output - - that will receive the formatted result. - null, state is not set - - - Pass the current date and time to the - for it to render it to the writer. - - - The date is in Universal time when it is rendered. - - - - - - - Type converter for Boolean. - - - - Supports conversion from string to bool type. - - - - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - Uses the method to convert the - argument to a . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Exception base type for conversion errors. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - A message to include with the exception. - - - Initializes a new instance of the class - with the specified message. - - - - - - Constructor - - A message to include with the exception. - A nested exception to include. - - - Initializes a new instance of the class - with the specified message and inner exception. - - - - - - Serialization constructor - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Creates a new instance of the class. - - The conversion destination type. - The value to convert. - An instance of the . - - - Creates a new instance of the class. - - - - - - Creates a new instance of the class. - - The conversion destination type. - The value to convert. - A nested exception to include. - An instance of the . - - - Creates a new instance of the class. - - - - - - Register of type converters for specific types. - - - - Maintains a registry of type converters used to convert between - types. - - - Use the and - methods to register new converters. - The and methods - lookup appropriate converters to use. - - - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - Initializes a new instance of the class. - - - - - Static constructor. - - - - This constructor defines the intrinsic type converters. - - - - - - Adds a converter for a specific type. - - The type being converted to. - The type converter to use to convert to the destination type. - - - Adds a converter instance for a specific type. - - - - - - Adds a converter for a specific type. - - The type being converted to. - The type of the type converter to use to convert to the destination type. - - - Adds a converter for a specific type. - - - - - - Gets the type converter to use to convert values to the destination type. - - The type being converted from. - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - Gets the type converter to use to convert values to the destination type. - - - - - - Gets the type converter to use to convert values to the destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - Gets the type converter to use to convert values to the destination type. - - - - - - Lookups the type converter to use as specified by the attributes on the - destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - - Creates the instance of the type converter. - - The type of the type converter. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - The type specified for the type converter must implement - the or interfaces - and must have a public default (no argument) constructor. - - - - - - Mapping from to type converter. - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to an encoding - the encoding - - - Uses the method to - convert the argument to an . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Interface supported by type converters - - - - This interface supports conversion from a single type to arbitrary types. - See . - - - Nicko Cadell - - - - Returns whether this converter can convert the object to the specified type - - A Type that represents the type you want to convert to - true if the conversion is possible - - - Test if the type supported by this converter can be converted to the - . - - - - - - Converts the given value object to the specified type, using the arguments - - the object to convert - The Type to convert the value parameter to - the converted object - - - Converts the (which must be of the type supported - by this converter) to the specified.. - - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to an IPAddress - the IPAddress - - - Uses the method to convert the - argument to an . - If that fails then the string is resolved as a DNS hostname. - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - The string is used as the - of the . - - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a PatternLayout - the PatternLayout - - - Creates and returns a new using - the as the - . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Convert between string and - - - - Supports conversion from string to type, - and from a type to a string. - - - The string is used as the - of the . - - - - - - Nicko Cadell - - - - Can the target type be converted to the type supported by this object - - A that represents the type you want to convert to - true if the conversion is possible - - - Returns true if the is - assignable from a type. - - - - - - Converts the given value object to the specified type, using the arguments - - the object to convert - The Type to convert the value parameter to - the converted object - - - Uses the method to convert the - argument to a . - - - - The object cannot be converted to the - . To check for this condition use the - method. - - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a PatternString - the PatternString - - - Creates and returns a new using - the as the - . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a Type - the Type - - - Uses the method to convert the - argument to a . - Additional effort is made to locate partially specified types - by searching the loaded assemblies. - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Attribute used to associate a type converter - - - - Class and Interface level attribute that specifies a type converter - to use with the associated type. - - - To associate a type converter with a target type apply a - TypeConverterAttribute to the target type. Specify the - type of the type converter on the attribute. - - - Nicko Cadell - Gert Driesen - - - - The string type name of the type converter - - - - - Default constructor - - - - Default constructor - - - - - - Create a new type converter attribute for the specified type name - - The string type name of the type converter - - - The type specified must implement the - or the interfaces. - - - - - - Create a new type converter attribute for the specified type - - The type of the type converter - - - The type specified must implement the - or the interfaces. - - - - - - The string type name of the type converter - - - The string type name of the type converter - - - - The type specified must implement the - or the interfaces. - - - - - - A straightforward implementation of the interface. - - - - This is the default implementation of the - interface. Implementors of the interface - should aggregate an instance of this type. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Append on on all attached appenders. - - The event being logged. - The number of appenders called. - - - Calls the method on all - attached appenders. - - - - - - Append on on all attached appenders. - - The array of events being logged. - The number of appenders called. - - - Calls the method on all - attached appenders. - - - - - - Calls the DoAppende method on the with - the objects supplied. - - The appender - The events - - - If the supports the - interface then the will be passed - through using that interface. Otherwise the - objects in the array will be passed one at a time. - - - - - - Attaches an appender. - - The appender to add. - - - If the appender is already in the list it won't be added again. - - - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - Lookup an attached appender by name. - - - - - - Removes all attached appenders. - - - - Removes and closes all attached appenders - - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - List of appenders - - - - - Array of appenders, used to cache the m_appenderList - - - - - Gets all attached appenders. - - - A collection of attached appenders, or null if there - are no attached appenders. - - - - The read only collection of all currently attached appenders. - - - - - - This class aggregates several PropertiesDictionary collections together. - - - - Provides a dictionary style lookup over an ordered list of - collections. - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Add a Properties Dictionary to this composite collection - - the properties to add - - - Properties dictionaries added first take precedence over dictionaries added - later. - - - - - - Flatten this composite collection into a single properties dictionary - - the flattened dictionary - - - Reduces the collection of ordered dictionaries to a single dictionary - containing the resultant values for the keys. - - - - - - Gets the value of a property - - - The value for the property with the specified key - - - - Looks up the value for the specified. - The collections are searched - in the order in which they were added to this collection. The value - returned is the value held by the first collection that contains - the specified key. - - - If none of the collections contain the specified key then - null is returned. - - - - - - Base class for Context Properties implementations - - - - This class defines a basic property get set accessor - - - Nicko Cadell - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Gets or sets the value of a property - - - - - - Subclass of that maintains a count of - the number of bytes written. - - - - This writer counts the number of bytes written. - - - Nicko Cadell - Gert Driesen - - - - that does not leak exceptions - - - - does not throw exceptions when things go wrong. - Instead, it delegates error handling to its . - - - Nicko Cadell - Gert Driesen - - - - Adapter that extends and forwards all - messages to an instance of . - - - - Adapter that extends and forwards all - messages to an instance of . - - - Nicko Cadell - - - - The writer to forward messages to - - - - - Create an instance of that forwards all - messages to a . - - The to forward to - - - Create an instance of that forwards all - messages to a . - - - - - - Closes the writer and releases any system resources associated with the writer - - - - - - - - - Dispose this writer - - flag indicating if we are being disposed - - - Dispose this writer - - - - - - Flushes any buffered output - - - - Clears all buffers for the writer and causes any buffered data to be written - to the underlying device - - - - - - Writes a character to the wrapped TextWriter - - the value to write to the TextWriter - - - Writes a character to the wrapped TextWriter - - - - - - Writes a character buffer to the wrapped TextWriter - - the data buffer - the start index - the number of characters to write - - - Writes a character buffer to the wrapped TextWriter - - - - - - Writes a string to the wrapped TextWriter - - the value to write to the TextWriter - - - Writes a string to the wrapped TextWriter - - - - - - Gets or sets the underlying . - - - The underlying . - - - - Gets or sets the underlying . - - - - - - The Encoding in which the output is written - - - The - - - - The Encoding in which the output is written - - - - - - Gets an object that controls formatting - - - The format provider - - - - Gets an object that controls formatting - - - - - - Gets or sets the line terminator string used by the TextWriter - - - The line terminator to use - - - - Gets or sets the line terminator string used by the TextWriter - - - - - - Constructor - - the writer to actually write to - the error handler to report error to - - - Create a new QuietTextWriter using a writer and error handler - - - - - - Writes a character to the underlying writer - - the char to write - - - Writes a character to the underlying writer - - - - - - Writes a buffer to the underlying writer - - the buffer to write - the start index to write from - the number of characters to write - - - Writes a buffer to the underlying writer - - - - - - Writes a string to the output. - - The string data to write to the output. - - - Writes a string to the output. - - - - - - Closes the underlying output writer. - - - - Closes the underlying output writer. - - - - - - The error handler instance to pass all errors to - - - - - Flag to indicate if this writer is closed - - - - - Gets or sets the error handler that all errors are passed to. - - - The error handler that all errors are passed to. - - - - Gets or sets the error handler that all errors are passed to. - - - - - - Gets a value indicating whether this writer is closed. - - - true if this writer is closed, otherwise false. - - - - Gets a value indicating whether this writer is closed. - - - - - - Constructor - - The to actually write to. - The to report errors to. - - - Creates a new instance of the class - with the specified and . - - - - - - Writes a character to the underlying writer and counts the number of bytes written. - - the char to write - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Writes a buffer to the underlying writer and counts the number of bytes written. - - the buffer to write - the start index to write from - the number of characters to write - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Writes a string to the output and counts the number of bytes written. - - The string data to write to the output. - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Total number of bytes written. - - - - - Gets or sets the total number of bytes written. - - - The total number of bytes written. - - - - Gets or sets the total number of bytes written. - - - - - - A fixed size rolling buffer of logging events. - - - - An array backed fixed size leaky bucket. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The maximum number of logging events in the buffer. - - - Initializes a new instance of the class with - the specified maximum number of buffered logging events. - - - The argument is not a positive integer. - - - - Appends a to the buffer. - - The event to append to the buffer. - The event discarded from the buffer, if the buffer is full, otherwise null. - - - Append an event to the buffer. If the buffer still contains free space then - null is returned. If the buffer is full then an event will be dropped - to make space for the new event, the event dropped is returned. - - - - - - Get and remove the oldest event in the buffer. - - The oldest logging event in the buffer - - - Gets the oldest (first) logging event in the buffer and removes it - from the buffer. - - - - - - Pops all the logging events from the buffer into an array. - - An array of all the logging events in the buffer. - - - Get all the events in the buffer and clear the buffer. - - - - - - Clear the buffer - - - - Clear the buffer of all events. The events in the buffer are lost. - - - - - - Gets the th oldest event currently in the buffer. - - The th oldest event currently in the buffer. - - - If is outside the range 0 to the number of events - currently in the buffer, then null is returned. - - - - - - Gets the maximum size of the buffer. - - The maximum size of the buffer. - - - Gets the maximum size of the buffer - - - - - - Gets the number of logging events in the buffer. - - The number of logging events in the buffer. - - - This number is guaranteed to be in the range 0 to - (inclusive). - - - - - - An always empty . - - - - A singleton implementation of the - interface that always represents an empty collection. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - As the collection is empty no values are copied into the array. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - The singleton instance of the empty collection. - - - - - Gets the singleton instance of the empty collection. - - The singleton instance of the empty collection. - - - Gets the singleton instance of the empty collection. - - - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - - For the this property is always true. - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - As the collection is empty the is always 0. - - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - As the collection is empty and thread safe and synchronized this instance is also - the object. - - - - - - An always empty . - - - - A singleton implementation of the - interface that always represents an empty collection. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - As the collection is empty no values are copied into the array. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - Adds an element with the provided key and value to the - . - - The to use as the key of the element to add. - The to use as the value of the element to add. - - - As the collection is empty no new values can be added. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - Removes all elements from the . - - - - As the collection is empty no values can be removed. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - Determines whether the contains an element - with the specified key. - - The key to locate in the . - false - - - As the collection is empty the method always returns false. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - Removes the element with the specified key from the . - - The key of the element to remove. - - - As the collection is empty no values can be removed. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - The singleton instance of the empty dictionary. - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - - For the this property is always true. - - - - - - Gets the number of elements contained in the - - - The number of elements contained in the . - - - - As the collection is empty the is always 0. - - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - As the collection is empty and thread safe and synchronized this instance is also - the object. - - - - - - Gets a value indicating whether the has a fixed size. - - true - - - As the collection is empty always returns true. - - - - - - Gets a value indicating whether the is read-only. - - true - - - As the collection is empty always returns true. - - - - - - Gets an containing the keys of the . - - An containing the keys of the . - - - As the collection is empty a is returned. - - - - - - Gets an containing the values of the . - - An containing the values of the . - - - As the collection is empty a is returned. - - - - - - Gets or sets the element with the specified key. - - The key of the element to get or set. - null - - - As the collection is empty no values can be looked up or stored. - If the index getter is called then null is returned. - A is thrown if the setter is called. - - - This dictionary is always empty and cannot be modified. - - - - Contain the information obtained when parsing formatting modifiers - in conversion modifiers. - - - - Holds the formatting information extracted from the format string by - the . This is used by the - objects when rendering the output. - - - Nicko Cadell - Gert Driesen - - - - Defaut Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - - - Initializes a new instance of the class - with the specified parameters. - - - - - - Gets or sets the minimum value. - - - The minimum value. - - - - Gets or sets the minimum value. - - - - - - Gets or sets the maximum value. - - - The maximum value. - - - - Gets or sets the maximum value. - - - - - - Gets or sets a flag indicating whether left align is enabled - or not. - - - A flag indicating whether left align is enabled or not. - - - - Gets or sets a flag indicating whether left align is enabled or not. - - - - - - Implementation of Properties collection for the - - - - This class implements a properties collection that is thread safe and supports both - storing properties and capturing a read only copy of the current propertied. - - - This class is optimized to the scenario where the properties are read frequently - and are modified infrequently. - - - Nicko Cadell - - - - The read only copy of the properties. - - - - This variable is declared volatile to prevent the compiler and JIT from - reordering reads and writes of this thread performed on different threads. - - - - - - Lock object used to synchronize updates within this instance - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property from the global context - - the key for the entry to remove - - - Removing an entry from the global context properties is relatively expensive compared - with reading a value. - - - - - - Clear the global context properties - - - - - Get a readonly immutable copy of the properties - - the current global context properties - - - This implementation is fast because the GlobalContextProperties class - stores a readonly copy of the properties. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Reading the value for a key is faster than setting the value. - When the value is written a new read only copy of - the properties is created. - - - - - - Manages a mapping from levels to - - - - Manages an ordered mapping from instances - to subclasses. - - - Nicko Cadell - - - - Default constructor - - - - Initialise a new instance of . - - - - - - Add a to this mapping - - the entry to add - - - If a has previously been added - for the same then that entry will be - overwritten. - - - - - - Lookup the mapping for the specified level - - the level to lookup - the for the level or null if no mapping found - - - Lookup the value for the specified level. Finds the nearest - mapping value for the level that is equal to or less than the - specified. - - - If no mapping could be found then null is returned. - - - - - - Initialize options - - - - Caches the sorted list of in an array - - - - - - Implementation of Properties collection for the - - - - Class implements a collection of properties that is specific to each thread. - The class is not synchronized as each thread has its own . - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property - - the key for the entry to remove - - - Remove the value for the specified from the context. - - - - - - Clear all the context properties - - - - Clear all the context properties - - - - - - Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. - - create the dictionary if it does not exist, otherwise return null if is does not exist - the properties for this thread - - - The collection returned is only to be used on the calling thread. If the - caller needs to share the collection between different threads then the - caller must clone the collection before doings so. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Get or set the property value for the specified. - - - - - - Outputs log statements from within the log4net assembly. - - - - Log4net components cannot make log4net logging calls. However, it is - sometimes useful for the user to learn about what log4net is - doing. - - - All log4net internal debug calls go to the standard output stream - whereas internal error messages are sent to the standard error output - stream. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Static constructor that initializes logging by reading - settings from the application configuration file. - - - - The log4net.Internal.Debug application setting - controls internal debugging. This setting should be set - to true to enable debugging. - - - The log4net.Internal.Quiet application setting - suppresses all internal logging including error messages. - This setting should be set to true to enable message - suppression. - - - - - - Writes log4net internal debug messages to the - standard output stream. - - The message to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal debug messages to the - standard output stream. - - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The message to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The message to log. - An exception to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The message to log. - - - All internal error messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes output to the standard output stream. - - The message to log. - - - Writes to both Console.Out and System.Diagnostics.Trace. - Note that the System.Diagnostics.Trace is not supported - on the Compact Framework. - - - If the AppDomain is not configured with a config file then - the call to System.Diagnostics.Trace may fail. This is only - an issue if you are programmatically creating your own AppDomains. - - - - - - Writes output to the standard error stream. - - The message to log. - - - Writes to both Console.Error and System.Diagnostics.Trace. - Note that the System.Diagnostics.Trace is not supported - on the Compact Framework. - - - If the AppDomain is not configured with a config file then - the call to System.Diagnostics.Trace may fail. This is only - an issue if you are programmatically creating your own AppDomains. - - - - - - Default debug level - - - - - In quietMode not even errors generate any output. - - - - - Gets or sets a value indicating whether log4net internal logging - is enabled or disabled. - - - true if log4net internal logging is enabled, otherwise - false. - - - - When set to true, internal debug level logging will be - displayed. - - - This value can be set by setting the application setting - log4net.Internal.Debug in the application configuration - file. - - - The default value is false, i.e. debugging is - disabled. - - - - - The following example enables internal debugging using the - application configuration file : - - - - - - - - - - - - - Gets or sets a value indicating whether log4net should generate no output - from internal logging, not even for errors. - - - true if log4net should generate no output at all from internal - logging, otherwise false. - - - - When set to true will cause internal logging at all levels to be - suppressed. This means that no warning or error reports will be logged. - This option overrides the setting and - disables all debug also. - - This value can be set by setting the application setting - log4net.Internal.Quiet in the application configuration file. - - - The default value is false, i.e. internal logging is not - disabled. - - - - The following example disables internal logging using the - application configuration file : - - - - - - - - - - - - Test if LogLog.Debug is enabled for output. - - - true if Debug is enabled - - - - Test if LogLog.Debug is enabled for output. - - - - - - Test if LogLog.Warn is enabled for output. - - - true if Warn is enabled - - - - Test if LogLog.Warn is enabled for output. - - - - - - Test if LogLog.Error is enabled for output. - - - true if Error is enabled - - - - Test if LogLog.Error is enabled for output. - - - - - - Represents a native error code and message. - - - - Represents a Win32 platform native error. - - - Nicko Cadell - Gert Driesen - - - - Create an instance of the class with the specified - error number and message. - - The number of the native error. - The message of the native error. - - - Create an instance of the class with the specified - error number and message. - - - - - - Create a new instance of the class for the last Windows error. - - - An instance of the class for the last windows error. - - - - The message for the error number is lookup up using the - native Win32 FormatMessage function. - - - - - - Create a new instance of the class. - - the error number for the native error - - An instance of the class for the specified - error number. - - - - The message for the specified error number is lookup up using the - native Win32 FormatMessage function. - - - - - - Retrieves the message corresponding with a Win32 message identifier. - - Message identifier for the requested message. - - The message corresponding with the specified message identifier. - - - - The message will be searched for in system message-table resource(s) - using the native FormatMessage function. - - - - - - Return error information string - - error information string - - - Return error information string - - - - - - Formats a message string. - - Formatting options, and how to interpret the parameter. - Location of the message definition. - Message identifier for the requested message. - Language identifier for the requested message. - If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . - If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. - Pointer to an array of values that are used as insert values in the formatted message. - - - The function requires a message definition as input. The message definition can come from a - buffer passed into the function. It can come from a message table resource in an - already-loaded module. Or the caller can ask the function to search the system's message - table resource(s) for the message definition. The function finds the message definition - in a message table resource based on a message identifier and a language identifier. - The function copies the formatted message text to an output buffer, processing any embedded - insert sequences if requested. - - - To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. - - - - - If the function succeeds, the return value is the number of TCHARs stored in the output - buffer, excluding the terminating null character. - - - If the function fails, the return value is zero. To get extended error information, - call . - - - - - - Gets the number of the native error. - - - The number of the native error. - - - - Gets the number of the native error. - - - - - - Gets the message of the native error. - - - The message of the native error. - - - - - Gets the message of the native error. - - - - - An always empty . - - - - A singleton implementation of the over a collection - that is empty and not modifiable. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Test if the enumerator can advance, if so advance. - - false as the cannot advance. - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will always return false. - - - - - - Resets the enumerator back to the start. - - - - As the enumerator is over an empty collection does nothing. - - - - - - The singleton instance of the . - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current key from the enumerator. - - - Throws an exception because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current value from the enumerator. - - The current value from the enumerator. - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current entry from the enumerator. - - - Throws an because the - never has a current entry. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - An always empty . - - - - A singleton implementation of the over a collection - that is empty and not modifiable. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Test if the enumerator can advance, if so advance - - false as the cannot advance. - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will always return false. - - - - - - Resets the enumerator back to the start. - - - - As the enumerator is over an empty collection does nothing. - - - - - - The singleton instance of the . - - - - - Get the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - A SecurityContext used when a SecurityContext is not required - - - - The is a no-op implementation of the - base class. It is used where a - is required but one has not been provided. - - - Nicko Cadell - - - - Singleton instance of - - - - Singleton instance of - - - - - - Private constructor - - - - Private constructor for singleton pattern. - - - - - - Impersonate this SecurityContext - - State supplied by the caller - null - - - No impersonation is done and null is always returned. - - - - - - Implements log4net's default error handling policy which consists - of emitting a message for the first error in an appender and - ignoring all subsequent errors. - - - - The error message is printed on the standard error output stream. - - - This policy aims at protecting an otherwise working application - from being flooded with error messages when logging fails. - - - Nicko Cadell - Gert Driesen - - - - Default Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - The prefix to use for each message. - - - Initializes a new instance of the class - with the specified prefix. - - - - - - Log an Error - - The error message. - The exception. - The internal error code. - - - Prints the message and the stack trace of the exception on the standard - error output stream. - - - - - - Log an Error - - The error message. - The exception. - - - Prints the message and the stack trace of the exception on the standard - error output stream. - - - - - - Log an error - - The error message. - - - Print a the error message passed as parameter on the standard - error output stream. - - - - - - Flag to indicate if it is the first error - - - - - String to prefix each message with - - - - - Is error logging enabled - - - - Is error logging enabled. Logging is only enabled for the - first error delivered to the . - - - - - - A convenience class to convert property values to specific types. - - - - Utility functions for converting types and parsing values. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Converts a string to a value. - - String to convert. - The default value. - The value of . - - - If is "true", then true is returned. - If is "false", then false is returned. - Otherwise, is returned. - - - - - - Parses a file size into a number. - - String to parse. - The default value. - The value of . - - - Parses a file size of the form: number[KB|MB|GB] into a - long value. It is scaled with the appropriate multiplier. - - - is returned when - cannot be converted to a value. - - - - - - Converts a string to an object. - - The target type to convert to. - The string to convert to an object. - - The object converted from a string or null when the - conversion failed. - - - - Converts a string to an object. Uses the converter registry to try - to convert the string value into the specified target type. - - - - - - Checks if there is an appropriate type conversion from the source type to the target type. - - The type to convert from. - The type to convert to. - true if there is a conversion from the source type to the target type. - - Checks if there is an appropriate type conversion from the source type to the target type. - - - - - - - Converts an object to the target type. - - The object to convert to the target type. - The type to convert to. - The converted object. - - - Converts an object to the target type. - - - - - - Instantiates an object given a class name. - - The fully qualified class name of the object to instantiate. - The class to which the new object should belong. - The object to return in case of non-fulfillment. - - An instance of the or - if the object could not be instantiated. - - - - Checks that the is a subclass of - . If that test fails or the object could - not be instantiated, then is returned. - - - - - - Performs variable substitution in string from the - values of keys found in . - - The string on which variable substitution is performed. - The dictionary to use to lookup variables. - The result of the substitutions. - - - The variable substitution delimiters are ${ and }. - - - For example, if props contains key=value, then the call - - - - string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); - - - - will set the variable s to "Value of key is value.". - - - If no value could be found for the specified key, then substitution - defaults to an empty string. - - - For example, if system properties contains no value for the key - "nonExistentKey", then the call - - - - string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); - - - - will set s to "Value of nonExistentKey is []". - - - An Exception is thrown if contains a start - delimiter "${" which is not balanced by a stop delimiter "}". - - - - - - Converts the string representation of the name or numeric value of one or - more enumerated constants to an equivalent enumerated object. - - The type to convert to. - The enum string value. - If true, ignore case; otherwise, regard case. - An object of type whose value is represented by . - - - - Most of the work of the class - is delegated to the PatternParser class. - - - - The PatternParser processes a pattern string and - returns a chain of objects. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The pattern to parse. - - - Initializes a new instance of the class - with the specified pattern string. - - - - - - Parses the pattern into a chain of pattern converters. - - The head of a chain of pattern converters. - - - Parses the pattern into a chain of pattern converters. - - - - - - Build the unified cache of converters from the static and instance maps - - the list of all the converter names - - - Build the unified cache of converters from the static and instance maps - - - - - - Internal method to parse the specified pattern to find specified matches - - the pattern to parse - the converter names to match in the pattern - - - The matches param must be sorted such that longer strings come before shorter ones. - - - - - - Process a parsed literal - - the literal text - - - - Process a parsed converter pattern - - the name of the converter - the optional option for the converter - the formatting info for the converter - - - - Resets the internal state of the parser and adds the specified pattern converter - to the chain. - - The pattern converter to add. - - - - The first pattern converter in the chain - - - - - the last pattern converter in the chain - - - - - The pattern - - - - - Internal map of converter identifiers to converter types - - - - This map overrides the static s_globalRulesRegistry map. - - - - - - Get the converter registry used by this parser - - - The converter registry used by this parser - - - - Get the converter registry used by this parser - - - - - - Sort strings by length - - - - that orders strings by string length. - The longest strings are placed first - - - - - - This class implements a patterned string. - - - - This string has embedded patterns that are resolved and expanded - when the string is formatted. - - - This class functions similarly to the - in that it accepts a pattern and renders it to a string. Unlike the - however the PatternString - does not render the properties of a specific but - of the process in general. - - - The recognized conversion pattern names are: - - - - Conversion Pattern Name - Effect - - - appdomain - - - Used to output the friendly name of the current AppDomain. - - - - - date - - - Used to output the date of the logging event in the local time zone. - To output the date in universal time use the %utcdate pattern. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %date{HH:mm:ss,fff} or - %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %date{ISO8601} or %date{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - env - - - Used to output the a specific environment variable. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %env{COMPUTERNAME} would include the value - of the COMPUTERNAME environment variable. - - - The env pattern is not supported on the .NET Compact Framework. - - - - - identity - - - Used to output the user name for the currently active user - (Principal.Identity.Name). - - - - - newline - - - Outputs the platform dependent line separator character or - characters. - - - This conversion pattern name offers the same performance as using - non-portable line separator strings such as "\n", or "\r\n". - Thus, it is the preferred way of specifying a line separator. - - - - - processid - - - Used to output the system process ID for the current process. - - - - - property - - - Used to output a specific context property. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %property{user} would include the value - from the property that is keyed by the string 'user'. Each property value - that is to be included in the log must be specified separately. - Properties are stored in logging contexts. By default - the log4net:HostName property is set to the name of machine on - which the event was originally logged. - - - If no key is specified, e.g. %property then all the keys and their - values are printed in a comma separated list. - - - The properties of an event are combined from a number of different - contexts. These are listed below in the order in which they are searched. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - random - - - Used to output a random string of characters. The string is made up of - uppercase letters and numbers. By default the string is 4 characters long. - The length of the string can be specified within braces directly following the - pattern specifier, e.g. %random{8} would output an 8 character string. - - - - - username - - - Used to output the WindowsIdentity for the currently - active user. - - - - - utcdate - - - Used to output the date of the logging event in universal time. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %utcdate{HH:mm:ss,fff} or - %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %utcdate{ISO8601} or %utcdate{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - % - - - The sequence %% outputs a single percent sign. - - - - - - Additional pattern converters may be registered with a specific - instance using or - . - - - See the for details on the - format modifiers supported by the patterns. - - - Nicko Cadell - - - - Internal map of converter identifiers to converter types. - - - - - the pattern - - - - - the head of the pattern converter chain - - - - - patterns defined on this PatternString only - - - - - Initialize the global registry - - - - - Default constructor - - - - Initialize a new instance of - - - - - - Constructs a PatternString - - The pattern to use with this PatternString - - - Initialize a new instance of with the pattern specified. - - - - - - Initialize object options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Create the used to parse the pattern - - the pattern to parse - The - - - Returns PatternParser used to parse the conversion string. Subclasses - may override this to return a subclass of PatternParser which recognize - custom conversion pattern name. - - - - - - Produces a formatted string as specified by the conversion pattern. - - The TextWriter to write the formatted event to - - - Format the pattern to the . - - - - - - Format the pattern as a string - - the pattern formatted as a string - - - Format the pattern to a string. - - - - - - Add a converter to this PatternString - - the converter info - - - This version of the method is used by the configurator. - Programmatic users should use the alternative method. - - - - - - Add a converter to this PatternString - - the name of the conversion pattern for this converter - the type of the converter - - - Add a converter to this PatternString - - - - - - Gets or sets the pattern formatting string - - - The pattern formatting string - - - - The ConversionPattern option. This is the string which - controls formatting and consists of a mix of literal content and - conversion specifiers. - - - - - - Wrapper class used to map converter names to converter types - - - - Wrapper class used to map converter names to converter types - - - - - - default constructor - - - - - Gets or sets the name of the conversion pattern - - - The name of the conversion pattern - - - - Gets or sets the name of the conversion pattern - - - - - - Gets or sets the type of the converter - - - The type of the converter - - - - Gets or sets the type of the converter - - - - - - String keyed object map. - - - - While this collection is serializable only member - objects that are serializable will - be serialized along with this collection. - - - Nicko Cadell - Gert Driesen - - - - String keyed object map that is read only. - - - - This collection is readonly and cannot be modified. - - - While this collection is serializable only member - objects that are serializable will - be serialized along with this collection. - - - Nicko Cadell - Gert Driesen - - - - The Hashtable used to store the properties data - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Copy Constructor - - properties to copy - - - Initializes a new instance of the class. - - - - - - Deserialization constructor - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Gets the key names. - - An array of all the keys. - - - Gets the key names. - - - - - - Test if the dictionary contains a specified key - - the key to look for - true if the dictionary contains the specified key - - - Test if the dictionary contains a specified key - - - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - Serializes this object into the provided. - - - - - - See - - - - - See - - - - - - See - - - - - - - Remove all properties from the properties collection - - - - - See - - - - - - - See - - - - - - - See - - - - - Gets or sets the value of the property with the specified key. - - - The value of the property with the specified key. - - The key of the property to get or set. - - - The property value will only be serialized if it is serializable. - If it cannot be serialized it will be silently ignored if - a serialization operation is performed. - - - - - - The hashtable used to store the properties - - - The internal collection used to store the properties - - - - The hashtable used to store the properties - - - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - The number of properties in this collection - - - - - See - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - properties to copy - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class - with serialized data. - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Because this class is sealed the serialization constructor is private. - - - - - - Remove the entry with the specified key from this dictionary - - the key for the entry to remove - - - Remove the entry with the specified key from this dictionary - - - - - - See - - an enumerator - - - Returns a over the contest of this collection. - - - - - - See - - the key to remove - - - Remove the entry with the specified key from this dictionary - - - - - - See - - the key to lookup in the collection - true if the collection contains the specified key - - - Test if this collection contains a specified key. - - - - - - Remove all properties from the properties collection - - - - Remove all properties from the properties collection - - - - - - See - - the key - the value to store for the key - - - Store a value for the specified . - - - Thrown if the is not a string - - - - See - - - - - - - See - - - - - Gets or sets the value of the property with the specified key. - - - The value of the property with the specified key. - - The key of the property to get or set. - - - The property value will only be serialized if it is serializable. - If it cannot be serialized it will be silently ignored if - a serialization operation is performed. - - - - - - See - - - false - - - - This collection is modifiable. This property always - returns false. - - - - - - See - - - The value for the key specified. - - - - Get or set a value for the specified . - - - Thrown if the is not a string - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - A that ignores the message - - - - This writer is used in special cases where it is necessary - to protect a writer from being closed by a client. - - - Nicko Cadell - - - - Constructor - - the writer to actually write to - - - Create a new ProtectCloseTextWriter using a writer - - - - - - Attach this instance to a different underlying - - the writer to attach to - - - Attach this instance to a different underlying - - - - - - Does not close the underlying output writer. - - - - Does not close the underlying output writer. - This method does nothing. - - - - - - Defines a lock that supports single writers and multiple readers - - - - ReaderWriterLock is used to synchronize access to a resource. - At any given time, it allows either concurrent read access for - multiple threads, or write access for a single thread. In a - situation where a resource is changed infrequently, a - ReaderWriterLock provides better throughput than a simple - one-at-a-time lock, such as . - - - If a platform does not support a System.Threading.ReaderWriterLock - implementation then all readers and writers are serialized. Therefore - the caller must not rely on multiple simultaneous readers. - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Acquires a reader lock - - - - blocks if a different thread has the writer - lock, or if at least one thread is waiting for the writer lock. - - - - - - Decrements the lock count - - - - decrements the lock count. When the count - reaches zero, the lock is released. - - - - - - Acquires the writer lock - - - - This method blocks if another thread has a reader lock or writer lock. - - - - - - Decrements the lock count on the writer lock - - - - ReleaseWriterLock decrements the writer lock count. - When the count reaches zero, the writer lock is released. - - - - - - A that can be and reused - - - - A that can be and reused. - This uses a single buffer for string operations. - - - Nicko Cadell - - - - Create an instance of - - the format provider to use - - - Create an instance of - - - - - - Override Dispose to prevent closing of writer - - flag - - - Override Dispose to prevent closing of writer - - - - - - Reset this string writer so that it can be reused. - - the maximum buffer capacity before it is trimmed - the default size to make the buffer - - - Reset this string writer so that it can be reused. - The internal buffers are cleared and reset. - - - - - - Utility class for system specific information. - - - - Utility class of static methods for system specific information. - - - Nicko Cadell - Gert Driesen - Alexey Solofnenko - - - - Private constructor to prevent instances. - - - - Only static methods are exposed from this type. - - - - - - Initialize default values for private static fields. - - - - Only static methods are exposed from this type. - - - - - - Gets the assembly location path for the specified assembly. - - The assembly to get the location for. - The location of the assembly. - - - This method does not guarantee to return the correct path - to the assembly. If only tries to give an indication as to - where the assembly was loaded from. - - - - - - Gets the fully qualified name of the , including - the name of the assembly from which the was - loaded. - - The to get the fully qualified name for. - The fully qualified name for the . - - - This is equivalent to the Type.AssemblyQualifiedName property, - but this method works on the .NET Compact Framework 1.0 as well as - the full .NET runtime. - - - - - - Gets the short name of the . - - The to get the name for. - The short name of the . - - - The short name of the assembly is the - without the version, culture, or public key. i.e. it is just the - assembly's file name without the extension. - - - Use this rather than Assembly.GetName().Name because that - is not available on the Compact Framework. - - - Because of a FileIOPermission security demand we cannot do - the obvious Assembly.GetName().Name. We are allowed to get - the of the assembly so we - start from there and strip out just the assembly name. - - - - - - Gets the file name portion of the , including the extension. - - The to get the file name for. - The file name of the assembly. - - - Gets the file name portion of the , including the extension. - - - - - - Loads the type specified in the type string. - - A sibling type to use to load the type. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified, it will be loaded from the assembly - containing the specified relative type. If the type is not found in the assembly - then all the loaded assemblies will be searched for the type. - - - - - - Loads the type specified in the type string. - - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the - assembly that is directly calling this method. If the type is not found - in the assembly then all the loaded assemblies will be searched for the type. - - - - - - Loads the type specified in the type string. - - An assembly to load the type from. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the specified - assembly. If the type is not found in the assembly then all the loaded assemblies - will be searched for the type. - - - - - - Generate a new guid - - A new Guid - - - Generate a new guid - - - - - - Create an - - The name of the parameter that caused the exception - The value of the argument that causes this exception - The message that describes the error - the ArgumentOutOfRangeException object - - - Create a new instance of the class - with a specified error message, the parameter name, and the value - of the argument. - - - The Compact Framework does not support the 3 parameter constructor for the - type. This method provides an - implementation that works for all platforms. - - - - - - Parse a string into an value - - the string to parse - out param where the parsed value is placed - true if the string was able to be parsed into an integer - - - Attempts to parse the string into an integer. If the string cannot - be parsed then this method returns false. The method does not throw an exception. - - - - - - Parse a string into an value - - the string to parse - out param where the parsed value is placed - true if the string was able to be parsed into an integer - - - Attempts to parse the string into an integer. If the string cannot - be parsed then this method returns false. The method does not throw an exception. - - - - - - Lookup an application setting - - the application settings key to lookup - the value for the key, or null - - - Configuration APIs are not supported under the Compact Framework - - - - - - Convert a path into a fully qualified local file path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - The path specified must be a local file path, a URI is not supported. - - - - - - Creates a new case-insensitive instance of the class with the default initial capacity. - - A new case-insensitive instance of the class with the default initial capacity - - - The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. - - - - - - Gets an empty array of types. - - - - The Type.EmptyTypes field is not available on - the .NET Compact Framework 1.0. - - - - - - Cache the host name for the current machine - - - - - Cache the application friendly name - - - - - Text to output when a null is encountered. - - - - - Text to output when an unsupported feature is requested. - - - - - Start time for the current process. - - - - - Gets the system dependent line terminator. - - - The system dependent line terminator. - - - - Gets the system dependent line terminator. - - - - - - Gets the base directory for this . - - The base directory path for the current . - - - Gets the base directory for this . - - - The value returned may be either a local file path or a URI. - - - - - - Gets the path to the configuration file for the current . - - The path to the configuration file for the current . - - - The .NET Compact Framework 1.0 does not have a concept of a configuration - file. For this runtime, we use the entry assembly location as the root for - the configuration file name. - - - The value returned may be either a local file path or a URI. - - - - - - Gets the path to the file that first executed in the current . - - The path to the entry assembly. - - - Gets the path to the file that first executed in the current . - - - - - - Gets the ID of the current thread. - - The ID of the current thread. - - - On the .NET framework, the AppDomain.GetCurrentThreadId method - is used to obtain the thread ID for the current thread. This is the - operating system ID for the thread. - - - On the .NET Compact Framework 1.0 it is not possible to get the - operating system thread ID for the current thread. The native method - GetCurrentThreadId is implemented inline in a header file - and cannot be called. - - - On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this - gives a stable id unrelated to the operating system thread ID which may - change if the runtime is using fibers. - - - - - - Get the host name or machine name for the current machine - - - The hostname or machine name - - - - Get the host name or machine name for the current machine - - - The host name () or - the machine name (Environment.MachineName) for - the current machine, or if neither of these are available - then NOT AVAILABLE is returned. - - - - - - Get this application's friendly name - - - The friendly name of this application as a string - - - - If available the name of the application is retrieved from - the AppDomain using AppDomain.CurrentDomain.FriendlyName. - - - Otherwise the file name of the entry assembly is used. - - - - - - Get the start time for the current process. - - - - This is the time at which the log4net library was loaded into the - AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime - this is not the start time for the current process. - - - The log4net library should be loaded by an application early during its - startup, therefore this start time should be a good approximation for - the actual start time. - - - Note that AppDomains may be loaded and unloaded within the - same process without the process terminating, however this start time - will be set per AppDomain. - - - - - - Text to output when a null is encountered. - - - - Use this value to indicate a null has been encountered while - outputting a string representation of an item. - - - The default value is (null). This value can be overridden by specifying - a value for the log4net.NullText appSetting in the application's - .config file. - - - - - - Text to output when an unsupported feature is requested. - - - - Use this value when an unsupported feature is requested. - - - The default value is NOT AVAILABLE. This value can be overridden by specifying - a value for the log4net.NotAvailableText appSetting in the application's - .config file. - - - - - - Utility class that represents a format string. - - - - Utility class that represents a format string. - - - Nicko Cadell - - - - Initialise the - - An that supplies culture-specific formatting information. - A containing zero or more format items. - An array containing zero or more objects to format. - - - - Format the string and arguments - - the formatted string - - - - Replaces the format item in a specified with the text equivalent - of the value of a corresponding instance in a specified array. - A specified parameter supplies culture-specific formatting information. - - An that supplies culture-specific formatting information. - A containing zero or more format items. - An array containing zero or more objects to format. - - A copy of format in which the format items have been replaced by the - equivalent of the corresponding instances of in args. - - - - This method does not throw exceptions. If an exception thrown while formatting the result the - exception and arguments are returned in the result string. - - - - - - Process an error during StringFormat - - - - - Dump the contents of an array into a string builder - - - - - Dump an object to a string - - - - - Implementation of Properties collection for the - - - - Class implements a collection of properties that is specific to each thread. - The class is not synchronized as each thread has its own . - - - Nicko Cadell - - - - The thread local data slot to use to store a PropertiesDictionary. - - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property - - the key for the entry to remove - - - Remove a property - - - - - - Clear all properties - - - - Clear all properties - - - - - - Get the PropertiesDictionary for this thread. - - create the dictionary if it does not exist, otherwise return null if is does not exist - the properties for this thread - - - The collection returned is only to be used on the calling thread. If the - caller needs to share the collection between different threads then the - caller must clone the collection before doing so. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Gets or sets the value of a property - - - - - - Implementation of Stack for the - - - - Implementation of Stack for the - - - Nicko Cadell - - - - The stack store. - - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Clears all the contextual information held in this stack. - - - - Clears all the contextual information held in this stack. - Only call this if you think that this tread is being reused after - a previous call execution which may not have completed correctly. - You do not need to use this method if you always guarantee to call - the method of the - returned from even in exceptional circumstances, - for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) - syntax. - - - - - - Removes the top context from this stack. - - The message in the context that was removed from the top of this stack. - - - Remove the top context from this stack, and return - it to the caller. If this stack is empty then an - empty string (not ) is returned. - - - - - - Pushes a new context message into this stack. - - The new context message. - - An that can be used to clean up the context stack. - - - - Pushes a new context onto this stack. An - is returned that can be used to clean up this stack. This - can be easily combined with the using keyword to scope the - context. - - - Simple example of using the Push method with the using keyword. - - using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) - { - log.Warn("This should have an ThreadContext Stack message"); - } - - - - - - Gets the current context information for this stack. - - The current context information. - - - - Gets the current context information for this stack. - - Gets the current context information - - - Gets the current context information for this stack. - - - - - - Get a portable version of this object - - the portable instance of this object - - - Get a cross thread portable version of this object - - - - - - The number of messages in the stack - - - The current number of messages in the stack - - - - The current number of messages in the stack. That is - the number of times has been called - minus the number of times has been called. - - - - - - Gets and sets the internal stack used by this - - The internal storage stack - - - This property is provided only to support backward compatability - of the . Tytpically the internal stack should not - be modified. - - - - - - Inner class used to represent a single context frame in the stack. - - - - Inner class used to represent a single context frame in the stack. - - - - - - Constructor - - The message for this context. - The parent context in the chain. - - - Initializes a new instance of the class - with the specified message and parent context. - - - - - - Get the message. - - The message. - - - Get the message. - - - - - - Gets the full text of the context down to the root level. - - - The full text of the context down to the root level. - - - - Gets the full text of the context down to the root level. - - - - - - Struct returned from the method. - - - - This struct implements the and is designed to be used - with the pattern to remove the stack frame at the end of the scope. - - - - - - The ThreadContextStack internal stack - - - - - The depth to trim the stack to when this instance is disposed - - - - - Constructor - - The internal stack used by the ThreadContextStack. - The depth to return the stack to when this object is disposed. - - - Initializes a new instance of the class with - the specified stack and return depth. - - - - - - Returns the stack to the correct depth. - - - - Returns the stack to the correct depth. - - - - - - Implementation of Stacks collection for the - - - - Implementation of Stacks collection for the - - - Nicko Cadell - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Gets the named thread context stack - - - The named stack - - - - Gets the named thread context stack - - - - - - Utility class for transforming strings. - - - - Utility class for transforming strings. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Write a string to an - - the writer to write to - the string to write - The string to replace non XML compliant chars with - - - The test is escaped either using XML escape entities - or using CDATA sections. - - - - - - Replace invalid XML characters in text string - - the XML text input string - the string to use in place of invalid characters - A string that does not contain invalid XML characters. - - - Certain Unicode code points are not allowed in the XML InfoSet, for - details see: http://www.w3.org/TR/REC-xml/#charsets. - - - This method replaces any illegal characters in the input string - with the mask string specified. - - - - - - Count the number of times that the substring occurs in the text - - the text to search - the substring to find - the number of times the substring occurs in the text - - - The substring is assumed to be non repeating within itself. - - - - - - Impersonate a Windows Account - - - - This impersonates a Windows account. - - - How the impersonation is done depends on the value of . - This allows the context to either impersonate a set of user credentials specified - using username, domain name and password or to revert to the process credentials. - - - - - - Default constructor - - - - Default constructor - - - - - - Initialize the SecurityContext based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The security context will try to Logon the specified user account and - capture a primary token for impersonation. - - - The required , - or properties were not specified. - - - - Impersonate the Windows account specified by the and properties. - - caller provided state - - An instance that will revoke the impersonation of this SecurityContext - - - - Depending on the property either - impersonate a user using credentials supplied or revert - to the process credentials. - - - - - - Create a given the userName, domainName and password. - - the user name - the domain name - the password - the for the account specified - - - Uses the Windows API call LogonUser to get a principal token for the account. This - token is used to initialize the WindowsIdentity. - - - - - - Gets or sets the impersonation mode for this security context - - - The impersonation mode for this security context - - - - Impersonate either a user with user credentials or - revert this thread to the credentials of the process. - The value is one of the - enum. - - - The default value is - - - When the mode is set to - the user's credentials are established using the - , and - values. - - - When the mode is set to - no other properties need to be set. If the calling thread is - impersonating then it will be reverted back to the process credentials. - - - - - - Gets or sets the Windows username for this security context - - - The Windows username for this security context - - - - This property must be set if - is set to (the default setting). - - - - - - Gets or sets the Windows domain name for this security context - - - The Windows domain name for this security context - - - - The default value for is the local machine name - taken from the property. - - - This property must be set if - is set to (the default setting). - - - - - - Sets the password for the Windows account specified by the and properties. - - - The password for the Windows account specified by the and properties. - - - - This property must be set if - is set to (the default setting). - - - - - - The impersonation modes for the - - - - See the property for - details. - - - - - - Impersonate a user using the credentials supplied - - - - - Revert this the thread to the credentials of the process - - - - - Adds to - - - - Helper class to expose the - through the interface. - - - - - - Constructor - - the impersonation context being wrapped - - - Constructor - - - - - - Revert the impersonation - - - - Revert the impersonation - - - - - - The log4net Global Context. - - - - The GlobalContext provides a location for global debugging - information to be stored. - - - The global context has a properties map and these properties can - be included in the output of log messages. The - supports selecting and outputing these properties. - - - By default the log4net:HostName property is set to the name of - the current machine. - - - - - GlobalContext.Properties["hostname"] = Environment.MachineName; - - - - Nicko Cadell - - - - Private Constructor. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - The global context properties instance - - - - - The global properties map. - - - The global properties map. - - - - The global properties map. - - - - - - The log4net Logical Thread Context. - - - - The LogicalThreadContext provides a location for specific debugging - information to be stored. - The LogicalThreadContext properties override any or - properties with the same name. - - - The Logical Thread Context has a properties map and a stack. - The properties and stack can - be included in the output of log messages. The - supports selecting and outputting these properties. - - - The Logical Thread Context provides a diagnostic context for the current call context. - This is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The Logical Thread Context is managed on a per basis. - - - Example of using the thread context properties to store a username. - - LogicalThreadContext.Properties["user"] = userName; - log.Info("This log message has a LogicalThreadContext Property called 'user'"); - - - Example of how to push a message into the context stack - - using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) - { - log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); - - } // at the end of the using block the message is automatically popped - - - - Nicko Cadell - - - - Private Constructor. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - The thread context properties instance - - - - - The thread context stacks instance - - - - - The thread properties map - - - The thread properties map - - - - The LogicalThreadContext properties override any - or properties with the same name. - - - - - - The thread stacks - - - stack map - - - - The logical thread stacks. - - - - - - This class is used by client applications to request logger instances. - - - - This class has static methods that are used by a client to request - a logger instance. The method is - used to retrieve a logger. - - - See the interface for more details. - - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - Returns the named logger if it exists. - - Returns the named logger if it exists. - - - - If the named logger exists (in the default repository) then it - returns a reference to the logger, otherwise it returns null. - - - The fully qualified logger name to look for. - The logger found, or null if no logger could be found. - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the specified repository) then it - returns a reference to the logger, otherwise it returns - null. - - - The repository to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the logger doesn't exist in the specified - repository. - - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the repository for the specified assembly) then it - returns a reference to the logger, otherwise it returns - null. - - - The assembly to use to lookup the repository. - The fully qualified logger name to look for. - - The logger, or null if the logger doesn't exist in the specified - assembly's repository. - - - - Get the currently defined loggers. - - Returns all the currently defined loggers in the default repository. - - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified repository. - - The repository to lookup in. - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified assembly's repository. - - The assembly to use to lookup the repository. - - The root logger is not included in the returned array. - - All the defined loggers. - - - Get or create a logger. - - Retrieves or creates a named logger. - - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The repository to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The assembly to use to lookup the repository. - The name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Get the logger for the fully qualified name of the type specified. - - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The repository to lookup in. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The assembly to use to lookup the repository. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - Shutdown a logger repository. - - Shuts down the default repository. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - default repository. - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The repository to shutdown. - - - - Shuts down the repository specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository. The repository is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The assembly to use to lookup the repository. - - - Reset the configuration of a repository - - Resets all values contained in this repository instance to their defaults. - - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The repository to reset. - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The assembly to use to lookup the repository to reset. - - - Get the logger repository. - - Returns the default instance. - - - - Gets the for the repository specified - by the callers assembly (). - - - The instance for the default repository. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The repository to lookup in. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The assembly to use to lookup the repository. - - - Get a logger repository. - - Returns the default instance. - - - - Gets the for the repository specified - by the callers assembly (). - - - The instance for the default repository. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The repository to lookup in. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The assembly to use to lookup the repository. - - - Create a domain - - Creates a repository with the specified repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to will return - the same repository instance. - - - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - Create a logger repository. - - Creates a repository with the specified repository type. - - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The created will be associated with the repository - specified such that a call to will return - the same repository instance. - - - - - - Creates a repository with the specified name. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name. - - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - The specified repository already exists. - - - - Creates a repository for the specified assembly and repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - - Creates a repository for the specified assembly and repository type. - - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - - Gets the list of currently defined repositories. - - - - Get an array of all the objects that have been created. - - - An array of all the known objects. - - - - Looks up the wrapper object for the logger specified. - - The logger to get the wrapper for. - The wrapper for the logger specified. - - - - Looks up the wrapper objects for the loggers specified. - - The loggers to get the wrappers for. - The wrapper objects for the loggers specified. - - - - Create the objects used by - this manager. - - The logger to wrap. - The wrapper for the logger specified. - - - - The wrapper map to use to hold the objects. - - - - - Implementation of Mapped Diagnostic Contexts. - - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - The MDC class is similar to the class except that it is - based on a map instead of a stack. It provides mapped - diagnostic contexts. A Mapped Diagnostic Context, or - MDC in short, is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The MDC is managed on a per thread basis. - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Gets the context value identified by the parameter. - - The key to lookup in the MDC. - The string value held for the key, or a null reference if no corresponding value is found. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - If the parameter does not look up to a - previously defined context then null will be returned. - - - - - - Add an entry to the MDC - - The key to store the value under. - The value to store. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Puts a context value (the parameter) as identified - with the parameter into the current thread's - context map. - - - If a value is already defined for the - specified then the value will be replaced. If the - is specified as null then the key value mapping will be removed. - - - - - - Removes the key value mapping for the key specified. - - The key to remove. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Remove the specified entry from this thread's MDC - - - - - - Clear all entries in the MDC - - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Remove all the entries from this thread's MDC - - - - - - Implementation of Nested Diagnostic Contexts. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - A Nested Diagnostic Context, or NDC in short, is an instrument - to distinguish interleaved log output from different sources. Log - output is typically interleaved when a server handles multiple - clients near-simultaneously. - - - Interleaved log output can still be meaningful if each log entry - from different contexts had a distinctive stamp. This is where NDCs - come into play. - - - Note that NDCs are managed on a per thread basis. The NDC class - is made up of static methods that operate on the context of the - calling thread. - - - How to push a message into the context - - using(NDC.Push("my context message")) - { - ... all log calls will have 'my context message' included ... - - } // at the end of the using block the message is automatically removed - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Clears all the contextual information held on the current thread. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Clears the stack of NDC data held on the current thread. - - - - - - Creates a clone of the stack of context information. - - A clone of the context info for this thread. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - The results of this method can be passed to the - method to allow child threads to inherit the context of their - parent thread. - - - - - - Inherits the contextual information from another thread. - - The context stack to inherit. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - This thread will use the context information from the stack - supplied. This can be used to initialize child threads with - the same contextual information as their parent threads. These - contexts will NOT be shared. Any further contexts that - are pushed onto the stack will not be visible to the other. - Call to obtain a stack to pass to - this method. - - - - - - Removes the top context from the stack. - - - The message in the context that was removed from the top - of the stack. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Remove the top context from the stack, and return - it to the caller. If the stack is empty then an - empty string (not null) is returned. - - - - - - Pushes a new context message. - - The new context message. - - An that can be used to clean up - the context stack. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Pushes a new context onto the context stack. An - is returned that can be used to clean up the context stack. This - can be easily combined with the using keyword to scope the - context. - - - Simple example of using the Push method with the using keyword. - - using(log4net.NDC.Push("NDC_Message")) - { - log.Warn("This should have an NDC message"); - } - - - - - - Removes the context information for this thread. It is - not required to call this method. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - This method is not implemented. - - - - - - Forces the stack depth to be at most . - - The maximum depth of the stack - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Forces the stack depth to be at most . - This may truncate the head of the stack. This only affects the - stack in the current thread. Also it does not prevent it from - growing, it only sets the maximum depth at the time of the - call. This can be used to return to a known context depth. - - - - - - Gets the current context depth. - - The current context depth. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - The number of context values pushed onto the context stack. - - - Used to record the current depth of the context. This can then - be restored using the method. - - - - - - - The log4net Thread Context. - - - - The ThreadContext provides a location for thread specific debugging - information to be stored. - The ThreadContext properties override any - properties with the same name. - - - The thread context has a properties map and a stack. - The properties and stack can - be included in the output of log messages. The - supports selecting and outputting these properties. - - - The Thread Context provides a diagnostic context for the current thread. - This is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The Thread Context is managed on a per thread basis. - - - Example of using the thread context properties to store a username. - - ThreadContext.Properties["user"] = userName; - log.Info("This log message has a ThreadContext Property called 'user'"); - - - Example of how to push a message into the context stack - - using(ThreadContext.Stacks["NDC"].Push("my context message")) - { - log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); - - } // at the end of the using block the message is automatically popped - - - - Nicko Cadell - - - - Private Constructor. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - The thread context properties instance - - - - - The thread context stacks instance - - - - - The thread properties map - - - The thread properties map - - - - The ThreadContext properties override any - properties with the same name. - - - - - - The thread stacks - - - stack map - - - - The thread local stacks. - - - - - diff --git a/src/External-Bin/Net/2.0/readme.txt b/src/External-Bin/Net/2.0/readme.txt deleted file mode 100644 index 7018c3b..0000000 --- a/src/External-Bin/Net/2.0/readme.txt +++ /dev/null @@ -1,8 +0,0 @@ - -Log4NET 1.2.9.0 -=================== -log4net.dll - -Castle dynamic proxy 1.1.5.0 -============================ -Castle.DynamicProxy.dll \ No newline at end of file diff --git a/src/External-Bin/Net/4.0/Castle.Core.dll b/src/External-Bin/Net/4.0/Castle.Core.dll deleted file mode 100644 index 5e22081736ee18ddba3a914d4a081028e7f77e43..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 299520 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 z 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 z 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 VSG(cNDEjJ_|FWk2kF#|Q{NIJ?>j3}& diff --git a/src/External-Bin/Net/4.0/Castle.Core.xml b/src/External-Bin/Net/4.0/Castle.Core.xml deleted file mode 100644 index 41a9594..0000000 --- a/src/External-Bin/Net/4.0/Castle.Core.xml +++ /dev/null @@ -1,4820 +0,0 @@ - - - - Castle.Core - - - - - Specifies assignment by reference rather than by copying. - - - - - Suppresses any on-demand behaviors. - - - - - Removes a property if null or empty string, guid or collection. - - - - - Removes a property if matches value. - - - - - Assigns a specific dictionary key. - - - - - Defines the contract for customizing dictionary access. - - - - - Copies the dictionary behavior. - - null if should not be copied. Otherwise copy. - - - - Determines relative order to apply related behaviors. - - - - - Defines the contract for updating dictionary values. - - - - - Sets the stored dictionary value. - - The dictionary adapter. - The key. - The stored value. - The property. - true if the property should be stored. - - - - Contract for value matching. - - - - - Indicates that underlying values are changeable and should not be cached. - - - - - Contract for dictionary initialization. - - - - - Performs any initialization of the - - The dictionary adapter. - The dictionary behaviors. - - - - Abstract implementation of . - - - - - Conract for traversing a . - - - - - Contract for creating additional Dictionary adapters. - - - - - Contract for manipulating the Dictionary adapter. - - - - - Contract for editing the Dictionary adapter. - - - - - Contract for managing Dictionary adapter notifications. - - - - - Contract for validating Dictionary adapter. - - - - - Defines the contract for building s. - - - - - Builds the dictionary behaviors. - - - - - - Abstract adapter for the support - needed by the - - - - - Adds an element with the provided key and value to the object. - - The to use as the key of the element to add. - The to use as the value of the element to add. - An element with the same key already exists in the object. - key is null. - The is read-only.-or- The has a fixed size. - - - - Removes all elements from the object. - - The object is read-only. - - - - Determines whether the object contains an element with the specified key. - - The key to locate in the object. - - true if the contains an element with the key; otherwise, false. - - key is null. - - - - Returns an object for the object. - - - An object for the object. - - - - - Removes the element with the specified key from the object. - - The key of the element to remove. - The object is read-only.-or- The has a fixed size. - key is null. - - - - Copies the elements of the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in array at which copying begins. - array is null. - The type of the source cannot be cast automatically to the type of the destination array. - index is less than zero. - array is multidimensional.-or- index is equal to or greater than the length of array.-or- The number of elements in the source is greater than the available space from index to the end of the destination array. - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - - - - Gets a value indicating whether the object has a fixed size. - - - true if the object has a fixed size; otherwise, false. - - - - Gets a value indicating whether the object is read-only. - - - true if the object is read-only; otherwise, false. - - - - Gets an object containing the keys of the object. - - - An object containing the keys of the object. - - - - Gets an object containing the values in the object. - - - An object containing the values in the object. - - - - Gets or sets the with the specified key. - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - Gets a value indicating whether access to the is synchronized (thread safe). - - - true if access to the is synchronized (thread safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - Provides a generic collection that supports data binding. - - - This class wraps the CLR - in order to implement the Castle-specific . - - The type of elements in the list. - - - - Initializes a new instance of the class - using default values. - - - - - Initializes a new instance of the class - with the specified list. - - - An of items - to be contained in the . - - - - - Initializes a new instance of the class - wrapping the specified instance. - - - A - to be wrapped by the . - - - - - Defines the contract for retrieving dictionary values. - - - - - Gets the effective dictionary value. - - The dictionary adapter. - The key. - The stored value. - The property. - true if return only existing. - The effective property value. - - - - Initializes a new instance of the class - that represents a child object in a larger object graph. - - - - - - - Contract for dictionary meta-data initialization. - - - - - Performs any initialization of the dictionary adapter meta-data. - - The dictionary adapter factory. - The dictionary adapter meta. - - - - - Checks whether or not collection is null or empty. Assumes colleciton can be safely enumerated multiple times. - - - - - - - Constant to use when making assembly internals visible to Castle.Core - [assembly: InternalsVisibleTo(CoreInternalsVisible.ToCastleCore)] - - - - - Constant to use when making assembly internals visible to proxy types generated by DynamicProxy. Required when proxying internal types. - [assembly: InternalsVisibleTo(CoreInternalsVisible.ToDynamicProxyGenAssembly2)] - - - - - Identifies a property should be represented as a nested component. - - - - - Defines the contract for building typed dictionary keys. - - - - - Builds the specified key. - - The dictionary adapter. - The current key. - The property. - The updated key - - - - Applies no prefix. - - - - - Gets or sets the prefix. - - The prefix. - - - - Identifies the dictionary adapter types. - - - - - Identifies an interface or property to be pre-fetched. - - - - - Instructs fetching to occur. - - - - - Instructs fetching according to - - - - - - Gets whether or not fetching should occur. - - - - - Assigns a property to a group. - - - - - Constructs a group assignment. - - The group name. - - - - Constructs a group assignment. - - The group name. - - - - Gets the group the property is assigned to. - - - - - Assigns a specific dictionary key. - - - - - Initializes a new instance of the class. - - The key. - - - - Initializes a new instance of the class. - - The compound key. - - - - Assigns a prefix to the keyed properties of an interface. - - - - - Initializes a default instance of the class. - - - - - Initializes a new instance of the class. - - The prefix for the keyed properties of the interface. - - - - Gets the prefix key added to the properties of the interface. - - - - - Substitutes part of key with another string. - - - - - Initializes a new instance of the class. - - The old value. - The new value. - - - - Requests support for multi-level editing. - - - - - Generates a new GUID on demand. - - - - - Support for on-demand value resolution. - - - - - Suppress property change notifications. - - - - - Provides simple string formatting from existing properties. - - - - - Gets the string format. - - - - - Gets the format properties. - - - - - Identifies a property should be represented as a delimited string value. - - - - - Gets the separator. - - - - - Converts all properties to strings. - - - - - Gets or sets the format. - - The format. - - - - Suppress property change notifications. - - - - - Contract for property descriptor initialization. - - - - - Performs any initialization of the - - The property descriptor. - The property behaviors. - - - - Assigns a prefix to the keyed properties using the interface name. - - - - - Manages conversion between property values. - - - - - Initializes a new instance of the class. - - The converter. - - - - Gets the effective dictionary value. - - The dictionary adapter. - The key. - The stored value. - The property. - true if return only existing. - The effective property value. - - - - - - - - - Uses Reflection.Emit to expose the properties of a dictionary - through a dynamic implementation of a typed interface. - - - - - Defines the contract for building typed dictionary adapters. - - - - - Gets a typed adapter bound to the . - - The typed interface. - The underlying source of properties. - An implementation of the typed interface bound to the dictionary. - - The type represented by T must be an interface with properties. - - - - - Gets a typed adapter bound to the . - - The typed interface. - The underlying source of properties. - An implementation of the typed interface bound to the dictionary. - - The type represented by T must be an interface with properties. - - - - - Gets a typed adapter bound to the . - - The typed interface. - The underlying source of properties. - The property descriptor. - An implementation of the typed interface bound to the dictionary. - - The type represented by T must be an interface with properties. - - - - - Gets a typed adapter bound to the . - - The typed interface. - The underlying source of properties. - An implementation of the typed interface bound to the namedValues. - - The type represented by T must be an interface with properties. - - - - - Gets a typed adapter bound to the . - - The typed interface. - The underlying source of properties. - An implementation of the typed interface bound to the namedValues. - - The type represented by T must be an interface with properties. - - - - - Gets a typed adapter bound to the . - - The typed interface. - The underlying source of properties. - An implementation of the typed interface bound to the . - - The type represented by T must be an interface with properties. - - - - - Gets a typed adapter bound to the . - - The typed interface. - The underlying source of properties. - An implementation of the typed interface bound to the . - - The type represented by T must be an interface with properties. - - - - - Gets the associated with the type. - - The typed interface. - The adapter meta-data. - - - - Gets the associated with the type. - - The typed interface. - The property descriptor. - The adapter meta-data. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Describes a dictionary property. - - - - - Initializes an empty class. - - - - - Initializes a new instance of the class. - - The property. - The property behaviors. - - - - Initializes a new instance class. - - - - - Copies an existinginstance of the class. - - - - - - - Gets the key. - - The dictionary adapter. - The key. - The descriptor. - - - - - Adds the key builder. - - The builder. - - - - Adds the key builders. - - The builders. - - - - Copies the key builders to the other - - - - - - - Gets the property value. - - The dictionary adapter. - The key. - The stored value. - The descriptor. - true if return only existing. - - - - - Adds the dictionary getter. - - The getter. - - - - Adds the dictionary getters. - - The getters. - - - - Copies the property getters to the other - - - - - - - Sets the property value. - - The dictionary adapter. - The key. - The value. - The descriptor. - - - - - Adds the dictionary setter. - - The setter. - - - - Adds the dictionary setters. - - The setters. - - - - Copies the property setters to the other - - - - - - - Adds the behaviors. - - - - - - - Adds the behaviors. - - - - - - - Adds the behaviors from the builders. - - - - - - - Copies the behaviors to the other - - - - - - - Copies the - - - - - - - - - - - Gets the property name. - - - - - Gets the property type. - - - - - Gets the property. - - The property. - - - - Returns true if the property is dynamic. - - - - - Gets additional state. - - - - - Determines if property should be fetched. - - - - - Determines if property must exist first. - - - - - Determines if notifications should occur. - - - - - Gets the property behaviors. - - - - - Gets the type converter. - - The type converter. - - - - Gets the extended properties. - - - - - Gets the key builders. - - The key builders. - - - - Gets the setter. - - The setter. - - - - Gets the getter. - - The getter. - - - - Adds the dictionary initializers. - - The initializers. - - - - Adds the dictionary initializers. - - The initializers. - - - - Copies the initializers to the other - - - - - - - Adds the dictionary meta-data initializers. - - The meta-data initializers. - - - - Adds the dictionary meta-data initializers. - - The meta-data initializers. - - - - Copies the meta-initializers to the other - - - - - - - Gets the initializers. - - The initializers. - - - - Gets the meta-data initializers. - - The meta-data initializers. - - - - Contract for dictionary validation. - - - - - Determines if is valid. - - The dictionary adapter. - true if valid. - - - - Validates the . - - The dictionary adapter. - The error summary information. - - - - Validates the for a property. - - The dictionary adapter. - The property to validate. - The property summary information. - - - - Invalidates any results cached by the validator. - - The dictionary adapter. - - - - - - - - - Initializes a new instance of the class. - - The name values. - - - - Determines whether the object contains an element with the specified key. - - The key to locate in the object. - - true if the contains an element with the key; otherwise, false. - - key is null. - - - - Adapts the specified name values. - - The name values. - - - - - Gets a value indicating whether the object is read-only. - - - true if the object is read-only; otherwise, false. - - - - Gets or sets the with the specified key. - - - - - - Helper class for retrieving attributes. - - - - - Gets the attribute. - - The member. - The member attribute. - - - - Gets the attributes. Does not consider inherited attributes! - - The member. - The member attributes. - - - - Gets the type attribute. - - The type. - The type attribute. - - - - Gets the type attributes. - - The type. - The type attributes. - - - - Gets the type converter. - - The member. - - - - - Gets the attribute. - - The member. - The member attribute. - - - - Contract for typed dynamic value resolution. - - - - - - Contract for dynamic value resolution. - - - - - Supporting Logger levels. - - - - - Logging will be off - - - - - Fatal logging level - - - - - Error logging level - - - - - Warn logging level - - - - - Info logging level - - - - - Debug logging level - - - - - Encapsulates an invocation of a proxied method. - - - - - Gets the value of the argument at the specified . - - The index. - The value of the argument at the specified . - - - - Returns the concrete instantiation of the on the proxy, with any generic - parameters bound to real types. - - - The concrete instantiation of the on the proxy, or the if - not a generic method. - - - Can be slower than calling . - - - - - Returns the concrete instantiation of , with any - generic parameters bound to real types. - For interface proxies, this will point to the on the target class. - - The concrete instantiation of , or - if not a generic method. - - In debug builds this can be slower than calling . - - - - - Proceeds the call to the next interceptor in line, and ultimately to the target method. - - - Since interface proxies without a target don't have the target implementation to proceed to, - it is important, that the last interceptor does not call this method, otherwise a - will be thrown. - - - - - Overrides the value of an argument at the given with the - new provided. - - - This method accepts an , however the value provided must be compatible - with the type of the argument defined on the method, otherwise an exception will be thrown. - - The index of the argument to override. - The new value for the argument. - - - - Gets the arguments that the has been invoked with. - - The arguments the method was invoked with. - - - - Gets the generic arguments of the method. - - The generic arguments, or null if not a generic method. - - - - Gets the object on which the invocation is performed. This is different from proxy object - because most of the time this will be the proxy target object. - - - The invocation target. - - - - Gets the representing the method being invoked on the proxy. - - The representing the method being invoked. - - - - For interface proxies, this will point to the on the target class. - - The method invocation target. - - - - Gets the proxy object on which the intercepted method is invoked. - - Proxy object on which the intercepted method is invoked. - - - - Gets or sets the return value of the method. - - The return value of the method. - - - - Gets the type of the target object for the intercepted method. - - The type of the target object. - - - - Used during the target type inspection process. Implementors have a chance to customize the - proxy generation process. - - - - - Invoked by the generation process to notify that the whole process has completed. - - - - - Invoked by the generation process to notify that a member was not marked as virtual. - - The type which declares the non-virtual member. - The non-virtual member. - - This method gives an opportunity to inspect any non-proxyable member of a type that has - been requested to be proxied, and if appropriate - throw an exception to notify the caller. - - - - - Invoked by the generation process to determine if the specified method should be proxied. - - The type which declares the given method. - The method to inspect. - True if the given method should be proxied; false otherwise. - - - - Interface describing elements composing generated type - - - - - Performs some basic screening and invokes the - to select methods. - - - - - - - - - Provides functionality for disassembling instances of attributes to CustomAttributeBuilder form, during the process of emiting new types by Dynamic Proxy. - - - - - Disassembles given attribute instance back to corresponding CustomAttributeBuilder. - - An instance of attribute to disassemble - corresponding 1 to 1 to given attribute instance, or null reference. - - Implementers should return that corresponds to given attribute instance 1 to 1, - that is after calling specified constructor with specified arguments, and setting specified properties and fields with values specified - we should be able to get an attribute instance identical to the one passed in . Implementer can return null - if it wishes to opt out of replicating the attribute. Notice however, that for some cases, like attributes passed explicitly by the user - it is illegal to return null, and doing so will result in exception. - - - - - Handles error during disassembly process - - Type of the attribute being disassembled - Exception thrown during the process - usually null, or (re)throws the exception - - - - Here we try to match a constructor argument to its value. - Since we can't get the values from the assembly, we use some heuristics to get it. - a/ we first try to match all the properties on the attributes by name (case insensitive) to the argument - b/ if we fail we try to match them by property type, with some smarts about convertions (i,e: can use Guid for string). - - - - - We have the following rules here. - Try to find a matching type, failing that, if the parameter is string, get the first property (under the assumption that - we can convert it. - - - - - Attributes can only accept simple types, so we return null for null, - if the value is passed as string we call to string (should help with converting), - otherwise, we use the value as is (enums, integer, etc). - - - - - Applied to the assemblies saved by in order to persist the cache data included in the persisted assembly. - - - - - Base class that exposes the common functionalities - to proxy generation. - - - - - It is safe to add mapping (no mapping for the interface exists) - - - - - - - - Generates a parameters constructor that initializes the proxy - state with just to make it non-null. - - This constructor is important to allow proxies to be XML serializable - - - - - - Generates the constructor for the class that extends - - - - - - - - - Default implementation of interface producing in-memory proxy assemblies. - - - - - Abstracts the implementation of proxy type construction. - - - - - Creates a proxy type for given , implementing , using provided. - - The class type to proxy. - Additional interface types to proxy. - The proxy generation options. - The generated proxy type. - - Implementers should return a proxy type for the specified class and interfaces. - Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See method.) - - Thrown when or any of is a generic type definition. - Thrown when or any of is not public. - Note that to avoid this exception, you can mark offending type internal, and define - pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. - - - - - Creates a proxy type that proxies calls to members on , implementing , using provided. - - The interface type to proxy. - Additional interface types to proxy. - Type implementing on which calls to the interface members should be intercepted. - The proxy generation options. - The generated proxy type. - - Implementers should return a proxy type for the specified interface that 'proceeds' executions to the specified target. - Additional interfaces should be only 'mark' interfaces, that is, they should work like interface proxy without target. (See method.) - - Thrown when or any of is a generic type definition. - Thrown when or any of is not public. - Note that to avoid this exception, you can mark offending type internal, and define - pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. - - - - - Creates a proxy type for given and that delegates all calls to the provided interceptors and allows interceptors to switch the actual target of invocation. - - The interface type to proxy. - Additional interface types to proxy. - The proxy generation options. - The generated proxy type. - - Implementers should return a proxy type for the specified interface(s) that delegate all executions to the specified interceptors - and uses an instance of the interface as their targets (i.e. ), rather than a class. All classes should then implement interface, - to allow interceptors to switch invocation target with instance of another type implementing called interface. - - Thrown when or any of is a generic type definition. - Thrown when or any of is not public. - Note that to avoid this exception, you can mark offending type internal, and define - pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. - - - - - Creates a proxy type for given that delegates all calls to the provided interceptors. - - The interface type to proxy. - Additional interface types to proxy. - The proxy generation options. - The generated proxy type. - - Implementers should return a proxy type for the specified interface and additional interfaces that delegate all executions to the specified interceptors. - - Thrown when or any of is a generic type definition. - Thrown when or any of is not public. - Note that to avoid this exception, you can mark offending type internal, and define - pointing to Castle Dynamic Proxy assembly, in assembly containing that type, if this is appropriate. - - - - - Gets or sets the that this logs to. - - - - - Gets the associated with this builder. - - The module scope associated with this builder. - - - - Initializes a new instance of the class with new . - - - - - Initializes a new instance of the class. - - The module scope for generated proxy types. - - - - Registers custom disassembler to handle disassembly of specified type of attributes. - - Type of attributes to handle - Disassembler converting existing instances of Attributes to CustomAttributeBuilders - - When disassembling an attribute Dynamic Proxy will first check if an custom disassembler has been registered to handle attributes of that type, - and if none is found, it'll use the . - - - - - Attributes should be replicated if they are non-inheritable, - but there are some special cases where the attributes means - something to the CLR, where they should be skipped. - - - - - Initializes a new instance of the class. - - Target element. This is either target type or target method for invocation types. - The type of the proxy. This is base type for invocation types. - The interfaces. - The options. - - - - Initializes a new instance of the class. - - Type of the target. - The interfaces. - The options. - - - - s - Provides appropriate Ldc.X opcode for the type of primitive value to be loaded. - - - - - Provides appropriate Ldind.X opcode for - the type of primitive value to be loaded indirectly. - - - - - Emits a load indirect opcode of the appropriate type for a value or object reference. - Pops a pointer off the evaluation stack, dereferences it and loads - a value of the specified type. - - - - - - - Emits a load opcode of the appropriate kind for a constant string or - primitive value. - - - - - - - Emits a load opcode of the appropriate kind for the constant default value of a - type, such as 0 for value types and null for reference types. - - - - - Emits a store indirectopcode of the appropriate type for a value or object reference. - Pops a value of the specified type and a pointer off the evaluation stack, and - stores the value. - - - - - - - Summary description for PropertiesCollection. - - - - - Wraps a reference that is passed - ByRef and provides indirect load/store support. - - - - - Summary description for NewArrayExpression. - - - - - - - - - Provides appropriate Stind.X opcode - for the type of primitive value to be stored indirectly. - - - - - Returns list of all unique interfaces implemented given types, including their base interfaces. - - - - - - - Initializes a new instance of the class. - - The name. - Type declaring the original event being overriten, or null. - - The add method. - The remove method. - The attributes. - - - - Represents the scope of uniquenes of names for types and their members - - - - - Gets a unique name based on - - Name suggested by the caller - Unique name based on . - - Implementers should provide name as closely resembling as possible. - Generally if no collision occurs it is suggested to return suggested name, otherwise append sequential suffix. - Implementers must return deterministic names, that is when is called twice - with the same suggested name, the same returned name should be provided each time. Non-deterministic return - values, like appending random suffices will break serialization of proxies. - - - - - Returns new, disposable naming scope. It is responsibilty of the caller to make sure that no naming collision - with enclosing scope, or other subscopes is possible. - - New naming scope. - - - - Returns the methods implemented by a type. Use this instead of Type.GetMethods() to work around a CLR issue - where duplicate MethodInfos are returned by Type.GetMethods() after a token of a generic type's method was loaded. - - - - - Determines whether the specified method is internal. - - The method. - - true if the specified method is internal; otherwise, false. - - - - - Determines whether this assembly has internals visible to dynamic proxy. - - The assembly to inspect. - - - - Checks if the method is public or protected. - - - - - - - Because we need to cache the types based on the mixed in mixins, we do the following here: - - Get all the mixin interfaces - - Sort them by full name - - Return them by position - - The idea is to have reproducible behavior for the case that mixins are registered in different orders. - This method is here because it is required - - - - - Summary description for ModuleScope. - - - - - The default file name used when the assembly is saved using . - - - - - The default assembly (simple) name used for the assemblies generated by a instance. - - - - - Initializes a new instance of the class; assemblies created by this instance will not be saved. - - - - - Initializes a new instance of the class, allowing to specify whether the assemblies generated by this instance - should be saved. - - If set to true saves the generated module. - - - - Initializes a new instance of the class, allowing to specify whether the assemblies generated by this instance - should be saved. - - If set to true saves the generated module. - If set to true disables ability to generate signed module. This should be used in cases where ran under constrained permissions. - - - - Initializes a new instance of the class, allowing to specify whether the assemblies generated by this instance - should be saved and what simple names are to be assigned to them. - - If set to true saves the generated module. - If set to true disables ability to generate signed module. This should be used in cases where ran under constrained permissions. - The simple name of the strong-named assembly generated by this . - The path and file name of the manifest module of the strong-named assembly generated by this . - The simple name of the weak-named assembly generated by this . - The path and file name of the manifest module of the weak-named assembly generated by this . - - - - Initializes a new instance of the class, allowing to specify whether the assemblies generated by this instance - should be saved and what simple names are to be assigned to them. - - If set to true saves the generated module. - If set to true disables ability to generate signed module. This should be used in cases where ran under constrained permissions. - Naming scope used to provide unique names to generated types and their members (usually via sub-scopes). - The simple name of the strong-named assembly generated by this . - The path and file name of the manifest module of the strong-named assembly generated by this . - The simple name of the weak-named assembly generated by this . - The path and file name of the manifest module of the weak-named assembly generated by this . - - - - Returns a type from this scope's type cache, or null if the key cannot be found. - - The key to be looked up in the cache. - The type from this scope's type cache matching the key, or null if the key cannot be found - - - - Registers a type in this scope's type cache. - - The key to be associated with the type. - The type to be stored in the cache. - - - - Gets the key pair used to sign the strong-named assembly generated by this . - - - - - - Gets the specified module generated by this scope, creating a new one if none has yet been generated. - - If set to true, a strong-named module is returned; otherwise, a weak-named module is returned. - A strong-named or weak-named module generated by this scope, as specified by the parameter. - - - - Gets the strong-named module generated by this scope, creating a new one if none has yet been generated. - - A strong-named module generated by this scope. - - - - Gets the weak-named module generated by this scope, creating a new one if none has yet been generated. - - A weak-named module generated by this scope. - - - - Saves the generated assembly with the name and directory information given when this instance was created (or with - the and current directory if none was given). - - - - This method stores the generated assembly in the directory passed as part of the module information specified when this instance was - constructed (if any, else the current directory is used). If both a strong-named and a weak-named assembly - have been generated, it will throw an exception; in this case, use the overload. - - - If this was created without indicating that the assembly should be saved, this method does nothing. - - - Both a strong-named and a weak-named assembly have been generated. - The path of the generated assembly file, or null if no file has been generated. - - - - Saves the specified generated assembly with the name and directory information given when this instance was created - (or with the and current directory if none was given). - - True if the generated assembly with a strong name should be saved (see ); - false if the generated assembly without a strong name should be saved (see . - - - This method stores the specified generated assembly in the directory passed as part of the module information specified when this instance was - constructed (if any, else the current directory is used). - - - If this was created without indicating that the assembly should be saved, this method does nothing. - - - No assembly has been generated that matches the parameter. - - The path of the generated assembly file, or null if no file has been generated. - - - - Loads the generated types from the given assembly into this 's cache. - - The assembly to load types from. This assembly must have been saved via or - , or it must have the manually applied. - - This method can be used to load previously generated and persisted proxy types from disk into this scope's type cache, eg. in order - to avoid the performance hit associated with proxy generation. - - - - - Users of this should use this lock when accessing the cache. - - - - - Gets the strong-named module generated by this scope, or if none has yet been generated. - - The strong-named module generated by this scope, or if none has yet been generated. - - - - Gets the file name of the strongly named module generated by this scope. - - The file name of the strongly named module generated by this scope. - - - - Gets the directory where the strongly named module generated by this scope will be saved, or if the current directory - is used. - - The directory where the strongly named module generated by this scope will be saved when is called - (if this scope was created to save modules). - - - - Gets the weak-named module generated by this scope, or if none has yet been generated. - - The weak-named module generated by this scope, or if none has yet been generated. - - - - Gets the file name of the weakly named module generated by this scope. - - The file name of the weakly named module generated by this scope. - - - - Gets the directory where the weakly named module generated by this scope will be saved, or if the current directory - is used. - - The directory where the weakly named module generated by this scope will be saved when is called - (if this scope was created to save modules). - - - - ProxyBuilder that persists the generated type. - - - The saved assembly contains just the last generated type. - - - - - Initializes a new instance of the class. - - - - - Saves the generated assembly to a physical file. Note that this renders the unusable. - - The path of the generated assembly file, or null if no assembly has been generated. - - This method does not support saving multiple files. If both a signed and an unsigned module have been generated, use the - respective methods of the . - - - - - Initializes a new instance of the class. - - The hook. - - - - Initializes a new instance of the class. - - - - - Provides proxy objects for classes and interfaces. - - - - - Initializes a new instance of the class. - - Proxy types builder. - - - - Initializes a new instance of the class. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The interceptors called during the invocation of proxied methods. - Object proxying calls to members of on object. - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is not an interface type. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target - use method. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of on object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is not an interface type. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target - use method. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target - use method. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target - use method. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - Additional interface types. Calls to their members will be proxied as well. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of and types on object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target - use method. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - Additional interface types. Calls to their members will be proxied as well. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of and types on object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method generates new proxy type for each type of , which affects performance. If you don't want to proxy types differently depending on the type of the target - use method. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - Interceptors can use interface to provide other target for method invocation than default . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - Interceptors can use interface to provide other target for method invocation than default . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is not an interface type. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - Interceptors can use interface to provide other target for method invocation than default . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is not an interface type. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - Interceptors can use interface to provide other target for method invocation than default . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - Additional interface types. Calls to their members will be proxied as well. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of and types on object or alternative implementation swapped at runtime by an interceptor. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - Interceptors can use interface to provide other target for method invocation than default . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on object or alternative implementation swapped at runtime by an interceptor. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on object with given . - Interceptors can use interface to provide other target for method invocation than default . - - Type of the interface implemented by which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - Additional interface types. Calls to their members will be proxied as well. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of and types on object or alternative implementation swapped at runtime by an interceptor. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not an interface type. - Thrown when given does not implement interface. - Thrown when no default constructor exists on actual type of object. - Thrown when default constructor of actual type of throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of types on generated target object. - - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is not an interface type. - - Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - As a result of that also at least one implementation must be provided. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of types on generated target object. - - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is not an interface type. - - Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - As a result of that also at least one implementation must be provided. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of types on generated target object. - - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is not an interface type. - - Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - As a result of that also at least one implementation must be provided. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on generated target object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not an interface type. - - Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of type on generated target object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not an interface type. - - Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - Additional interface types. Calls to their members will be proxied as well. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of and types on generated target object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not an interface type. - - Since this method uses an empty-shell implementation of interfaces to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of on generated target object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not an interface type. - - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to members of interface on target object generated at runtime with given . - - Type of the interface which will be proxied. - The proxy generation options used to influence generated proxy type and object. - Additional interface types. Calls to their members will be proxied as well. - The interceptors called during the invocation of proxied methods. - - Object proxying calls to members of and types on generated target object. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given array is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not an interface type. - - Since this method uses an empty-shell implementation of to proxy generated at runtime, the actual implementation of proxied methods must be provided by given implementations. - They are responsible for setting return value (and out parameters) on proxied methods. It is also illegal for an interceptor to call , since there's no actual implementation to proceed with. - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The target object, calls to which will be intercepted. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - Additional interface types. Calls to their members will be proxied as well. - The target object, calls to which will be intercepted. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of and types. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - Arguments of constructor of type which should be used to create a new instance of that type. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no constructor exists on type with parameters matching . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The target object, calls to which will be intercepted. - Arguments of constructor of type which should be used to create a new instance of that type. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no constructor exists on type with parameters matching . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The target object, calls to which will be intercepted. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no parameterless constructor exists on type . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - Additional interface types. Calls to their members will be proxied as well. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of and types. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - Additional interface types. Calls to their members will be proxied as well. - The target object, calls to which will be intercepted. - The proxy generation options used to influence generated proxy type and object. - Arguments of constructor of type which should be used to create a new instance of that type. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of and types. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not a class type. - Thrown when no constructor exists on type with parameters matching . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - Additional interface types. Calls to their members will be proxied as well. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of and types. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The proxy generation options used to influence generated proxy type and object. - Arguments of constructor of type which should be used to create a new instance of that type. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no constructor exists on type with parameters matching . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - Arguments of constructor of type which should be used to create a new instance of that type. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no constructor exists on type with parameters matching . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no parameterless constructor exists on type . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of type. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given is a generic type definition. - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - Additional interface types. Calls to their members will be proxied as well. - The proxy generation options used to influence generated proxy type and object. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of and types. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not a class type. - Thrown when no default constructor exists on type . - Thrown when default constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates proxy object intercepting calls to virtual members of type on newly created instance of that type with given . - - Type of class which will be proxied. - Additional interface types. Calls to their members will be proxied as well. - The proxy generation options used to influence generated proxy type and object. - Arguments of constructor of type which should be used to create a new instance of that type. - The interceptors called during the invocation of proxied methods. - - New object of type proxying calls to virtual members of and types. - - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given object is a null reference (Nothing in Visual Basic). - Thrown when given or any of is a generic type definition. - Thrown when given is not a class type. - Thrown when no constructor exists on type with parameters matching . - Thrown when constructor of type throws an exception. - - This method uses implementation to generate a proxy type. - As such caller should expect any type of exception that given implementation may throw. - - - - - Creates the proxy type for class proxy with given class, implementing given and using provided . - - The base class for proxy type. - The interfaces that proxy type should implement. - The options for proxy generation process. - of proxy. - - - - Creates the proxy type for interface proxy with target for given interface, implementing given on given and using provided . - - The interface proxy type should implement. - The additional interfaces proxy type should implement. - Actual type that the proxy type will encompass. - The options for proxy generation process. - of proxy. - - - - Creates the proxy type for interface proxy with target interface for given interface, implementing given on given and using provided . - - The interface proxy type should implement. - The additional interfaces proxy type should implement. - The options for proxy generation process. - of proxy. - - - - Creates the proxy type for interface proxy without target for given interface, implementing given and using provided . - - The interface proxy type should implement. - The additional interfaces proxy type should implement. - The options for proxy generation process. - of proxy. - - - - Gets or sets the that this log to. - - - - - Gets the proxy builder instance used to generate proxy types. - - The proxy builder. - - - - - - - - - - - - - For interface proxies, this will point to the - on the target class - - - - - Handles the deserialization of proxies. - - - - - Resets the used for deserialization to a new scope. - - - This is useful for test cases. - - - - - Resets the used for deserialization to a given . - - The scope to be used for deserialization. - - By default, the deserialization process uses a different scope than the rest of the application, which can lead to multiple proxies - being generated for the same type. By explicitly setting the deserialization scope to the application's scope, this can be avoided. - - - - - Gets the used for deserialization. - - As has no way of automatically determining the scope used by the application (and the application - might use more than one scope at the same time), uses a dedicated scope instance for deserializing proxy - types. This instance can be reset and set to a specific value via and . - - - - Holds objects representing methods of class. - - - - - Holds objects representing methods of class. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Provides an extension point that allows proxies to choose specific interceptors on - a per method basis. - - - - - Selects the interceptors that should intercept calls to the given . - - The type declaring the method to intercept. - The method that will be intercepted. - All interceptors registered with the proxy. - An array of interceptors to invoke upon calling the . - - This method is called only once per proxy instance, upon the first call to the - . Either an empty array or null are valid return values to indicate - that no interceptor should intercept calls to the method. Although it is not advised, it is - legal to return other implementations than these provided in - . - - - - - Creates a new lock. - - - - - - This interface should be implemented by classes - that are available in a bigger context, exposing - the container to different areas in the same application. - - For example, in Web application, the (global) HttpApplication - subclasses should implement this interface to expose - the configured container - - - - - - Exposes means to change target objects of proxies and invocations - - - - - Changes the target object () of current . - - The new value of target of invocation. - - Although the method takes the actual instance must be of type assignable to , otherwise an will be thrown. - Also while it's technically legal to pass null reference (Nothing in Visual Basic) as , for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target. - In this case last interceptor in the pipeline mustn't call or a will be throws. - Also while it's technically legal to pass proxy itself as , this would create stack overflow. - In this case last interceptor in the pipeline mustn't call or a will be throws. - - Thrown when is not assignable to the proxied type. - - - - Permanently changes the target object of the proxy. This does not affect target of the current invocation. - - The new value of target of the proxy. - - Although the method takes the actual instance must be of type assignable to proxy's target type, otherwise an will be thrown. - Also while it's technically legal to pass null reference (Nothing in Visual Basic) as , for obvious reasons Dynamic Proxy will not be able to call the intercepted method on such target. - In this case last interceptor in the pipeline mustn't call or a will be throws. - Also while it's technically legal to pass proxy itself as , this would create stack overflow. - In this case last interceptor in the pipeline mustn't call or a will be throws. - - Thrown when is not assignable to the proxied type. - - - - New interface that is going to be used by DynamicProxy 2 - - - - - Get the proxy target (note that null is a valid target!) - - - - - - Gets the interceptors for the proxy - - - - - - Defines that the implementation wants a - in order to - access other components. The creator must be aware - that the component might (or might not) implement - the interface. - - - Used by Castle Project components to, for example, - gather logging factories - - - - - Increments IServiceProvider with a generic service resolution operation. - - - - - Provides a factory that can produce either or - classes. - - - - - Manages the instantiation of s. - - - - - Creates a new logger, getting the logger name from the specified type. - - - - - Creates a new logger. - - - - - Creates a new logger, getting the logger name from the specified type. - - - - - Creates a new logger. - - - - - Creates a new extended logger, getting the logger name from the specified type. - - - - - Creates a new extended logger. - - - - - Creates a new extended logger, getting the logger name from the specified type. - - - - - Creates a new extended logger. - - - - - Creates a new extended logger, getting the logger name from the specified type. - - - - - Creates a new extended logger. - - - - - Creates a new extended logger, getting the logger name from the specified type. - - - - - Creates a new extended logger. - - - - - Creates a new logger, getting the logger name from the specified type. - - - - - Creates a new logger. - - - - - Creates a new logger, getting the logger name from the specified type. - - - - - Creates a new logger. - - - - - Gets the configuration file. - - i.e. log4net.config - - - - - Used to create the TraceLogger implementation of ILogger interface. See . - - - - - Gets the configuration file. - - i.e. log4net.config - - - - - Interface for Context Properties implementations - - - - This interface defines a basic property get set accessor. - - - Based on the ContextPropertiesBase of log4net, by Nicko Cadell. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Gets or sets the value of a property - - - - - - NullLogFactory used when logging is turned off. - - - - - Creates an instance of ILogger with the specified name. - - Name. - - - - - Creates an instance of ILogger with the specified name and LoggerLevel. - - Name. - Level. - - - - - Creates outputing - to files. The name of the file is derived from the log name - plus the 'log' extension. - - - - - Provides an interface that supports and - allows the storage and retrieval of Contexts. These are supported in - both log4net and NLog. - - - - - Manages logging. - - - This is a facade for the different logging subsystems. - It offers a simplified interface that follows IOC patterns - and a simplified priority/level/severity abstraction. - - - - - Create a new child logger. - The name of the child logger is [current-loggers-name].[passed-in-name] - - The Subname of this logger. - The New ILogger instance. - If the name has an empty element name. - - - - Logs a debug message. - - The message to log - - - - Logs a debug message with lazily constructed message. The message will be constructed only if the is true. - - - - - - Logs a debug message. - - The exception to log - The message to log - - - - Logs a debug message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs a debug message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs a debug message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a debug message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The message to log - - - - Logs an error message with lazily constructed message. The message will be constructed only if the is true. - - - - - - Logs an error message. - - The exception to log - The message to log - - - - Logs an error message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The message to log - - - - Logs a fatal message with lazily constructed message. The message will be constructed only if the is true. - - - - - - Logs a fatal message. - - The exception to log - The message to log - - - - Logs a fatal message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The message to log - - - - Logs a info message with lazily constructed message. The message will be constructed only if the is true. - - - - - - Logs an info message. - - The exception to log - The message to log - - - - Logs an info message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The message to log - - - - Logs a warn message with lazily constructed message. The message will be constructed only if the is true. - - - - - - Logs a warn message. - - The exception to log - The message to log - - - - Logs a warn message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Determines if messages of priority "debug" will be logged. - - True if "debug" messages will be logged. - - - - Determines if messages of priority "error" will be logged. - - True if "error" messages will be logged. - - - - Determines if messages of priority "fatal" will be logged. - - True if "fatal" messages will be logged. - - - - Determines if messages of priority "info" will be logged. - - True if "info" messages will be logged. - - - - Determines if messages of priority "warn" will be logged. - - True if "warn" messages will be logged. - - - - Exposes the Global Context of the extended logger. - - - - - Exposes the Thread Context of the extended logger. - - - - - Exposes the Thread Stack of the extended logger. - - - - - The Logger sending everything to the standard output streams. - This is mainly for the cases when you have a utility that - does not have a logger to supply. - - - - - The Level Filtered Logger class. This is a base clase which - provides a LogLevel attribute and reroutes all functions into - one Log method. - - - - - Creates a new LevelFilteredLogger. - - - - - Keep the instance alive in a remoting scenario - - - - - - Logs a debug message. - - The message to log - - - - Logs a debug message. - - The exception to log - The message to log - - - - Logs a debug message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs a debug message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs a debug message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a debug message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The message to log - - - - Logs an info message. - - The exception to log - The message to log - - - - Logs an info message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an info message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The message to log - - - - Logs a warn message. - - The exception to log - The message to log - - - - Logs a warn message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a warn message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The message to log - - - - Logs an error message. - - The exception to log - The message to log - - - - Logs an error message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs an error message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The message to log - - - - Logs a fatal message. - - The exception to log - The message to log - - - - Logs a fatal message. - - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The exception to log - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Logs a fatal message. - - The exception to log - The format provider to use - Format string for the message to log - Format arguments for the message to log - - - - Implementors output the log content by implementing this method only. - Note that exception can be null - - - - - - - - - The LoggerLevel that this logger - will be using. Defaults to LoggerLevel.Off - - - - - The name that this logger will be using. - Defaults to String.Empty - - - - - Determines if messages of priority "debug" will be logged. - - true if log level flags include the bit - - - - Determines if messages of priority "info" will be logged. - - true if log level flags include the bit - - - - Determines if messages of priority "warn" will be logged. - - true if log level flags include the bit - - - - Determines if messages of priority "error" will be logged. - - true if log level flags include the bit - - - - Determines if messages of priority "fatal" will be logged. - - true if log level flags include the bit - - - - Creates a new ConsoleLogger with the Level - set to LoggerLevel.Debug and the Name - set to String.Empty. - - - - - Creates a new ConsoleLogger with the Name - set to String.Empty. - - The logs Level. - - - - Creates a new ConsoleLogger with the Level - set to LoggerLevel.Debug. - - The logs Name. - - - - Creates a new ConsoleLogger. - - The logs Name. - The logs Level. - - - - A Common method to log. - - The level of logging - The name of the logger - The Message - The Exception - - - - Returns a new ConsoleLogger with the name - added after this loggers name, with a dot in between. - - The added hierarchical name. - A new ConsoleLogger. - - - - The Logger using standart Diagnostics namespace. - - - - - Creates a logger based on . - - - - - - Creates a logger based on . - - - - - - - Creates a logger based on . - - - - - - - - The Null Logger class. This is useful for implementations where you need - to provide a logger to a utility class, but do not want any output from it. - It also helps when you have a utility that does not have a logger to supply. - - - - - Returns this NullLogger. - - Ignored - This ILogger instance. - - - - No-op. - - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - - - - No-op. - - Ignored - Ignored - Ignored - Ignored - - - - Returns empty context properties. - - - - - Returns empty context properties. - - - - - Returns empty context stacks. - - - - - No-op. - - false - - - - No-op. - - false - - - - No-op. - - false - - - - No-op. - - false - - - - No-op. - - false - - - - The Stream Logger class. This class can stream log information - to any stream, it is suitable for storing a log file to disk, - or to a MemoryStream for testing your components. - - - This logger is not thread safe. - - - - - Creates a new StreamLogger with default encoding - and buffer size. Initial Level is set to Debug. - - - The name of the log. - - - The stream that will be used for logging, - seeking while the logger is alive - - - - - Creates a new StreamLogger with default buffer size. - Initial Level is set to Debug. - - - The name of the log. - - - The stream that will be used for logging, - seeking while the logger is alive - - - The encoding that will be used for this stream. - - - - - - Creates a new StreamLogger. - Initial Level is set to Debug. - - - The name of the log. - - - The stream that will be used for logging, - seeking while the logger is alive - - - The encoding that will be used for this stream. - - - - The buffer size that will be used for this stream. - - - - - - Creates a new StreamLogger with - Debug as default Level. - - The name of the log. - The StreamWriter the log will write to. - - - - The TraceLogger sends all logging to the System.Diagnostics.TraceSource - built into the .net framework. - - - Logging can be configured in the system.diagnostics configuration - section. - - If logger doesn't find a source name with a full match it will - use source names which match the namespace partially. For example you can - configure from all castle components by adding a source name with the - name "Castle". - - If no portion of the namespace matches the source named "Default" will - be used. - - - - - Build a new trace logger based on the named TraceSource - - The name used to locate the best TraceSource. In most cases comes from the using type's fullname. - - - - Build a new trace logger based on the named TraceSource - - The name used to locate the best TraceSource. In most cases comes from the using type's fullname. - The default logging level at which this source should write messages. In almost all cases this - default value will be overridden in the config file. - - - - Create a new child logger. - The name of the child logger is [current-loggers-name].[passed-in-name] - - The Subname of this logger. - The New ILogger instance. - - - - This is an abstract implementation - that deals with methods that can be abstracted away - from underlying implementations. - - - AbstractConfiguration makes easier to implementers - to create a new version of - - - - - is a interface encapsulating a configuration node - used to retrieve configuration values. - - - - - Gets the value of the node and converts it - into specified . - - The - - The Default value returned if the conversion fails. - - The Value converted into the specified type. - - - - Gets the name of the node. - - - The Name of the node. - - - - - Gets the value of the node. - - - The Value of the node. - - - - - Gets an of - elements containing all node children. - - The Collection of child nodes. - - - - Gets an of the configuration attributes. - - - - - Gets the value of the node and converts it - into specified . - - The - - The Default value returned if the conversion fails. - - The Value converted into the specified type. - - - - Gets node attributes. - - - All attributes of the node. - - - - - Gets all child nodes. - - The of child nodes. - - - - Gets the name of the . - - - The Name of the . - - - - - Gets the value of . - - - The Value of the . - - - - - A collection of objects. - - - - - Creates a new instance of ConfigurationCollection. - - - - - Creates a new instance of ConfigurationCollection. - - - - - Summary description for MutableConfiguration. - - - - - Initializes a new instance of the class. - - The name. - - - - Gets the value of . - - - The Value of the . - - - - - Deserializes the specified node into an abstract representation of configuration. - - The node. - - - - - If a config value is an empty string we return null, this is to keep - backward compatibility with old code - - - - - General purpose class to represent a standard pair of values. - - Type of the first value - Type of the second value - - - - Constructs a pair with its values - - - - - - - List of utility methods related to dynamic proxy operations - - - - - Determines whether the specified type is a proxy generated by - DynamicProxy (1 or 2). - - The type. - - true if it is a proxy; otherwise, false. - - - - - Readonly implementation of which uses an anonymous object as its source. Uses names of properties as keys, and property values as... well - values. Keys are not case sensitive. - - - - - Initializes a new instance of the class. - - The target. - - - - Adds an element with the provided key and value to the object. - - The to use as the key of the element to add. - The to use as the value of the element to add. - - is null. - An element with the same key already exists in the object. - The is read-only.-or- The has a fixed size. - - - - Removes all elements from the object. - - The object is read-only. - - - - Determines whether the object contains an element with the specified key. - - The key to locate in the object. - - true if the contains an element with the key; otherwise, false. - - - is null. - - - - Removes the element with the specified key from the object. - - The key of the element to remove. - - is null. - The object is read-only.-or- The has a fixed size. - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - - - - Copies the elements of the to an , starting at a particular index. - - The one-dimensional that is the destination of the elements copied from . The must have zero-based indexing. - The zero-based index in at which copying begins. - - is null. - - is less than zero. - - is multidimensional.-or- is equal to or greater than the length of .-or- The number of elements in the source is greater than the available space from to the end of the destination . - The type of the source cannot be cast automatically to the type of the destination . - - - - Returns an object for the object. - - - An object for the object. - - - - - Reads values of properties from and inserts them into using property names as keys. - - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - Gets a value indicating whether access to the is synchronized (thread safe). - - - true if access to the is synchronized (thread safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - Gets a value indicating whether the object is read-only. - - - true if the object is read-only; otherwise, false. - - - - Gets or sets the with the specified key. - - - - - - Gets an object containing the keys of the object. - - - An object containing the keys of the object. - - - - Gets an object containing the values in the object. - - - An object containing the values in the object. - - - - Gets a value indicating whether the object has a fixed size. - - - true if the object has a fixed size; otherwise, false. - - - - Represents a 'streamable' resource. Can - be a file, a resource in an assembly. - - - - - Returns a reader for the stream - - - It's up to the caller to dispose the reader. - - - - - - Returns a reader for the stream - - - It's up to the caller to dispose the reader. - - - - - - - Returns an instance of - created according to the relativePath - using itself as the root. - - - - - - - - - - Only valid for resources that - can be obtained through relative paths - - - - - - - - - - This returns a new stream instance each time it is called. - It is the responsibility of the caller to dispose of this stream - - - - - Depicts the contract for resource factories. - - - - - Used to check whether the resource factory - is able to deal with the given resource - identifier. - - - Implementors should return true - only if the given identifier is supported - by the resource factory - - - - - - - Creates an instance - for the given resource identifier - - - - - - - Creates an instance - for the given resource identifier - - - - - - - - - - - - - - - - - - Adapts a static string content as an - - - - - Enable access to files on network shares - - - - - Email sender abstraction. - - - - - Sends a mail message. - - From field - To field - E-mail's subject - message's body - - - - Sends a message. - - Message instance - - - - Sends multiple messages. - - List of messages - - - - Default implementation. - - - - - Initializes a new instance of the class based on the configuration provided in the application configuration file. - - - This constructor is based on the default configuration in the application configuration file. - - - - - This service implementation - requires a host name in order to work - - The smtp server name - - - - Sends a message. - - If any of the parameters is null - From field - To field - e-mail's subject - message's body - - - - Sends a message. - - If the message is null - Message instance - - - - Configures the sender - with port information and eventual credential - informed - - Message instance - - - - Gets or sets the port used to - access the SMTP server - - - - - Gets the hostname. - - The hostname. - - - - Gets or sets a value which is used to - configure if emails are going to be sent asynchronously or not. - - - - - Gets or sets a value that specifies - the amount of time after which a synchronous Send call times out. - - - - - Gets or sets a value indicating whether the email should be sent using - a secure communication channel. - - true if should use SSL; otherwise, false. - - - - Gets or sets the domain. - - The domain. - - - - Gets or sets the name of the user. - - The name of the user. - - - - Gets or sets the password. - - The password. - - - - Gets a value indicating whether credentials were informed. - - - if this instance has credentials; otherwise, . - - - - diff --git a/src/External-Bin/Net/4.0/Castle.DynamicProxy.dll b/src/External-Bin/Net/4.0/Castle.DynamicProxy.dll deleted file mode 100644 index 001059705240d02ff2bdf803eea21519c247dbf0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 69632 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

    9+0VFPB*7l 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 diff --git a/src/External-Bin/Net/4.0/Castle.Services.Logging.Log4netIntegration.dll b/src/External-Bin/Net/4.0/Castle.Services.Logging.Log4netIntegration.dll deleted file mode 100644 index 46282abd4c99666f7a926f02b6a1011e6fef8c79..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24576 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
    05i2@CxQ6?kyvIC&+x@ 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%0Ab7xahvn`?~19&@)|h z=k;6{-Fbb9i|$K(rHk%M{c{)HSNbIv-B-F_OHL;YPfqv#M(@caQ+8QTW|Dcotlwag zC3soi+=~1i)mJ5t_P(Njz$E=$)hn1}-mmKCq)UxlUeznZ$zL&SPaf}mO)rcflK!si z6PcvH>v}PhjPJU>*2U!weY4V0dEU_9a?#z?-*@qMQ$OXRyQN=r(cRMHTi3+?gC5Bw zWB)-=gYJ}pQJ_b zlfH?m%1-g!)AuN%`0nY)6nPB@L^`90V*gpct*9RAe%2p4{b5?}>y9>*+bTQtMECXj zOtR#E(OXL$zjytM9;t{@_KP#OSQ1mcf7QoY{<7eqK1;e3r29=TXOboOyMCxcP3iuw zpRgzpe%FJeSZ7-|z#sn5qZO57s{havm@37)1H5Zh>-ily)ts_F^)renWq<0?oj4RY zJ;1Nl-}-Kg8q@*U%iL^{(L$0WVE z4msKr1$b!@nG zsVVE)hL(az#f6okFTm^d;)*8YdJzKwVwq9Fr`Udd8-16hkFYTIv~&9yKKx zXy8W$P)8}lFF6=tl5Fp$_(OdoPSHmxfk^pGGL!~JOfT{$ExDm(JzuBHsNK*Q#5$SV zU?Y?1x*%P!u{nYK6~nERg|(X+3B4u#nzEvHb7Q}vfYf!hTN>Xo$xtE;TOUp*3`~8Y zc7%~=QF-mw#>&1@mznx{?Y71Ni{7XmX{05}7{;W&QM;XSjH%Q%FZJEp?Tv3F@hW(G zqgqi}Y9;E@`;kAHzbI$^c$d^7b4}_kTMbQ)_kfN@0sEsj-p|+WXgtp(^U%qtwCDnK zGHzP*ZSBrRgZ`WctcRPmqmBL+ZPB_I3z=x=?x)&ajm=DQ=dPPkAqjWxZr1K*9Jc6T z?HI!=iNdV1)2>N(BSI1Fnshgk6+wt_bT_6dvWM6lJ&ZMyaOck9h&O&!M7t(Eji6)> zQ_#*`PoqFllaP9jp2h)1;pnfIfyX>4cF_UDOfc3f>Kf9>(Z@Kai1twW8W{s+I%y9j z(a2Xsdnk!UktE!?YvxEaHYpwLp(Gj=if9id(TE%*<69dN?&xP6vZ%eIzY&$<)ZNgM zj5CU8=Puc}$|QI0l8w6--PZ;f$*JT|zT-Z~c$`V@+@%;hB=OGOVB;M{v~xGaIH_FH z&Rx23R}t;p4K*BtDa^})cJ785Z4}YYU53#^5$)WKFa{~2ox71nrXt$8%d{-=@ut7J zTf{qeHAFjbnMNV|qdm88YiAl;nP}(kSNANVQWEdnWf}E{P|B_g@|R_VGRd90EF*?V zhLU9rVxpb9o3%$7qb+(^d$ds?iFfX@jWvqM2D6PlipU1DjgyMV2D6PH6_E{&HU5x< zJ53Hpu3<~#`s0>5&InLMRyWRwRzy}e-WaNgtZsslqlm07&nQqtRyWBglEm+^Pd3&o zBCDHhlq;8Hb(4)_N=H^V*|?^NtZuS#Pq`$k%QybEsJ&x~;gwFQrq+MUHr0rbgu861 zj%mgwMH^Ey90kU0NtoM4NNa|&KcG}kH>#Ov9K*AdhGQ6)1b;bcrV*xyP8!ZM+Dj7D zFU>My6j8r4+lXVTw9{#d*+zzXrjaVkxe-;`8nPf>68e^EQ3wp<4zOh^Rvkl&-;qQU)UzOQp zaDiii@gD2Q>O5ePaYFec-6F#_oZ^$^vc!mDs$`vdnm>h`zb9%rHi9-uZ3+5~D;C zzmvAyxS@3Pw*PV?Wu$aT@1&I)dlb<-X{AO$rqt0pX)BB(NnFz_jZI2NCv))kPO_xS zson9dePfIwI+?S|ILCC|PWw(z8h4p0#k#?@;7MciXz6e3U=LVrq>XWgvfi=UC}ye@ z`vlzl5bM*?Z8CQ!X@W$X!Rd zrJFZoi&jJHhWz4q#nSCS+G){SL#iFSEINs_+oJD>=svGnq^IdVuUSNEGp{?zY@GI^ zhLlb9UTpg+?H9-EMvS7LkoFk!6g5e&cKq9@P!xx>*SM=_QM&H4&xjZ+LwOFV!kEY; zXWRRYc@{PE-fvuFs$xri!?>@AYV!>Pa@Yp#R7YD_%kF!m_=1*yuot;l0& zcb^Z9unFX^6he@W86B8pdp~Z)_j~7)nk#M6K623|_!(Fa{|ajP!{y zLK64o|1l<6)Xe)o#sZ55`+RDYSv1_|q;XD?Eq`bsoHp(%dTi(^q-sSk4V~}!%qW}4 zd9b}cG{@&NV~3*mhYm(M$y9|WG`@A5F&ueZNY6MRwS_>ZxTjq1kC}CO#XNIlv`Ob)$LAqt|)v)zG zH;na6#kNivNj^7?lZpl*eQ$WpjrMFD4puV&NyFLb|lk*niJBp@_!!d&X5oG``<6n$E7t?axLO6NR$M@w1U8 z3D3_b_}n+n6_U#mXf)z-onH*U1(G@;JuoU4NlF-z;Pb1oXR)Ldq=$xWiKG!DZr1tD zI8Y>MF6yd{iegF2QTL~jxJ=TT5%=qWnNUVl49|_IuA`YJnbyMo5xTE#My!&$Gb8N2 zhIy5#1g?yz9+PCFz7Bs>3ICj`OG#@g_Roj;4-L;f=>9VCcU>yJmGf9`N&6ewHT(&g>n54_LW)zcj+1C8T#brD5kc-Q9<~gP+pdFlcX2Yi` z%qm4Y|SJ?i88w~$vkv26PRRfJDG~3CiaoOFB zeWoVNI5UDth8brjGRc+8I5S@ntz5>NJ6-(sH1|G2?^qNFJp*)k_l;~)tA-Aboa>umE_4ZHgt^rvl#%9}TPOw@N~ZZdlgv@3d6-GYo@riHM6qX? z4Y$_#8)b$uT^AJlC^K0R#Xj0xsfgB^v(4R#D3r10H6|H*j(OL`Wsd2$P3E0k=9+_; zq|0&UutzA*qCgmDF12Wz`*?G!B-_^`{b7Q6K+*k?_{OGr#BzyW2Q*Jgf}qUBz7x&e z+c|$o%YF0A$`^>%Li@~BzLU&=9WrI~?YDfhL=ry@PB9ND9X$*z7(UzFq=?>#n`7=#L~q2+ zF%L@O`NUlFoYK)OcAj~ciQ)@0=9#uvICdL-X{*o-RzzRgDl{XQs%-Ryi}_}6>Z4$hxz7XineD4B0VDs=zB;D%yOnmIMMPH(g~%bFCZ;6zf^Rl<*U96&07}j z^<8BCX%U_lF&#U(bTQS3eT&T$N&GFZW#&Xh^ewMt=6XdRWEMh+xtoc;j`XT;i3z(X z6r#Pp%gscK0%4`ONfD*`G4mBBs)xhAkC}%pm#_LhVMgz+38l;|wf2l!3v5BR_r1mVuh<-!E$}ywf32rlLY*E-}}Ayd4K%G`JT1bUVH7edpRX{ z8b=j}R(Bkly?3be{v7+BSY<4>xZq^sjxwi4#Z|_~%&iXUeZ#j+RvAAshqIu#U$s@n z1;qu^Y2j+4-cGXlC4bv>wGn4=bauGf$W$E8g=6&9#x=~T-m%&k#hglSwNbzvrT0gZ z)y51f9;LV1n5{TYZ;i3a;^+&UYm6-xN9nCG_A_@v(&_6O<82j&6LP)j8sj62qjI^& zIAw7O@s0F*j0+a$i4SgiuhC!^=SW@=AEDoCL@JKoSh>$gwKzI~ywB)uajqNAHN4Ll zZE=&BE3-He-!AMvW1htY!Tk&n_^zK3X>ltNw$bQhacdE_(dc1u8*Zo;n~Xe*d;ErD;BI72jZ2%2`OLk{{-`KwCR^#6)46T*Inm?)HHIC0fnAhSu z-Ppb9!^RQj)H>u5W71QkseF0Fn8}>-eq*-9(Oty- z#u|$=#u2yO;u?)x8@k^(#GKk!?Kgf?VeqqM_Sln!cJ#Vy9oLD<9J^Te@tQ9u0UsCuh z#%wFBQ|eXVj`+Fk@WV#xer0nyG>;eq6(`pAx(eJXKbIZ;hVhf7xeS`ejE2u}JW(Gu zj~QeATz2@|#(w5jiigIXHr_KXSlljf?;DxVQaq}^Yr~Hl1idxjsAF(5w^$D%pYGK{;_eCIU1MBgFiODwZclqzb8I59M5rjK~!U( z8qJwoEvm=Q3jfsTZE*|7&j&Z&;#Q1b8vdE_J9DZwKj*eI8{Y?8H~#kU&y7(B$fgp5dQ%bYLuBg|3iPeb#h6;Gx9t>UcI|Fk%jx^|HA;IkRVoX=)+=3W-` z;3XFRd$6tj!YaC+kOFY*c8+_I%d!EuG?u_GG<7Ph> zCB8S7F}E=2_3?Oe#n@zVAB_)k{$T94xNpYe`4{6Ii=!U*gYm7!{XYI^_z#BTg+Pve zFv6KrIr_nfV{Wy$%XJ2ti!E-Q>$~vt#W8SoM~mM6h~JHm4-vOg{N##^__y&d#qpRWP3K_>qcV#U(rl$T z5i;SedYYN1INX}c2j^vOj%YI>F+wx@E8*DzL!jO812sU>!_oXcFl^qdm#=gm3v!9`6Y7K7ZQJ>c#BGf$O z=c2%Ut2lm&rk?3I#+pI&6iq!djJcQjxxD&jJLcvHdZwnnnfn%NVt3un5oX@!=kT0| zdC21EnVJS>kGGZPTZ3c58k%=2j`Psi-0tV@ZqnH7_6}*PU1Sq;4RZ^{8kAtTd6c=A zgK1qJZhmiZG&@C@zgwCK@o$=uX7hL1O3-@LLzJ1xoO+Wd%KVtQ6LQyt;HEL=MT`4< zLWCY;;?n>~{e(308|lr>Hq5=uU*v0HW>{ez^7W=I%-)I%9+qD%V$D2@yCuI}Sgd)g z#XSVgICG7~y_tWmVS>5G;x00G+~VR3szrkNv*P$m=Lsf0OhCQ_=OV0?*^W82%4=l~ zw8G{V?9y79MT+B9S1WS?bE;3bGH>^DcQM-xwlhCc z@p!gRHos*~m05}zd|Z_hm060}+~TOrQq3!vQ{Pf=Zw|7;sLa}%ixtOZ*3rDr;;76z zn#V1U%B+*w^aGW5DzkJm)8eSi(#<@JqcTf33l+y@mTpe7!l=wL%{3NBrIcyzu{3FI znrR+qZXrK|m1&-{IC=&v)BN4yX!P!EHvN!%Ss3*2=m@>D8ONNONxGOG6~-;Oi#glR zwR3bamnjbSecL&@ns;0AXus0UyvMIe+;&UzQ#Wx3Ebbh0Z(5u-k-|Q+xTef~uQ;SW zG@_gND|2e+*4-2zvDX;AuZ_6E?8=-PKYN(j%&8HjhuQRF(p(+1dhGs?9%ib=T{n@q zffhHFIj_at#oS_xdwk+udJl7x#l65`Ge1!_k206{sp7t!xIDCn>9sgnNGZ&-xUj<0 zMh|nD#l;}(Ds!X7bwb!x<~GHNeueWRdYTt3?z+OI5xvZIpK%JJ3}L;^B8!^~F3VhO zad#H3jOb%-@pJb^^fwRrxs4GyX6gxL<>A7|A_kk;7WYQsZgAr*?p)zB5xM4WKlft9 za5Lx&74KZ(YY}o5iEdypu}PS@c%KXtRtt>Z#6pqs`lyQ!VRy zb3bz{@g3gpBd#|yPf&3iE=tdJ>yWHghd* zpC<|2SmsnIdCf}ZPRQ3iyEL!4OlhJ#uWaTuk67_&typ57vbgX`#C1K(DL}Jtvl4S4 zb82l`X0Gvvnd|5JMy@u?{M^LIHRdWmR}#6_-0kP4M&4__ zWpVUY`~Bue7FWsKSwD9gVL$r0gYBaf_RK z<>JT(%?tjpejyK;4S!Ug(Hr(#%yt%cPu8lCt!B1AY*ol3=6HYD{UMKyUjt& ztrla4&2{WHXIospcW2}i=Is`DMf_>wDRZ60MZ^~yd(20fQ&#qvdsJ9Zq4zF*kNIg0 z%?lPc#k(hRkJ<8PRT4A3&w}e_aVtIhL-v~EE$%MQOObocMHY7j(tFxmW^wbquSGs> zo?=d=zRx_T!l;i$?lXh_#VK&_*k{Hvr+UXe^lALPZ!h6S#;rD5N$jXJm5!pHV*O_s z>xRAvxn|ja?Jq6cQ~B6t?K`&cCrixYfS-2#zfUU*_1R7{peB^0B}>|}q)V}e(ip&! zrHp^a{=KY8=*zDai{ki{Z#3zycBV$qN%s~+J-&#x?_UUpUn0vZ5BvU z(?VU}lqbsO4Cre@S+LXd*^csO1=Fh-X&lhReV}!*5$F(Gfri-mH$wNYj>6h@@X=s| zYWz17eE!$fvFGJ0l(58KBBofcvE>ih!e>mYP$~_TJ6)V%xw2rFpJVy2jCQ%w|2q4u4O%RK#gw zEKnB(K!>0bHbgO}qAXm_eqGC#NRj)3lB;%Z&zIeT>glS@DB2$S_i5EWRf?Bx&r(d| z+$~_d1E`66nO3MI53yt?>RN}_a>+%8eHvTR4YCw7{A(}ap;moH`c9Y9^I z=hU|_)}3E=uw12Ox1e(L*ZF#u<6bUz_IxQ#m1{d~kE>{Vtjp2%a#lKO7CXfL*lE>s zUuF5*j6`eV3%|rp`^Iy7$t(K2Kdu!2sU1~@cALtYa|*RFWsPW`CjnaLP=|>2Yx;Cl ztTc|5#i1${l{*U6tvo7;J+v-u_f7T0;cR&fTdo_b<}xa6T})=3fJDu7QdF@88eMgs z`yApN&x30HZ0!PA=YF=ZiD^}X0b1u-+aXr7&LfPt-dR2LDU;o=f+i8YR>?K&wPe^yg4TUsH?LMeZdf4l$DD*8w%5R-4Ms|D^K&XNjqnsanqe)Y1Q+ zb@czHUhLzQTAQgcEuVX|m(f1{)4Z<h*0BIfnH-(P{nZrI#Q_iW>4`}j;qEl zMbo}giocdC9U5n9YN{E^?rmNAa+1r*?KYK8UCp{Wlq0N#c>cPZ%fT*D^cI_3%?`@4 z3jJ$|-4ms+e5jj>U0$2k#p5;~DD=NeB1K)VYN!79bn3>cEBQ~;qLq>+_SMR}v|6=l z+t1Yr{ohMh#j@9zy_Qv|LbZcd^sAh@(p0oPk8g3PT6d|n&F3tkeU=n+0LB+2dY7Dw-(dRS?OgxSWJel67uBJ{?CzZAk;0gltN-j59#CtR$*r z6ox}z6A3`yDD*%3h5sA-1vSE}wR#Gdwn8OQtwrf5I-Pawauur1qlotH0_?Qinu=@3 z%blbCt^F^zAGL3#`B$&8J}3F5_Rh*5`^;#c;{x=h_Rd$>NSaASN9x?5E~>jWExFICQzN?%%B!JlfoSaG{zm!S03F}?p`s^oEPGn^ z6ji!Zo4B{iJK0LsS8EkjBQx2iqHp2QTN&-%)}>V$s_{p~RjDY=HEcnp{s7aDF+R(9 zgz-2~6BJh$Ct0HO3G2!=@wH7yjdkbQg7SnUzJ0o~@H<-$tE9ZQzMk-ZuigH?jHTug zwVL`*=@y*R|1{R$(YMdD_O<$Jyy~;>!Q_s}O-HFcv+Q(6A|`gJuY+pLu`t@5tU*3_MD zbqC*0+jAGluM`2=mv_1^uZgL!jMFe%TJ|!j8%s%4S*cOwaykpxrYd=RKc&{92{k4M z=u6E?c2AV%37!q9o%_y>?K+CSoTieiJ`$jPb8A52Ys2=L_pd_({Z5LM@qu2T@;H_y z%TO8`pSDRsv=nzT-p}&QKwUfrbcm;chIj>NilacMcn>J8eH@j5@2)Y~zx+x2=ZK|= zvmDn>(^##Ee#eHpldgRi(3@PgFFGjNk`ziwQ6Kl=M=1?>DM z_U-MKMi1Y}Q_Oi(W6n%2y~QlC>#t&onr9WQa2@N@n5m0xpdD82kVIpNufFzPM)Osc z9|x)xrWB{D=qZ#hA-O!QN?--gICW27>q@@nRO~0Ts^ry)3awi-zO#R+QA?$z#unA@ zRLKyniKU1u#jkANxQS@{$gf7}hLGzbibILUoX9k_SWR?h+FsgrTFw5wIMzU*E=I8a zSeAHLQVDd3IY2`!2b$u3ApR&Z<2Ils4ghuW2}}OTs8&k${e?Q=56FFY3IY<}uEegX zT7|NsXcZce`|Oa;e?_Z%4GNWh0RNLa6lzWDoJuJwI?!us_QwXSqiQyMsxE?1iuLfL zYeP^CMVP3MUnBhR4OtNdss(;ML}OrM$ne+8MS@7ezg$Sa6<6Wc2V7tL28zyNi0Dos zas>F1_}k{!;x`6=BYQl;T(Iqe9T%*)V7mae3&dhM5#f_Wr7RZxQ2dp6EMyOUm9iZ2 zo5VY^8o%lAZHD+t&cJm!eyi}i7rzI@eC+{TH;db~E#f|HE3OaY_XvJF!~tzL(%g+S zcO%W+Nb@PA`ILA^ds-aP_KT0jv*IW1Ie7dWJ~i~BsHeXon&KC!zYUwm@%sqBPhs~2 zekbueh2LrX-GbA&eu>{#hw2S3rEkt}EPF1gurWB_)`#^kO{b2M7@nyoP zFnxFQTC2=gCssoeJN-Sx>Nx%B=(FOb=qPazc7{ew(FaVQ(&Ph?07;sD?es6AtM&V) zpNYm_@reH}dWl{?n)3D9^gCeTkLb4Ythl}9$ zoG*$6Gj_%tX30fvGZ(qd1Pl7I75V>1%m*AAtlgRz+&ox&V@8AKCv~pAgK&5$~R|a#8=BNyLXSLa>$CG;#hRcT$I?IjO!Tp z0p~al-7*Y1$8LGkyy*D&77whQ1E%S+7xkk?v!4VmzIiz$EoR>XJFRC=Z+6kqe)i7D zV58^kyY!2WL9kHYPlz%cU5?>$`dqacubJrvu(|dH=8MA|Hc86R)w_0p~PSe&Kj3?)YgMMxNe|!~+X@B>|5j z^spG+>(}tZ;?ubaVTZ*JEGd9wr6jsq|9$TI)?1C1^Qfn!#6M}SlpW@+N!(#j=mvRg z`u5g444Rd?JBH7DEpmq(4a*0O2fH6>-QAcu?_JQblRpBkoA*WQW5y%%oW?PO^7R2c z#5`i**?AXRpGPdw<^#i+9}0|^-?+_1gJ!XdM#}uCHhU$_)O-1REPEx**B=;N=J##0 zRc6f}+~zRyg>gv^o{tvO)B%la{c^C(A>tj2iVAxAD=%3@>BEi zU451ugtcjHj>#4a=C(N~Qx`05lVs9b;-DlTw>aSo7!F!%NE?;)`Rb1-q$uw(mZ}xtXz-~Hiv64P5;M&xsJX3 zes_1IeoS;Xw=d}4?u6XCpm)0@{e=bjvb*{2g7+}9(~78(R?w?ILhrmK9Pfyqf;`Ld zuLT&}+4C$%_`>P!vK*~}!N#+>jgo?m{tKHWb(eVyH{(wt+_-QA=)#59C3SaHEGz<2 z-39aa7(Lp8g_TJjP1WYT3+E<{F>_NEC%H_Lcwisv4f)Q(e})p?l@zbhcP8RBdP5mw z$U-xDiuuFB2FcY@Ec(oGUWP3C5Pdv+5o%DzE?SPB+ZD9Lnx`;XYJ(S*CND9^EULx| z!M*6t3f5@y{j)YdaRbki5Y> zx9D*4R)lUggSA$R-%Q?Nc48!b8jH|w<*zpqUbUET(Bj_h(&Y6-W7IkeZ;KWOIWbx; zz5xFhEpCuZWABB~^YZ@1%~H;zy~U<9()KLwnzGk?d2znn%cVhM@`o6iX(hQAUp5ME zN-HR|5R_6o$3gS_;=?HiO|b+mN^7tLW06K}K1z#aI&H~z^O*T%_xDp8$&w{=TGAYG zBISfRb;+5OC~e`A5J92N)Qe*E5|o~xlDQ~uTqx1T)-CCrdRS~*Lak`;lKj-O=9pQp z0)JWZZt6;IQCSY{)^L2);kD^A+wYasgVyr8cP+1_x5{P+T`ODPy4l<+({EkY;i5rn z=B;w@t#@?TDzCeBXNSXL;jQT%rL&+{4$p~KzcshxR(bGNte@rE zuoi5bxOEgX#nQ1I(`4|{wV{o)O+AY{9u{4eR%3+e!{}PNt78&u?(f)0BS|BzjODYI zz5&S+lHdy#krBbhrln0g1sgk;&UFwbb;@#{T-qP_^V0W3n)cPeoiS;=iuO1{CVUZ{ zq)%J$P$yauz0hflJXiQ?ryOU!Wp8&H=8RhQVW%-pYPT-u$IE{1v;pNaG-89Guaj*M z^i{GAg1$z!LC{yo8p&^$6{Qj0#Q3Cn5%c@DG+HNzpss0OKz;f5w2Q(MyDhESIb`|z z*455ym-kHHq2IW?EM|$ZtNOID!!dFBU0C%^TV9%;ruV<*`-o~ed--Y1k4u){6OX>X zoXTYHf~^Qmi9f3_nJk+bQ9NHC(?cdS1AX7}*bG{)w#w*^Ha00^j`P;UvWz88>W|0F zx0la#EOAmFnd79jH^y*SK4zYWe6OVa%U=Fg*Ir4xn7xvAFf+g%weon1k%l!I?ulekje2)est@@-hT zId8dbe@L(~qRsx0mGa)($dg^S-3!lC;x}Zh#EAE3Mwa8iZBJxuKwU&3G^G08h#ZaH za32PLj%RFjo+~_^al-uRwtoVDzwHm8V}+Jkt=C)O%-ritSs#D>=QN53hIwlK&jEH z&!f%ie|IL~{h4WO-vc|FGN)+wtOyZ@;q!saYDhlLq}n{48HDqg_BcTZ66yG5iX%8T z*dmV0FtJVi0NgG@v>p{XR zDfKc*saHx$eVU}WGbP!XEy?D5NvSNBX|VGm+c^X~L83?_f4mx7(Aa`Tn$tA0GgG6u zvo*3aUn85#SpRm`U&Z=sSpPoOU(foRSbq!aZ_}t8wrewuApBL~Ilw*ILg0RFDe!=H zJMcyAF5n^U9^es;@_STU2l^dt6Y#jU75K6C81Qp#7x0v}2l$ot3@}blH&HJ-<)WKT zx#*!&E_&;fi)@{8F;J&m4ALnVxjN-yH0zIL{qd|{!1_h3?`8cm)~{s!X*%U%rcSw- zty3=M>y(SdI^|-SPPw>Ur(CSUx8;Jw8l7@+pH8`0uTw5I>6D8tI^|-UPPy2wQ!aMv zl#56Q`QO|@{>M4U|5gt2Kh>c-gG46|&E(K-9NL3Jdpjt1*$%EF)|t;bi&u6^L>$D6L$B(#kU^trb+3}Hot>>zWL9PFtOPD1-Q(N z3=I>vo83cE*U$+Q=ghhF!o*MJoxls`ef3a2PAZ4yPO=c^WY3*sd9*Vf{c*8#c>OT3 z+gSzN<6I3q?(7;CCO&rd2Y&7x20Y~)5B$nm1^m{z26)c70r-=1H}HbQ#L4}l`+ zJD?-z0x&4ZXb>jq1vLgX3`ztx4ax*Y2K53q4;loF3mOS*6?7x8T~J{IltvJh#H zOQ&G+Bs2JtMq#2`@P1&A;Mak@gTDl32cHKH4AvT>Uk8&9xxr*7FSrRLqk{`Uj}2}P zdVDZ>RS?`7bWw0B&>NfuEDO#9Rt8T7P7A&XI5T(&aCY!&;QZiSz{SCDG)8L-rqWv< zoB*!|h4gO<`ysCY$A)|e93S!v@Wqgi!*y{eS`Sfn@u@atr=ChT30LxGqs5=JuJh_Ee-1a~@Pv6y zg^12@rOb;^@$_cunrK}=k0HG)n~Uajo!xvkuD>Ba2dwK!T;~OwX^AaVyuQ};q;*Yf zspR?AbvCYKZ#`dUH{WQ<$HyvpT%5Y*<4WZ>&${NvEB>T)jY}lGmMwc**L++jH%!n( z8wzmQ z{i~IqVhCMbt>Ua}Z|geVy3V$)>#gen>-xEM6+d)Wb^J(W|8wiwYLxPK(`a?g z9;2==UZ<`Fcru0Zb84)*#@~Q)XmU7nKCUEpj8oT5*0q((l21_A`T6SFs=(57t84Z| zb$zi=T?>lT^^`|l=TA~shgV%^{5Hp#)g9H=U#Q)WL-ahSe488N38fSDL(r(OV7Hl|4_*fSl77Et$5aT z{aF=X{Ho-$|4r$_Z|i!%y7vB4`8(UX9>iMXbqfSL#h|;4&q9dZ?qm!dMMrTBK zkM0$n7dv#Z1Y^3m)gAD=46|1+x)vtgSHWETea=cc39i%+Irj0ZM(7U{bHw*7uPPOU2eOgcBSo}YWHlrm)kj#LX%n~wM}v*l_X71x-IGcq*s#O zO!^?{hoqm9eoYd|O_CFmGm^U}_f8&|JT&>bq|{4oliD-2e`;>(s8mmC zb?Pmt3saY+-kExD>W0*9sZXUopZZbinbhx7e@d0@o$c$l4{smaKCOLr`%&!++D~d< z)_!*TMeT2Ee^>jB?H_CZO#5T)Pq+V9``_D}9qM(6>Cm=AuMYh?jO|d+VM>Qt9p-mf z(_v4C*E)RD;nxmE$LNmjI^Nvzp^h(iJl^qq$BP|fI;C~$(P>bpF`WuKm2|4?G`-Wj zPD?wj?euu3eVtBp`gf-WX)V%H(z>Q)r{$(iNGnO3m9{+XzO>zG`_o=YJDT=h+Q(@p z(!NeRmlm0xl%AG;b^56EvFQ`iJ?T~H^U{~3uSj2&eoy-P^j+yMq`#5=N%{}z|4wh1 zk(SXbBR6AI#<+}|GG=Ei&v-Cnf5uxGpJn`#Q9rY3W=dv8=5?79GACu0WzNc6l({l< zYv$9L-)8xrc1bVbZuN^eU3x_{5Wiq|FU0Rx zPLo26?Lnw$yJT=)4_%1s^LhhI^0I-ivm|IFNn9gIQdej4Xb0r+j2mt|u50kXfCna4 zgHEgku~vi+EpfLu4);dmA!!YN+QXj?xWn5?G!b1zQ_&swFs~31;z|*Nd%Vp>Z`{A^ zgIL)jR$POagAj8V?gU?p*w^De<5-a_Zh)2Xu;LOOMLsMQi8SHC^i+m>zvUQ5DnvI7 zmRE|Kap!mztllDe;#*d|#R`!n?t=BZVSNqm0pE)|8}}iFf8gHg2BfkP_b)afg$I$s z7BLQYDaVV4k;9bDT3uL5h8bsQ2B&tBA>!8bdQLTdqoTRw1}1aaIXEFNRZEqWch+f!JXv{ z`HHww9uhs}Ya&a&ffe5wkuARx{p4BEUw$nH$ZxQF{T3_0@5E5~y%;8c5X0p;F;bov zW8^=@1o@+I%b&$W`HLu&7eu+dC@SQy*vxaW+~)csmXa#m-8i#Dx@J- z%V4=ihRO$IJ-JcVmz!k+`H*ZRx5%b)n+%ta$_V+GjFQ`BwA_JKxF!P28gX^xc3@uQ zlR#JGexNt9@3i&j~<#BIvzWsG4|W!1JVkSJ>rN%U9lMkJH`dd7T4Z!-Q0 zlc-?)Gda=l<>-qPvhz*K6iAf)KT_WWZLj?`?MY`H<5otMmeN=FONTfU&+>GnyfkD~ zUPX6o19^PMRG`xQB8AHHo0NP={z#nxe5WJXe&~IcA{b2^#`7VQezQ~f`Op-)q z{sEoVnVf6JXEMW_h-<@LUC6?djC&cMVSJwPRmNy1S$MlkH^lvdCEqaq)P+*H*rg}r zT36Dk*Oja(&y{7nwLu(eFAZfu>3_f$R6VLzq~xmiDZIJcLrAN-JEbz8aZPthw`(NH zFQEBTMTI2XMr?xkA$Y3N_RzfkYnoJe^2 z{&HyxYP1=Uh+E*IbMH9d`@PAB6O3Oo{>&({NFJQk6FL!njsR6Ip38nMR0uT!rdU~Hvps7Z%o&BiX4l=&U_zB~; zjDH>aVgIh!yQU1FQhj|u1?aB^(pajnIEO6H$e|Kb^jl1SWRpZ*O@6A-mzaK=@n4Kz z4NS$JIJ|K>@P%tgQ+e(jM3z4vM3QeAe`Ne?`DcSkUs+b|eAW<>C_Bq?iM}(JEI-8f z9!omaf4zaPU0tfpT+#5a+DsNgHzyKazRg_P!hpmZ5$ma8ZlG$tswIozN!eS!3qq<8%gEY0qz-w@cy839!7Gc}K_bf|Qa%qz{6`a-xd>G()!&srYRp&T z=VN1^hR!n_SIq)P$5QG^i8MA2NIZ?uZZ}ZN^d=LIzTp>0)cmOGQO%O0Z)k#Zmb!BL zI8b#1mkA?!G4!8d%Lf@>x`EQQd;a4%8j(~#Rqg63?sqejsfYeLZb&%B&+&v2j63@g z{U+lljMt8LK{C7XG~kot$$w>G^bLNT~uZ-Uf`RE&7@`v_tkyrg) zG*%3EQ3V!O7MwMTBb@cQPI-IswUXrcW?lETYjb#6y}*7?sb;lZ&2CI1y9j z(|Qu+6nzJhTP8mXRHNV0$s|{E+4MdiLH>_kWNmt%c9Cc&-VVUqy_7COElH4gQq%C1 z<5NJ1-HnbthK_%9|H1+JUZ94ZhJnx!e!ld1jrJf1ffBn9CqhGkLE2T;#r;N8$nOJ6>}J9d+78%ItTQ4Y{|69nABbj< zCj%Rb-9{wjyMPkAo+!vufkEO4BO0Mk0ws1qF_3ov28pMP=8*3JO6;v#K;8|Ayc;bc ze;FvTGm3@$3SdM0^@=!zehJjDTZ%{MRltVg6EgwwkAYJ35{U@y36$7DwFcdru@CYj z@kDN0NV1U|i9J;k=>Et7zOTiY1FtnP5Gb*q>j?U4#_O?Xlh|t!-Y7C4zX2!(J-@4A z@6{Rf1ndws?7s-}ksFCU7~w?ZK*L^)a1#8LVlq&}4y+e&3Vg)ZEP;480p8)ODU4I$ zohEJqN>L5(G%<~F26llO{vPEuz(ry(a50V?HL(OcLVObdsEIqp2;eI0uqAenqd>1_ z+<+aU#O`ejB#&T!s)@&u54^399B6p{*9F`I-!-up{z|bAJ4a1C&G-U#k9f-%zDw-X zi$TB4cm%shDc(RnH1Rs)QS4|n>@KSy|3XX!eS+~c@*%OKoB_$VjNfC=E3v=48ItqZ zapDaT>^Jd!OQ42l8Rh|h$IerVKY(~XA34Tpom>K1V|2)+kQj_kxg2tnF<7pEJcO~H zTnTw7P>L{lC+PZ&jpbdS!{yzOM=&;*YaxjNO3_l@3%UhRidOP|(20z#wybil(O$QJ z*k?=e561QKB}mpWZj!G+zM1hMc^L8sfp~KP`*2Nc0ZRNyv)4gC%=nmm6ZB4b4Du)C z+n}Fdd`i9x$sQoujC>#T(?EP-Kz;yvKTs3T$d5oj%XmP30?BiXFUZe8zamc{^bq5# z@+2gO8IQ`-kRM}w7pDRmo^~hv6ej~xe8zYJrvsY!94N&}oDgW@3&vA8CBT=L7|-CO z0Pm6jr8tYz0=y5!_%%)qr1*yMJDeV%O)`Fu69lwLAVz8JH(-eN2e6*@C*%z^DK*i6 zv5}@rjJH5dG|>#uO&KFJCnVuODI&FC(9Ia5v`|Q*8JlbMA&+5fp*4WKB~TNwS|iYL zKuyGJO+Y6A(e|`((5--)XstB^-3F-PIe;k8?ST0DkQM_v8Hkpt;Za=CNs9&D5hz8v z77sd&F+)p)Bol~tPqfycyD)as+CtKm@k%WTbWbe>p}l}O1J~LEbF_}YVOkpG!+{!} zJjei@2gG@v))_cj>k7#jpe8(8chHj)jMgae* zjRgLvjRO9pjR6Mf*8@ZK8-Vrnalrbz3wFYQs5?C$7^%AK@Ro7~AWU zL8s}(z)Zaq*iD}T?5vO90?81dCWh;C zfY<8tfY<2@fY3;IjIKlE2%=ifk0 zI2?yT8$gu2<2BGN9j}9K!5Hs&6OsfVTD#*I=yr_Bj<+F6Vr=ht7xE5_ogD8&-jOlQ z@d4!Nj9nZbLEafCMK{MMpt}OGesFvSx(5*L+;IYQPsZMklaORF_H&$uJe%=q#~IMq zIL;z;5Kt3?9p8W+!Z^zD9VFKRrMTYl1L*4**W*b?O>A)d2z+AH$c9~7zcVG<86iuk`+Kr+-~H9UI|36G2Eax8ik-A0Al7fJfJr* zK4?q^{g6=%++vghA2+5zXFE_6JB$j@JAs&CjVjPbjH#esV|?AHhU86S1|)AVo;7ZU zhh(I1U@z+a37kX!&_^fMQMcAHB;7cfpXmx3-gmjkQJ6$rhF zak{w@l4`~o=ADqw1ZrZIc^7cDc{e0;fEb0$wZM7iy^t(0?*}~}D8+5&I?&4*SC|_h zS!-^DWDVmwb2I4m=0m^@=2qZF^AX@?^HJb~=HtMJ%pJf-%w51o%_o45nNI;9H}?Xc zH1`3YGM@qNF`onOH4g%xHeWzm`+!)1m@k1o!1%oR3M2;^Uoa0t{vzWm=4+6@48%Ib zd>!;r#!t;RL4Rf*1AcD44Lo7K3;e=-ANZyD0rbxRG5eSwfj$ew*DB0UKz{?&#CPUr zz;osa;E(1>;IHOs;2-80;GgDMpm2TzbUMES;_uM`L!IY=^_)Kf>pOo2Hgx_1Y~;KM zZ0YWlH4qWQI61dEH z6>zz;7c8uBW`Vv9h#u$c3;K4(ta8alraPE?`7ZKCoGk zTgUTSQpYa6k2HYUlI}G2m%+e+G8A~Vr1we($p*k7lHM=Pl}&)dWjOZb1+p3T^Ilj; z5ZkmU;Sxj4P~bq*0A6i6frHFoV1H8w=9=^->2R|FFwblRyw+?29BqbUFIr?a!@HhC zLg5xZY(;<(-rbE63n-2L7Y&zt7 zu<4M;k-9^E2%8T1F>E^Ir?BaepTnj@egT^fc?ve`$+8A78~bLip0#7v>=nybd=_ZP}Tx@5)?Ug-p?3O~KAnYp=hBtB@V_4{+@*$LaIh z<2X$g>f75>{Lrv<<0a%98(cTpfgS1Q1_hH1$RBD@2EJ&W#G9Rt*@%FB1&*k272@m2 z3Y@v&5Yqo2MiHE+)s~&RgzVkux_ZmH)s}UuA33P5?0%fv^m08MX} zhT=!(Pt-=~O=xPRjqz)S`{0rIMd25XUkrY+q9xjDJWiDoaOM(^v!r;Ox5VSrC?4l4 z$v6#4#@R|T&Q8+tOmsTVP112*(go)v-EhLw4QC|XaIVu0=Of*4I?_}05m`75>4Wo( z;bH<>az1_q__^_W0`2li{GP&Z4}SY`UU2|#E+0Z0eI3tHU%)wnlmd5m>*1Z@da^O@ z?>51&xr~t~wQX(AYirt`)Kc1?)OzAK48O@8Iy)MspVYGPteEIAxU`_k>+UJMrG=R# z?#d1YUa!c>Dl2oB6u8U%QokUlPnCCafE!v?=_xH4=qf4j+O+$Ymb-;dX~bl=*Iij! zBKlNKoaiq1loZwp$toxv;;!_GMNKx>RqiTwSHgT&Nrk6xskgK|&s|>ZDRFrNF%Xhf zSy}FxP*v%!2q=m{?wj1+!LG70B-^i~vb@@#qmh*!uL@?9h-Bp%tk<1S*$R|HK-RCM zs@Prbsw^!Rd9FfXV~4w41w%``)t9i7RZ)ig<(0eg-M-L(ZTRiVFLF)rx&tNDzqEX+ ztGvKgR)W2B7xXPHsVMaZ%vjF%9XfP)wiq!uYtW!^!~6Bk6Mcsc88LKFzi}h_4)51* z$hbZu`}glRd|b|u{zGA@ripC#gerfXh<-P@ODYGI1_WG$={_+RVqSHbTjaT?RgNn6 zpkn-a>hH06HmEdzGBPltvfS+|7O>cFTE3f`3z+=LBPv~$?wTTKqcys{eOwi8fgo>H zh36(WDT~3L5>K(q%XCf&(#$O{&39K+u;3D<1-Z*RqPhaD+V7oWN1#Q(>uRCc{;qtF zmsrlGKX9)Ul0v*C{YG_quSyd$$9P($crjZ3@ey!m!Qt7Vc1qDmMNT$KG0#)%rZRPT{oKeBlw5g*O){dmGT<3A zRh31kYEQn4+d7GIJ^7QX%CbFy8qITiF(~+RGy-+uuJmNK(k4uDPyC=G;yq5~;S6*IP z-j`ZdPF}gEu#iV-?(zL@a(SzGwDWh>fGCIK`JL(SnTAF?+&!hrQ|>MhIn<&tYFpP) zKh6ieZoSe_rUn*sl7gnh5>L0)T12*^KOODpQ;klNEG7-oV2V=tE z{zQJ|luRtOoF42daZ!$xcUFdSipwyMsLsoIKp(_P)ibTX*F}EXLbxb=t%E{1Zms4Z zYVp42A*h!J{IpW{m7cHQEHPz(hXxFd#jZ-4JiXTZPD4aMnl%Bl3Fb^PUNgiul+={w zRFrn>(kZQ`aD)eCP%C;41}}TE7OO7)B|)~kq&my%tr3{*&i7Q%>}yp8+Pf9bg5j=` zLbp%AZD}xd2}`0zW4i?9hh|qc$hW8=ekzwss07^%Vixv)Q)Tv`f&HIx5Fx)e-vp zcAXHE6-~h0L+b`sd1*$zbYM;aO)izybz*TX)|GlnE}zg4EC37YM&a78BOZ*Lqnlnr zURhLHa9MxR9O^{zwVgTv!`)uw`X=r+bpo-n$)C*A;a>!0yDMEDZyklaA`FLhvq}pt zDug=vBP-nHmky}RzhqVCsK)Cb4lGt({Qc73Agth=;jXDQG}HZptO8eAojxOStX|W< zytLS#7A?6uP*(h1szUhf_+=#W6}*)uBs4&wV2jHFqLG#PwWVq#vQ#jQDvH;WevXy^ zNI^qFtvX?YXe;QdJERS9PaTB8y^cN#pLTFLbw@i)@dc&D z%Eda-`jle(>#|MODif*}D@Rn7m6c)+FYu3Gw0c&V9PTdkRL~JXzmoh?+FScW{KHjV zDLQLbK|whj3xrxe)G9MkV>+^3@59=vQ1uyAS^{2lLq;KJ##) ze5~am%y6m$yrmOdv}>yApKpD}XDigHu#@zv`Rfw8rPvtcyD?>|-r;MTh=%_uwlCN> zpV&l!{xpPVUEX$xAy|C`oVE?A6i|z;wWh`&kMdRzEy;J+*ubc>EPsjnR)IKw!XztH z?GJL76jm1T9*c(m8Z85pfjR*S)M~f&bItt+fn0~1s#F$eYamR7iJbxLO4QY>;UTVmB;ew1}`O=@x+(cGYWod3{nN3nx zzk+uDB^48~(Ga6N=(tlWYL_Ku`rOQDDmALu9&L^gg_qEt5yZK~Hm4Anvq10&T@GB>fU)n98Cvs5)#;Cw}fkd%? zFK6qP9h8bS*rR8QzlZS(98G!Mg_xt%aURb_mbKwDKoq+>jKC(} z<@HQwPehKNr5p}MlP_|4`&18iPqd0EtGwJ*&BbDCnaG!a(6G_A&Sz!E-+!#e%1vBk zm#WcG6uK+N(JEG8u2TeaSulPRGNC$Vg~%UQ&dW13jE(S2ch?dPc1`Q+!s!Q{=XK!I zkp6T`Op25QwTX%%%x;`cfTOS)BLTTlLqHm8+c*%Nk&Ri4Oj5N-rNDy~j<5@?ZDwE0 zR^^ID!>Y(a@4$5A&Z-EcKeR-ZhgBN62<5ZrzC~{C?X=cJ6Q|=rWu4ry&RHs~#EZvy zdABNx$CXe?7LTj+=eBs9n+|w~>OW?taV_qyotles{4YLuL^%%x^|TFde5e*LpX4$AYLP>;yDuAeI3(u#^|uBbsw zQJ!rTPvvf7xeEPfRa}35j>6bR;PixRjm!o_q(##LPHr&bSE6rlSz{CBVlOTiM)44b zb?Dk3r`AO{#3?DDy^l5H5^Isg<0kNZ5N^K3l$#cc-%zakrL@+ znKrnpqOuQ8LZ+dCfeu-cO@-0DrhZD zMOsUADSQ5IUfU)I)QrLHitGk-S){azi?K|k!N_tkz*{37R~?2^)}uQX_ISiA(>24f zq2~DvN2nNAD_EztjO^5&PL>8lnRTF^kz z$7$D%h&Fe{05|PmFkfRSfF>e%A4c14t4^_Wzv*oIVB$I2pB)9EGOW$ zj8&ZCQX&3C)NJS1&GulfwBUzpx7-} zYITp=;p|30$WB-p<7QsF8P;hGEq^Kh6D3$^O9JhZg z_EirW!4%7AqUDZ2gjK=TZh}`wC?$U-TZLYroG2dWDZ$NQtKiH038Nvfd0g41uZeK% zfJe#)9#T;Vbb}Ok=x9qtr0RFMr4?!)P4_t}xPbCp<#3xlwn+3XoVd`O*wiWDN^NOqhLj&8Vqn0*2iy#!U7zH z`IoM0thBKdiuP+uCtx*T!xo{YvTtF~H!C-*Z%*DAWXDB|P+aqAmy0VEDXocp8!yfX zZ-G(wW!2ctlMgu+BdSaCQPd@9LTd3wg5jn3(=Qy3!IDcdhX^zQ!D}`kmifFd$K6S+ z-B6{|hEBv4+rdhtSzLM(ZpHE?%d%9#(=oS0m9pQn0XW48JUT#u{*@|~sh>gee1`+O zDo=4x+K<{D9y`i_=@>26uA5^8*Ww1e-VxvyOc&?o7bUcjj2{ut10=L z5tm4gt@d+p^IIJT2!9P-Dm^ZBj?GP?svJ9^|i#-=`42uU;To? zrrSO3uX2OkDc7ve&ZQg)G|mn_HPuKf-Gy{dTQyRPK@UVTWO-j7fojM6#``nwRX(PI z79~E$*Im3`pQOSk^2H4V@XXByF-8Oq&qm~Bj~hBNFLz|#xPe(ivIq4OBxUK-@PMi+G=i=3oCnMH#YGN95CZ zt=8S@tPBr|R2Hb6mdLFt$9+)@`GrOF%nF`S!oGAG-VYn(o`?q~O3TD>o-q29R#xIR zNx@X^?FCa&0Trd?n6R+=!ss^DpE8Ena&^W6Wo&jm#Z|?M4-7fQxK-vsrKo)fch{OC zG?q{?Cr_NF}3w{Qa^f@i&qN+Xkhg*v~5zJbK|MuYw@^Zn^)E*3O@Mq zS34hepM5?emOm|jK42i=0Tp;%CrQ_8XQW_}eCdyA2oHah6z~~<6=J7tT7qfXOw-w; zT0mPdCLw&Yj-R za4}fN>>NS|msnQu^IdA$Vi$0JIjs?{i8$|ZmoVceMz|}7jl$}IqfLD|KS5B#876K2(u@ zhE8J3vBSheU3i})ttqX?AlPf%QB@BclDmFp06koY22HcW0Cx#JU5eeY zr<4Wo$QKC%x6c@k@NoFy#qPwP8162VVDJ+a{LrJw$2pRlc)x-_y?%Ir6?=;OYCL^M zE7`tCh|bi7+9-{3m6uR9hm=B!({4QfM9&amCV~n-@+huxmzTJ`0vpnD>`(9=zKWwf$Jqp6{sF8WuNi6Qu9RTX&P6se?R zaE4=@)Fn+_EMbP?GS#KCx^z*OuGH6kMM}-ZU%piEe#TFr26)V-Z9JltR95gwHyNSZ z>uilSbRcMFTE-7ND!VLJR+%IzHs+QN1q3)1gDt8UOyb!>>yZ`f{0>VVba=KFh>I>l zp455p)Ym*=C2;GK8=HC>0L!v++|1;*SW}`rr6*K#amUoAz$}Gw;rjyvoHhI-$qwof zP*iI{ne`kfMYKrDq($cBVx&`#tOnBci&Qa@D}GVnfJs@vIN&?OqDmlLU)Fp)d+KBS zhIo|5ZE4CQR(|SX)tV)tIMxVc(sEpd`K?(?aMiLo24#mI+T|*xtv(O)JO@xM(oi2@ z0tdnV`GJl$N+ypirwN59+;9PfXS=GfJ+~$iwfn$5t|}KEbwEnoT%k6#w0!a~QssNN zO3L2QqJ&#Aw*?&E@v}-8_GrDXmh*Lllob+McQv_5*m(-as*~25^fWT<;j7A2)4GJ% z(&kZ^&TgoDpyubTa9YFqWtL728R>EU@m#VxnPyY9M5JXsB0ZwA+FH)k5ReAeOx&eW zI+P}@Py0>dl{wbgl=xpNkOewh_2k>)bF{kBtb$26pQl9nxG{iQcXVj$KpQ*NjeRa) zRK@s+HyYfS!fKZ;VvO>53-WOn#;O-<9YnVJO~bAogEd*gP70MW6r)7WM5?tuI3y{+ z?fkywxT8P=x=)$97KU}-(JtMl7+OM)RJzF|)#}JHb;J-*ve!3`X|O+X^WCXjOk1Tm zFj2=mycY9$LCXqWq~(Z=mr-Xf^vy3GSN6#!ytj8Qo|8#3j&Rjx!P5LVWV!n&@K|EP=Q9N zjG~}b`%|ptEhWc!gnxA!5DrEEs#(%0UIiD2+D>uS)4F%Em}YE zT9a(}84AgDRa9VTR~uwM!y&%8nkOIIOw8*r0{_yH)qU&8|Ha0iYhWRT=~iNkkw3;US8#H9i37d+pwMt~0Uk zL=$Cd&p6Y#W6!nk$a9@0p2`z@YPC`;P3_$HHtr;Mlv}0awDFAnhg-Sn=llEZwb$O~ z9FUZ3ckWCp5&P`D_Imu*Z~fluvDHNB&G4Mo7>qB?8g%JNrC3}xtLUi;#d~S4;qx-~ zm@=N{0zx58yPnZ1Pe?n%9(NI4IA*vyIdT9W};H@S8FtOjy0<-0{7rPm!O;5sxF zG@dquarm@<#fGZ^(K%joG#cjeMpDmXPmd|=YYPssM`zC)+2lK83@7Ocz~i2oP)v36 zTn6JT61paX+L|35eC!lkvyQPvYlIzI!R;sE&g{GV(e0EavjY{9E?6VX-nkK@k$PxS z>(nyKXo+=A*%O>pdO-v7+GGM<(6om3iTJ7#@g~n0_bEjZDf2%v3S%Ki++z`!;~012 zU1e+s_Oi`B7M96Kr}!t5e7YowHNa&ZQPP8lZcZSf(s7*nYyhdn`%jfBdlBHlb` zu$8Iqzh-W1w%AwT=9spdnBr<8duQ3S}Zy_J*^mR^G2!+ydV$h>DuM%|pv9iO{wPX^0d5ruxq6RhZhB+F!B>Mnr<_F>qz zK5gQfoVIE}JsK@rkJy9;ES$-uhExma%uF3dufhHvfQ=6pqK^+2K#C8dPz!!$#YSh$ zgwIw`WsWbi`PhY7j*+E?oqOU0-^+J=4jsu-EusKo@;vO8b9p&Md9u0+B_$J^Q_Cfr z--BzL5zQ76GEOXkbB#OA02n+4oEL5dg%7K2$N4AG$cm$8_xRM=UCLJ|+(-}B4zs6B zrz^h#rL2}SiXMInm)hp2B#UehlMAqJMyJewi zZSge0J$u4DMK&!jY{Nn{I;#brjYmXZFX zN`N(0L2xuyfPqseo&d^$DF9LcA_t(@_`sB{9rgVJw!Pi=_hkWevhc0zEbg5r$fz&n$moYjApkIRB}nwH0JT3R4=xLC zXXI&n2QzV{oH_Jany=(c0Q{M2O9IU;>m9Rhv&D7+UlgyJ3|ShPr^8Bei93 z8Q*?Vx=TI5n=o38X*rOf7|@ihm_&Aj#WRo0Yty1_)Sb-8D|gTfE&7hsG&;`zIqIpq zklCUylVaEC>X%+3%jU}23FkBEVB8i1RBZSytRohK+aO4Rv1o_QQu(Zk2e(V2QegnKw?c(6HG0DGi|A*u?|E#GmIb z5>H-XE@YNjY#mAijwkKr_?(>`Ac{bC%}&hwqbl^AF@tI@rznqcQ!Jz`rG#?+(yOdJ z0-~{L0<_i-%ck_aIz8l#DO-BOL!RGnNTF`i*%2-)TS~DCN-3@{V+k2ow$UR)M|{RY zsy!1kW#gztAp^WvL8cEsqsX=l5hf>;7g!dHWdw>3U93f*lv9+a)R3~263Y2Yug;%( zlD!G4BJNSpul|(g)TId&qcBz6kfdC`{m8JK-D0U>q_cw1XLB-s2;(eN9VVv74kW_x z+B9?C#`C-n0*k(IBF}1s=lvWc>{p{+vlkZKIV^0cvgAyHEF^_2FcFB+ddgrDq$8}8 z0^vzvDr-|Bg0C@OQ=V)vAFZ7Z4=pb*(BW(qhIlZ;5rSao_=JoNS}~eOcR|qy4T6?n*#KvGoDwWG(<46QBIP*2;wLyXr!Sp4Ya3?A zn1ot_7>WO~ev;tXq|RZ{=%3SKAgLd40dmS21$>K2Tc*0^%K!pDSj84Bjys;!eF(J( zHLGzvaoM8h#e21!&C{UqWk|9t-Gi`3M?Qtq_=+%IM!rrK3hPPYBm>*JiUysTZY;Y& zYbVBr505++hL4V(8h&K>*o57U4v&uy9vQa#6Jy6u43ABWz--ENC!Jq%7vjGa1q{K%2vv0(QTBeXFwIC{b#kJ9$h?9D@C!-GS9 z&pAAHZ(S^(i`&^L`Gwg!Yc)Ntz{-(X3v|K!T50- zo3jVhvy6U{OGQ;8TG{?On&mv5HrP`&{#+=Z^|Mu9ifM%s>SE^U8u!Ng`0FNqZiC4m z^Of}eBCUC5?Ofc*I&7x|dWObS3zX0m^Forv>Y3p^LN(J^RQ@c%h=$O?8WK>Xn+3^o zu1tDmk|i&Ff-Nh)(%C40C`*h#TDuZ^2eROQ;ho0PwRLX(xpLDo5QXKHA>O07wL-;z z^fJCkGyO+r&eWE%yv8wswf@UxjJM#FN%V>}>Z%rzqgxFFF-aB_Jgo?q-V`47b{IvV z&Ac_2`AW*q*RcHQNlRYh5;R3yGTl9uk6K9=qLXG3|m+EhYg!jvqke;*7IsF zlXMYrNKCoCi`oT;Cf{gWqVrf9V-0=F7dgd(5TeATLWO?BS;`Fu+y>hVM0hpOkJuEB z?#j~_=QMSr$e@nBJv?&c2`2`}21o4< z6LI*+@v+A}d2HnP7*?J=xWQ<*GTTnclnWD&pUCdafb+z$J?yMjz4t#=#W2pFHQ{&KX~$pr&!eL7)EX(ZFqEKf)jlSXEnUYil01z2|Rpi z^!QK)oTFmo*pX8S;0!%Og`|;V4-M1b;UTwYvW;1G7>Ijw(xXe+ibf=hJ^5hyy^Wrw zMw&c+#^1+99riM+*sKDHdh8_*G>n_unUPCdpO{(m6(KrBLk1P>f@igYSz$+(*sPGb z@v_2_ADQ_;Y|HWpMrP2sQ5e@DBs<|j4s{;Y`uL!glozyCCQP-|HhxMKRv^dUOxyY= z)*Es-knBESqcl5I3J>OQrFWdK#v+Kke|bPYJFJRbrsf<{|1zCD01T=TbSDo^E1~j+ z%)uI2faezpxgew$b066Y3TNh;i+{3mzT?_bn^Rn368>K}K9{6tvd<73lNoVj%jM&v z8`(J4OgP|vvspx;HyLpScO7}@;daS;VyK$3GwU$kH)M;+%5H|DcJ5*? zMmx+m3EMJFZG>40oMm*J049^B++jmo+eFZ^rI}D5OaFoO%*-NrkZ?qW1^UW)(VpHA z%CXF`keV(GRdneI7H7k!41}9}EKGhaDg3nL#|3$EjPAw29+g|S^{evQF6faX4PAOt ze&tCiS=c6?@uTS-CVUn%TV9+KCxPgT_Os|XkiwW?EybPDN3=?%DT7Z2Q5Z}u5@vSW zEPLQIp7Ggvo4O;%bW~x~B%*=96hkuC5jJm3Vgn~0ygB}l4vrm*_s9)4LD<1zan(!y zoN1e4mL=agXby}`Lq=~ln^UUg?x_%)?K9ME^h# zIy>P?BbA=4R#a>(m7C1UCN0?X!t{RLQ)OYzxG{w8Z7#*x1HI1VOPu3bV&ecO!Z`@0 z)thS0Ivvwfw-UH5Awm+u0<4Izqy9lU|73dQKpL_v(}-PX=Lv+Jbqe-l-jpL-3~+>* zOt{M@g?K36#L;kuk59&lT1ik?P%v!nx?c@|rHBeWW%tmWPYPHou{z6;pL{Kn)|}$B zWzJ-PqL?D~oNBnwOXMqA*y52&mYNtEJ~}dbilEZiM2PptPvo~GpE^2xEPprD~l)Q3So)w5@1@ofn|jw?dVWDJB42>N|{W_9`ll*PNz%plLbHX zH-f^#p@kGI(tJ4}6p>5K5!SbIcvV~}n8~=ztk>MaK;i7MhHd*-$UJ7tPI6t40a~cQv@XI=o#C&fWsPn$DZh8ISmn=FvLor-y+YPn?Wm zo>I0&SLBvOz_N|Hg_JCh$M7vmmgOm=$k!u$7N^jUo#ZPc6T^>5rupG*$8dE99~m4u zI`|;p9I;oTAgso?1z!o@z z_E2c`Fg6PM%9r{nVW2<-wGBTTX9-7EW~Q}!)_z&7%ok|pWDXoZV@Jg#bH)Ab%jK9@ zCN@FdB&>Cx}7|B~Y6PAtwU%J(tJaVr=f1Xs*x}2;utZD-=FJ zZl#nS+?)~J>YFT+UmO$84dDbq21wJYMPntZT`yrm zUn^CxO+5u`%Rb?x&o2$|0fyq|IHVVgOL5C}(XWQKiftF~$tm|d0&NdNte`j-4r#*e z6ycTZ?&L8uFI*xV{~%_LNt9s@^jfG*6Zy)hdvtQ?NuCOGfrR#$w8Xc?finX}o;%LV zF`_FYL$X%J!PiXFsj|Me$h=wH5BsQ$J!H~99?v(x-k&*kXk)Ns2iC^*g)Wy^$OnIM z?p+q9Z+LF8XfJoGeGQ*IVj0iRDX;sazD6eut++(QfO`_(7lzH-DwNHLGY7BOQyC+Y zRSgJ;$xFq6FpIVH)uiC(l-ZfS+A#b`c5GHdGJtAhJB^<~8XGQ5lAT3F+IWlmmqeu^ zeEZRoBsxl{kHL+%%67rO_9FKX8Dn*2RH8$*oO(v)*o?svR5IYj`fI;J$oU$_;Hs>c zv=jhPp%9xM2o|JS4CcKT55+vAlQ`}8OW#;eDcpL23psfl^|T$u=|z{qLLPbIR63$M ziWGakseF%>q@V&q*_Nw}h8q*&Xk?TZ{c&SD&QtcOHMVQ56iyZLMHxw$v!YTbSBCRQ zS;=T^Bn$A4A8)Hq#7)i5hGpVaek>Xz!;%zYUo5l19zV~Q?D4wiFW5SC7R-n9gbP@P z7M3X+Pg|OUm&07`0%Fo8VM2C_tl_kL_8ooHX?htUW4*`Izq<)+V-Nc!jv^a$yx59xFj3_hv~PcXAihU=R$lF*mIocuo2eNQkbUu zneSxi+HcnbhR%^CZ5jz`P?^KBxsR%ec>zUUe9LrU^RtIV9-N=P2x&k*zV9$(n*}48 zn9n$Q-oko=ap0NhiHjP^uLGN+DFadJV8t}E5#~A5pq6duV@$C73_icj$6i2c$asAy z8#s;uwKK3pScWT1h_pq`^J*Sj6yc|Y7r?Rt2}&E3Y!)QJW~nJt-UsNBa~r(Qyw6L8 z+KI?b7N1?31{TDL3E&QiMcYAR?s!On1JN=;If>BLYoI|F{SK^lVzUHRsisG1*$x*n znP)vCz?N@gnGZd~JLLoYIhy6$pAl}I`12{217SZlGgU?F`Euav^fh~r_-{sL>M`4_@itJ<2ao|!A z0X!gbZ0d3W1%uGxTLo$qd}&2r_9=k0nju!g4%}R9$7vLAEAT`;?_ z^xHCk=VW8(!7W_7JrOfaUpOj5*$Kz*a|A7%b1V6r#hml=ODr)nL&k>>owT{xkx^Cz zjvqhf6TiN8uWW2*B}#4s#BO8hjD+E8J{SYzc4$QIP;F^yamLo{=Bgn7EX5;kO*g-g zpvhLTG87x-k|Nyjr6zDD`9xl>b0b7L$Q2E9u3$gLS6HsoeAa65$yADJ9^pGj1ThL} zN5@q=N^GuBNrS7T&4u$9h#1Hn;z)=^&b0AUiRezMD{p#cx!6QZ2FoeZ(_D)2o@N@i z`Nfd0STIG~{Pqw>?Xjgcy-;@u)kszm!kT=>?g~(5R=DAmNn<;SEtSSUHX`K9uSg+N z5*Q{Ta==HNawscD=Aa`G*GMVbJeSp|av61HwJ3O#r9@d|U!}?C5i;Pd8TnW8eu>Y| zEoU#7Ks5fto z!e1JG&agsc+wl`Qkis%fpoAxfR>at*JL84ED4VT9Ygy30Y81=>=5%-oG3XZ2qtSBs z(zCveS$JK3YycrI#mPkvs$X_AvySyz((V@r)27?$sK&xlJOE_+D~(J>&`x408KOCf z|FvkwV2A{hMjW^CjsrT6uf^A`7_BMkY!hRmBufY})}iAx*u}_$@gcb`@!Ve+5Ciw)kKYtL% zINPY2KG-QBGNmNcl>&t3_@kRRqD8(dexj9?$SjqJ#WaY8w?>U1 zP(&ys?!Su;N0sV9GBXJUQ${i&&Ip>1II^T4nRTpnAevy`Xi$tg^;$i%^U?^nJB;y( zwa$xp7o?l?an{JwSo4#6X#wvW+h_O=WXgS^qV@W*p7&-OPoVY}AjL z#ppgmvnaI`@Zf7dvV}2+C(qB!`UFIal<`9&BO;1y$+$YBbqXdMeZt`cpP%FW+}cV_ zrp=>7(`@p{Mz??lMzyx6Kn4ReGB?Fa1^Kqbq8^MQZ7t^pGX`ZXe(N2bv3yzTyS;(9S?!`JF9QWjPDFCSMYx zlflTKbHO~#P6#7~bHNbBlNXPlv4g?Ric1=wR1$@~e9nu~bsZL_GorG?lO%F9NnmL} zj*-21(N~R`IBH1ZtV=~sVU{dj%Xhf)`=tjjT2(2<=gJK-w_%#fFWJGVF}g2kEC@5o zWD}rE_F0DPzCk4&I%HTDFLF$mxtEzpPZ^g6oQVCz<&^%B{h2nLkQ3tvPMP6@8MZt> zH9u<)gKUvR!}(cl4@!2b6=F+%xTSBJB!h2h%&N&37-zjj9xJGq3#F6#E^q#n(%l2~ z(-Yt}G(xl-t(%%JMXTa;$Ni^5tnrHQW;aTaSFT^1TCr4pZfgnuO`=gE+g^*&B6C4~ znH^LxQ4%w#wg=f@5QpiASWXsE5kvv!*f)VQK3ii4{>brE3!CV&Z#9>Q#(;_9Ezwf2 z?40DxM4Z@ltk!&=A(mN_q4_DB4b+KQV>Zn@o*7bMXj!Z6B($T7EvMuq?06ehptGio znAFc~vE_poCni0NDP&02=@S^HitT8sK?@w)I#2IVR4#^MjSu*d35JxPIg@>b+b33v zDXwqB&G@`MZ*ntWeIL<-%mqnu6Sh%z#1rEw|m%2$fza=ENB(5PGn zSC}?X*^Fss{xl&yBOP;dgiOyDj}URM1gqUf%<4Nno_VnXE%ThXb1laW#*Rmy&jMX( zx>g0U1dcGq%J;dsLcWwZl26q|3#-|>MP_=d8elf#g20v2%h<_24`qk9N429yq`{mb zk9w3*iKaXR+2HBZi?ye76I%q+*x& zM6A}-aVAn66nPR>REO%9ECrV>Zr*8qnmcpRtjiM|ko?i~7t&1n&1|1|UV)^x2?MV& ze-xgUm{x=1Ex&za$rAh-v@Aw>=qb4l%jlfeU~am%EHN4>JvYpyV$6@uk%tAL3A^){CH+{!yDOR4G8D6k9TA1`Y)Z7He7rsrJ!I zXiJwBd8wqgot6p2WD^JJjb&c)XtCdO#D+^4=zu%i(0Pv`(S9MxdWZM6Xx}wWLflCh z*>8sfbAo_zv44nLxzZ=O_0*z6MYBA1(&1NuOuA+=-GP`6L;9%I30ba$v~bJxE8_Z}GBb7=q2U3(4=AG~YN;Nii0_8hqT zz&*qF>^nGk&%U8&6>hTi=67)~5pew}|vNJoXPhZ%zBia@*l{a9l z0k;TUSm#UIg+Z8qQdDKXLL%V~rJL6^Gk3=U4~R_gbuY~4fX|cZs(A|mWdvfYbF~ZX ztgVkIe5qH`Pj9mctCEcIVZ;`I2aR#nK15Xr5I`q-n|NDUBvcabBXwQb(~GFcbf=c% zp$sYoS*Ng`S?F}rKqy)7YRYVEmGS7`biQ_v5+XSR)?JY@lVw4JY#KJ{#k>V7$nJIK zjc7(^HKt02=2x)&vjyXJFgLm8k(>n7>=)dKsryiB|GIxE8-Z5!CoIx7Q4HW6PG_lJx^Ca0fH;fyCS_G+_PY=bWd&MRP` z1w1A}N^$z5BZr2MjSq)o$0xW8A>4hK^&WF93Yq2ix9$FH=;wKX|5@S@rnxSXqCDrh zpXUBUA#8dg421CL<6%CmkaCWdMD*2(HYDai=;}%L*;ca;I7sdA}I; zSZTF1YpDaF?TJB3Ec3+D4*N~D6(Nf)Oi_|kr^&B;#T+eR-*uQg%*1B-)&Kr5L=A(5 zUWdJ{ay@A9KiMk(`_5RMf?D`mpbh*GdeG0`3eX7$91Cf`r^%JD5uPfxtn%aGNpc86 z;czb8NA6?X^^-Qqm%xN|)faJlh7`5B3@%mk6>+e8u&J&Dr9MN!^g|aAaWIpI&-PbsZ!tK8=PJ8Oj5swq6Xv+ ztJqF0i+oyPML1D8VOC@pI6UPU+F+>!X^y%6aDl;d7Sg>~Uhj&KHMSr6L@30?^V%g& z91a9Z#}grp48p+k5W2{|k?ax+90j@}3rJ8+(YhE=A^^eE7H(+eI)=)2l91(^M4^u;un6s8Y%HSz_!ul^m zb3bp&?9y*+#pek~&xiSBt9k^5$l%H~B%Pq4bjb$kkF=_F!JzXJ>cy37r=}-bjj}Yj zx2Cn7lB(XfMsX-@lGr2WQORdWXB=9>Id52&25k*tb1T64fUJks6m)qgY&1_@Ngz$r zPnP8}<`Um7lx*RvX&jA}Xr?%}^Ds9{4M|@Pq4vwEzq#k7R&LO!b37kci4`d;sf}=R zWBM?Z;FeO@v^{La_Szb@hp^>l?67_GqOF6pj+FAg(6;G)sFA?+fL#yT^-jCqZP$D3 zigMW^wWM(mqeDQUJ7G+`5cywrjFg%5`vrcZUY7z97dn0=%Ee=6!LbC+R}LBDL}nAK zohL&y65UMEAeCizl6$W7HEc4TM6{BK%^=A1S)p+at3XdiP^;R7Tp6G~)ZRtF?U(`N zuZ>tWqW9E{Dp#}fNWOlZrFBZ8_0uGsxnEwiOBg@fJwbm`MpG6&pvc+@IKn#@G85TX&0X#?TtAH^C0FKHdt6 z31b>&abQ%(?*m3rheM;55^cHkD5pu{iq<0OXgoAr8VBJ$oR{V3wx?g^S&Z?{^}%sU z&RPwv;f!M;(h~k-J3fYu(1&YxQJV}GSKi?UjqZge^CaBh`peC{)W^^P#Cs0`v12&O zBe!kc{E-Zh!5|~cB-~9J*Q9B^eS5Q0Z;}R-At-rzh|;dhu3Z0kV{6x`PG_CiQs`;Q zwcm4zcGcEd8v)lVMQ<{>AN zB<2yS>Hy#tbR~>Y@SM&X#TxciRjN|q`KgO zrqNd_+7c2(r;Yy9Vc|oRHp{)}({-@d=X4+aq5kkF?YMXB8Z4QdjU9DbQ`g-;_l^s> zLd!YeW*IK#`(FO{5z%-Fp#wl6t73{=;wH6zHqUjCJhB${+89e(x%03WYMcyDkzaM6 zr_OitE3M?NO%18n2xHr|DP;r)EgWfOow$YL0=_sfDj_dgZAeKh(w+tpy6O>GiSo`G z^ccb8Z>469MzQn;tvt}G&gkk0%g%*Gm&k3V?~=p}6>*B0y=Z69G> z7Pi~PlA{`lU%=ZRK7N^2V(dV4AxuY_l4LB!e9YB|p1q`{^2(M{zcqs9dVPF?J6Vj6 zGG^|?aJpzi-E!uBMX{s(lKRcIeuPnaD#2y+G!s0ghTj{g$ZN7>kmG zpNiGAYGM$8G`#N9mdR$LaxSnX<)Yeiqd}cdMrC7b?+@X+=_)H<@;;s>#vL{5UeXhfc|;c}Jz z6!(H5nGdvnXRJLk)0qsmg!VY7F$YLDRXJH8JR9uy9R)*EXoZ;56~2OP3e=TNk7(9; z&@x;rB1&aBkJW^zpolD5?wM;kjjj~E_b}EWb_wrqC1fO=g@>7pE@BChpcpQ-7B&g@ zq2t5+o#O94{`O+p?*hN!x-r^STx5Yihak*Ehy_z>Ln^CT)V`OoZLHzFZd4 zmE!Fa1|RO(y%7rGtMTn+``DLicG?$z<@Mej>ur8_*;*fOMY$4&ZXk(fWim%DE2_y9 zxs3gg$r5e0a9yNxIq*{ZQ26;)LS1!x+|eb5J5TDZr0GdUflr2;EOF|OAq|;0DGJ=8 zwd?ldIN!}kDBi0-Inx#kZ5d#B`@L4soP#9|SM>63k4F2mf?ncY$wD`M+*A;}Wmh!x zNLm;3mTM9p$xeFwqQ7 zoNYk0T-*qnG^kM}N?bZ55|@df)rJ&>TL2=xWD!Y>dHeE8MT~AK(ek|-;HY9_E)A6! zs0gL3T`6S+@}+#j4Fe2`|Gx)kXB698BB!nX&&Q}=XVRS${&YR#(Q$5ERgVk>&J2674JsqAIv(s0@OmTtQ_eP zHs4vDk_hN`bl-0h92Uy-)*TuRO*F+)YmSekITKk>PX~Y33fiZsU;32iJtHOABA3@O zE8cPbh-6Fd(W~nR8)A)QrC(xw$Mf2xd#vr7i#Sa%+q?Q7T^X%%fG4rQuY^`NRrUqN zXXFzpUg@)w5jY_u0@!F^ZH!!KyZ(n)1Ew4x^|@%H#gTFy5iK175~(BR*cgCD`4%;T z>=v61dFKe4Nu8BM^e97Y$*}ympchLEE#>H=BQ1qy@-UuNF-slh(2si+n>_d2r)-5#Q7dPjN>MYL#-@ZJ%Tue zH@rv1PyjGo945byoj7KQ{B9BH*Y%KKcKa=otoLV}_ZNXc_%FI`EhXW|61;QajdE9-BKTkwc}_cIwTLFJ#kn$b;{pX)sYPlE zk6sC4r}T*3#CuK$?sX}!r4iIfOR58BU$IS>^wIC)?fb9PYO1lhWy+7d_40yEW7>f8 z-HjvSd@U+Y+-g1AEsyicq8jLSU!9I2=Pjv?A*f2!UbJ?}f#$@bof_tyAQfElYm>|o zZi_Sg;t`o85pN3j336dS(uaHOl9(~Pj~Cc+EQFI~L&wLs7%+|UItIZKJw%>tR6g`! z%LFi+O}_oG_2RrgT{n(2Op|$*#n@i-j-ut$(syJs*lip2*R_Z^NG6)7 z_95fDxTq;gZAnFs+PLh}HTgO8>wzm{YvWeJ-Gercajk|!C3zH z@}li0og%#X>KFO+VZSuCQZto{peOM4R%h4q$R2I2%x;}U6 zymD({^{K}IntiJj=D?mNa0aQ+=kVP?_a!{71e-dXmXpM}_;QUtJ$jf{!~jQWv&`PI zG-V#C6E3tHRk|2tiE?p;Nh`Q7---(&iJvlz5h@X*ha8G^$G7UagtS7U-cDnnOQEri z%>oqn>fKj^KIa)xP7y^uqHIGZJ<4IH59!;tioCblMncUXU6c$z&oC(p8PRhLb(|ChWO5k7ZN(hTy5U18Vuy+F`l06ct;6X)2_a4?iWK9qJK}IU z*QM3oCxFVG9ARuRZvl6sB;L{txK~&y&IJ!pd(z)UsuD(%u^#SiE%Kwubp{M+iG+Sd zGf@P~^mwZ!MO{VJC5Y!RWyP`=xccPRSr#U{kr>v7TMd9fadlkmqR=FkiYmC=&35iyiFhP! zUAsRJ-qp~HcUcc3>o>lQ>yw?l2F&o&z#pS8%Pmb$AJ;Ml%Kp#oEg;wnj@ouh0K07@ zOIzuSu7ib10yN`Emja8u@jfgnf1$wD$&fIWukcGOhP7ye_%df1|| z7N$e}pS^wjjToavX1p@tx0;5P#xQsMy^ZqF@!2%seU15&oI}D*9fAppK9J;}B$y^Z ze4J$MHEN>wmYDW1Ih0!h$0^BK#`S31U@MF%py>Wcgu6A}nMS<%GVjdzi6)UKOcGaX zXv&6Fqi|3z*(MT0^5SgO&CQLtavQ{8nEYj6>Lg4$vk{&?*a}bO5YMAPdfHrNpGR}A zF^by)v`1RiB>_<^*N9bF7n%ty)YC*gYEkuQgu~fi22REcHEuvbA1nshiXk-#aoLYC zbkvHL$|E1{cpGKve|Y7JTg50G!J2n-JuI`fl`bsH=qr)#ASB>XkBn^Zy&CAsut?*> z{`GZH{FOm+rF$G+@#Qy?8Oc&|X(0>80lGZrHGzM(U`XCV9Lq@6NnR=76Q_h&nzPhQ zeS^R?&D?g;^Z2F8vXxeRC5R;>IrAI*#P#Qna996j8cbTX*l!OKHusugda}8vFR zfo7U{ld;xq^19AI5i&SA<*`LyqTd)!o*UN>EK#UxOwUA2I6F>I#(=bN>r5 zmK35K;KubXk}`udRNml_mSkVfi5|(USzpZGs%!3fG&s_Guf9Xpfxg8SNQ=?7U~41X z#5~3X`vm>*`b9pOWW2NN5ow7>aZvV{Dr+RMwt3;rYZgNb3Mm-{!x~#?6}OJTP?=F_ z&d@_;s;jY%a9gwU-m2%06Twz=gG=uGu2$t507rPtbYXy<@ zWUq1xLvjXM=PLEBr5V{MWTli^*9AkEqA3QM8sV4PCY2^tIA2ABUE}BT`BI;8Z*X!sntN5M@tv(OlkgXAY4v^rs*~K4s0||;!PdN< zFycLQJhiIP==uFV|DRg-DUqv|0_U$pONm=r)%g~o?P=uc@J_XVl<`Ob*=S@~|0eam zS+&ZA@)=B7x1x+jd3tprQN^DBTQ#8yMTAmC(wtg)?QyxXFmDX7Ty4{h9T!?#vAtGp zMSHi%!m{WVfzXv|al&67rR}Y=jqI@>Zv`!JL7=S3W@O(YVf6SAZCu{2PzXsFQy5E* zg6x4-*wGYnA(}oV?Efka0HC)$M#7B5evB}P$s3pENQm`^BlLn}`M8%VI&8fe1osMk z#%Z{)vlUB*_YSwHHAXg~h(v^%!Yb2}taT|8MXD6}(4sS7@4FoRh58?~YS5*Oh}gs1 ztpm!JpW*bVtp+tsHH$$m2Tq!1Gu|~R_lr&2Wz#XcFW2fo!S!PE^4p`-R%k5x{4rJ; zQF=Lmik{X2BdLYr9{g53QZ;#GOV;vtjxx~2U_!J_nqAXIt3%bqsC=}U+{%mQ|3>;T zStCvv&7<5Z2v~GW8oTjte|cDM8=nyde_R-E#Sk6BsnZ8Sz6$#mh;Dkf5nTS|j#3$u9E9nVIM zYc*}JA+w`S3O6}t$L%k}W@c!1He4so;meb9ckl*90mUqSwo{(IM^x18TQ8bv-sCgC zPdcz{qDl<7J1d>9r{b*U(HxS{bsP#Fw?w%ApZ@)P_W^0(W^dH0CD=h(4p(&oXi&yNS|O#{{JYJuh&0>KOBs-pYfNRGWe2f&Ok>kaY=4puJAqDP8GP zYdRSwY>5+Q;f~grkMCQ?ENs#EDJms-jg7nQUH2D5bD9%%BJ#OZNq?Uz5mOX{+-YsSM>5

    IYgrYfF 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 Cp?ie@ diff --git a/src/External-Bin/Net/4.0/log4net.xml b/src/External-Bin/Net/4.0/log4net.xml deleted file mode 100644 index de8317a..0000000 --- a/src/External-Bin/Net/4.0/log4net.xml +++ /dev/null @@ -1,30205 +0,0 @@ - - - - log4net - - - -

    - Appender that logs to a database. - - - - appends logging events to a table within a - database. The appender can be configured to specify the connection - string by setting the property. - The connection type (provider) can be specified by setting the - property. For more information on database connection strings for - your specific database see
    http://www.connectionstrings.com/. - - - Records are written into the database either using a prepared - statement or a stored procedure. The property - is set to (System.Data.CommandType.Text) to specify a prepared statement - or to (System.Data.CommandType.StoredProcedure) to specify a stored - procedure. - - - The prepared statement text or the name of the stored procedure - must be set in the property. - - - The prepared statement or stored procedure can take a number - of parameters. Parameters are added using the - method. This adds a single to the - ordered list of parameters. The - type may be subclassed if required to provide database specific - functionality. The specifies - the parameter name, database type, size, and how the value should - be generated using a . - - - - An example of a SQL Server table that could be logged to: - - CREATE TABLE [dbo].[Log] ( - [ID] [int] IDENTITY (1, 1) NOT NULL , - [Date] [datetime] NOT NULL , - [Thread] [varchar] (255) NOT NULL , - [Level] [varchar] (20) NOT NULL , - [Logger] [varchar] (255) NOT NULL , - [Message] [varchar] (4000) NOT NULL - ) ON [PRIMARY] - - - - An example configuration to log to the above table: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Julian Biddle - Nicko Cadell - Gert Driesen - Lance Nehring - - - - Abstract base class implementation of that - buffers events in a fixed size buffer. - - - - This base class should be used by appenders that need to buffer a - number of events before logging them. For example the - buffers events and then submits the entire contents of the buffer to - the underlying database in one go. - - - Subclasses should override the - method to deliver the buffered events. - - The BufferingAppenderSkeleton maintains a fixed size cyclic - buffer of events. The size of the buffer is set using - the property. - - A is used to inspect - each event as it arrives in the appender. If the - triggers, then the current buffer is sent immediately - (see ). Otherwise the event - is stored in the buffer. For example, an evaluator can be used to - deliver the events immediately when an ERROR event arrives. - - - The buffering appender can be configured in a mode. - By default the appender is NOT lossy. When the buffer is full all - the buffered events are sent with . - If the property is set to true then the - buffer will not be sent when it is full, and new events arriving - in the appender will overwrite the oldest event in the buffer. - In lossy mode the buffer will only be sent when the - triggers. This can be useful behavior when you need to know about - ERROR events but not about events with a lower level, configure an - evaluator that will trigger when an ERROR event arrives, the whole - buffer will be sent which gives a history of events leading up to - the ERROR event. - - - Nicko Cadell - Gert Driesen - - - - Abstract base class implementation of . - - - - This class provides the code for common functionality, such - as support for threshold filtering and support for general filters. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface for your own strategies for printing log statements. - - - - Implementors should consider extending the - class which provides a default implementation of this interface. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Log the logging event in Appender specific way. - - The event to log - - - This method is called to log a message into this appender. - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - The name uniquely identifies the appender. - - - - - Interface for appenders that support bulk logging. - - - - This interface extends the interface to - support bulk logging of objects. Appenders - should only implement this interface if they can bulk log efficiently. - - - Nicko Cadell - - - - Log the array of logging events in Appender specific way. - - The events to log - - - This method is called to log an array of events into this appender. - - - - - - Interface used to delay activate a configured object. - - - - This allows an object to defer activation of its options until all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - - If a component implements this interface then the method - must be called by the container after its all the configured properties have been set - and before the component can be used. - - - Nicko Cadell - - - - Activate the options that were previously set with calls to properties. - - - - This allows an object to defer activation of its options until all - options have been set. This is required for components which have - related options that remain ambiguous until all are set. - - - If a component implements this interface then this method must be called - after its properties have been set before the component can be used. - - - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - Default constructor - - - Empty default constructor - - - - - Finalizes this appender by calling the implementation's - method. - - - - If this appender has not been closed then the Finalize method - will call . - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Closes the appender and release resources. - - - - Release any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - This method cannot be overridden by subclasses. This method - delegates the closing of the appender to the - method which must be overridden in the subclass. - - - - - - Performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific - method. - - The event to log. - - - This method cannot be overridden by derived classes. A - derived class should override the method - which is called by this method. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - Calls and checks that - it returns true. - - - - - If all of the above steps succeed then the - will be passed to the abstract method. - - - - - - Performs threshold checks and invokes filters before - delegating actual logging to the subclasses specific - method. - - The array of events to log. - - - This method cannot be overridden by derived classes. A - derived class should override the method - which is called by this method. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - Calls and checks that - it returns true. - - - - - If all of the above steps succeed then the - will be passed to the method. - - - - - - Test if the logging event should we output by this appender - - the event to test - true if the event should be output, false if the event should be ignored - - - This method checks the logging event against the threshold level set - on this appender and also against the filters specified on this - appender. - - - The implementation of this method is as follows: - - - - - - Checks that the severity of the - is greater than or equal to the of this - appender. - - - - Checks that the chain accepts the - . - - - - - - - - - Adds a filter to the end of the filter chain. - - the filter to add to this appender - - - The Filters are organized in a linked list. - - - Setting this property causes the new filter to be pushed onto the - back of the filter chain. - - - - - - Clears the filter list for this appender. - - - - Clears the filter list for this appender. - - - - - - Checks if the message level is below this appender's threshold. - - to test against. - - - If there is no threshold set, then the return value is always true. - - - - true if the meets the - requirements of this appender. - - - - - Is called when the appender is closed. Derived classes should override - this method if resources need to be released. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Subclasses of should implement this method - to perform actual logging. - - The event to append. - - - A subclass must implement this method to perform - logging of the . - - This method will be called by - if all the conditions listed for that method are met. - - - To restrict the logging of events in the appender - override the method. - - - - - - Append a bulk array of logging events. - - the array of logging events - - - This base class implementation calls the - method for each element in the bulk array. - - - A sub class that can better process a bulk array of events should - override this method in addition to . - - - - - - Called before as a precondition. - - - - This method is called by - before the call to the abstract method. - - - This method can be overridden in a subclass to extend the checks - made before the event is passed to the method. - - - A subclass should ensure that they delegate this call to - this base class if it is overridden. - - - true if the call to should proceed. - - - - Renders the to a string. - - The event to render. - The event rendered as a string. - - - Helper method to render a to - a string. This appender must have a - set to render the to - a string. - - If there is exception data in the logging event and - the layout does not process the exception, this method - will append the exception text to the rendered string. - - - Where possible use the alternative version of this method - . - That method streams the rendering onto an existing Writer - which can give better performance if the caller already has - a open and ready for writing. - - - - - - Renders the to a string. - - The event to render. - The TextWriter to write the formatted event to - - - Helper method to render a to - a string. This appender must have a - set to render the to - a string. - - If there is exception data in the logging event and - the layout does not process the exception, this method - will append the exception text to the rendered string. - - - Use this method in preference to - where possible. If, however, the caller needs to render the event - to a string then does - provide an efficient mechanism for doing so. - - - - - - The layout of this appender. - - - See for more information. - - - - - The name of this appender. - - - See for more information. - - - - - The level threshold of this appender. - - - - There is no level threshold filtering by default. - - - See for more information. - - - - - - It is assumed and enforced that errorHandler is never null. - - - - It is assumed and enforced that errorHandler is never null. - - - See for more information. - - - - - - The first filter in the filter chain. - - - - Set to null initially. - - - See for more information. - - - - - - The last filter in the filter chain. - - - See for more information. - - - - - Flag indicating if this appender is closed. - - - See for more information. - - - - - The guard prevents an appender from repeatedly calling its own DoAppend method - - - - - StringWriter used to render events - - - - - The fully qualified type of the AppenderSkeleton class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or sets the threshold of this appender. - - - The threshold of the appender. - - - - All log events with lower level than the threshold level are ignored - by the appender. - - - In configuration files this option is specified by setting the - value of the option to a level - string, such as "DEBUG", "INFO" and so on. - - - - - - Gets or sets the for this appender. - - The of the appender - - - The provides a default - implementation for the property. - - - - - - The filter chain. - - The head of the filter chain filter chain. - - - Returns the head Filter. The Filters are organized in a linked list - and so all Filters on this Appender are available through the result. - - - - - - Gets or sets the for this appender. - - The layout of the appender. - - - See for more information. - - - - - - - Gets or sets the name of this appender. - - The name of the appender. - - - The name uniquely identifies the appender. - - - - - - Tests if this appender requires a to be set. - - - - In the rather exceptional case, where the appender - implementation admits a layout but can also work without it, - then the appender should return true. - - - This default implementation always returns false. - - - - true if the appender requires a layout object, otherwise false. - - - - - The default buffer size. - - - The default size of the cyclic buffer used to store events. - This is set to 512 by default. - - - - - Initializes a new instance of the class. - - - - Protected default constructor to allow subclassing. - - - - - - Initializes a new instance of the class. - - the events passed through this appender must be - fixed by the time that they arrive in the derived class' SendBuffer method. - - - Protected constructor to allow subclassing. - - - The should be set if the subclass - expects the events delivered to be fixed even if the - is set to zero, i.e. when no buffering occurs. - - - - - - Flush the currently buffered events - - - - Flushes any events that have been buffered. - - - If the appender is buffering in mode then the contents - of the buffer will NOT be flushed to the appender. - - - - - - Flush the currently buffered events - - set to true to flush the buffer of lossy events - - - Flushes events that have been buffered. If is - false then events will only be flushed if this buffer is non-lossy mode. - - - If the appender is buffering in mode then the contents - of the buffer will only be flushed if is true. - In this case the contents of the buffer will be tested against the - and if triggering will be output. All other buffered - events will be discarded. - - - If is true then the buffer will always - be emptied by calling this method. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Close this appender instance. - - - - Close this appender instance. If this appender is marked - as not then the remaining events in - the buffer must be sent when the appender is closed. - - - - - - This method is called by the method. - - the event to log - - - Stores the in the cyclic buffer. - - - The buffer will be sent (i.e. passed to the - method) if one of the following conditions is met: - - - - The cyclic buffer is full and this appender is - marked as not lossy (see ) - - - An is set and - it is triggered for the - specified. - - - - Before the event is stored in the buffer it is fixed - (see ) to ensure that - any data referenced by the event will be valid when the buffer - is processed. - - - - - - Sends the contents of the buffer. - - The first logging event. - The buffer containing the events that need to be send. - - - The subclass must override . - - - - - - Sends the events. - - The events that need to be send. - - - The subclass must override this method to process the buffered events. - - - - - - The size of the cyclic buffer used to hold the logging events. - - - Set to by default. - - - - - The cyclic buffer used to store the logging events. - - - - - The triggering event evaluator that causes the buffer to be sent immediately. - - - The object that is used to determine if an event causes the entire - buffer to be sent immediately. This field can be null, which - indicates that event triggering is not to be done. The evaluator - can be set using the property. If this appender - has the ( property) set to - true then an must be set. - - - - - Indicates if the appender should overwrite events in the cyclic buffer - when it becomes full, or if the buffer should be flushed when the - buffer is full. - - - If this field is set to true then an must - be set. - - - - - The triggering event evaluator filters discarded events. - - - The object that is used to determine if an event that is discarded should - really be discarded or if it should be sent to the appenders. - This field can be null, which indicates that all discarded events will - be discarded. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - The events delivered to the subclass must be fixed. - - - - - Gets or sets a value that indicates whether the appender is lossy. - - - true if the appender is lossy, otherwise false. The default is false. - - - - This appender uses a buffer to store logging events before - delivering them. A triggering event causes the whole buffer - to be send to the remote sink. If the buffer overruns before - a triggering event then logging events could be lost. Set - to false to prevent logging events - from being lost. - - If is set to true then an - must be specified. - - - - - Gets or sets the size of the cyclic buffer used to hold the - logging events. - - - The size of the cyclic buffer used to hold the logging events. - - - - The option takes a positive integer - representing the maximum number of logging events to collect in - a cyclic buffer. When the is reached, - oldest events are deleted as new events are added to the - buffer. By default the size of the cyclic buffer is 512 events. - - - If the is set to a value less than - or equal to 1 then no buffering will occur. The logging event - will be delivered synchronously (depending on the - and properties). Otherwise the event will - be buffered. - - - - - - Gets or sets the that causes the - buffer to be sent immediately. - - - The that causes the buffer to be - sent immediately. - - - - The evaluator will be called for each event that is appended to this - appender. If the evaluator triggers then the current buffer will - immediately be sent (see ). - - If is set to true then an - must be specified. - - - - - Gets or sets the value of the to use. - - - The value of the to use. - - - - The evaluator will be called for each event that is discarded from this - appender. If the evaluator triggers then the current buffer will immediately - be sent (see ). - - - - - - Gets or sets a value indicating if only part of the logging event data - should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the - event data to be fixed and serialized. This will improve performance. - - - See for more information. - - - - - - Gets or sets a the fields that will be fixed in the event - - - The event fields that will be fixed before the event is buffered - - - - The logging event needs to have certain thread specific values - captured before it can be buffered. See - for details. - - - - - - - Initializes a new instance of the class. - - - Public default constructor to initialize a new instance of this class. - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Override the parent method to close the database - - - - Closes the database command and database connection. - - - - - - Inserts the events into the database. - - The events to insert into the database. - - - Insert all the events specified in the - array into the database. - - - - - - Adds a parameter to the command. - - The parameter to add to the command. - - - Adds a parameter to the ordered list of command parameters. - - - - - - Writes the events to the database using the transaction specified. - - The transaction that the events will be executed under. - The array of events to insert into the database. - - - The transaction argument can be null if the appender has been - configured not to use transactions. See - property for more information. - - - - - - Formats the log message into database statement text. - - The event being logged. - - This method can be overridden by subclasses to provide - more control over the format of the database statement. - - - Text that can be passed to a . - - - - - Creates an instance used to connect to the database. - - - This method is called whenever a new IDbConnection is needed (i.e. when a reconnect is necessary). - - The of the object. - The connectionString output from the ResolveConnectionString method. - An instance with a valid connection string. - - - - Resolves the connection string from the ConnectionString, ConnectionStringName, or AppSettingsKey - property. - - - ConnectiongStringName is only supported on .NET 2.0 and higher. - - Additional information describing the connection string. - A connection string used to connect to the database. - - - - Retrieves the class type of the ADO.NET provider. - - - - Gets the Type of the ADO.NET provider to use to connect to the - database. This method resolves the type specified in the - property. - - - Subclasses can override this method to return a different type - if necessary. - - - The of the ADO.NET provider - - - - Prepares the database command and initialize the parameters. - - - - - Connects to the database. - - - - - Cleanup the existing command. - - - If true, a message will be written using LogLog.Warn if an exception is encountered when calling Dispose. - - - - - Cleanup the existing connection. - - - Calls the IDbConnection's method. - - - - - Flag to indicate if we are using a command object - - - - Set to true when the appender is to use a prepared - statement or stored procedure to insert into the database. - - - - - - The list of objects. - - - - The list of objects. - - - - - - The security context to use for privileged calls - - - - - The that will be used - to insert logging events into a database. - - - - - The database command. - - - - - Database connection string. - - - - - The appSettings key from App.Config that contains the connection string. - - - - - The connectionStrings key from App.Config that contains the connection string. - - - - - String type name of the type name. - - - - - The text of the command. - - - - - The command type. - - - - - Indicates whether to use transactions when writing to the database. - - - - - Indicates whether to use transactions when writing to the database. - - - - - The fully qualified type of the AdoNetAppender class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or sets the database connection string that is used to connect to - the database. - - - The database connection string used to connect to the database. - - - - The connections string is specific to the connection type. - See for more information. - - - Connection string for MS Access via ODBC: - "DSN=MS Access Database;UID=admin;PWD=;SystemDB=C:\data\System.mdw;SafeTransactions = 0;FIL=MS Access;DriverID = 25;DBQ=C:\data\train33.mdb" - - Another connection string for MS Access via ODBC: - "Driver={Microsoft Access Driver (*.mdb)};DBQ=C:\Work\cvs_root\log4net-1.2\access.mdb;UID=;PWD=;" - - Connection string for MS Access via OLE DB: - "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Work\cvs_root\log4net-1.2\access.mdb;User Id=;Password=;" - - - - - The appSettings key from App.Config that contains the connection string. - - - - - The connectionStrings key from App.Config that contains the connection string. - - - This property requires at least .NET 2.0. - - - - - Gets or sets the type name of the connection - that should be created. - - - The type name of the connection. - - - - The type name of the ADO.NET provider to use. - - - The default is to use the OLE DB provider. - - - Use the OLE DB Provider. This is the default value. - System.Data.OleDb.OleDbConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the MS SQL Server Provider. - System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Use the ODBC Provider. - Microsoft.Data.Odbc.OdbcConnection,Microsoft.Data.Odbc,version=1.0.3300.0,publicKeyToken=b77a5c561934e089,culture=neutral - This is an optional package that you can download from - http://msdn.microsoft.com/downloads - search for ODBC .NET Data Provider. - - Use the Oracle Provider. - System.Data.OracleClient.OracleConnection, System.Data.OracleClient, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - This is an optional package that you can download from - http://msdn.microsoft.com/downloads - search for .NET Managed Provider for Oracle. - - - - - Gets or sets the command text that is used to insert logging events - into the database. - - - The command text used to insert logging events into the database. - - - - Either the text of the prepared statement or the - name of the stored procedure to execute to write into - the database. - - - The property determines if - this text is a prepared statement or a stored procedure. - - - - - - Gets or sets the command type to execute. - - - The command type to execute. - - - - This value may be either (System.Data.CommandType.Text) to specify - that the is a prepared statement to execute, - or (System.Data.CommandType.StoredProcedure) to specify that the - property is the name of a stored procedure - to execute. - - - The default value is (System.Data.CommandType.Text). - - - - - - Should transactions be used to insert logging events in the database. - - - true if transactions should be used to insert logging events in - the database, otherwise false. The default value is true. - - - - Gets or sets a value that indicates whether transactions should be used - to insert logging events in the database. - - - When set a single transaction will be used to insert the buffered events - into the database. Otherwise each event will be inserted without using - an explicit transaction. - - - - - - Gets or sets the used to call the NetSend method. - - - The used to call the NetSend method. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - Should this appender try to reconnect to the database on error. - - - true if the appender should try to reconnect to the database after an - error has occurred, otherwise false. The default value is false, - i.e. not to try to reconnect. - - - - The default behaviour is for the appender not to try to reconnect to the - database if an error occurs. Subsequent logging events are discarded. - - - To force the appender to attempt to reconnect to the database set this - property to true. - - - When the appender attempts to connect to the database there may be a - delay of up to the connection timeout specified in the connection string. - This delay will block the calling application's thread. - Until the connection can be reestablished this potential delay may occur multiple times. - - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to insert - logging events into a database. Classes deriving from - can use this property to get or set this . Use the - underlying returned from if - you require access beyond that which provides. - - - - - Parameter type used by the . - - - - This class provides the basic database parameter properties - as defined by the interface. - - This type can be subclassed to provide database specific - functionality. The two methods that are called externally are - and . - - - - - - Initializes a new instance of the class. - - - Default constructor for the AdoNetAppenderParameter class. - - - - - Prepare the specified database command object. - - The command to prepare. - - - Prepares the database command object by adding - this parameter to its collection of parameters. - - - - - - Renders the logging event and set the parameter value in the command. - - The command containing the parameter. - The event to be rendered. - - - Renders the logging event using this parameters layout - object. Sets the value of the parameter on the command object. - - - - - - The name of this parameter. - - - - - The database type for this parameter. - - - - - Flag to infer type rather than use the DbType - - - - - The precision for this parameter. - - - - - The scale for this parameter. - - - - - The size for this parameter. - - - - - The to use to render the - logging event into an object for this parameter. - - - - - Gets or sets the name of this parameter. - - - The name of this parameter. - - - - The name of this parameter. The parameter name - must match up to a named parameter to the SQL stored procedure - or prepared statement. - - - - - - Gets or sets the database type for this parameter. - - - The database type for this parameter. - - - - The database type for this parameter. This property should - be set to the database type from the - enumeration. See . - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the type from the value. - - - - - - - Gets or sets the precision for this parameter. - - - The precision for this parameter. - - - - The maximum number of digits used to represent the Value. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the precision from the value. - - - - - - - Gets or sets the scale for this parameter. - - - The scale for this parameter. - - - - The number of decimal places to which Value is resolved. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the scale from the value. - - - - - - - Gets or sets the size for this parameter. - - - The size for this parameter. - - - - The maximum size, in bytes, of the data within the column. - - - This property is optional. If not specified the ADO.NET provider - will attempt to infer the size from the value. - - - - - - - Gets or sets the to use to - render the logging event into an object for this - parameter. - - - The used to render the - logging event into an object for this parameter. - - - - The that renders the value for this - parameter. - - - The can be used to adapt - any into a - for use in the property. - - - - - - Appends logging events to the terminal using ANSI color escape sequences. - - - - AnsiColorTerminalAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. It also allows the color of a specific level of message to be set. - - - This appender expects the terminal to understand the VT100 control set - in order to interpret the color codes. If the terminal or console does not - understand the control codes the behavior is not defined. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes each message to the System.Console.Out or - System.Console.Error that is set at the time the event is appended. - Therefore it is possible to programmatically redirect the output of this appender - (for example NUnit does this to capture program output). While this is the desired - behavior of this appender it may have security implications in your application. - - - When configuring the ANSI colored terminal appender, a mapping should be - specified to map a logging level to a color. For example: - - - - - - - - - - - - - - - The Level is the standard log4net logging level and ForeColor and BackColor can be any - of the following values: - - Blue - Green - Red - White - Yellow - Purple - Cyan - - These color values cannot be combined together to make new colors. - - - The attributes can be any combination of the following: - - Brightforeground is brighter - Dimforeground is dimmer - Underscoremessage is underlined - Blinkforeground is blinking (does not work on all terminals) - Reverseforeground and background are reversed - Hiddenoutput is hidden - Strikethroughmessage has a line through it - - While any of these attributes may be combined together not all combinations - work well together, for example setting both Bright and Dim attributes makes - no sense. - - - Patrick Wagstrom - Nicko Cadell - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Ansi code to reset terminal - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Add a mapping of level to color - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the foreground and background colours - for a level. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to color mappings set on this appender. - - - - - - Flag to write output to the error stream rather than the standard output stream - - - - - Mapping from level object to color value - - - - - Target is the value of the console output stream. - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - The enum of possible display attributes - - - - The following flags can be combined together to - form the ANSI color attributes. - - - - - - - text is bright - - - - - text is dim - - - - - text is underlined - - - - - text is blinking - - - Not all terminals support this attribute - - - - - text and background colors are reversed - - - - - text is hidden - - - - - text is displayed with a strikethrough - - - - - The enum of possible foreground or background color values for - use with the color mapping method - - - - The output can be in one for the following ANSI colors. - - - - - - - color is black - - - - - color is red - - - - - color is green - - - - - color is yellow - - - - - color is blue - - - - - color is magenta - - - - - color is cyan - - - - - color is white - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and the color it should be displayed in. - - - - - - An entry in the - - - - This is an abstract base class for types that are stored in the - object. - - - Nicko Cadell - - - - Default protected constructor - - - - Default protected constructor - - - - - - Initialize any options defined on this entry - - - - Should be overridden by any classes that need to initialise based on their options - - - - - - The level that is the key for this mapping - - - The that is the key for this mapping - - - - Get or set the that is the key for this - mapping subclass. - - - - - - Initialize the options for the object - - - - Combine the and together - and append the attributes. - - - - - - The mapped foreground color for the specified level - - - - Required property. - The mapped foreground color for the specified level - - - - - - The mapped background color for the specified level - - - - Required property. - The mapped background color for the specified level - - - - - - The color attributes for the specified level - - - - Required property. - The color attributes for the specified level - - - - - - The combined , and - suitable for setting the ansi terminal color. - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a AppenderCollection instance. - - list to create a readonly wrapper arround - - An AppenderCollection wrapper that is read-only. - - - - - An empty readonly static AppenderCollection - - - - - Initializes a new instance of the AppenderCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the AppenderCollection class - that has the specified initial capacity. - - - The number of elements that the new AppenderCollection is initially capable of storing. - - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified AppenderCollection. - - The AppenderCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the AppenderCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - - Copies the entire AppenderCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire AppenderCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the AppenderCollection. - - The to be added to the end of the AppenderCollection. - The index at which the value has been added. - - - - Removes all elements from the AppenderCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the AppenderCollection. - - The to check for. - true if is found in the AppenderCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the AppenderCollection. - - The to locate in the AppenderCollection. - - The zero-based index of the first occurrence of - in the entire AppenderCollection, if found; otherwise, -1. - - - - - Inserts an element into the AppenderCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the AppenderCollection. - - The to remove from the AppenderCollection. - - The specified was not found in the AppenderCollection. - - - - - Removes the element at the specified index of the AppenderCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the AppenderCollection. - - An for the entire AppenderCollection. - - - - Adds the elements of another AppenderCollection to the current AppenderCollection. - - The AppenderCollection whose elements should be added to the end of the current AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a array to the current AppenderCollection. - - The array whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Adds the elements of a collection to the current AppenderCollection. - - The collection whose elements should be added to the end of the AppenderCollection. - The new of the AppenderCollection. - - - - Sets the capacity to the actual number of elements. - - - - - Return the collection elements as an array - - the array - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the AppenderCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the AppenderCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - - A value - - - - - Supports simple iteration over a . - - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - - - - - Appends log events to the ASP.NET system. - - - - - Diagnostic information and tracing messages that you specify are appended to the output - of the page that is sent to the requesting browser. Optionally, you can view this information - from a separate trace viewer (Trace.axd) that displays trace information for every page in a - given application. - - - Trace statements are processed and displayed only when tracing is enabled. You can control - whether tracing is displayed to a page, to the trace viewer, or both. - - - The logging event is passed to the or - method depending on the level of the logging event. - The event's logger name is the default value for the category parameter of the Write/Warn method. - - - Nicko Cadell - Gert Driesen - Ron Grabowski - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Write the logging event to the ASP.NET trace - - the event to log - - - Write the logging event to the ASP.NET trace - HttpContext.Current.Trace - (). - - - - - - Defaults to %logger - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - The category parameter sent to the Trace method. - - - - Defaults to %logger which will use the logger name of the current - as the category parameter. - - - - - - - - Buffers events and then forwards them to attached appenders. - - - - The events are buffered in this appender until conditions are - met to allow the appender to deliver the events to the attached - appenders. See for the - conditions that cause the buffer to be sent. - - The forwarding appender can be used to specify different - thresholds and filters for the same appender at different locations - within the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Interface for attaching appenders to objects. - - - - Interface for attaching, removing and retrieving appenders. - - - Nicko Cadell - Gert Driesen - - - - Attaches an appender. - - The appender to add. - - - Add the specified appender. The implementation may - choose to allow or deny duplicate appenders. - - - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - Returns an attached appender with the specified. - If no appender with the specified name is found null will be - returned. - - - - - - Removes all attached appenders. - - - - Removes and closes all attached appenders - - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Gets all attached appenders. - - - A collection of attached appenders. - - - - Gets a collection of attached appenders. - If there are no attached appenders the - implementation should return an empty - collection rather than null. - - - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Send the events. - - The events that need to be send. - - - Forwards the events to the attached appenders. - - - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - Get the named appender attached to this buffering appender. - - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Appends logging events to the console. - - - - ColoredConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. It also allows the color of a specific type of message to be set. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes directly to the application's attached console - not to the System.Console.Out or System.Console.Error TextWriter. - The System.Console.Out and System.Console.Error streams can be - programmatically redirected (for example NUnit does this to capture program output). - This appender will ignore these redirections because it needs to use Win32 - API calls to colorize the output. To respect these redirections the - must be used. - - - When configuring the colored console appender, mapping should be - specified to map a logging level to a color. For example: - - - - - - - - - - - - - - The Level is the standard log4net logging level and ForeColor and BackColor can be any - combination of the following values: - - Blue - Green - Red - White - Yellow - Purple - Cyan - HighIntensity - - - - Rick Hobbs - Nicko Cadell - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - Add a mapping of level to color - done by the config file - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the foreground and background colors - for a level. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to color mappings set on this appender. - - - - - - Flag to write output to the error stream rather than the standard output stream - - - - - Mapping from level object to color value - - - - - The console output stream writer to write to - - - - This writer is not thread safe. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - The enum of possible color values for use with the color mapping method - - - - The following flags can be combined together to - form the colors. - - - - - - - color is blue - - - - - color is green - - - - - color is red - - - - - color is white - - - - - color is yellow - - - - - color is purple - - - - - color is cyan - - - - - color is intensified - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and the color it should be displayed in. - - - - - - Initialize the options for the object - - - - Combine the and together. - - - - - - The mapped foreground color for the specified level - - - - Required property. - The mapped foreground color for the specified level. - - - - - - The mapped background color for the specified level - - - - Required property. - The mapped background color for the specified level. - - - - - - The combined and suitable for - setting the console color. - - - - - Appends logging events to the console. - - - - ConsoleAppender appends log events to the standard output stream - or the error output stream using a layout specified by the - user. - - - By default, all output is written to the console's standard output stream. - The property can be set to direct the output to the - error stream. - - - NOTE: This appender writes each message to the System.Console.Out or - System.Console.Error that is set at the time the event is appended. - Therefore it is possible to programmatically redirect the output of this appender - (for example NUnit does this to capture program output). While this is the desired - behavior of this appender it may have security implications in your application. - - - Nicko Cadell - Gert Driesen - - - - The to use when writing to the Console - standard output stream. - - - - The to use when writing to the Console - standard output stream. - - - - - - The to use when writing to the Console - standard error output stream. - - - - The to use when writing to the Console - standard error output stream. - - - - - - Initializes a new instance of the class. - - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - - The instance of the class is set up to write - to the standard output stream. - - - - - Initializes a new instance of the class - with the specified layout. - - the layout to use for this appender - flag set to true to write to the console error stream - - When is set to true, output is written to - the standard error output stream. Otherwise, output is written to the standard - output stream. - - - - - This method is called by the method. - - The event to log. - - - Writes the event to the console. - - - The format of the output will depend on the appender's layout. - - - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - Target is the value of the console output stream. - This is either "Console.Out" or "Console.Error". - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appends log events to the system. - - - - The application configuration file can be used to control what listeners - are actually used. See the MSDN documentation for the - class for details on configuring the - debug system. - - - Events are written using the - method. The event's logger name is passed as the value for the category name to the Write method. - - - Nicko Cadell - - - - Initializes a new instance of the . - - - - Default constructor. - - - - - - Initializes a new instance of the - with a specified layout. - - The layout to use with this appender. - - - Obsolete constructor. - - - - - - Writes the logging event to the system. - - The event to log. - - - Writes the logging event to the system. - If is true then the - is called. - - - - - - Immediate flush means that the underlying writer or output stream - will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logs events are not actually written to persistent media if and - when the application crashes. - - - The default value is true. - - - - - Gets or sets a value that indicates whether the appender will - flush at the end of each write. - - - The default behavior is to flush at the end of each - write. If the option is set tofalse, then the underlying - stream can defer writing to physical medium to a later time. - - - Avoiding the flush operation at the end of each append results - in a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Writes events to the system event log. - - - - The appender will fail if you try to write using an event source that doesn't exist unless it is running with local administrator privileges. - See also http://logging.apache.org/log4net/release/faq.html#trouble-EventLog - - - The EventID of the event log entry can be - set using the EventID property () - on the . - - - The Category of the event log entry can be - set using the Category property () - on the . - - - There is a limit of 32K characters for an event log message - - - When configuring the EventLogAppender a mapping can be - specified to map a logging level to an event log entry type. For example: - - - <mapping> - <level value="ERROR" /> - <eventLogEntryType value="Error" /> - </mapping> - <mapping> - <level value="DEBUG" /> - <eventLogEntryType value="Information" /> - </mapping> - - - The Level is the standard log4net logging level and eventLogEntryType can be any value - from the enum, i.e.: - - Erroran error event - Warninga warning event - Informationan informational event - - - - Aspi Havewala - Douglas de la Torre - Nicko Cadell - Gert Driesen - Thomas Voss - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initializes a new instance of the class - with the specified . - - The to use with this appender. - - - Obsolete constructor. - - - - - - Add a mapping of level to - done by the config file - - The mapping to add - - - Add a mapping to this appender. - Each mapping defines the event log entry type for a level. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Create an event log source - - - Uses different API calls under NET_2_0 - - - - - This method is called by the - method. - - the event to log - - Writes the event to the system event log using the - . - - If the event has an EventID property (see ) - set then this integer will be used as the event log event id. - - - There is a limit of 32K characters for an event log message - - - - - - Get the equivalent for a - - the Level to convert to an EventLogEntryType - The equivalent for a - - Because there are fewer applicable - values to use in logging levels than there are in the - this is a one way mapping. There is - a loss of information during the conversion. - - - - - The log name is the section in the event logs where the messages - are stored. - - - - - Name of the application to use when logging. This appears in the - application column of the event log named by . - - - - - The name of the machine which holds the event log. This is - currently only allowed to be '.' i.e. the current machine. - - - - - Mapping from level object to EventLogEntryType - - - - - The security context to use for privileged calls - - - - - The event ID to use unless one is explicitly specified via the LoggingEvent's properties. - - - - - The event category to use unless one is explicitly specified via the LoggingEvent's properties. - - - - - The fully qualified type of the EventLogAppender class. - - - Used by the internal logger to record the Type of the - log message. - - - - - The name of the log where messages will be stored. - - - The string name of the log where messages will be stored. - - - This is the name of the log as it appears in the Event Viewer - tree. The default value is to log into the Application - log, this is where most applications write their events. However - if you need a separate log for your application (or applications) - then you should set the appropriately. - This should not be used to distinguish your event log messages - from those of other applications, the - property should be used to distinguish events. This property should be - used to group together events into a single log. - - - - - - Property used to set the Application name. This appears in the - event logs when logging. - - - The string used to distinguish events from different sources. - - - Sets the event log source property. - - - - - This property is used to return the name of the computer to use - when accessing the event logs. Currently, this is the current - computer, denoted by a dot "." - - - The string name of the machine holding the event log that - will be logged into. - - - This property cannot be changed. It is currently set to '.' - i.e. the local machine. This may be changed in future. - - - - - Gets or sets the used to write to the EventLog. - - - The used to write to the EventLog. - - - - The system security context used to write to the EventLog. - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - Gets or sets the EventId to use unless one is explicitly specified via the LoggingEvent's properties. - - - - The EventID of the event log entry will normally be - set using the EventID property () - on the . - This property provides the fallback value which defaults to 0. - - - - - - Gets or sets the Category to use unless one is explicitly specified via the LoggingEvent's properties. - - - - The Category of the event log entry will normally be - set using the Category property () - on the . - This property provides the fallback value which defaults to 0. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - A class to act as a mapping between the level that a logging call is made at and - the color it should be displayed as. - - - - Defines the mapping between a level and its event log entry type. - - - - - - The for this entry - - - - Required property. - The for this entry - - - - - - Appends logging events to a file. - - - - Logging events are sent to the file specified by - the property. - - - The file can be opened in either append or overwrite mode - by specifying the property. - If the file path is relative it is taken as relative from - the application base directory. The file encoding can be - specified by setting the property. - - - The layout's and - values will be written each time the file is opened and closed - respectively. If the property is - then the file may contain multiple copies of the header and footer. - - - This appender will first try to open the file for writing when - is called. This will typically be during configuration. - If the file cannot be opened for writing the appender will attempt - to open the file again each time a message is logged to the appender. - If the file cannot be opened for writing when a message is logged then - the message will be discarded by this appender. - - - The supports pluggable file locking models via - the property. - The default behavior, implemented by - is to obtain an exclusive write lock on the file until this appender is closed. - The alternative models only hold a - write lock while the appender is writing a logging event () - or synchronize by using a named system wide Mutex (). - - - All locking strategies have issues and you should seriously consider using a different strategy that - avoids having multiple processes logging to the same file. - - - Nicko Cadell - Gert Driesen - Rodrigo B. de Oliveira - Douglas de la Torre - Niall Daley - - - - Sends logging events to a . - - - - An Appender that writes to a . - - - This appender may be used stand alone if initialized with an appropriate - writer, however it is typically used as a base class for an appender that - can open a to write to. - - - Nicko Cadell - Gert Driesen - Douglas de la Torre - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initializes a new instance of the class and - sets the output destination to a new initialized - with the specified . - - The layout to use with this appender. - The to output to. - - - Obsolete constructor. - - - - - - Initializes a new instance of the class and sets - the output destination to the specified . - - The layout to use with this appender - The to output to - - The must have been previously opened. - - - - Obsolete constructor. - - - - - - This method determines if there is a sense in attempting to append. - - - - This method checks if an output target has been set and if a - layout has been set. - - - false if any of the preconditions fail. - - - - This method is called by the - method. - - The event to log. - - - Writes a log statement to the output stream if the output stream exists - and is writable. - - - The format of the output will depend on the appender's layout. - - - - - - This method is called by the - method. - - The array of events to log. - - - This method writes all the bulk logged events to the output writer - before flushing the stream. - - - - - - Close this appender instance. The underlying stream or writer is also closed. - - - Closed appenders cannot be reused. - - - - - Writes the footer and closes the underlying . - - - - Writes the footer and closes the underlying . - - - - - - Closes the underlying . - - - - Closes the underlying . - - - - - - Clears internal references to the underlying - and other variables. - - - - Subclasses can override this method for an alternate closing behavior. - - - - - - Writes a footer as produced by the embedded layout's property. - - - - Writes a footer as produced by the embedded layout's property. - - - - - - Writes a header produced by the embedded layout's property. - - - - Writes a header produced by the embedded layout's property. - - - - - - Called to allow a subclass to lazily initialize the writer - - - - This method is called when an event is logged and the or - have not been set. This allows a subclass to - attempt to initialize the writer multiple times. - - - - - - This is the where logging events - will be written to. - - - - - Immediate flush means that the underlying - or output stream will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logging events are not actually persisted if and when the application - crashes. - - - The default value is true. - - - - - - The fully qualified type of the TextWriterAppender class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or set whether the appender will flush at the end - of each append operation. - - - - The default behavior is to flush at the end of each - append operation. - - - If this option is set to false, then the underlying - stream can defer persisting the logging event to a later - time. - - - - Avoiding the flush operation at the end of each append results in - a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - Sets the where the log output will go. - - - - The specified must be open and writable. - - - The will be closed when the appender - instance is closed. - - - Note: Logging to an unopened will fail. - - - - - - Gets or set the and the underlying - , if any, for this appender. - - - The for this appender. - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Gets or sets the where logging events - will be written to. - - - The where logging events are written. - - - - This is the where logging events - will be written to. - - - - - - Default constructor - - - - Default constructor - - - - - - Construct a new appender using the layout, file and append mode. - - the layout to use with this appender - the full path to the file to write to - flag to indicate if the file should be appended to - - - Obsolete constructor. - - - - - - Construct a new appender using the layout and file specified. - The file will be appended to. - - the layout to use with this appender - the full path to the file to write to - - - Obsolete constructor. - - - - - - Activate the options on the file appender. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - This will cause the file to be opened. - - - - - - Closes any previously opened file and calls the parent's . - - - - Resets the filename and the file stream. - - - - - - Called to initialize the file writer - - - - Will be called for each logged message until the file is - successfully opened. - - - - - - This method is called by the - method. - - The event to log. - - - Writes a log statement to the output stream if the output stream exists - and is writable. - - - The format of the output will depend on the appender's layout. - - - - - - This method is called by the - method. - - The array of events to log. - - - Acquires the output file locks once before writing all the events to - the stream. - - - - - - Writes a footer as produced by the embedded layout's property. - - - - Writes a footer as produced by the embedded layout's property. - - - - - - Writes a header produced by the embedded layout's property. - - - - Writes a header produced by the embedded layout's property. - - - - - - Closes the underlying . - - - - Closes the underlying . - - - - - - Closes the previously opened file. - - - - Writes the to the file and then - closes the file. - - - - - - Sets and opens the file where the log output will go. The specified file must be writable. - - The path to the log file. Must be a fully qualified path. - If true will append to fileName. Otherwise will truncate fileName - - - Calls but guarantees not to throw an exception. - Errors are passed to the . - - - - - - Sets and opens the file where the log output will go. The specified file must be writable. - - The path to the log file. Must be a fully qualified path. - If true will append to fileName. Otherwise will truncate fileName - - - If there was already an opened file, then the previous file - is closed first. - - - This method will ensure that the directory structure - for the specified exists. - - - - - - Sets the quiet writer used for file output - - the file stream that has been opened for writing - - - This implementation of creates a - over the and passes it to the - method. - - - This method can be overridden by sub classes that want to wrap the - in some way, for example to encrypt the output - data using a System.Security.Cryptography.CryptoStream. - - - - - - Sets the quiet writer being used. - - the writer over the file stream that has been opened for writing - - - This method can be overridden by sub classes that want to - wrap the in some way. - - - - - - Convert a path into a fully qualified path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - - - - Flag to indicate if we should append to the file - or overwrite the file. The default is to append. - - - - - The name of the log file. - - - - - The encoding to use for the file stream. - - - - - The security context to use for privileged calls - - - - - The stream to log to. Has added locking semantics - - - - - The locking model to use - - - - - The fully qualified type of the FileAppender class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or sets the path to the file that logging will be written to. - - - The path to the file that logging will be written to. - - - - If the path is relative it is taken as relative from - the application base directory. - - - - - - Gets or sets a flag that indicates whether the file should be - appended to or overwritten. - - - Indicates whether the file should be appended to or overwritten. - - - - If the value is set to false then the file will be overwritten, if - it is set to true then the file will be appended to. - - The default value is true. - - - - - Gets or sets used to write to the file. - - - The used to write to the file. - - - - The default encoding set is - which is the encoding for the system's current ANSI code page. - - - - - - Gets or sets the used to write to the file. - - - The used to write to the file. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - Gets or sets the used to handle locking of the file. - - - The used to lock the file. - - - - Gets or sets the used to handle locking of the file. - - - There are three built in locking models, , and . - The first locks the file from the start of logging to the end, the - second locks only for the minimal amount of time when logging each message - and the last synchronizes processes using a named system wide Mutex. - - - The default locking model is the . - - - - - - Write only that uses the - to manage access to an underlying resource. - - - - - True asynchronous writes are not supported, the implementation forces a synchronous write. - - - - - Exception base type for log4net. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - A message to include with the exception. - - - Initializes a new instance of the class with - the specified message. - - - - - - Constructor - - A message to include with the exception. - A nested exception to include. - - - Initializes a new instance of the class - with the specified message and inner exception. - - - - - - Serialization constructor - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Locking model base class - - - - Base class for the locking models available to the derived loggers. - - - - - - Open the output file - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Acquire the lock on the file in preparation for writing to it. - Return a stream pointing to the file. - must be called to release the lock on the output file. - - - - - - Release the lock on the file - - - - Release the lock on the file. No further writes will be made to the - stream until is called again. - - - - - - Helper method that creates a FileStream under CurrentAppender's SecurityContext. - - - - Typically called during OpenFile or AcquireLock. - - - If the directory portion of the does not exist, it is created - via Directory.CreateDirecctory. - - - - - - - - - - Helper method to close under CurrentAppender's SecurityContext. - - - Does not set to null. - - - - - - Gets or sets the for this LockingModel - - - The for this LockingModel - - - - The file appender this locking model is attached to and working on - behalf of. - - - The file appender is used to locate the security context and the error handler to use. - - - The value of this property will be set before is - called. - - - - - - Hold an exclusive lock on the output file - - - - Open the file once for writing and hold it open until is called. - Maintains an exclusive lock on the file during this time. - - - - - - Open the file specified and prepare for logging. - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Does nothing. The lock is already taken - - - - - - Release the lock on the file - - - - Does nothing. The lock will be released when the file is closed. - - - - - - Acquires the file lock for each write - - - - Opens the file once for each / cycle, - thus holding the lock for the minimal amount of time. This method of locking - is considerably slower than but allows - other processes to move/delete the log file whilst logging continues. - - - - - - Prepares to open the file when the first message is logged. - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Acquire the lock on the file in preparation for writing to it. - Return a stream pointing to the file. - must be called to release the lock on the output file. - - - - - - Release the lock on the file - - - - Release the lock on the file. No further writes will be made to the - stream until is called again. - - - - - - Provides cross-process file locking. - - Ron Grabowski - Steve Wranovsky - - - - Open the file specified and prepare for logging. - - The filename to use - Whether to append to the file, or overwrite - The encoding to use - - - Open the file specified and prepare for logging. - No writes will be made until is called. - Must be called before any calls to , - - and . - - - - - - Close the file - - - - Close the file. No further writes will be made. - - - - - - Acquire the lock on the file - - A stream that is ready to be written to. - - - Does nothing. The lock is already taken - - - - - - - - - - - This appender forwards logging events to attached appenders. - - - - The forwarding appender can be used to specify different thresholds - and filters for the same appender at different locations within the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Closes the appender and releases resources. - - - - Releases any resources allocated within the appender such as file handles, - network connections, etc. - - - It is a programming error to append to a closed appender. - - - - - - Forward the logging event to the attached appenders - - The event to log. - - - Delivers the logging event to all the attached appenders. - - - - - - Forward the logging events to the attached appenders - - The array of events to log. - - - Delivers the logging events to all the attached appenders. - - - - - - Adds an to the list of appenders of this - instance. - - The to add to this appender. - - - If the specified is already in the list of - appenders, then it won't be added again. - - - - - - Looks for the appender with the specified name. - - The name of the appender to lookup. - - The appender with the specified name, or null. - - - - Get the named appender attached to this appender. - - - - - - Removes all previously added appenders from this appender. - - - - This is useful when re-reading configuration information. - - - - - - Removes the specified appender from the list of appenders. - - The appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - Implementation of the interface - - - - - Gets the appenders contained in this appender as an - . - - - If no appenders can be found, then an - is returned. - - - A collection of the appenders in this appender. - - - - - Logs events to a local syslog service. - - - - This appender uses the POSIX libc library functions openlog, syslog, and closelog. - If these functions are not available on the local system then this appender will not work! - - - The functions openlog, syslog, and closelog are specified in SUSv2 and - POSIX 1003.1-2001 standards. These are used to log messages to the local syslog service. - - - This appender talks to a local syslog service. If you need to log to a remote syslog - daemon and you cannot configure your local syslog service to do this you may be - able to use the to log via UDP. - - - Syslog messages must have a facility and and a severity. The severity - is derived from the Level of the logging event. - The facility must be chosen from the set of defined syslog - values. The facilities list is predefined - and cannot be extended. - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - Rob Lyon - Nicko Cadell - - - - Initializes a new instance of the class. - - - This instance of the class is set up to write - to a local syslog service. - - - - - Add a mapping of level to severity - - The mapping to add - - - Adds a to this appender. - - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to a remote syslog daemon. - - - The format of the output will depend on the appender's layout. - - - - - - Close the syslog when the appender is closed - - - - Close the syslog when the appender is closed - - - - - - Translates a log4net level to a syslog severity. - - A log4net level. - A syslog severity. - - - Translates a log4net level to a syslog severity. - - - - - - Generate a syslog priority. - - The syslog facility. - The syslog severity. - A syslog priority. - - - - The facility. The default facility is . - - - - - The message identity - - - - - Marshaled handle to the identity string. We have to hold on to the - string as the openlog and syslog APIs just hold the - pointer to the ident and dereference it for each log message. - - - - - Mapping from level object to syslog severity - - - - - Open connection to system logger. - - - - - Generate a log message. - - - - The libc syslog method takes a format string and a variable argument list similar - to the classic printf function. As this type of vararg list is not supported - by C# we need to specify the arguments explicitly. Here we have specified the - format string with a single message argument. The caller must set the format - string to "%s". - - - - - - Close descriptor used to write to system logger. - - - - - Message identity - - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - - - - Syslog facility - - - Set to one of the values. The list of - facilities is predefined and cannot be extended. The default value - is . - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - syslog severities - - - - The log4net Level maps to a syslog severity using the - method and the - class. The severity is set on . - - - - - - system is unusable - - - - - action must be taken immediately - - - - - critical conditions - - - - - error conditions - - - - - warning conditions - - - - - normal but significant condition - - - - - informational - - - - - debug-level messages - - - - - syslog facilities - - - - The syslog facility defines which subsystem the logging comes from. - This is set on the property. - - - - - - kernel messages - - - - - random user-level messages - - - - - mail system - - - - - system daemons - - - - - security/authorization messages - - - - - messages generated internally by syslogd - - - - - line printer subsystem - - - - - network news subsystem - - - - - UUCP subsystem - - - - - clock (cron/at) daemon - - - - - security/authorization messages (private) - - - - - ftp daemon - - - - - NTP subsystem - - - - - log audit - - - - - log alert - - - - - clock daemon - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - - - The mapped syslog severity for the specified level - - - - Required property. - The mapped syslog severity for the specified level - - - - - - Stores logging events in an array. - - - - The memory appender stores all the logging events - that are appended in an in-memory array. - - - Use the method to get - the current list of events that have been appended. - - - Use the method to clear the - current list of events. - - - Julian Biddle - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Gets the events that have been logged. - - The events that have been logged - - - Gets the events that have been logged. - - - - - - This method is called by the method. - - the event to log - - Stores the in the events list. - - - - - Clear the list of events - - - Clear the list of events - - - - - The list of events that have been appended. - - - - - Value indicating which fields in the event should be fixed - - - By default all fields are fixed - - - - - Gets or sets a value indicating whether only part of the logging event - data should be fixed. - - - true if the appender should only fix part of the logging event - data, otherwise false. The default is false. - - - - Setting this property to true will cause only part of the event - data to be fixed and stored in the appender, hereby improving performance. - - - See for more information. - - - - - - Gets or sets the fields that will be fixed in the event - - - - The logging event needs to have certain thread specific values - captured before it can be buffered. See - for details. - - - - - - Logs entries by sending network messages using the - native function. - - - - You can send messages only to names that are active - on the network. If you send the message to a user name, - that user must be logged on and running the Messenger - service to receive the message. - - - The receiver will get a top most window displaying the - messages one at a time, therefore this appender should - not be used to deliver a high volume of messages. - - - The following table lists some possible uses for this appender : - - - - - Action - Property Value(s) - - - Send a message to a user account on the local machine - - - = <name of the local machine> - - - = <user name> - - - - - Send a message to a user account on a remote machine - - - = <name of the remote machine> - - - = <user name> - - - - - Send a message to a domain user account - - - = <name of a domain controller | uninitialized> - - - = <user name> - - - - - Send a message to all the names in a workgroup or domain - - - = <workgroup name | domain name>* - - - - - Send a message from the local machine to a remote machine - - - = <name of the local machine | uninitialized> - - - = <name of the remote machine> - - - - - - - Note : security restrictions apply for sending - network messages, see - for more information. - - - - - An example configuration section to log information - using this appender from the local machine, named - LOCAL_PC, to machine OPERATOR_PC : - - - - - - - - - - Nicko Cadell - Gert Driesen - - - - The DNS or NetBIOS name of the server on which the function is to execute. - - - - - The sender of the network message. - - - - - The message alias to which the message should be sent. - - - - - The security context to use for privileged calls - - - - - Initializes the appender. - - - The default constructor initializes all fields to their default values. - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The appender will be ignored if no was specified. - - - The required property was not specified. - - - - This method is called by the method. - - The event to log. - - - Sends the event using a network message. - - - - - - Sends a buffer of information to a registered message alias. - - The DNS or NetBIOS name of the server on which the function is to execute. - The message alias to which the message buffer should be sent - The originator of the message. - The message text. - The length, in bytes, of the message text. - - - The following restrictions apply for sending network messages: - - - - - Platform - Requirements - - - Windows NT - - - No special group membership is required to send a network message. - - - Admin, Accounts, Print, or Server Operator group membership is required to - successfully send a network message on a remote server. - - - - - Windows 2000 or later - - - If you send a message on a domain controller that is running Active Directory, - access is allowed or denied based on the access control list (ACL) for the securable - object. The default ACL permits only Domain Admins and Account Operators to send a network message. - - - On a member server or workstation, only Administrators and Server Operators can send a network message. - - - - - - - For more information see Security Requirements for the Network Management Functions. - - - - - If the function succeeds, the return value is zero. - - - - - - Gets or sets the sender of the message. - - - The sender of the message. - - - If this property is not specified, the message is sent from the local computer. - - - - - Gets or sets the message alias to which the message should be sent. - - - The recipient of the message. - - - This property should always be specified in order to send a message. - - - - - Gets or sets the DNS or NetBIOS name of the remote server on which the function is to execute. - - - DNS or NetBIOS name of the remote server on which the function is to execute. - - - - For Windows NT 4.0 and earlier, the string should begin with \\. - - - If this property is not specified, the local computer is used. - - - - - - Gets or sets the used to call the NetSend method. - - - The used to call the NetSend method. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appends log events to the OutputDebugString system. - - - - OutputDebugStringAppender appends log events to the - OutputDebugString system. - - - The string is passed to the native OutputDebugString - function. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Write the logging event to the output debug string API - - the event to log - - - Write the logging event to the output debug string API - - - - - - Stub for OutputDebugString native method - - the string to output - - - Stub for OutputDebugString native method - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Logs events to a remote syslog daemon. - - - - The BSD syslog protocol is used to remotely log to - a syslog daemon. The syslogd listens for for messages - on UDP port 514. - - - The syslog UDP protocol is not authenticated. Most syslog daemons - do not accept remote log messages because of the security implications. - You may be able to use the LocalSyslogAppender to talk to a local - syslog service. - - - There is an RFC 3164 that claims to document the BSD Syslog Protocol. - This RFC can be seen here: http://www.faqs.org/rfcs/rfc3164.html. - This appender generates what the RFC calls an "Original Device Message", - i.e. does not include the TIMESTAMP or HOSTNAME fields. By observation - this format of message will be accepted by all current syslog daemon - implementations. The daemon will attach the current time and the source - hostname or IP address to any messages received. - - - Syslog messages must have a facility and and a severity. The severity - is derived from the Level of the logging event. - The facility must be chosen from the set of defined syslog - values. The facilities list is predefined - and cannot be extended. - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - Rob Lyon - Nicko Cadell - - - - Sends logging events as connectionless UDP datagrams to a remote host or a - multicast group using an . - - - - UDP guarantees neither that messages arrive, nor that they arrive in the correct order. - - - To view the logging results, a custom application can be developed that listens for logging - events. - - - When decoding events send via this appender remember to use the same encoding - to decode the events as was used to send the events. See the - property to specify the encoding to use. - - - - This example shows how to log receive logging events that are sent - on IP address 244.0.0.1 and port 8080 to the console. The event is - encoded in the packet as a unicode string and it is decoded as such. - - IPEndPoint remoteEndPoint = new IPEndPoint(IPAddress.Any, 0); - UdpClient udpClient; - byte[] buffer; - string loggingEvent; - - try - { - udpClient = new UdpClient(8080); - - while(true) - { - buffer = udpClient.Receive(ref remoteEndPoint); - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer); - Console.WriteLine(loggingEvent); - } - } - catch(Exception e) - { - Console.WriteLine(e.ToString()); - } - - - Dim remoteEndPoint as IPEndPoint - Dim udpClient as UdpClient - Dim buffer as Byte() - Dim loggingEvent as String - - Try - remoteEndPoint = new IPEndPoint(IPAddress.Any, 0) - udpClient = new UdpClient(8080) - - While True - buffer = udpClient.Receive(ByRef remoteEndPoint) - loggingEvent = System.Text.Encoding.Unicode.GetString(buffer) - Console.WriteLine(loggingEvent) - Wend - Catch e As Exception - Console.WriteLine(e.ToString()) - End Try - - - An example configuration section to log information using this appender to the - IP 224.0.0.1 on port 8080: - - - - - - - - - - Gert Driesen - Nicko Cadell - - - - Initializes a new instance of the class. - - - The default constructor initializes all fields to their default values. - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The appender will be ignored if no was specified or - an invalid remote or local TCP port number was specified. - - - The required property was not specified. - The TCP port number assigned to or is less than or greater than . - - - - This method is called by the method. - - The event to log. - - - Sends the event using an UDP datagram. - - - Exceptions are passed to the . - - - - - - Closes the UDP connection and releases all resources associated with - this instance. - - - - Disables the underlying and releases all managed - and unmanaged resources associated with the . - - - - - - Initializes the underlying connection. - - - - The underlying is initialized and binds to the - port number from which you intend to communicate. - - - Exceptions are passed to the . - - - - - - The IP address of the remote host or multicast group to which - the logging event will be sent. - - - - - The TCP port number of the remote host or multicast group to - which the logging event will be sent. - - - - - The cached remote endpoint to which the logging events will be sent. - - - - - The TCP port number from which the will communicate. - - - - - The instance that will be used for sending the - logging events. - - - - - The encoding to use for the packet. - - - - - Gets or sets the IP address of the remote host or multicast group to which - the underlying should sent the logging event. - - - The IP address of the remote host or multicast group to which the logging event - will be sent. - - - - Multicast addresses are identified by IP class D addresses (in the range 224.0.0.0 to - 239.255.255.255). Multicast packets can pass across different networks through routers, so - it is possible to use multicasts in an Internet scenario as long as your network provider - supports multicasting. - - - Hosts that want to receive particular multicast messages must register their interest by joining - the multicast group. Multicast messages are not sent to networks where no host has joined - the multicast group. Class D IP addresses are used for multicast groups, to differentiate - them from normal host addresses, allowing nodes to easily detect if a message is of interest. - - - Static multicast addresses that are needed globally are assigned by IANA. A few examples are listed in the table below: - - - - - IP Address - Description - - - 224.0.0.1 - - - Sends a message to all system on the subnet. - - - - - 224.0.0.2 - - - Sends a message to all routers on the subnet. - - - - - 224.0.0.12 - - - The DHCP server answers messages on the IP address 224.0.0.12, but only on a subnet. - - - - - - - A complete list of actually reserved multicast addresses and their owners in the ranges - defined by RFC 3171 can be found at the IANA web site. - - - The address range 239.0.0.0 to 239.255.255.255 is reserved for administrative scope-relative - addresses. These addresses can be reused with other local groups. Routers are typically - configured with filters to prevent multicast traffic in this range from flowing outside - of the local network. - - - - - - Gets or sets the TCP port number of the remote host or multicast group to which - the underlying should sent the logging event. - - - An integer value in the range to - indicating the TCP port number of the remote host or multicast group to which the logging event - will be sent. - - - The underlying will send messages to this TCP port number - on the remote host or multicast group. - - The value specified is less than or greater than . - - - - Gets or sets the TCP port number from which the underlying will communicate. - - - An integer value in the range to - indicating the TCP port number from which the underlying will communicate. - - - - The underlying will bind to this port for sending messages. - - - Setting the value to 0 (the default) will cause the udp client not to bind to - a local port. - - - The value specified is less than or greater than . - - - - Gets or sets used to write the packets. - - - The used to write the packets. - - - - The used to write the packets. - - - - - - Gets or sets the underlying . - - - The underlying . - - - creates a to send logging events - over a network. Classes deriving from can use this - property to get or set this . Use the underlying - returned from if you require access beyond that which - provides. - - - - - Gets or sets the cached remote endpoint to which the logging events should be sent. - - - The cached remote endpoint to which the logging events will be sent. - - - The method will initialize the remote endpoint - with the values of the and - properties. - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Syslog port 514 - - - - - Initializes a new instance of the class. - - - This instance of the class is set up to write - to a remote syslog daemon. - - - - - Add a mapping of level to severity - - The mapping to add - - - Add a mapping to this appender. - - - - - - This method is called by the method. - - The event to log. - - - Writes the event to a remote syslog daemon. - - - The format of the output will depend on the appender's layout. - - - - - - Initialize the options for this appender - - - - Initialize the level to syslog severity mappings set on this appender. - - - - - - Translates a log4net level to a syslog severity. - - A log4net level. - A syslog severity. - - - Translates a log4net level to a syslog severity. - - - - - - Generate a syslog priority. - - The syslog facility. - The syslog severity. - A syslog priority. - - - Generate a syslog priority. - - - - - - The facility. The default facility is . - - - - - The message identity - - - - - Mapping from level object to syslog severity - - - - - Message identity - - - - An identifier is specified with each log message. This can be specified - by setting the property. The identity (also know - as the tag) must not contain white space. The default value for the - identity is the application name (from ). - - - - - - Syslog facility - - - Set to one of the values. The list of - facilities is predefined and cannot be extended. The default value - is . - - - - - syslog severities - - - - The syslog severities. - - - - - - system is unusable - - - - - action must be taken immediately - - - - - critical conditions - - - - - error conditions - - - - - warning conditions - - - - - normal but significant condition - - - - - informational - - - - - debug-level messages - - - - - syslog facilities - - - - The syslog facilities - - - - - - kernel messages - - - - - random user-level messages - - - - - mail system - - - - - system daemons - - - - - security/authorization messages - - - - - messages generated internally by syslogd - - - - - line printer subsystem - - - - - network news subsystem - - - - - UUCP subsystem - - - - - clock (cron/at) daemon - - - - - security/authorization messages (private) - - - - - ftp daemon - - - - - NTP subsystem - - - - - log audit - - - - - log alert - - - - - clock daemon - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - reserved for local use - - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - A class to act as a mapping between the level that a logging call is made at and - the syslog severity that is should be logged at. - - - - - - The mapped syslog severity for the specified level - - - - Required property. - The mapped syslog severity for the specified level - - - - - - Delivers logging events to a remote logging sink. - - - - This Appender is designed to deliver events to a remote sink. - That is any object that implements the - interface. It delivers the events using .NET remoting. The - object to deliver events to is specified by setting the - appenders property. - - The RemotingAppender buffers events before sending them. This allows it to - make more efficient use of the remoting infrastructure. - - Once the buffer is full the events are still not sent immediately. - They are scheduled to be sent using a pool thread. The effect is that - the send occurs asynchronously. This is very important for a - number of non obvious reasons. The remoting infrastructure will - flow thread local variables (stored in the ), - if they are marked as , across the - remoting boundary. If the server is not contactable then - the remoting infrastructure will clear the - objects from the . To prevent a logging failure from - having side effects on the calling application the remoting call must be made - from a separate thread to the one used by the application. A - thread is used for this. If no thread is available then - the events will block in the thread pool manager until a thread is available. - - Because the events are sent asynchronously using pool threads it is possible to close - this appender before all the queued events have been sent. - When closing the appender attempts to wait until all the queued events have been sent, but - this will timeout after 30 seconds regardless. - - If this appender is being closed because the - event has fired it may not be possible to send all the queued events. During process - exit the runtime limits the time that a - event handler is allowed to run for. If the runtime terminates the threads before - the queued events have been sent then they will be lost. To ensure that all events - are sent the appender must be closed before the application exits. See - for details on how to shutdown - log4net programmatically. - - - Nicko Cadell - Gert Driesen - Daniel Cazzulino - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Send the contents of the buffer to the remote sink. - - - The events are not sent immediately. They are scheduled to be sent - using a pool thread. The effect is that the send occurs asynchronously. - This is very important for a number of non obvious reasons. The remoting - infrastructure will flow thread local variables (stored in the ), - if they are marked as , across the - remoting boundary. If the server is not contactable then - the remoting infrastructure will clear the - objects from the . To prevent a logging failure from - having side effects on the calling application the remoting call must be made - from a separate thread to the one used by the application. A - thread is used for this. If no thread is available then - the events will block in the thread pool manager until a thread is available. - - The events to send. - - - - Override base class close. - - - - This method waits while there are queued work items. The events are - sent asynchronously using work items. These items - will be sent once a thread pool thread is available to send them, therefore - it is possible to close the appender before all the queued events have been - sent. - - This method attempts to wait until all the queued events have been sent, but this - method will timeout after 30 seconds regardless. - - If the appender is being closed because the - event has fired it may not be possible to send all the queued events. During process - exit the runtime limits the time that a - event handler is allowed to run for. - - - - - A work item is being queued into the thread pool - - - - - A work item from the thread pool has completed - - - - - Send the contents of the buffer to the remote sink. - - - This method is designed to be used with the . - This method expects to be passed an array of - objects in the state param. - - the logging events to send - - - - The URL of the remote sink. - - - - - The local proxy (.NET remoting) for the remote logging sink. - - - - - The number of queued callbacks currently waiting or executing - - - - - Event used to signal when there are no queued work items - - - This event is set when there are no queued work items. In this - state it is safe to close the appender. - - - - - Gets or sets the URL of the well-known object that will accept - the logging events. - - - The well-known URL of the remote sink. - - - - The URL of the remoting sink that will accept logging events. - The sink must implement the - interface. - - - - - - Interface used to deliver objects to a remote sink. - - - This interface must be implemented by a remoting sink - if the is to be used - to deliver logging events to the sink. - - - - - Delivers logging events to the remote sink - - Array of events to log. - - - Delivers logging events to the remote sink - - - - - - Appender that rolls log files based on size or date or both. - - - - RollingFileAppender can roll log files based on size or date or both - depending on the setting of the property. - When set to the log file will be rolled - once its size exceeds the . - When set to the log file will be rolled - once the date boundary specified in the property - is crossed. - When set to the log file will be - rolled once the date boundary specified in the property - is crossed, but within a date boundary the file will also be rolled - once its size exceeds the . - When set to the log file will be rolled when - the appender is configured. This effectively means that the log file can be - rolled once per program execution. - - - A of few additional optional features have been added: - - Attach date pattern for current log file - Backup number increments for newer files - Infinite number of backups by file size - - - - - - For large or infinite numbers of backup files a - greater than zero is highly recommended, otherwise all the backup files need - to be renamed each time a new backup is created. - - - When Date/Time based rolling is used setting - to will reduce the number of file renamings to few or none. - - - - - - Changing or without clearing - the log file directory of backup files will cause unexpected and unwanted side effects. - - - - - If Date/Time based rolling is enabled this appender will attempt to roll existing files - in the directory without a Date/Time tag based on the last write date of the base log file. - The appender only rolls the log file when a message is logged. If Date/Time based rolling - is enabled then the appender will not roll the log file at the Date/Time boundary but - at the point when the next message is logged after the boundary has been crossed. - - - - The extends the and - has the same behavior when opening the log file. - The appender will first try to open the file for writing when - is called. This will typically be during configuration. - If the file cannot be opened for writing the appender will attempt - to open the file again each time a message is logged to the appender. - If the file cannot be opened for writing when a message is logged then - the message will be discarded by this appender. - - - When rolling a backup file necessitates deleting an older backup file the - file to be deleted is moved to a temporary name before being deleted. - - - - - A maximum number of backup files when rolling on date/time boundaries is not supported. - - - - Nicko Cadell - Gert Driesen - Aspi Havewala - Douglas de la Torre - Edward Smit - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - The fully qualified type of the RollingFileAppender class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Sets the quiet writer being used. - - - This method can be overridden by sub classes. - - the writer to set - - - - Write out a logging event. - - the event to write to file. - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Write out an array of logging events. - - the events to write to file. - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Performs any required rolling before outputting the next event - - - - Handles append time behavior for RollingFileAppender. This checks - if a roll over either by date (checked first) or time (checked second) - is need and then appends to the file last. - - - - - - Creates and opens the file for logging. If - is false then the fully qualified name is determined and used. - - the name of the file to open - true to append to existing file - - This method will ensure that the directory structure - for the specified exists. - - - - - Get the current output file name - - the base file name - the output file name - - The output file name is based on the base fileName specified. - If is set then the output - file name is the same as the base file passed in. Otherwise - the output file depends on the date pattern, on the count - direction or both. - - - - - Determines curSizeRollBackups (only within the current roll point) - - - - - Generates a wildcard pattern that can be used to find all files - that are similar to the base file name. - - - - - - - Builds a list of filenames for all files matching the base filename plus a file - pattern. - - - - - - - Initiates a roll over if needed for crossing a date boundary since the last run. - - - - - Initializes based on existing conditions at time of . - - - - Initializes based on existing conditions at time of . - The following is done - - determine curSizeRollBackups (only within the current roll point) - initiates a roll over if needed for crossing a date boundary since the last run. - - - - - - - Does the work of bumping the 'current' file counter higher - to the highest count when an incremental file name is seen. - The highest count is either the first file (when count direction - is greater than 0) or the last file (when count direction less than 0). - In either case, we want to know the highest count that is present. - - - - - - - Attempts to extract a number from the end of the file name that indicates - the number of the times the file has been rolled over. - - - Certain date pattern extensions like yyyyMMdd will be parsed as valid backup indexes. - - - - - - - Takes a list of files and a base file name, and looks for - 'incremented' versions of the base file. Bumps the max - count up to the highest count seen. - - - - - - - Calculates the RollPoint for the datePattern supplied. - - the date pattern to calculate the check period for - The RollPoint that is most accurate for the date pattern supplied - - Essentially the date pattern is examined to determine what the - most suitable roll point is. The roll point chosen is the roll point - with the smallest period that can be detected using the date pattern - supplied. i.e. if the date pattern only outputs the year, month, day - and hour then the smallest roll point that can be detected would be - and hourly roll point as minutes could not be detected. - - - - - Initialize the appender based on the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Sets initial conditions including date/time roll over information, first check, - scheduledFilename, and calls to initialize - the current number of backups. - - - - - - - - - .1, .2, .3, etc. - - - - - Rollover the file(s) to date/time tagged file(s). - - set to true if the file to be rolled is currently open - - - Rollover the file(s) to date/time tagged file(s). - Resets curSizeRollBackups. - If fileIsOpen is set then the new file is opened (through SafeOpenFile). - - - - - - Renames file to file . - - Name of existing file to roll. - New name for file. - - - Renames file to file . It - also checks for existence of target file and deletes if it does. - - - - - - Test if a file exists at a specified path - - the path to the file - true if the file exists - - - Test if a file exists at a specified path - - - - - - Deletes the specified file if it exists. - - The file to delete. - - - Delete a file if is exists. - The file is first moved to a new filename then deleted. - This allows the file to be removed even when it cannot - be deleted, but it still can be moved. - - - - - - Implements file roll base on file size. - - - - If the maximum number of size based backups is reached - (curSizeRollBackups == maxSizeRollBackups) then the oldest - file is deleted -- its index determined by the sign of countDirection. - If countDirection < 0, then files - {File.1, ..., File.curSizeRollBackups -1} - are renamed to {File.2, ..., - File.curSizeRollBackups}. Moreover, File is - renamed File.1 and closed. - - - A new file is created to receive further log output. - - - If maxSizeRollBackups is equal to zero, then the - File is truncated with no backup files created. - - - If maxSizeRollBackups < 0, then File is - renamed if needed and no files are deleted. - - - - - - Implements file roll. - - the base name to rename - - - If the maximum number of size based backups is reached - (curSizeRollBackups == maxSizeRollBackups) then the oldest - file is deleted -- its index determined by the sign of countDirection. - If countDirection < 0, then files - {File.1, ..., File.curSizeRollBackups -1} - are renamed to {File.2, ..., - File.curSizeRollBackups}. - - - If maxSizeRollBackups is equal to zero, then the - File is truncated with no backup files created. - - - If maxSizeRollBackups < 0, then File is - renamed if needed and no files are deleted. - - - This is called by to rename the files. - - - - - - Get the start time of the next window for the current rollpoint - - the current date - the type of roll point we are working with - the start time for the next roll point an interval after the currentDateTime date - - - Returns the date of the next roll point after the currentDateTime date passed to the method. - - - The basic strategy is to subtract the time parts that are less significant - than the rollpoint from the current time. This should roll the time back to - the start of the time window for the current rollpoint. Then we add 1 window - worth of time and get the start time of the next window for the rollpoint. - - - - - - This object supplies the current date/time. Allows test code to plug in - a method to control this class when testing date/time based rolling. The default - implementation uses the underlying value of DateTime.Now. - - - - - The date pattern. By default, the pattern is set to ".yyyy-MM-dd" - meaning daily rollover. - - - - - The actual formatted filename that is currently being written to - or will be the file transferred to on roll over - (based on staticLogFileName). - - - - - The timestamp when we shall next recompute the filename. - - - - - Holds date of last roll over - - - - - The type of rolling done - - - - - The default maximum file size is 10MB - - - - - There is zero backup files by default - - - - - How many sized based backups have been made so far - - - - - The rolling file count direction. - - - - - The rolling mode used in this appender. - - - - - Cache flag set if we are rolling by date. - - - - - Cache flag set if we are rolling by size. - - - - - Value indicating whether to always log to the same file. - - - - - Value indicating whether to preserve the file name extension when rolling. - - - - - FileName provided in configuration. Used for rolling properly - - - - - The 1st of January 1970 in UTC - - - - - Gets or sets the strategy for determining the current date and time. The default - implementation is to use LocalDateTime which internally calls through to DateTime.Now. - DateTime.UtcNow may be used on frameworks newer than .NET 1.0 by specifying - . - - - An implementation of the interface which returns the current date and time. - - - - Gets or sets the used to return the current date and time. - - - There are two built strategies for determining the current date and time, - - and . - - - The default strategy is . - - - - - - Gets or sets the date pattern to be used for generating file names - when rolling over on date. - - - The date pattern to be used for generating file names when rolling - over on date. - - - - Takes a string in the same format as expected by - . - - - This property determines the rollover schedule when rolling over - on date. - - - - - - Gets or sets the maximum number of backup files that are kept before - the oldest is erased. - - - The maximum number of backup files that are kept before the oldest is - erased. - - - - If set to zero, then there will be no backup files and the log file - will be truncated when it reaches . - - - If a negative number is supplied then no deletions will be made. Note - that this could result in very slow performance as a large number of - files are rolled over unless is used. - - - The maximum applies to each time based group of files and - not the total. - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size in bytes that the output file is allowed to reach before being - rolled over to backup files. - - - - This property is equivalent to except - that it is required for differentiating the setter taking a - argument from the setter taking a - argument. - - - The default maximum file size is 10MB (10*1024*1024). - - - - - - Gets or sets the maximum size that the output file is allowed to reach - before being rolled over to backup files. - - - The maximum size that the output file is allowed to reach before being - rolled over to backup files. - - - - This property allows you to specify the maximum size with the - suffixes "KB", "MB" or "GB" so that the size is interpreted being - expressed respectively in kilobytes, megabytes or gigabytes. - - - For example, the value "10KB" will be interpreted as 10240 bytes. - - - The default maximum file size is 10MB. - - - If you have the option to set the maximum file size programmatically - consider using the property instead as this - allows you to set the size in bytes as a . - - - - - - Gets or sets the rolling file count direction. - - - The rolling file count direction. - - - - Indicates if the current file is the lowest numbered file or the - highest numbered file. - - - By default newer files have lower numbers ( < 0), - i.e. log.1 is most recent, log.5 is the 5th backup, etc... - - - >= 0 does the opposite i.e. - log.1 is the first backup made, log.5 is the 5th backup made, etc. - For infinite backups use >= 0 to reduce - rollover costs. - - The default file count direction is -1. - - - - - Gets or sets the rolling style. - - The rolling style. - - - The default rolling style is . - - - When set to this appender's - property is set to false, otherwise - the appender would append to a single file rather than rolling - the file each time it is opened. - - - - - - Gets or sets a value indicating whether to preserve the file name extension when rolling. - - - true if the file name extension should be preserved. - - - - By default file.log is rolled to file.log.yyyy-MM-dd or file.log.curSizeRollBackup. - However, under Windows the new file name will loose any program associations as the - extension is changed. Optionally file.log can be renamed to file.yyyy-MM-dd.log or - file.curSizeRollBackup.log to maintain any program associations. - - - - - - Gets or sets a value indicating whether to always log to - the same file. - - - true if always should be logged to the same file, otherwise false. - - - - By default file.log is always the current file. Optionally - file.log.yyyy-mm-dd for current formatted datePattern can by the currently - logging file (or file.log.curSizeRollBackup or even - file.log.yyyy-mm-dd.curSizeRollBackup). - - - This will make time based rollovers with a large number of backups - much faster as the appender it won't have to rename all the backups! - - - - - - Style of rolling to use - - - - Style of rolling to use - - - - - - Roll files once per program execution - - - - Roll files once per program execution. - Well really once each time this appender is - configured. - - - Setting this option also sets AppendToFile to - false on the RollingFileAppender, otherwise - this appender would just be a normal file appender. - - - - - - Roll files based only on the size of the file - - - - - Roll files based only on the date - - - - - Roll files based on both the size and date of the file - - - - - The code assumes that the following 'time' constants are in a increasing sequence. - - - - The code assumes that the following 'time' constants are in a increasing sequence. - - - - - - Roll the log not based on the date - - - - - Roll the log for each minute - - - - - Roll the log for each hour - - - - - Roll the log twice a day (midday and midnight) - - - - - Roll the log each day (midnight) - - - - - Roll the log each week - - - - - Roll the log each month - - - - - This interface is used to supply Date/Time information to the . - - - This interface is used to supply Date/Time information to the . - Used primarily to allow test classes to plug themselves in so they can - supply test date/times. - - - - - Gets the current time. - - The current time. - - - Gets the current time. - - - - - - Default implementation of that returns the current time. - - - - - Gets the current time. - - The current time. - - - Gets the current time. - - - - - - Implementation of that returns the current time as the coordinated universal time (UTC). - - - - - Gets the current time. - - The current time. - - - Gets the current time. - - - - - - Send an e-mail when a specific logging event occurs, typically on errors - or fatal errors. - - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - Authentication and setting the server Port are only available on the MS .NET 1.1 runtime. - For these features to be enabled you need to ensure that you are using a version of - the log4net assembly that is built against the MS .NET 1.1 framework and that you are - running the your application on the MS .NET 1.1 runtime. On all other platforms only sending - unauthenticated messages to a server listening on port 25 (the default) is supported. - - - Authentication is supported by setting the property to - either or . - If using authentication then the - and properties must also be set. - - - To set the SMTP server port use the property. The default port is 25. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Default constructor - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - - Send the email message - - the body text to include in the mail - - - - Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses (use semicolon on .NET 1.1 and comma for later versions). - - - - For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - - - For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - - - - - For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - - - For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - - - - - - Gets or sets a comma- or semicolon-delimited list of recipient e-mail addresses - that will be carbon copied (use semicolon on .NET 1.1 and comma for later versions). - - - - For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - - - For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - - - - - For .NET 1.1 (System.Web.Mail): A semicolon-delimited list of e-mail addresses. - - - For .NET 2.0 (System.Net.Mail): A comma-delimited list of e-mail addresses. - - - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses - that will be blind carbon copied. - - - A semicolon-delimited list of e-mail addresses. - - - - A semicolon-delimited list of recipient e-mail addresses. - - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - The e-mail address of the sender. - - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - The subject line of the e-mail message. - - - - - - Gets or sets the name of the SMTP relay mail server to use to send - the e-mail messages. - - - The name of the e-mail relay server. If SmtpServer is not set, the - name of the local SMTP server is used. - - - - The name of the e-mail relay server. If SmtpServer is not set, the - name of the local SMTP server is used. - - - - - - Obsolete - - - Use the BufferingAppenderSkeleton Fix methods instead - - - - Obsolete property. - - - - - - The mode to use to authentication with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - Valid Authentication mode values are: , - , and . - The default value is . When using - you must specify the - and to use to authenticate. - When using the Windows credentials for the current - thread, if impersonating, or the process will be used to authenticate. - - - - - - The username to use to authenticate with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - A and must be specified when - is set to , - otherwise the username will be ignored. - - - - - - The password to use to authenticate with the SMTP server - - - Authentication is only available on the MS .NET 1.1 runtime. - - A and must be specified when - is set to , - otherwise the password will be ignored. - - - - - - The port on which the SMTP server is listening - - - Server Port is only available on the MS .NET 1.1 runtime. - - The port on which the SMTP server is listening. The default - port is 25. The Port can only be changed when running on - the MS .NET 1.1 runtime. - - - - - - Gets or sets the priority of the e-mail message - - - One of the values. - - - - Sets the priority of the e-mails generated by this - appender. The default priority is . - - - If you are using this appender to report errors then - you may want to set the priority to . - - - - - - Enable or disable use of SSL when sending e-mail message - - - This is available on MS .NET 2.0 runtime and higher - - - - - Gets or sets the reply-to e-mail address. - - - This is available on MS .NET 2.0 runtime and higher - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Values for the property. - - - - SMTP authentication modes. - - - - - - No authentication - - - - - Basic authentication. - - - Requires a username and password to be supplied - - - - - Integrated authentication - - - Uses the Windows credentials from the current thread or process to authenticate. - - - - - Send an email when a specific logging event occurs, typically on errors - or fatal errors. Rather than sending via smtp it writes a file into the - directory specified by . This allows services such - as the IIS SMTP agent to manage sending the messages. - - - - The configuration for this appender is identical to that of the SMTPAppender, - except that instead of specifying the SMTPAppender.SMTPHost you specify - . - - - The number of logging events delivered in this e-mail depend on - the value of option. The - keeps only the last - logging events in its - cyclic buffer. This keeps memory requirements at a reasonable level while - still delivering useful application context. - - - Niall Daley - Nicko Cadell - - - - Default constructor - - - - Default constructor - - - - - - Sends the contents of the cyclic buffer as an e-mail message. - - The logging events to send. - - - Sends the contents of the cyclic buffer as an e-mail message. - - - - - - Activate the options on this appender. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Convert a path into a fully qualified path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - - - - The security context to use for privileged calls - - - - - Gets or sets a semicolon-delimited list of recipient e-mail addresses. - - - A semicolon-delimited list of e-mail addresses. - - - - A semicolon-delimited list of e-mail addresses. - - - - - - Gets or sets the e-mail address of the sender. - - - The e-mail address of the sender. - - - - The e-mail address of the sender. - - - - - - Gets or sets the subject line of the e-mail message. - - - The subject line of the e-mail message. - - - - The subject line of the e-mail message. - - - - - - Gets or sets the path to write the messages to. - - - - Gets or sets the path to write the messages to. This should be the same - as that used by the agent sending the messages. - - - - - - Gets or sets the used to write to the pickup directory. - - - The used to write to the pickup directory. - - - - Unless a specified here for this appender - the is queried for the - security context to use. The default behavior is to use the security context - of the current thread. - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Appender that allows clients to connect via Telnet to receive log messages - - - - The TelnetAppender accepts socket connections and streams logging messages - back to the client. - The output is provided in a telnet-friendly way so that a log can be monitored - over a TCP/IP socket. - This allows simple remote monitoring of application logging. - - - The default is 23 (the telnet port). - - - Keith Long - Nicko Cadell - - - - Default constructor - - - - Default constructor - - - - - - The fully qualified type of the TelnetAppender class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Overrides the parent method to close the socket handler - - - - Closes all the outstanding connections. - - - - - - Initialize the appender based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Create the socket handler and wait for connections - - - - - - Writes the logging event to each connected client. - - The event to log. - - - Writes the logging event to each connected client. - - - - - - Gets or sets the TCP port number on which this will listen for connections. - - - An integer value in the range to - indicating the TCP port number on which this will listen for connections. - - - - The default value is 23 (the telnet port). - - - The value specified is less than - or greater than . - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Helper class to manage connected clients - - - - The SocketHandler class is used to accept connections from - clients. It is threaded so that clients can connect/disconnect - asynchronously. - - - - - - Opens a new server port on - - the local port to listen on for connections - - - Creates a socket handler on the specified local server port. - - - - - - Sends a string message to each of the connected clients - - the text to send - - - Sends a string message to each of the connected clients - - - - - - Add a client to the internal clients list - - client to add - - - - Remove a client from the internal clients list - - client to remove - - - - Callback used to accept a connection on the server socket - - The result of the asynchronous operation - - - On connection adds to the list of connections - if there are two many open connections you will be disconnected - - - - - - Close all network connections - - - - Make sure we close all network connections - - - - - - Test if this handler has active connections - - - true if this handler has active connections - - - - This property will be true while this handler has - active connections, that is at least one connection that - the handler will attempt to send a message to. - - - - - - Class that represents a client connected to this handler - - - - Class that represents a client connected to this handler - - - - - - Create this for the specified - - the client's socket - - - Opens a stream writer on the socket. - - - - - - Write a string to the client - - string to send - - - Write a string to the client - - - - - - Cleanup the clients connection - - - - Close the socket connection. - - - - - - Appends log events to the system. - - - - The application configuration file can be used to control what listeners - are actually used. See the MSDN documentation for the - class for details on configuring the - trace system. - - - Events are written using the System.Diagnostics.Trace.Write(string,string) - method. The event's logger name is the default value for the category parameter - of the Write method. - - - Compact Framework
    - The Compact Framework does not support the - class for any operation except Assert. When using the Compact Framework this - appender will write to the system rather than - the Trace system. This appender will therefore behave like the . -
    -
    - Douglas de la Torre - Nicko Cadell - Gert Driesen - Ron Grabowski -
    - - - Initializes a new instance of the . - - - - Default constructor. - - - - - - Initializes a new instance of the - with a specified layout. - - The layout to use with this appender. - - - Obsolete constructor. - - - - - - Writes the logging event to the system. - - The event to log. - - - Writes the logging event to the system. - - - - - - Immediate flush means that the underlying writer or output stream - will be flushed at the end of each append operation. - - - - Immediate flush is slower but ensures that each append request is - actually written. If is set to - false, then there is a good chance that the last few - logs events are not actually written to persistent media if and - when the application crashes. - - - The default value is true. - - - - - Defaults to %logger - - - - - Gets or sets a value that indicates whether the appender will - flush at the end of each write. - - - The default behavior is to flush at the end of each - write. If the option is set tofalse, then the underlying - stream can defer writing to physical medium to a later time. - - - Avoiding the flush operation at the end of each append results - in a performance gain of 10 to 20 percent. However, there is safety - trade-off involved in skipping flushing. Indeed, when flushing is - skipped, then it is likely that the last few log events will not - be recorded on disk when the application exits. This is a high - price to pay even for a 20% performance gain. - - - - - - The category parameter sent to the Trace method. - - - - Defaults to %logger which will use the logger name of the current - as the category parameter. - - - - - - - - This appender requires a to be set. - - true - - - This appender requires a to be set. - - - - - - Assembly level attribute that specifies a domain to alias to this assembly's repository. - - - - AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. - - - An assembly's logger repository is defined by its , - however this can be overridden by an assembly loaded before the target assembly. - - - An assembly can alias another assembly's domain to its repository by - specifying this attribute with the name of the target domain. - - - This attribute can only be specified on the assembly and may be used - as many times as necessary to alias all the required domains. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute that specifies a repository to alias to this assembly's repository. - - - - An assembly's logger repository is defined by its , - however this can be overridden by an assembly loaded before the target assembly. - - - An assembly can alias another assembly's repository to its repository by - specifying this attribute with the name of the target repository. - - - This attribute can only be specified on the assembly and may be used - as many times as necessary to alias all the required repositories. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class with - the specified repository to alias to this assembly's repository. - - The repository to alias to this assemby's repository. - - - Initializes a new instance of the class with - the specified repository to alias to this assembly's repository. - - - - - - Gets or sets the repository to alias to this assemby's repository. - - - The repository to alias to this assemby's repository. - - - - The name of the repository to alias to this assemby's repository. - - - - - - Initializes a new instance of the class with - the specified domain to alias to this assembly's repository. - - The domain to alias to this assemby's repository. - - - Obsolete. Use instead of . - - - - - - Use this class to quickly configure a . - - - - Allows very simple programmatic configuration of log4net. - - - Only one appender can be configured using this configurator. - The appender is set at the root of the hierarchy and all logging - events will be delivered to that appender. - - - Appenders can also implement the interface. Therefore - they would require that the method - be called after the appenders properties have been configured. - - - Nicko Cadell - Gert Driesen - - - - The fully qualified type of the BasicConfigurator class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Initializes the log4net system with a default configuration. - - - - Initializes the log4net logging system using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the log4net system using the specified appender. - - The appender to use to log all logging events. - - - Initializes the log4net system using the specified appender. - - - - - - Initializes the log4net system using the specified appenders. - - The appenders to use to log all logging events. - - - Initializes the log4net system using the specified appenders. - - - - - - Initializes the with a default configuration. - - The repository to configure. - - - Initializes the specified repository using a - that will write to Console.Out. The log messages are - formatted using the layout object - with the - layout style. - - - - - - Initializes the using the specified appender. - - The repository to configure. - The appender to use to log all logging events. - - - Initializes the using the specified appender. - - - - - - Initializes the using the specified appenders. - - The repository to configure. - The appenders to use to log all logging events. - - - Initializes the using the specified appender. - - - - - - Base class for all log4net configuration attributes. - - - This is an abstract class that must be extended by - specific configurators. This attribute allows the - configurator to be parameterized by an assembly level - attribute. - - Nicko Cadell - Gert Driesen - - - - Constructor used by subclasses. - - the ordering priority for this configurator - - - The is used to order the configurator - attributes before they are invoked. Higher priority configurators are executed - before lower priority ones. - - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - Abstract method implemented by a subclass. When this method is called - the subclass should configure the . - - - - - - Compare this instance to another ConfiguratorAttribute - - the object to compare to - see - - - Compares the priorities of the two instances. - Sorts by priority in descending order. Objects with the same priority are - randomly ordered. - - - - - - Assembly level attribute that specifies the logging domain for the assembly. - - - - DomainAttribute is obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - Assemblies are mapped to logging domains. Each domain has its own - logging repository. This attribute specified on the assembly controls - the configuration of the domain. The property specifies the name - of the domain that this assembly is a part of. The - specifies the type of the repository objects to create for the domain. If - this attribute is not specified and a is not specified - then the assembly will be part of the default shared logging domain. - - - This attribute can only be specified on the assembly and may only be used - once per assembly. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute that specifies the logging repository for the assembly. - - - - Assemblies are mapped to logging repository. This attribute specified - on the assembly controls - the configuration of the repository. The property specifies the name - of the repository that this assembly is a part of. The - specifies the type of the object - to create for the assembly. If this attribute is not specified or a - is not specified then the assembly will be part of the default shared logging repository. - - - This attribute can only be specified on the assembly and may only be used - once per assembly. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Initialize a new instance of the class - with the name of the repository. - - The name of the repository. - - - Initialize the attribute with the name for the assembly's repository. - - - - - - Gets or sets the name of the logging repository. - - - The string name to use as the name of the repository associated with this - assembly. - - - - This value does not have to be unique. Several assemblies can share the - same repository. They will share the logging configuration of the repository. - - - - - - Gets or sets the type of repository to create for this assembly. - - - The type of repository to create for this assembly. - - - - The type of the repository to create for the assembly. - The type must implement the - interface. - - - This will be the type of repository created when - the repository is created. If multiple assemblies reference the - same repository then the repository is only created once using the - of the first assembly to call into the - repository. - - - - - - Initializes a new instance of the class. - - - - Obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - - - - Initialize a new instance of the class - with the name of the domain. - - The name of the domain. - - - Obsolete. Use RepositoryAttribute instead of DomainAttribute. - - - - - - Use this class to initialize the log4net environment using an Xml tree. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - Configures a using an Xml tree. - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - - - Automatically configures the log4net system based on the - application's configuration settings. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - - - Automatically configures the using settings - stored in the application's configuration file. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - The repository to configure. - - - - Configures log4net using a log4net element - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Loads the log4net configuration from the XML element - supplied as . - - The element to parse. - - - - Configures the using the specified XML - element. - - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - Loads the log4net configuration from the XML element - supplied as . - - The repository to configure. - The element to parse. - - - - Configures log4net using the specified configuration file. - - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures log4net using the specified configuration file. - - A stream to load the XML configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - DOMConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The stream to load the XML configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures log4net using the file specified, monitors the file for changes - and reloads the configuration if a change is detected. - - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the using the file specified, - monitors the file for changes and reloads the configuration if a change - is detected. - - The repository to configure. - The XML file to load the configuration from. - - - DOMConfigurator is obsolete. Use XmlConfigurator instead of DOMConfigurator. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Assembly level attribute to configure the . - - - - AliasDomainAttribute is obsolete. Use AliasRepositoryAttribute instead of AliasDomainAttribute. - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - Nicko Cadell - Gert Driesen - - - - Assembly level attribute to configure the . - - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - If neither of the or - properties are set the configuration is loaded from the application's .config file. - If set the property takes priority over the - property. The property - specifies a path to a file to load the config from. The path is relative to the - application's base directory; . - The property is used as a postfix to the assembly file name. - The config file must be located in the application's base directory; . - For example in a console application setting the to - config has the same effect as not specifying the or - properties. - - - The property can be set to cause the - to watch the configuration file for changes. - - - - Log4net will only look for assembly level configuration attributes once. - When using the log4net assembly level attributes to control the configuration - of log4net you must ensure that the first call to any of the - methods is made from the assembly with the configuration - attributes. - - - If you cannot guarantee the order in which log4net calls will be made from - different assemblies you must use programmatic configuration instead, i.e. - call the method directly. - - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Default constructor - - - - - - Configures the for the specified assembly. - - The assembly that this attribute was defined on. - The repository to configure. - - - Configure the repository using the . - The specified must extend the - class otherwise the will not be able to - configure it. - - - The does not extend . - - - - Attempt to load configuration from the local file system - - The assembly that this attribute was defined on. - The repository to configure. - - - - Configure the specified repository using a - - The repository to configure. - the FileInfo pointing to the config file - - - - Attempt to load configuration from a URI - - The assembly that this attribute was defined on. - The repository to configure. - - - - The fully qualified type of the XmlConfiguratorAttribute class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or sets the filename of the configuration file. - - - The filename of the configuration file. - - - - If specified, this is the name of the configuration file to use with - the . This file path is relative to the - application base directory (). - - - The takes priority over the . - - - - - - Gets or sets the extension of the configuration file. - - - The extension of the configuration file. - - - - If specified this is the extension for the configuration file. - The path to the config file is built by using the application - base directory (), - the assembly file name and the config file extension. - - - If the is set to MyExt then - possible config file names would be: MyConsoleApp.exe.MyExt or - MyClassLibrary.dll.MyExt. - - - The takes priority over the . - - - - - - Gets or sets a value indicating whether to watch the configuration file. - - - true if the configuration should be watched, false otherwise. - - - - If this flag is specified and set to true then the framework - will watch the configuration file and will reload the config each time - the file is modified. - - - The config file can only be watched if it is loaded from local disk. - In a No-Touch (Smart Client) deployment where the application is downloaded - from a web server the config file may not reside on the local disk - and therefore it may not be able to watch it. - - - Watching configuration is not supported on the SSCLI. - - - - - - Class to register for the log4net section of the configuration file - - - The log4net section of the configuration file needs to have a section - handler registered. This is the section handler used. It simply returns - the XML element that is the root of the section. - - - Example of registering the log4net section handler : - - - -
    - - - log4net configuration XML goes here - - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Default constructor. - - - - - - Parses the configuration section. - - The configuration settings in a corresponding parent configuration section. - The configuration context when called from the ASP.NET configuration system. Otherwise, this parameter is reserved and is a null reference. - The for the log4net section. - The for the log4net section. - - - Returns the containing the configuration data, - - - - - - Assembly level attribute that specifies a plugin to attach to - the repository. - - - - Specifies the type of a plugin to create and attach to the - assembly's repository. The plugin type must implement the - interface. - - - Nicko Cadell - Gert Driesen - - - - Interface used to create plugins. - - - - Interface used to create a plugin. - - - Nicko Cadell - Gert Driesen - - - - Creates the plugin object. - - the new plugin instance - - - Create and return a new plugin instance. - - - - - - Initializes a new instance of the class - with the specified type. - - The type name of plugin to create. - - - Create the attribute with the plugin type specified. - - - Where possible use the constructor that takes a . - - - - - - Initializes a new instance of the class - with the specified type. - - The type of plugin to create. - - - Create the attribute with the plugin type specified. - - - - - - Creates the plugin object defined by this attribute. - - - - Creates the instance of the object as - specified by this attribute. - - - The plugin object. - - - - Returns a representation of the properties of this object. - - - - Overrides base class method to - return a representation of the properties of this object. - - - A representation of the properties of this object - - - - Gets or sets the type for the plugin. - - - The type for the plugin. - - - - The type for the plugin. - - - - - - Gets or sets the type name for the plugin. - - - The type name for the plugin. - - - - The type name for the plugin. - - - Where possible use the property instead. - - - - - - Assembly level attribute to configure the . - - - - This attribute may only be used at the assembly scope and can only - be used once per assembly. - - - Use this attribute to configure the - without calling one of the - methods. - - - Nicko Cadell - - - - Construct provider attribute with type specified - - the type of the provider to use - - - The provider specified must subclass the - class. - - - - - - Configures the SecurityContextProvider - - The assembly that this attribute was defined on. - The repository to configure. - - - Creates a provider instance from the specified. - Sets this as the default security context provider . - - - - - - The fully qualified type of the SecurityContextProviderAttribute class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or sets the type of the provider to use. - - - the type of the provider to use. - - - - The provider specified must subclass the - class. - - - - - - Use this class to initialize the log4net environment using an Xml tree. - - - - Configures a using an Xml tree. - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - - - Automatically configures the log4net system based on the - application's configuration settings. - - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - To use this method to configure log4net you must specify - the section - handler for the log4net configuration section. See the - for an example. - - - - - - - Automatically configures the using settings - stored in the application's configuration file. - - - - Each application has a configuration file. This has the - same name as the application with '.config' appended. - This file is XML and calling this function prompts the - configurator to look in that file for a section called - log4net that contains the configuration data. - - - To use this method to configure log4net you must specify - the section - handler for the log4net configuration section. See the - for an example. - - - The repository to configure. - - - - Configures log4net using a log4net element - - - - Loads the log4net configuration from the XML element - supplied as . - - - The element to parse. - - - - Configures the using the specified XML - element. - - - Loads the log4net configuration from the XML element - supplied as . - - The repository to configure. - The element to parse. - - - - Configures log4net using the specified configuration file. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The first element matching <configuration> will be read as the - configuration. If this file is also a .NET .config file then you must specify - a configuration section for the log4net element otherwise .NET will - complain. Set the type for the section handler to , for example: - - -
    - - - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures log4net using the specified configuration URI. - - A URI to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - The must support the URI scheme specified. - - - - - - Configures log4net using the specified configuration data stream. - - A stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the log4net configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The log4net configuration file can possible be specified in the application's - configuration file (either MyAppName.exe.config for a - normal application on Web.config for an ASP.NET application). - - - The first element matching <configuration> will be read as the - configuration. If this file is also a .NET .config file then you must specify - a configuration section for the log4net element otherwise .NET will - complain. Set the type for the section handler to , for example: - - -
    - - - - - The following example configures log4net using a configuration file, of which the - location is stored in the application's configuration file : - - - using log4net.Config; - using System.IO; - using System.Configuration; - - ... - - XmlConfigurator.Configure(new FileInfo(ConfigurationSettings.AppSettings["log4net-config-file"])); - - - In the .config file, the path to the log4net can be specified like this : - - - - - - - - - - - - - Configures the using the specified configuration - URI. - - The repository to configure. - A URI to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The must support the URI scheme specified. - - - - - - Configures the using the specified configuration - file. - - The repository to configure. - The stream to load the XML configuration from. - - - The configuration data must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - Note that this method will NOT close the stream parameter. - - - - - - Configures log4net using the file specified, monitors the file for changes - and reloads the configuration if a change is detected. - - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the using the file specified, - monitors the file for changes and reloads the configuration if a change - is detected. - - The repository to configure. - The XML file to load the configuration from. - - - The configuration file must be valid XML. It must contain - at least one element called log4net that holds - the configuration data. - - - The configuration file will be monitored using a - and depends on the behavior of that class. - - - For more information on how to configure log4net using - a separate configuration file, see . - - - - - - - Configures the specified repository using a log4net element. - - The hierarchy to configure. - The element to parse. - - - Loads the log4net configuration from the XML element - supplied as . - - - This method is ultimately called by one of the Configure methods - to load the configuration from an . - - - - - - Maps repository names to ConfigAndWatchHandler instances to allow a particular - ConfigAndWatchHandler to dispose of its FileSystemWatcher when a repository is - reconfigured. - - - - - The fully qualified type of the XmlConfigurator class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Class used to watch config files. - - - - Uses the to monitor - changes to a specified file. Because multiple change notifications - may be raised when the file is modified, a timer is used to - compress the notifications into a single event. The timer - waits for time before delivering - the event notification. If any further - change notifications arrive while the timer is waiting it - is reset and waits again for to - elapse. - - - - - - The default amount of time to wait after receiving notification - before reloading the config file. - - - - - Holds the FileInfo used to configure the XmlConfigurator - - - - - Holds the repository being configured. - - - - - The timer used to compress the notification events. - - - - - Watches file for changes. This object should be disposed when no longer - needed to free system handles on the watched resources. - - - - - Initializes a new instance of the class to - watch a specified config file used to configure a repository. - - The repository to configure. - The configuration file to watch. - - - Initializes a new instance of the class. - - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - - This handler reloads the configuration from the file when the event is fired. - - - - - - Event handler used by . - - The firing the event. - The argument indicates the file that caused the event to be fired. - - - This handler reloads the configuration from the file when the event is fired. - - - - - - Called by the timer when the configuration has been updated. - - null - - - - Release the handles held by the watcher and timer. - - - - - The implementation of the interface suitable - for use with the compact framework - - - - This implementation is a simple - mapping between repository name and - object. - - - The .NET Compact Framework 1.0 does not support retrieving assembly - level attributes therefore unlike the DefaultRepositorySelector - this selector does not examine the calling assembly for attributes. - - - Nicko Cadell - - - - Interface used by the to select the . - - - - The uses a - to specify the policy for selecting the correct - to return to the caller. - - - Nicko Cadell - Gert Driesen - - - - Gets the for the specified assembly. - - The assembly to use to lookup to the - The for the assembly. - - - Gets the for the specified assembly. - - - How the association between and - is made is not defined. The implementation may choose any method for - this association. The results of this method must be repeatable, i.e. - when called again with the same arguments the result must be the - save value. - - - - - - Gets the named . - - The name to use to lookup to the . - The named - - Lookup a named . This is the repository created by - calling . - - - - - Creates a new repository for the assembly specified. - - The assembly to use to create the domain to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the domain - specified such that a call to with the - same assembly specified will return the same repository instance. - - - How the association between and - is made is not defined. The implementation may choose any method for - this association. - - - - - - Creates a new repository with the name specified. - - The name to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the name - specified such that a call to with the - same name will return the same repository instance. - - - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets an array of all currently defined repositories. - - - An array of the instances created by - this . - - - Gets an array of all of the repositories created by this selector. - - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - Create a new repository selector - - the type of the repositories to create, must implement - - - Create an new compact repository selector. - The default type for repositories must be specified, - an appropriate value would be . - - - throw if is null - throw if does not implement - - - - Get the for the specified assembly - - not used - The default - - - The argument is not used. This selector does not create a - separate repository for each assembly. - - - As a named repository is not specified the default repository is - returned. The default repository is named log4net-default-repository. - - - - - - Get the named - - the name of the repository to lookup - The named - - - Get the named . The default - repository is log4net-default-repository. Other repositories - must be created using the . - If the named repository does not exist an exception is thrown. - - - throw if is null - throw if the does not exist - - - - Create a new repository for the assembly specified - - not used - the type of repository to create, must implement - the repository created - - - The argument is not used. This selector does not create a - separate repository for each assembly. - - - If the is null then the - default repository type specified to the constructor is used. - - - As a named repository is not specified the default repository is - returned. The default repository is named log4net-default-repository. - - - - - - Create a new repository for the repository specified - - the repository to associate with the - the type of repository to create, must implement . - If this param is null then the default repository type is used. - the repository created - - - The created will be associated with the repository - specified such that a call to with the - same repository specified will return the same repository instance. - - - If the named repository already exists an exception will be thrown. - - - If is null then the default - repository type specified to the constructor is used. - - - throw if is null - throw if the already exists - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets a list of objects - - an array of all known objects - - - Gets an array of all of the repositories created by this selector. - - - - - - The fully qualified type of the CompactRepositorySelector class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Notify the registered listeners that the repository has been created - - The repository that has been created - - - Raises the LoggerRepositoryCreatedEvent - event. - - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - The default implementation of the interface. - - - - Uses attributes defined on the calling assembly to determine how to - configure the hierarchy for the repository. - - - Nicko Cadell - Gert Driesen - - - - Creates a new repository selector. - - The type of the repositories to create, must implement - - - Create an new repository selector. - The default type for repositories must be specified, - an appropriate value would be . - - - is . - does not implement . - - - - Gets the for the specified assembly. - - The assembly use to lookup the . - - - The type of the created and the repository - to create can be overridden by specifying the - attribute on the . - - - The default values are to use the - implementation of the interface and to use the - as the name of the repository. - - - The created will be automatically configured using - any attributes defined on - the . - - - The for the assembly - is . - - - - Gets the for the specified repository. - - The repository to use to lookup the . - The for the specified repository. - - - Returns the named repository. If is null - a is thrown. If the repository - does not exist a is thrown. - - - Use to create a repository. - - - is . - does not exist. - - - - Create a new repository for the assembly specified - - the assembly to use to create the repository to associate with the . - The type of repository to create, must implement . - The repository created. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the repository to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the repository. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - is . - - - - Creates a new repository for the assembly specified. - - the assembly to use to create the repository to associate with the . - The type of repository to create, must implement . - The name to assign to the created repository - Set to true to read and apply the assembly attributes - The repository created. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The type of the created and - the repository to create can be overridden by specifying the - attribute on the - . The default values are to use the - implementation of the - interface and to use the - as the name of the repository. - - - The created will be automatically - configured using any - attributes defined on the . - - - If a repository for the already exists - that repository will be returned. An error will not be raised and that - repository may be of a different type to that specified in . - Also the attribute on the - assembly may be used to override the repository type specified in - . - - - is . - - - - Creates a new repository for the specified repository. - - The repository to associate with the . - The type of repository to create, must implement . - If this param is then the default repository type is used. - The new repository. - - - The created will be associated with the repository - specified such that a call to with the - same repository specified will return the same repository instance. - - - is . - already exists. - - - - Test if a named repository exists - - the named repository to check - true if the repository exists - - - Test if a named repository exists. Use - to create a new repository and to retrieve - a repository. - - - - - - Gets a list of objects - - an array of all known objects - - - Gets an array of all of the repositories created by this selector. - - - - - - Aliases a repository to an existing repository. - - The repository to alias. - The repository that the repository is aliased to. - - - The repository specified will be aliased to the repository when created. - The repository must not already exist. - - - When the repository is created it must utilize the same repository type as - the repository it is aliased to, otherwise the aliasing will fail. - - - - is . - -or- - is . - - - - - Notifies the registered listeners that the repository has been created. - - The repository that has been created. - - - Raises the event. - - - - - - Gets the repository name and repository type for the specified assembly. - - The assembly that has a . - in/out param to hold the repository name to use for the assembly, caller should set this to the default value before calling. - in/out param to hold the type of the repository to create for the assembly, caller should set this to the default value before calling. - is . - - - - Configures the repository using information from the assembly. - - The assembly containing - attributes which define the configuration for the repository. - The repository to configure. - - is . - -or- - is . - - - - - Loads the attribute defined plugins on the assembly. - - The assembly that contains the attributes. - The repository to add the plugins to. - - is . - -or- - is . - - - - - Loads the attribute defined aliases on the assembly. - - The assembly that contains the attributes. - The repository to alias to. - - is . - -or- - is . - - - - - The fully qualified type of the DefaultRepositorySelector class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Event to notify that a logger repository has been created. - - - Event to notify that a logger repository has been created. - - - - Event raised when a new repository is created. - The event source will be this selector. The event args will - be a which - holds the newly created . - - - - - - Defined error codes that can be passed to the method. - - - - Values passed to the method. - - - Nicko Cadell - - - - A general error - - - - - Error while writing output - - - - - Failed to flush file - - - - - Failed to close file - - - - - Unable to open output file - - - - - No layout specified - - - - - Failed to parse address - - - - - An evaluator that triggers on an Exception type - - - - This evaluator will trigger if the type of the Exception - passed to - is equal to a Type in . /// - - - Drew Schaeffer - - - - Test if an triggers an action - - - - Implementations of this interface allow certain appenders to decide - when to perform an appender specific action. - - - The action or behavior triggered is defined by the implementation. - - - Nicko Cadell - - - - Test if this event triggers the action - - The event to check - true if this event triggers the action, otherwise false - - - Return true if this event triggers the action - - - - - - The type that causes the trigger to fire. - - - - - Causes subclasses of to cause the trigger to fire. - - - - - Default ctor to allow dynamic creation through a configurator. - - - - - Constructs an evaluator and initializes to trigger on - - the type that triggers this evaluator. - If true, this evaluator will trigger on subclasses of . - - - - Is this the triggering event? - - The event to check - This method returns true, if the logging event Exception - Type is . - Otherwise it returns false - - - This evaluator will trigger if the Exception Type of the event - passed to - is . - - - - - - The type that triggers this evaluator. - - - - - If true, this evaluator will trigger on subclasses of . - - - - - Appenders may delegate their error handling to an . - - - - Error handling is a particularly tedious to get right because by - definition errors are hard to predict and to reproduce. - - - Nicko Cadell - Gert Driesen - - - - Handles the error and information about the error condition is passed as - a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - The error code associated with the error. - - - Handles the error and information about the error condition is passed as - a parameter. - - - - - - Prints the error message passed as a parameter. - - The message associated with the error. - The that was thrown when the error occurred. - - - See . - - - - - - Prints the error message passed as a parameter. - - The message associated with the error. - - - See . - - - - - - Interface for objects that require fixing. - - - - Interface that indicates that the object requires fixing before it - can be taken outside the context of the appender's - method. - - - When objects that implement this interface are stored - in the context properties maps - and - are fixed - (see ) the - method will be called. - - - Nicko Cadell - - - - Get a portable version of this object - - the portable instance of this object - - - Get a portable instance object that represents the current - state of this object. The portable object can be stored - and logged from any thread with identical results. - - - - - - Interface that all loggers implement - - - - This interface supports logging events and testing if a level - is enabled for logging. - - - These methods will not throw exceptions. Note to implementor, ensure - that the implementation of these methods cannot allow an exception - to be thrown to the caller. - - - Nicko Cadell - Gert Driesen - - - - This generic form is intended to be used by wrappers. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - the exception to log, including its stack trace. Pass null to not log an exception. - - - Generates a logging event for the specified using - the and . - - - - - - This is the most generic printing method that is intended to be used - by wrappers. - - The event being logged. - - - Logs the specified logging event through this logger. - - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - Test if this logger is going to log events of the specified . - - - - - - Gets the name of the logger. - - - The name of the logger. - - - - The name of this logger - - - - - - Gets the where this - Logger instance is attached to. - - - The that this logger belongs to. - - - - Gets the where this - Logger instance is attached to. - - - - - - Base interface for all wrappers - - - - Base interface for all wrappers. - - - All wrappers must implement this interface. - - - Nicko Cadell - - - - Get the implementation behind this wrapper object. - - - The object that in implementing this object. - - - - The object that in implementing this - object. The Logger object may not - be the same object as this object because of logger decorators. - This gets the actual underlying objects that is used to process - the log events. - - - - - - Delegate used to handle logger repository creation event notifications - - The which created the repository. - The event args - that holds the instance that has been created. - - - Delegate used to handle logger repository creation event notifications. - - - - - - Provides data for the event. - - - - A - event is raised every time a is created. - - - - - - The created - - - - - Construct instance using specified - - the that has been created - - - Construct instance using specified - - - - - - The that has been created - - - The that has been created - - - - The that has been created - - - - - - Defines the default set of levels recognized by the system. - - - - Each has an associated . - - - Levels have a numeric that defines the relative - ordering between levels. Two Levels with the same - are deemed to be equivalent. - - - The levels that are recognized by log4net are set for each - and each repository can have different levels defined. The levels are stored - in the on the repository. Levels are - looked up by name from the . - - - When logging at level INFO the actual level used is not but - the value of LoggerRepository.LevelMap["INFO"]. The default value for this is - , but this can be changed by reconfiguring the level map. - - - Each level has a in addition to its . The - is the string that is written into the output log. By default - the display name is the same as the level name, but this can be used to alias levels - or to localize the log output. - - - Some of the predefined levels recognized by the system are: - - - - . - - - . - - - . - - - . - - - . - - - . - - - . - - - - Nicko Cadell - Gert Driesen - - - - Constructor - - Integer value for this level, higher values represent more severe levels. - The string name of this level. - The display name for this level. This may be localized or otherwise different from the name - - - Initializes a new instance of the class with - the specified level name and value. - - - - - - Constructor - - Integer value for this level, higher values represent more severe levels. - The string name of this level. - - - Initializes a new instance of the class with - the specified level name and value. - - - - - - Returns the representation of the current - . - - - A representation of the current . - - - - Returns the level . - - - - - - Compares levels. - - The object to compare against. - true if the objects are equal. - - - Compares the levels of instances, and - defers to base class if the target object is not a - instance. - - - - - - Returns a hash code - - A hash code for the current . - - - Returns a hash code suitable for use in hashing algorithms and data - structures like a hash table. - - - Returns the hash code of the level . - - - - - - Compares this instance to a specified object and returns an - indication of their relative values. - - A instance or to compare with this instance. - - A 32-bit signed integer that indicates the relative order of the - values compared. The return value has these meanings: - - - Value - Meaning - - - Less than zero - This instance is less than . - - - Zero - This instance is equal to . - - - Greater than zero - - This instance is greater than . - -or- - is . - - - - - - - must be an instance of - or ; otherwise, an exception is thrown. - - - is not a . - - - - Returns a value indicating whether a specified - is greater than another specified . - - A - A - - true if is greater than - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is less than another specified . - - A - A - - true if is less than - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is greater than or equal to another specified . - - A - A - - true if is greater than or equal to - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether a specified - is less than or equal to another specified . - - A - A - - true if is less than or equal to - ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether two specified - objects have the same value. - - A or . - A or . - - true if the value of is the same as the - value of ; otherwise, false. - - - - Compares two levels. - - - - - - Returns a value indicating whether two specified - objects have different values. - - A or . - A or . - - true if the value of is different from - the value of ; otherwise, false. - - - - Compares two levels. - - - - - - Compares two specified instances. - - The first to compare. - The second to compare. - - A 32-bit signed integer that indicates the relative order of the - two values compared. The return value has these meanings: - - - Value - Meaning - - - Less than zero - is less than . - - - Zero - is equal to . - - - Greater than zero - is greater than . - - - - - - Compares two levels. - - - - - - The level designates a higher level than all the rest. - - - - - The level designates very severe error events. - System unusable, emergencies. - - - - - The level designates very severe error events. - System unusable, emergencies. - - - - - The level designates very severe error events - that will presumably lead the application to abort. - - - - - The level designates very severe error events. - Take immediate action, alerts. - - - - - The level designates very severe error events. - Critical condition, critical. - - - - - The level designates very severe error events. - - - - - The level designates error events that might - still allow the application to continue running. - - - - - The level designates potentially harmful - situations. - - - - - The level designates informational messages - that highlight the progress of the application at the highest level. - - - - - The level designates informational messages that - highlight the progress of the application at coarse-grained level. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates fine-grained informational - events that are most useful to debug an application. - - - - - The level designates the lowest level possible. - - - - - Gets the name of this level. - - - The name of this level. - - - - Gets the name of this level. - - - - - - Gets the value of this level. - - - The value of this level. - - - - Gets the value of this level. - - - - - - Gets the display name of this level. - - - The display name of this level. - - - - Gets the display name of this level. - - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a LevelCollection instance. - - list to create a readonly wrapper arround - - A LevelCollection wrapper that is read-only. - - - - - Initializes a new instance of the LevelCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the LevelCollection class - that has the specified initial capacity. - - - The number of elements that the new LevelCollection is initially capable of storing. - - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified LevelCollection. - - The LevelCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the LevelCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - Copies the entire LevelCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire LevelCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the LevelCollection. - - The to be added to the end of the LevelCollection. - The index at which the value has been added. - - - - Removes all elements from the LevelCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the LevelCollection. - - The to check for. - true if is found in the LevelCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the LevelCollection. - - The to locate in the LevelCollection. - - The zero-based index of the first occurrence of - in the entire LevelCollection, if found; otherwise, -1. - - - - - Inserts an element into the LevelCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the LevelCollection. - - The to remove from the LevelCollection. - - The specified was not found in the LevelCollection. - - - - - Removes the element at the specified index of the LevelCollection. - - The zero-based index of the element to remove. - - is less than zero - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the LevelCollection. - - An for the entire LevelCollection. - - - - Adds the elements of another LevelCollection to the current LevelCollection. - - The LevelCollection whose elements should be added to the end of the current LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a array to the current LevelCollection. - - The array whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Adds the elements of a collection to the current LevelCollection. - - The collection whose elements should be added to the end of the LevelCollection. - The new of the LevelCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero - -or- - is equal to or greater than . - - - - - is less than zero - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the LevelCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - The zero-based index of the element to get or set. - - is less than zero - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false - - - - Gets or sets the number of elements the LevelCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - A value - - - - - Supports simple iteration over a . - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - An evaluator that triggers at a threshold level - - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - Nicko Cadell - - - - The threshold for triggering - - - - - Create a new evaluator using the threshold. - - - - Create a new evaluator using the threshold. - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Create a new evaluator using the specified threshold. - - the threshold to trigger at - - - Create a new evaluator using the specified threshold. - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Is this the triggering event? - - The event to check - This method returns true, if the event level - is equal or higher than the . - Otherwise it returns false - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - the threshold to trigger at - - - The that will cause this evaluator to trigger - - - - This evaluator will trigger if the level of the event - passed to - is equal to or greater than the - level. - - - - - - Mapping between string name and Level object - - - - Mapping between string name and object. - This mapping is held separately for each . - The level name is case insensitive. - - - Nicko Cadell - - - - Mapping from level name to Level object. The - level name is case insensitive - - - - - Construct the level map - - - - Construct the level map. - - - - - - Clear the internal maps of all levels - - - - Clear the internal maps of all levels - - - - - - Create a new Level and add it to the map - - the string to display for the Level - the level value to give to the Level - - - Create a new Level and add it to the map - - - - - - - Create a new Level and add it to the map - - the string to display for the Level - the level value to give to the Level - the display name to give to the Level - - - Create a new Level and add it to the map - - - - - - Add a Level to the map - - the Level to add - - - Add a Level to the map - - - - - - Lookup a named level from the map - - the name of the level to lookup is taken from this level. - If the level is not set on the map then this level is added - the level in the map with the name specified - - - Lookup a named level from the map. The name of the level to lookup is taken - from the property of the - argument. - - - If no level with the specified name is found then the - argument is added to the level map - and returned. - - - - - - Lookup a by name - - The name of the Level to lookup - a Level from the map with the name specified - - - Returns the from the - map with the name specified. If the no level is - found then null is returned. - - - - - - Return all possible levels as a list of Level objects. - - all possible levels as a list of Level objects - - - Return all possible levels as a list of Level objects. - - - - - - The internal representation of caller location information. - - - - This class uses the System.Diagnostics.StackTrace class to generate - a call stack. The caller's information is then extracted from this stack. - - - The System.Diagnostics.StackTrace class is not supported on the - .NET Compact Framework 1.0 therefore caller location information is not - available on that framework. - - - The System.Diagnostics.StackTrace class has this to say about Release builds: - - - "StackTrace information will be most informative with Debug build configurations. - By default, Debug builds include debug symbols, while Release builds do not. The - debug symbols contain most of the file, method name, line number, and column - information used in constructing StackFrame and StackTrace objects. StackTrace - might not report as many method calls as expected, due to code transformations - that occur during optimization." - - - This means that in a Release build the caller information may be incomplete or may - not exist at all! Therefore caller location information cannot be relied upon in a Release build. - - - Nicko Cadell - Gert Driesen - - - - When location information is not available the constant - NA is returned. Current value of this string - constant is ?. - - - - - Constructor - - The declaring type of the method that is - the stack boundary into the logging system for this call. - - - Initializes a new instance of the - class based on the current thread. - - - - - - Constructor - - The fully qualified class name. - The method name. - The file name. - The line number of the method within the file. - - - Initializes a new instance of the - class with the specified data. - - - - - - The fully qualified type of the LocationInfo class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets the fully qualified class name of the caller making the logging - request. - - - The fully qualified class name of the caller making the logging - request. - - - - Gets the fully qualified class name of the caller making the logging - request. - - - - - - Gets the file name of the caller. - - - The file name of the caller. - - - - Gets the file name of the caller. - - - - - - Gets the line number of the caller. - - - The line number of the caller. - - - - Gets the line number of the caller. - - - - - - Gets the method name of the caller. - - - The method name of the caller. - - - - Gets the method name of the caller. - - - - - - Gets all available caller information - - - All available caller information, in the format - fully.qualified.classname.of.caller.methodName(Filename:line) - - - - Gets all available caller information, in the format - fully.qualified.classname.of.caller.methodName(Filename:line) - - - - - - Gets the stack frames from the stack trace of the caller making the log request - - - - - Static manager that controls the creation of repositories - - - - Static manager that controls the creation of repositories - - - This class is used by the wrapper managers (e.g. ) - to provide access to the objects. - - - This manager also holds the that is used to - lookup and create repositories. The selector can be set either programmatically using - the property, or by setting the log4net.RepositorySelector - AppSetting in the applications config file to the fully qualified type name of the - selector to use. - - - Nicko Cadell - Gert Driesen - - - - Private constructor to prevent instances. Only static methods should be used. - - - - Private constructor to prevent instances. Only static methods should be used. - - - - - - Hook the shutdown event - - - - On the full .NET runtime, the static constructor hooks up the - AppDomain.ProcessExit and AppDomain.DomainUnload> events. - These are used to shutdown the log4net system as the application exits. - - - - - - Register for ProcessExit and DomainUnload events on the AppDomain - - - - This needs to be in a separate method because the events make - a LinkDemand for the ControlAppDomain SecurityPermission. Because - this is a LinkDemand it is demanded at JIT time. Therefore we cannot - catch the exception in the method itself, we have to catch it in the - caller. - - - - - - Return the default instance. - - the repository to lookup in - Return the default instance - - - Gets the for the repository specified - by the argument. - - - - - - Returns the default instance. - - The assembly to use to lookup the repository. - The default instance. - - - - Return the default instance. - - the repository to lookup in - Return the default instance - - - Gets the for the repository specified - by the argument. - - - - - - Returns the default instance. - - The assembly to use to lookup the repository. - The default instance. - - - Returns the default instance. - - - - - - Returns the named logger if it exists. - - The repository to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified repository. - - - - If the named logger exists (in the specified repository) then it - returns a reference to the logger, otherwise it returns - null. - - - - - - Returns the named logger if it exists. - - The assembly to use to lookup the repository. - The fully qualified logger name to look for. - - The logger found, or null if the named logger does not exist in the - specified assembly's repository. - - - - If the named logger exists (in the specified assembly's repository) then it - returns a reference to the logger, otherwise it returns - null. - - - - - - Returns all the currently defined loggers in the specified repository. - - The repository to lookup in. - All the defined loggers. - - - The root logger is not included in the returned array. - - - - - - Returns all the currently defined loggers in the specified assembly's repository. - - The assembly to use to lookup the repository. - All the defined loggers. - - - The root logger is not included in the returned array. - - - - - - Retrieves or creates a named logger. - - The repository to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - - - - Retrieves or creates a named logger. - - The assembly to use to lookup the repository. - The name of the logger to retrieve. - The logger with the name specified. - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - - - - Shorthand for . - - The repository to lookup in. - The of which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - Gets the logger for the fully qualified name of the type specified. - - - - - - Shorthand for . - - the assembly to use to lookup the repository - The of which the fullname will be used as the name of the logger to retrieve. - The logger with the name specified. - - - Gets the logger for the fully qualified name of the type specified. - - - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - The repository to shutdown. - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - The assembly to use to lookup the repository. - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository for the repository. The repository is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Resets all values contained in this repository instance to their defaults. - - The repository to reset. - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - - - - Resets all values contained in this repository instance to their defaults. - - The assembly to use to lookup the repository to reset. - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - - - - Creates a repository with the specified name. - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name. - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The name must be unique. Repositories cannot be redefined. - An Exception will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The name must be unique. Repositories cannot be redefined. - An Exception will be thrown if the repository already exists. - - - The specified repository already exists. - - - - Creates a repository for the specified assembly and repository type. - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Creates a repository for the specified assembly and repository type. - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - - - - Gets an array of all currently defined repositories. - - An array of all the known objects. - - - Gets an array of all currently defined repositories. - - - - - - Internal method to get pertinent version info. - - A string of version info. - - - - Called when the event fires - - the that is exiting - null - - - Called when the event fires. - - - When the event is triggered the log4net system is . - - - - - - Called when the event fires - - the that is exiting - null - - - Called when the event fires. - - - When the event is triggered the log4net system is . - - - - - - The fully qualified type of the LoggerManager class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Initialize the default repository selector - - - - - Gets or sets the repository selector used by the . - - - The repository selector used by the . - - - - The repository selector () is used by - the to create and select repositories - (). - - - The caller to supplies either a string name - or an assembly (if not supplied the assembly is inferred using - ). - - - This context is used by the selector to lookup a specific repository. - - - For the full .NET Framework, the default repository is DefaultRepositorySelector; - for the .NET Compact Framework CompactRepositorySelector is the default - repository. - - - - - - Implementation of the interface. - - - - This class should be used as the base for all wrapper implementations. - - - Nicko Cadell - Gert Driesen - - - - Constructs a new wrapper for the specified logger. - - The logger to wrap. - - - Constructs a new wrapper for the specified logger. - - - - - - The logger that this object is wrapping - - - - - Gets the implementation behind this wrapper object. - - - The object that this object is implementing. - - - - The Logger object may not be the same object as this object - because of logger decorators. - - - This gets the actual underlying objects that is used to process - the log events. - - - - - - Portable data structure used by - - - - Portable data structure used by - - - Nicko Cadell - - - - The logger name. - - - - The logger name. - - - - - - Level of logging event. - - - - Level of logging event. Level cannot be Serializable - because it is a flyweight. Due to its special serialization it - cannot be declared final either. - - - - - - The application supplied message. - - - - The application supplied message of logging event. - - - - - - The name of thread - - - - The name of thread in which this logging event was generated - - - - - - The time the event was logged - - - - The TimeStamp is stored in the local time zone for this computer. - - - - - - Location information for the caller. - - - - Location information for the caller. - - - - - - String representation of the user - - - - String representation of the user's windows name, - like DOMAIN\username - - - - - - String representation of the identity. - - - - String representation of the current thread's principal identity. - - - - - - The string representation of the exception - - - - The string representation of the exception - - - - - - String representation of the AppDomain. - - - - String representation of the AppDomain. - - - - - - Additional event specific properties - - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - - - - Flags passed to the property - - - - Flags passed to the property - - - Nicko Cadell - - - - Fix the MDC - - - - - Fix the NDC - - - - - Fix the rendered message - - - - - Fix the thread name - - - - - Fix the callers location information - - - CAUTION: Very slow to generate - - - - - Fix the callers windows user name - - - CAUTION: Slow to generate - - - - - Fix the domain friendly name - - - - - Fix the callers principal name - - - CAUTION: May be slow to generate - - - - - Fix the exception text - - - - - Fix the event properties. Active properties must implement in order to be eligible for fixing. - - - - - No fields fixed - - - - - All fields fixed - - - - - Partial fields fixed - - - - This set of partial fields gives good performance. The following fields are fixed: - - - - - - - - - - - - - The internal representation of logging events. - - - - When an affirmative decision is made to log then a - instance is created. This instance - is passed around to the different log4net components. - - - This class is of concern to those wishing to extend log4net. - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - Nicko Cadell - Gert Driesen - Douglas de la Torre - Daniel Cazzulino - - - - The key into the Properties map for the host name value. - - - - - The key into the Properties map for the thread identity value. - - - - - The key into the Properties map for the user name value. - - - - - Initializes a new instance of the class - from the supplied parameters. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - The name of the logger of this event. - The level of this event. - The message of this event. - The exception for this event. - - - Except , and , - all fields of LoggingEvent are filled when actually needed. Call - to cache all data locally - to prevent inconsistencies. - - This method is called by the log4net framework - to create a logging event. - - - - - - Initializes a new instance of the class - using specific data. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - Data used to initialize the logging event. - The fields in the struct that have already been fixed. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - The parameter should be used to specify which fields in the - struct have been preset. Fields not specified in the - will be captured from the environment if requested or fixed. - - - - - - Initializes a new instance of the class - using specific data. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The repository this event is logged in. - Data used to initialize the logging event. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - This constructor sets this objects flags to , - this assumes that all the data relating to this event is passed in via the - parameter and no other data should be captured from the environment. - - - - - - Initializes a new instance of the class - using specific data. - - Data used to initialize the logging event. - - - This constructor is provided to allow a - to be created independently of the log4net framework. This can - be useful if you require a custom serialization scheme. - - - Use the method to obtain an - instance of the class. - - - This constructor sets this objects flags to , - this assumes that all the data relating to this event is passed in via the - parameter and no other data should be captured from the environment. - - - - - - Serialization constructor - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Ensure that the repository is set. - - the value for the repository - - - - Write the rendered message to a TextWriter - - the writer to write the message to - - - Unlike the property this method - does store the message data in the internal cache. Therefore - if called only once this method should be faster than the - property, however if the message is - to be accessed multiple times then the property will be more efficient. - - - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - The data in this event must be fixed before it can be serialized. - - - The method must be called during the - method call if this event - is to be used outside that method. - - - - - - Gets the portable data for this . - - The for this event. - - - A new can be constructed using a - instance. - - - Does a fix of the data - in the logging event before returning the event data. - - - - - - Gets the portable data for this . - - The set of data to ensure is fixed in the LoggingEventData - The for this event. - - - A new can be constructed using a - instance. - - - - - - Returns this event's exception's rendered using the - . - - - This event's exception's rendered using the . - - - - Obsolete. Use instead. - - - - - - Returns this event's exception's rendered using the - . - - - This event's exception's rendered using the . - - - - Returns this event's exception's rendered using the - . - - - - - - Fix instance fields that hold volatile data. - - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - incurred by calling but it - is essential to maintaining data consistency. - - - Calling is equivalent to - calling passing the parameter - false. - - - See for more - information. - - - - - - Fixes instance fields that hold volatile data. - - Set to true to not fix data that takes a long time to fix. - - - Some of the values in instances of - are considered volatile, that is the values are correct at the - time the event is delivered to appenders, but will not be consistent - at any time afterwards. If an event is to be stored and then processed - at a later time these volatile values must be fixed by calling - . There is a performance penalty - for incurred by calling but it - is essential to maintaining data consistency. - - - The param controls the data that - is fixed. Some of the data that can be fixed takes a long time to - generate, therefore if you do not require those settings to be fixed - they can be ignored by setting the param - to true. This setting will ignore the - and settings. - - - Set to false to ensure that all - settings are fixed. - - - - - - Fix the fields specified by the parameter - - the fields to fix - - - Only fields specified in the will be fixed. - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - - Lookup a composite property in this event - - the key for the property to lookup - the value for the property - - - This event has composite properties that combine together properties from - several different contexts in the following order: - - - this events properties - - This event has that can be set. These - properties are specific to this event only. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - - - Get all the composite properties in this event - - the containing all the properties - - - See for details of the composite properties - stored by the event. - - - This method returns a single containing all the - properties defined for this event. - - - - - - The internal logging event data. - - - - - The internal logging event data. - - - - - The internal logging event data. - - - - - The fully qualified Type of the calling - logger class in the stack frame (i.e. the declaring type of the method). - - - - - The application supplied message of logging event. - - - - - The exception that was thrown. - - - This is not serialized. The string representation - is serialized instead. - - - - - The repository that generated the logging event - - - This is not serialized. - - - - - The fix state for this event - - - These flags indicate which fields have been fixed. - Not serialized. - - - - - Indicated that the internal cache is updateable (ie not fixed) - - - This is a seperate flag to m_fixFlags as it allows incrementel fixing and simpler - changes in the caching strategy. - - - - - Gets the time when the current process started. - - - This is the time when this process started. - - - - The TimeStamp is stored in the local time zone for this computer. - - - Tries to get the start time for the current process. - Failing that it returns the time of the first call to - this property. - - - Note that AppDomains may be loaded and unloaded within the - same process without the process terminating and therefore - without the process start time being reset. - - - - - - Gets the of the logging event. - - - The of the logging event. - - - - Gets the of the logging event. - - - - - - Gets the time of the logging event. - - - The time of the logging event. - - - - The TimeStamp is stored in the local time zone for this computer. - - - - - - Gets the name of the logger that logged the event. - - - The name of the logger that logged the event. - - - - Gets the name of the logger that logged the event. - - - - - - Gets the location information for this logging event. - - - The location information for this logging event. - - - - The collected information is cached for future use. - - - See the class for more information on - supported frameworks and the different behavior in Debug and - Release builds. - - - - - - Gets the message object used to initialize this event. - - - The message object used to initialize this event. - - - - Gets the message object used to initialize this event. - Note that this event may not have a valid message object. - If the event is serialized the message object will not - be transferred. To get the text of the message the - property must be used - not this property. - - - If there is no defined message object for this event then - null will be returned. - - - - - - Gets the exception object used to initialize this event. - - - The exception object used to initialize this event. - - - - Gets the exception object used to initialize this event. - Note that this event may not have a valid exception object. - If the event is serialized the exception object will not - be transferred. To get the text of the exception the - method must be used - not this property. - - - If there is no defined exception object for this event then - null will be returned. - - - - - - The that this event was created in. - - - - The that this event was created in. - - - - - - Gets the message, rendered through the . - - - The message rendered through the . - - - - The collected information is cached for future use. - - - - - - Gets the name of the current thread. - - - The name of the current thread, or the thread ID when - the name is not available. - - - - The collected information is cached for future use. - - - - - - Gets the name of the current user. - - - The name of the current user, or NOT AVAILABLE when the - underlying runtime has no support for retrieving the name of the - current user. - - - - Calls WindowsIdentity.GetCurrent().Name to get the name of - the current windows user. - - - To improve performance, we could cache the string representation of - the name, and reuse that as long as the identity stayed constant. - Once the identity changed, we would need to re-assign and re-render - the string. - - - However, the WindowsIdentity.GetCurrent() call seems to - return different objects every time, so the current implementation - doesn't do this type of caching. - - - Timing for these operations: - - - - Method - Results - - - WindowsIdentity.GetCurrent() - 10000 loops, 00:00:00.2031250 seconds - - - WindowsIdentity.GetCurrent().Name - 10000 loops, 00:00:08.0468750 seconds - - - - This means we could speed things up almost 40 times by caching the - value of the WindowsIdentity.GetCurrent().Name property, since - this takes (8.04-0.20) = 7.84375 seconds. - - - - - - Gets the identity of the current thread principal. - - - The string name of the identity of the current thread principal. - - - - Calls System.Threading.Thread.CurrentPrincipal.Identity.Name to get - the name of the current thread principal. - - - - - - Gets the AppDomain friendly name. - - - The AppDomain friendly name. - - - - Gets the AppDomain friendly name. - - - - - - Additional event specific properties. - - - Additional event specific properties. - - - - A logger or an appender may attach additional - properties to specific events. These properties - have a string key and an object value. - - - This property is for events that have been added directly to - this event. The aggregate properties (which include these - event properties) can be retrieved using - and . - - - Once the properties have been fixed this property - returns the combined cached properties. This ensures that updates to - this property are always reflected in the underlying storage. When - returning the combined properties there may be more keys in the - Dictionary than expected. - - - - - - The fixed fields in this event - - - The set of fields that are fixed in this event - - - - Fields will not be fixed if they have previously been fixed. - It is not possible to 'unfix' a field. - - - - - - Implementation of wrapper interface. - - - - This implementation of the interface - forwards to the held by the base class. - - - This logger has methods to allow the caller to log at the following - levels: - - - - DEBUG - - The and methods log messages - at the DEBUG level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - INFO - - The and methods log messages - at the INFO level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - WARN - - The and methods log messages - at the WARN level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - ERROR - - The and methods log messages - at the ERROR level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - FATAL - - The and methods log messages - at the FATAL level. That is the level with that name defined in the - repositories . The default value - for this level is . The - property tests if this level is enabled for logging. - - - - - The values for these levels and their semantic meanings can be changed by - configuring the for the repository. - - - Nicko Cadell - Gert Driesen - - - - The ILog interface is use by application to log messages into - the log4net framework. - - - - Use the to obtain logger instances - that implement this interface. The - static method is used to get logger instances. - - - This class contains methods for logging at different levels and also - has properties for determining if those logging levels are - enabled in the current configuration. - - - This interface can be implemented in different ways. This documentation - specifies reasonable behavior that a caller can expect from the actual - implementation, however different implementations reserve the right to - do things differently. - - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - Nicko Cadell - Gert Driesen - - - Log a message object with the level. - - Log a message object with the level. - - The message object to log. - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Logs a message object with the level. - - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Logs a message object with the INFO level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Log a message object with the level. - - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Logs a message object with the level. - - The message object to log. - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - Log a message object with the level. - - Log a message object with the level. - - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - The message object to log. - - - - - - Log a message object with the level including - the stack trace of the passed - as a parameter. - - The message object to log. - The exception to log, including its stack trace. - - - See the form for more detailed information. - - - - - - - Log a formatted message string with the level. - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Logs a formatted message string with the level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the String.Format method. See - for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - For some ILog interface log, when you write: - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, string construction and concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed (who isn't), then you should write: - - - if (log.IsDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in and once in - the . This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. This is the preferred style of logging. - - Alternatively if your logger is available statically then the is debug - enabled state can be stored in a static variable like this: - - - private static readonly bool isDebugEnabled = log.IsDebugEnabled; - - - Then when you come to log you can write: - - - if (isDebugEnabled) - { - log.Debug("This is entry number: " + i ); - } - - - This way the debug enabled state is only queried once - when the class is loaded. Using a private static readonly - variable is the most efficient because it is a run time constant - and can be heavily optimized by the JIT compiler. - - - Of course if you use a static readonly variable to - hold the enabled state of the logger then you cannot - change the enabled state at runtime to vary the logging - that is produced. You have to decide if you need absolute - speed or runtime flexibility. - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Checks if this logger is enabled for the level. - - - true if this logger is enabled for events, false otherwise. - - - For more information see . - - - - - - - - Construct a new wrapper for the specified logger. - - The logger to wrap. - - - Construct a new wrapper for the specified logger. - - - - - - Virtual method called when the configuration of the repository changes - - the repository holding the levels - - - Virtual method called when the configuration of the repository changes - - - - - - Logs a message object with the DEBUG level. - - The message object to log. - - - This method first checks if this logger is DEBUG - enabled by comparing the level of this logger with the - DEBUG level. If this logger is - DEBUG enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the DEBUG level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the DEBUG level including - the stack trace of the passed - as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the DEBUG level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the INFO level. - - The message object to log. - - - This method first checks if this logger is INFO - enabled by comparing the level of this logger with the - INFO level. If this logger is - INFO enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger - and also higher in the hierarchy depending on the value of - the additivity flag. - - - WARNING Note that passing an - to this method will print the name of the - but no stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the INFO level. - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the INFO level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the INFO level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the WARN level. - - the message object to log - - - This method first checks if this logger is WARN - enabled by comparing the level of this logger with the - WARN level. If this logger is - WARN enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the WARN level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the WARN level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the WARN level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the ERROR level. - - The message object to log. - - - This method first checks if this logger is ERROR - enabled by comparing the level of this logger with the - ERROR level. If this logger is - ERROR enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the ERROR level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the ERROR level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the ERROR level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a message object with the FATAL level. - - The message object to log. - - - This method first checks if this logger is FATAL - enabled by comparing the level of this logger with the - FATAL level. If this logger is - FATAL enabled, then it converts the message object - (passed as parameter) to a string by invoking the appropriate - . It then - proceeds to call all the registered appenders in this logger and - also higher in the hierarchy depending on the value of the - additivity flag. - - - WARNING Note that passing an to this - method will print the name of the but no - stack trace. To print a stack trace use the - form instead. - - - - - - Logs a message object with the FATAL level - - The message object to log. - The exception to log, including its stack trace. - - - Logs a message object with the FATAL level including - the stack trace of the - passed as a parameter. - - - See the form for more detailed information. - - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - A String containing zero or more format items - An Object to format - An Object to format - An Object to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - The string is formatted using the - format provider. To specify a localized provider use the - method. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Logs a formatted message string with the FATAL level. - - An that supplies culture-specific formatting information - A String containing zero or more format items - An Object array containing zero or more objects to format - - - The message is formatted using the method. See - String.Format for details of the syntax of the format string and the behavior - of the formatting. - - - This method does not take an object to include in the - log event. To pass an use one of the - methods instead. - - - - - - Event handler for the event - - the repository - Empty - - - - The fully qualified name of this declaring type not the type of any subclass. - - - - - Checks if this logger is enabled for the DEBUG - level. - - - true if this logger is enabled for DEBUG events, - false otherwise. - - - - This function is intended to lessen the computational cost of - disabled log debug statements. - - - For some log Logger object, when you write: - - - log.Debug("This is entry number: " + i ); - - - You incur the cost constructing the message, concatenation in - this case, regardless of whether the message is logged or not. - - - If you are worried about speed, then you should write: - - - if (log.IsDebugEnabled()) - { - log.Debug("This is entry number: " + i ); - } - - - This way you will not incur the cost of parameter - construction if debugging is disabled for log. On - the other hand, if the log is debug enabled, you - will incur the cost of evaluating whether the logger is debug - enabled twice. Once in IsDebugEnabled and once in - the Debug. This is an insignificant overhead - since evaluating a logger takes about 1% of the time it - takes to actually log. - - - - - - Checks if this logger is enabled for the INFO level. - - - true if this logger is enabled for INFO events, - false otherwise. - - - - See for more information and examples - of using this method. - - - - - - - Checks if this logger is enabled for the WARN level. - - - true if this logger is enabled for WARN events, - false otherwise. - - - - See for more information and examples - of using this method. - - - - - - - Checks if this logger is enabled for the ERROR level. - - - true if this logger is enabled for ERROR events, - false otherwise. - - - - See for more information and examples of using this method. - - - - - - - Checks if this logger is enabled for the FATAL level. - - - true if this logger is enabled for FATAL events, - false otherwise. - - - - See for more information and examples of using this method. - - - - - - - A SecurityContext used by log4net when interacting with protected resources - - - - A SecurityContext used by log4net when interacting with protected resources - for example with operating system services. This can be used to impersonate - a principal that has been granted privileges on the system resources. - - - Nicko Cadell - - - - Impersonate this SecurityContext - - State supplied by the caller - An instance that will - revoke the impersonation of this SecurityContext, or null - - - Impersonate this security context. Further calls on the current - thread should now be made in the security context provided - by this object. When the result - method is called the security - context of the thread should be reverted to the state it was in - before was called. - - - - - - The providers default instances. - - - - A configured component that interacts with potentially protected system - resources uses a to provide the elevated - privileges required. If the object has - been not been explicitly provided to the component then the component - will request one from this . - - - By default the is - an instance of which returns only - objects. This is a reasonable default - where the privileges required are not know by the system. - - - This default behavior can be overridden by subclassing the - and overriding the method to return - the desired objects. The default provider - can be replaced by programmatically setting the value of the - property. - - - An alternative is to use the log4net.Config.SecurityContextProviderAttribute - This attribute can be applied to an assembly in the same way as the - log4net.Config.XmlConfiguratorAttribute". The attribute takes - the type to use as the as an argument. - - - Nicko Cadell - - - - The default provider - - - - - Protected default constructor to allow subclassing - - - - Protected default constructor to allow subclassing - - - - - - Create a SecurityContext for a consumer - - The consumer requesting the SecurityContext - An impersonation context - - - The default implementation is to return a . - - - Subclasses should override this method to provide their own - behavior. - - - - - - Gets or sets the default SecurityContextProvider - - - The default SecurityContextProvider - - - - The default provider is used by configured components that - require a and have not had one - given to them. - - - By default this is an instance of - that returns objects. - - - The default provider can be set programmatically by setting - the value of this property to a sub class of - that has the desired behavior. - - - - - - An evaluator that triggers after specified number of seconds. - - - - This evaluator will trigger if the specified time period - has passed since last check. - - - Robert Sevcik - - - - The default time threshold for triggering in seconds. Zero means it won't trigger at all. - - - - - The time threshold for triggering in seconds. Zero means it won't trigger at all. - - - - - The time of last check. This gets updated when the object is created and when the evaluator triggers. - - - - - Create a new evaluator using the time threshold in seconds. - - - - Create a new evaluator using the time threshold in seconds. - - - This evaluator will trigger if the specified time period - has passed since last check. - - - - - - Create a new evaluator using the specified time threshold in seconds. - - - The time threshold in seconds to trigger after. - Zero means it won't trigger at all. - - - - Create a new evaluator using the specified time threshold in seconds. - - - This evaluator will trigger if the specified time period - has passed since last check. - - - - - - Is this the triggering event? - - The event to check - This method returns true, if the specified time period - has passed since last check.. - Otherwise it returns false - - - This evaluator will trigger if the specified time period - has passed since last check. - - - - - - The time threshold in seconds to trigger after - - - The time threshold in seconds to trigger after. - Zero means it won't trigger at all. - - - - This evaluator will trigger if the specified time period - has passed since last check. - - - - - - Delegate used to handle creation of new wrappers. - - The logger to wrap in a wrapper. - - - Delegate used to handle creation of new wrappers. This delegate - is called from the - method to construct the wrapper for the specified logger. - - - The delegate to use is supplied to the - constructor. - - - - - - Maps between logger objects and wrapper objects. - - - - This class maintains a mapping between objects and - objects. Use the method to - lookup the for the specified . - - - New wrapper instances are created by the - method. The default behavior is for this method to delegate construction - of the wrapper to the delegate supplied - to the constructor. This allows specialization of the behavior without - requiring subclassing of this type. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the - - The handler to use to create the wrapper objects. - - - Initializes a new instance of the class with - the specified handler to create the wrapper objects. - - - - - - Gets the wrapper object for the specified logger. - - The wrapper object for the specified logger - - - If the logger is null then the corresponding wrapper is null. - - - Looks up the wrapper it it has previously been requested and - returns it. If the wrapper has never been requested before then - the virtual method is - called. - - - - - - Creates the wrapper object for the specified logger. - - The logger to wrap in a wrapper. - The wrapper object for the logger. - - - This implementation uses the - passed to the constructor to create the wrapper. This method - can be overridden in a subclass. - - - - - - Called when a monitored repository shutdown event is received. - - The that is shutting down - - - This method is called when a that this - is holding loggers for has signaled its shutdown - event . The default - behavior of this method is to release the references to the loggers - and their wrappers generated for this repository. - - - - - - Event handler for repository shutdown event. - - The sender of the event. - The event args. - - - - Map of logger repositories to hashtables of ILogger to ILoggerWrapper mappings - - - - - The handler to use to create the extension wrapper objects. - - - - - Internal reference to the delegate used to register for repository shutdown events. - - - - - Gets the map of logger repositories. - - - Map of logger repositories. - - - - Gets the hashtable that is keyed on . The - values are hashtables keyed on with the - value being the corresponding . - - - - - - Formats a as "HH:mm:ss,fff". - - - - Formats a in the format "HH:mm:ss,fff" for example, "15:49:37,459". - - - Nicko Cadell - Gert Driesen - - - - Render a as a string. - - - - Interface to abstract the rendering of a - instance into a string. - - - The method is used to render the - date to a text writer. - - - Nicko Cadell - Gert Driesen - - - - Formats the specified date as a string. - - The date to format. - The writer to write to. - - - Format the as a string and write it - to the provided. - - - - - - String constant used to specify AbsoluteTimeDateFormat in layouts. Current value is ABSOLUTE. - - - - - String constant used to specify DateTimeDateFormat in layouts. Current value is DATE. - - - - - String constant used to specify ISO8601DateFormat in layouts. Current value is ISO8601. - - - - - Renders the date into a string. Format is "HH:mm:ss". - - The date to render into a string. - The string builder to write to. - - - Subclasses should override this method to render the date - into a string using a precision up to the second. This method - will be called at most once per second and the result will be - reused if it is needed again during the same second. - - - - - - Renders the date into a string. Format is "HH:mm:ss,fff". - - The date to render into a string. - The writer to write to. - - - Uses the method to generate the - time string up to the seconds and then appends the current - milliseconds. The results from are - cached and is called at most once - per second. - - - Sub classes should override - rather than . - - - - - - Last stored time with precision up to the second. - - - - - Last stored time with precision up to the second, formatted - as a string. - - - - - Last stored time with precision up to the second, formatted - as a string. - - - - - Formats a as "dd MMM yyyy HH:mm:ss,fff" - - - - Formats a in the format - "dd MMM yyyy HH:mm:ss,fff" for example, - "06 Nov 1994 15:49:37,459". - - - Nicko Cadell - Gert Driesen - Angelika Schnagl - - - - Default constructor. - - - - Initializes a new instance of the class. - - - - - - Formats the date without the milliseconds part - - The date to format. - The string builder to write to. - - - Formats a DateTime in the format "dd MMM yyyy HH:mm:ss" - for example, "06 Nov 1994 15:49:37". - - - The base class will append the ",fff" milliseconds section. - This method will only be called at most once per second. - - - - - - The format info for the invariant culture. - - - - - Formats the as "yyyy-MM-dd HH:mm:ss,fff". - - - - Formats the specified as a string: "yyyy-MM-dd HH:mm:ss,fff". - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Formats the date without the milliseconds part - - The date to format. - The string builder to write to. - - - Formats the date specified as a string: "yyyy-MM-dd HH:mm:ss". - - - The base class will append the ",fff" milliseconds section. - This method will only be called at most once per second. - - - - - - Formats the using the method. - - - - Formats the using the method. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The format string. - - - Initializes a new instance of the class - with the specified format string. - - - The format string must be compatible with the options - that can be supplied to . - - - - - - Formats the date using . - - The date to convert to a string. - The writer to write to. - - - Uses the date format string supplied to the constructor to call - the method to format the date. - - - - - - The format string used to format the . - - - - The format string must be compatible with the options - that can be supplied to . - - - - - - This filter drops all . - - - - You can add this filter to the end of a filter chain to - switch from the default "accept all unless instructed otherwise" - filtering behavior to a "deny all unless instructed otherwise" - behavior. - - - Nicko Cadell - Gert Driesen - - - - Subclass this type to implement customized logging event filtering - - - - Users should extend this class to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - - The method must return one - of the integer constants , - or . - - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behavior is to log all logging events. - - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface to provide customized logging event filtering - - - - Users should implement this interface to implement customized logging - event filtering. Note that and - , the parent class of all standard - appenders, have built-in filtering rules. It is suggested that you - first use and understand the built-in rules before rushing to write - your own custom filters. - - - This abstract class assumes and also imposes that filters be - organized in a linear chain. The - method of each filter is called sequentially, in the order of their - addition to the chain. - - - The method must return one - of the integer constants , - or . - - - If the value is returned, then the log event is dropped - immediately without consulting with the remaining filters. - - - If the value is returned, then the next filter - in the chain is consulted. If there are no more filters in the - chain, then the log event is logged. Thus, in the presence of no - filters, the default behavior is to log all logging events. - - - If the value is returned, then the log - event is logged without consulting the remaining filters. - - - The philosophy of log4net filters is largely inspired from the - Linux ipchains. - - - Nicko Cadell - Gert Driesen - - - - Decide if the logging event should be logged through an appender. - - The LoggingEvent to decide upon - The decision of the filter - - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - - - - - Property to get and set the next filter - - - The next filter in the chain - - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - - Points to the next filter in the filter chain. - - - - See for more information. - - - - - - Initialize the filter with the options set - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Typically filter's options become active immediately on set, - however this method must still be called. - - - - - - Decide if the should be logged through an appender. - - The to decide upon - The decision of the filter - - - If the decision is , then the event will be - dropped. If the decision is , then the next - filter, if any, will be invoked. If the decision is then - the event will be logged without consulting with other filters in - the chain. - - - This method is marked abstract and must be implemented - in a subclass. - - - - - - Property to get and set the next filter - - - The next filter in the chain - - - - Filters are typically composed into chains. This property allows the next filter in - the chain to be accessed. - - - - - - Default constructor - - - - - Always returns the integer constant - - the LoggingEvent to filter - Always returns - - - Ignores the event being logged and just returns - . This can be used to change the default filter - chain behavior from to . This filter - should only be used as the last filter in the chain - as any further filters will be ignored! - - - - - - The return result from - - - - The return result from - - - - - - The log event must be dropped immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This filter is neutral with respect to the log event. - The remaining filters, if any, should be consulted for a final decision. - - - - - The log event must be logged immediately without - consulting with the remaining filters, if any, in the chain. - - - - - This is a very simple filter based on matching. - - - - The filter admits two options and - . If there is an exact match between the value - of the option and the of the - , then the method returns in - case the option value is set - to true, if it is false then - is returned. If the does not match then - the result will be . - - - Nicko Cadell - Gert Driesen - - - - flag to indicate if the filter should on a match - - - - - the to match against - - - - - Default constructor - - - - - Tests if the of the logging event matches that of the filter - - the event to filter - see remarks - - - If the of the event matches the level of the - filter then the result of the function depends on the - value of . If it is true then - the function will return , it it is false then it - will return . If the does not match then - the result will be . - - - - - - when matching - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - The that the filter will match - - - - The level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - This is a simple filter based on matching. - - - - The filter admits three options and - that determine the range of priorities that are matched, and - . If there is a match between the range - of priorities and the of the , then the - method returns in case the - option value is set to true, if it is false - then is returned. If there is no match, is returned. - - - Nicko Cadell - Gert Driesen - - - - Flag to indicate the behavior when matching a - - - - - the minimum value to match - - - - - the maximum value to match - - - - - Default constructor - - - - - Check if the event should be logged. - - the logging event to check - see remarks - - - If the of the logging event is outside the range - matched by this filter then - is returned. If the is matched then the value of - is checked. If it is true then - is returned, otherwise - is returned. - - - - - - when matching and - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - Set the minimum matched - - - - The minimum level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - Sets the maximum matched - - - - The maximum level that this filter will attempt to match against the - level. If a match is found then - the result depends on the value of . - - - - - - Simple filter to match a string in the event's logger name. - - - - The works very similar to the . It admits two - options and . If the - of the starts - with the value of the option, then the - method returns in - case the option value is set to true, - if it is false then is returned. - - - Daniel Cazzulino - - - - Flag to indicate the behavior when we have a match - - - - - The logger name string to substring match against the event - - - - - Default constructor - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The rendered message is matched against the . - If the equals the beginning of - the incoming () - then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - when matching - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - The that the filter will match - - - - This filter will attempt to match this value against logger name in - the following way. The match will be done against the beginning of the - logger name (using ). The match is - case sensitive. If a match is found then - the result depends on the value of . - - - - - - Simple filter to match a keyed string in the - - - - Simple filter to match a keyed string in the - - - As the MDC has been replaced with layered properties the - should be used instead. - - - Nicko Cadell - Gert Driesen - - - - Simple filter to match a string an event property - - - - Simple filter to match a string in the value for a - specific event property - - - Nicko Cadell - - - - Simple filter to match a string in the rendered message - - - - Simple filter to match a string in the rendered message - - - Nicko Cadell - Gert Driesen - - - - Flag to indicate the behavior when we have a match - - - - - The string to substring match against the message - - - - - A string regex to match - - - - - A regex object to match (generated from m_stringRegexToMatch) - - - - - Default constructor - - - - - Initialize and precompile the Regex if required - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The rendered message is matched against the . - If the occurs as a substring within - the message then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - when matching or - - - - The property is a flag that determines - the behavior when a matching is found. If the - flag is set to true then the filter will the - logging event, otherwise it will the event. - - - The default is true i.e. to the event. - - - - - - Sets the static string to match - - - - The string that will be substring matched against - the rendered message. If the message contains this - string then the filter will match. If a match is found then - the result depends on the value of . - - - One of or - must be specified. - - - - - - Sets the regular expression to match - - - - The regular expression pattern that will be matched against - the rendered message. If the message matches this - pattern then the filter will match. If a match is found then - the result depends on the value of . - - - One of or - must be specified. - - - - - - The key to use to lookup the string from the event properties - - - - - Default constructor - - - - - Check if this filter should allow the event to be logged - - the event being logged - see remarks - - - The event property for the is matched against - the . - If the occurs as a substring within - the property value then a match will have occurred. If no match occurs - this function will return - allowing other filters to check the event. If a match occurs then - the value of is checked. If it is - true then is returned otherwise - is returned. - - - - - - The key to lookup in the event properties and then match against. - - - - The key name to use to lookup in the properties map of the - . The match will be performed against - the value of this property if it exists. - - - - - - Simple filter to match a string in the - - - - Simple filter to match a string in the - - - As the MDC has been replaced with named stacks stored in the - properties collections the should - be used instead. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Sets the to "NDC". - - - - - - Write the event appdomain name to the output - - - - Writes the to the output writer. - - - Daniel Cazzulino - Nicko Cadell - - - - Abstract class that provides the formatting functionality that - derived classes need. - - - Conversion specifiers in a conversion patterns are parsed to - individual PatternConverters. Each of which is responsible for - converting a logging event in a converter specific manner. - - Nicko Cadell - - - - Abstract class that provides the formatting functionality that - derived classes need. - - - - Conversion specifiers in a conversion patterns are parsed to - individual PatternConverters. Each of which is responsible for - converting a logging event in a converter specific manner. - - - Nicko Cadell - Gert Driesen - - - - Initial buffer size - - - - - Maximum buffer size before it is recycled - - - - - Protected constructor - - - - Initializes a new instance of the class. - - - - - - Evaluate this pattern converter and write the output to a writer. - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the appropriate way. - - - - - - Set the next pattern converter in the chains - - the pattern converter that should follow this converter in the chain - the next converter - - - The PatternConverter can merge with its neighbor during this method (or a sub class). - Therefore the return value may or may not be the value of the argument passed in. - - - - - - Write the pattern converter to the writer with appropriate formatting - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - This method calls to allow the subclass to perform - appropriate conversion of the pattern converter. If formatting options have - been specified via the then this method will - apply those formattings before writing the output. - - - - - - Fast space padding method. - - to which the spaces will be appended. - The number of spaces to be padded. - - - Fast space padding method. - - - - - - The option string to the converter - - - - - Write an dictionary to a - - the writer to write to - a to use for object conversion - the value to write to the writer - - - Writes the to a writer in the form: - - - {key1=value1, key2=value2, key3=value3} - - - If the specified - is not null then it is used to render the key and value to text, otherwise - the object's ToString method is called. - - - - - - Write an dictionary to a - - the writer to write to - a to use for object conversion - the value to write to the writer - - - Writes the to a writer in the form: - - - {key1=value1, key2=value2, key3=value3} - - - If the specified - is not null then it is used to render the key and value to text, otherwise - the object's ToString method is called. - - - - - - Write an object to a - - the writer to write to - a to use for object conversion - the value to write to the writer - - - Writes the Object to a writer. If the specified - is not null then it is used to render the object to text, otherwise - the object's ToString method is called. - - - - - - Get the next pattern converter in the chain - - - the next pattern converter in the chain - - - - Get the next pattern converter in the chain - - - - - - Gets or sets the formatting info for this converter - - - The formatting info for this converter - - - - Gets or sets the formatting info for this converter - - - - - - Gets or sets the option value for this converter - - - The option for this converter - - - - Gets or sets the option value for this converter - - - - - - - - - - - Initializes a new instance of the class. - - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - that will receive the formatted result. - The on which the pattern converter should be executed. - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - that will receive the formatted result. - The state object on which the pattern converter should be executed. - - - - Flag indicating if this converter handles exceptions - - - false if this converter handles exceptions - - - - - Flag indicating if this converter handles the logging event exception - - false if this converter handles the logging event exception - - - If this converter handles the exception object contained within - , then this property should be set to - false. Otherwise, if the layout ignores the exception - object, then the property should be set to true. - - - Set this value to override a this default setting. The default - value is true, this converter does not handle the exception. - - - - - - Write the event appdomain name to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the output . - - - - - - Converter for items in the ASP.Net Cache. - - - - Outputs an item from the . - - - Ron Grabowski - - - - Abstract class that provides access to the current HttpContext () that - derived classes need. - - - This class handles the case when HttpContext.Current is null by writing - to the writer. - - Ron Grabowski - - - - Derived pattern converters must override this method in order to - convert conversion specifiers in the correct way. - - that will receive the formatted result. - The on which the pattern converter should be executed. - The under which the ASP.Net request is running. - - - - Write the ASP.Net Cache item to the output - - that will receive the formatted result. - The on which the pattern converter should be executed. - The under which the ASP.Net request is running. - - - Writes out the value of a named property. The property name - should be set in the - property. If no property has been set, all key value pairs from the Cache will - be written to the output. - - - - - - Converter for items in the . - - - - Outputs an item from the . - - - Ron Grabowski - - - - Write the ASP.Net HttpContext item to the output - - that will receive the formatted result. - The on which the pattern converter should be executed. - The under which the ASP.Net request is running. - - - Writes out the value of a named property. The property name - should be set in the - property. - - - - - - Converter for items in the ASP.Net Cache. - - - - Outputs an item from the . - - - Ron Grabowski - - - - Write the ASP.Net Cache item to the output - - that will receive the formatted result. - The on which the pattern converter should be executed. - The under which the ASP.Net request is running. - - - Writes out the value of a named property. The property name - should be set in the - property. - - - - - - Converter for items in the ASP.Net Cache. - - - - Outputs an item from the . - - - Ron Grabowski - - - - Write the ASP.Net Cache item to the output - - that will receive the formatted result. - The on which the pattern converter should be executed. - The under which the ASP.Net request is running. - - - Writes out the value of a named property. The property name - should be set in the - property. If no property has been set, all key value pairs from the Session will - be written to the output. - - - - - - Date pattern converter, uses a to format - the date of a . - - - - Render the to the writer as a string. - - - The value of the determines - the formatting of the date. The following values are allowed: - - - Option value - Output - - - ISO8601 - - Uses the formatter. - Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. - - - - DATE - - Uses the formatter. - Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". - - - - ABSOLUTE - - Uses the formatter. - Formats using the "HH:mm:ss,yyyy" for example, "15:49:37,459". - - - - other - - Any other pattern string uses the formatter. - This formatter passes the pattern string to the - method. - For details on valid patterns see - DateTimeFormatInfo Class. - - - - - - The is in the local time zone and is rendered in that zone. - To output the time in Universal time see . - - - Nicko Cadell - - - - The used to render the date to a string - - - - The used to render the date to a string - - - - - - Initialize the converter pattern based on the property. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Convert the pattern into the rendered message - - that will receive the formatted result. - the event being logged - - - Pass the to the - for it to render it to the writer. - - - The passed is in the local time zone. - - - - - - The fully qualified type of the DatePatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Write the exception text to the output - - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - - - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - Nicko Cadell - - - - Default constructor - - - - - Write the exception text to the output - - that will receive the formatted result. - the event being logged - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - - - If there is no exception or the exception property specified - by the Option value does not exist then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - Recognized values for the Option parameter are: - - - - Message - - - Source - - - StackTrace - - - TargetSite - - - HelpLink - - - - - - - Writes the caller location file name to the output - - - - Writes the value of the for - the event to the output writer. - - - Nicko Cadell - - - - Write the caller location file name to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the for - the to the output . - - - - - - Write the caller location info to the output - - - - Writes the to the output writer. - - - Nicko Cadell - - - - Write the caller location info to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the output writer. - - - - - - Writes the event identity to the output - - - - Writes the value of the to - the output writer. - - - Daniel Cazzulino - Nicko Cadell - - - - Writes the event identity to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the - to - the output . - - - - - - Write the event level to the output - - - - Writes the display name of the event - to the writer. - - - Nicko Cadell - - - - Write the event level to the output - - that will receive the formatted result. - the event being logged - - - Writes the of the - to the . - - - - - - Write the caller location line number to the output - - - - Writes the value of the for - the event to the output writer. - - - Nicko Cadell - - - - Write the caller location line number to the output - - that will receive the formatted result. - the event being logged - - - Writes the value of the for - the to the output . - - - - - - Converter for logger name - - - - Outputs the of the event. - - - Nicko Cadell - - - - Converter to output and truncate '.' separated strings - - - - This abstract class supports truncating a '.' separated string - to show a specified number of elements from the right hand side. - This is used to truncate class names that are fully qualified. - - - Subclasses should override the method to - return the fully qualified string. - - - Nicko Cadell - - - - Initialize the converter - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Get the fully qualified string data - - the event being logged - the fully qualified name - - - Overridden by subclasses to get the fully qualified name before the - precision is applied to it. - - - Return the fully qualified '.' (dot/period) separated string. - - - - - - Convert the pattern to the rendered message - - that will receive the formatted result. - the event being logged - - Render the to the precision - specified by the property. - - - - - The fully qualified type of the NamedPatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets the fully qualified name of the logger - - the event being logged - The fully qualified logger name - - - Returns the of the . - - - - - - Writes the event message to the output - - - - Uses the method - to write out the event message. - - - Nicko Cadell - - - - Writes the event message to the output - - that will receive the formatted result. - the event being logged - - - Uses the method - to write out the event message. - - - - - - Write the method name to the output - - - - Writes the caller location to - the output. - - - Nicko Cadell - - - - Write the method name to the output - - that will receive the formatted result. - the event being logged - - - Writes the caller location to - the output. - - - - - - Converter to include event NDC - - - - Outputs the value of the event property named NDC. - - - The should be used instead. - - - Nicko Cadell - - - - Write the event NDC to the output - - that will receive the formatted result. - the event being logged - - - As the thread context stacks are now stored in named event properties - this converter simply looks up the value of the NDC property. - - - The should be used instead. - - - - - - Property pattern converter - - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - Nicko Cadell - - - - Write the property value to the output - - that will receive the formatted result. - the event being logged - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - - - - Converter to output the relative time of the event - - - - Converter to output the time of the event relative to the start of the program. - - - Nicko Cadell - - - - Write the relative time to the output - - that will receive the formatted result. - the event being logged - - - Writes out the relative time of the event in milliseconds. - That is the number of milliseconds between the event - and the . - - - - - - Helper method to get the time difference between two DateTime objects - - start time (in the current local time zone) - end time (in the current local time zone) - the time difference in milliseconds - - - - Write the caller stack frames to the output - - - - Writes the to the output writer, using format: - type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) - - - Adam Davies - - - - Write the caller stack frames to the output - - - - Writes the to the output writer, using format: - type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 - - - Michael Cromwell - - - - Initialize the converter - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write the strack frames to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the output writer. - - - - - - Returns the Name of the method - - - This method was created, so this class could be used as a base class for StackTraceDetailPatternConverter - string - - - - The fully qualified type of the StackTracePatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - The fully qualified type of the StackTraceDetailPatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Converter to include event thread name - - - - Writes the to the output. - - - Nicko Cadell - - - - Write the ThreadName to the output - - that will receive the formatted result. - the event being logged - - - Writes the to the . - - - - - - Pattern converter for the class name - - - - Outputs the of the event. - - - Nicko Cadell - - - - Gets the fully qualified name of the class - - the event being logged - The fully qualified type name for the caller location - - - Returns the of the . - - - - - - Converter to include event user name - - Douglas de la Torre - Nicko Cadell - - - - Convert the pattern to the rendered message - - that will receive the formatted result. - the event being logged - - - - Write the TimeStamp to the output - - - - Date pattern converter, uses a to format - the date of a . - - - Uses a to format the - in Universal time. - - - See the for details on the date pattern syntax. - - - - Nicko Cadell - - - - Write the TimeStamp to the output - - that will receive the formatted result. - the event being logged - - - Pass the to the - for it to render it to the writer. - - - The passed is in the local time zone, this is converted - to Universal time before it is rendered. - - - - - - - The fully qualified type of the UtcDatePatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - A Layout that renders only the Exception text from the logging event - - - - A Layout that renders only the Exception text from the logging event. - - - This Layout should only be used with appenders that utilize multiple - layouts (e.g. ). - - - Nicko Cadell - Gert Driesen - - - - Extend this abstract class to create your own log layout format. - - - - This is the base implementation of the - interface. Most layout objects should extend this class. - - - - - - Subclasses must implement the - method. - - - Subclasses should set the in their default - constructor. - - - - Nicko Cadell - Gert Driesen - - - - Interface implemented by layout objects - - - - An object is used to format a - as text. The method is called by an - appender to transform the into a string. - - - The layout can also supply and - text that is appender before any events and after all the events respectively. - - - Nicko Cadell - Gert Driesen - - - - Implement this method to create your own layout format. - - The TextWriter to write the formatted event to - The event to format - - - This method is called by an appender to format - the as text and output to a writer. - - - If the caller does not have a and prefers the - event to be formatted as a then the following - code can be used to format the event into a . - - - StringWriter writer = new StringWriter(); - Layout.Format(writer, loggingEvent); - string formattedEvent = writer.ToString(); - - - - - - The content type output by this layout. - - The content type - - - The content type output by this layout. - - - This is a MIME type e.g. "text/plain". - - - - - - The header for the layout format. - - the layout header - - - The Header text will be appended before any logging events - are formatted and appended. - - - - - - The footer for the layout format. - - the layout footer - - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - - Flag indicating if this layout handle exceptions - - false if this layout handles exceptions - - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - - - - - The header text - - - - See for more information. - - - - - - The footer text - - - - See for more information. - - - - - - Flag indicating if this layout handles exceptions - - - - false if this layout handles exceptions - - - - - - Empty default constructor - - - - Empty default constructor - - - - - - Activate component options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - This method must be implemented by the subclass. - - - - - - Implement this method to create your own layout format. - - The TextWriter to write the formatted event to - The event to format - - - This method is called by an appender to format - the as text. - - - - - - Convenience method for easily formatting the logging event into a string variable. - - - - Creates a new StringWriter instance to store the formatted logging event. - - - - - The content type output by this layout. - - The content type is "text/plain" - - - The content type output by this layout. - - - This base class uses the value "text/plain". - To change this value a subclass must override this - property. - - - - - - The header for the layout format. - - the layout header - - - The Header text will be appended before any logging events - are formatted and appended. - - - - - - The footer for the layout format. - - the layout footer - - - The Footer text will be appended after all the logging events - have been formatted and appended. - - - - - - Flag indicating if this layout handles exceptions - - false if this layout handles exceptions - - - If this layout handles the exception object contained within - , then the layout should return - false. Otherwise, if the layout ignores the exception - object, then the layout should return true. - - - Set this value to override a this default setting. The default - value is true, this layout does not handle the exception. - - - - - - Default constructor - - - - Constructs a ExceptionLayout - - - - - - Activate component options - - - - Part of the component activation - framework. - - - This method does nothing as options become effective immediately. - - - - - - Gets the exception text from the logging event - - The TextWriter to write the formatted event to - the event being logged - - - Write the exception string to the . - The exception string is retrieved from . - - - - - - Interface for raw layout objects - - - - Interface used to format a - to an object. - - - This interface should not be confused with the - interface. This interface is used in - only certain specialized situations where a raw object is - required rather than a formatted string. The - is not generally useful than this interface. - - - Nicko Cadell - Gert Driesen - - - - Implement this method to create your own layout format. - - The event to format - returns the formatted event - - - Implement this method to create your own layout format. - - - - - - Adapts any to a - - - - Where an is required this adapter - allows a to be specified. - - - Nicko Cadell - Gert Driesen - - - - The layout to adapt - - - - - Construct a new adapter - - the layout to adapt - - - Create the adapter for the specified . - - - - - - Format the logging event as an object. - - The event to format - returns the formatted event - - - Format the logging event as an object. - - - Uses the object supplied to - the constructor to perform the formatting. - - - - - - A flexible layout configurable with pattern string. - - - - The goal of this class is to a - as a string. The results - depend on the conversion pattern. - - - The conversion pattern is closely related to the conversion - pattern of the printf function in C. A conversion pattern is - composed of literal text and format control expressions called - conversion specifiers. - - - You are free to insert any literal text within the conversion - pattern. - - - Each conversion specifier starts with a percent sign (%) and is - followed by optional format modifiers and a conversion - pattern name. The conversion pattern name specifies the type of - data, e.g. logger, level, date, thread name. The format - modifiers control such things as field width, padding, left and - right justification. The following is a simple example. - - - Let the conversion pattern be "%-5level [%thread]: %message%newline" and assume - that the log4net environment was set to use a PatternLayout. Then the - statements - - - ILog log = LogManager.GetLogger(typeof(TestApp)); - log.Debug("Message 1"); - log.Warn("Message 2"); - - would yield the output - - DEBUG [main]: Message 1 - WARN [main]: Message 2 - - - Note that there is no explicit separator between text and - conversion specifiers. The pattern parser knows when it has reached - the end of a conversion specifier when it reads a conversion - character. In the example above the conversion specifier - %-5level means the level of the logging event should be left - justified to a width of five characters. - - - The recognized conversion pattern names are: - - - - Conversion Pattern Name - Effect - - - a - Equivalent to appdomain - - - appdomain - - Used to output the friendly name of the AppDomain where the - logging event was generated. - - - - aspnet-cache - - - Used to output all cache items in the case of %aspnet-cache or just one named item if used as %aspnet-cache{key} - - - This pattern is not available for Compact Framework or Client Profile assemblies. - - - - - aspnet-context - - - Used to output all context items in the case of %aspnet-context or just one named item if used as %aspnet-context{key} - - - This pattern is not available for Compact Framework or Client Profile assemblies. - - - - - aspnet-request - - - Used to output all request parameters in the case of %aspnet-request or just one named param if used as %aspnet-request{key} - - - This pattern is not available for Compact Framework or Client Profile assemblies. - - - - - aspnet-session - - - Used to output all session items in the case of %aspnet-session or just one named item if used as %aspnet-session{key} - - - This pattern is not available for Compact Framework or Client Profile assemblies. - - - - - c - Equivalent to logger - - - C - Equivalent to type - - - class - Equivalent to type - - - d - Equivalent to date - - - date - - - Used to output the date of the logging event in the local time zone. - To output the date in universal time use the %utcdate pattern. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %date{HH:mm:ss,fff} or - %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %date{ISO8601} or %date{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - exception - - - Used to output the exception passed in with the log message. - - - If an exception object is stored in the logging event - it will be rendered into the pattern output with a - trailing newline. - If there is no exception then nothing will be output - and no trailing newline will be appended. - It is typical to put a newline before the exception - and to have the exception as the last data in the pattern. - - - - - F - Equivalent to file - - - file - - - Used to output the file name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - identity - - - Used to output the user name for the currently active user - (Principal.Identity.Name). - - - WARNING Generating caller information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - - - l - Equivalent to location - - - L - Equivalent to line - - - location - - - Used to output location information of the caller which generated - the logging event. - - - The location information depends on the CLI implementation but - usually consists of the fully qualified name of the calling - method followed by the callers source the file name and line - number between parentheses. - - - The location information can be very useful. However, its - generation is extremely slow. Its use should be avoided - unless execution speed is not an issue. - - - See the note below on the availability of caller location information. - - - - - level - - - Used to output the level of the logging event. - - - - - line - - - Used to output the line number from where the logging request - was issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - logger - - - Used to output the logger of the logging event. The - logger conversion specifier can be optionally followed by - precision specifier, that is a decimal constant in - brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the logger name will be - printed. By default the logger name is printed in full. - - - For example, for the logger name "a.b.c" the pattern - %logger{2} will output "b.c". - - - - - m - Equivalent to message - - - M - Equivalent to method - - - message - - - Used to output the application supplied message associated with - the logging event. - - - - - mdc - - - The MDC (old name for the ThreadContext.Properties) is now part of the - combined event properties. This pattern is supported for compatibility - but is equivalent to property. - - - - - method - - - Used to output the method name where the logging request was - issued. - - - WARNING Generating caller location information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - See the note below on the availability of caller location information. - - - - - n - Equivalent to newline - - - newline - - - Outputs the platform dependent line separator character or - characters. - - - This conversion pattern offers the same performance as using - non-portable line separator strings such as "\n", or "\r\n". - Thus, it is the preferred way of specifying a line separator. - - - - - ndc - - - Used to output the NDC (nested diagnostic context) associated - with the thread that generated the logging event. - - - - - p - Equivalent to level - - - P - Equivalent to property - - - properties - Equivalent to property - - - property - - - Used to output the an event specific property. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %property{user} would include the value - from the property that is keyed by the string 'user'. Each property value - that is to be included in the log must be specified separately. - Properties are added to events by loggers or appenders. By default - the log4net:HostName property is set to the name of machine on - which the event was originally logged. - - - If no key is specified, e.g. %property then all the keys and their - values are printed in a comma separated list. - - - The properties of an event are combined from a number of different - contexts. These are listed below in the order in which they are searched. - - - - the event properties - - The event has that can be set. These - properties are specific to this event only. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - - r - Equivalent to timestamp - - - stacktrace - - - Used to output the stack trace of the logging event - The stack trace level specifier may be enclosed - between braces. For example, %stacktrace{level}. - If no stack trace level specifier is given then 1 is assumed - - - Output uses the format: - type3.MethodCall3 > type2.MethodCall2 > type1.MethodCall1 - - - This pattern is not available for Compact Framework assemblies. - - - - - stacktracedetail - - - Used to output the stack trace of the logging event - The stack trace level specifier may be enclosed - between braces. For example, %stacktracedetail{level}. - If no stack trace level specifier is given then 1 is assumed - - - Output uses the format: - type3.MethodCall3(type param,...) > type2.MethodCall2(type param,...) > type1.MethodCall1(type param,...) - - - This pattern is not available for Compact Framework assemblies. - - - - - t - Equivalent to thread - - - timestamp - - - Used to output the number of milliseconds elapsed since the start - of the application until the creation of the logging event. - - - - - thread - - - Used to output the name of the thread that generated the - logging event. Uses the thread number if no name is available. - - - - - type - - - Used to output the fully qualified type name of the caller - issuing the logging request. This conversion specifier - can be optionally followed by precision specifier, that - is a decimal constant in brackets. - - - If a precision specifier is given, then only the corresponding - number of right most components of the class name will be - printed. By default the class name is output in fully qualified form. - - - For example, for the class name "log4net.Layout.PatternLayout", the - pattern %type{1} will output "PatternLayout". - - - WARNING Generating the caller class information is - slow. Thus, its use should be avoided unless execution speed is - not an issue. - - - See the note below on the availability of caller location information. - - - - - u - Equivalent to identity - - - username - - - Used to output the WindowsIdentity for the currently - active user. - - - WARNING Generating caller WindowsIdentity information is - extremely slow. Its use should be avoided unless execution speed - is not an issue. - - - - - utcdate - - - Used to output the date of the logging event in universal time. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %utcdate{HH:mm:ss,fff} or - %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %utcdate{ISO8601} or %utcdate{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - w - Equivalent to username - - - x - Equivalent to ndc - - - X - Equivalent to mdc - - - % - - - The sequence %% outputs a single percent sign. - - - - - - The single letter patterns are deprecated in favor of the - longer more descriptive pattern names. - - - By default the relevant information is output as is. However, - with the aid of format modifiers it is possible to change the - minimum field width, the maximum field width and justification. - - - The optional format modifier is placed between the percent sign - and the conversion pattern name. - - - The first optional format modifier is the left justification - flag which is just the minus (-) character. Then comes the - optional minimum field width modifier. This is a decimal - constant that represents the minimum number of characters to - output. If the data item requires fewer characters, it is padded on - either the left or the right until the minimum width is - reached. The default is to pad on the left (right justify) but you - can specify right padding with the left justification flag. The - padding character is space. If the data item is larger than the - minimum field width, the field is expanded to accommodate the - data. The value is never truncated. - - - This behavior can be changed using the maximum field - width modifier which is designated by a period followed by a - decimal constant. If the data item is longer than the maximum - field, then the extra characters are removed from the - beginning of the data item and not from the end. For - example, it the maximum field width is eight and the data item is - ten characters long, then the first two characters of the data item - are dropped. This behavior deviates from the printf function in C - where truncation is done from the end. - - - Below are various format modifier examples for the logger - conversion specifier. - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Format modifierleft justifyminimum widthmaximum widthcomment
    %20loggerfalse20none - - Left pad with spaces if the logger name is less than 20 - characters long. - -
    %-20loggertrue20none - - Right pad with spaces if the logger - name is less than 20 characters long. - -
    %.30loggerNAnone30 - - Truncate from the beginning if the logger - name is longer than 30 characters. - -
    %20.30loggerfalse2030 - - Left pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
    %-20.30loggertrue2030 - - Right pad with spaces if the logger name is shorter than 20 - characters. However, if logger name is longer than 30 characters, - then truncate from the beginning. - -
    -
    - - Note about caller location information.
    - The following patterns %type %file %line %method %location %class %C %F %L %l %M - all generate caller location information. - Location information uses the System.Diagnostics.StackTrace class to generate - a call stack. The caller's information is then extracted from this stack. -
    - - - The System.Diagnostics.StackTrace class is not supported on the - .NET Compact Framework 1.0 therefore caller location information is not - available on that framework. - - - - - The System.Diagnostics.StackTrace class has this to say about Release builds: - - - "StackTrace information will be most informative with Debug build configurations. - By default, Debug builds include debug symbols, while Release builds do not. The - debug symbols contain most of the file, method name, line number, and column - information used in constructing StackFrame and StackTrace objects. StackTrace - might not report as many method calls as expected, due to code transformations - that occur during optimization." - - - This means that in a Release build the caller information may be incomplete or may - not exist at all! Therefore caller location information cannot be relied upon in a Release build. - - - - Additional pattern converters may be registered with a specific - instance using the method. - -
    - - This is a more detailed pattern. - %timestamp [%thread] %level %logger %ndc - %message%newline - - - A similar pattern except that the relative time is - right padded if less than 6 digits, thread name is right padded if - less than 15 characters and truncated if longer and the logger - name is left padded if shorter than 30 characters and truncated if - longer. - %-6timestamp [%15.15thread] %-5level %30.30logger %ndc - %message%newline - - Nicko Cadell - Gert Driesen - Douglas de la Torre - Daniel Cazzulino -
    - - - Default pattern string for log output. - - - - Default pattern string for log output. - Currently set to the string "%message%newline" - which just prints the application supplied message. - - - - - - A detailed conversion pattern - - - - A conversion pattern which includes Time, Thread, Logger, and Nested Context. - Current value is %timestamp [%thread] %level %logger %ndc - %message%newline. - - - - - - Internal map of converter identifiers to converter types. - - - - This static map is overridden by the m_converterRegistry instance map - - - - - - the pattern - - - - - the head of the pattern converter chain - - - - - patterns defined on this PatternLayout only - - - - - Initialize the global registry - - - - Defines the builtin global rules. - - - - - - Constructs a PatternLayout using the DefaultConversionPattern - - - - The default pattern just produces the application supplied message. - - - Note to Inheritors: This constructor calls the virtual method - . If you override this method be - aware that it will be called before your is called constructor. - - - As per the contract the - method must be called after the properties on this object have been - configured. - - - - - - Constructs a PatternLayout using the supplied conversion pattern - - the pattern to use - - - Note to Inheritors: This constructor calls the virtual method - . If you override this method be - aware that it will be called before your is called constructor. - - - When using this constructor the method - need not be called. This may not be the case when using a subclass. - - - - - - Create the pattern parser instance - - the pattern to parse - The that will format the event - - - Creates the used to parse the conversion string. Sets the - global and instance rules on the . - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a formatted string as specified by the conversion pattern. - - the event being logged - The TextWriter to write the formatted event to - - - Parse the using the patter format - specified in the property. - - - - - - Add a converter to this PatternLayout - - the converter info - - - This version of the method is used by the configurator. - Programmatic users should use the alternative method. - - - - - - Add a converter to this PatternLayout - - the name of the conversion pattern for this converter - the type of the converter - - - Add a named pattern converter to this instance. This - converter will be used in the formatting of the event. - This method must be called before . - - - The specified must extend the - type. - - - - - - The pattern formatting string - - - - The ConversionPattern option. This is the string which - controls formatting and consists of a mix of literal content and - conversion specifiers. - - - - - - Type converter for the interface - - - - Used to convert objects to the interface. - Supports converting from the interface to - the interface using the . - - - Nicko Cadell - Gert Driesen - - - - Interface supported by type converters - - - - This interface supports conversion from arbitrary types - to a single target type. See . - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Test if the can be converted to the - type supported by this converter. - - - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - Converts the to the type supported - by this converter. - - - - - - Can the sourceType be converted to an - - the source to be to be converted - true if the source type can be converted to - - - Test if the can be converted to a - . Only is supported - as the . - - - - - - Convert the value to a object - - the value to convert - the object - - - Convert the object to a - object. If the object - is a then the - is used to adapt between the two interfaces, otherwise an - exception is thrown. - - - - - - Extract the value of a property from the - - - - Extract the value of a property from the - - - Nicko Cadell - - - - Constructs a RawPropertyLayout - - - - - Lookup the property for - - The event to format - returns property value - - - Looks up and returns the object value of the property - named . If there is no property defined - with than name then null will be returned. - - - - - - The name of the value to lookup in the LoggingEvent Properties collection. - - - Value to lookup in the LoggingEvent Properties collection - - - - String name of the property to lookup in the . - - - - - - Extract the date from the - - - - Extract the date from the - - - Nicko Cadell - Gert Driesen - - - - Constructs a RawTimeStampLayout - - - - - Gets the as a . - - The event to format - returns the time stamp - - - Gets the as a . - - - The time stamp is in local time. To format the time stamp - in universal time use . - - - - - - Extract the date from the - - - - Extract the date from the - - - Nicko Cadell - Gert Driesen - - - - Constructs a RawUtcTimeStampLayout - - - - - Gets the as a . - - The event to format - returns the time stamp - - - Gets the as a . - - - The time stamp is in universal time. To format the time stamp - in local time use . - - - - - - A very simple layout - - - - SimpleLayout consists of the level of the log statement, - followed by " - " and then the log message itself. For example, - - DEBUG - Hello world - - - - Nicko Cadell - Gert Driesen - - - - Constructs a SimpleLayout - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a simple formatted output. - - the event being logged - The TextWriter to write the formatted event to - - - Formats the event as the level of the even, - followed by " - " and then the log message itself. The - output is terminated by a newline. - - - - - - Layout that formats the log events as XML elements. - - - - The output of the consists of a series of - log4net:event elements. It does not output a complete well-formed XML - file. The output is designed to be included as an external entity - in a separate file to form a correct XML file. - - - For example, if abc is the name of the file where - the output goes, then a well-formed XML file would - be: - - - <?xml version="1.0" ?> - - <!DOCTYPE log4net:events SYSTEM "log4net-events.dtd" [<!ENTITY data SYSTEM "abc">]> - - <log4net:events version="1.2" xmlns:log4net="http://logging.apache.org/log4net/schemas/log4net-events-1.2> - &data; - </log4net:events> - - - This approach enforces the independence of the - and the appender where it is embedded. - - - The version attribute helps components to correctly - interpret output generated by . The value of - this attribute should be "1.2" for release 1.2 and later. - - - Alternatively the Header and Footer properties can be - configured to output the correct XML header, open tag and close tag. - When setting the Header and Footer properties it is essential - that the underlying data store not be appendable otherwise the data - will become invalid XML. - - - Nicko Cadell - Gert Driesen - - - - Layout that formats the log events as XML elements. - - - - This is an abstract class that must be subclassed by an implementation - to conform to a specific schema. - - - Deriving classes must implement the method. - - - Nicko Cadell - Gert Driesen - - - - Protected constructor to support subclasses - - - - Initializes a new instance of the class - with no location info. - - - - - - Protected constructor to support subclasses - - - - The parameter determines whether - location information will be output by the layout. If - is set to true, then the - file name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Produces a formatted string. - - The event being logged. - The TextWriter to write the formatted event to - - - Format the and write it to the . - - - This method creates an that writes to the - . The is passed - to the method. Subclasses should override the - method rather than this method. - - - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - Subclasses should override this method to format - the as XML. - - - - - - Flag to indicate if location information should be included in - the XML events. - - - - - The string to replace invalid chars with - - - - - Gets a value indicating whether to include location information in - the XML events. - - - true if location information should be included in the XML - events; otherwise, false. - - - - If is set to true, then the file - name and line number of the statement at the origin of the log - statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - The string to replace characters that can not be expressed in XML with. - - - Not all characters may be expressed in XML. This property contains the - string to replace those that can not with. This defaults to a ?. Set it - to the empty string to simply remove offending characters. For more - details on the allowed character ranges see http://www.w3.org/TR/REC-xml/#charsets - Character replacement will occur in the log message, the property names - and the property values. - - - - - - - Gets the content type output by this layout. - - - As this is the XML layout, the value is always "text/xml". - - - - As this is the XML layout, the value is always "text/xml". - - - - - - Constructs an XmlLayout - - - - - Constructs an XmlLayout. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SmtpAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Initialize layout options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - Builds a cache of the element names - - - - - - Does the actual writing of the XML. - - The writer to use to output the event to. - The event to write. - - - Override the base class method - to write the to the . - - - - - - The prefix to use for all generated element names - - - - - The prefix to use for all element names - - - - The default prefix is log4net. Set this property - to change the prefix. If the prefix is set to an empty string - then no prefix will be written. - - - - - - Set whether or not to base64 encode the message. - - - - By default the log message will be written as text to the xml - output. This can cause problems when the message contains binary - data. By setting this to true the contents of the message will be - base64 encoded. If this is set then invalid character replacement - (see ) will not be performed - on the log message. - - - - - - Set whether or not to base64 encode the property values. - - - - By default the properties will be written as text to the xml - output. This can cause problems when one or more properties contain - binary data. By setting this to true the values of the properties - will be base64 encoded. If this is set then invalid character replacement - (see ) will not be performed - on the property values. - - - - - - Layout that formats the log events as XML elements compatible with the log4j schema - - - - Formats the log events according to the http://logging.apache.org/log4j schema. - - - Nicko Cadell - - - - The 1st of January 1970 in UTC - - - - - Constructs an XMLLayoutSchemaLog4j - - - - - Constructs an XMLLayoutSchemaLog4j. - - - - The LocationInfo option takes a boolean value. By - default, it is set to false which means there will be no location - information output by this layout. If the the option is set to - true, then the file name and line number of the statement - at the origin of the log statement will be output. - - - If you are embedding this layout within an SMTPAppender - then make sure to set the LocationInfo option of that - appender as well. - - - - - - Actually do the writing of the xml - - the writer to use - the event to write - - - Generate XML that is compatible with the log4j schema. - - - - - - The version of the log4j schema to use. - - - - Only version 1.2 of the log4j schema is supported. - - - - - - The default object Renderer. - - - - The default renderer supports rendering objects and collections to strings. - - - See the method for details of the output. - - - Nicko Cadell - Gert Driesen - - - - Implement this interface in order to render objects as strings - - - - Certain types require special case conversion to - string form. This conversion is done by an object renderer. - Object renderers implement the - interface. - - - Nicko Cadell - Gert Driesen - - - - Render the object to a string - - The map used to lookup renderers - The object to render - The writer to render to - - - Render the object to a - string. - - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - - - - - Default constructor - - - - Default constructor - - - - - - Render the object to a string - - The map used to lookup renderers - The object to render - The writer to render to - - - Render the object to a string. - - - The parameter is - provided to lookup and render other objects. This is - very useful where contains - nested objects of unknown type. The - method can be used to render these objects. - - - The default renderer supports rendering objects to strings as follows: - - - - Value - Rendered String - - - null - - "(null)" - - - - - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. - - - For example: int[] {1, 2, 3}. - - - If the array is not one dimensional the - Array.ToString() is returned. - - - - - , & - - - Rendered as an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. - - - For example: {a, b, c}. - - - All collection classes that implement its subclasses, - or generic equivalents all implement the interface. - - - - - - - - Rendered as the key, an equals sign ('='), and the value (using the appropriate - renderer). - - - For example: key=value. - - - - - other - - Object.ToString() - - - - - - - - Render the array argument into a string - - The map used to lookup renderers - the array to render - The writer to render to - - - For a one dimensional array this is the - array type name, an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - int[] {1, 2, 3}. - - - If the array is not one dimensional the - Array.ToString() is returned. - - - - - - Render the enumerator argument into a string - - The map used to lookup renderers - the enumerator to render - The writer to render to - - - Rendered as an open brace, followed by a comma - separated list of the elements (using the appropriate - renderer), followed by a close brace. For example: - {a, b, c}. - - - - - - Render the DictionaryEntry argument into a string - - The map used to lookup renderers - the DictionaryEntry to render - The writer to render to - - - Render the key, an equals sign ('='), and the value (using the appropriate - renderer). For example: key=value. - - - - - - Map class objects to an . - - - - Maintains a mapping between types that require special - rendering and the that - is used to render them. - - - The method is used to render an - object using the appropriate renderers defined in this map. - - - Nicko Cadell - Gert Driesen - - - - Default Constructor - - - - Default constructor. - - - - - - Render using the appropriate renderer. - - the object to render to a string - the object rendered as a string - - - This is a convenience method used to render an object to a string. - The alternative method - should be used when streaming output to a . - - - - - - Render using the appropriate renderer. - - the object to render to a string - The writer to render to - - - Find the appropriate renderer for the type of the - parameter. This is accomplished by calling the - method. Once a renderer is found, it is - applied on the object and the result is returned - as a . - - - - - - Gets the renderer for the specified object type - - the object to lookup the renderer for - the renderer for - - - Gets the renderer for the specified object type. - - - Syntactic sugar method that calls - with the type of the object parameter. - - - - - - Gets the renderer for the specified type - - the type to lookup the renderer for - the renderer for the specified type - - - Returns the renderer for the specified type. - If no specific renderer has been defined the - will be returned. - - - - - - Internal function to recursively search interfaces - - the type to lookup the renderer for - the renderer for the specified type - - - - Clear the map of renderers - - - - Clear the custom renderers defined by using - . The - cannot be removed. - - - - - - Register an for . - - the type that will be rendered by - the renderer for - - - Register an object renderer for a specific source type. - This renderer will be returned from a call to - specifying the same as an argument. - - - - - - Get the default renderer instance - - the default renderer - - - Get the default renderer - - - - - - Interface implemented by logger repository plugins. - - - - Plugins define additional behavior that can be associated - with a . - The held by the - property is used to store the plugins for a repository. - - - The log4net.Config.PluginAttribute can be used to - attach plugins to repositories created using configuration - attributes. - - - Nicko Cadell - Gert Driesen - - - - Attaches the plugin to the specified . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - This method is called to notify the plugin that - it should stop operating and should detach from - the repository. - - - - - - Gets the name of the plugin. - - - The name of the plugin. - - - - Plugins are stored in the - keyed by name. Each plugin instance attached to a - repository must be a unique name. - - - - - - A strongly-typed collection of objects. - - Nicko Cadell - - - - Creates a read-only wrapper for a PluginCollection instance. - - list to create a readonly wrapper arround - - A PluginCollection wrapper that is read-only. - - - - - Initializes a new instance of the PluginCollection class - that is empty and has the default initial capacity. - - - - - Initializes a new instance of the PluginCollection class - that has the specified initial capacity. - - - The number of elements that the new PluginCollection is initially capable of storing. - - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified PluginCollection. - - The PluginCollection whose elements are copied to the new collection. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified array. - - The array whose elements are copied to the new list. - - - - Initializes a new instance of the PluginCollection class - that contains elements copied from the specified collection. - - The collection whose elements are copied to the new list. - - - - Allow subclasses to avoid our default constructors - - - - - - - Copies the entire PluginCollection to a one-dimensional - array. - - The one-dimensional array to copy to. - - - - Copies the entire PluginCollection to a one-dimensional - array, starting at the specified index of the target array. - - The one-dimensional array to copy to. - The zero-based index in at which copying begins. - - - - Adds a to the end of the PluginCollection. - - The to be added to the end of the PluginCollection. - The index at which the value has been added. - - - - Removes all elements from the PluginCollection. - - - - - Creates a shallow copy of the . - - A new with a shallow copy of the collection data. - - - - Determines whether a given is in the PluginCollection. - - The to check for. - true if is found in the PluginCollection; otherwise, false. - - - - Returns the zero-based index of the first occurrence of a - in the PluginCollection. - - The to locate in the PluginCollection. - - The zero-based index of the first occurrence of - in the entire PluginCollection, if found; otherwise, -1. - - - - - Inserts an element into the PluginCollection at the specified index. - - The zero-based index at which should be inserted. - The to insert. - - is less than zero - -or- - is equal to or greater than . - - - - - Removes the first occurrence of a specific from the PluginCollection. - - The to remove from the PluginCollection. - - The specified was not found in the PluginCollection. - - - - - Removes the element at the specified index of the PluginCollection. - - The zero-based index of the element to remove. - - is less than zero. - -or- - is equal to or greater than . - - - - - Returns an enumerator that can iterate through the PluginCollection. - - An for the entire PluginCollection. - - - - Adds the elements of another PluginCollection to the current PluginCollection. - - The PluginCollection whose elements should be added to the end of the current PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a array to the current PluginCollection. - - The array whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Adds the elements of a collection to the current PluginCollection. - - The collection whose elements should be added to the end of the PluginCollection. - The new of the PluginCollection. - - - - Sets the capacity to the actual number of elements. - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets the number of elements actually contained in the PluginCollection. - - - - - Gets a value indicating whether access to the collection is synchronized (thread-safe). - - true if access to the ICollection is synchronized (thread-safe); otherwise, false. - - - - Gets an object that can be used to synchronize access to the collection. - - - An object that can be used to synchronize access to the collection. - - - - - Gets or sets the at the specified index. - - - The at the specified index. - - The zero-based index of the element to get or set. - - is less than zero. - -or- - is equal to or greater than . - - - - - Gets a value indicating whether the collection has a fixed size. - - true if the collection has a fixed size; otherwise, false. The default is false. - - - - Gets a value indicating whether the IList is read-only. - - true if the collection is read-only; otherwise, false. The default is false. - - - - Gets or sets the number of elements the PluginCollection can contain. - - - The number of elements the PluginCollection can contain. - - - - - Supports type-safe iteration over a . - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - - - Type visible only to our subclasses - Used to access protected constructor - - - - - - A value - - - - - Supports simple iteration over a . - - - - - - Initializes a new instance of the Enumerator class. - - - - - - Advances the enumerator to the next element in the collection. - - - true if the enumerator was successfully advanced to the next element; - false if the enumerator has passed the end of the collection. - - - The collection was modified after the enumerator was created. - - - - - Sets the enumerator to its initial position, before the first element in the collection. - - - - - Gets the current element in the collection. - - - The current element in the collection. - - - - - - - - Map of repository plugins. - - - - This class is a name keyed map of the plugins that are - attached to a repository. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The repository that the plugins should be attached to. - - - Initialize a new instance of the class with a - repository that the plugins should be attached to. - - - - - - Adds a to the map. - - The to add to the map. - - - The will be attached to the repository when added. - - - If there already exists a plugin with the same name - attached to the repository then the old plugin will - be and replaced with - the new plugin. - - - - - - Removes a from the map. - - The to remove from the map. - - - Remove a specific plugin from this map. - - - - - - Gets a by name. - - The name of the to lookup. - - The from the map with the name specified, or - null if no plugin is found. - - - - Lookup a plugin by name. If the plugin is not found null - will be returned. - - - - - - Gets all possible plugins as a list of objects. - - All possible plugins as a list of objects. - - - Get a collection of all the plugins defined in this map. - - - - - - Base implementation of - - - - Default abstract implementation of the - interface. This base class can be used by implementors - of the interface. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - the name of the plugin - - Initializes a new Plugin with the specified name. - - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - This method is called to notify the plugin that - it should stop operating and should detach from - the repository. - - - - - - The name of this plugin. - - - - - The repository this plugin is attached to. - - - - - Gets or sets the name of the plugin. - - - The name of the plugin. - - - - Plugins are stored in the - keyed by name. Each plugin instance attached to a - repository must be a unique name. - - - The name of the plugin must not change one the - plugin has been attached to a repository. - - - - - - The repository for this plugin - - - The that this plugin is attached to. - - - - Gets or sets the that this plugin is - attached to. - - - - - - Plugin that listens for events from the - - - - This plugin publishes an instance of - on a specified . This listens for logging events delivered from - a remote . - - - When an event is received it is relogged within the attached repository - as if it had been raised locally. - - - Nicko Cadell - Gert Driesen - - - - Default constructor - - - - Initializes a new instance of the class. - - - The property must be set. - - - - - - Construct with sink Uri. - - The name to publish the sink under in the remoting infrastructure. - See for more details. - - - Initializes a new instance of the class - with specified name. - - - - - - Attaches this plugin to a . - - The that this plugin should be attached to. - - - A plugin may only be attached to a single repository. - - - This method is called when the plugin is attached to the repository. - - - - - - Is called when the plugin is to shutdown. - - - - When the plugin is shutdown the remote logging - sink is disconnected. - - - - - - The fully qualified type of the RemoteLoggingServerPlugin class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or sets the URI of this sink. - - - The URI of this sink. - - - - This is the name under which the object is marshaled. - - - - - - - Delivers objects to a remote sink. - - - - Internal class used to listen for logging events - and deliver them to the local repository. - - - - - - Constructor - - The repository to log to. - - - Initializes a new instance of the for the - specified . - - - - - - Logs the events to the repository. - - The events to log. - - - The events passed are logged to the - - - - - - Obtains a lifetime service object to control the lifetime - policy for this instance. - - null to indicate that this instance should live forever. - - - Obtains a lifetime service object to control the lifetime - policy for this instance. This object should live forever - therefore this implementation returns null. - - - - - - The underlying that events should - be logged to. - - - - - Default implementation of - - - - This default implementation of the - interface is used to create the default subclass - of the object. - - - Nicko Cadell - Gert Driesen - - - - Interface abstracts creation of instances - - - - This interface is used by the to - create new objects. - - - The method is called - to create a named . - - - Implement this interface to create new subclasses of . - - - Nicko Cadell - Gert Driesen - - - - Create a new instance - - The that will own the . - The name of the . - The instance for the specified name. - - - Create a new instance with the - specified name. - - - Called by the to create - new named instances. - - - If the is null then the root logger - must be returned. - - - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Create a new instance - - The that will own the . - The name of the . - The instance for the specified name. - - - Create a new instance with the - specified name. - - - Called by the to create - new named instances. - - - If the is null then the root logger - must be returned. - - - - - - Default internal subclass of - - - - This subclass has no additional behavior over the - class but does allow instances - to be created. - - - - - - Implementation of used by - - - - Internal class used to provide implementation of - interface. Applications should use to get - logger instances. - - - This is one of the central classes in the log4net implementation. One of the - distinctive features of log4net are hierarchical loggers and their - evaluation. The organizes the - instances into a rooted tree hierarchy. - - - The class is abstract. Only concrete subclasses of - can be created. The - is used to create instances of this type for the . - - - Nicko Cadell - Gert Driesen - Aspi Havewala - Douglas de la Torre - - - - This constructor created a new instance and - sets its name. - - The name of the . - - - This constructor is protected and designed to be used by - a subclass that is not abstract. - - - Loggers are constructed by - objects. See for the default - logger creator. - - - - - - Add to the list of appenders of this - Logger instance. - - An appender to add to this logger - - - Add to the list of appenders of this - Logger instance. - - - If is already in the list of - appenders, then it won't be added again. - - - - - - Look for the appender named as name - - The name of the appender to lookup - The appender with the name specified, or null. - - - Returns the named appender, or null if the appender is not found. - - - - - - Remove all previously added appenders from this Logger instance. - - - - Remove all previously added appenders from this Logger instance. - - - This is useful when re-reading configuration information. - - - - - - Remove the appender passed as parameter form the list of appenders. - - The appender to remove - The appender removed from the list - - - Remove the appender passed as parameter form the list of appenders. - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Remove the appender passed as parameter form the list of appenders. - - The name of the appender to remove - The appender removed from the list - - - Remove the named appender passed as parameter form the list of appenders. - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - This generic form is intended to be used by wrappers. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generate a logging event for the specified using - the and . - - - This method must not throw any exception to the caller. - - - - - - This is the most generic printing method that is intended to be used - by wrappers. - - The event being logged. - - - Logs the specified logging event through this logger. - - - This method must not throw any exception to the caller. - - - - - - Checks if this logger is enabled for a given passed as parameter. - - The level to check. - - true if this logger is enabled for level, otherwise false. - - - - Test if this logger is going to log events of the specified . - - - This method must not throw any exception to the caller. - - - - - - Deliver the to the attached appenders. - - The event to log. - - - Call the appenders in the hierarchy starting at - this. If no appenders could be found, emit a - warning. - - - This method calls all the appenders inherited from the - hierarchy circumventing any evaluation of whether to log or not - to log the particular log request. - - - - - - Closes all attached appenders implementing the interface. - - - - Used to ensure that the appenders are correctly shutdown. - - - - - - This is the most generic printing method. This generic form is intended to be used by wrappers - - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generate a logging event for the specified using - the . - - - - - - Creates a new logging event and logs the event without further checks. - - The declaring type of the method that is - the stack boundary into the logging system for this call. - The level of the message to be logged. - The message object to log. - The exception to log, including its stack trace. - - - Generates a logging event and delivers it to the attached - appenders. - - - - - - Creates a new logging event and logs the event without further checks. - - The event being logged. - - - Delivers the logging event to the attached appenders. - - - - - - The fully qualified type of the Logger class. - - - - - The name of this logger. - - - - - The assigned level of this logger. - - - - The level variable need not be - assigned a value in which case it is inherited - form the hierarchy. - - - - - - The parent of this logger. - - - - The parent of this logger. - All loggers have at least one ancestor which is the root logger. - - - - - - Loggers need to know what Hierarchy they are in. - - - - Loggers need to know what Hierarchy they are in. - The hierarchy that this logger is a member of is stored - here. - - - - - - Helper implementation of the interface - - - - - Flag indicating if child loggers inherit their parents appenders - - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - - Lock to protect AppenderAttachedImpl variable m_appenderAttachedImpl - - - - - Gets or sets the parent logger in the hierarchy. - - - The parent logger in the hierarchy. - - - - Part of the Composite pattern that makes the hierarchy. - The hierarchy is parent linked rather than child linked. - - - - - - Gets or sets a value indicating if child loggers inherit their parent's appenders. - - - true if child loggers inherit their parent's appenders. - - - - Additivity is set to true by default, that is children inherit - the appenders of their ancestors by default. If this variable is - set to false then the appenders found in the - ancestors of this logger are not used. However, the children - of this logger will inherit its appenders, unless the children - have their additivity flag set to false too. See - the user manual for more details. - - - - - - Gets the effective level for this logger. - - The nearest level in the logger hierarchy. - - - Starting from this logger, searches the logger hierarchy for a - non-null level and returns it. Otherwise, returns the level of the - root logger. - - The Logger class is designed so that this method executes as - quickly as possible. - - - - - Gets or sets the where this - Logger instance is attached to. - - The hierarchy that this logger belongs to. - - - This logger must be attached to a single . - - - - - - Gets or sets the assigned , if any, for this Logger. - - - The of this logger. - - - - The assigned can be null. - - - - - - Get the appenders contained in this logger as an - . - - A collection of the appenders in this logger - - - Get the appenders contained in this logger as an - . If no appenders - can be found, then a is returned. - - - - - - Gets the logger name. - - - The name of the logger. - - - - The name of this logger - - - - - - Gets the where this - Logger instance is attached to. - - - The that this logger belongs to. - - - - Gets the where this - Logger instance is attached to. - - - - - - Construct a new Logger - - the name of the logger - - - Initializes a new instance of the class - with the specified name. - - - - - - Delegate used to handle logger creation event notifications. - - The in which the has been created. - The event args that hold the instance that has been created. - - - Delegate used to handle logger creation event notifications. - - - - - - Provides data for the event. - - - - A event is raised every time a - is created. - - - - - - The created - - - - - Constructor - - The that has been created. - - - Initializes a new instance of the event argument - class,with the specified . - - - - - - Gets the that has been created. - - - The that has been created. - - - - The that has been created. - - - - - - Hierarchical organization of loggers - - - - The casual user should not have to deal with this class - directly. - - - This class is specialized in retrieving loggers by name and - also maintaining the logger hierarchy. Implements the - interface. - - - The structure of the logger hierarchy is maintained by the - method. The hierarchy is such that children - link to their parent but parents do not have any references to their - children. Moreover, loggers can be instantiated in any order, in - particular descendant before ancestor. - - - In case a descendant is created before a particular ancestor, - then it creates a provision node for the ancestor and adds itself - to the provision node. Other descendants of the same ancestor add - themselves to the previously created provision node. - - - Nicko Cadell - Gert Driesen - - - - Base implementation of - - - - Default abstract implementation of the interface. - - - Skeleton implementation of the interface. - All types can extend this type. - - - Nicko Cadell - Gert Driesen - - - - Interface implemented by logger repositories. - - - - This interface is implemented by logger repositories. e.g. - . - - - This interface is used by the - to obtain interfaces. - - - Nicko Cadell - Gert Driesen - - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - The name of the logger to lookup - The Logger object with the name specified - - - If the names logger exists it is returned, otherwise - null is returned. - - - - - - Returns all the currently defined loggers as an Array. - - All the defined loggers - - - Returns all the currently defined loggers as an Array. - - - - - - Returns a named logger instance - - The name of the logger to retrieve - The logger object with the name specified - - - Returns a named logger instance. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - - - Shutdown the repository - - - Shutting down a repository will safely close and remove - all appenders in all loggers including the root logger. - - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - - The method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Reset the repositories configuration to a default state - - - - Reset all values contained in this instance to their - default state. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are configured as an Array. - - All the Appenders - - - Returns all the Appenders that are configured as an Array. - - - - - - The name of the repository - - - The name of the repository - - - - The name of the repository. - - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - - RendererMap accesses the object renderer map for this repository. - - - The RendererMap holds a mapping between types and - objects. - - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - The plugin map holds the instances - that have been attached to this repository. - - - - - - Get the level map for the Repository. - - - - Get the level map for the Repository. - - - The level map defines the mappings between - level names and objects in - this repository. - - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - The threshold for all events in this repository. - - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - Flag indicates if this repository has been configured. - - - - - - Collection of internal messages captured during the most - recent configuration process. - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - Event raised when the repository has been shutdown. - - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - Event raised when the repository's configuration has been - reset to default. - - - - - - Event to notify that the repository has had its configuration changed. - - - Event to notify that the repository has had its configuration changed. - - - - Event raised when the repository's configuration has been changed. - - - - - - Repository specific properties - - - Repository specific properties - - - - These properties can be specified on a repository specific basis. - - - - - - Default Constructor - - - - Initializes the repository with default (empty) properties. - - - - - - Construct the repository using specific properties - - the properties to set for this repository - - - Initializes the repository with specified properties. - - - - - - Test if logger exists - - The name of the logger to lookup - The Logger object with the name specified - - - Check if the named logger exists in the repository. If so return - its reference, otherwise returns null. - - - - - - Returns all the currently defined loggers in the repository - - All the defined loggers - - - Returns all the currently defined loggers in the repository as an Array. - - - - - - Return a new logger instance - - The name of the logger to retrieve - The logger object with the name specified - - - Return a new logger instance. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - - - - Shutdown the repository - - - - Shutdown the repository. Can be overridden in a subclass. - This base class implementation notifies the - listeners and all attached plugins of the shutdown event. - - - - - - Reset the repositories configuration to a default state - - - - Reset all values contained in this instance to their - default state. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the logEvent through this repository. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are configured as an Array. - - All the Appenders - - - Returns all the Appenders that are configured as an Array. - - - - - - The fully qualified type of the LoggerRepositorySkeleton class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Adds an object renderer for a specific class. - - The type that will be rendered by the renderer supplied. - The object renderer used to render the object. - - - Adds an object renderer for a specific class. - - - - - - Notify the registered listeners that the repository is shutting down - - Empty EventArgs - - - Notify any listeners that this repository is shutting down. - - - - - - Notify the registered listeners that the repository has had its configuration reset - - Empty EventArgs - - - Notify any listeners that this repository's configuration has been reset. - - - - - - Notify the registered listeners that the repository has had its configuration changed - - Empty EventArgs - - - Notify any listeners that this repository's configuration has changed. - - - - - - Raise a configuration changed event on this repository - - EventArgs.Empty - - - Applications that programmatically change the configuration of the repository should - raise this event notification to notify listeners. - - - - - - The name of the repository - - - The string name of the repository - - - - The name of this repository. The name is - used to store and lookup the repositories - stored by the . - - - - - - The threshold for all events in this repository - - - The threshold for all events in this repository - - - - The threshold for all events in this repository - - - - - - RendererMap accesses the object renderer map for this repository. - - - RendererMap accesses the object renderer map for this repository. - - - - RendererMap accesses the object renderer map for this repository. - - - The RendererMap holds a mapping between types and - objects. - - - - - - The plugin map for this repository. - - - The plugin map for this repository. - - - - The plugin map holds the instances - that have been attached to this repository. - - - - - - Get the level map for the Repository. - - - - Get the level map for the Repository. - - - The level map defines the mappings between - level names and objects in - this repository. - - - - - - Flag indicates if this repository has been configured. - - - Flag indicates if this repository has been configured. - - - - Flag indicates if this repository has been configured. - - - - - - Contains a list of internal messages captures during the - last configuration. - - - - - Event to notify that the repository has been shutdown. - - - Event to notify that the repository has been shutdown. - - - - Event raised when the repository has been shutdown. - - - - - - Event to notify that the repository has had its configuration reset. - - - Event to notify that the repository has had its configuration reset. - - - - Event raised when the repository's configuration has been - reset to default. - - - - - - Event to notify that the repository has had its configuration changed. - - - Event to notify that the repository has had its configuration changed. - - - - Event raised when the repository's configuration has been changed. - - - - - - Repository specific properties - - - Repository specific properties - - - These properties can be specified on a repository specific basis - - - - - Basic Configurator interface for repositories - - - - Interface used by basic configurator to configure a - with a default . - - - A should implement this interface to support - configuration by the . - - - Nicko Cadell - Gert Driesen - - - - Initialize the repository using the specified appender - - the appender to use to log all logging events - - - Configure the repository to route all logging events to the - specified appender. - - - - - - Initialize the repository using the specified appenders - - the appenders to use to log all logging events - - - Configure the repository to route all logging events to the - specified appenders. - - - - - - Configure repository using XML - - - - Interface used by Xml configurator to configure a . - - - A should implement this interface to support - configuration by the . - - - Nicko Cadell - Gert Driesen - - - - Initialize the repository using the specified config - - the element containing the root of the config - - - The schema for the XML configuration data is defined by - the implementation. - - - - - - Default constructor - - - - Initializes a new instance of the class. - - - - - - Construct with properties - - The properties to pass to this repository. - - - Initializes a new instance of the class. - - - - - - Construct with a logger factory - - The factory to use to create new logger instances. - - - Initializes a new instance of the class with - the specified . - - - - - - Construct with properties and a logger factory - - The properties to pass to this repository. - The factory to use to create new logger instances. - - - Initializes a new instance of the class with - the specified . - - - - - - Test if a logger exists - - The name of the logger to lookup - The Logger object with the name specified - - - Check if the named logger exists in the hierarchy. If so return - its reference, otherwise returns null. - - - - - - Returns all the currently defined loggers in the hierarchy as an Array - - All the defined loggers - - - Returns all the currently defined loggers in the hierarchy as an Array. - The root logger is not included in the returned - enumeration. - - - - - - Return a new logger instance named as the first parameter using - the default factory. - - - - Return a new logger instance named as the first parameter using - the default factory. - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated and - then linked with its existing ancestors as well as children. - - - The name of the logger to retrieve - The logger object with the name specified - - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - - - Shutting down a hierarchy will safely close and remove - all appenders in all loggers including the root logger. - - - Some appenders need to be closed before the - application exists. Otherwise, pending logging events might be - lost. - - - The Shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Reset all values contained in this hierarchy instance to their default. - - - - Reset all values contained in this hierarchy instance to their - default. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set its default "off" value. - - - Existing loggers are not removed. They are just reset. - - - This method should be used sparingly and with care as it will - block all logging until it is completed. - - - - - - Log the logEvent through this hierarchy. - - the event to log - - - This method should not normally be used to log. - The interface should be used - for routine logging. This interface can be obtained - using the method. - - - The logEvent is delivered to the appropriate logger and - that logger is then responsible for logging the event. - - - - - - Returns all the Appenders that are currently configured - - An array containing all the currently configured appenders - - - Returns all the instances that are currently configured. - All the loggers are searched for appenders. The appenders may also be containers - for appenders and these are also searched for additional loggers. - - - The list returned is unordered but does not contain duplicates. - - - - - - Collect the appenders from an . - The appender may also be a container. - - - - - - - Collect the appenders from an container - - - - - - - Initialize the log4net system using the specified appender - - the appender to use to log all logging events - - - - Initialize the log4net system using the specified appenders - - the appenders to use to log all logging events - - - - Initialize the log4net system using the specified appenders - - the appenders to use to log all logging events - - - This method provides the same functionality as the - method implemented - on this object, but it is protected and therefore can be called by subclasses. - - - - - - Initialize the log4net system using the specified config - - the element containing the root of the config - - - - Initialize the log4net system using the specified config - - the element containing the root of the config - - - This method provides the same functionality as the - method implemented - on this object, but it is protected and therefore can be called by subclasses. - - - - - - Test if this hierarchy is disabled for the specified . - - The level to check against. - - true if the repository is disabled for the level argument, false otherwise. - - - - If this hierarchy has not been configured then this method will - always return true. - - - This method will return true if this repository is - disabled for level object passed as parameter and - false otherwise. - - - See also the property. - - - - - - Clear all logger definitions from the internal hashtable - - - - This call will clear all logger definitions from the internal - hashtable. Invoking this method will irrevocably mess up the - logger hierarchy. - - - You should really know what you are doing before - invoking this method. - - - - - - Return a new logger instance named as the first parameter using - . - - The name of the logger to retrieve - The factory that will make the new logger instance - The logger object with the name specified - - - If a logger of that name already exists, then it will be - returned. Otherwise, a new logger will be instantiated by the - parameter and linked with its existing - ancestors as well as children. - - - - - - Sends a logger creation event to all registered listeners - - The newly created logger - - Raises the logger creation event. - - - - - Updates all the parents of the specified logger - - The logger to update the parents for - - - This method loops through all the potential parents of - . There 3 possible cases: - - - - No entry for the potential parent of exists - - We create a ProvisionNode for this potential - parent and insert in that provision node. - - - - The entry is of type Logger for the potential parent. - - The entry is 's nearest existing parent. We - update 's parent field with this entry. We also break from - he loop because updating our parent's parent is our parent's - responsibility. - - - - The entry is of type ProvisionNode for this potential parent. - - We add to the list of children for this - potential parent. - - - - - - - - Replace a with a in the hierarchy. - - - - - - We update the links for all the children that placed themselves - in the provision node 'pn'. The second argument 'log' is a - reference for the newly created Logger, parent of all the - children in 'pn'. - - - We loop on all the children 'c' in 'pn'. - - - If the child 'c' has been already linked to a child of - 'log' then there is no need to update 'c'. - - - Otherwise, we set log's parent field to c's parent and set - c's parent field to log. - - - - - - Define or redefine a Level using the values in the argument - - the level values - - - Define or redefine a Level using the values in the argument - - - Supports setting levels via the configuration file. - - - - - - Set a Property using the values in the argument - - the property value - - - Set a Property using the values in the argument. - - - Supports setting property values via the configuration file. - - - - - - The fully qualified type of the Hierarchy class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Event used to notify that a logger has been created. - - - - Event raised when a logger is created. - - - - - - Has no appender warning been emitted - - - - Flag to indicate if we have already issued a warning - about not having an appender warning. - - - - - - Get the root of this hierarchy - - - - Get the root of this hierarchy. - - - - - - Gets or sets the default instance. - - The default - - - The logger factory is used to create logger instances. - - - - - - A class to hold the value, name and display name for a level - - - - A class to hold the value, name and display name for a level - - - - - - Override Object.ToString to return sensible debug info - - string info about this object - - - - Value of the level - - - - If the value is not set (defaults to -1) the value will be looked - up for the current level with the same name. - - - - - - Name of the level - - - The name of the level - - - - The name of the level. - - - - - - Display name for the level - - - The display name of the level - - - - The display name of the level. - - - - - - Used internally to accelerate hash table searches. - - - - Internal class used to improve performance of - string keyed hashtables. - - - The hashcode of the string is cached for reuse. - The string is stored as an interned value. - When comparing two objects for equality - the reference equality of the interned strings is compared. - - - Nicko Cadell - Gert Driesen - - - - Construct key with string name - - - - Initializes a new instance of the class - with the specified name. - - - Stores the hashcode of the string and interns - the string key to optimize comparisons. - - - The Compact Framework 1.0 the - method does not work. On the Compact Framework - the string keys are not interned nor are they - compared by reference. - - - The name of the logger. - - - - Returns a hash code for the current instance. - - A hash code for the current instance. - - - Returns the cached hashcode. - - - - - - Determines whether two instances - are equal. - - The to compare with the current . - - true if the specified is equal to the current ; otherwise, false. - - - - Compares the references of the interned strings. - - - - - - Provision nodes are used where no logger instance has been specified - - - - instances are used in the - when there is no specified - for that node. - - - A provision node holds a list of child loggers on behalf of - a logger that does not exist. - - - Nicko Cadell - Gert Driesen - - - - Create a new provision node with child node - - A child logger to add to this node. - - - Initializes a new instance of the class - with the specified child logger. - - - - - - The sits at the root of the logger hierarchy tree. - - - - The is a regular except - that it provides several guarantees. - - - First, it cannot be assigned a null - level. Second, since the root logger cannot have a parent, the - property always returns the value of the - level field without walking the hierarchy. - - - Nicko Cadell - Gert Driesen - - - - Construct a - - The level to assign to the root logger. - - - Initializes a new instance of the class with - the specified logging level. - - - The root logger names itself as "root". However, the root - logger cannot be retrieved by name. - - - - - - The fully qualified type of the RootLogger class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets the assigned level value without walking the logger hierarchy. - - The assigned level value without walking the logger hierarchy. - - - Because the root logger cannot have a parent and its level - must not be null this property just returns the - value of . - - - - - - Gets or sets the assigned for the root logger. - - - The of the root logger. - - - - Setting the level of the root logger to a null reference - may have catastrophic results. We prevent this here. - - - - - - Initializes the log4net environment using an XML DOM. - - - - Configures a using an XML DOM. - - - Nicko Cadell - Gert Driesen - - - - Construct the configurator for a hierarchy - - The hierarchy to build. - - - Initializes a new instance of the class - with the specified . - - - - - - Configure the hierarchy by parsing a DOM tree of XML elements. - - The root element to parse. - - - Configure the hierarchy by parsing a DOM tree of XML elements. - - - - - - Parse appenders by IDREF. - - The appender ref element. - The instance of the appender that the ref refers to. - - - Parse an XML element that represents an appender and return - the appender. - - - - - - Parses an appender element. - - The appender element. - The appender instance or null when parsing failed. - - - Parse an XML element that represents an appender and return - the appender instance. - - - - - - Parses a logger element. - - The logger element. - - - Parse an XML element that represents a logger. - - - - - - Parses the root logger element. - - The root element. - - - Parse an XML element that represents the root logger. - - - - - - Parses the children of a logger element. - - The category element. - The logger instance. - Flag to indicate if the logger is the root logger. - - - Parse the child elements of a <logger> element. - - - - - - Parses an object renderer. - - The renderer element. - - - Parse an XML element that represents a renderer. - - - - - - Parses a level element. - - The level element. - The logger object to set the level on. - Flag to indicate if the logger is the root logger. - - - Parse an XML element that represents a level. - - - - - - Sets a parameter on an object. - - The parameter element. - The object to set the parameter on. - - The parameter name must correspond to a writable property - on the object. The value of the parameter is a string, - therefore this function will attempt to set a string - property first. If unable to set a string property it - will inspect the property and its argument type. It will - attempt to call a static method called Parse on the - type of the property. This method will take a single - string argument and return a value that can be used to - set the property. - - - - - Test if an element has no attributes or child elements - - the element to inspect - true if the element has any attributes or child elements, false otherwise - - - - Test if a is constructible with Activator.CreateInstance. - - the type to inspect - true if the type is creatable using a default constructor, false otherwise - - - - Look for a method on the that matches the supplied - - the type that has the method - the name of the method - the method info found - - - The method must be a public instance method on the . - The method must be named or "Add" followed by . - The method must take a single parameter. - - - - - - Converts a string value to a target type. - - The type of object to convert the string to. - The string value to use as the value of the object. - - - An object of type with value or - null when the conversion could not be performed. - - - - - - Creates an object as specified in XML. - - The XML element that contains the definition of the object. - The object type to use if not explicitly specified. - The type that the returned object must be or must inherit from. - The object or null - - - Parse an XML element and create an object instance based on the configuration - data. - - - The type of the instance may be specified in the XML. If not - specified then the is used - as the type. However the type is specified it must support the - type. - - - - - - key: appenderName, value: appender. - - - - - The Hierarchy being configured. - - - - - The fully qualified type of the XmlHierarchyConfigurator class. - - - Used by the internal logger to record the Type of the - log message. - - - - - - - - - - - - - - - - - - - - - Delegate used to handle logger repository shutdown event notifications - - The that is shutting down. - Empty event args - - - Delegate used to handle logger repository shutdown event notifications. - - - - - - Delegate used to handle logger repository configuration reset event notifications - - The that has had its configuration reset. - Empty event args - - - Delegate used to handle logger repository configuration reset event notifications. - - - - - - Delegate used to handle event notifications for logger repository configuration changes. - - The that has had its configuration changed. - Empty event arguments. - - - Delegate used to handle event notifications for logger repository configuration changes. - - - - - - Write the name of the current AppDomain to the output - - - - Write the name of the current AppDomain to the output writer - - - Nicko Cadell - - - - Write the name of the current AppDomain to the output - - the writer to write to - null, state is not set - - - Writes name of the current AppDomain to the output . - - - - - - Write the current date to the output - - - - Date pattern converter, uses a to format - the current date and time to the writer as a string. - - - The value of the determines - the formatting of the date. The following values are allowed: - - - Option value - Output - - - ISO8601 - - Uses the formatter. - Formats using the "yyyy-MM-dd HH:mm:ss,fff" pattern. - - - - DATE - - Uses the formatter. - Formats using the "dd MMM yyyy HH:mm:ss,fff" for example, "06 Nov 1994 15:49:37,459". - - - - ABSOLUTE - - Uses the formatter. - Formats using the "HH:mm:ss,fff" for example, "15:49:37,459". - - - - other - - Any other pattern string uses the formatter. - This formatter passes the pattern string to the - method. - For details on valid patterns see - DateTimeFormatInfo Class. - - - - - - The date and time is in the local time zone and is rendered in that zone. - To output the time in Universal time see . - - - Nicko Cadell - - - - The used to render the date to a string - - - - The used to render the date to a string - - - - - - Initialize the converter options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write the current date to the output - - that will receive the formatted result. - null, state is not set - - - Pass the current date and time to the - for it to render it to the writer. - - - The date and time passed is in the local time zone. - - - - - - The fully qualified type of the DatePatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Write an folder path to the output - - - - Write an special path environment folder path to the output writer. - The value of the determines - the name of the variable to output. - should be a value in the enumeration. - - - Ron Grabowski - - - - Write an special path environment folder path to the output - - the writer to write to - null, state is not set - - - Writes the special path environment folder path to the output . - The name of the special path environment folder path to output must be set - using the - property. - - - - - - The fully qualified type of the EnvironmentFolderPathPatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Write an environment variable to the output - - - - Write an environment variable to the output writer. - The value of the determines - the name of the variable to output. - - - Nicko Cadell - - - - Write an environment variable to the output - - the writer to write to - null, state is not set - - - Writes the environment variable to the output . - The name of the environment variable to output must be set - using the - property. - - - - - - The fully qualified type of the EnvironmentPatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Write the current thread identity to the output - - - - Write the current thread identity to the output writer - - - Nicko Cadell - - - - Write the current thread identity to the output - - the writer to write to - null, state is not set - - - Writes the current thread identity to the output . - - - - - - The fully qualified type of the IdentityPatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Pattern converter for literal string instances in the pattern - - - - Writes the literal string value specified in the - property to - the output. - - - Nicko Cadell - - - - Set the next converter in the chain - - The next pattern converter in the chain - The next pattern converter - - - Special case the building of the pattern converter chain - for instances. Two adjacent - literals in the pattern can be represented by a single combined - pattern converter. This implementation detects when a - is added to the chain - after this converter and combines its value with this converter's - literal value. - - - - - - Write the literal to the output - - the writer to write to - null, not set - - - Override the formatting behavior to ignore the FormattingInfo - because we have a literal instead. - - - Writes the value of - to the output . - - - - - - Convert this pattern into the rendered message - - that will receive the formatted result. - null, not set - - - This method is not used. - - - - - - Writes a newline to the output - - - - Writes the system dependent line terminator to the output. - This behavior can be overridden by setting the : - - - - Option Value - Output - - - DOS - DOS or Windows line terminator "\r\n" - - - UNIX - UNIX line terminator "\n" - - - - Nicko Cadell - - - - Initialize the converter - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write the current process ID to the output - - - - Write the current process ID to the output writer - - - Nicko Cadell - - - - Write the current process ID to the output - - the writer to write to - null, state is not set - - - Write the current process ID to the output . - - - - - - The fully qualified type of the ProcessIdPatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Property pattern converter - - - - This pattern converter reads the thread and global properties. - The thread properties take priority over global properties. - See for details of the - thread properties. See for - details of the global properties. - - - If the is specified then that will be used to - lookup a single property. If no is specified - then all properties will be dumped as a list of key value pairs. - - - Nicko Cadell - - - - Write the property value to the output - - that will receive the formatted result. - null, state is not set - - - Writes out the value of a named property. The property name - should be set in the - property. - - - If the is set to null - then all the properties are written as key value pairs. - - - - - - A Pattern converter that generates a string of random characters - - - - The converter generates a string of random characters. By default - the string is length 4. This can be changed by setting the - to the string value of the length required. - - - The random characters in the string are limited to uppercase letters - and numbers only. - - - The random number generator used by this class is not cryptographically secure. - - - Nicko Cadell - - - - Shared random number generator - - - - - Length of random string to generate. Default length 4. - - - - - Initialize the converter options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Write a randoim string to the output - - the writer to write to - null, state is not set - - - Write a randoim string to the output . - - - - - - The fully qualified type of the RandomStringPatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Write the current threads username to the output - - - - Write the current threads username to the output writer - - - Nicko Cadell - - - - Write the current threads username to the output - - the writer to write to - null, state is not set - - - Write the current threads username to the output . - - - - - - The fully qualified type of the UserNamePatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Write the UTC date time to the output - - - - Date pattern converter, uses a to format - the current date and time in Universal time. - - - See the for details on the date pattern syntax. - - - - Nicko Cadell - - - - Write the current date and time to the output - - that will receive the formatted result. - null, state is not set - - - Pass the current date and time to the - for it to render it to the writer. - - - The date is in Universal time when it is rendered. - - - - - - - The fully qualified type of the UtcDatePatternConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Type converter for Boolean. - - - - Supports conversion from string to bool type. - - - - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Convert the source object to the type supported by this object - - the object to convert - the converted object - - - Uses the method to convert the - argument to a . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Exception base type for conversion errors. - - - - This type extends . It - does not add any new functionality but does differentiate the - type of exception being thrown. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - A message to include with the exception. - - - Initializes a new instance of the class - with the specified message. - - - - - - Constructor - - A message to include with the exception. - A nested exception to include. - - - Initializes a new instance of the class - with the specified message and inner exception. - - - - - - Serialization constructor - - The that holds the serialized object data about the exception being thrown. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Creates a new instance of the class. - - The conversion destination type. - The value to convert. - An instance of the . - - - Creates a new instance of the class. - - - - - - Creates a new instance of the class. - - The conversion destination type. - The value to convert. - A nested exception to include. - An instance of the . - - - Creates a new instance of the class. - - - - - - Register of type converters for specific types. - - - - Maintains a registry of type converters used to convert between - types. - - - Use the and - methods to register new converters. - The and methods - lookup appropriate converters to use. - - - - - Nicko Cadell - Gert Driesen - - - - Private constructor - - - Initializes a new instance of the class. - - - - - Static constructor. - - - - This constructor defines the intrinsic type converters. - - - - - - Adds a converter for a specific type. - - The type being converted to. - The type converter to use to convert to the destination type. - - - Adds a converter instance for a specific type. - - - - - - Adds a converter for a specific type. - - The type being converted to. - The type of the type converter to use to convert to the destination type. - - - Adds a converter for a specific type. - - - - - - Gets the type converter to use to convert values to the destination type. - - The type being converted from. - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - Gets the type converter to use to convert values to the destination type. - - - - - - Gets the type converter to use to convert values to the destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - Gets the type converter to use to convert values to the destination type. - - - - - - Lookups the type converter to use as specified by the attributes on the - destination type. - - The type being converted to. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - - Creates the instance of the type converter. - - The type of the type converter. - - The type converter instance to use for type conversions or null - if no type converter is found. - - - - The type specified for the type converter must implement - the or interfaces - and must have a public default (no argument) constructor. - - - - - - The fully qualified type of the ConverterRegistry class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Mapping from to type converter. - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - - Nicko Cadell - Gert Driesen - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to an encoding - the encoding - - - Uses the method to - convert the argument to an . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Interface supported by type converters - - - - This interface supports conversion from a single type to arbitrary types. - See . - - - Nicko Cadell - - - - Returns whether this converter can convert the object to the specified type - - A Type that represents the type you want to convert to - true if the conversion is possible - - - Test if the type supported by this converter can be converted to the - . - - - - - - Converts the given value object to the specified type, using the arguments - - the object to convert - The Type to convert the value parameter to - the converted object - - - Converts the (which must be of the type supported - by this converter) to the specified.. - - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to an IPAddress - the IPAddress - - - Uses the method to convert the - argument to an . - If that fails then the string is resolved as a DNS hostname. - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Valid characters in an IPv4 or IPv6 address string. (Does not support subnets) - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - The string is used as the - of the . - - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a PatternLayout - the PatternLayout - - - Creates and returns a new using - the as the - . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Convert between string and - - - - Supports conversion from string to type, - and from a type to a string. - - - The string is used as the - of the . - - - - - - Nicko Cadell - - - - Can the target type be converted to the type supported by this object - - A that represents the type you want to convert to - true if the conversion is possible - - - Returns true if the is - assignable from a type. - - - - - - Converts the given value object to the specified type, using the arguments - - the object to convert - The Type to convert the value parameter to - the converted object - - - Uses the method to convert the - argument to a . - - - - The object cannot be converted to the - . To check for this condition use the - method. - - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a PatternString - the PatternString - - - Creates and returns a new using - the as the - . - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Supports conversion from string to type. - - - - Supports conversion from string to type. - - - - - - Nicko Cadell - - - - Can the source type be converted to the type supported by this object - - the type to convert - true if the conversion is possible - - - Returns true if the is - the type. - - - - - - Overrides the ConvertFrom method of IConvertFrom. - - the object to convert to a Type - the Type - - - Uses the method to convert the - argument to a . - Additional effort is made to locate partially specified types - by searching the loaded assemblies. - - - - The object cannot be converted to the - target type. To check for this condition use the - method. - - - - - Attribute used to associate a type converter - - - - Class and Interface level attribute that specifies a type converter - to use with the associated type. - - - To associate a type converter with a target type apply a - TypeConverterAttribute to the target type. Specify the - type of the type converter on the attribute. - - - Nicko Cadell - Gert Driesen - - - - The string type name of the type converter - - - - - Default constructor - - - - Default constructor - - - - - - Create a new type converter attribute for the specified type name - - The string type name of the type converter - - - The type specified must implement the - or the interfaces. - - - - - - Create a new type converter attribute for the specified type - - The type of the type converter - - - The type specified must implement the - or the interfaces. - - - - - - The string type name of the type converter - - - The string type name of the type converter - - - - The type specified must implement the - or the interfaces. - - - - - - A straightforward implementation of the interface. - - - - This is the default implementation of the - interface. Implementors of the interface - should aggregate an instance of this type. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Append on on all attached appenders. - - The event being logged. - The number of appenders called. - - - Calls the method on all - attached appenders. - - - - - - Append on on all attached appenders. - - The array of events being logged. - The number of appenders called. - - - Calls the method on all - attached appenders. - - - - - - Calls the DoAppende method on the with - the objects supplied. - - The appender - The events - - - If the supports the - interface then the will be passed - through using that interface. Otherwise the - objects in the array will be passed one at a time. - - - - - - Attaches an appender. - - The appender to add. - - - If the appender is already in the list it won't be added again. - - - - - - Gets an attached appender with the specified name. - - The name of the appender to get. - - The appender with the name specified, or null if no appender with the - specified name is found. - - - - Lookup an attached appender by name. - - - - - - Removes all attached appenders. - - - - Removes and closes all attached appenders - - - - - - Removes the specified appender from the list of attached appenders. - - The appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - Removes the appender with the specified name from the list of appenders. - - The name of the appender to remove. - The appender removed from the list - - - The appender removed is not closed. - If you are discarding the appender you must call - on the appender removed. - - - - - - List of appenders - - - - - Array of appenders, used to cache the m_appenderList - - - - - The fully qualified type of the AppenderAttachedImpl class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets all attached appenders. - - - A collection of attached appenders, or null if there - are no attached appenders. - - - - The read only collection of all currently attached appenders. - - - - - - This class aggregates several PropertiesDictionary collections together. - - - - Provides a dictionary style lookup over an ordered list of - collections. - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Add a Properties Dictionary to this composite collection - - the properties to add - - - Properties dictionaries added first take precedence over dictionaries added - later. - - - - - - Flatten this composite collection into a single properties dictionary - - the flattened dictionary - - - Reduces the collection of ordered dictionaries to a single dictionary - containing the resultant values for the keys. - - - - - - Gets the value of a property - - - The value for the property with the specified key - - - - Looks up the value for the specified. - The collections are searched - in the order in which they were added to this collection. The value - returned is the value held by the first collection that contains - the specified key. - - - If none of the collections contain the specified key then - null is returned. - - - - - - Base class for Context Properties implementations - - - - This class defines a basic property get set accessor - - - Nicko Cadell - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Gets or sets the value of a property - - - - - - Wrapper class used to map converter names to converter types - - - - Pattern converter info class used during configuration by custom - PatternString and PatternLayer converters. - - - - - - default constructor - - - - - - - - - - - Gets or sets the name of the conversion pattern - - - - The name of the pattern in the format string - - - - - - Gets or sets the type of the converter - - - - The value specified must extend the - type. - - - - - - - - - - - Subclass of that maintains a count of - the number of bytes written. - - - - This writer counts the number of bytes written. - - - Nicko Cadell - Gert Driesen - - - - that does not leak exceptions - - - - does not throw exceptions when things go wrong. - Instead, it delegates error handling to its . - - - Nicko Cadell - Gert Driesen - - - - Adapter that extends and forwards all - messages to an instance of . - - - - Adapter that extends and forwards all - messages to an instance of . - - - Nicko Cadell - - - - The writer to forward messages to - - - - - Create an instance of that forwards all - messages to a . - - The to forward to - - - Create an instance of that forwards all - messages to a . - - - - - - Closes the writer and releases any system resources associated with the writer - - - - - - - - - Dispose this writer - - flag indicating if we are being disposed - - - Dispose this writer - - - - - - Flushes any buffered output - - - - Clears all buffers for the writer and causes any buffered data to be written - to the underlying device - - - - - - Writes a character to the wrapped TextWriter - - the value to write to the TextWriter - - - Writes a character to the wrapped TextWriter - - - - - - Writes a character buffer to the wrapped TextWriter - - the data buffer - the start index - the number of characters to write - - - Writes a character buffer to the wrapped TextWriter - - - - - - Writes a string to the wrapped TextWriter - - the value to write to the TextWriter - - - Writes a string to the wrapped TextWriter - - - - - - Gets or sets the underlying . - - - The underlying . - - - - Gets or sets the underlying . - - - - - - The Encoding in which the output is written - - - The - - - - The Encoding in which the output is written - - - - - - Gets an object that controls formatting - - - The format provider - - - - Gets an object that controls formatting - - - - - - Gets or sets the line terminator string used by the TextWriter - - - The line terminator to use - - - - Gets or sets the line terminator string used by the TextWriter - - - - - - Constructor - - the writer to actually write to - the error handler to report error to - - - Create a new QuietTextWriter using a writer and error handler - - - - - - Writes a character to the underlying writer - - the char to write - - - Writes a character to the underlying writer - - - - - - Writes a buffer to the underlying writer - - the buffer to write - the start index to write from - the number of characters to write - - - Writes a buffer to the underlying writer - - - - - - Writes a string to the output. - - The string data to write to the output. - - - Writes a string to the output. - - - - - - Closes the underlying output writer. - - - - Closes the underlying output writer. - - - - - - The error handler instance to pass all errors to - - - - - Flag to indicate if this writer is closed - - - - - Gets or sets the error handler that all errors are passed to. - - - The error handler that all errors are passed to. - - - - Gets or sets the error handler that all errors are passed to. - - - - - - Gets a value indicating whether this writer is closed. - - - true if this writer is closed, otherwise false. - - - - Gets a value indicating whether this writer is closed. - - - - - - Constructor - - The to actually write to. - The to report errors to. - - - Creates a new instance of the class - with the specified and . - - - - - - Writes a character to the underlying writer and counts the number of bytes written. - - the char to write - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Writes a buffer to the underlying writer and counts the number of bytes written. - - the buffer to write - the start index to write from - the number of characters to write - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Writes a string to the output and counts the number of bytes written. - - The string data to write to the output. - - - Overrides implementation of . Counts - the number of bytes written. - - - - - - Total number of bytes written. - - - - - Gets or sets the total number of bytes written. - - - The total number of bytes written. - - - - Gets or sets the total number of bytes written. - - - - - - A fixed size rolling buffer of logging events. - - - - An array backed fixed size leaky bucket. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The maximum number of logging events in the buffer. - - - Initializes a new instance of the class with - the specified maximum number of buffered logging events. - - - The argument is not a positive integer. - - - - Appends a to the buffer. - - The event to append to the buffer. - The event discarded from the buffer, if the buffer is full, otherwise null. - - - Append an event to the buffer. If the buffer still contains free space then - null is returned. If the buffer is full then an event will be dropped - to make space for the new event, the event dropped is returned. - - - - - - Get and remove the oldest event in the buffer. - - The oldest logging event in the buffer - - - Gets the oldest (first) logging event in the buffer and removes it - from the buffer. - - - - - - Pops all the logging events from the buffer into an array. - - An array of all the logging events in the buffer. - - - Get all the events in the buffer and clear the buffer. - - - - - - Clear the buffer - - - - Clear the buffer of all events. The events in the buffer are lost. - - - - - - Gets the th oldest event currently in the buffer. - - The th oldest event currently in the buffer. - - - If is outside the range 0 to the number of events - currently in the buffer, then null is returned. - - - - - - Gets the maximum size of the buffer. - - The maximum size of the buffer. - - - Gets the maximum size of the buffer - - - - - - Gets the number of logging events in the buffer. - - The number of logging events in the buffer. - - - This number is guaranteed to be in the range 0 to - (inclusive). - - - - - - An always empty . - - - - A singleton implementation of the - interface that always represents an empty collection. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - As the collection is empty no values are copied into the array. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - The singleton instance of the empty collection. - - - - - Gets the singleton instance of the empty collection. - - The singleton instance of the empty collection. - - - Gets the singleton instance of the empty collection. - - - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - - For the this property is always true. - - - - - - Gets the number of elements contained in the . - - - The number of elements contained in the . - - - - As the collection is empty the is always 0. - - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - As the collection is empty and thread safe and synchronized this instance is also - the object. - - - - - - An always empty . - - - - A singleton implementation of the - interface that always represents an empty collection. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Copies the elements of the to an - , starting at a particular Array index. - - The one-dimensional - that is the destination of the elements copied from - . The Array must have zero-based - indexing. - The zero-based index in array at which - copying begins. - - - As the collection is empty no values are copied into the array. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - Adds an element with the provided key and value to the - . - - The to use as the key of the element to add. - The to use as the value of the element to add. - - - As the collection is empty no new values can be added. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - Removes all elements from the . - - - - As the collection is empty no values can be removed. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - Determines whether the contains an element - with the specified key. - - The key to locate in the . - false - - - As the collection is empty the method always returns false. - - - - - - Returns an enumerator that can iterate through a collection. - - - An that can be used to - iterate through the collection. - - - - As the collection is empty a is returned. - - - - - - Removes the element with the specified key from the . - - The key of the element to remove. - - - As the collection is empty no values can be removed. A - is thrown if this method is called. - - - This dictionary is always empty and cannot be modified. - - - - The singleton instance of the empty dictionary. - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets a value indicating if access to the is synchronized (thread-safe). - - - true if access to the is synchronized (thread-safe); otherwise, false. - - - - For the this property is always true. - - - - - - Gets the number of elements contained in the - - - The number of elements contained in the . - - - - As the collection is empty the is always 0. - - - - - - Gets an object that can be used to synchronize access to the . - - - An object that can be used to synchronize access to the . - - - - As the collection is empty and thread safe and synchronized this instance is also - the object. - - - - - - Gets a value indicating whether the has a fixed size. - - true - - - As the collection is empty always returns true. - - - - - - Gets a value indicating whether the is read-only. - - true - - - As the collection is empty always returns true. - - - - - - Gets an containing the keys of the . - - An containing the keys of the . - - - As the collection is empty a is returned. - - - - - - Gets an containing the values of the . - - An containing the values of the . - - - As the collection is empty a is returned. - - - - - - Gets or sets the element with the specified key. - - The key of the element to get or set. - null - - - As the collection is empty no values can be looked up or stored. - If the index getter is called then null is returned. - A is thrown if the setter is called. - - - This dictionary is always empty and cannot be modified. - - - - Contain the information obtained when parsing formatting modifiers - in conversion modifiers. - - - - Holds the formatting information extracted from the format string by - the . This is used by the - objects when rendering the output. - - - Nicko Cadell - Gert Driesen - - - - Defaut Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - - - Initializes a new instance of the class - with the specified parameters. - - - - - - Gets or sets the minimum value. - - - The minimum value. - - - - Gets or sets the minimum value. - - - - - - Gets or sets the maximum value. - - - The maximum value. - - - - Gets or sets the maximum value. - - - - - - Gets or sets a flag indicating whether left align is enabled - or not. - - - A flag indicating whether left align is enabled or not. - - - - Gets or sets a flag indicating whether left align is enabled or not. - - - - - - Implementation of Properties collection for the - - - - This class implements a properties collection that is thread safe and supports both - storing properties and capturing a read only copy of the current propertied. - - - This class is optimized to the scenario where the properties are read frequently - and are modified infrequently. - - - Nicko Cadell - - - - The read only copy of the properties. - - - - This variable is declared volatile to prevent the compiler and JIT from - reordering reads and writes of this thread performed on different threads. - - - - - - Lock object used to synchronize updates within this instance - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property from the global context - - the key for the entry to remove - - - Removing an entry from the global context properties is relatively expensive compared - with reading a value. - - - - - - Clear the global context properties - - - - - Get a readonly immutable copy of the properties - - the current global context properties - - - This implementation is fast because the GlobalContextProperties class - stores a readonly copy of the properties. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Reading the value for a key is faster than setting the value. - When the value is written a new read only copy of - the properties is created. - - - - - - Manages a mapping from levels to - - - - Manages an ordered mapping from instances - to subclasses. - - - Nicko Cadell - - - - Default constructor - - - - Initialise a new instance of . - - - - - - Add a to this mapping - - the entry to add - - - If a has previously been added - for the same then that entry will be - overwritten. - - - - - - Lookup the mapping for the specified level - - the level to lookup - the for the level or null if no mapping found - - - Lookup the value for the specified level. Finds the nearest - mapping value for the level that is equal to or less than the - specified. - - - If no mapping could be found then null is returned. - - - - - - Initialize options - - - - Caches the sorted list of in an array - - - - - - Implementation of Properties collection for the - - - - Class implements a collection of properties that is specific to each thread. - The class is not synchronized as each thread has its own . - - - This class stores its properties in a slot on the named - log4net.Util.LogicalThreadContextProperties. - - - The requires a link time - for the - . - If the calling code does not have this permission then this context will be disabled. - It will not store any property values set on it. - - - Nicko Cadell - - - - Flag used to disable this context if we don't have permission to access the CallContext. - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property - - the key for the entry to remove - - - Remove the value for the specified from the context. - - - - - - Clear all the context properties - - - - Clear all the context properties - - - - - - Get the PropertiesDictionary stored in the LocalDataStoreSlot for this thread. - - create the dictionary if it does not exist, otherwise return null if is does not exist - the properties for this thread - - - The collection returned is only to be used on the calling thread. If the - caller needs to share the collection between different threads then the - caller must clone the collection before doings so. - - - - - - Gets the call context get data. - - The peroperties dictionary stored in the call context - - The method has a - security link demand, therfore we must put the method call in a seperate method - that we can wrap in an exception handler. - - - - - Sets the call context data. - - The properties. - - The method has a - security link demand, therfore we must put the method call in a seperate method - that we can wrap in an exception handler. - - - - - The fully qualified type of the LogicalThreadContextProperties class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Get or set the property value for the specified. - - - - - - - - - - - - - Outputs log statements from within the log4net assembly. - - - - Log4net components cannot make log4net logging calls. However, it is - sometimes useful for the user to learn about what log4net is - doing. - - - All log4net internal debug calls go to the standard output stream - whereas internal error messages are sent to the standard error output - stream. - - - Nicko Cadell - Gert Driesen - - - - Formats Prefix, Source, and Message in the same format as the value - sent to Console.Out and Trace.Write. - - - - - - Initializes a new instance of the class. - - - - - - - - - Static constructor that initializes logging by reading - settings from the application configuration file. - - - - The log4net.Internal.Debug application setting - controls internal debugging. This setting should be set - to true to enable debugging. - - - The log4net.Internal.Quiet application setting - suppresses all internal logging including error messages. - This setting should be set to true to enable message - suppression. - - - - - - Raises the LogReceived event when an internal messages is received. - - - - - - - - - Writes log4net internal debug messages to the - standard output stream. - - - The message to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal debug messages to the - standard output stream. - - The Type that generated this message. - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net: ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The Type that generated this message. - The message to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Writes log4net internal warning messages to the - standard error stream. - - The Type that generated this message. - The message to log. - An exception to log. - - - All internal warning messages are prepended with - the string "log4net:WARN ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The Type that generated this message. - The message to log. - - - All internal error messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes log4net internal error messages to the - standard error stream. - - The Type that generated this message. - The message to log. - An exception to log. - - - All internal debug messages are prepended with - the string "log4net:ERROR ". - - - - - - Writes output to the standard output stream. - - The message to log. - - - Writes to both Console.Out and System.Diagnostics.Trace. - Note that the System.Diagnostics.Trace is not supported - on the Compact Framework. - - - If the AppDomain is not configured with a config file then - the call to System.Diagnostics.Trace may fail. This is only - an issue if you are programmatically creating your own AppDomains. - - - - - - Writes output to the standard error stream. - - The message to log. - - - Writes to both Console.Error and System.Diagnostics.Trace. - Note that the System.Diagnostics.Trace is not supported - on the Compact Framework. - - - If the AppDomain is not configured with a config file then - the call to System.Diagnostics.Trace may fail. This is only - an issue if you are programmatically creating your own AppDomains. - - - - - - Default debug level - - - - - In quietMode not even errors generate any output. - - - - - The event raised when an internal message has been received. - - - - - The Type that generated the internal message. - - - - - The DateTime stamp of when the internal message was received. - - - - - A string indicating the severity of the internal message. - - - "log4net: ", - "log4net:ERROR ", - "log4net:WARN " - - - - - The internal log message. - - - - - The Exception related to the message. - - - Optional. Will be null if no Exception was passed. - - - - - Gets or sets a value indicating whether log4net internal logging - is enabled or disabled. - - - true if log4net internal logging is enabled, otherwise - false. - - - - When set to true, internal debug level logging will be - displayed. - - - This value can be set by setting the application setting - log4net.Internal.Debug in the application configuration - file. - - - The default value is false, i.e. debugging is - disabled. - - - - - The following example enables internal debugging using the - application configuration file : - - - - - - - - - - - - - Gets or sets a value indicating whether log4net should generate no output - from internal logging, not even for errors. - - - true if log4net should generate no output at all from internal - logging, otherwise false. - - - - When set to true will cause internal logging at all levels to be - suppressed. This means that no warning or error reports will be logged. - This option overrides the setting and - disables all debug also. - - This value can be set by setting the application setting - log4net.Internal.Quiet in the application configuration file. - - - The default value is false, i.e. internal logging is not - disabled. - - - - The following example disables internal logging using the - application configuration file : - - - - - - - - - - - - - - - - - Test if LogLog.Debug is enabled for output. - - - true if Debug is enabled - - - - Test if LogLog.Debug is enabled for output. - - - - - - Test if LogLog.Warn is enabled for output. - - - true if Warn is enabled - - - - Test if LogLog.Warn is enabled for output. - - - - - - Test if LogLog.Error is enabled for output. - - - true if Error is enabled - - - - Test if LogLog.Error is enabled for output. - - - - - - Subscribes to the LogLog.LogReceived event and stores messages - to the supplied IList instance. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Represents a native error code and message. - - - - Represents a Win32 platform native error. - - - Nicko Cadell - Gert Driesen - - - - Create an instance of the class with the specified - error number and message. - - The number of the native error. - The message of the native error. - - - Create an instance of the class with the specified - error number and message. - - - - - - Create a new instance of the class for the last Windows error. - - - An instance of the class for the last windows error. - - - - The message for the error number is lookup up using the - native Win32 FormatMessage function. - - - - - - Create a new instance of the class. - - the error number for the native error - - An instance of the class for the specified - error number. - - - - The message for the specified error number is lookup up using the - native Win32 FormatMessage function. - - - - - - Retrieves the message corresponding with a Win32 message identifier. - - Message identifier for the requested message. - - The message corresponding with the specified message identifier. - - - - The message will be searched for in system message-table resource(s) - using the native FormatMessage function. - - - - - - Return error information string - - error information string - - - Return error information string - - - - - - Formats a message string. - - Formatting options, and how to interpret the parameter. - Location of the message definition. - Message identifier for the requested message. - Language identifier for the requested message. - If includes FORMAT_MESSAGE_ALLOCATE_BUFFER, the function allocates a buffer using the LocalAlloc function, and places the pointer to the buffer at the address specified in . - If the FORMAT_MESSAGE_ALLOCATE_BUFFER flag is not set, this parameter specifies the maximum number of TCHARs that can be stored in the output buffer. If FORMAT_MESSAGE_ALLOCATE_BUFFER is set, this parameter specifies the minimum number of TCHARs to allocate for an output buffer. - Pointer to an array of values that are used as insert values in the formatted message. - - - The function requires a message definition as input. The message definition can come from a - buffer passed into the function. It can come from a message table resource in an - already-loaded module. Or the caller can ask the function to search the system's message - table resource(s) for the message definition. The function finds the message definition - in a message table resource based on a message identifier and a language identifier. - The function copies the formatted message text to an output buffer, processing any embedded - insert sequences if requested. - - - To prevent the usage of unsafe code, this stub does not support inserting values in the formatted message. - - - - - If the function succeeds, the return value is the number of TCHARs stored in the output - buffer, excluding the terminating null character. - - - If the function fails, the return value is zero. To get extended error information, - call . - - - - - - Gets the number of the native error. - - - The number of the native error. - - - - Gets the number of the native error. - - - - - - Gets the message of the native error. - - - The message of the native error. - - - - - Gets the message of the native error. - - - - - An always empty . - - - - A singleton implementation of the over a collection - that is empty and not modifiable. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Test if the enumerator can advance, if so advance. - - false as the cannot advance. - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will always return false. - - - - - - Resets the enumerator back to the start. - - - - As the enumerator is over an empty collection does nothing. - - - - - - The singleton instance of the . - - - - - Gets the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current key from the enumerator. - - - Throws an exception because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current value from the enumerator. - - The current value from the enumerator. - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - Gets the current entry from the enumerator. - - - Throws an because the - never has a current entry. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - An always empty . - - - - A singleton implementation of the over a collection - that is empty and not modifiable. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to enforce the singleton pattern. - - - - - - Test if the enumerator can advance, if so advance - - false as the cannot advance. - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will always return false. - - - - - - Resets the enumerator back to the start. - - - - As the enumerator is over an empty collection does nothing. - - - - - - The singleton instance of the . - - - - - Get the singleton instance of the . - - The singleton instance of the . - - - Gets the singleton instance of the . - - - - - - Gets the current object from the enumerator. - - - Throws an because the - never has a current value. - - - - As the enumerator is over an empty collection its - value cannot be moved over a valid position, therefore - will throw an . - - - The collection is empty and - cannot be positioned over a valid location. - - - - A SecurityContext used when a SecurityContext is not required - - - - The is a no-op implementation of the - base class. It is used where a - is required but one has not been provided. - - - Nicko Cadell - - - - Singleton instance of - - - - Singleton instance of - - - - - - Private constructor - - - - Private constructor for singleton pattern. - - - - - - Impersonate this SecurityContext - - State supplied by the caller - null - - - No impersonation is done and null is always returned. - - - - - - Implements log4net's default error handling policy which consists - of emitting a message for the first error in an appender and - ignoring all subsequent errors. - - - - The error message is processed using the LogLog sub-system. - - - This policy aims at protecting an otherwise working application - from being flooded with error messages when logging fails. - - - Nicko Cadell - Gert Driesen - Ron Grabowski - - - - Default Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - The prefix to use for each message. - - - Initializes a new instance of the class - with the specified prefix. - - - - - - Reset the error handler back to its initial disabled state. - - - - - Log an Error - - The error message. - The exception. - The internal error code. - - - Sends the error information to 's Error method. - - - - - - Log an Error - - The error message. - The exception. - - - Prints the message and the stack trace of the exception on the standard - error output stream. - - - - - - Log an error - - The error message. - - - Print a the error message passed as parameter on the standard - error output stream. - - - - - - The date the error was recorded. - - - - - Flag to indicate if it is the first error - - - - - The message recorded during the first error. - - - - - The exception recorded during the first error. - - - - - The error code recorded during the first error. - - - - - String to prefix each message with - - - - - The fully qualified type of the OnlyOnceErrorHandler class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Is error logging enabled - - - - Is error logging enabled. Logging is only enabled for the - first error delivered to the . - - - - - - The date the first error that trigged this error handler occured. - - - - - The message from the first error that trigged this error handler. - - - - - The exception from the first error that trigged this error handler. - - - May be . - - - - - The error code from the first error that trigged this error handler. - - - Defaults to - - - - - A convenience class to convert property values to specific types. - - - - Utility functions for converting types and parsing values. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Converts a string to a value. - - String to convert. - The default value. - The value of . - - - If is "true", then true is returned. - If is "false", then false is returned. - Otherwise, is returned. - - - - - - Parses a file size into a number. - - String to parse. - The default value. - The value of . - - - Parses a file size of the form: number[KB|MB|GB] into a - long value. It is scaled with the appropriate multiplier. - - - is returned when - cannot be converted to a value. - - - - - - Converts a string to an object. - - The target type to convert to. - The string to convert to an object. - - The object converted from a string or null when the - conversion failed. - - - - Converts a string to an object. Uses the converter registry to try - to convert the string value into the specified target type. - - - - - - Checks if there is an appropriate type conversion from the source type to the target type. - - The type to convert from. - The type to convert to. - true if there is a conversion from the source type to the target type. - - Checks if there is an appropriate type conversion from the source type to the target type. - - - - - - - Converts an object to the target type. - - The object to convert to the target type. - The type to convert to. - The converted object. - - - Converts an object to the target type. - - - - - - Instantiates an object given a class name. - - The fully qualified class name of the object to instantiate. - The class to which the new object should belong. - The object to return in case of non-fulfillment. - - An instance of the or - if the object could not be instantiated. - - - - Checks that the is a subclass of - . If that test fails or the object could - not be instantiated, then is returned. - - - - - - Performs variable substitution in string from the - values of keys found in . - - The string on which variable substitution is performed. - The dictionary to use to lookup variables. - The result of the substitutions. - - - The variable substitution delimiters are ${ and }. - - - For example, if props contains key=value, then the call - - - - string s = OptionConverter.SubstituteVariables("Value of key is ${key}."); - - - - will set the variable s to "Value of key is value.". - - - If no value could be found for the specified key, then substitution - defaults to an empty string. - - - For example, if system properties contains no value for the key - "nonExistentKey", then the call - - - - string s = OptionConverter.SubstituteVariables("Value of nonExistentKey is [${nonExistentKey}]"); - - - - will set s to "Value of nonExistentKey is []". - - - An Exception is thrown if contains a start - delimiter "${" which is not balanced by a stop delimiter "}". - - - - - - Converts the string representation of the name or numeric value of one or - more enumerated constants to an equivalent enumerated object. - - The type to convert to. - The enum string value. - If true, ignore case; otherwise, regard case. - An object of type whose value is represented by . - - - - The fully qualified type of the OptionConverter class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Most of the work of the class - is delegated to the PatternParser class. - - - - The PatternParser processes a pattern string and - returns a chain of objects. - - - Nicko Cadell - Gert Driesen - - - - Constructor - - The pattern to parse. - - - Initializes a new instance of the class - with the specified pattern string. - - - - - - Parses the pattern into a chain of pattern converters. - - The head of a chain of pattern converters. - - - Parses the pattern into a chain of pattern converters. - - - - - - Build the unified cache of converters from the static and instance maps - - the list of all the converter names - - - Build the unified cache of converters from the static and instance maps - - - - - - Internal method to parse the specified pattern to find specified matches - - the pattern to parse - the converter names to match in the pattern - - - The matches param must be sorted such that longer strings come before shorter ones. - - - - - - Process a parsed literal - - the literal text - - - - Process a parsed converter pattern - - the name of the converter - the optional option for the converter - the formatting info for the converter - - - - Resets the internal state of the parser and adds the specified pattern converter - to the chain. - - The pattern converter to add. - - - - The first pattern converter in the chain - - - - - the last pattern converter in the chain - - - - - The pattern - - - - - Internal map of converter identifiers to converter types - - - - This map overrides the static s_globalRulesRegistry map. - - - - - - The fully qualified type of the PatternParser class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Get the converter registry used by this parser - - - The converter registry used by this parser - - - - Get the converter registry used by this parser - - - - - - Sort strings by length - - - - that orders strings by string length. - The longest strings are placed first - - - - - - This class implements a patterned string. - - - - This string has embedded patterns that are resolved and expanded - when the string is formatted. - - - This class functions similarly to the - in that it accepts a pattern and renders it to a string. Unlike the - however the PatternString - does not render the properties of a specific but - of the process in general. - - - The recognized conversion pattern names are: - - - - Conversion Pattern Name - Effect - - - appdomain - - - Used to output the friendly name of the current AppDomain. - - - - - date - - - Used to output the current date and time in the local time zone. - To output the date in universal time use the %utcdate pattern. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %date{HH:mm:ss,fff} or - %date{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %date{ISO8601} or %date{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - env - - - Used to output the a specific environment variable. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %env{COMPUTERNAME} would include the value - of the COMPUTERNAME environment variable. - - - The env pattern is not supported on the .NET Compact Framework. - - - - - identity - - - Used to output the user name for the currently active user - (Principal.Identity.Name). - - - - - newline - - - Outputs the platform dependent line separator character or - characters. - - - This conversion pattern name offers the same performance as using - non-portable line separator strings such as "\n", or "\r\n". - Thus, it is the preferred way of specifying a line separator. - - - - - processid - - - Used to output the system process ID for the current process. - - - - - property - - - Used to output a specific context property. The key to - lookup must be specified within braces and directly following the - pattern specifier, e.g. %property{user} would include the value - from the property that is keyed by the string 'user'. Each property value - that is to be included in the log must be specified separately. - Properties are stored in logging contexts. By default - the log4net:HostName property is set to the name of machine on - which the event was originally logged. - - - If no key is specified, e.g. %property then all the keys and their - values are printed in a comma separated list. - - - The properties of an event are combined from a number of different - contexts. These are listed below in the order in which they are searched. - - - - the thread properties - - The that are set on the current - thread. These properties are shared by all events logged on this thread. - - - - the global properties - - The that are set globally. These - properties are shared by all the threads in the AppDomain. - - - - - - - random - - - Used to output a random string of characters. The string is made up of - uppercase letters and numbers. By default the string is 4 characters long. - The length of the string can be specified within braces directly following the - pattern specifier, e.g. %random{8} would output an 8 character string. - - - - - username - - - Used to output the WindowsIdentity for the currently - active user. - - - - - utcdate - - - Used to output the date of the logging event in universal time. - The date conversion - specifier may be followed by a date format specifier enclosed - between braces. For example, %utcdate{HH:mm:ss,fff} or - %utcdate{dd MMM yyyy HH:mm:ss,fff}. If no date format specifier is - given then ISO8601 format is - assumed (). - - - The date format specifier admits the same syntax as the - time pattern string of the . - - - For better results it is recommended to use the log4net date - formatters. These can be specified using one of the strings - "ABSOLUTE", "DATE" and "ISO8601" for specifying - , - and respectively - . For example, - %utcdate{ISO8601} or %utcdate{ABSOLUTE}. - - - These dedicated date formatters perform significantly - better than . - - - - - % - - - The sequence %% outputs a single percent sign. - - - - - - Additional pattern converters may be registered with a specific - instance using or - . - - - See the for details on the - format modifiers supported by the patterns. - - - Nicko Cadell - - - - Internal map of converter identifiers to converter types. - - - - - the pattern - - - - - the head of the pattern converter chain - - - - - patterns defined on this PatternString only - - - - - Initialize the global registry - - - - - Default constructor - - - - Initialize a new instance of - - - - - - Constructs a PatternString - - The pattern to use with this PatternString - - - Initialize a new instance of with the pattern specified. - - - - - - Initialize object options - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - - - - Create the used to parse the pattern - - the pattern to parse - The - - - Returns PatternParser used to parse the conversion string. Subclasses - may override this to return a subclass of PatternParser which recognize - custom conversion pattern name. - - - - - - Produces a formatted string as specified by the conversion pattern. - - The TextWriter to write the formatted event to - - - Format the pattern to the . - - - - - - Format the pattern as a string - - the pattern formatted as a string - - - Format the pattern to a string. - - - - - - Add a converter to this PatternString - - the converter info - - - This version of the method is used by the configurator. - Programmatic users should use the alternative method. - - - - - - Add a converter to this PatternString - - the name of the conversion pattern for this converter - the type of the converter - - - Add a converter to this PatternString - - - - - - Gets or sets the pattern formatting string - - - The pattern formatting string - - - - The ConversionPattern option. This is the string which - controls formatting and consists of a mix of literal content and - conversion specifiers. - - - - - - String keyed object map. - - - - While this collection is serializable only member - objects that are serializable will - be serialized along with this collection. - - - Nicko Cadell - Gert Driesen - - - - String keyed object map that is read only. - - - - This collection is readonly and cannot be modified. - - - While this collection is serializable only member - objects that are serializable will - be serialized along with this collection. - - - Nicko Cadell - Gert Driesen - - - - The Hashtable used to store the properties data - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Copy Constructor - - properties to copy - - - Initializes a new instance of the class. - - - - - - Deserialization constructor - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Initializes a new instance of the class - with serialized data. - - - - - - Gets the key names. - - An array of all the keys. - - - Gets the key names. - - - - - - Test if the dictionary contains a specified key - - the key to look for - true if the dictionary contains the specified key - - - Test if the dictionary contains a specified key - - - - - - Serializes this object into the provided. - - The to populate with data. - The destination for this serialization. - - - Serializes this object into the provided. - - - - - - See - - - - - See - - - - - - See - - - - - - - Remove all properties from the properties collection - - - - - See - - - - - - - See - - - - - - - See - - - - - Gets or sets the value of the property with the specified key. - - - The value of the property with the specified key. - - The key of the property to get or set. - - - The property value will only be serialized if it is serializable. - If it cannot be serialized it will be silently ignored if - a serialization operation is performed. - - - - - - The hashtable used to store the properties - - - The internal collection used to store the properties - - - - The hashtable used to store the properties - - - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - The number of properties in this collection - - - - - See - - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Constructor - - properties to copy - - - Initializes a new instance of the class. - - - - - - Initializes a new instance of the class - with serialized data. - - The that holds the serialized object data. - The that contains contextual information about the source or destination. - - - Because this class is sealed the serialization constructor is private. - - - - - - Remove the entry with the specified key from this dictionary - - the key for the entry to remove - - - Remove the entry with the specified key from this dictionary - - - - - - See - - an enumerator - - - Returns a over the contest of this collection. - - - - - - See - - the key to remove - - - Remove the entry with the specified key from this dictionary - - - - - - See - - the key to lookup in the collection - true if the collection contains the specified key - - - Test if this collection contains a specified key. - - - - - - Remove all properties from the properties collection - - - - Remove all properties from the properties collection - - - - - - See - - the key - the value to store for the key - - - Store a value for the specified . - - - Thrown if the is not a string - - - - See - - - - - - - See - - - - - Gets or sets the value of the property with the specified key. - - - The value of the property with the specified key. - - The key of the property to get or set. - - - The property value will only be serialized if it is serializable. - If it cannot be serialized it will be silently ignored if - a serialization operation is performed. - - - - - - See - - - false - - - - This collection is modifiable. This property always - returns false. - - - - - - See - - - The value for the key specified. - - - - Get or set a value for the specified . - - - Thrown if the is not a string - - - - See - - - - - See - - - - - See - - - - - See - - - - - See - - - - - A class to hold the key and data for a property set in the config file - - - - A class to hold the key and data for a property set in the config file - - - - - - Override Object.ToString to return sensible debug info - - string info about this object - - - - Property Key - - - Property Key - - - - Property Key. - - - - - - Property Value - - - Property Value - - - - Property Value. - - - - - - A that ignores the message - - - - This writer is used in special cases where it is necessary - to protect a writer from being closed by a client. - - - Nicko Cadell - - - - Constructor - - the writer to actually write to - - - Create a new ProtectCloseTextWriter using a writer - - - - - - Attach this instance to a different underlying - - the writer to attach to - - - Attach this instance to a different underlying - - - - - - Does not close the underlying output writer. - - - - Does not close the underlying output writer. - This method does nothing. - - - - - - Defines a lock that supports single writers and multiple readers - - - - ReaderWriterLock is used to synchronize access to a resource. - At any given time, it allows either concurrent read access for - multiple threads, or write access for a single thread. In a - situation where a resource is changed infrequently, a - ReaderWriterLock provides better throughput than a simple - one-at-a-time lock, such as . - - - If a platform does not support a System.Threading.ReaderWriterLock - implementation then all readers and writers are serialized. Therefore - the caller must not rely on multiple simultaneous readers. - - - Nicko Cadell - - - - Constructor - - - - Initializes a new instance of the class. - - - - - - Acquires a reader lock - - - - blocks if a different thread has the writer - lock, or if at least one thread is waiting for the writer lock. - - - - - - Decrements the lock count - - - - decrements the lock count. When the count - reaches zero, the lock is released. - - - - - - Acquires the writer lock - - - - This method blocks if another thread has a reader lock or writer lock. - - - - - - Decrements the lock count on the writer lock - - - - ReleaseWriterLock decrements the writer lock count. - When the count reaches zero, the writer lock is released. - - - - - - A that can be and reused - - - - A that can be and reused. - This uses a single buffer for string operations. - - - Nicko Cadell - - - - Create an instance of - - the format provider to use - - - Create an instance of - - - - - - Override Dispose to prevent closing of writer - - flag - - - Override Dispose to prevent closing of writer - - - - - - Reset this string writer so that it can be reused. - - the maximum buffer capacity before it is trimmed - the default size to make the buffer - - - Reset this string writer so that it can be reused. - The internal buffers are cleared and reset. - - - - - - Utility class for system specific information. - - - - Utility class of static methods for system specific information. - - - Nicko Cadell - Gert Driesen - Alexey Solofnenko - - - - Private constructor to prevent instances. - - - - Only static methods are exposed from this type. - - - - - - Initialize default values for private static fields. - - - - Only static methods are exposed from this type. - - - - - - Gets the assembly location path for the specified assembly. - - The assembly to get the location for. - The location of the assembly. - - - This method does not guarantee to return the correct path - to the assembly. If only tries to give an indication as to - where the assembly was loaded from. - - - - - - Gets the fully qualified name of the , including - the name of the assembly from which the was - loaded. - - The to get the fully qualified name for. - The fully qualified name for the . - - - This is equivalent to the Type.AssemblyQualifiedName property, - but this method works on the .NET Compact Framework 1.0 as well as - the full .NET runtime. - - - - - - Gets the short name of the . - - The to get the name for. - The short name of the . - - - The short name of the assembly is the - without the version, culture, or public key. i.e. it is just the - assembly's file name without the extension. - - - Use this rather than Assembly.GetName().Name because that - is not available on the Compact Framework. - - - Because of a FileIOPermission security demand we cannot do - the obvious Assembly.GetName().Name. We are allowed to get - the of the assembly so we - start from there and strip out just the assembly name. - - - - - - Gets the file name portion of the , including the extension. - - The to get the file name for. - The file name of the assembly. - - - Gets the file name portion of the , including the extension. - - - - - - Loads the type specified in the type string. - - A sibling type to use to load the type. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified, it will be loaded from the assembly - containing the specified relative type. If the type is not found in the assembly - then all the loaded assemblies will be searched for the type. - - - - - - Loads the type specified in the type string. - - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the - assembly that is directly calling this method. If the type is not found - in the assembly then all the loaded assemblies will be searched for the type. - - - - - - Loads the type specified in the type string. - - An assembly to load the type from. - The name of the type to load. - Flag set to true to throw an exception if the type cannot be loaded. - true to ignore the case of the type name; otherwise, false - The type loaded or null if it could not be loaded. - - - If the type name is fully qualified, i.e. if contains an assembly name in - the type name, the type will be loaded from the system using - . - - - If the type name is not fully qualified it will be loaded from the specified - assembly. If the type is not found in the assembly then all the loaded assemblies - will be searched for the type. - - - - - - Generate a new guid - - A new Guid - - - Generate a new guid - - - - - - Create an - - The name of the parameter that caused the exception - The value of the argument that causes this exception - The message that describes the error - the ArgumentOutOfRangeException object - - - Create a new instance of the class - with a specified error message, the parameter name, and the value - of the argument. - - - The Compact Framework does not support the 3 parameter constructor for the - type. This method provides an - implementation that works for all platforms. - - - - - - Parse a string into an value - - the string to parse - out param where the parsed value is placed - true if the string was able to be parsed into an integer - - - Attempts to parse the string into an integer. If the string cannot - be parsed then this method returns false. The method does not throw an exception. - - - - - - Parse a string into an value - - the string to parse - out param where the parsed value is placed - true if the string was able to be parsed into an integer - - - Attempts to parse the string into an integer. If the string cannot - be parsed then this method returns false. The method does not throw an exception. - - - - - - Parse a string into an value - - the string to parse - out param where the parsed value is placed - true if the string was able to be parsed into an integer - - - Attempts to parse the string into an integer. If the string cannot - be parsed then this method returns false. The method does not throw an exception. - - - - - - Lookup an application setting - - the application settings key to lookup - the value for the key, or null - - - Configuration APIs are not supported under the Compact Framework - - - - - - Convert a path into a fully qualified local file path. - - The path to convert. - The fully qualified path. - - - Converts the path specified to a fully - qualified path. If the path is relative it is - taken as relative from the application base - directory. - - - The path specified must be a local file path, a URI is not supported. - - - - - - Creates a new case-insensitive instance of the class with the default initial capacity. - - A new case-insensitive instance of the class with the default initial capacity - - - The new Hashtable instance uses the default load factor, the CaseInsensitiveHashCodeProvider, and the CaseInsensitiveComparer. - - - - - - Gets an empty array of types. - - - - The Type.EmptyTypes field is not available on - the .NET Compact Framework 1.0. - - - - - - The fully qualified type of the SystemInfo class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Cache the host name for the current machine - - - - - Cache the application friendly name - - - - - Text to output when a null is encountered. - - - - - Text to output when an unsupported feature is requested. - - - - - Start time for the current process. - - - - - Gets the system dependent line terminator. - - - The system dependent line terminator. - - - - Gets the system dependent line terminator. - - - - - - Gets the base directory for this . - - The base directory path for the current . - - - Gets the base directory for this . - - - The value returned may be either a local file path or a URI. - - - - - - Gets the path to the configuration file for the current . - - The path to the configuration file for the current . - - - The .NET Compact Framework 1.0 does not have a concept of a configuration - file. For this runtime, we use the entry assembly location as the root for - the configuration file name. - - - The value returned may be either a local file path or a URI. - - - - - - Gets the path to the file that first executed in the current . - - The path to the entry assembly. - - - Gets the path to the file that first executed in the current . - - - - - - Gets the ID of the current thread. - - The ID of the current thread. - - - On the .NET framework, the AppDomain.GetCurrentThreadId method - is used to obtain the thread ID for the current thread. This is the - operating system ID for the thread. - - - On the .NET Compact Framework 1.0 it is not possible to get the - operating system thread ID for the current thread. The native method - GetCurrentThreadId is implemented inline in a header file - and cannot be called. - - - On the .NET Framework 2.0 the Thread.ManagedThreadId is used as this - gives a stable id unrelated to the operating system thread ID which may - change if the runtime is using fibers. - - - - - - Get the host name or machine name for the current machine - - - The hostname or machine name - - - - Get the host name or machine name for the current machine - - - The host name () or - the machine name (Environment.MachineName) for - the current machine, or if neither of these are available - then NOT AVAILABLE is returned. - - - - - - Get this application's friendly name - - - The friendly name of this application as a string - - - - If available the name of the application is retrieved from - the AppDomain using AppDomain.CurrentDomain.FriendlyName. - - - Otherwise the file name of the entry assembly is used. - - - - - - Get the start time for the current process. - - - - This is the time at which the log4net library was loaded into the - AppDomain. Due to reports of a hang in the call to System.Diagnostics.Process.StartTime - this is not the start time for the current process. - - - The log4net library should be loaded by an application early during its - startup, therefore this start time should be a good approximation for - the actual start time. - - - Note that AppDomains may be loaded and unloaded within the - same process without the process terminating, however this start time - will be set per AppDomain. - - - - - - Text to output when a null is encountered. - - - - Use this value to indicate a null has been encountered while - outputting a string representation of an item. - - - The default value is (null). This value can be overridden by specifying - a value for the log4net.NullText appSetting in the application's - .config file. - - - - - - Text to output when an unsupported feature is requested. - - - - Use this value when an unsupported feature is requested. - - - The default value is NOT AVAILABLE. This value can be overridden by specifying - a value for the log4net.NotAvailableText appSetting in the application's - .config file. - - - - - - Utility class that represents a format string. - - - - Utility class that represents a format string. - - - Nicko Cadell - - - - Initialise the - - An that supplies culture-specific formatting information. - A containing zero or more format items. - An array containing zero or more objects to format. - - - - Format the string and arguments - - the formatted string - - - - Replaces the format item in a specified with the text equivalent - of the value of a corresponding instance in a specified array. - A specified parameter supplies culture-specific formatting information. - - An that supplies culture-specific formatting information. - A containing zero or more format items. - An array containing zero or more objects to format. - - A copy of format in which the format items have been replaced by the - equivalent of the corresponding instances of in args. - - - - This method does not throw exceptions. If an exception thrown while formatting the result the - exception and arguments are returned in the result string. - - - - - - Process an error during StringFormat - - - - - Dump the contents of an array into a string builder - - - - - Dump an object to a string - - - - - The fully qualified type of the SystemStringFormat class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Implementation of Properties collection for the - - - - Class implements a collection of properties that is specific to each thread. - The class is not synchronized as each thread has its own . - - - Nicko Cadell - - - - The thread local data slot to use to store a PropertiesDictionary. - - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Remove a property - - the key for the entry to remove - - - Remove a property - - - - - - Clear all properties - - - - Clear all properties - - - - - - Get the PropertiesDictionary for this thread. - - create the dictionary if it does not exist, otherwise return null if is does not exist - the properties for this thread - - - The collection returned is only to be used on the calling thread. If the - caller needs to share the collection between different threads then the - caller must clone the collection before doing so. - - - - - - Gets or sets the value of a property - - - The value for the property with the specified key - - - - Gets or sets the value of a property - - - - - - Implementation of Stack for the - - - - Implementation of Stack for the - - - Nicko Cadell - - - - The stack store. - - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - Clears all the contextual information held in this stack. - - - - Clears all the contextual information held in this stack. - Only call this if you think that this tread is being reused after - a previous call execution which may not have completed correctly. - You do not need to use this method if you always guarantee to call - the method of the - returned from even in exceptional circumstances, - for example by using the using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) - syntax. - - - - - - Removes the top context from this stack. - - The message in the context that was removed from the top of this stack. - - - Remove the top context from this stack, and return - it to the caller. If this stack is empty then an - empty string (not ) is returned. - - - - - - Pushes a new context message into this stack. - - The new context message. - - An that can be used to clean up the context stack. - - - - Pushes a new context onto this stack. An - is returned that can be used to clean up this stack. This - can be easily combined with the using keyword to scope the - context. - - - Simple example of using the Push method with the using keyword. - - using(log4net.ThreadContext.Stacks["NDC"].Push("Stack_Message")) - { - log.Warn("This should have an ThreadContext Stack message"); - } - - - - - - Gets the current context information for this stack. - - The current context information. - - - - Gets the current context information for this stack. - - Gets the current context information - - - Gets the current context information for this stack. - - - - - - Get a portable version of this object - - the portable instance of this object - - - Get a cross thread portable version of this object - - - - - - The number of messages in the stack - - - The current number of messages in the stack - - - - The current number of messages in the stack. That is - the number of times has been called - minus the number of times has been called. - - - - - - Gets and sets the internal stack used by this - - The internal storage stack - - - This property is provided only to support backward compatability - of the . Tytpically the internal stack should not - be modified. - - - - - - Inner class used to represent a single context frame in the stack. - - - - Inner class used to represent a single context frame in the stack. - - - - - - Constructor - - The message for this context. - The parent context in the chain. - - - Initializes a new instance of the class - with the specified message and parent context. - - - - - - Get the message. - - The message. - - - Get the message. - - - - - - Gets the full text of the context down to the root level. - - - The full text of the context down to the root level. - - - - Gets the full text of the context down to the root level. - - - - - - Struct returned from the method. - - - - This struct implements the and is designed to be used - with the pattern to remove the stack frame at the end of the scope. - - - - - - The ThreadContextStack internal stack - - - - - The depth to trim the stack to when this instance is disposed - - - - - Constructor - - The internal stack used by the ThreadContextStack. - The depth to return the stack to when this object is disposed. - - - Initializes a new instance of the class with - the specified stack and return depth. - - - - - - Returns the stack to the correct depth. - - - - Returns the stack to the correct depth. - - - - - - Implementation of Stacks collection for the - - - - Implementation of Stacks collection for the - - - Nicko Cadell - - - - Internal constructor - - - - Initializes a new instance of the class. - - - - - - The fully qualified type of the ThreadContextStacks class. - - - Used by the internal logger to record the Type of the - log message. - - - - - Gets the named thread context stack - - - The named stack - - - - Gets the named thread context stack - - - - - - Utility class for transforming strings. - - - - Utility class for transforming strings. - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - Write a string to an - - the writer to write to - the string to write - The string to replace non XML compliant chars with - - - The test is escaped either using XML escape entities - or using CDATA sections. - - - - - - Replace invalid XML characters in text string - - the XML text input string - the string to use in place of invalid characters - A string that does not contain invalid XML characters. - - - Certain Unicode code points are not allowed in the XML InfoSet, for - details see: http://www.w3.org/TR/REC-xml/#charsets. - - - This method replaces any illegal characters in the input string - with the mask string specified. - - - - - - Count the number of times that the substring occurs in the text - - the text to search - the substring to find - the number of times the substring occurs in the text - - - The substring is assumed to be non repeating within itself. - - - - - - Characters illegal in XML 1.0 - - - - - Impersonate a Windows Account - - - - This impersonates a Windows account. - - - How the impersonation is done depends on the value of . - This allows the context to either impersonate a set of user credentials specified - using username, domain name and password or to revert to the process credentials. - - - - - - Default constructor - - - - Default constructor - - - - - - Initialize the SecurityContext based on the options set. - - - - This is part of the delayed object - activation scheme. The method must - be called on this object after the configuration properties have - been set. Until is called this - object is in an undefined state and must not be used. - - - If any of the configuration properties are modified then - must be called again. - - - The security context will try to Logon the specified user account and - capture a primary token for impersonation. - - - The required , - or properties were not specified. - - - - Impersonate the Windows account specified by the and properties. - - caller provided state - - An instance that will revoke the impersonation of this SecurityContext - - - - Depending on the property either - impersonate a user using credentials supplied or revert - to the process credentials. - - - - - - Create a given the userName, domainName and password. - - the user name - the domain name - the password - the for the account specified - - - Uses the Windows API call LogonUser to get a principal token for the account. This - token is used to initialize the WindowsIdentity. - - - - - - Gets or sets the impersonation mode for this security context - - - The impersonation mode for this security context - - - - Impersonate either a user with user credentials or - revert this thread to the credentials of the process. - The value is one of the - enum. - - - The default value is - - - When the mode is set to - the user's credentials are established using the - , and - values. - - - When the mode is set to - no other properties need to be set. If the calling thread is - impersonating then it will be reverted back to the process credentials. - - - - - - Gets or sets the Windows username for this security context - - - The Windows username for this security context - - - - This property must be set if - is set to (the default setting). - - - - - - Gets or sets the Windows domain name for this security context - - - The Windows domain name for this security context - - - - The default value for is the local machine name - taken from the property. - - - This property must be set if - is set to (the default setting). - - - - - - Sets the password for the Windows account specified by the and properties. - - - The password for the Windows account specified by the and properties. - - - - This property must be set if - is set to (the default setting). - - - - - - The impersonation modes for the - - - - See the property for - details. - - - - - - Impersonate a user using the credentials supplied - - - - - Revert this the thread to the credentials of the process - - - - - Adds to - - - - Helper class to expose the - through the interface. - - - - - - Constructor - - the impersonation context being wrapped - - - Constructor - - - - - - Revert the impersonation - - - - Revert the impersonation - - - - - - The log4net Global Context. - - - - The GlobalContext provides a location for global debugging - information to be stored. - - - The global context has a properties map and these properties can - be included in the output of log messages. The - supports selecting and outputing these properties. - - - By default the log4net:HostName property is set to the name of - the current machine. - - - - - GlobalContext.Properties["hostname"] = Environment.MachineName; - - - - Nicko Cadell - - - - Private Constructor. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - The global context properties instance - - - - - The global properties map. - - - The global properties map. - - - - The global properties map. - - - - - - Provides information about the environment the assembly has - been built for. - - - - Version of the assembly - - - Version of the framework targeted - - - Type of framework targeted - - - Does it target a client profile? - - - - Identifies the version and target for this assembly. - - - - - The log4net Logical Thread Context. - - - - The LogicalThreadContext provides a location for specific debugging - information to be stored. - The LogicalThreadContext properties override any or - properties with the same name. - - - The Logical Thread Context has a properties map and a stack. - The properties and stack can - be included in the output of log messages. The - supports selecting and outputting these properties. - - - The Logical Thread Context provides a diagnostic context for the current call context. - This is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The Logical Thread Context is managed on a per basis. - - - The requires a link time - for the - . - If the calling code does not have this permission then this context will be disabled. - It will not store any property values set on it. - - - Example of using the thread context properties to store a username. - - LogicalThreadContext.Properties["user"] = userName; - log.Info("This log message has a LogicalThreadContext Property called 'user'"); - - - Example of how to push a message into the context stack - - using(LogicalThreadContext.Stacks["LDC"].Push("my context message")) - { - log.Info("This log message has a LogicalThreadContext Stack message that includes 'my context message'"); - - } // at the end of the using block the message is automatically popped - - - - Nicko Cadell - - - - Private Constructor. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - The thread context properties instance - - - - - The thread context stacks instance - - - - - The thread properties map - - - The thread properties map - - - - The LogicalThreadContext properties override any - or properties with the same name. - - - - - - The thread stacks - - - stack map - - - - The logical thread stacks. - - - - - - This class is used by client applications to request logger instances. - - - - This class has static methods that are used by a client to request - a logger instance. The method is - used to retrieve a logger. - - - See the interface for more details. - - - Simple example of logging messages - - ILog log = LogManager.GetLogger("application-log"); - - log.Info("Application Start"); - log.Debug("This is a debug message"); - - if (log.IsDebugEnabled) - { - log.Debug("This is another debug message"); - } - - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - Returns the named logger if it exists. - - Returns the named logger if it exists. - - - - If the named logger exists (in the default repository) then it - returns a reference to the logger, otherwise it returns null. - - - The fully qualified logger name to look for. - The logger found, or null if no logger could be found. - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the specified repository) then it - returns a reference to the logger, otherwise it returns - null. - - - The repository to lookup in. - The fully qualified logger name to look for. - - The logger found, or null if the logger doesn't exist in the specified - repository. - - - - - Returns the named logger if it exists. - - - - If the named logger exists (in the repository for the specified assembly) then it - returns a reference to the logger, otherwise it returns - null. - - - The assembly to use to lookup the repository. - The fully qualified logger name to look for. - - The logger, or null if the logger doesn't exist in the specified - assembly's repository. - - - - Get the currently defined loggers. - - Returns all the currently defined loggers in the default repository. - - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified repository. - - The repository to lookup in. - - The root logger is not included in the returned array. - - All the defined loggers. - - - - Returns all the currently defined loggers in the specified assembly's repository. - - The assembly to use to lookup the repository. - - The root logger is not included in the returned array. - - All the defined loggers. - - - Get or create a logger. - - Retrieves or creates a named logger. - - - - Retrieves a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The repository to lookup in. - The name of the logger to retrieve. - The logger with the name specified. - - - - Retrieves or creates a named logger. - - - - Retrieve a logger named as the - parameter. If the named logger already exists, then the - existing instance will be returned. Otherwise, a new instance is - created. - - - By default, loggers do not have a set level but inherit - it from the hierarchy. This is one of the central features of - log4net. - - - The assembly to use to lookup the repository. - The name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Get the logger for the fully qualified name of the type specified. - - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The repository to lookup in. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shorthand for . - - - Gets the logger for the fully qualified name of the type specified. - - The assembly to use to lookup the repository. - The full name of will be used as the name of the logger to retrieve. - The logger with the name specified. - - - - Shuts down the log4net system. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in all the - default repositories. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - Shutdown a logger repository. - - Shuts down the default repository. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - default repository. - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - - - - Shuts down the repository for the repository specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The repository to shutdown. - - - - Shuts down the repository specified. - - - - Calling this method will safely close and remove all - appenders in all the loggers including root contained in the - repository. The repository is looked up using - the specified. - - - Some appenders need to be closed before the application exists. - Otherwise, pending logging events might be lost. - - - The shutdown method is careful to close nested - appenders before closing regular appenders. This is allows - configurations where a regular appender is attached to a logger - and again to a nested appender. - - - The assembly to use to lookup the repository. - - - Reset the configuration of a repository - - Resets all values contained in this repository instance to their defaults. - - - - Resets all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The repository to reset. - - - - Resets all values contained in this repository instance to their defaults. - - - - Reset all values contained in the repository instance to their - defaults. This removes all appenders from all loggers, sets - the level of all non-root loggers to null, - sets their additivity flag to true and sets the level - of the root logger to . Moreover, - message disabling is set to its default "off" value. - - - The assembly to use to lookup the repository to reset. - - - Get the logger repository. - - Returns the default instance. - - - - Gets the for the repository specified - by the callers assembly (). - - - The instance for the default repository. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The repository to lookup in. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The assembly to use to lookup the repository. - - - Get a logger repository. - - Returns the default instance. - - - - Gets the for the repository specified - by the callers assembly (). - - - The instance for the default repository. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The repository to lookup in. - - - - Returns the default instance. - - The default instance. - - - Gets the for the repository specified - by the argument. - - - The assembly to use to lookup the repository. - - - Create a domain - - Creates a repository with the specified repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to will return - the same repository instance. - - - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - Create a logger repository. - - Creates a repository with the specified repository type. - - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - The created will be associated with the repository - specified such that a call to will return - the same repository instance. - - - - - - Creates a repository with the specified name. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name. - - - - Creates the default type of which is a - object. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique amongst repositories. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - The specified repository already exists. - - - - Creates a repository with the specified name and repository type. - - - - The name must be unique. Repositories cannot be redefined. - An will be thrown if the repository already exists. - - - The name of the repository, this must be unique to the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - The specified repository already exists. - - - - Creates a repository for the specified assembly and repository type. - - - - CreateDomain is obsolete. Use CreateRepository instead of CreateDomain. - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - - Creates a repository for the specified assembly and repository type. - - - - The created will be associated with the repository - specified such that a call to with the - same assembly specified will return the same repository instance. - - - The assembly to use to get the name of the repository. - A that implements - and has a no arg constructor. An instance of this type will be created to act - as the for the repository specified. - The created for the repository. - - - - Gets the list of currently defined repositories. - - - - Get an array of all the objects that have been created. - - - An array of all the known objects. - - - - Looks up the wrapper object for the logger specified. - - The logger to get the wrapper for. - The wrapper for the logger specified. - - - - Looks up the wrapper objects for the loggers specified. - - The loggers to get the wrappers for. - The wrapper objects for the loggers specified. - - - - Create the objects used by - this manager. - - The logger to wrap. - The wrapper for the logger specified. - - - - The wrapper map to use to hold the objects. - - - - - Implementation of Mapped Diagnostic Contexts. - - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - The MDC class is similar to the class except that it is - based on a map instead of a stack. It provides mapped - diagnostic contexts. A Mapped Diagnostic Context, or - MDC in short, is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The MDC is managed on a per thread basis. - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Gets the context value identified by the parameter. - - The key to lookup in the MDC. - The string value held for the key, or a null reference if no corresponding value is found. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - If the parameter does not look up to a - previously defined context then null will be returned. - - - - - - Add an entry to the MDC - - The key to store the value under. - The value to store. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Puts a context value (the parameter) as identified - with the parameter into the current thread's - context map. - - - If a value is already defined for the - specified then the value will be replaced. If the - is specified as null then the key value mapping will be removed. - - - - - - Removes the key value mapping for the key specified. - - The key to remove. - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Remove the specified entry from this thread's MDC - - - - - - Clear all entries in the MDC - - - - - The MDC is deprecated and has been replaced by the . - The current MDC implementation forwards to the ThreadContext.Properties. - - - - Remove all the entries from this thread's MDC - - - - - - Implementation of Nested Diagnostic Contexts. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - A Nested Diagnostic Context, or NDC in short, is an instrument - to distinguish interleaved log output from different sources. Log - output is typically interleaved when a server handles multiple - clients near-simultaneously. - - - Interleaved log output can still be meaningful if each log entry - from different contexts had a distinctive stamp. This is where NDCs - come into play. - - - Note that NDCs are managed on a per thread basis. The NDC class - is made up of static methods that operate on the context of the - calling thread. - - - How to push a message into the context - - using(NDC.Push("my context message")) - { - ... all log calls will have 'my context message' included ... - - } // at the end of the using block the message is automatically removed - - - - Nicko Cadell - Gert Driesen - - - - Initializes a new instance of the class. - - - Uses a private access modifier to prevent instantiation of this class. - - - - - Clears all the contextual information held on the current thread. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Clears the stack of NDC data held on the current thread. - - - - - - Creates a clone of the stack of context information. - - A clone of the context info for this thread. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - The results of this method can be passed to the - method to allow child threads to inherit the context of their - parent thread. - - - - - - Inherits the contextual information from another thread. - - The context stack to inherit. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - This thread will use the context information from the stack - supplied. This can be used to initialize child threads with - the same contextual information as their parent threads. These - contexts will NOT be shared. Any further contexts that - are pushed onto the stack will not be visible to the other. - Call to obtain a stack to pass to - this method. - - - - - - Removes the top context from the stack. - - - The message in the context that was removed from the top - of the stack. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Remove the top context from the stack, and return - it to the caller. If the stack is empty then an - empty string (not null) is returned. - - - - - - Pushes a new context message. - - The new context message. - - An that can be used to clean up - the context stack. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Pushes a new context onto the context stack. An - is returned that can be used to clean up the context stack. This - can be easily combined with the using keyword to scope the - context. - - - Simple example of using the Push method with the using keyword. - - using(log4net.NDC.Push("NDC_Message")) - { - log.Warn("This should have an NDC message"); - } - - - - - - Removes the context information for this thread. It is - not required to call this method. - - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - This method is not implemented. - - - - - - Forces the stack depth to be at most . - - The maximum depth of the stack - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - Forces the stack depth to be at most . - This may truncate the head of the stack. This only affects the - stack in the current thread. Also it does not prevent it from - growing, it only sets the maximum depth at the time of the - call. This can be used to return to a known context depth. - - - - - - Gets the current context depth. - - The current context depth. - - - - The NDC is deprecated and has been replaced by the . - The current NDC implementation forwards to the ThreadContext.Stacks["NDC"]. - - - - The number of context values pushed onto the context stack. - - - Used to record the current depth of the context. This can then - be restored using the method. - - - - - - - The log4net Thread Context. - - - - The ThreadContext provides a location for thread specific debugging - information to be stored. - The ThreadContext properties override any - properties with the same name. - - - The thread context has a properties map and a stack. - The properties and stack can - be included in the output of log messages. The - supports selecting and outputting these properties. - - - The Thread Context provides a diagnostic context for the current thread. - This is an instrument for distinguishing interleaved log - output from different sources. Log output is typically interleaved - when a server handles multiple clients near-simultaneously. - - - The Thread Context is managed on a per thread basis. - - - Example of using the thread context properties to store a username. - - ThreadContext.Properties["user"] = userName; - log.Info("This log message has a ThreadContext Property called 'user'"); - - - Example of how to push a message into the context stack - - using(ThreadContext.Stacks["NDC"].Push("my context message")) - { - log.Info("This log message has a ThreadContext Stack message that includes 'my context message'"); - - } // at the end of the using block the message is automatically popped - - - - Nicko Cadell - - - - Private Constructor. - - - - Uses a private access modifier to prevent instantiation of this class. - - - - - - The thread context properties instance - - - - - The thread context stacks instance - - - - - The thread properties map - - - The thread properties map - - - - The ThreadContext properties override any - properties with the same name. - - - - - - The thread stacks - - - stack map - - - - The thread local stacks. - - - - - diff --git a/src/External-Bin/Net/4.0/log4net_README.txt b/src/External-Bin/Net/4.0/log4net_README.txt deleted file mode 100644 index 40a4b01..0000000 --- a/src/External-Bin/Net/4.0/log4net_README.txt +++ /dev/null @@ -1,16 +0,0 @@ -Project Status -============== - -Apache log4net is a sub project of the Apache Logging Services project. -Apache log4net graduated from the Apache Incubator in February 2007. -Web site: http://logging.apache.org/log4net - - -Documentation -============= - -For local documentation, which is correct for this release see: -doc/index.html - -For the latest documentation see the log4net web site at: -http://logging.apache.org/log4net diff --git a/src/External-Bin/Net/4.0/log4net_license.txt b/src/External-Bin/Net/4.0/log4net_license.txt deleted file mode 100644 index 261eeb9..0000000 --- a/src/External-Bin/Net/4.0/log4net_license.txt +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/External-Bin/nunit/2.4.8/nunit.framework.dll b/src/External-Bin/nunit/2.4.8/nunit.framework.dll deleted file mode 100644 index 2a0a0aa3266b37dbaaa6c418500da203a2fa67eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77824 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 diff --git a/src/External-Bin/nunit/2.5.5.10112/nunit.framework.dll b/src/External-Bin/nunit/2.5.5.10112/nunit.framework.dll deleted file mode 100644 index 07e4c6eaeebe158584411616b9c82baecab9616e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 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 FzX1!`>QMjy diff --git a/src/HtmlHelpOverview.html b/src/HtmlHelpOverview.html deleted file mode 100644 index a8f0dcb..0000000 --- a/src/HtmlHelpOverview.html +++ /dev/null @@ -1,29 +0,0 @@ - - - iBATIS.NET - - - -

    -

    Apache iBATIS.NET
    -

    - The iBATIS Data Mapper framework makes it easier to use a database with Java and .NET applications. iBATIS couples objects with stored procedures or SQL statements using a XML descriptor.

    - - Simplicity is the biggest advantage of the iBATIS Data Mapper over object relational mapping tools. To use iBATIS Data Mapper you rely on your own objects, XML, and SQL. There is little to learn that you don't already know. -

    - With iBATIS Data Mapper you have the full power of both SQL and stored procedures at your fingertips. - - - diff --git a/src/IBatisNet.2003.sln b/src/IBatisNet.2003.sln deleted file mode 100644 index 2f23c47..0000000 --- a/src/IBatisNet.2003.sln +++ /dev/null @@ -1,98 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 8.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common", "IBatisNet.Common\IBatisNet.Common.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess", "IBatisNet.DataAccess\IBatisNet.DataAccess.csproj", "{BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper", "IBatisNet.DataMapper\IBatisNet.DataMapper.csproj", "{72F70057-B2E1-4DAD-BA6C-E2962745EEA5}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Test", "IBatisNet.Common.Test\IBatisNet.Common.Test.csproj", "{5961F3DE-CB5E-40FE-AE89-D00D6E453907}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess.Test", "IBatisNet.DataAccess.Test\IBatisNet.DataAccess.Test.csproj", "{888FE332-F7B7-4248-AEE1-73E14EB9C042}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.Test", "IBatisNet.DataMapper.Test\IBatisNet.DataMapper.Test.csproj", "{998B79D9-800F-493F-A263-306F06906E2F}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" - ProjectSection(ProjectDependencies) = postProject - EndProjectSection -EndProject -Global - GlobalSection(SolutionConfiguration) = preSolution - Debug = Debug - Debug Test = Debug Test - Release = Release - EndGlobalSection - GlobalSection(ProjectConfiguration) = postSolution - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.ActiveCfg = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug.Build.0 = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug Test.ActiveCfg = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug Test.Build.0 = Debug|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.ActiveCfg = Release|.NET - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release.Build.0 = Release|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.ActiveCfg = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug.Build.0 = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug Test.ActiveCfg = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug Test.Build.0 = Debug|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.ActiveCfg = Release|.NET - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release.Build.0 = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.ActiveCfg = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug.Build.0 = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug Test.ActiveCfg = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Debug Test.Build.0 = Debug|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.ActiveCfg = Release|.NET - {72F70057-B2E1-4DAD-BA6C-E2962745EEA5}.Release.Build.0 = Release|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug.ActiveCfg = Debug|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug.Build.0 = Debug|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug Test.ActiveCfg = Debug|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug Test.Build.0 = Debug|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release.ActiveCfg = Release|.NET - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release.Build.0 = Release|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug.ActiveCfg = Debug|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug.Build.0 = Debug|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug Test.ActiveCfg = Debug|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug Test.Build.0 = Debug|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release.ActiveCfg = Release|.NET - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release.Build.0 = Release|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Debug.ActiveCfg = Debug|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Debug.Build.0 = Debug|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Debug Test.ActiveCfg = Debug|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Debug Test.Build.0 = Debug|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Release.ActiveCfg = Release|.NET - {998B79D9-800F-493F-A263-306F06906E2F}.Release.Build.0 = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.ActiveCfg = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug.Build.0 = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug Test.ActiveCfg = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug Test.Build.0 = Debug|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.ActiveCfg = Release|.NET - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release.Build.0 = Release|.NET - EndGlobalSection - GlobalSection(SolutionItems) = postSolution - External-Bin\Net\1.1\Castle.DynamicProxy.dll = External-Bin\Net\1.1\Castle.DynamicProxy.dll - External-Bin\Net\1.1\Castle.DynamicProxy.license.txt = External-Bin\Net\1.1\Castle.DynamicProxy.license.txt - IBatisNet.Schemas\DaoConfig.xsd = IBatisNet.Schemas\DaoConfig.xsd - iBATIS.build = iBATIS.build - External-Bin\Net\1.1\log4net.dll = External-Bin\Net\1.1\log4net.dll - External-Bin\Net\1.1\log4net.license.txt = External-Bin\Net\1.1\log4net.license.txt - External-Bin\Net\1.1\log4net.xml = External-Bin\Net\1.1\log4net.xml - External-Bin\Net\1.1\nunit.framework.dll = External-Bin\Net\1.1\nunit.framework.dll - External-Bin\Net\1.1\readme.txt = External-Bin\Net\1.1\readme.txt - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - EndGlobalSection - GlobalSection(ExtensibilityAddIns) = postSolution - EndGlobalSection - GlobalSection(DPCodeReviewSolutionGUID) = preSolution - DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} - EndGlobalSection -EndGlobal diff --git a/src/IBatisNet.2005.sln b/src/IBatisNet.2005.sln deleted file mode 100644 index 1303f52..0000000 --- a/src/IBatisNet.2005.sln +++ /dev/null @@ -1,85 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 9.00 -# Visual Studio 2005 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.2005", "IBatisNet.Common\IBatisNet.Common.2005.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess.2005", "IBatisNet.DataAccess\IBatisNet.DataAccess.2005.csproj", "{BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Test.2005", "IBatisNet.Common.Test\IBatisNet.Common.Test.2005.csproj", "{5961F3DE-CB5E-40FE-AE89-D00D6E453907}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess.Test.2005", "IBatisNet.DataAccess.Test\IBatisNet.DataAccess.Test.2005.csproj", "{888FE332-F7B7-4248-AEE1-73E14EB9C042}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.Test.2005", "IBatisNet.DataMapper.Test\IBatisNet.DataMapper.Test.2005.csproj", "{998B79D9-800F-493F-A263-306F06906E2F}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{85F7A9B1-C024-4438-9BFA-388C89876F9C}" - ProjectSection(SolutionItems) = preProject - External-Bin\Net\1.1\Castle.DynamicProxy.dll = External-Bin\Net\1.1\Castle.DynamicProxy.dll - External-Bin\Net\1.1\Castle.DynamicProxy.license.txt = External-Bin\Net\1.1\Castle.DynamicProxy.license.txt - iBATIS.build = iBATIS.build - External-Bin\Net\1.1\log4net.dll = External-Bin\Net\1.1\log4net.dll - External-Bin\Net\1.1\log4net.license.txt = External-Bin\Net\1.1\log4net.license.txt - External-Bin\Net\1.1\log4net.xml = External-Bin\Net\1.1\log4net.xml - providers.config = providers.config - External-Bin\Net\1.1\readme.txt = External-Bin\Net\1.1\readme.txt - EndProjectSection -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net.2005", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.2005.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.20005", "IBatisNet.DataMapper\IBatisNet.DataMapper.20005.csproj", "{F3E45F39-3224-4EAD-B138-EB5CC0E32824}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug Test|Any CPU = Debug Test|Any CPU - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug Test|Any CPU.ActiveCfg = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug Test|Any CPU.Build.0 = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.Build.0 = Release|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug Test|Any CPU.ActiveCfg = Debug|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug Test|Any CPU.Build.0 = Debug|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release|Any CPU.Build.0 = Release|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug Test|Any CPU.ActiveCfg = Debug|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug Test|Any CPU.Build.0 = Debug|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release|Any CPU.Build.0 = Release|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug Test|Any CPU.ActiveCfg = Debug|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug Test|Any CPU.Build.0 = Debug|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug|Any CPU.Build.0 = Debug|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release|Any CPU.ActiveCfg = Release|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release|Any CPU.Build.0 = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug Test|Any CPU.ActiveCfg = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug Test|Any CPU.Build.0 = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.Build.0 = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug Test|Any CPU.ActiveCfg = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug Test|Any CPU.Build.0 = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.Build.0 = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug Test|Any CPU.ActiveCfg = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug Test|Any CPU.Build.0 = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(DPCodeReviewSolutionGUID) = preSolution - DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} - EndGlobalSection -EndGlobal diff --git a/src/IBatisNet.2010.sln b/src/IBatisNet.2010.sln deleted file mode 100644 index 6606036..0000000 --- a/src/IBatisNet.2010.sln +++ /dev/null @@ -1,58 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 11.00 -# Visual Studio 2010 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.2010", "IBatisNet.Common\IBatisNet.Common.2010.csproj", "{BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Logging.Log4Net.2010", "IBatisNet.Common.Logging.Log4Net\IBatisNet.Common.Logging.Log4Net.2010.csproj", "{023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.2010", "IBatisNet.DataMapper\IBatisNet.DataMapper.2010.csproj", "{F3E45F39-3224-4EAD-B138-EB5CC0E32824}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess.2010", "IBatisNet.DataAccess\IBatisNet.DataAccess.2010.csproj", "{BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataAccess.Test.2010", "IBatisNet.DataAccess.Test\IBatisNet.DataAccess.Test.2010.csproj", "{888FE332-F7B7-4248-AEE1-73E14EB9C042}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.Common.Test.2010", "IBatisNet.Common.Test\IBatisNet.Common.Test.2010.csproj", "{5961F3DE-CB5E-40FE-AE89-D00D6E453907}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IBatisNet.DataMapper.Test.2010", "IBatisNet.DataMapper.Test\IBatisNet.DataMapper.Test.2010.csproj", "{998B79D9-800F-493F-A263-306F06906E2F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}.Release|Any CPU.Build.0 = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}.Release|Any CPU.Build.0 = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F3E45F39-3224-4EAD-B138-EB5CC0E32824}.Release|Any CPU.Build.0 = Release|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}.Release|Any CPU.Build.0 = Release|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Debug|Any CPU.Build.0 = Debug|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release|Any CPU.ActiveCfg = Release|Any CPU - {888FE332-F7B7-4248-AEE1-73E14EB9C042}.Release|Any CPU.Build.0 = Release|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Debug|Any CPU.Build.0 = Debug|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release|Any CPU.ActiveCfg = Release|Any CPU - {5961F3DE-CB5E-40FE-AE89-D00D6E453907}.Release|Any CPU.Build.0 = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {998B79D9-800F-493F-A263-306F06906E2F}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(DPCodeReviewSolutionGUID) = preSolution - DPCodeReviewSolutionGUID = {00000000-0000-0000-0000-000000000000} - EndGlobalSection -EndGlobal diff --git a/src/IBatisNet.Common.Logging.Log4Net/AssemblyInfo.cs b/src/IBatisNet.Common.Logging.Log4Net/AssemblyInfo.cs deleted file mode 100644 index f6a614e..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/AssemblyInfo.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Reflection; -using System.Security; - -[assembly: AssemblyTitle("IBatisNet.Common.Logging.Log4Net")] -[assembly: AssemblyDescription("Log4Net adapter.")] -//[assembly: AllowPartiallyTrustedCallers] - -[assembly: AssemblyVersion("1.0.0")] - diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2005.csproj b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2005.csproj deleted file mode 100644 index 357f677..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2005.csproj +++ /dev/null @@ -1,118 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B} - Debug - AnyCPU - - - - - IBatisNet.Common.Logging.Log4Net - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Logging.Log4Net - OnBuildSuccess - - - - - - - 2.0 - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - log4net - ..\External-Bin\Net\1.1\log4net.dll - - - System - - - - System.Data - - - System.XML - - - IBatisNet.Common.2005 - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - - - - - CommonAssemblyInfo.cs - Code - - - Code - - - Code - - - Code - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2010.csproj b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2010.csproj deleted file mode 100644 index 3a8a875..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.2010.csproj +++ /dev/null @@ -1,168 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B} - Debug - AnyCPU - - - - - IBatisNet.Common.Logging.Log4Net - AssemblyKey.snk - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Logging.Log4Net - OnBuildSuccess - - - - - - - 3.5 - v4.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - false - - - - ..\External-Bin\Net\4.0\log4net.dll - - - System - - - - System.Data - - - System.XML - - - - - CommonAssemblyInfo.cs - Code - - - Code - - - Code - - - Code - - - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.2010 - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net35.2010.csproj b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net35.2010.csproj deleted file mode 100644 index 7779dd2..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net35.2010.csproj +++ /dev/null @@ -1,161 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B} - Debug - AnyCPU - - - - - IBatisNet.Common.Logging.Log4Net - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Logging.Log4Net - OnBuildSuccess - - - - - - - 3.5 - v3.5 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - - log4net - ..\External-Bin\Net\1.1\log4net.dll - - - System - - - - System.Data - - - System.XML - - - - - CommonAssemblyInfo.cs - Code - - - Code - - - Code - - - Code - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.Net35.2010 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net40.build b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net40.build deleted file mode 100644 index 2a67527..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net40.build +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net45.2012.csproj b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net45.2012.csproj deleted file mode 100644 index 1a3e3fb..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.Net45.2012.csproj +++ /dev/null @@ -1,163 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B} - Debug - AnyCPU - - - - - IBatisNet.Common.Logging.Log4Net - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Logging.Log4Net - OnBuildSuccess - - - - - - - 3.5 - v4.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - false - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - IBatisNet.Common.Logging.Log4Net.xml - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - false - - - - log4net - ..\External-Bin\Net\1.1\log4net.dll - - - System - - - - System.Data - - - System.XML - - - - - CommonAssemblyInfo.cs - Code - - - Code - - - Code - - - Code - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {bbc8da4a-ea88-41d9-8b93-929b8f3adade} - IBatisNet.Common.Net45.2012 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.build b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.build deleted file mode 100644 index 356a599..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.build +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.csproj b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.csproj deleted file mode 100644 index e71f19e..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net.csproj +++ /dev/null @@ -1,121 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net_net4.build b/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net_net4.build deleted file mode 100644 index 9316187..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/IBatisNet.Common.Logging.Log4Net_net4.build +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Logging.Log4Net/Log4NetLogger.cs b/src/IBatisNet.Common.Logging.Log4Net/Log4NetLogger.cs deleted file mode 100644 index f0057ee..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/Log4NetLogger.cs +++ /dev/null @@ -1,229 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 383115 $ - * $LastChangedDate: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - - -#region Using - -using System; -using IBatisNet.Common.Logging; -#endregion - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Log4net is capable of outputting extended debug information about where the current - /// message was generated: class name, method name, file, line, etc. Log4net assumes that the location - /// information should be gathered relative to where Debug() was called. In IBatisNet, - /// Debug() is called in IBatisNet.Common.Logging.Impl.Log4NetLogger. This means that - /// the location information will indicate that IBatisNet.Common.Logging.Impl.Log4NetLogger always made - /// the call to Debug(). We need to know where IBatisNet.Common.Logging.ILog.Debug() - /// was called. To do this we need to use the log4net.ILog.Logger.Log method and pass in a Type telling - /// log4net where in the stack to begin looking for location information. - /// - public class Log4NetLogger : ILog - { - #region Fields - - private log4net.Core.ILogger _logger = null; - private readonly static Type declaringType = typeof(Log4NetLogger); - - #endregion - - ///

    - /// Constructor - /// - /// - internal Log4NetLogger(log4net.ILog log ) - { - _logger = log.Logger; - } - - #region ILog Members - - /// - /// - /// - public bool IsInfoEnabled - { - get { return _logger.IsEnabledFor(log4net.Core.Level.Info); } - } - - /// - /// - /// - public bool IsWarnEnabled - { - get { return _logger.IsEnabledFor(log4net.Core.Level.Warn); } - } - - /// - /// - /// - public bool IsErrorEnabled - { - get { return _logger.IsEnabledFor(log4net.Core.Level.Error); } - } - - /// - /// - /// - public bool IsFatalEnabled - { - get { return _logger.IsEnabledFor(log4net.Core.Level.Fatal); } - } - - /// - /// - /// - public bool IsDebugEnabled - { - get { return _logger.IsEnabledFor(log4net.Core.Level.Debug); } - } - - /// - /// - /// - public bool IsTraceEnabled - { - get { return _logger.IsEnabledFor(log4net.Core.Level.Trace); } - } - - /// - /// - /// - /// - /// - public void Info(object message, Exception e) - { - _logger.Log(declaringType, log4net.Core.Level.Info, message, e); - } - - /// - /// - /// - /// - public void Info(object message) - { - _logger.Log(declaringType, log4net.Core.Level.Info, message, null); - } - - /// - /// - /// - /// - /// - public void Debug(object message, Exception e) - { - _logger.Log(declaringType, log4net.Core.Level.Debug, message, e); - } - - /// - /// - /// - /// - public void Debug(object message) - { - _logger.Log(declaringType, log4net.Core.Level.Debug, message, null); - } - - /// - /// - /// - /// - /// - public void Warn(object message, Exception e) - { - _logger.Log(declaringType, log4net.Core.Level.Warn, message, e); - } - - /// - /// - /// - /// - public void Warn(object message) - { - _logger.Log(declaringType, log4net.Core.Level.Warn, message, null); - } - - /// - /// - /// - /// - /// - public void Trace(object message, Exception e) - { - _logger.Log(declaringType, log4net.Core.Level.Trace, message, e); - } - - /// - /// - /// - /// - public void Trace(object message) - { - _logger.Log(declaringType, log4net.Core.Level.Trace, message, null); - } - - /// - /// - /// - /// - /// - public void Fatal(object message, Exception e) - { - _logger.Log(declaringType, log4net.Core.Level.Fatal, message, e); - } - - /// - /// - /// - /// - public void Fatal(object message) - { - _logger.Log(declaringType, log4net.Core.Level.Fatal, message, null); - } - - /// - /// - /// - /// - /// - public void Error(object message, Exception e) - { - _logger.Log(declaringType, log4net.Core.Level.Error, message, e); - } - - /// - /// - /// - /// - public void Error(object message) - { - _logger.Log(declaringType, log4net.Core.Level.Error, message, null); - } - - #endregion - } -} \ No newline at end of file diff --git a/src/IBatisNet.Common.Logging.Log4Net/Log4NetLoggerFA.cs b/src/IBatisNet.Common.Logging.Log4Net/Log4NetLoggerFA.cs deleted file mode 100644 index 39d2481..0000000 --- a/src/IBatisNet.Common.Logging.Log4Net/Log4NetLoggerFA.cs +++ /dev/null @@ -1,129 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 638571 $ - * $LastChangedDate: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections.Specialized; -using System.Configuration; -using System.IO; -using log4net.Config; - -using IBatisNet.Common.Logging; -#endregion - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Concrete subclass of ILoggerFactoryAdapter specific to log4net. - /// - public class Log4NetLoggerFA : ILoggerFactoryAdapter - { - /// - /// Constructor - /// - /// - public Log4NetLoggerFA(NameValueCollection properties) - { - string configType = string.Empty; - - if ( properties["configType"] != null ) - { - configType = properties["configType"].ToUpper(); - } - - string configFile = string.Empty; - if ( properties["configFile"] != null ) - { - configFile = properties["configFile"]; - } - - if ( configType == "FILE" || configType == "FILE-WATCH" ) - { - if (configFile == string.Empty) - { -#if dotnet2 - throw new ConfigurationErrorsException("Configration property 'configFile' must be set for log4Net configuration of type 'FILE'."); - #else - throw new ConfigurationException("Configration property 'configFile' must be set for log4Net configuration of type 'FILE'."); -#endif - } - - if (!File.Exists(configFile)) - { -#if dotnet2 - throw new ConfigurationErrorsException("log4net configuration file '" + configFile + "' does not exists"); -#else - throw new ConfigurationException("log4net configuration file '" + configFile + "' does not exists"); -#endif - } - } - - switch ( configType ) - { - case "INLINE": - XmlConfigurator.Configure(); - break; - case "FILE": - XmlConfigurator.Configure( new FileInfo( configFile ) ); - break; - case "FILE-WATCH": - XmlConfigurator.ConfigureAndWatch( new FileInfo( configFile ) ); - break; - case "EXTERNAL": - // Log4net will be configured outside of IBatisNet - break; - default: - BasicConfigurator.Configure(); - break; - } - } - - #region ILoggerFactoryAdapter Members - - /// - /// Get a ILog instance by type name - /// - /// - /// - public ILog GetLogger(string name) - { - return new Log4NetLogger( log4net.LogManager.GetLogger( name ) ); - } - - /// - /// Get a ILog instance by type - /// - /// - /// - public ILog GetLogger(Type type) - { - return new Log4NetLogger( log4net.LogManager.GetLogger( type ) ); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common.Test/AssemblyInfo.cs b/src/IBatisNet.Common.Test/AssemblyInfo.cs deleted file mode 100644 index 76201ae..0000000 --- a/src/IBatisNet.Common.Test/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// Les informations gnrales relatives un assembly dpendent de -// l'ensemble d'attributs suivant. Pour modifier les informations -// associes un assembly, changez les valeurs de ces attributs. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Les informations de version pour un assembly se composent des quatre valeurs suivantes: -// -// Version principale -// Version secondaire -// Numro de build -// Rvision -// -// Vous pouvez spcifier toutes les valeurs ou indiquer des numros de rvision et de build par dfaut -// en utilisant '*', comme ci-dessous : - -[assembly: AssemblyVersion("1.0.*")] - -// -// Pour signer votre assembly, vous devez spcifier la cl utiliser. Consultez -// la documentation Microsoft .NET Framework pour plus d'informations sur la signature d'un assembly. -// -// Utilisez les attributs ci-dessous pour contrler la cl utilise lors de la signature. -// -// Remarques: -// (*) Si aucune cl n'est spcifie, l'assembly n'est pas sign. -// (*) KeyName fait rfrence une cl installe dans le fournisseur de -// services cryptographiques (CSP) de votre ordinateur. KeyFile fait rfrence un fichier qui contient -// une cl. -// (*) Si les valeurs de KeyFile et de KeyName sont spcifies, le -// traitement suivant se produit: -// (1) Si KeyName se trouve dans le CSP, la cl est utilise. -// (2) Si KeyName n'existe pas mais que KeyFile existe, la cl -// de KeyFile est installe dans le CSP et utilise. -// (*) Pour crer KeyFile, vous pouvez utiliser l'utilitaire sn.exe (Strong Name, Nom fort). -// Lors de la spcification de KeyFile, son emplacement doit tre -// relatif au rpertoire de sortie du projet qui est -// %Project Directory%\obj\. Par exemple, si votre KeyFile se trouve -// dans le rpertoire du projet, vous devez spcifier l'attribut -// AssemblyKeyFile sous la forme [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) DelaySign (signature diffre) est une option avance. Pour plus d'informations, consultez la -// documentation Microsoft .NET Framework. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/src/IBatisNet.Common.Test/DataBase-Template.config b/src/IBatisNet.Common.Test/DataBase-Template.config deleted file mode 100644 index bb7301d..0000000 --- a/src/IBatisNet.Common.Test/DataBase-Template.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/DataBase.config b/src/IBatisNet.Common.Test/DataBase.config deleted file mode 100644 index 9a4f8f9..0000000 --- a/src/IBatisNet.Common.Test/DataBase.config +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Domain/Account.cs b/src/IBatisNet.Common.Test/Domain/Account.cs deleted file mode 100644 index 8e281d2..0000000 --- a/src/IBatisNet.Common.Test/Domain/Account.cs +++ /dev/null @@ -1,110 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.Domain -{ - /// - /// Account. - /// - [Serializable] - public class Account - { - private int _id = 0; - private string _firstName = string.Empty; - private string _lastName = string.Empty; - private string _emailAddress = string.Empty; - private int[] _ids = null; - private string _test = string.Empty; - private Days _days ; - private Property _prop = null ; - private DateTime _date = DateTime.MinValue; - - public Account() - {} - - public Account(int[] ids) - { - _ids = ids; - } - - public Account(DateTime date) - { - _date = date; - } - - public Account(int id) - { - _id = id; - } - - public Account(string test) - { - _test = test; - } - - public Account(Days days) - { - _days = days; - } - - public Account(Property prop) - { - _prop = prop; - } - - public Account(string firstName, Property prop) - { - _firstName = firstName; - _prop = prop; - } - - public Property Property - { - get { return _prop; } - } - - public DateTime Date - { - get { return _date; } - } - - public Days Days - { - get { return _days; } - } - - public string Test - { - get { return _test; } - } - - public int Id - { - get { return _id; } - set { _id = value; } - } - - public string FirstName - { - get { return _firstName; } - set { _firstName = value; } - } - - public string LastName - { - get { return _lastName; } - set { _lastName = value; } - } - - public string EmailAddress - { - get { return _emailAddress; } - set { _emailAddress = value; } - } - - public int[] Ids - { - get { return _ids; } - set { _ids = value; } - } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/Address.cs b/src/IBatisNet.Common.Test/Domain/Address.cs deleted file mode 100644 index 16775c3..0000000 --- a/src/IBatisNet.Common.Test/Domain/Address.cs +++ /dev/null @@ -1,18 +0,0 @@ - -using System; - -namespace IBatisNet.Common.Test.Domain -{ -public class Address : BaseDomain, IAddress -{ - private string streetname; - public string Streetname - { - get { return streetname; } - set { streetname = value; } - } -} - - -} - diff --git a/src/IBatisNet.Common.Test/Domain/BaseDomain.cs b/src/IBatisNet.Common.Test/Domain/BaseDomain.cs deleted file mode 100644 index f37a34e..0000000 --- a/src/IBatisNet.Common.Test/Domain/BaseDomain.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.Domain -{ - public class BaseDomain : IBaseDomain - { - private Guid _id; - public Guid Id - { - get { return _id; } - set { _id = value; } - } - - } - -} diff --git a/src/IBatisNet.Common.Test/Domain/Book.cs b/src/IBatisNet.Common.Test/Domain/Book.cs deleted file mode 100644 index b6bef4c..0000000 --- a/src/IBatisNet.Common.Test/Domain/Book.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace IBatisNet.Common.Test.Domain -{ - /// - /// Summary description for Book. - /// - public class Book : Document - { - public Book() - { - } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/Document.cs b/src/IBatisNet.Common.Test/Domain/Document.cs deleted file mode 100644 index 85b5d0a..0000000 --- a/src/IBatisNet.Common.Test/Domain/Document.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.Domain -{ - /// - /// Summary description for Document. - /// - public abstract class Document - { - private DateTime _date = DateTime.MinValue; - private int _nb = int.MinValue; - - public DateTime Creation - { - get { return _date;} - set { _date = value;} - } - - public int PageNumber - { - get { return _nb;} - } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/DocumentCollection.cs b/src/IBatisNet.Common.Test/Domain/DocumentCollection.cs deleted file mode 100644 index 3c384d3..0000000 --- a/src/IBatisNet.Common.Test/Domain/DocumentCollection.cs +++ /dev/null @@ -1,61 +0,0 @@ - -using System.Collections; - -namespace IBatisNet.Common.Test.Domain -{ - public class DocumentCollection : CollectionBase - { - - public Document this[int index] - { - get { return (Document)List[index]; } - set { List[index] = value; } - } - - public int Add(Document value) - { - return List.Add(value); - } - - public void AddRange(Document[] value) - { - for (int i = 0; i < value.Length; i++) - { - Add(value[i]); - } - } - - public void AddRange(DocumentCollection value) - { - for (int i = 0; i < value.Count; i++) - { - Add(value[i]); - } - } - - public bool Contains(Document value) - { - return List.Contains(value); - } - - public void CopyTo(Document[] array, int index) - { - List.CopyTo(array, index); - } - - public int IndexOf(Document value) - { - return List.IndexOf(value); - } - - public void Insert(int index, Document value) - { - List.Insert(index, value); - } - - public void Remove(Document value) - { - List.Remove(value); - } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/GenericDocumentCollection.cs b/src/IBatisNet.Common.Test/Domain/GenericDocumentCollection.cs deleted file mode 100644 index fc03a76..0000000 --- a/src/IBatisNet.Common.Test/Domain/GenericDocumentCollection.cs +++ /dev/null @@ -1,10 +0,0 @@ -#if dotnet2 -using System.Collections.Generic; - -namespace IBatisNet.Common.Test.Domain -{ - public class GenericDocumentCollection : List - { - } -} -#endif diff --git a/src/IBatisNet.Common.Test/Domain/IAddress.cs b/src/IBatisNet.Common.Test/Domain/IAddress.cs deleted file mode 100644 index e854d8c..0000000 --- a/src/IBatisNet.Common.Test/Domain/IAddress.cs +++ /dev/null @@ -1,9 +0,0 @@ - - -namespace IBatisNet.Common.Test.Domain -{ - public interface IAddress : IBaseDomain - { - string Streetname { get; set; } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/IBaseDomain.cs b/src/IBatisNet.Common.Test/Domain/IBaseDomain.cs deleted file mode 100644 index b7b35a7..0000000 --- a/src/IBatisNet.Common.Test/Domain/IBaseDomain.cs +++ /dev/null @@ -1,11 +0,0 @@ - -using System; - -namespace IBatisNet.Common.Test.Domain -{ - public interface IBaseDomain - { - Guid Id { get; set; } - } - -} diff --git a/src/IBatisNet.Common.Test/Domain/IUser.cs b/src/IBatisNet.Common.Test/Domain/IUser.cs deleted file mode 100644 index 3f8e5a9..0000000 --- a/src/IBatisNet.Common.Test/Domain/IUser.cs +++ /dev/null @@ -1,9 +0,0 @@ - - -namespace IBatisNet.Common.Test.Domain -{ - public interface IUser : IBaseDomain - { - IAddress Address { get; set; } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/Item.cs b/src/IBatisNet.Common.Test/Domain/Item.cs deleted file mode 100644 index 07a86f1..0000000 --- a/src/IBatisNet.Common.Test/Domain/Item.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.Domain -{ - /// - /// Summary description for Item. - /// - public class Item - { - protected Item() - { - } - } - - public class ItemBis - { - public ItemBis(string description) - { - } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/Order.cs b/src/IBatisNet.Common.Test/Domain/Order.cs deleted file mode 100644 index e3a29f5..0000000 --- a/src/IBatisNet.Common.Test/Domain/Order.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.Domain -{ - /// - /// Summary description for Order. - /// - public class Order - { - private Order() - { - } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/Property.cs b/src/IBatisNet.Common.Test/Domain/Property.cs deleted file mode 100644 index 2f1a675..0000000 --- a/src/IBatisNet.Common.Test/Domain/Property.cs +++ /dev/null @@ -1,281 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.Domain -{ - public enum Days : int - { - Sat = 1, - Sun = 2, - Mon = 3, - Tue = 4, - Wed = 5, - Thu = 6, - Fri = 7 - }; - - /// - /// Summary description for Property. - /// - public class Property - { - public string publicString = string.Empty; - public int publicInt = int.MinValue; - public DateTime publicDateTime = DateTime.MinValue; - public decimal publicDecimal = decimal.MinValue; - public sbyte publicSbyte = sbyte.MinValue; - public byte publicByte = byte.MinValue; - public char publicChar = char.MinValue; - public short publicShort = short.MinValue; - public ushort publicUshort = ushort.MinValue; - public uint publicUint = uint.MinValue; - public long publicLong = long.MinValue; - public ulong publicUlong = ulong.MinValue; - public bool publicBool = false; - public double publicDouble = double.MinValue; - public float publicFloat = float.MinValue; - public Guid publicGuid = Guid.Empty; - public TimeSpan publicTimeSpan = TimeSpan.MinValue; - public Account publicAccount = null; - public Days publicDay; - - private string _string = string.Empty; - private int _int = int.MinValue; - private DateTime _dateTime = DateTime.MinValue; - private decimal _decimal = decimal.MinValue; - private sbyte _sbyte = sbyte.MinValue; - private byte _byte = byte.MinValue; - private char _char = char.MinValue; - private short _short = short.MinValue; - private ushort _ushort = ushort.MinValue; - private uint _uint = uint.MinValue; - private long _long = long.MinValue; - private ulong _ulong = ulong.MinValue; - private bool _bool = false; - private double _double = double.MinValue; - private float _float = float.MinValue; - private Guid _guid = Guid.Empty; - private TimeSpan _timeSpan = TimeSpan.MinValue; - private Account _account = null; - private Days _day; - - protected string protectedString = string.Empty; - protected int protectedInt = int.MinValue; - protected DateTime protectedDateTime = DateTime.MinValue; - protected decimal protectedDecimal = decimal.MinValue; - protected sbyte protectedSbyte = sbyte.MinValue; - protected byte protectedByte = byte.MinValue; - protected char protectedChar = char.MinValue; - protected short protectedShort = short.MinValue; - protected ushort protectedUshort = ushort.MinValue; - protected uint protectedUint = uint.MinValue; - protected long protectedLong = long.MinValue; - protected ulong protectedUlong = ulong.MinValue; - protected bool protectedBool = false; - protected double protectedDouble = double.MinValue; - protected float protectedFloat = float.MinValue; - protected Guid protectedGuid = Guid.Empty; - protected TimeSpan protectedTimeSpan = TimeSpan.MinValue; - protected Account protectedAccount = null; - protected Days protectedDay; - -#if dotnet2 - private Int32? _intNullable = null; - public Int32? publicintNullable = null; - protected Int32? protectedintNullable = null; - - public Int32? IntNullable - { - get { return _intNullable; } - set { _intNullable = value; } - } -#endif - - public Property() - { - } - - public Days Day - { - get { return _day; } - set { _day = value; } - } - - public string String - { - get { return _string; } - set { _string = value; } - } - - public virtual int Int - { - get { return _int; } - set { _int = value; } - } - - public virtual DateTime DateTime - { - get { return _dateTime; } - set { _dateTime = value; } - } - - public decimal Decimal - { - get { return _decimal; } - set { _decimal = value; } - } - - public sbyte SByte - { - get { return _sbyte; } - set { _sbyte = value; } - } - - public byte Byte - { - get { return _byte; } - set { _byte = value; } - } - - public char Char - { - get { return _char; } - set { _char = value; } - } - - public short Short - { - get { return _short; } - set { _short = value; } - } - - public ushort UShort - { - get { return _ushort; } - set { _ushort = value; } - } - - public uint UInt - { - get { return _uint; } - set { _uint = value; } - } - - public long Long - { - get { return _long; } - set { _long = value; } - } - - public ulong ULong - { - get { return _ulong; } - set { _ulong = value; } - } - - public bool Bool - { - get { return _bool; } - set { _bool = value; } - } - - public virtual double Double - { - get { return _double; } - set { _double = value; } - } - - public float Float - { - get { return _float; } - set { _float = value; } - } - - public Guid Guid - { - get { return _guid; } - set { _guid = value; } - } - - public virtual TimeSpan TimeSpan - { - get { return _timeSpan; } - set { _timeSpan = value; } - } - - public virtual Account Account - { - get { return _account; } - set { _account = value; } - } - } - - - public class PropertySon : Property - { - private int _int = int.MinValue; - private int _float = int.MinValue; - - private int PrivateIndex - { - set { _int = value; } - } - - public int Index - { - get { return _int; } -#if dotnet2 - protected set { _int = value; } -#else - set { _int = value; } -#endif - } - - public override Account Account - { - get { return new Account(Days.Wed); } - set { throw new InvalidOperationException("Test virtual"); } - } - - public override int Int - { - get { return -88; } - set { throw new InvalidOperationException("Test virtual"); } - } - - public override DateTime DateTime - { - get { return new DateTime(2000,1,1); } - set { throw new InvalidOperationException("Test virtual"); } - } - - public new int Float - { - get { return _float; } - set { _float = value*2; } - } - -#if dotnet2 - private SpecialReference _referenceAccount = null; - public SpecialReference ReferenceAccount - { - get { return _referenceAccount; } - set { _referenceAccount = value; } - } -#endif - - } - -#if dotnet2 - public class SpecialReference where T : class - { - private T _value =null; - - public T Value - { - get { return _value; } - set { _value = value; } - } - } -#endif - -} diff --git a/src/IBatisNet.Common.Test/Domain/Simple.cs b/src/IBatisNet.Common.Test/Domain/Simple.cs deleted file mode 100644 index 3b4a901..0000000 --- a/src/IBatisNet.Common.Test/Domain/Simple.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.Domain -{ - [Serializable] - public class Simple - { - private string _name = string.Empty; - private string _address = string.Empty; - private int _count = int.MinValue; - private DateTime _date = new DateTime(2006, 03, 06, 12, 00, 00, 00); - private decimal _pay = 78.78M; - private int _id = 0; - - - public Simple() { } - - public void Init() - { - _name = "Someone with along name"; - _address = "1234 some street, some city, victoria, 3000, austaya"; - _count = 69; - _date = DateTime.Now; - } - - public int Id - { - get { return _id; } - set { _id = value; } - } - - public string Name - { - get { return _name; } - set { _name = value; } - } - - public string Address - { - get { return _address; } - set { _address = value; } - } - - public int Count - { - get { return _count; } - set { _count = value; } - } - - public DateTime Date - { - get { return _date; } - set { _date = value; } - } - - public decimal Pay - { - get { return _pay; } - set { _pay = value; } - } - } -} diff --git a/src/IBatisNet.Common.Test/Domain/User.cs b/src/IBatisNet.Common.Test/Domain/User.cs deleted file mode 100644 index a747e86..0000000 --- a/src/IBatisNet.Common.Test/Domain/User.cs +++ /dev/null @@ -1,15 +0,0 @@ - -namespace IBatisNet.Common.Test.Domain -{ - public class User : BaseDomain, IUser - { - private IAddress address; - - public IAddress Address - { - get { return address; } - set { address = value; } - } - - } -} diff --git a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj b/src/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj deleted file mode 100644 index 3af54ff..0000000 --- a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.2005.csproj +++ /dev/null @@ -1,261 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {5961F3DE-CB5E-40FE-AE89-D00D6E453907} - Debug - AnyCPU - - - - - IBatisNet.Common.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Test - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - log4net - ..\External-Bin\Net\1.1\log4net.dll - - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - - - - - - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.2005 - - - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708} - IBatisNet.DataAccess.2005 - - - {F3E45F39-3224-4EAD-B138-EB5CC0E32824} - IBatisNet.DataMapper.20005 - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.2010.csproj b/src/IBatisNet.Common.Test/IBatisNet.Common.Test.2010.csproj deleted file mode 100644 index 2228b3d..0000000 --- a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.2010.csproj +++ /dev/null @@ -1,301 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {5961F3DE-CB5E-40FE-AE89-D00D6E453907} - Debug - AnyCPU - - - - - IBatisNet.Common.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Test - OnBuildSuccess - - - - - - - v4.0 - 2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - - log4net - ..\External-Bin\Net\1.1\log4net.dll - - - ..\External-Bin\nunit\2.4.8\nunit.framework.dll - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - - - - - - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.2010 - - - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708} - IBatisNet.DataAccess.2010 - - - {F3E45F39-3224-4EAD-B138-EB5CC0E32824} - IBatisNet.DataMapper.2010 - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net35.2010.csproj b/src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net35.2010.csproj deleted file mode 100644 index 4eeaa64..0000000 --- a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net35.2010.csproj +++ /dev/null @@ -1,299 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {5961F3DE-CB5E-40FE-AE89-D00D6E453907} - Debug - AnyCPU - - - - - IBatisNet.Common.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Test - OnBuildSuccess - - - - - - - v3.5 - 2.0 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - - log4net - ..\External-Bin\Net\1.1\log4net.dll - - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - - - - - - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.Net35.2010 - - - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708} - IBatisNet.DataAccess.Net35.2010 - - - {F3E45F39-3224-4EAD-B138-EB5CC0E32824} - IBatisNet.DataMapper.Net35.2010 - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net45.2012.csproj b/src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net45.2012.csproj deleted file mode 100644 index 2fdb1a9..0000000 --- a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.Net45.2012.csproj +++ /dev/null @@ -1,303 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {5961F3DE-CB5E-40FE-AE89-D00D6E453907} - Debug - AnyCPU - - - - - IBatisNet.Common.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.Common.Test - OnBuildSuccess - - - - - - - v4.0 - 2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - false - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - false - - - - log4net - ..\External-Bin\Net\1.1\log4net.dll - - - ..\External-Bin\nunit\2.4.8\nunit.framework.dll - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - - - - - - - - - - - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {bbc8da4a-ea88-41d9-8b93-929b8f3adade} - IBatisNet.Common.Net45.2012 - - - {befc4a45-7df9-40e4-942c-82dc1ba5e708} - IBatisNet.DataAccess.Net45.2012 - - - {f3e45f39-3224-4ead-b138-eb5cc0e32824} - IBatisNet.DataMapper.Net45.2012 - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.build b/src/IBatisNet.Common.Test/IBatisNet.Common.Test.build deleted file mode 100644 index 7d2f86f..0000000 --- a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.build +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj b/src/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj deleted file mode 100644 index f887d93..0000000 --- a/src/IBatisNet.Common.Test/IBatisNet.Common.Test.csproj +++ /dev/null @@ -1,610 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/Maps/Access/OleDb/Account.xml b/src/IBatisNet.Common.Test/Maps/Access/OleDb/Account.xml deleted file mode 100644 index eb06146..0000000 --- a/src/IBatisNet.Common.Test/Maps/Access/OleDb/Account.xml +++ /dev/null @@ -1,445 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Maps/MSSQL/Odbc/Account.xml b/src/IBatisNet.Common.Test/Maps/MSSQL/Odbc/Account.xml deleted file mode 100644 index e5c51f6..0000000 --- a/src/IBatisNet.Common.Test/Maps/MSSQL/Odbc/Account.xml +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Maps/MSSQL/OleDb/Account.xml b/src/IBatisNet.Common.Test/Maps/MSSQL/OleDb/Account.xml deleted file mode 100644 index c8b7852..0000000 --- a/src/IBatisNet.Common.Test/Maps/MSSQL/OleDb/Account.xml +++ /dev/null @@ -1,438 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Maps/MSSQL/SqlClient/Account.xml b/src/IBatisNet.Common.Test/Maps/MSSQL/SqlClient/Account.xml deleted file mode 100644 index 6ee64c0..0000000 --- a/src/IBatisNet.Common.Test/Maps/MSSQL/SqlClient/Account.xml +++ /dev/null @@ -1,483 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Maps/MySql/ByteFx/Account.xml b/src/IBatisNet.Common.Test/Maps/MySql/ByteFx/Account.xml deleted file mode 100644 index 01d3740..0000000 --- a/src/IBatisNet.Common.Test/Maps/MySql/ByteFx/Account.xml +++ /dev/null @@ -1,483 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Maps/Oracle/ODP/Account.xml b/src/IBatisNet.Common.Test/Maps/Oracle/ODP/Account.xml deleted file mode 100644 index 7966c7d..0000000 --- a/src/IBatisNet.Common.Test/Maps/Oracle/ODP/Account.xml +++ /dev/null @@ -1,561 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id:Int32# - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id:Int32#, '$FirstName$', '$LastName$', '$EmailAddress$') - - - - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id:Int32#, '$FirstName$', '$LastName$', #EmailAddress:VarChar2:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id:Int32#, '$FirstName$', '$LastName$', '$EmailAddress$' ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id:Int32#, '$FirstName$', '$LastName$', '$EmailAddress$' ) - - - - delete from Accounts - where Account_ID = #Id:Int32# - - - - - - - - - - - - - - - call prc_InsertAccount(?, ?, ?, ?) - - - - - call prc_Swap_Email_Address(?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Maps/Oracle/OracleClient/Account.xml b/src/IBatisNet.Common.Test/Maps/Oracle/OracleClient/Account.xml deleted file mode 100644 index 1503863..0000000 --- a/src/IBatisNet.Common.Test/Maps/Oracle/OracleClient/Account.xml +++ /dev/null @@ -1,521 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - prc_InsertAccount - - - - prc_Swap_Email_Address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/ConfigWatcher/ConfigWatcherTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/ConfigWatcher/ConfigWatcherTest.cs deleted file mode 100644 index 1374315..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/ConfigWatcher/ConfigWatcherTest.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.IO; -using System.Collections; -using System.Reflection; -using System.Threading; - -using IBatisNet.Common.Utilities; - -using IBatisNet.Common.Test.NUnit; - -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.ConfigWatcher -{ - /// - /// Summary description for ConfigWatcherTest. - /// - [TestFixture] - public class ConfigWatcherTest - { - private bool _hasChanged = false; - - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - _hasChanged = false; - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - #region Test ConfigurationWatcher - - /// - /// ConfigurationWatcher Test - /// - [Test] - public void ConfigurationWatcherTest() - { - Assembly a = Assembly.GetExecutingAssembly(); - Uri uri = new System.Uri(a.CodeBase); - string binDirectory = Path.GetDirectoryName(uri.LocalPath); - string fileName = "test.config"; - - // Configure a watcher - ConfigureHandler configureDelegate = new ConfigureHandler( Configure ); - ConfigWatcherHandler.ClearFilesMonitored(); - ConfigWatcherHandler.AddFileToWatch( Resources.GetFileInfo( fileName) ); - - TimerCallback callBakDelegate = new TimerCallback( ConfigWatcherTest.OnConfigFileChange ); - - StateConfig state = new StateConfig(); - state.FileName = fileName; - state.ConfigureHandler = configureDelegate; - - new ConfigWatcherHandler( callBakDelegate, state ); - - FileInfo fi = Resources.GetFileInfo( fileName); - fi.LastWriteTime = DateTime.Now; - - fi.Refresh(); - - // Let's give a small bit of time for the change to propagate. - // The ConfigWatcherHandler class has a timer which - // waits for 500 Millis before delivering - // the event notification. - System.Threading.Thread.Sleep(600); - - Assert.IsTrue(_hasChanged); - } - - protected void Configure(object obj) - { - _hasChanged = true; - } - - /// - /// Called when the configuration has been updated. - /// - /// The state config. - public static void OnConfigFileChange(object obj) - { - StateConfig state = (StateConfig)obj; - state.ConfigureHandler(null); - } - - - #endregion - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMyInterface.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMyInterface.cs deleted file mode 100644 index fbb7424..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMyInterface.cs +++ /dev/null @@ -1,28 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.DynamicProxy -{ - /// - /// Summary description for IMyInterface. - /// - public interface IMyInterface - { - string Name - { - get; - set; - } - - bool Started - { - get; - set; - } - - // void Calc(int x, int y, out int result); - - int Calc(int x, int y); - - int Calc(int x, int y, int z, Single k); - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMySecondInterface.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMySecondInterface.cs deleted file mode 100644 index e0a3fb0..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/IMySecondInterface.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.DynamicProxy -{ - /// - /// Summary description for IMySecondInterface. - /// - public interface IMySecondInterface : IMyInterface - { - string Address - { - get; - set; - } - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MyInterfaceImpl.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MyInterfaceImpl.cs deleted file mode 100644 index 3b932ff..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MyInterfaceImpl.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.DynamicProxy -{ - /// - /// Description rsume de MyInterfaceImpl. - /// - public class MyInterfaceImpl : IMyInterface - { - private string _name; - private bool _started; - - public MyInterfaceImpl() - { - } - - #region IMyInterface Members - - public String Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - public bool Started - { - get - { - return _started; - } - set - { - _started = value; - } - } - - public int Calc(int x, int y) - { - return x + y; - } - - public int Calc(int x, int y, int z, Single k) - { - return x + y + z + (int)k; - } - - #endregion - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MySecondInterfaceImpl.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MySecondInterfaceImpl.cs deleted file mode 100644 index 265a9ce..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/MySecondInterfaceImpl.cs +++ /dev/null @@ -1,69 +0,0 @@ -using System; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.DynamicProxy -{ - /// - /// Description rsume de MySecondInterfaceImpl. - /// - public class MySecondInterfaceImpl : IMySecondInterface - { - private string _name; - private bool _started; - private string _address; - - #region IMySecondInterface members - - public string Address - { - get - { - return _address; - } - set - { - _address = value; - } - } - - #endregion - - #region IMyInterface members - - public String Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - public bool Started - { - get - { - return _started; - } - set - { - _started = value; - } - } - - public int Calc(int x, int y) - { - return x + y; - } - - public int Calc(int x, int y, int z, Single k) - { - return x + y + z + (int)k; - } - - - #endregion - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/ProxyTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/ProxyTest.cs deleted file mode 100644 index 1c5d94d..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/DynamicProxy/ProxyTest.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections; - -using IBatisNet.Common.Test.NUnit; - -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.DynamicProxy -{ - /// - /// Summary description for ProxyTest. - /// - [TestFixture] - public class ProxyTest - { - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - #region Tests - - [Test] - public void TestGenerationSimpleInterface() - { - IInvocationHandler handler = new StandardInvocationHandler( new MyInterfaceImpl() ); - object proxy = ProxyGenerator.CreateProxy( typeof(IMyInterface), handler ); - - Assert.IsNotNull( proxy ); - Assert.IsTrue( typeof(IMyInterface).IsAssignableFrom( proxy.GetType() ) ); - - IMyInterface inter = (IMyInterface) proxy; - - Assert.AreEqual( 45, inter.Calc( 20, 25 ) ); - - inter.Name = "opa"; - Assert.AreEqual( "opa", inter.Name ); - - inter.Started = true; - Assert.AreEqual( true, inter.Started ); - } - - [Test] - public void TestGenerationWithInterfaceHeritage() - { - IInvocationHandler handler = new StandardInvocationHandler( new MySecondInterfaceImpl() ); - object proxy = ProxyGenerator.CreateProxy( typeof(IMySecondInterface), handler ); - - Assert.IsNotNull( proxy ); - Assert.IsTrue( typeof(IMyInterface).IsAssignableFrom( proxy.GetType() ) ); - Assert.IsTrue( typeof(IMySecondInterface).IsAssignableFrom( proxy.GetType() ) ); - - IMySecondInterface inter = (IMySecondInterface) proxy; - inter.Calc(1, 1); - - inter.Name = "hammett"; - Assert.AreEqual( "hammett", inter.Name ); - - inter.Address = "pereira leite, 44"; - Assert.AreEqual( "pereira leite, 44", inter.Address ); - - Assert.AreEqual( 45, inter.Calc( 20, 25 ) ); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Logging/LogTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Logging/LogTest.cs deleted file mode 100644 index c9cff53..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Logging/LogTest.cs +++ /dev/null @@ -1,101 +0,0 @@ -using System; -using System.IO; -using System.Reflection; -using IBatisNet.Common.Logging; -using NUnit.Framework; - - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Logging -{ - /// - /// Summary description for LogTest. - /// - [TestFixture] - public class LogTest - { - private ILog _log = null; - private StringWriter outWriter = new StringWriter(); - private StringWriter errorWriter = new StringWriter(); - - #region SetUp/TearDown - [SetUp] - public void SetUp() - { - _log = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - - outWriter.GetStringBuilder().Length = 0; - errorWriter.GetStringBuilder().Length = 0; - - Console.SetOut(outWriter); - Console.SetError(errorWriter); - } - - [TearDown] - public void TearDown() - {} - #endregion - - [Test] - public void LogDebug() - { - string expectedLogOutput = "[DEBUG] IBatisNet.Common.Test.NUnit.CommonTests.Logging.LogTest - LogDebug"; - string actualLogOutput = ""; - - _log.Debug("LogDebug"); - - actualLogOutput = outWriter.GetStringBuilder().ToString(); - Assert.IsTrue(actualLogOutput.IndexOf(expectedLogOutput)>0); - } - - [Test] - public void LogInfo() - { - string expectedLogOutput = "[INFO] IBatisNet.Common.Test.NUnit.CommonTests.Logging.LogTest - LogInfo"; - string actualLogOutput = ""; - - _log.Info("LogInfo"); - - actualLogOutput = outWriter.GetStringBuilder().ToString(); - Assert.IsTrue(actualLogOutput.IndexOf(expectedLogOutput)>0); - } - - [Test] - public void LogError() - { - string expectedLogOutput = "[ERROR] IBatisNet.Common.Test.NUnit.CommonTests.Logging.LogTest - LogError"; - string actualLogOutput = ""; - - _log.Error("LogError"); - - actualLogOutput = outWriter.GetStringBuilder().ToString(); - Assert.IsTrue(actualLogOutput.IndexOf(expectedLogOutput)>0); - } - - [Test] - public void LogFatal() - { - string expectedLogOutput = "[FATAL] IBatisNet.Common.Test.NUnit.CommonTests.Logging.LogTest - LogFatal"; - string actualLogOutput = ""; - - _log.Fatal("LogFatal"); - - actualLogOutput = outWriter.GetStringBuilder().ToString(); - Assert.IsTrue(actualLogOutput.IndexOf(expectedLogOutput)>0); - } - - - [Test] - public void LogWarn() - { - string expectedLogOutput = "[WARN] IBatisNet.Common.Test.NUnit.CommonTests.Logging.LogTest - LogWarn"; - string actualLogOutput = ""; - - _log.Warn("LogWarn"); - - actualLogOutput = outWriter.GetStringBuilder().ToString(); - int i = actualLogOutput.IndexOf(expectedLogOutput); - Assert.IsTrue(actualLogOutput.IndexOf(expectedLogOutput)>0); - } - - } -} \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Pagination/PaginatedArrayListTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Pagination/PaginatedArrayListTest.cs deleted file mode 100644 index c99ed3f..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Pagination/PaginatedArrayListTest.cs +++ /dev/null @@ -1,237 +0,0 @@ -using System; -using System.Collections; - -using IBatisNet.Common.Pagination; - -using IBatisNet.Common.Test.NUnit; - -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Pagination -{ - /// - /// Summary description for PaginatedArrayListTest. - /// - [TestFixture] - public class PaginatedArrayListTest - { - private PaginatedArrayList _smallPageList = null; - private PaginatedArrayList _oddPageList = null; - private PaginatedArrayList _evenPageList = null; - - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - _smallPageList = new PaginatedArrayList(5); - _smallPageList.Add(0); - _smallPageList.Add(1); - _smallPageList.Add(2); - - _oddPageList = new PaginatedArrayList(5); - _oddPageList.Add(0); - _oddPageList.Add(1); - _oddPageList.Add(2); - _oddPageList.Add(3); - _oddPageList.Add(4); - _oddPageList.Add(5); - _oddPageList.Add(6); - _oddPageList.Add(7); - _oddPageList.Add(8); - _oddPageList.Add(9); - _oddPageList.Add(10); - _oddPageList.Add(11); - _oddPageList.Add(12); - _oddPageList.Add(13); - _oddPageList.Add(14); - _oddPageList.Add(15); - _oddPageList.Add(16); - _oddPageList.Add(17); - - _evenPageList = new PaginatedArrayList(5); - _evenPageList.Add(0); - _evenPageList.Add(1); - _evenPageList.Add(2); - _evenPageList.Add(3); - _evenPageList.Add(4); - _evenPageList.Add(5); - _evenPageList.Add(6); - _evenPageList.Add(7); - _evenPageList.Add(8); - _evenPageList.Add(9); - _evenPageList.Add(10); - _evenPageList.Add(11); - _evenPageList.Add(12); - _evenPageList.Add(13); - _evenPageList.Add(14); - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - #region Test PaginatedList - - /// - /// Test Odd Paginated Enumerator - /// - [Test] - public void TestOddPaginatedIterator() - { - Assert.AreEqual(true, _oddPageList.IsFirstPage); - Assert.AreEqual(false, _oddPageList.IsPreviousPageAvailable); - - Assert.AreEqual(5, _oddPageList.Count); - - _oddPageList.NextPage(); - - Assert.AreEqual(5, _oddPageList.Count); - - _oddPageList.NextPage(); - - Assert.AreEqual(true, _oddPageList.IsMiddlePage); - Assert.AreEqual(5, _oddPageList.Count); - - _oddPageList.NextPage(); - - Assert.AreEqual(3, _oddPageList.Count); - - Assert.AreEqual(true, _oddPageList.IsLastPage); - Assert.AreEqual(false, _oddPageList.IsNextPageAvailable); - - _oddPageList.NextPage(); - - Assert.AreEqual(true, _oddPageList.IsLastPage); - Assert.AreEqual(false, _oddPageList.IsNextPageAvailable); - - _oddPageList.PreviousPage(); - - Assert.AreEqual(10, _oddPageList[0]); - Assert.AreEqual(12, _oddPageList[2]); - - _oddPageList.GotoPage(500); - - Assert.AreEqual(0, _oddPageList[0]); - Assert.AreEqual(4, _oddPageList[4]); - - _oddPageList.GotoPage(-500); - - Assert.AreEqual(15, _oddPageList[0]); - Assert.AreEqual(17, _oddPageList[2]); - } - - /// - /// Test Even Paginated IEnumerator - /// - [Test] - public void TestEvenPaginatedEnumerator() - { - Assert.AreEqual(true, _evenPageList.IsFirstPage); - Assert.AreEqual(false, _evenPageList.IsPreviousPageAvailable); - - Assert.AreEqual(5, _evenPageList.Count); - - _evenPageList.NextPage(); - - Assert.AreEqual(true, _evenPageList.IsMiddlePage); - Assert.AreEqual(5, _evenPageList.Count); - - _evenPageList.NextPage(); - - Assert.AreEqual(5, _evenPageList.Count); - - Assert.AreEqual(true, _evenPageList.IsLastPage); - Assert.AreEqual(false, _evenPageList.IsNextPageAvailable); - - _evenPageList.NextPage(); - - Assert.AreEqual(10, _evenPageList[0]); - Assert.AreEqual(14, _evenPageList[4]); - - _evenPageList.PreviousPage(); - - Assert.AreEqual(5, _evenPageList[0]); - Assert.AreEqual(9, _evenPageList[4]); - - _evenPageList.GotoPage(500); - - Assert.AreEqual(0, _evenPageList[0]); - Assert.AreEqual(4, _evenPageList[4]); - - _evenPageList.GotoPage(-500); - - Assert.AreEqual(10, _evenPageList[0]); - Assert.AreEqual(14, _evenPageList[4]); - } - - - /// - /// Test Small Paginated IEnumerator - /// - [Test] - public void TestSmallPaginatedEnumerator() - { - Assert.AreEqual(true, _smallPageList.IsFirstPage); - Assert.AreEqual(true, _smallPageList.IsLastPage); - Assert.AreEqual(false, _smallPageList.IsMiddlePage); - Assert.AreEqual(false, _smallPageList.IsPreviousPageAvailable); - Assert.AreEqual(false, _smallPageList.IsNextPageAvailable); - - Assert.AreEqual(3, _smallPageList.Count); - - _smallPageList.NextPage(); - - Assert.AreEqual(3, _smallPageList.Count); - Assert.AreEqual(true, _smallPageList.IsFirstPage); - Assert.AreEqual(true, _smallPageList.IsLastPage); - Assert.AreEqual(false, _smallPageList.IsMiddlePage); - Assert.AreEqual(false, _smallPageList.IsPreviousPageAvailable); - Assert.AreEqual(false, _smallPageList.IsNextPageAvailable); - - _smallPageList.NextPage(); - - Assert.AreEqual(3, _smallPageList.Count); - - _smallPageList.NextPage(); - - Assert.AreEqual(0, _smallPageList[0]); - Assert.AreEqual(2, _smallPageList[2]); - - _smallPageList.PreviousPage(); - - Assert.AreEqual(0, _smallPageList[0]); - Assert.AreEqual(2, _smallPageList[2]); - - _smallPageList.GotoPage(500); - - Assert.AreEqual(0, _smallPageList[0]); - Assert.AreEqual(2, _smallPageList[2]); - - _smallPageList.GotoPage(-500); - - Assert.AreEqual(0, _smallPageList[0]); - Assert.AreEqual(2, _smallPageList[2]); - - Assert.AreEqual(true, _smallPageList.IsFirstPage); - Assert.AreEqual(true, _smallPageList.IsLastPage); - Assert.AreEqual(false, _smallPageList.IsMiddlePage); - Assert.AreEqual(false, _smallPageList.IsPreviousPageAvailable); - Assert.AreEqual(false, _smallPageList.IsNextPageAvailable); - } - - - #endregion - - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/BaseTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/BaseTest.cs deleted file mode 100644 index d73737f..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/BaseTest.cs +++ /dev/null @@ -1,173 +0,0 @@ -using System; -using System.Collections; -using System.Data; -using System.IO; -using System.Reflection; -using System.Configuration; -using IBatisNet.DataMapper.Configuration; -using log4net; - -using NUnit.Framework; - -using IBatisNet.DataAccess; - -using IBatisNet.Common; // DataSource definition -using IBatisNet.Common.Utilities; // ScriptRunner definition -using IBatisNet.DataMapper; // SqlMap API - -using IBatisNet.Common.Test.Domain; - -[assembly:log4net.Config.XmlConfigurator(Watch=true)] - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Transaction -{ - /// - /// Summary description for BaseTest. - /// - public abstract class BaseTest - { - /// - /// The sqlMap - /// - protected static ISqlMapper sqlMap; - /// - /// A daoManager with a SimpledaoSession - /// - protected static IDaoManager daoManager = null; - /// - /// A daoManager with a sqlMapSession - /// - protected static IDaoManager daoManagerSqlMap = null; - - private static readonly ILog _logger = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType ); - - protected static string ScriptDirectory = null; - - /// - /// Constructor - /// - static BaseTest() - { - - ScriptDirectory = Path.Combine( - Path.Combine( - Path.Combine( -#if dotnet2 - Path.Combine(Resources.ApplicationBase, ".."), ".."), "Scripts"), ConfigurationManager.AppSettings["database"]) + Path.DirectorySeparatorChar; -#else - Path.Combine(Resources.ApplicationBase, ".."), ".."), "Scripts"), ConfigurationSettings.AppSettings["database"]) + Path.DirectorySeparatorChar; -#endif - } - - /// - /// Initialize an sqlMap - /// - protected static void InitSqlMap() - { - //DateTime start = DateTime.Now; - - ConfigureHandler handler = new ConfigureHandler( Configure ); - DomSqlMapBuilder builder = new DomSqlMapBuilder(); -#if dotnet2 - sqlMap = builder.ConfigureAndWatch("sqlmap" + "_" + ConfigurationManager.AppSettings["database"] + "_" - + ConfigurationManager.AppSettings["providerType"] + ".config", handler); -#else - sqlMap = builder.ConfigureAndWatch( "sqlmap"+ "_" + ConfigurationSettings.AppSettings["database"] + "_" - + ConfigurationSettings.AppSettings["providerType"] +".config", handler ); -#endif - - //string loadTime = DateTime.Now.Subtract(start).ToString(); - //Console.WriteLine("Loading configuration time :"+loadTime); - } - - /// - /// Configure the SqlMap - /// - /// - /// Must verify ConfigureHandler signature. - /// - /// - /// The reconfigured sqlMap. - /// - protected static void Configure(object obj) - { - sqlMap = (ISqlMapper)obj; - } - - /// - /// Run a sql batch for the datasource. - /// - /// The datasource. - /// The sql batch - protected static void InitScript(IDataSource datasource, string script) - { - InitScript(datasource, script, true); - } - - /// - /// Run a sql batch for the datasource. - /// - /// The datasource. - /// The sql batch - /// parse out the statements in the sql script file. - protected static void InitScript(IDataSource datasource, string script, bool doParse) - { - ScriptRunner runner = new ScriptRunner(); - - runner.RunScript(datasource, script, doParse); - } - - /// - /// Create a new account with id = 6 - /// - /// An account - protected Account NewAccount6() - { - Account account = new Account(); - account.Id = 6; - account.FirstName = "Calamity"; - account.LastName = "Jane"; - account.EmailAddress = "no_email@provided.com"; - return account; - } - - /// - /// Verify that the input account is equal to the account(id=1). - /// - /// An account object - protected void AssertAccount1(Account account) - { - Assert.AreEqual(1, account.Id, "account.Id"); - Assert.AreEqual("Joe", account.FirstName, "account.FirstName"); - Assert.AreEqual("Dalton", account.LastName, "account.LastName"); - Assert.AreEqual("Joe.Dalton@somewhere.com", account.EmailAddress, "account.EmailAddress"); - } - - /// - /// Verify that the input account is equal to the account(id=1). - /// - /// An account as hashtable - protected void AssertAccount1AsHashtable(Hashtable account) - { - Assert.AreEqual(1, (int)account["Id"], "account.Id"); - Assert.AreEqual("Joe", (string)account["FirstName"], "account.FirstName"); - Assert.AreEqual("Dalton", (string)account["LastName"], "account.LastName"); - Assert.AreEqual("Joe.Dalton@somewhere.com", (string)account["EmailAddress"], "account.EmailAddress"); - } - - /// - /// Verify that the input account is equal to the account(id=6). - /// - /// An account object - protected void AssertAccount6(Account account) - { - Assert.AreEqual(6, account.Id, "account.Id"); - Assert.AreEqual("Calamity", account.FirstName, "account.FirstName"); - Assert.AreEqual("Jane", account.LastName, "account.LastName"); - Assert.IsNull(account.EmailAddress, "account.EmailAddress"); - } - - - - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/TransactionTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/TransactionTest.cs deleted file mode 100644 index c9e3311..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Transaction/TransactionTest.cs +++ /dev/null @@ -1,327 +0,0 @@ - -using System; - -using IBatisNet.Common.Transaction; - -using IBatisNet.Common.Test.Domain; - -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Transaction -{ - /// - /// Summary description for TransactionTest. - /// - [TestFixture] - [Category("MTS")] - public class TransactionTest : BaseTest - { - #region SetUp & TearDown - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - InitSqlMap(); - InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" ); - } - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - #endregion - - #region Transaction Tests - /// - /// Test Simple call to TransactionScope with a commit - /// - [Test] - public void SimpleTransaction() - { - Account account = null; - - using (TransactionScope tx = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - AssertAccount1(account); - - account.FirstName ="transaction changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - tx.Complete(); // Commit - } - - account = null; - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - - Assert.AreEqual("transaction changed", account.FirstName); - } - - /// - /// Test Simple call to TransactionScope with a roolback - /// - [Test] - public void SimpleRollback() - { - Account account = null; - - using (TransactionScope tx = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - AssertAccount1(account); - - account.FirstName ="transaction changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - //tx.Complete(); // RollBack - } - - account = null; - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - - Assert.AreEqual("Joe", account.FirstName); - } - - /// - /// Test Nested TransactionScope - /// - [Test] - public void NestedTransactionScope() - { - Account account = null; - - using (TransactionScope tx1 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - AssertAccount1(account); - - account.FirstName ="transaction1 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - account = null; - - using (TransactionScope tx2 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - Assert.AreEqual("transaction1 changed", account.FirstName); - - account.FirstName ="transaction2 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - tx2.Complete(); // Commit - } - - tx1.Complete(); // Commit - } - account = null; - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - - Assert.AreEqual("transaction2 changed", account.FirstName); - - } - - /// - /// Test Nested TransactionScope - /// - [Test] - public void NestedCommitWithRollBack() - { - Account account = null; - - using (TransactionScope tx1 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - AssertAccount1(account); - - account.FirstName = "transaction1 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - account = null; - - using (TransactionScope tx2 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - Assert.AreEqual("transaction1 changed", account.FirstName); - - account.FirstName = "transaction2 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - //tx2.Complete(); // RollBack - } - - tx1.Complete(); // Commit - - Assert.AreEqual(false, tx1.IsVoteCommit); - } - account = null; - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - - Assert.AreEqual("Joe", account.FirstName); - } - - /// - /// Test Nested TransactionScope - /// - [Test] - public void NestedRollbackWithCommit() - { - Account account = null; - - using (TransactionScope tx1 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - AssertAccount1(account); - - account.FirstName = "transaction1 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - account = null; - - using (TransactionScope tx2 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - Assert.AreEqual("transaction1 changed", account.FirstName); - - account.FirstName = "transaction2 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - tx2.Complete(); // Commit - - Assert.AreEqual(true, tx2.IsVoteCommit); - } - - //tx1.Complete(); // RollBack - } - account = null; - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - - Assert.AreEqual("Joe", account.FirstName); - } - - [Test] - public void NestedRollbacks() - { - Account account = null; - - using (TransactionScope tx1 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - AssertAccount1(account); - - account.FirstName = "transaction1 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - account = null; - - using (TransactionScope tx2 = new TransactionScope()) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - Assert.AreEqual("transaction1 changed", account.FirstName); - - account.FirstName = "transaction2 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - //tx2.Complete(); // RollBack - } - - //tx1.Complete(); // RollBack - - Assert.AreEqual(false, tx1.IsVoteCommit); - } - account = null; - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - - Assert.AreEqual("Joe", account.FirstName); - } - - [Test] - public void NestedTransactionScopeWithDifferentOption() - { - Account account = null; - - using (TransactionScope tx1 = new TransactionScope(TransactionScopeOptions.Required)) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - AssertAccount1(account); - - account.FirstName = "transaction1 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - account = null; - - using (TransactionScope tx2 = new TransactionScope(TransactionScopeOptions.RequiresNew)) - { - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - Assert.AreEqual("transaction1 changed", account.FirstName); - - account.FirstName = "transaction2 changed"; - sqlMap.Update("UpdateAccountViaParameterMap", account); - - //tx2.Complete(); // RollBack, rem tx1 will be rollback - } - - tx1.Complete(); - - Assert.AreEqual(false, tx1.IsVoteCommit); - } - account = null; - account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; - - Assert.AreEqual("Joe", account.FirstName); - } - -// [Test] -// public void NestedTransactionScopeWithDifferentOption2() -// { -// Account account = null; -// -// using (TransactionScope tx1 = new TransactionScope(TransactionScopeOptions.Required)) -// { -// account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; -// AssertAccount1(account); -// -// account.FirstName = "transaction1 changed"; -// sqlMap.Update("UpdateAccountViaParameterMap", account); -// -// account = null; -// -// using (TransactionScope tx2 = new TransactionScope(TransactionScopeOptions.RequiresNew)) -// { -// account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; -// Assert.AreEqual("Joe", account.FirstName); -// -// account.FirstName = "transaction2 changed"; -// sqlMap.Update("UpdateAccountViaParameterMap", account); -// -// tx2.Consistent = false; // RollBack -// -// Assert.AreEqual(false, tx2.IsVoteCommit); -// } -// -// using (TransactionScope tx2 = new TransactionScope(TransactionScopeOptions.RequiresNew)) -// { -// account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; -// Assert.AreEqual("Joe", account.FirstName); -// -// tx2.Consistent = false; // RollBack -// -// Assert.AreEqual(false, tx2.IsVoteCommit); -// } -// -// tx1.Consistent = false; // RollBack -// -// Assert.AreEqual(false, tx1.IsVoteCommit); -// } -// account = null; -// account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account; -// -// Assert.AreEqual("Joe", account.FirstName); -// } - #endregion - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/BaseMemberTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/BaseMemberTest.cs deleted file mode 100644 index 2c54294..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/BaseMemberTest.cs +++ /dev/null @@ -1,977 +0,0 @@ -using System; -using System.Reflection; -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects.Members; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - /// - /// Summary description for FieldAccessorTest. - /// - [TestFixture] - public abstract class BaseMemberTest - { - protected ISetAccessorFactory factorySet = null; - protected IGetAccessorFactory factoryGet = null; - - protected ISetAccessor intSetAccessor = null; - protected IGetAccessor intGetAccessor = null; - - protected ISetAccessor longSetAccessor = null; - protected IGetAccessor longGetAccessor = null; - - protected ISetAccessor sbyteSetAccessor = null; - protected IGetAccessor sbyteGetAccessor = null; - - protected ISetAccessor datetimeSetAccessor = null; - protected IGetAccessor datetimeGetAccessor = null; - - protected ISetAccessor decimalSetAccessor = null; - protected IGetAccessor decimalGetAccessor = null; - - protected ISetAccessor byteSetAccessor = null; - protected IGetAccessor byteGetAccessor = null; - - protected ISetAccessor stringSetAccessor = null; - protected IGetAccessor stringGetAccessor = null; - - protected ISetAccessor charSetAccessor = null; - protected IGetAccessor charGetAccessor = null; - - protected ISetAccessor shortSetAccessor = null; - protected IGetAccessor shortGetAccessor = null; - - protected ISetAccessor ushortSetAccessor = null; - protected IGetAccessor ushortGetAccessor = null; - - protected ISetAccessor uintSetAccessor = null; - protected IGetAccessor uintGetAccessor = null; - - protected ISetAccessor ulongSetAccessor = null; - protected IGetAccessor ulongGetAccessor = null; - - protected ISetAccessor boolSetAccessor = null; - protected IGetAccessor boolGetAccessor = null; - - protected ISetAccessor doubleSetAccessor = null; - protected IGetAccessor doubleGetAccessor = null; - - protected ISetAccessor floatSetAccessor = null; - protected IGetAccessor floatGetAccessor = null; - - protected ISetAccessor guidSetAccessor = null; - protected IGetAccessor guidGetAccessor = null; - - protected ISetAccessor timespanSetAccessor = null; - protected IGetAccessor timespanGetAccessor = null; - - protected ISetAccessor accountSetAccessor = null; - protected IGetAccessor accountGetAccessor = null; - - protected ISetAccessor enumSetAccessor = null; - protected IGetAccessor enumGetAccessor = null; -#if dotnet2 - protected ISetAccessor nullableSetAccessor = null; - protected IGetAccessor nullableGetAccessor = null; -#endif - - - /// - /// Initialize an sqlMap - /// - [TestFixtureSetUp] - protected virtual void SetUpFixture() - { - factoryGet = new GetAccessorFactory(true); - factorySet = new SetAccessorFactory(true); - } - - /// - /// Dispose the SqlMap - /// - [TestFixtureTearDown] - protected virtual void TearDownFixture() - { - factoryGet = null; - factorySet = null; - } - - /// - /// Test setting null on integer property. - /// - [Test] - public void TestSetNullOnIntegerProperty() - { - Property prop = new Property(); - prop.Int = -99; - - // Property accessor - intSetAccessor.Set(prop, null); - Assert.AreEqual(0, prop.Int); - } - - /// - /// Test setting an integer property. - /// - [Test] - public void TestSetInteger() - { - Property prop = new Property(); - prop.Int = -99; - - // Property accessor - int test = 57; - intSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Int); - } - - /// - /// Test getting an integer property. - /// - [Test] - public void TestGetInteger() - { - int test = -99; - Property prop = new Property(); - prop.Int = test; - - // Property accessor - Assert.AreEqual(test, intGetAccessor.Get(prop)); - } - - /// - /// Test setting null on Long property. - /// - [Test] - public void TestSetNullOnLongProperty() - { - Property prop = new Property(); - prop.Long = 78945566664213223; - - // Property accessor - longSetAccessor.Set(prop, null); - Assert.AreEqual((long)0, prop.Long); - } - - /// - /// Test setting an Long property. - /// - [Test] - public void TestSetLong() - { - Property prop = new Property(); - prop.Long = 78945566664213223; - - // Property accessor - long test = 123456789987456; - longSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Long); - } - - /// - /// Test getting an long property. - /// - [Test] - public void TestGetLong() - { - long test = 78945566664213223; - Property prop = new Property(); - prop.Long = test; - - // Property accessor - Assert.AreEqual(test, longGetAccessor.Get(prop)); - } - - /// - /// Test setting null on sbyte property. - /// - [Test] - public void TestSetNullOnSbyteProperty() - { - Property prop = new Property(); - prop.SByte = 78; - - // Property accessor - sbyteSetAccessor.Set(prop, null); - Assert.AreEqual((sbyte)0, prop.SByte); - } - - /// - /// Test setting an sbyte property. - /// - [Test] - public void TestSetSbyte() - { - Property prop = new Property(); - prop.SByte = 78; - - // Property accessor - sbyte test = 19; - sbyteSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.SByte); - } - - /// - /// Test getting an sbyte property. - /// - [Test] - public void TestGetSbyte() - { - sbyte test = 78; - Property prop = new Property(); - prop.SByte = test; - - // Property accessor - Assert.AreEqual(test, sbyteGetAccessor.Get(prop)); - } - - /// - /// Test setting null on String property. - /// - [Test] - public void TestSetNullOnStringProperty() - { - Property prop = new Property(); - prop.String = "abc"; - - // Property accessor - stringSetAccessor.Set(prop, null); - Assert.IsNull(prop.String); - } - - /// - /// Test setting an String property. - /// - [Test] - public void TestSetString() - { - Property prop = new Property(); - prop.String = "abc"; - - // Property accessor - string test = "wxc"; - stringSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.String); - } - - /// - /// Test getting an String property. - /// - [Test] - public void TestGetString() - { - string test = "abc"; - Property prop = new Property(); - prop.String = test; - - // Property accessor - Assert.AreEqual(test, stringGetAccessor.Get(prop)); - } - - /// - /// Test setting null on DateTime property. - /// - [Test] - public void TestSetNullOnDateTimeProperty() - { - Property prop = new Property(); - prop.DateTime = DateTime.Now; - - // Property accessor - datetimeSetAccessor.Set(prop, null); - Assert.AreEqual(DateTime.MinValue, prop.DateTime); - } - - /// - /// Test setting an DateTime property. - /// - [Test] - public void TestSetDateTime() - { - Property prop = new Property(); - prop.DateTime = DateTime.Now; - - // Property accessor - DateTime test = new DateTime(1987,11,25); - datetimeSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.DateTime); - } - - /// - /// Test getting an DateTime property. - /// - [Test] - public void TestGetDateTime() - { - DateTime test = new DateTime(1987, 11, 25); - Property prop = new Property(); - prop.DateTime = test; - - // Property accessor - Assert.AreEqual(test, datetimeGetAccessor.Get(prop)); - } - - /// - /// Test setting null on decimal property. - /// - [Test] - public void TestSetNullOnDecimalProperty() - { - Property prop = new Property(); - prop.Decimal = 45.187M; - - // Property accessor - decimalSetAccessor.Set(prop, null); - Assert.AreEqual(0.0M, prop.Decimal); - } - - /// - /// Test setting an decimal property. - /// - [Test] - public void TestSetDecimal() - { - Property prop = new Property(); - prop.Decimal = 45.187M; - - // Property accessor - Decimal test = 789456.141516M; - decimalSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Decimal); - } - - /// - /// Test getting an decimal property. - /// - [Test] - public void TestGetDecimal() - { - Decimal test = 789456.141516M; - Property prop = new Property(); - prop.Decimal = test; - - // Property accessor - Assert.AreEqual(test, decimalGetAccessor.Get(prop)); - } - - /// - /// Test setting null on byte property. - /// - [Test] - public void TestSetNullOnByteProperty() - { - Property prop = new Property(); - prop.Byte = 78; - - // Property accessor - byteSetAccessor.Set(prop, null); - Assert.AreEqual((byte)0, prop.Byte); - } - - /// - /// Test setting an byte property. - /// - [Test] - public void TestSetByte() - { - Property prop = new Property(); - prop.Byte = 15; - - // Property accessor - byte test = 94; - byteSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Byte); - } - - /// - /// Test getting an byte property. - /// - [Test] - public void TestGetByte() - { - byte test = 78; - Property prop = new Property(); - prop.Byte = test; - - // Property accessor - Assert.AreEqual(test, byteGetAccessor.Get(prop)); - } - - /// - /// Test setting null on char property. - /// - [Test] - public void TestSetNullOnCharProperty() - { - Property prop = new Property(); - prop.Char = 'r'; - - // Property accessor - charSetAccessor.Set(prop, null); - Assert.AreEqual('\0', prop.Char); - } - - /// - /// Test setting an char property. - /// - [Test] - public void TestSetChar() - { - Property prop = new Property(); - prop.Char = 'b'; - - // Property accessor - char test = 'j'; - charSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Char); - } - - /// - /// Test getting an char property. - /// - [Test] - public void TestGetChar() - { - char test = 'z'; - Property prop = new Property(); - prop.Char = test; - - // Property accessor - Assert.AreEqual(test, charGetAccessor.Get(prop)); - } - - /// - /// Test setting null on short property. - /// - [Test] - public void TestSetNullOnShortProperty() - { - Property prop = new Property(); - prop.Short = 5; - - // Property accessor - shortSetAccessor.Set(prop, null); - Assert.AreEqual((short)0, prop.Short); - } - - /// - /// Test setting an short property. - /// - [Test] - public void TestSetShort() - { - Property prop = new Property(); - prop.Short = 9; - - // Property accessor - short test = 45; - shortSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Short); - } - - /// - /// Test getting an short property. - /// - [Test] - public void TestGetShort() - { - short test = 99; - Property prop = new Property(); - prop.Short = test; - - // Property accessor - Assert.AreEqual(test, shortGetAccessor.Get(prop)); - } - - /// - /// Test setting null on ushort property. - /// - [Test] - public void TestSetNullOnUShortProperty() - { - Property prop = new Property(); - prop.UShort = 5; - - // Property accessor - ushortSetAccessor.Set(prop, null); - Assert.AreEqual((ushort)0, prop.UShort); - } - - /// - /// Test setting an ushort property. - /// - [Test] - public void TestSetUShort() - { - Property prop = new Property(); - prop.UShort = 9; - - // Property accessor - ushort test = 45; - ushortSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.UShort); - } - - /// - /// Test getting an ushort property. - /// - [Test] - public void TestGetUShort() - { - ushort test = 99; - Property prop = new Property(); - prop.UShort = test; - - // Property accessor - Assert.AreEqual(test, ushortGetAccessor.Get(prop)); - } - - /// - /// Test setting null on uint property. - /// - [Test] - public void TestSetNullOnUIntProperty() - { - Property prop = new Property(); - prop.UInt = 5; - - // Property accessor - uintSetAccessor.Set(prop, null); - Assert.AreEqual((uint)0, prop.UInt); - } - - /// - /// Test setting an uint property. - /// - [Test] - public void TestSetUInt() - { - Property prop = new Property(); - prop.UInt = 9; - - // Property accessor - uint test = 45; - uintSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.UInt); - } - - /// - /// Test getting an uint property. - /// - [Test] - public void TestGetUInt() - { - uint test = 99; - Property prop = new Property(); - prop.UInt = test; - - // Property accessor - Assert.AreEqual(test, uintGetAccessor.Get(prop)); - } - - /// - /// Test setting null on ulong property. - /// - [Test] - public void TestSetNullOnULongProperty() - { - Property prop = new Property(); - prop.ULong = 5L; - - // Property accessor - ulongSetAccessor.Set(prop, null); - Assert.AreEqual((ulong)0, prop.ULong); - } - - /// - /// Test setting an ulong property. - /// - [Test] - public void TestSetULong() - { - Property prop = new Property(); - prop.ULong = 45464646578; - - // Property accessor - ulong test = 45; - ulongSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.ULong); - } - - /// - /// Test getting an ulong property. - /// - [Test] - public void TestGetULong() - { - ulong test = 99; - Property prop = new Property(); - prop.ULong = test; - - // Property accessor - Assert.AreEqual(test, ulongGetAccessor.Get(prop)); - } - - /// - /// Test setting null on bool property. - /// - [Test] - public void TestSetNullOnBoolProperty() - { - Property prop = new Property(); - prop.Bool = true; - - // Property accessor - boolSetAccessor.Set(prop, null); - Assert.AreEqual(false, prop.Bool); - } - - /// - /// Test setting an bool property. - /// - [Test] - public void TestSetBool() - { - Property prop = new Property(); - prop.Bool = false; - - // Property accessor - bool test = true; - boolSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Bool); - } - - /// - /// Test getting an bool property. - /// - [Test] - public void TestGetBool() - { - bool test = false; - Property prop = new Property(); - prop.Bool = test; - - // Property accessor - Assert.AreEqual(test, boolGetAccessor.Get(prop)); - } - - /// - /// Test setting null on double property. - /// - [Test] - public void TestSetNullOnDoubleProperty() - { - Property prop = new Property(); - prop.Double = 788956.56D; - - // Property accessor - doubleSetAccessor.Set(prop, null); - Assert.AreEqual(0.0D, prop.Double); - } - - /// - /// Test setting an double property. - /// - [Test] - public void TestSetDouble() - { - Property prop = new Property(); - prop.Double = 56789123.45888D; - - // Property accessor - double test = 788956.56D; - doubleSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Double); - } - - /// - /// Test getting an double property. - /// - [Test] - public void TestGetDouble() - { - double test = 788956.56D; - Property prop = new Property(); - prop.Double = test; - - // Property accessor - Assert.AreEqual(test, doubleGetAccessor.Get(prop)); - } - - /// - /// Test setting null on float property. - /// - [Test] - public void TestSetNullOnFloatProperty() - { - Property prop = new Property(); - prop.Float = 565.45F; - - // Property accessor - floatSetAccessor.Set(prop, null); - Assert.AreEqual(0.0D, prop.Float); - } - - /// - /// Test setting an float property. - /// - [Test] - public void TestSetFloat() - { - Property prop = new Property(); - prop.Float = 565.45F; - - // Property accessor - float test = 4567.45F; - floatSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Float); - } - - /// - /// Test getting an float property. - /// - [Test] - public void TestGetFloat() - { - float test = 565.45F; - Property prop = new Property(); - prop.Float = test; - - // Property accessor - Assert.AreEqual(test, floatGetAccessor.Get(prop)); - } - - - /// - /// Test setting null on Guid property. - /// - [Test] - public void TestSetNullOnGuidProperty() - { - Property prop = new Property(); - prop.Guid = Guid.NewGuid(); - - // Property accessor - guidSetAccessor.Set(prop, null); - Assert.AreEqual(Guid.Empty, prop.Guid); - } - - /// - /// Test setting an Guid property. - /// - [Test] - public void TestSetGuid() - { - Property prop = new Property(); - prop.Guid = Guid.NewGuid(); - - // Property accessor - Guid test = Guid.NewGuid(); - guidSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Guid); - } - - /// - /// Test getting an Guid property. - /// - [Test] - public void TestGetGuid() - { - Guid test = Guid.NewGuid(); - Property prop = new Property(); - prop.Guid = test; - - // Property accessor - Assert.AreEqual(test, guidGetAccessor.Get(prop)); - } - - - /// - /// Test the setting null on a TimeSpan property. - /// - [Test] - public void TestSetNullOnTimeSpanProperty() - { - Property prop = new Property(); - prop.TimeSpan = new TimeSpan(5, 12, 57, 21, 13); - - // Property accessor - timespanSetAccessor.Set(prop, null); - Assert.AreEqual(new TimeSpan(0,0,0), prop.TimeSpan); - } - - /// - /// Test setting an TimeSpan property. - /// - [Test] - public void TestSetTimeSpan() - { - Property prop = new Property(); - prop.TimeSpan = new TimeSpan(5, 12, 57, 21, 13); - - // Property accessor - TimeSpan test = new TimeSpan(15, 5, 21, 45, 35); - timespanSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.TimeSpan); - } - - /// - /// Test getting an TimeSpan property. - /// - [Test] - public void TestGetTimeSpan() - { - TimeSpan test = new TimeSpan(5, 12, 57, 21, 13); - Property prop = new Property(); - prop.TimeSpan = test; - - // Property accessor - Assert.AreEqual(test, timespanGetAccessor.Get(prop)); - } - - /// - /// Test the setting null on a object property. - /// - [Test] - public void TestSetNullOnAccountProperty() - { - Property prop = new Property(); - prop.Account = new Account() ; - prop.Account.FirstName = "test"; - - // Property accessor - accountSetAccessor.Set(prop, null); - Assert.AreEqual(null, prop.Account); - } - - /// - /// Test getting an object property. - /// - [Test] - public void TestGetAccount() - { - Account test = new Account(); - test.FirstName = "Gilles"; - - Property prop = new Property(); - prop.Account = test; - - // Property accessor - Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(test), HashCodeProvider.GetIdentityHashCode(prop.Account)); - Assert.AreEqual(test.FirstName, ((Account)accountGetAccessor.Get(prop)).FirstName); - } - - /// - /// Test setting an object property. - /// - [Test] - public void TestSetAccount() - { - Property prop = new Property(); - prop.Account = new Account() ; - prop.Account.FirstName = "test"; - - // Property accessor - string firstName = "Gilles"; - Account test = new Account(); - test.FirstName = firstName; - accountSetAccessor.Set(prop, test); - - Assert.AreEqual(firstName, prop.Account.FirstName); - } - - /// - /// Test the setting null on a Enum property. - /// - [Test] - public void TestSetNullOnEnumProperty() - { - Property prop = new Property(); - prop.Day = Days.Thu; - - PropertyInfo propertyInfo = typeof(Property).GetProperty("Day", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance); - propertyInfo.SetValue(prop, null, null); - - // Property accessor - enumSetAccessor.Set(prop, null); - Assert.AreEqual(0, (int)prop.Day); - } - - /// - /// Test setting an Enum property. - /// - [Test] - public void TestSetEnum() - { - Property prop = new Property(); - prop.Day = Days.Thu; - - // Property accessor - Days test = Days.Wed; - enumSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.Day); - } - - /// - /// Test getting an Enum property. - /// - [Test] - public void TestGetEnum() - { - Days test = Days.Wed; - Property prop = new Property(); - prop.Day = test; - - // Property accessor - Assert.AreEqual(test, enumGetAccessor.Get(prop)); - } - -#if dotnet2 - /// - /// Test the setting null on a nullable int property. - /// - [Test] - public void TestSetNullOnNullableIntProperty() - { - Property prop = new Property(); - prop.IntNullable = 85; - - // Property accessor - nullableSetAccessor.Set(prop, null); - Assert.AreEqual(null, prop.IntNullable); - } - - /// - /// Test getting an nullable int property. - /// - [Test] - public void TestGetNullableInt() - { - Int32? test = 55; - Property prop = new Property(); - prop.IntNullable = test; - - // Property accessor - Assert.AreEqual(test, nullableGetAccessor.Get(prop)); - } - - /// - /// Test setting an nullable int property. - /// - [Test] - public void TestSetNullableInt() - { - Property prop = new Property(); - prop.IntNullable = 99; - - // Property accessor - Int32? test = 55; - nullableSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.IntNullable); - - } -#endif - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs deleted file mode 100644 index 84b045b..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/FieldAccessorTest.cs +++ /dev/null @@ -1,211 +0,0 @@ -using System; -using System.Reflection; -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects.Members; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - /// - /// Summary description for FieldAccessorTest. - /// - [TestFixture] - public class PrivateFieldAccessorTest : BaseMemberTest - { - - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - intSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_int"); - intGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_int"); - - longSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_long"); - longGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_long"); - - sbyteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_sbyte"); - sbyteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_sbyte"); - - stringSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_string"); - stringGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_string"); - - datetimeSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_dateTime"); - datetimeGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_dateTime"); - - decimalSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_decimal"); - decimalGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_decimal"); - - byteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_byte"); - byteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_byte"); - - charSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_char"); - charGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_char"); - - shortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_short"); - shortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_short"); - - ushortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_ushort"); - ushortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_ushort"); - - uintSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_uint"); - uintGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_uint"); - - ulongSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_ulong"); - ulongGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_ulong"); - - boolSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_bool"); - boolGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_bool"); - - doubleSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_double"); - doubleGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_double"); - - floatSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_float"); - floatGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_float"); - - guidSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_guid"); - guidGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_guid"); - - timespanSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_timeSpan"); - timespanGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_timeSpan"); - - accountSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_account"); - accountGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_account"); - - enumSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_day"); - enumGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_day"); - -#if dotnet2 - nullableSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "_intNullable"); - nullableGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "_intNullable"); -#endif - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - -#if dotnet2 - - private T GetDefault() - { - T frm = default(T); - return frm; - } - - /// - /// Test Default value. - /// - [Test] - public void TestDefault() - { - Console.WriteLine("DateTime : " + GetDefault()); - Console.WriteLine("TimeSpan : " + GetDefault()); - Console.WriteLine("Guid : " + GetDefault()); - Console.WriteLine("Decimal : " + GetDefault()); - } -#endif - ///// - ///// Test setting null on integer public field. - ///// - //[Test] - //public void TestSetNullOnIntegerField() - //{ - // Property prop = new Property(); - // prop.publicInt = -99; - - // // Property accessor - // ISetAccessor setAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicInt"); - // setAccessor.Set(prop, null); - // Assert.AreEqual(0, prop.publicInt); - //} - - ///// - ///// Test setting an integer public field. - ///// - //[Test] - //public void TestSetPublicFieldInteger() - //{ - // Property prop = new Property(); - // prop.publicInt = -99; - - // // Property accessor - // int test = 57; - // ISetAccessor setAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicInt"); - // setAccessor.Set(prop, test); - // Assert.AreEqual(test, prop.publicInt); - //} - - ///// - ///// Test getting an integer public field. - ///// - //[Test] - //public void TestGetPublicFieldInteger() - //{ - // int test = -99; - // Property prop = new Property(); - // prop.publicInt = test; - - // // Property accessor - // IGetAccessor getAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicInt"); - // Assert.AreEqual(test, getAccessor.Get(prop)); - //} - - ///// - ///// Test setting null on String public field. - ///// - //[Test] - //public void TestSetNullOnStringField() - //{ - // Property prop = new Property(); - // prop.publicString = "hello"; - - // // Property accessor - // ISetAccessor setAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicString"); - // setAccessor.Set(prop, null); - // Assert.AreEqual(null, prop.publicString); - //} - - ///// - ///// Test setting an String public field. - ///// - //[Test] - //public void TestSetPublicFieldString() - //{ - // Property prop = new Property(); - // prop.publicString = "hello"; - - // // Property accessor - // string test = "gilles"; - // ISetAccessor setAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicString"); - // setAccessor.Set(prop, test); - // Assert.AreEqual(test, prop.publicString); - //} - - ///// - ///// Test getting an String public field. - ///// - //[Test] - //public void TestGetPublicFieldString() - //{ - // string test = "gilles"; - // Property prop = new Property(); - // prop.publicString = test; - - // // Property accessor - // IGetAccessor getAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicString"); - // Assert.AreEqual(test, getAccessor.Get(prop)); - //} - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs deleted file mode 100644 index 446ab73..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ObjectFactoryTest.cs +++ /dev/null @@ -1,345 +0,0 @@ -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities.Objects; -using NUnit.Framework; -using System; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - - [TestFixture] - public class ObjectFactoryTest - { - [Test] - [ExpectedException(typeof(ProbeException))] - public void AbstractConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - IFactory factory = objectFactory.CreateFactory(typeof (Document), Type.EmptyTypes ); - - object obj = factory.CreateInstance(null); - } - - [Test] - public void DevivedClassConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - IFactory factory = objectFactory.CreateFactory(typeof (Book), Type.EmptyTypes ); - - Assert.IsNotNull(factory); - } - - [Test] - [ExpectedException(typeof(ProbeException))] - public void PrivateConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - IFactory factory = objectFactory.CreateFactory(typeof (Order), Type.EmptyTypes ); - - object obj = factory.CreateInstance(null); - } - - [Test] - [ExpectedException(typeof(ProbeException))] - public void NoMatchConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - IFactory factory = objectFactory.CreateFactory(typeof(ItemBis), Type.EmptyTypes); - - object obj = factory.CreateInstance(null); - } - - [Test] - [ExpectedException(typeof(ProbeException))] - public void ProtectedConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - IFactory factory = objectFactory.CreateFactory(typeof (Item), Type.EmptyTypes ); - - object obj = factory.CreateInstance(null); - - Assert.IsTrue(obj is Item); - } - - [Test] - public void ClassWithMultipleConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(string)}; - IFactory factory0 = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = {"gilles"}; - object obj0 = factory0.CreateInstance(parameters); - - Assert.IsTrue(obj0 is Account); - Account account = (Account)obj0; - Assert.AreEqual("gilles", account.Test); - - IFactory factory1 = objectFactory.CreateFactory(typeof (Account), Type.EmptyTypes ); - - object obj1 = factory1.CreateInstance(parameters); - - Assert.IsTrue(obj1 is Account); - } - - [Test] - public void StringConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(string)}; - IFactory factory = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = {"gilles"}; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - Assert.AreEqual("gilles", account.Test); - } - - [Test] - public void MultipleParamConstructor1() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(string)}; - IFactory factory = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = new object[1]; - parameters[0] = null; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - Assert.AreEqual(null, account.Test); - } - - [Test] - public void IntConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(int)}; - IFactory factory = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = new object[1]; - parameters[0] = -55; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - Assert.AreEqual( -55, account.Id); - } - - [Test] - public void EnumConstructorEnum() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(Days)}; - IFactory factory = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = new object[1]; - parameters[0] = Days.Sun; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - Assert.AreEqual( Days.Sun, account.Days); - } - - [Test] - public void ClassConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(Property)}; - IFactory factory = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = new object[1]; - Property prop = new Property(); - prop.String = "Gilles"; - parameters[0] = prop; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - Assert.IsNotNull(account.Property); - Assert.AreEqual( "Gilles", account.Property.String); - } - - [Test] - public void DateTimeConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(DateTime)}; - IFactory factory = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = new object[1]; - DateTime date = DateTime.Now; - parameters[0] = date; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - Assert.AreEqual( date, account.Date); - } - - [Test] - public void ArrayParamConstructor() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = { typeof(int[]) }; - IFactory factory = objectFactory.CreateFactory(typeof(Account), types); - - object[] parameters = new object[1]; - - int[] ids = new int[2]; - ids[0] = 1; - ids[1] = 2; - - parameters[0] = ids; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - - Assert.AreEqual(2, account.Ids.Length); - Assert.AreEqual(1, account.Ids[0]); - Assert.AreEqual(2, account.Ids[1]); - } - - [Test] - public void MultipleParamConstructor0() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - Type[] types = {typeof(string), typeof(Property)}; - IFactory factory = objectFactory.CreateFactory(typeof (Account), types ); - - object[] parameters = new object[2]; - Property prop = new Property(); - prop.String = "Gilles"; - parameters[0] = "Hlose"; - parameters[1] = prop; - object obj = factory.CreateInstance(parameters); - - Assert.IsTrue(obj is Account); - Account account = (Account)obj; - Assert.AreEqual("Hlose", account.FirstName); - Assert.IsNotNull(account.Property); - Assert.AreEqual( "Gilles", account.Property.String); - } - - - - [Test] - public void DynamicFactoryCreatesTypes() - { - IObjectFactory objectFactory = new ObjectFactory(true); - - IFactory factory = objectFactory.CreateFactory(typeof (Account), Type.EmptyTypes); - object obj = factory.CreateInstance(null); - Assert.IsTrue(obj is Account); - - factory = objectFactory.CreateFactory(typeof (Account), Type.EmptyTypes); - obj = factory.CreateInstance(Type.EmptyTypes); - Assert.IsTrue(obj is Account); - - factory = objectFactory.CreateFactory(typeof (Simple), Type.EmptyTypes); - obj = factory.CreateInstance(Type.EmptyTypes); - Assert.IsTrue(obj is Simple); - } - - [Test] - public void CreateInstanceWithDifferentFactories() - { - const int TEST_ITERATIONS = 1000000; - IFactory factory = null; - - #region new - factory = new NewAccountFactory(); - - // create an instance so that Activators can - // cache the type/constructor/whatever - factory.CreateInstance(Type.EmptyTypes); - - GC.Collect(); - GC.WaitForPendingFinalizers(); - - Timer timer = new Timer(); - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - factory.CreateInstance(Type.EmptyTypes); - } - timer.Stop(); - double newFactoryResult = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - #endregion - - #region activator - factory = new ActivatorObjectFactory().CreateFactory(typeof(Account), Type.EmptyTypes); - - // create an instance so that Activators can - // cache the type/constructor/whatever - factory.CreateInstance(Type.EmptyTypes); - - GC.Collect(); - GC.WaitForPendingFinalizers(); - - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - factory.CreateInstance(Type.EmptyTypes); - } - timer.Stop(); - double activatorFactoryResult = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - #endregion - - #region Emit - factory = new EmitObjectFactory().CreateFactory(typeof(Account), Type.EmptyTypes); - - // create an instance so that Activators can - // cache the type/constructor/whatever - factory.CreateInstance(Type.EmptyTypes); - - GC.Collect(); - GC.WaitForPendingFinalizers(); - - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - factory.CreateInstance(Type.EmptyTypes); - } - timer.Stop(); - double emitFactoryResult = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - #endregion - - // Print results - Console.WriteLine( - "Create " + TEST_ITERATIONS.ToString() + " objects via factory :" - + "\nNew : \t\t\t" + newFactoryResult.ToString("F3") - + "\nActivator : \t\t" + activatorFactoryResult.ToString("F3")+ " Ratio : " + ((activatorFactoryResult / newFactoryResult)).ToString("F3") - + "\nEmit IL : \t\t\t" + emitFactoryResult.ToString("F3") + " Ratio : " + ((emitFactoryResult / newFactoryResult)).ToString("F3")); - } - - internal class NewAccountFactory : IFactory - { - public object CreateInstance(object[] parameters) - { - return new Account(); - } - - } - - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs deleted file mode 100644 index ee67de9..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorPerformance.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Reflection; -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - [TestFixture] - public class PropertyAccessorPerformance - { - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - /// - /// Test integer property access performance - /// - [Test] - public void TestGetIntegerPerformance() - { - const int TEST_ITERATIONS = 1000000; - Property prop = new Property(); - int test = -1; - Timer timer = new Timer(); - - #region Direct access (fastest) - GC.Collect(); - GC.WaitForPendingFinalizers(); - - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - test = -1; - test = prop.Int; - Assert.AreEqual(int.MinValue, test); - } - timer.Stop(); - double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - #endregion - - #region IL Property accessor - GC.Collect(); - GC.WaitForPendingFinalizers(); - - IGetAccessorFactory factory = new GetAccessorFactory(true); - IGetAccessor propertyAccessor = factory.CreateGetAccessor(typeof(Property), "Int"); - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - test = -1; - test = (int)propertyAccessor.Get(prop); - Assert.AreEqual(int.MinValue, test); - } - timer.Stop(); - double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double propertyAccessorRatio = propertyAccessorDuration / directAccessDuration; - #endregion - - #region IBatisNet.Common.Utilities.Object.ReflectionInfo - GC.Collect(); - GC.WaitForPendingFinalizers(); - - ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(prop.GetType()); - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - test = -1; - PropertyInfo propertyInfo = (PropertyInfo)reflectionInfo.GetGetter("Int"); - test = (int)propertyInfo.GetValue(prop, null); - Assert.AreEqual(int.MinValue, test); - } - timer.Stop(); - double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double reflectionInfoRatio = (float)reflectionInfoDuration / directAccessDuration; - #endregion - - #region Reflection - GC.Collect(); - GC.WaitForPendingFinalizers(); - - Type type = prop.GetType(); - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - test = -1; - PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance); - test = (int)propertyInfo.GetValue(prop, null); - Assert.AreEqual(int.MinValue, test); - } - timer.Stop(); - double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double reflectionRatio = reflectionDuration / directAccessDuration; - #endregion - - #region ReflectionInvokeMember (slowest) - GC.Collect(); - GC.WaitForPendingFinalizers(); - - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - test = -1; - test = (int)type.InvokeMember("Int", - BindingFlags.Public | BindingFlags.GetProperty | BindingFlags.Instance, - null, prop, null); - Assert.AreEqual(int.MinValue, test); - } - timer.Stop(); - double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double reflectionInvokeMemberRatio = reflectionInvokeMemberDuration / directAccessDuration; - #endregion - - // Print results - Console.WriteLine("{0} property gets on integer...", TEST_ITERATIONS); - Console.WriteLine("Direct access: \t\t{0} ", directAccessDuration.ToString("F3")); - Console.WriteLine("IMemberAccessor: \t\t{0} Ratio: {1}", propertyAccessorDuration.ToString("F3"), propertyAccessorRatio.ToString("F3")); - Console.WriteLine("IBatisNet ReflectionInfo: \t{0} Ratio: {1}", reflectionInfoDuration.ToString("F3"), reflectionInfoRatio.ToString("F3")); - Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: {1}", reflectionInvokeMemberDuration.ToString("F3"), reflectionInvokeMemberRatio.ToString("F3")); - Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3")); - } - - - /// - /// Test the performance of getting an integer property. - /// - [Test] - public void TestSetIntegerPerformance() - { - const int TEST_ITERATIONS = 1000000; - Property prop = new Property(); - int value = 123; - Timer timer = new Timer(); - - #region Direct access (fastest) - GC.Collect(); - GC.WaitForPendingFinalizers(); - - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - prop.Int = value; - } - timer.Stop(); - double directAccessDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - #endregion - - #region Property accessor - GC.Collect(); - GC.WaitForPendingFinalizers(); - - ISetAccessorFactory factory = new SetAccessorFactory(true); - ISetAccessor propertyAccessor = factory.CreateSetAccessor(typeof(Property), "Int"); - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - propertyAccessor.Set(prop, value); - } - timer.Stop(); - double propertyAccessorDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double propertyAccessorRatio = propertyAccessorDuration / directAccessDuration; - #endregion - - #region IBatisNet.Common.Utilities.Object.ReflectionInfo - GC.Collect(); - GC.WaitForPendingFinalizers(); - - Type type = prop.GetType(); - ReflectionInfo reflectionInfo = ReflectionInfo.GetInstance(type); - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - PropertyInfo propertyInfo = (PropertyInfo)reflectionInfo.GetSetter("Int"); - propertyInfo.SetValue(prop, value, null); - } - timer.Stop(); - double reflectionInfoDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double reflectionInfoRatio = reflectionInfoDuration / directAccessDuration; - #endregion - - #region Reflection - GC.Collect(); - GC.WaitForPendingFinalizers(); - - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - PropertyInfo propertyInfo = type.GetProperty("Int", BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance); - propertyInfo.SetValue(prop, value, null); - } - timer.Stop(); - double reflectionDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double reflectionRatio = reflectionDuration / directAccessDuration; - #endregion - - #region ReflectionInvokeMember (slowest) - GC.Collect(); - GC.WaitForPendingFinalizers(); - - timer.Start(); - for (int i = 0; i < TEST_ITERATIONS; i++) - { - type.InvokeMember("Int", - BindingFlags.Public | BindingFlags.SetProperty | BindingFlags.Instance, - null, prop, new object[] { value }); - } - timer.Stop(); - double reflectionInvokeMemberDuration = 1000000 * (timer.Duration / (double)TEST_ITERATIONS); - double reflectionInvokeMemberRatio = reflectionInvokeMemberDuration / directAccessDuration; - #endregion - - // Print results - Console.WriteLine("{0} property sets on integer...", TEST_ITERATIONS); - Console.WriteLine("Direct access: \t\t{0} ", directAccessDuration.ToString("F3")); - Console.WriteLine("IMemberAccessor: \t\t{0} Ratio: {1}", propertyAccessorDuration.ToString("F3"), propertyAccessorRatio.ToString("F3")); - Console.WriteLine("IBatisNet ReflectionInfo: \t{0} Ratio: {1}", reflectionInfoDuration.ToString("F3"), reflectionInfoRatio.ToString("F3")); - Console.WriteLine("ReflectionInvokeMember: \t{0} Ratio: {1}", reflectionInvokeMemberDuration.ToString("F3"), reflectionInvokeMemberRatio.ToString("F3")); - Console.WriteLine("Reflection: \t\t\t{0} Ratio: {1}", reflectionDuration.ToString("F3"), reflectionRatio.ToString("F3")); - } - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs deleted file mode 100644 index 2d3a981..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PropertyAccessorTest.cs +++ /dev/null @@ -1,419 +0,0 @@ -using System; - -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects.Members; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - [TestFixture] - public class PropertyAccessorTest : BaseMemberTest - { - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - intSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Int"); - intGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Int"); - - longSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Long"); - longGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Long"); - - sbyteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "SByte"); - sbyteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "SByte"); - - stringSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "String"); - stringGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "String"); - - datetimeSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "DateTime"); - datetimeGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "DateTime"); - - decimalSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Decimal"); - decimalGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Decimal"); - - byteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Byte"); - byteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Byte"); - - charSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Char"); - charGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Char"); - - shortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Short"); - shortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Short"); - - ushortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "UShort"); - ushortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "UShort"); - - uintSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "UInt"); - uintGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "UInt"); - - ulongSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "ULong"); - ulongGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "ULong"); - - boolSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Bool"); - boolGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Bool"); - - doubleSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Double"); - doubleGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Double"); - - floatSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Float"); - floatGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Float"); - - guidSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Guid"); - guidGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Guid"); - - timespanSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "TimeSpan"); - timespanGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "TimeSpan"); - - accountSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Account"); - accountGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Account"); - - enumSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "Day"); - enumGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "Day"); - -#if dotnet2 - nullableSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "IntNullable"); - nullableGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "IntNullable"); -#endif - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - /// - /// Test Finding properties on interfaces which "inherites" other interfaces - /// - [Test] - public void TestJIRA210OnGet() - { - //---------------------------- - IGetAccessor addressGet = factoryGet.CreateGetAccessor(typeof(User), "Address"); - - User user = new User(); - user.Address = new Address(); - Guid newGuid = Guid.NewGuid(); - user.Address.Id = newGuid; - - IAddress address = (IAddress)addressGet.Get(user); - Assert.IsNotNull(address); - Assert.AreEqual(newGuid, address.Id); - - IGetAccessor domainGet = factoryGet.CreateGetAccessor(typeof(IAddress), "Id"); - - Guid guid = (Guid)domainGet.Get(address); - Assert.AreEqual(newGuid, guid); - } - - /// - /// Test Finding properties on interfaces which "inherites" other interfaces - /// - [Test] - public void TestJIRA210OnSet() - { - Address adr = new Address(); - - Guid newGuid = Guid.NewGuid(); - - ISetAccessor domainSet = factorySet.CreateSetAccessor(typeof(IAddress), "Id"); - - domainSet.Set(adr, newGuid); - Assert.AreEqual(newGuid, adr.Id ); - } - - /// - /// Test multiple call to factory - /// - [Test] - public void TestMemberAccessorFactory() - { - IGetAccessor accessor11 = factoryGet.CreateGetAccessor(typeof(Property), "Int"); - IGetAccessor accessor12 = factoryGet.CreateGetAccessor(typeof(Property), "Int"); - - Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(accessor11), HashCodeProvider.GetIdentityHashCode(accessor12)); - - ISetAccessor accessor21 = factorySet.CreateSetAccessor(typeof(Property), "Int"); - ISetAccessor accessor22 = factorySet.CreateSetAccessor(typeof(Property), "Int"); - - Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(accessor21), HashCodeProvider.GetIdentityHashCode(accessor22)); - - } - - /// - /// Test multiple IGetAccessor - /// - [Test] - public void TestMultipleMemberAccessorFactory() - { - Property prop = new Property(); - IGetAccessor accessor1 = factoryGet.CreateGetAccessor(typeof(Property), "Int"); - - IGetAccessorFactory factory2 = new GetAccessorFactory(true); - IGetAccessor accessor2 = factory2.CreateGetAccessor(typeof(Property), "Int"); - - Assert.AreEqual(int.MinValue, accessor1.Get(prop)); - Assert.AreEqual(int.MinValue, accessor2.Get(prop)); - } - - - /// - /// Test accessor on virtual property - /// - [Test] - [ExpectedException(typeof(InvalidOperationException), "Test virtual")] - public void TestVirtualIMemberAccessor1() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(PropertySon), "Account"); - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "Account"); - - PropertySon son = new PropertySon(); - Account account = (Account)accessorGet.Get(son); - - Assert.IsTrue(account.Days == Days.Wed); - accessorSet.Set(son, new Account()); - } - - /// - /// Test accessor on virtual property - /// - [Test] - [ExpectedException(typeof(InvalidOperationException), "Test virtual")] - public void TestVirtualIMemberAccessor2() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(PropertySon), "Int"); - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "Int"); - - PropertySon son = new PropertySon(); - Int32 i = (Int32)accessorGet.Get(son); - - Assert.IsTrue(i == -88); - accessorSet.Set(son, 9); - } - - /// - /// Test IMemberAccessor on virtual property - /// - [Test] - [ExpectedException(typeof(InvalidOperationException), "Test virtual")] - public void TestVirtualIMemberAccessor3() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(PropertySon), "DateTime"); - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "DateTime"); - - PropertySon son = new PropertySon(); - DateTime date = (DateTime)accessorGet.Get(son); - - Assert.AreEqual(new DateTime(2000,1,1), date); - accessorSet.Set(son, DateTime.Now); - } - - /// - /// Test IMemberAccessor on private set property - /// - [Test] - public void TestPrivateSetAccessor() - { - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "PrivateIndex"); - - PropertySon son = new PropertySon(); - accessorSet.Set(son, -99); - - Assert.AreEqual(-99, son.Index); - } - - /// - /// Test IMemberAccessor on protected set property - /// - [Test] - public void TestProtectedSetAccessor() - { - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "Index"); - - PropertySon son = new PropertySon(); - accessorSet.Set(son, -99); - - Assert.AreEqual(-99, son.Index); - } - - /// - /// Test set IMemberAccessor on a property override by new - /// - [Test] - public void TestSetPropertyOverrideByNew() - { - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "Float"); - - PropertySon son = new PropertySon(); - accessorSet.Set(son, -99); - - Assert.AreEqual(-99*2, son.Float); - } - - /// - /// Test get IMemberAccessor on a property override by new - /// - [Test] - public void TestGetPropertyOverrideByNew() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(PropertySon), "Float"); - - PropertySon son = new PropertySon(); - son.Float = -99; - - Assert.AreEqual(-99 * 2, accessorGet.Get(son)); - } - -#if dotnet2 - - /// - /// Test getter access to Public Generic Property - /// - [Test] - public void TestPublicGetterOnGenericProperty2() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(SpecialReference), "Value"); - - SpecialReference referenceAccount = new SpecialReference(); - Account account = new Account(5); - referenceAccount.Value = account; - - Account acc = accessorGet.Get(referenceAccount) as Account; - Assert.AreEqual(referenceAccount.Value, acc); - Assert.AreEqual(referenceAccount.Value.Id, acc.Id); - } - - /// - /// Test getter access to Public Generic Property - /// - [Test] - public void TestPublicGetterOnGenericProperty() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(PropertySon), "ReferenceAccount"); - - PropertySon son = new PropertySon(); - son.ReferenceAccount = new SpecialReference(); - Account account = new Account(5); - son.ReferenceAccount.Value = account; - - SpecialReference acc = accessorGet.Get(son) as SpecialReference; - Assert.AreEqual(account, acc.Value); - Assert.AreEqual(account.Id, acc.Value.Id); - } - - /// - /// Test setter access to Public Generic Property - /// - [Test] - public void TestPublicSetterOnGenericVariable() - { - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "ReferenceAccount"); - - PropertySon son = new PropertySon(); - SpecialReference referenceAccount = new SpecialReference(); - Account account = new Account(5); - referenceAccount.Value = account; - accessorSet.Set(son, referenceAccount); - - Assert.AreEqual(son.ReferenceAccount, referenceAccount); - Assert.AreEqual(son.ReferenceAccount.Value.Id, referenceAccount.Value.Id); - } - - /// - /// Test setter access to Public Generic Property - /// - [Test] - public void TestPublicSetterOnGenericVariable2() - { - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(SpecialReference), "Value"); - - SpecialReference referenceAccount = new SpecialReference(); - Account account = new Account(5); - accessorSet.Set(referenceAccount, account); - - Assert.AreEqual(account, referenceAccount.Value); - Assert.AreEqual(account.Id, referenceAccount.Value.Id); - } - - /// - /// Test getter access to private Generic Property - /// - [Test] - public void TestPrivateGetterOnGenericProperty() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(PropertySon), "_referenceAccount"); - - PropertySon son = new PropertySon(); - son.ReferenceAccount = new SpecialReference(); - Account account = new Account(5); - son.ReferenceAccount.Value = account; - - SpecialReference acc = accessorGet.Get(son) as SpecialReference; - Assert.AreEqual(account, acc.Value); - Assert.AreEqual(account.Id, acc.Value.Id); - } - - /// - /// Test getter access to private Generic Property - /// - [Test] - public void TestPrivateGetterOnGenericProperty2() - { - IGetAccessor accessorGet = factoryGet.CreateGetAccessor(typeof(SpecialReference), "_value"); - - SpecialReference referenceAccount = new SpecialReference(); - Account account = new Account(5); - referenceAccount.Value = account; - - Account acc = accessorGet.Get(referenceAccount) as Account; - Assert.AreEqual(referenceAccount.Value, acc); - Assert.AreEqual(referenceAccount.Value.Id, acc.Id); - } - - /// - /// Test setter access to Public Generic Property - /// - [Test] - public void TestPrivateSetterOnGenericVariable() - { - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(PropertySon), "_referenceAccount"); - - PropertySon son = new PropertySon(); - SpecialReference referenceAccount = new SpecialReference(); - Account account = new Account(5); - referenceAccount.Value = account; - accessorSet.Set(son, referenceAccount); - - Assert.AreEqual(son.ReferenceAccount, referenceAccount); - Assert.AreEqual(son.ReferenceAccount.Value.Id, referenceAccount.Value.Id); - } - - /// - /// Test setter access to Public Generic Property - /// - [Test] - public void TestPrivateSetterOnGenericVariable2() - { - ISetAccessor accessorSet = factorySet.CreateSetAccessor(typeof(SpecialReference), "_value"); - - SpecialReference referenceAccount = new SpecialReference(); - Account account = new Account(5); - accessorSet.Set(referenceAccount, account); - - Assert.AreEqual(account, referenceAccount.Value); - Assert.AreEqual(account.Id, referenceAccount.Value.Id); - } -#endif - } - -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ProtectedFieldAccessorTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ProtectedFieldAccessorTest.cs deleted file mode 100644 index de7c4f3..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ProtectedFieldAccessorTest.cs +++ /dev/null @@ -1,1123 +0,0 @@ - -using System; -using System.Reflection; -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects.Members; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - [TestFixture] - public class ProtectedFieldAccessorTest - { - protected ISetAccessorFactory factorySet = null; - protected IGetAccessorFactory factoryGet = null; - - protected ISetAccessor intSetAccessor = null; - protected IGetAccessor intGetAccessor = null; - - protected ISetAccessor longSetAccessor = null; - protected IGetAccessor longGetAccessor = null; - - protected ISetAccessor sbyteSetAccessor = null; - protected IGetAccessor sbyteGetAccessor = null; - - protected ISetAccessor datetimeSetAccessor = null; - protected IGetAccessor datetimeGetAccessor = null; - - protected ISetAccessor decimalSetAccessor = null; - protected IGetAccessor decimalGetAccessor = null; - - protected ISetAccessor byteSetAccessor = null; - protected IGetAccessor byteGetAccessor = null; - - protected ISetAccessor stringSetAccessor = null; - protected IGetAccessor stringGetAccessor = null; - - protected ISetAccessor charSetAccessor = null; - protected IGetAccessor charGetAccessor = null; - - protected ISetAccessor shortSetAccessor = null; - protected IGetAccessor shortGetAccessor = null; - - protected ISetAccessor ushortSetAccessor = null; - protected IGetAccessor ushortGetAccessor = null; - - protected ISetAccessor uintSetAccessor = null; - protected IGetAccessor uintGetAccessor = null; - - protected ISetAccessor ulongSetAccessor = null; - protected IGetAccessor ulongGetAccessor = null; - - protected ISetAccessor boolSetAccessor = null; - protected IGetAccessor boolGetAccessor = null; - - protected ISetAccessor doubleSetAccessor = null; - protected IGetAccessor doubleGetAccessor = null; - - protected ISetAccessor floatSetAccessor = null; - protected IGetAccessor floatGetAccessor = null; - - protected ISetAccessor guidSetAccessor = null; - protected IGetAccessor guidGetAccessor = null; - - protected ISetAccessor timespanSetAccessor = null; - protected IGetAccessor timespanGetAccessor = null; - - protected ISetAccessor accountSetAccessor = null; - protected IGetAccessor accountGetAccessor = null; - - protected ISetAccessor enumSetAccessor = null; - protected IGetAccessor enumGetAccessor = null; -#if dotnet2 - protected ISetAccessor nullableSetAccessor = null; - protected IGetAccessor nullableGetAccessor = null; -#endif - - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - intSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedInt"); - intGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedInt"); - - longSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedLong"); - longGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedLong"); - - sbyteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedSbyte"); - sbyteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedSbyte"); - - stringSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedString"); - stringGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedString"); - - datetimeSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedDateTime"); - datetimeGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedDateTime"); - - decimalSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedDecimal"); - decimalGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedDecimal"); - - byteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedByte"); - byteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedByte"); - - charSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedChar"); - charGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedChar"); - - shortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedShort"); - shortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedShort"); - - ushortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedUshort"); - ushortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedUshort"); - - uintSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedUint"); - uintGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedUint"); - - ulongSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedUlong"); - ulongGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedUlong"); - - boolSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedBool"); - boolGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedBool"); - - doubleSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedDouble"); - doubleGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedDouble"); - - floatSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedFloat"); - floatGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedFloat"); - - guidSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedGuid"); - guidGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedGuid"); - - timespanSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedTimeSpan"); - timespanGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedTimeSpan"); - - accountSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedAccount"); - accountGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedAccount"); - - enumSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedDay"); - enumGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedDay"); - -#if dotnet2 - nullableSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "protectedintNullable"); - nullableGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "protectedintNullable"); -#endif - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - - /// - /// Initialize an sqlMap - /// - [TestFixtureSetUp] - protected virtual void SetUpFixture() - { - factoryGet = new GetAccessorFactory(true); - factorySet = new SetAccessorFactory(true); - } - - /// - /// Dispose the SqlMap - /// - [TestFixtureTearDown] - protected virtual void TearDownFixture() - { - factoryGet = null; - factorySet = null; - } - - private FieldInfo GetFieldInfo(string fieldName) - { - return typeof(Property).GetField(fieldName, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public); - } - - /// - /// Test setting null on integer property. - /// - [Test] - public void TestSetNullOnIntegerField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedInt"); - fieldInfo.SetValue(prop, -99); - - // Property accessor - intSetAccessor.Set(prop, null); - Assert.AreEqual(0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an integer property. - /// - [Test] - public void TestSetIntegerField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedInt"); - fieldInfo.SetValue(prop, -99); - - // Property accessor - int test = 57; - intSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an integer property. - /// - [Test] - public void TestGetIntegerField() - { - int test = -99; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedInt"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, intGetAccessor.Get(prop)); - } - - /// - /// Test setting null on Long property. - /// - [Test] - public void TestSetNullOnLongField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedLong"); - fieldInfo.SetValue(prop, 78945566664213223); - - // Property accessor - longSetAccessor.Set(prop, null); - Assert.AreEqual((long)0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an Long property. - /// - [Test] - public void TestSetLongField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedLong"); - fieldInfo.SetValue(prop, 78945566664213223); - - // Property accessor - long test = 123456789987456; - longSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an long property. - /// - [Test] - public void TestGetLongField() - { - long test = 78945566664213223; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedLong"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, longGetAccessor.Get(prop)); - } - - /// - /// Test setting null on sbyte property. - /// - [Test] - public void TestSetNullOnSbyteField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedSbyte"); - fieldInfo.SetValue(prop, (SByte)78); - - // Property accessor - sbyteSetAccessor.Set(prop, null); - Assert.AreEqual((sbyte)0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an sbyte property. - /// - [Test] - public void TestSetSbyteField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedSbyte"); - fieldInfo.SetValue(prop, (SByte)78); - - // Property accessor - sbyte test = 19; - sbyteSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an sbyte property. - /// - [Test] - public void TestGetSbyteField() - { - sbyte test = 78; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedSbyte"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, sbyteGetAccessor.Get(prop)); - } - - /// - /// Test setting null on String property. - /// - [Test] - public void TestSetNullOnStringField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedString"); - fieldInfo.SetValue(prop, "abc"); - - // Property accessor - stringSetAccessor.Set(prop, null); - Assert.IsNull(fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an String property. - /// - [Test] - public void TestSetStringField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedString"); - fieldInfo.SetValue(prop, "abc"); - - // Property accessor - string test = "wxc"; - stringSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an String property. - /// - [Test] - public void TestGetStringField() - { - string test = "abc"; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedString"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, stringGetAccessor.Get(prop)); - } - - /// - /// Test setting null on DateTime property. - /// - [Test] - public void TestSetNullOnDateTimeField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDateTime"); - fieldInfo.SetValue(prop, DateTime.Now); - - // Property accessor - datetimeSetAccessor.Set(prop, null); - Assert.AreEqual(DateTime.MinValue, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an DateTime property. - /// - [Test] - public void TestSetDateTimeField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDateTime"); - fieldInfo.SetValue(prop, DateTime.Now); - - // Property accessor - DateTime test = new DateTime(1987, 11, 25); - datetimeSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an DateTime property. - /// - [Test] - public void TestGetDateTimeField() - { - DateTime test = new DateTime(1987, 11, 25); - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDateTime"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, datetimeGetAccessor.Get(prop)); - } - - /// - /// Test setting null on decimal property. - /// - [Test] - public void TestSetNullOnDecimalField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDecimal"); - fieldInfo.SetValue(prop, 45.187M); - - // Property accessor - decimalSetAccessor.Set(prop, null); - Assert.AreEqual(0.0M, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an decimal property. - /// - [Test] - public void TestSetDecimalField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDecimal"); - fieldInfo.SetValue(prop, 45.187M); - - // Property accessor - Decimal test = 789456.141516M; - decimalSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an decimal property. - /// - [Test] - public void TestGetDecimalField() - { - Decimal test = 789456.141516M; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDecimal"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, decimalGetAccessor.Get(prop)); - } - - /// - /// Test setting null on byte property. - /// - [Test] - public void TestSetNullOnByteField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedByte"); - fieldInfo.SetValue(prop, (Byte)78); - - // Property accessor - byteSetAccessor.Set(prop, null); - Assert.AreEqual((byte)0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an byte property. - /// - [Test] - public void TestSetByteField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedByte"); - fieldInfo.SetValue(prop, (Byte)15); - - // Property accessor - byte test = 94; - byteSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an byte property. - /// - [Test] - public void TestGetByteField() - { - byte test = 78; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedByte"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, byteGetAccessor.Get(prop)); - } - - /// - /// Test setting null on char property. - /// - [Test] - public void TestSetNullOnCharField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedChar"); - fieldInfo.SetValue(prop, 'r'); - - // Property accessor - charSetAccessor.Set(prop, null); - Assert.AreEqual('\0', fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an char property. - /// - [Test] - public void TestSetCharField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedChar"); - fieldInfo.SetValue(prop, 'b'); - - // Property accessor - char test = 'j'; - charSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an char property. - /// - [Test] - public void TestGetCharField() - { - char test = 'z'; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedChar"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, charGetAccessor.Get(prop)); - } - - /// - /// Test setting null on short property. - /// - [Test] - public void TestSetNullOnShortField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedShort"); - fieldInfo.SetValue(prop, (short)5); - - // Property accessor - shortSetAccessor.Set(prop, null); - Assert.AreEqual((short)0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an short property. - /// - [Test] - public void TestSetShortField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedShort"); - fieldInfo.SetValue(prop, (short)9); - - // Property accessor - short test = 45; - shortSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an short property. - /// - [Test] - public void TestGetShortField() - { - short test = 99; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedShort"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, shortGetAccessor.Get(prop)); - } - - /// - /// Test setting null on ushort property. - /// - [Test] - public void TestSetNullOnUShortField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUshort"); - fieldInfo.SetValue(prop, (ushort)5); - - // Property accessor - ushortSetAccessor.Set(prop, null); - Assert.AreEqual((ushort)0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an ushort property. - /// - [Test] - public void TestSetUShortField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUshort"); - fieldInfo.SetValue(prop, (ushort)9); - - // Property accessor - ushort test = 45; - ushortSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an ushort property. - /// - [Test] - public void TestGetUShortField() - { - ushort test = 99; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUshort"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, ushortGetAccessor.Get(prop)); - } - - /// - /// Test setting null on uint property. - /// - [Test] - public void TestSetNullOnUIntField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUint"); - fieldInfo.SetValue(prop, (UInt32)5); - - // Property accessor - uintSetAccessor.Set(prop, null); - Assert.AreEqual((uint)0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an uint property. - /// - [Test] - public void TestSetUIntField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUint"); - fieldInfo.SetValue(prop, (UInt32)9); - - // Property accessor - uint test = 45; - uintSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an uint property. - /// - [Test] - public void TestGetUIntField() - { - uint test = 99; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUint"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, uintGetAccessor.Get(prop)); - } - - /// - /// Test setting null on ulong property. - /// - [Test] - public void TestSetNullOnULongField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUlong"); - fieldInfo.SetValue(prop, (UInt64) 5L); - - // Property accessor - ulongSetAccessor.Set(prop, null); - Assert.AreEqual((ulong)0, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an ulong property. - /// - [Test] - public void TestSetULongField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUlong"); - fieldInfo.SetValue(prop, (UInt64)45464646578); - - // Property accessor - ulong test = 45; - ulongSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an ulong property. - /// - [Test] - public void TestGetULongField() - { - ulong test = 99; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedUlong"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, ulongGetAccessor.Get(prop)); - } - - /// - /// Test setting null on bool property. - /// - [Test] - public void TestSetNullOnBoolField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedBool"); - fieldInfo.SetValue(prop, true); - - // Property accessor - boolSetAccessor.Set(prop, null); - Assert.AreEqual(false, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an bool property. - /// - [Test] - public void TestSetBoolField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedBool"); - fieldInfo.SetValue(prop, false); - - // Property accessor - bool test = true; - boolSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an bool property. - /// - [Test] - public void TestGetBoolField() - { - bool test = false; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedBool"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, boolGetAccessor.Get(prop)); - } - - /// - /// Test setting null on double property. - /// - [Test] - public void TestSetNullOnDoubleField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDouble"); - fieldInfo.SetValue(prop, 788956.56D); - - // Property accessor - doubleSetAccessor.Set(prop, null); - Assert.AreEqual(0.0D, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an double property. - /// - [Test] - public void TestSetDoubleField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDouble"); - fieldInfo.SetValue(prop, 56789123.45888D); - - // Property accessor - double test = 788956.56D; - doubleSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an double property. - /// - [Test] - public void TestGetDoubleField() - { - double test = 788956.56D; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDouble"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, doubleGetAccessor.Get(prop)); - } - - /// - /// Test setting null on float property. - /// - [Test] - public void TestSetNullOnFloatField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedFloat"); - fieldInfo.SetValue(prop, 565.45F); - - // Property accessor - floatSetAccessor.Set(prop, null); - Assert.AreEqual(0.0D, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an float property. - /// - [Test] - public void TestSetFloatField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedFloat"); - fieldInfo.SetValue(prop, 565.45F); - - // Property accessor - float test = 4567.45F; - floatSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an float property. - /// - [Test] - public void TestGetFloatField() - { - float test = 565.45F; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedFloat"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, floatGetAccessor.Get(prop)); - } - - - /// - /// Test setting null on Guid property. - /// - [Test] - public void TestSetNullOnGuidField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedGuid"); - fieldInfo.SetValue(prop, Guid.NewGuid()); - - // Property accessor - guidSetAccessor.Set(prop, null); - Assert.AreEqual(Guid.Empty, fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an Guid property. - /// - [Test] - public void TestSetGuidField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedGuid"); - fieldInfo.SetValue(prop, Guid.NewGuid()); - - // Property accessor - Guid test = Guid.NewGuid(); - guidSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an Guid property. - /// - [Test] - public void TestGetGuidField() - { - Guid test = Guid.NewGuid(); - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedGuid"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, guidGetAccessor.Get(prop)); - } - - - /// - /// Test the setting null on a TimeSpan property. - /// - [Test] - public void TestSetNullOnTimeSpanField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedTimeSpan"); - fieldInfo.SetValue(prop, new TimeSpan(5, 12, 57, 21, 13)); - - // Property accessor - timespanSetAccessor.Set(prop, null); - Assert.AreEqual(new TimeSpan(0, 0, 0), fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an TimeSpan property. - /// - [Test] - public void TestSetTimeSpanField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedTimeSpan"); - fieldInfo.SetValue(prop, new TimeSpan(5, 12, 57, 21, 13)); - - // Property accessor - TimeSpan test = new TimeSpan(15, 5, 21, 45, 35); - timespanSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an TimeSpan property. - /// - [Test] - public void TestGetTimeSpanField() - { - TimeSpan test = new TimeSpan(5, 12, 57, 21, 13); - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedTimeSpan"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, timespanGetAccessor.Get(prop)); - } - - /// - /// Test the setting null on a object property. - /// - [Test] - public void TestSetNullOnAccountField() - { - Property prop = new Property(); - Account ac = new Account(); - ac.FirstName = "test"; - - FieldInfo fieldInfo = GetFieldInfo("protectedAccount"); - fieldInfo.SetValue(prop, ac); - - // Property accessor - accountSetAccessor.Set(prop, null); - Assert.AreEqual(null, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an object property. - /// - [Test] - public void TestGetAccountField() - { - Account test = new Account(); - test.FirstName = "Gilles"; - - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedAccount"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(test), HashCodeProvider.GetIdentityHashCode(fieldInfo.GetValue(prop))); - Assert.AreEqual(test.FirstName, ((Account)accountGetAccessor.Get(prop)).FirstName); - } - - /// - /// Test setting an object property. - /// - [Test] - public void TestSetAccountField() - { - Property prop = new Property(); - Account ac = new Account(); - ac.FirstName = "test"; - - FieldInfo fieldInfo = GetFieldInfo("protectedAccount"); - fieldInfo.SetValue(prop, ac); - - // Property accessor - string firstName = "Gilles"; - Account test = new Account(); - test.FirstName = firstName; - accountSetAccessor.Set(prop, test); - - Assert.AreEqual(firstName, ((Account)fieldInfo.GetValue(prop) ).FirstName); - } - - /// - /// Test the setting null on a Enum Field. - /// - [Test] - public void TestSetNullOnEnumField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDay"); - - // Property accessor - enumSetAccessor.Set(prop, null); - Assert.AreEqual(0, (int)fieldInfo.GetValue(prop)); - } - - /// - /// Test setting an Enum Field. - /// - [Test] - public void TestSetEnumField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDay"); - fieldInfo.SetValue(prop, Days.Thu); - - // Property accessor - Days test = Days.Wed; - enumSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an Enum Field. - /// - [Test] - public void TestGetEnumField() - { - Days test = Days.Wed; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedDay"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, enumGetAccessor.Get(prop)); - } - -#if dotnet2 - /// - /// Test the setting null on a nullable int Field. - /// - [Test] - public void TestSetNullOnNullableIntField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedintNullable"); - fieldInfo.SetValue(prop, 85); - - // Property accessor - nullableSetAccessor.Set(prop, null); - Assert.AreEqual(null, fieldInfo.GetValue(prop)); - } - - /// - /// Test getting an nullable int Field. - /// - [Test] - public void TestGetNullableIntField() - { - Int32? test = 55; - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedintNullable"); - fieldInfo.SetValue(prop, test); - - // Property accessor - Assert.AreEqual(test, nullableGetAccessor.Get(prop)); - } - - /// - /// Test setting an nullable int Field. - /// - [Test] - public void TestSetNullableIntField() - { - Property prop = new Property(); - FieldInfo fieldInfo = GetFieldInfo("protectedintNullable"); - fieldInfo.SetValue(prop, 99); - - // Property accessor - Int32? test = 55; - nullableSetAccessor.Set(prop, test); - Assert.AreEqual(test, fieldInfo.GetValue(prop)); - - } -#endif - } -} - diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PublicFieldAccessorTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PublicFieldAccessorTest.cs deleted file mode 100644 index ee73d8b..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/PublicFieldAccessorTest.cs +++ /dev/null @@ -1,1057 +0,0 @@ - -using System; -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects.Members; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - [TestFixture] - public class PublicFieldAccessorTest - { - protected ISetAccessorFactory factorySet = null; - protected IGetAccessorFactory factoryGet = null; - - protected ISetAccessor intSetAccessor = null; - protected IGetAccessor intGetAccessor = null; - - protected ISetAccessor longSetAccessor = null; - protected IGetAccessor longGetAccessor = null; - - protected ISetAccessor sbyteSetAccessor = null; - protected IGetAccessor sbyteGetAccessor = null; - - protected ISetAccessor datetimeSetAccessor = null; - protected IGetAccessor datetimeGetAccessor = null; - - protected ISetAccessor decimalSetAccessor = null; - protected IGetAccessor decimalGetAccessor = null; - - protected ISetAccessor byteSetAccessor = null; - protected IGetAccessor byteGetAccessor = null; - - protected ISetAccessor stringSetAccessor = null; - protected IGetAccessor stringGetAccessor = null; - - protected ISetAccessor charSetAccessor = null; - protected IGetAccessor charGetAccessor = null; - - protected ISetAccessor shortSetAccessor = null; - protected IGetAccessor shortGetAccessor = null; - - protected ISetAccessor ushortSetAccessor = null; - protected IGetAccessor ushortGetAccessor = null; - - protected ISetAccessor uintSetAccessor = null; - protected IGetAccessor uintGetAccessor = null; - - protected ISetAccessor ulongSetAccessor = null; - protected IGetAccessor ulongGetAccessor = null; - - protected ISetAccessor boolSetAccessor = null; - protected IGetAccessor boolGetAccessor = null; - - protected ISetAccessor doubleSetAccessor = null; - protected IGetAccessor doubleGetAccessor = null; - - protected ISetAccessor floatSetAccessor = null; - protected IGetAccessor floatGetAccessor = null; - - protected ISetAccessor guidSetAccessor = null; - protected IGetAccessor guidGetAccessor = null; - - protected ISetAccessor timespanSetAccessor = null; - protected IGetAccessor timespanGetAccessor = null; - - protected ISetAccessor accountSetAccessor = null; - protected IGetAccessor accountGetAccessor = null; - - protected ISetAccessor enumSetAccessor = null; - protected IGetAccessor enumGetAccessor = null; -#if dotnet2 - protected ISetAccessor nullableSetAccessor = null; - protected IGetAccessor nullableGetAccessor = null; -#endif - - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - intSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicInt"); - intGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicInt"); - - longSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicLong"); - longGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicLong"); - - sbyteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicSbyte"); - sbyteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicSbyte"); - - stringSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicString"); - stringGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicString"); - - datetimeSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicDateTime"); - datetimeGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicDateTime"); - - decimalSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicDecimal"); - decimalGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicDecimal"); - - byteSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicByte"); - byteGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicByte"); - - charSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicChar"); - charGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicChar"); - - shortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicShort"); - shortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicShort"); - - ushortSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicUshort"); - ushortGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicUshort"); - - uintSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicUint"); - uintGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicUint"); - - ulongSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicUlong"); - ulongGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicUlong"); - - boolSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicBool"); - boolGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicBool"); - - doubleSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicDouble"); - doubleGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicDouble"); - - floatSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicFloat"); - floatGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicFloat"); - - guidSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicGuid"); - guidGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicGuid"); - - timespanSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicTimeSpan"); - timespanGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicTimeSpan"); - - accountSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicAccount"); - accountGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicAccount"); - - enumSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicDay"); - enumGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicDay"); - -#if dotnet2 - nullableSetAccessor = factorySet.CreateSetAccessor(typeof(Property), "publicintNullable"); - nullableGetAccessor = factoryGet.CreateGetAccessor(typeof(Property), "publicintNullable"); -#endif - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - - /// - /// Initialize an sqlMap - /// - [TestFixtureSetUp] - protected virtual void SetUpFixture() - { - factoryGet = new GetAccessorFactory(true); - factorySet = new SetAccessorFactory(true); - } - - /// - /// Dispose the SqlMap - /// - [TestFixtureTearDown] - protected virtual void TearDownFixture() - { - factoryGet = null; - factorySet = null; - } - - /// - /// Test setting null on integer property. - /// - [Test] - public void TestSetNullOnIntegerField() - { - Property prop = new Property(); - prop.publicInt = -99; - - // Property accessor - intSetAccessor.Set(prop, null); - Assert.AreEqual(0, prop.publicInt); - } - - /// - /// Test setting an integer property. - /// - [Test] - public void TestSetIntegerField() - { - Property prop = new Property(); - prop.publicInt = -99; - - // Property accessor - int test = 57; - intSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicInt); - } - - /// - /// Test getting an integer property. - /// - [Test] - public void TestGetIntegerField() - { - int test = -99; - Property prop = new Property(); - prop.publicInt = test; - - // Property accessor - Assert.AreEqual(test, intGetAccessor.Get(prop)); - } - - /// - /// Test setting null on Long property. - /// - [Test] - public void TestSetNullOnLongField() - { - Property prop = new Property(); - prop.publicLong = 78945566664213223; - - // Property accessor - longSetAccessor.Set(prop, null); - Assert.AreEqual((long)0, prop.publicLong); - } - - /// - /// Test setting an Long property. - /// - [Test] - public void TestSetLongField() - { - Property prop = new Property(); - prop.publicLong = 78945566664213223; - - // Property accessor - long test = 123456789987456; - longSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicLong); - } - - /// - /// Test getting an long property. - /// - [Test] - public void TestGetLongField() - { - long test = 78945566664213223; - Property prop = new Property(); - prop.publicLong = test; - - // Property accessor - Assert.AreEqual(test, longGetAccessor.Get(prop)); - } - - /// - /// Test setting null on sbyte property. - /// - [Test] - public void TestSetNullOnSbyteField() - { - Property prop = new Property(); - prop.publicSbyte = 78; - - // Property accessor - sbyteSetAccessor.Set(prop, null); - Assert.AreEqual((sbyte)0, prop.publicSbyte); - } - - /// - /// Test setting an sbyte property. - /// - [Test] - public void TestSetSbyteField() - { - Property prop = new Property(); - prop.publicSbyte = 78; - - // Property accessor - sbyte test = 19; - sbyteSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicSbyte); - } - - /// - /// Test getting an sbyte property. - /// - [Test] - public void TestGetSbyteField() - { - sbyte test = 78; - Property prop = new Property(); - prop.publicSbyte = test; - - // Property accessor - Assert.AreEqual(test, sbyteGetAccessor.Get(prop)); - } - - /// - /// Test setting null on String property. - /// - [Test] - public void TestSetNullOnStringField() - { - Property prop = new Property(); - prop.publicString = "abc"; - - // Property accessor - stringSetAccessor.Set(prop, null); - Assert.IsNull(prop.publicString); - } - - /// - /// Test setting an String property. - /// - [Test] - public void TestSetStringField() - { - Property prop = new Property(); - prop.publicString = "abc"; - - // Property accessor - string test = "wxc"; - stringSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicString); - } - - /// - /// Test getting an String property. - /// - [Test] - public void TestGetStringField() - { - string test = "abc"; - Property prop = new Property(); - prop.publicString = test; - - // Property accessor - Assert.AreEqual(test, stringGetAccessor.Get(prop)); - } - - /// - /// Test setting null on DateTime property. - /// - [Test] - public void TestSetNullOnDateTimeField() - { - Property prop = new Property(); - prop.publicDateTime = DateTime.Now; - - // Property accessor - datetimeSetAccessor.Set(prop, null); - Assert.AreEqual(DateTime.MinValue, prop.publicDateTime); - } - - /// - /// Test setting an DateTime property. - /// - [Test] - public void TestSetDateTimeField() - { - Property prop = new Property(); - prop.publicDateTime = DateTime.Now; - - // Property accessor - DateTime test = new DateTime(1987, 11, 25); - datetimeSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicDateTime); - } - - /// - /// Test getting an DateTime property. - /// - [Test] - public void TestGetDateTimeField() - { - DateTime test = new DateTime(1987, 11, 25); - Property prop = new Property(); - prop.publicDateTime = test; - - // Property accessor - Assert.AreEqual(test, datetimeGetAccessor.Get(prop)); - } - - /// - /// Test setting null on decimal property. - /// - [Test] - public void TestSetNullOnDecimalField() - { - Property prop = new Property(); - prop.publicDecimal = 45.187M; - - // Property accessor - decimalSetAccessor.Set(prop, null); - Assert.AreEqual(0.0M, prop.publicDecimal); - } - - /// - /// Test setting an decimal property. - /// - [Test] - public void TestSetDecimalField() - { - Property prop = new Property(); - prop.publicDecimal = 45.187M; - - // Property accessor - Decimal test = 789456.141516M; - decimalSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicDecimal); - } - - /// - /// Test getting an decimal property. - /// - [Test] - public void TestGetDecimalField() - { - Decimal test = 789456.141516M; - Property prop = new Property(); - prop.publicDecimal = test; - - // Property accessor - Assert.AreEqual(test, decimalGetAccessor.Get(prop)); - } - - /// - /// Test setting null on byte property. - /// - [Test] - public void TestSetNullOnByteField() - { - Property prop = new Property(); - prop.publicByte = 78; - - // Property accessor - byteSetAccessor.Set(prop, null); - Assert.AreEqual((byte)0, prop.publicByte); - } - - /// - /// Test setting an byte property. - /// - [Test] - public void TestSetByteField() - { - Property prop = new Property(); - prop.publicByte = 15; - - // Property accessor - byte test = 94; - byteSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicByte); - } - - /// - /// Test getting an byte property. - /// - [Test] - public void TestGetByteField() - { - byte test = 78; - Property prop = new Property(); - prop.publicByte = test; - - // Property accessor - Assert.AreEqual(test, byteGetAccessor.Get(prop)); - } - - /// - /// Test setting null on char property. - /// - [Test] - public void TestSetNullOnCharField() - { - Property prop = new Property(); - prop.publicChar = 'r'; - - // Property accessor - charSetAccessor.Set(prop, null); - Assert.AreEqual('\0', prop.publicChar); - } - - /// - /// Test setting an char property. - /// - [Test] - public void TestSetCharField() - { - Property prop = new Property(); - prop.publicChar = 'b'; - - // Property accessor - char test = 'j'; - charSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicChar); - } - - /// - /// Test getting an char property. - /// - [Test] - public void TestGetCharField() - { - char test = 'z'; - Property prop = new Property(); - prop.publicChar = test; - - // Property accessor - Assert.AreEqual(test, charGetAccessor.Get(prop)); - } - - /// - /// Test setting null on short property. - /// - [Test] - public void TestSetNullOnShortField() - { - Property prop = new Property(); - prop.publicShort = 5; - - // Property accessor - shortSetAccessor.Set(prop, null); - Assert.AreEqual((short)0, prop.publicShort); - } - - /// - /// Test setting an short property. - /// - [Test] - public void TestSetShortField() - { - Property prop = new Property(); - prop.publicShort = 9; - - // Property accessor - short test = 45; - shortSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicShort); - } - - /// - /// Test getting an short property. - /// - [Test] - public void TestGetShortField() - { - short test = 99; - Property prop = new Property(); - prop.publicShort = test; - - // Property accessor - Assert.AreEqual(test, shortGetAccessor.Get(prop)); - } - - /// - /// Test setting null on ushort property. - /// - [Test] - public void TestSetNullOnUShortField() - { - Property prop = new Property(); - prop.publicUshort = 5; - - // Property accessor - ushortSetAccessor.Set(prop, null); - Assert.AreEqual((ushort)0, prop.publicUshort); - } - - /// - /// Test setting an ushort property. - /// - [Test] - public void TestSetUShortField() - { - Property prop = new Property(); - prop.publicUshort = 9; - - // Property accessor - ushort test = 45; - ushortSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicUshort); - } - - /// - /// Test getting an ushort property. - /// - [Test] - public void TestGetUShortField() - { - ushort test = 99; - Property prop = new Property(); - prop.publicUshort = test; - - // Property accessor - Assert.AreEqual(test, ushortGetAccessor.Get(prop)); - } - - /// - /// Test setting null on uint property. - /// - [Test] - public void TestSetNullOnUIntField() - { - Property prop = new Property(); - prop.publicUint = 5; - - // Property accessor - uintSetAccessor.Set(prop, null); - Assert.AreEqual((uint)0, prop.publicUint); - } - - /// - /// Test setting an uint property. - /// - [Test] - public void TestSetUIntField() - { - Property prop = new Property(); - prop.publicUint = 9; - - // Property accessor - uint test = 45; - uintSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicUint); - } - - /// - /// Test getting an uint property. - /// - [Test] - public void TestGetUIntField() - { - uint test = 99; - Property prop = new Property(); - prop.publicUint = test; - - // Property accessor - Assert.AreEqual(test, uintGetAccessor.Get(prop)); - } - - /// - /// Test setting null on ulong property. - /// - [Test] - public void TestSetNullOnULongField() - { - Property prop = new Property(); - prop.publicUlong = 5L; - - // Property accessor - ulongSetAccessor.Set(prop, null); - Assert.AreEqual((ulong)0, prop.publicUlong); - } - - /// - /// Test setting an ulong property. - /// - [Test] - public void TestSetULongField() - { - Property prop = new Property(); - prop.publicUlong = 45464646578; - - // Property accessor - ulong test = 45; - ulongSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicUlong); - } - - /// - /// Test getting an ulong property. - /// - [Test] - public void TestGetULongField() - { - ulong test = 99; - Property prop = new Property(); - prop.publicUlong = test; - - // Property accessor - Assert.AreEqual(test, ulongGetAccessor.Get(prop)); - } - - /// - /// Test setting null on bool property. - /// - [Test] - public void TestSetNullOnBoolField() - { - Property prop = new Property(); - prop.publicBool = true; - - // Property accessor - boolSetAccessor.Set(prop, null); - Assert.AreEqual(false, prop.publicBool); - } - - /// - /// Test setting an bool property. - /// - [Test] - public void TestSetBoolField() - { - Property prop = new Property(); - prop.publicBool = false; - - // Property accessor - bool test = true; - boolSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicBool); - } - - /// - /// Test getting an bool property. - /// - [Test] - public void TestGetBoolField() - { - bool test = false; - Property prop = new Property(); - prop.publicBool = test; - - // Property accessor - Assert.AreEqual(test, boolGetAccessor.Get(prop)); - } - - /// - /// Test setting null on double property. - /// - [Test] - public void TestSetNullOnDoubleField() - { - Property prop = new Property(); - prop.publicDouble = 788956.56D; - - // Property accessor - doubleSetAccessor.Set(prop, null); - Assert.AreEqual(0.0D, prop.publicDouble); - } - - /// - /// Test setting an double property. - /// - [Test] - public void TestSetDoubleField() - { - Property prop = new Property(); - prop.publicDouble = 56789123.45888D; - - // Property accessor - double test = 788956.56D; - doubleSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicDouble); - } - - /// - /// Test getting an double property. - /// - [Test] - public void TestGetDoubleField() - { - double test = 788956.56D; - Property prop = new Property(); - prop.publicDouble = test; - - // Property accessor - Assert.AreEqual(test, doubleGetAccessor.Get(prop)); - } - - /// - /// Test setting null on float property. - /// - [Test] - public void TestSetNullOnFloatField() - { - Property prop = new Property(); - prop.publicFloat = 565.45F; - - // Property accessor - floatSetAccessor.Set(prop, null); - Assert.AreEqual(0.0D, prop.publicFloat); - } - - /// - /// Test setting an float property. - /// - [Test] - public void TestSetFloatField() - { - Property prop = new Property(); - prop.publicFloat = 565.45F; - - // Property accessor - float test = 4567.45F; - floatSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicFloat); - } - - /// - /// Test getting an float property. - /// - [Test] - public void TestGetFloatField() - { - float test = 565.45F; - Property prop = new Property(); - prop.publicFloat = test; - - // Property accessor - Assert.AreEqual(test, floatGetAccessor.Get(prop)); - } - - - /// - /// Test setting null on Guid property. - /// - [Test] - public void TestSetNullOnGuidField() - { - Property prop = new Property(); - prop.publicGuid = Guid.NewGuid(); - - // Property accessor - guidSetAccessor.Set(prop, null); - Assert.AreEqual(Guid.Empty, prop.publicGuid); - } - - /// - /// Test setting an Guid property. - /// - [Test] - public void TestSetGuidField() - { - Property prop = new Property(); - prop.publicGuid = Guid.NewGuid(); - - // Property accessor - Guid test = Guid.NewGuid(); - guidSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicGuid); - } - - /// - /// Test getting an Guid property. - /// - [Test] - public void TestGetGuidField() - { - Guid test = Guid.NewGuid(); - Property prop = new Property(); - prop.publicGuid = test; - - // Property accessor - Assert.AreEqual(test, guidGetAccessor.Get(prop)); - } - - - /// - /// Test the setting null on a TimeSpan property. - /// - [Test] - public void TestSetNullOnTimeSpanField() - { - Property prop = new Property(); - prop.publicTimeSpan = new TimeSpan(5, 12, 57, 21, 13); - - // Property accessor - timespanSetAccessor.Set(prop, null); - Assert.AreEqual(new TimeSpan(0, 0, 0), prop.publicTimeSpan); - } - - /// - /// Test setting an TimeSpan property. - /// - [Test] - public void TestSetTimeSpanField() - { - Property prop = new Property(); - prop.publicTimeSpan = new TimeSpan(5, 12, 57, 21, 13); - - // Property accessor - TimeSpan test = new TimeSpan(15, 5, 21, 45, 35); - timespanSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicTimeSpan); - } - - /// - /// Test getting an TimeSpan property. - /// - [Test] - public void TestGetTimeSpanField() - { - TimeSpan test = new TimeSpan(5, 12, 57, 21, 13); - Property prop = new Property(); - prop.publicTimeSpan = test; - - // Property accessor - Assert.AreEqual(test, timespanGetAccessor.Get(prop)); - } - - /// - /// Test the setting null on a object property. - /// - [Test] - public void TestSetNullOnAccountField() - { - Property prop = new Property(); - prop.publicAccount = new Account(); - prop.publicAccount.FirstName = "test"; - - // Property accessor - accountSetAccessor.Set(prop, null); - Assert.AreEqual(null, prop.publicAccount); - } - - /// - /// Test getting an object property. - /// - [Test] - public void TestGetAccountField() - { - Account test = new Account(); - test.FirstName = "Gilles"; - - Property prop = new Property(); - prop.publicAccount = test; - - // Property accessor - Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(test), HashCodeProvider.GetIdentityHashCode(prop.publicAccount)); - Assert.AreEqual(test.FirstName, ((Account)accountGetAccessor.Get(prop)).FirstName); - } - - /// - /// Test setting an object property. - /// - [Test] - public void TestSetAccountField() - { - Property prop = new Property(); - prop.publicAccount = new Account(); - prop.publicAccount.FirstName = "test"; - - // Property accessor - string firstName = "Gilles"; - Account test = new Account(); - test.FirstName = firstName; - accountSetAccessor.Set(prop, test); - - Assert.AreEqual(firstName, prop.publicAccount.FirstName); - } - - /// - /// Test the setting null on a Enum Field. - /// - [Test] - public void TestSetNullOnEnumField() - { - Property prop = new Property(); - - // Property accessor - enumSetAccessor.Set(prop, null); - Assert.AreEqual(0, (int)prop.publicDay); - } - - /// - /// Test setting an Enum Field. - /// - [Test] - public void TestSetEnumField() - { - Property prop = new Property(); - prop.publicDay = Days.Thu; - - // Property accessor - Days test = Days.Wed; - enumSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicDay); - } - - /// - /// Test getting an Enum Field. - /// - [Test] - public void TestGetEnumField() - { - Days test = Days.Wed; - Property prop = new Property(); - prop.publicDay = test; - - // Property accessor - Assert.AreEqual(test, enumGetAccessor.Get(prop)); - } - -#if dotnet2 - /// - /// Test the setting null on a nullable int Field. - /// - [Test] - public void TestSetNullOnNullableIntField() - { - Property prop = new Property(); - prop.publicintNullable = 85; - - // Property accessor - nullableSetAccessor.Set(prop, null); - Assert.AreEqual(null, prop.IntNullable); - } - - /// - /// Test getting an nullable int Field. - /// - [Test] - public void TestGetNullableIntField() - { - Int32? test = 55; - Property prop = new Property(); - prop.publicintNullable = test; - - // Property accessor - Assert.AreEqual(test, nullableGetAccessor.Get(prop)); - } - - /// - /// Test setting an nullable int Field. - /// - [Test] - public void TestSetNullableIntField() - { - Property prop = new Property(); - prop.publicintNullable = 99; - - // Property accessor - Int32? test = 55; - nullableSetAccessor.Set(prop, test); - Assert.AreEqual(test, prop.publicintNullable); - - } -#endif - - public void SetPublicAccount(Property p, Account ac) - { - p.publicAccount = ac; - } - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ReflectionInfoTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ReflectionInfoTest.cs deleted file mode 100644 index 38c222d..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ReflectionInfoTest.cs +++ /dev/null @@ -1,51 +0,0 @@ -using System; -using IBatisNet.Common.Utilities.Objects; -using NUnit.Framework; - - -using IBatisNet.Common.Test.Domain; -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - /// - /// Summary description for ReflectionInfoTest. - /// - [TestFixture] - public class ReflectionInfoTest - { - /// - /// Test multiple call to factory - /// - [Test] - public void TestReflectionInfo() - { - - ReflectionInfo info = ReflectionInfo.GetInstance(typeof (Document)); - - Type type = info.GetGetterType("PageNumber"); - } - - /// - /// Test Finding properties on interfaces which "inherites" other interfaces - /// - [Test] - public void TestJIRA210OnGet() - { - ReflectionInfo info = ReflectionInfo.GetInstance(typeof(IAddress)); - - Type type = info.GetGetterType("Id"); - Assert.IsNotNull(type); - } - - /// - /// Test Finding properties on interfaces which "inherites" other interfaces - /// - [Test] - public void TestJIRA210OnSet() - { - ReflectionInfo info = ReflectionInfo.GetInstance(typeof(IAddress)); - - Type type = info.GetSetterType("Id"); - Assert.IsNotNull(type); - } - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ResourcesTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ResourcesTest.cs deleted file mode 100644 index a0844e4..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/ResourcesTest.cs +++ /dev/null @@ -1,139 +0,0 @@ -using System.IO; -using System.Xml; -using IBatisNet.Common.Utilities; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - /// - /// Description rsume de ResourcesTest. - /// - [TestFixture] - public class ResourcesTest - { - #region SetUp & TearDown - - /// - /// SetUp - /// - [SetUp] - public void SetUp() - { - } - - - /// - /// TearDown - /// - [TearDown] - public void Dispose() - { - } - - #endregion - - #region Test ResourcesTest - - /// - /// Test loading Embedded Resource - /// - [Test] - public void TestEmbeddedResource() - { - XmlDocument doc = null; - - doc = Resources.GetEmbeddedResourceAsXmlDocument("IBatisNet.Common.Test.properties.xml, IBatisNet.Common.Test"); - - Assert.IsNotNull(doc); - Assert.IsTrue(doc.HasChildNodes); - Assert.AreEqual(doc.ChildNodes.Count,2); - Assert.AreEqual(doc.SelectNodes("/settings/add").Count, 4); - } - - /// - /// Test loading Embedded Resource - /// - [Test] - public void TestEmbeddedResourceWhenNamespaceDiffersFromAssemblyName() - { - XmlDocument doc = null; - - doc = Resources.GetEmbeddedResourceAsXmlDocument("CompanyName.ProductName.Maps.ISCard.xml, OctopusService"); - - Assert.IsNotNull(doc); - Assert.IsTrue(doc.HasChildNodes); - Assert.AreEqual(doc.ChildNodes.Count,2); - } - #endregion - - #region GetFileInfo Tests - - [Test] - public void GetFileInfoWithRelative() - { - FileInfo fileInfo = Resources.GetFileInfo("IBatisNet.Common.Test.dll"); - Assert.IsNotNull(fileInfo); - } - - - [Test] - public void GetFileInfoWithAbsolute() - { - string resourcePath = Resources.ApplicationBase+Path.DirectorySeparatorChar+"IBatisNet.Common.Test.dll"; - FileInfo fileInfo = Resources.GetFileInfo(resourcePath); - Assert.IsNotNull(fileInfo); - } - - [Test] - public void GetFileInfoWithAbsoluteProtocol() - { - string resourcePath = "file://"+Resources.ApplicationBase+Path.DirectorySeparatorChar+"IBatisNet.Common.Test.dll"; - FileInfo fileInfo = Resources.GetFileInfo(resourcePath); - Assert.IsNotNull(fileInfo); - } - - [Test] - public void GetFileInfoWithAbsoluteProtocolPlusSlash() - { - string resourcePath = "file:///"+Resources.ApplicationBase+Path.DirectorySeparatorChar+"IBatisNet.Common.Test.dll"; - FileInfo fileInfo = Resources.GetFileInfo(resourcePath); - Assert.IsNotNull(fileInfo); - } - #endregion - - #region GetConfigAsXmlDocument Tests - - [Test] - public void GetConfigAsXmlDocumentWithAbsolute() - { - string resourcePath = Resources.ApplicationBase+Path.DirectorySeparatorChar+"SqlMap_MSSQL_SqlClient.config"; - XmlDocument doc = Resources.GetConfigAsXmlDocument(resourcePath); - Assert.IsNotNull(doc); - } - - [Test] - public void GetConfigAsXmlDocumentWithAbsoluteProtocol() - { - string resourcePath = "file://"+Resources.ApplicationBase+Path.DirectorySeparatorChar+"SqlMap_MSSQL_SqlClient.config"; - XmlDocument doc = Resources.GetConfigAsXmlDocument(resourcePath); - Assert.IsNotNull(doc); - } - - - [Test] - public void GetConfigAsXmlDocumentWithAbsoluteProtocolPlusSlash() - { - XmlDocument doc = Resources.GetConfigAsXmlDocument("file:///"+Resources.ApplicationBase+Path.DirectorySeparatorChar+"SqlMap_MSSQL_SqlClient.config"); - Assert.IsNotNull(doc); - } - - [Test] - public void GetConfigAsXmlDocumentWithRelative() - { - XmlDocument doc = Resources.GetConfigAsXmlDocument("SqlMap_MSSQL_SqlClient.config"); - Assert.IsNotNull(doc); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs deleted file mode 100644 index 93e679c..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/Timer.cs +++ /dev/null @@ -1,46 +0,0 @@ -using System; -using System.ComponentModel; -using System.Runtime.InteropServices; -using System.Threading; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - public class Timer - { - [DllImport("Kernel32.dll")] - private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); - - [DllImport("Kernel32.dll")] - private static extern bool QueryPerformanceFrequency(out long lpFrequency); - - private long startTime, stopTime; - private long freq; - - public Timer() - { - startTime = 0; - stopTime = 0; - - if (QueryPerformanceFrequency(out freq) == false) - { - throw new Win32Exception(); - } - } - - public void Start() - { - Thread.Sleep(0); - QueryPerformanceCounter(out startTime); - } - - public void Stop() - { - QueryPerformanceCounter(out stopTime); - } - - public double Duration - { - get { return (double) (stopTime - startTime)/(double) freq; } - } - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeResolverTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeResolverTest.cs deleted file mode 100644 index 0303ecd..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeResolverTest.cs +++ /dev/null @@ -1,128 +0,0 @@ -using System; -using System.Text; -using System.Collections.Generic; -using System.Collections; - -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities.TypesResolver; -using NUnit.Framework; -using IBatisNet.Common.Utilities; -using NUnit.Framework.SyntaxHelpers; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - [TestFixture] - public class TypeResolverTest - { - /// - /// Test space on generic type - /// - [Test] - public void Generic_list_of_nullable_guid_should_be_resolved() - { - Type genericType = TypeUtils.ResolveType(typeof(List).FullName); - Assert.IsNotNull(genericType); - } - - /// - /// Test space on generic type - /// - [Test] - public void TestTrimSpace() - { - Type genericType = TypeUtils.ResolveType("System.Collections.Generic.Dictionary`2[[System.String],[System.Int32]]"); - - Assert.IsNotNull(genericType); - } - - - - /// - /// Test nullable resolver - /// - [Test] - public void TestFullNameNullableType() - { - Type nullableType = typeof(bool?); - - Type nullableBooleanType = TypeUtils.ResolveType(nullableType.FullName); - - Assert.IsNotNull(nullableBooleanType); - } - - /// - /// Test nullable resolver - /// - [Test] - public void TestAssemblyQualifiedNameNullableType() - { - Type nullableType = typeof(bool?); - - Type nullableBooleanType = TypeUtils.ResolveType(nullableType.AssemblyQualifiedName); - - Assert.IsNotNull(nullableBooleanType); - } - - /// - /// Test generic list resolver - /// - [Test] - public void TestGeneicListType() - { - IList list = new List(); - string assemblyQualifiedName = list.GetType().AssemblyQualifiedName; - Type listType = TypeUtils.ResolveType(assemblyQualifiedName); - - Assert.IsNotNull(listType); - } - - /// - /// Test generic dictionary resolver - /// - [Test] - public void TestGenericDictionaryType() - { - IDictionary dico = new Dictionary(); - - Console.WriteLine(typeof(IDictionary<,>).FullName); - Console.WriteLine(dico.GetType().FullName); - - string assemblyQualifiedName = dico.GetType().AssemblyQualifiedName; - Type listType = TypeUtils.ResolveType(assemblyQualifiedName); - - Assert.IsNotNull(listType); - } - - /// - /// Test generic dictionary resolver - /// - [Test] - public void TestGenericParameter() - { - IDictionary, List> dico = new Dictionary, List>(); - - Console.WriteLine(typeof(IDictionary<,>).FullName); - Console.WriteLine(dico.GetType().FullName); - - string assemblyQualifiedName = dico.GetType().AssemblyQualifiedName; - Type type = TypeUtils.ResolveType(assemblyQualifiedName); - - Assert.IsNotNull(type); - - MyGeneric, List>, string, List, decimal> gen = new MyGeneric, List>, string, List, decimal>(); - - Console.WriteLine(gen.GetType().FullName); - - assemblyQualifiedName = gen.GetType().AssemblyQualifiedName; - type = TypeUtils.ResolveType(assemblyQualifiedName); - - Assert.IsNotNull(type); - - Assert.That(gen, Is.InstanceOfType(type)); - } - - private class MyGeneric - {} - - } -} diff --git a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeUtilsTest.cs b/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeUtilsTest.cs deleted file mode 100644 index 1e1aa17..0000000 --- a/src/IBatisNet.Common.Test/NUnit/CommonTests/Utilities/TypeUtilsTest.cs +++ /dev/null @@ -1,88 +0,0 @@ - -#if dotnet2 -using System; -using System.Collections; -using System.Collections.Generic; -#endif -using IBatisNet.Common.Test.Domain; -using IBatisNet.Common.Utilities; -using NUnit.Framework; - -namespace IBatisNet.Common.Test.NUnit.CommonTests.Utilities -{ - [TestFixture] - public class TypeUtilsTest - { - -#if dotnet2 - - - /// - /// Test IsImplementGenericIListInterface. - /// - [Test] - public void IsImplementGenericIListInterfaceOnIList() - { - Type memberType = typeof(IList); - - bool isGenericIList = TypeUtils.IsImplementGenericIListInterface(memberType); - Assert.IsTrue(isGenericIList); - - //Console.Write(typeof(IList).IsAssignableFrom(typeof(Array))); - } - - /// - /// Test IsImplementGenericIListInterface. - /// - [Test] - public void IsImplementGenericIListInterfaceOnList() - { - //GenericDocumentCollection documents = new GenericDocumentCollection(); - Type memberType = typeof(List); - - bool isGenericIList = TypeUtils.IsImplementGenericIListInterface(memberType); - - Assert.IsTrue(isGenericIList); - } - - /// - /// Test IsImplementGenericIListInterface. - /// - [Test] - public void IsImplementGenericIListInterfaceOnCustomList() - { - Type memberType = typeof(GenericDocumentCollection); - - bool isGenericIList = TypeUtils.IsImplementGenericIListInterface(memberType); - - Assert.IsTrue(isGenericIList); - } - - /// - /// Test IsImplementGenericIListInterface. - /// - [Test] - public void IsImplementGenericIListInterfaceOnArray() - { - Type memberType = typeof(Document[]); - - bool isGenericIList = TypeUtils.IsImplementGenericIListInterface(memberType); - - Assert.IsTrue(isGenericIList); - } - - /// - /// Test IsImplementGenericIListInterface. - /// - [Test] - public void IsImplementGenericIListInterfaceOnInt() - { - Type memberType = typeof(int); - - bool isGenericIList = TypeUtils.IsImplementGenericIListInterface(memberType); - - Assert.IsFalse(isGenericIList); - } -#endif - } -} diff --git a/src/IBatisNet.Common.Test/ReadMe.txt b/src/IBatisNet.Common.Test/ReadMe.txt deleted file mode 100644 index fc2f93b..0000000 --- a/src/IBatisNet.Common.Test/ReadMe.txt +++ /dev/null @@ -1,12 +0,0 @@ - -To pass tests for MS Sql Server ------------------------------- -1/ Create the database with the script 'scripts\MSSQL\DBCreation.sql' - -2/ In 'bin/IBatisNet.Test.dll.config' : - set the database to MSSQL, - set the providerType key to a provider : - - 'SqlClient' to run test via native .Net provider for Sql Server. - - 'Oledb' to run test via Oledb provider for Sql Server. - - 'Odbc' to run test via Odbc provider for Sql Server. - \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Access/DataBase.sql b/src/IBatisNet.Common.Test/Scripts/Access/DataBase.sql deleted file mode 100644 index 02a1f4b..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/DataBase.sql +++ /dev/null @@ -1,80 +0,0 @@ -/* Certain queries must be run through ADO since Access does not - recognize some SQL DDL keywords/data types (such as DECIMAL - or DEFAULT) through the Access SQL Query window */ - -drop table ACCOUNTS; - -drop table CATEGORIES; - -drop table ENUMERATIONS; - -drop table LINEITEMS; - -drop table ORDERS; - -drop table OTHERS; - -create table ACCOUNTS -( - [ACCOUNT_ID] long not null, - [ACCOUNT_FIRSTNAME] text(32) not null, - [ACCOUNT_LASTNAME] text(32) not null, - [ACCOUNT_EMAIL] text(128), - constraint pkAccounts - primary key ([ACCOUNT_ID]) -); - -create table CATEGORIES -( - [CATEGORY_ID] counter not null, - [CATEGORY_NAME] text(32), - [CATEGORY_GUID] guid, - constraint pkCategories - primary key ([CATEGORY_ID]) -); - -create table ENUMERATIONS -( - [ENUM_ID] long not null, - [ENUM_DAY] long not null, - [ENUM_COLOR] long not null, - [ENUM_MONTH] long, - constraint pkEnumerations - primary key ([ENUM_ID]) -); - -create table LINEITEMS -( - [LINEITEM_ID] long not null, - [ORDER_ID] long not null, - [LINEITEM_CODE] text(32) not null, - [LINEITEM_QUANTITY] long not null, - [LINEITEM_PRICE] decimal(18,2), - [LINEITEM_PICTURE] longbinary, - constraint pkLineItems - primary key ([ORDER_ID], [LINEITEM_ID]) -); - -create table ORDERS -( - [ORDER_ID] long not null, - [ACCOUNT_ID] long not null, - [ORDER_DATE] datetime, - [ORDER_CARDTYPE] text(32), - [ORDER_CARDNUMBER] text(32), - [ORDER_CARDEXPIRY] text(32), - [ORDER_STREET] text(32), - [ORDER_CITY] text(32), - [ORDER_PROVINCE] text(32), - [ORDER_POSTALCODE] text(32), - [ORDER_FAVOURITELINEITEM] long, - constraint pkOrders - primary key ([ORDER_ID]) -); - -create table OTHERS -( - OTHER_INT long, - OTHER_LONG decimal -); - diff --git a/src/IBatisNet.Common.Test/Scripts/Access/DataBaseNHibernate.sql b/src/IBatisNet.Common.Test/Scripts/Access/DataBaseNHibernate.sql deleted file mode 100644 index cdb212a..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/DataBaseNHibernate.sql +++ /dev/null @@ -1,16 +0,0 @@ -/* Certain queries must be run through ADO since Access does not - recognize some SQL DDL keywords/data types (such as DECIMAL - or DEFAULT) through the Access SQL Query window */ - -drop table USERS; - -create table USERS -( - [LOGONID] text(20) not null default 0, - [NAME] text(40) default null, - [PASSWORD] text(20) default null, - [EMAILADDRESS] text(40) default null, - [LASTLOGON] datetime default null, - constraint pkUsers - primary key ([LOGONID]) -); diff --git a/src/IBatisNet.Common.Test/Scripts/Access/account-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/account-init.sql deleted file mode 100644 index 50e2776..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/account-init.sql +++ /dev/null @@ -1,17 +0,0 @@ -drop table ACCOUNTS; - -create table ACCOUNTS -( - [ACCOUNT_ID] long not null, - [ACCOUNT_FIRSTNAME] text(32) not null, - [ACCOUNT_LASTNAME] text(32) not null, - [ACCOUNT_EMAIL] text(128), - constraint pkAccounts - primary key ([ACCOUNT_ID]) -); - -INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(3,'William', 'Dalton', null); -INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null); \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Access/account-procedure.sql b/src/IBatisNet.Common.Test/Scripts/Access/account-procedure.sql deleted file mode 100644 index 12c2522..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/account-procedure.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT NULL; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Access/category-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/category-init.sql deleted file mode 100644 index bd3eff2..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/category-init.sql +++ /dev/null @@ -1,10 +0,0 @@ -drop table CATEGORIES; - -create table CATEGORIES -( - [CATEGORY_ID] counter not null, - [CATEGORY_NAME] text(32), - [CATEGORY_GUID] guid, - constraint pkCategories - primary key ([CATEGORY_ID]) -); diff --git a/src/IBatisNet.Common.Test/Scripts/Access/category-procedure.sql b/src/IBatisNet.Common.Test/Scripts/Access/category-procedure.sql deleted file mode 100644 index 12c2522..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/category-procedure.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT NULL; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Access/documents-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/documents-init.sql deleted file mode 100644 index b81c6ca..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/documents-init.sql +++ /dev/null @@ -1,19 +0,0 @@ -drop table DOCUMENTS; - -create table DOCUMENTS -( - [DOCUMENT_ID] long not null, - [DOCUMENT_TITLE] text(32), - [DOCUMENT_TYPE] text(32), - [DOCUMENT_PAGENUMBER] long, - [DOCUMENT_CITY] text(32), - constraint pkAccounts - primary key ([DOCUMENT_ID]) -); - -INSERT INTO Documents VALUES (1, 'The World of Null-A', 'Book', 55, null); -INSERT INTO Documents VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon'); -INSERT INTO Documents VALUES (3, 'Lord of the Rings', 'Book', 3587, null); -INSERT INTO Documents VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris'); -INSERT INTO Documents VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris'); -INSERT INTO Documents VALUES (6, 'Foundation', 'Monograph', 557, null); diff --git a/src/IBatisNet.Common.Test/Scripts/Access/enumeration-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/enumeration-init.sql deleted file mode 100644 index 0e3d8c0..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/enumeration-init.sql +++ /dev/null @@ -1,16 +0,0 @@ -drop table ENUMERATIONS; - -create table ENUMERATIONS -( - [ENUM_ID] long not null, - [ENUM_DAY] long not null, - [ENUM_COLOR] long not null, - [ENUM_MONTH] long, - constraint pkEnumerations - primary key ([ENUM_ID]) -); - -INSERT INTO Enumerations VALUES(1, 1, 1, 128); -INSERT INTO Enumerations VALUES(2, 2, 2, 2048); -INSERT INTO Enumerations VALUES(3, 3, 4, 256); -INSERT INTO Enumerations VALUES(4, 4, 8, null); diff --git a/src/IBatisNet.Common.Test/Scripts/Access/line-item-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/line-item-init.sql deleted file mode 100644 index 2214f25..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/line-item-init.sql +++ /dev/null @@ -1,35 +0,0 @@ -drop table LINEITEMS; - -create table LINEITEMS -( - [LINEITEM_ID] long not null, - [ORDER_ID] long not null, - [LINEITEM_CODE] text(32) not null, - [LINEITEM_QUANTITY] long not null, - [LINEITEM_PRICE] decimal(18,2), - [LINEITEM_PICTURE] longbinary, - constraint pkLineItems - primary key ([ORDER_ID], [LINEITEM_ID]) -); - -INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null); -INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null); -INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null); -INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null); -INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null); -INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null); -INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null); -INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null); -INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null); -INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null); -INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null); -INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null); -INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null); -INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null); -INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null); -INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null); -INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null); -INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null); -INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null); -INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null); - diff --git a/src/IBatisNet.Common.Test/Scripts/Access/more-account-records.sql b/src/IBatisNet.Common.Test/Scripts/Access/more-account-records.sql deleted file mode 100644 index 847bb52..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/more-account-records.sql +++ /dev/null @@ -1,6 +0,0 @@ -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.Common.Test/Scripts/Access/order-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/order-init.sql deleted file mode 100644 index d540562..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/order-init.sql +++ /dev/null @@ -1,30 +0,0 @@ -drop table ORDERS; - -create table ORDERS -( - [ORDER_ID] long not null, - [ACCOUNT_ID] long not null, - [ORDER_DATE] datetime, - [ORDER_CARDTYPE] text(32), - [ORDER_CARDNUMBER] text(32), - [ORDER_CARDEXPIRY] text(32), - [ORDER_STREET] text(32), - [ORDER_CITY] text(32), - [ORDER_PROVINCE] text(32), - [ORDER_POSTALCODE] text(32), - [ORDER_FAVOURITELINEITEM] long, - constraint pkOrders - primary key ([ORDER_ID]) -); - -INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); - diff --git a/src/IBatisNet.Common.Test/Scripts/Access/other-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/other-init.sql deleted file mode 100644 index 2acb011..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/other-init.sql +++ /dev/null @@ -1,10 +0,0 @@ -drop table OTHERS; - -create table OTHERS -( - OTHER_INT long, - OTHER_LONG decimal -); - -INSERT INTO Others VALUES(1, 8888888); -INSERT INTO Others VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Access/swap-procedure.sql b/src/IBatisNet.Common.Test/Scripts/Access/swap-procedure.sql deleted file mode 100644 index 12c2522..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/swap-procedure.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT NULL; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Access/user-init.sql b/src/IBatisNet.Common.Test/Scripts/Access/user-init.sql deleted file mode 100644 index 00d9f6d..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Access/user-init.sql +++ /dev/null @@ -1,12 +0,0 @@ -drop table USERS; - -create table USERS -( - [LOGONID] text(20) not null default 0, - [NAME] text(40) default null, - [PASSWORD] text(20) default null, - [EMAILADDRESS] text(40) default null, - [LASTLOGON] datetime default null, - constraint pkUsers - primary key ([LOGONID]) -); diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/DBCreation.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/DBCreation.sql deleted file mode 100644 index b4e017d..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/DBCreation.sql +++ /dev/null @@ -1,89 +0,0 @@ --- MSQL DATABASE - -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet') - DROP DATABASE [IBatisNet] -GO - -CREATE DATABASE [IBatisNet] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'IBatisNet', N'autoclose', N'true' -GO - -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false' -GO - -exec sp_dboption N'IBatisNet', N'trunc. log', N'true' -GO - -exec sp_dboption N'IBatisNet', N'torn page detection', N'true' -GO - -exec sp_dboption N'IBatisNet', N'read only', N'false' -GO - -exec sp_dboption N'IBatisNet', N'dbo use', N'false' -GO - -exec sp_dboption N'IBatisNet', N'single', N'false' -GO - -exec sp_dboption N'IBatisNet', N'autoshrink', N'true' -GO - -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false' -GO - -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false' -GO - -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false' -GO - -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true' -GO - -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'IBatisNet', N'db chaining', N'false' -GO - -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') - exec sp_droplogin N'IBatisNet' -GO - -use [IBatisNet] -GO - -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english' - exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382) - EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet' -GO - -exec sp_addrolemember N'db_owner', N'IBatisNet' -GO \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/DataBase.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/DataBase.sql deleted file mode 100644 index 75a1f97..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/DataBase.sql +++ /dev/null @@ -1,179 +0,0 @@ --- MSQL DATABASE 'IBatisNet' - -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet') - DROP DATABASE [IBatisNet] -GO - -CREATE DATABASE [IBatisNet] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'IBatisNet', N'autoclose', N'true' -GO - -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false' -GO - -exec sp_dboption N'IBatisNet', N'trunc. log', N'true' -GO - -exec sp_dboption N'IBatisNet', N'torn page detection', N'true' -GO - -exec sp_dboption N'IBatisNet', N'read only', N'false' -GO - -exec sp_dboption N'IBatisNet', N'dbo use', N'false' -GO - -exec sp_dboption N'IBatisNet', N'single', N'false' -GO - -exec sp_dboption N'IBatisNet', N'autoshrink', N'true' -GO - -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false' -GO - -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false' -GO - -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false' -GO - -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true' -GO - -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'IBatisNet', N'db chaining', N'false' -GO - -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') - exec sp_droplogin N'IBatisNet' -GO - -use [IBatisNet] -GO - -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english' - exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382) - EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet' -GO - -exec sp_addrolemember N'db_owner', N'IBatisNet' -GO - --- MSQL DATABASE 'NHibernate' - -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'NHibernate') - DROP DATABASE [NHibernate] -GO - -CREATE DATABASE [NHibernate] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'NHibernate', N'autoclose', N'true' -GO - -exec sp_dboption N'NHibernate', N'bulkcopy', N'false' -GO - -exec sp_dboption N'NHibernate', N'trunc. log', N'true' -GO - -exec sp_dboption N'NHibernate', N'torn page detection', N'true' -GO - -exec sp_dboption N'NHibernate', N'read only', N'false' -GO - -exec sp_dboption N'NHibernate', N'dbo use', N'false' -GO - -exec sp_dboption N'NHibernate', N'single', N'false' -GO - -exec sp_dboption N'NHibernate', N'autoshrink', N'true' -GO - -exec sp_dboption N'NHibernate', N'ANSI null default', N'false' -GO - -exec sp_dboption N'NHibernate', N'recursive triggers', N'false' -GO - -exec sp_dboption N'NHibernate', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'NHibernate', N'concat null yields null', N'false' -GO - -exec sp_dboption N'NHibernate', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'NHibernate', N'default to local cursor', N'false' -GO - -exec sp_dboption N'NHibernate', N'quoted identifier', N'false' -GO - -exec sp_dboption N'NHibernate', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'NHibernate', N'auto create statistics', N'true' -GO - -exec sp_dboption N'NHibernate', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'NHibernate', N'db chaining', N'false' -GO - -if exists (select * from master.dbo.syslogins where loginname = N'NHibernate') - exec sp_droplogin N'NHibernate' -GO - -use [NHibernate] -GO - -if not exists (select * from master.dbo.syslogins where loginname = N'NHibernate') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'NHibernate', @loginpass=N'test', @loginlang = N'us_english' - exec sp_addlogin N'NHibernate', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'NHibernate' and uid < 16382) - EXEC sp_grantdbaccess N'NHibernate', N'NHibernate' -GO - -exec sp_addrolemember N'db_owner', N'NHibernate' -GO \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/account-init.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/account-init.sql deleted file mode 100644 index 9c3b52e..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/account-init.sql +++ /dev/null @@ -1,45 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Accounts]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Accounts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) - ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Accounts - - drop table [dbo].[Accounts] -END - -CREATE TABLE [dbo].[Accounts] ( - [Account_ID] [int] NOT NULL , - [Account_FirstName] [varchar] (32) NOT NULL , - [Account_LastName] [varchar] (32) NOT NULL , - [Account_Email] [varchar] (128) NULL, - [Account_Banner_Option] [varchar] (255), - [Account_Cart_Option] [int] -) ON [PRIMARY] - -ALTER TABLE [dbo].[Accounts] WITH NOCHECK ADD - CONSTRAINT [PK_Account] PRIMARY KEY CLUSTERED - ( - [Account_ID] - ) ON [PRIMARY] - --- Creating Test Data - -INSERT INTO [dbo].[Accounts] VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200); -INSERT INTO [dbo].[Accounts] VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200); -INSERT INTO [dbo].[Accounts] VALUES(3,'William', 'Dalton', null, 'Non', 100); -INSERT INTO [dbo].[Accounts] VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100); -INSERT INTO [dbo].[Accounts] VALUES(5,'Gilles', 'Bayon', null, 'Oui', 100); - --- Store procedure - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[ps_InsertAccount] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[ps_SelectAccount] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_swap_email_address]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[ps_swap_email_address] \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/account-procedure.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/account-procedure.sql deleted file mode 100644 index 292c5f1..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/account-procedure.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE PROCEDURE dbo.[sp_InsertAccount] -@Account_ID [int], -@Account_FirstName [nvarchar] (40), -@Account_LastName [varchar] (32), -@Account_Email [varchar] (128) -AS -insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) -values - (@Account_ID, @Account_FirstName, @Account_LastName, @Account_Email) - diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/category-init.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/category-init.sql deleted file mode 100644 index 3dbd888..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/category-init.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Categories] - -CREATE TABLE [dbo].[Categories] ( - [Category_Id] [int] IDENTITY (1, 1) NOT NULL , - [Category_Name] [varchar] (32) NULL, - [Category_Guid] [uniqueidentifier] NULL -) ON [PRIMARY] - --- Store procedure - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_InsertCategorie]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[sp_InsertCategorie] diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/category-procedure.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/category-procedure.sql deleted file mode 100644 index b6202a4..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/category-procedure.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE PROCEDURE dbo.[sp_InsertCategorie] -@Category_Id [int] output, -@Category_Name [varchar] (32), -@Category_Guid [uniqueidentifier] -AS -insert into Categories - (Category_Name, Category_Guid ) -values - (@Category_Name, @Category_Guid) -SELECT @Category_Id = SCOPE_IDENTITY() \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/enumeration-init.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/enumeration-init.sql deleted file mode 100644 index 65b1e26..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/enumeration-init.sql +++ /dev/null @@ -1,30 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Enumerations]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - drop table [dbo].[Enumerations] -END - -CREATE TABLE [dbo].[Enumerations] ( - [Enum_ID] [int] NOT NULL , - [Enum_Day] [int] NOT NULL , - [Enum_Color] [int] NOT NULL, - [Enum_Month] [int] NULL -) ON [PRIMARY] - -ALTER TABLE [dbo].[Enumerations] WITH NOCHECK ADD - CONSTRAINT [PK_Enum] PRIMARY KEY CLUSTERED - ( - [Enum_ID] - ) ON [PRIMARY] - --- Creating Test Data - -INSERT INTO [dbo].[Enumerations] VALUES(1, 1, 1, 128); -INSERT INTO [dbo].[Enumerations] VALUES(2, 2, 2, 2048); -INSERT INTO [dbo].[Enumerations] VALUES(3, 3, 4, 256); -INSERT INTO [dbo].[Enumerations] VALUES(4, 4, 8, null); - - diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/line-item-init.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/line-item-init.sql deleted file mode 100644 index e25a49d..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/line-item-init.sql +++ /dev/null @@ -1,53 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LineItems]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[LineItems] - -CREATE TABLE [dbo].[LineItems] ( - [LineItem_ID] [int] NOT NULL , - [Order_ID] [int] NOT NULL , - [LineItem_Code] [varchar] (32) NOT NULL , - [LineItem_Quantity] [int] NOT NULL , - [LineItem_Price] [decimal](18, 2) NULL, - [LineItem_Picture] [image] null -) ON [PRIMARY] - -ALTER TABLE [dbo].[LineItems] WITH NOCHECK ADD - CONSTRAINT [PK_LinesItem] PRIMARY KEY CLUSTERED - ( - [LineItem_ID], - [Order_ID] - ) ON [PRIMARY] - -ALTER TABLE [dbo].[LineItems] ADD - CONSTRAINT [FK_LineItems_Orders] FOREIGN KEY - ( - [Order_ID] - ) REFERENCES [dbo].[Orders] ( - [Order_ID] - ) --- Creating Test Data - -INSERT INTO [dbo].[LineItems] VALUES (1, 10, 'ESM-34', 1, 45.43, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 10, 'QSM-98', 8, 8.40, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 9, 'DSM-78', 2, 45.40, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 9, 'TSM-12', 2, 32.12, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 8, 'DSM-16', 4, 41.30, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 8, 'GSM-65', 1, 2.20, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 7, 'WSM-27', 7, 52.10, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 7, 'ESM-23', 2, 123.34, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 6, 'QSM-39', 9, 12.12, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 6, 'ASM-45', 6, 78.77, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 5, 'ESM-48', 3, 43.87, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 5, 'WSM-98', 7, 5.40, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 4, 'RSM-57', 2, 78.90, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 4, 'XSM-78', 9, 2.34, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 3, 'DSM-59', 3, 5.70, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 3, 'DSM-53', 3, 98.78, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 2, 'DSM-37', 4, 7.80, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 2, 'FSM-12', 2, 55.78, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 1, 'ESM-48', 8, 87.60, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 1, 'ESM-23', 1, 55.40, null); - diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/more-account-records.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/more-account-records.sql deleted file mode 100644 index c7dc605..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/more-account-records.sql +++ /dev/null @@ -1,11 +0,0 @@ - - - --- Creating Test Data - -INSERT INTO [dbo].[Accounts] VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO [dbo].[Accounts] VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO [dbo].[Accounts] VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO [dbo].[Accounts] VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO [dbo].[Accounts] VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/order-init.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/order-init.sql deleted file mode 100644 index 648eda6..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/order-init.sql +++ /dev/null @@ -1,53 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) - ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders - - drop table [dbo].[Orders] -END - -CREATE TABLE [dbo].[Orders] ( - [Order_ID] [int] NOT NULL , - [Account_ID] [int] NOT NULL , - [Order_Date] [datetime] NULL , - [Order_CardType] [varchar] (32) NULL , - [Order_CardNumber] [varchar] (32) NULL , - [Order_CardExpiry] [varchar] (32) NULL , - [Order_Street] [varchar] (32) NULL , - [Order_City] [varchar] (32) NULL , - [Order_Province] [varchar] (32) NULL , - [Order_PostalCode] [varchar] (32) NULL , - [Order_FavouriteLineItem] [int] NULL -) ON [PRIMARY] - -ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD - CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED - ( - [Order_ID] - ) ON [PRIMARY] - - -ALTER TABLE [dbo].[Orders] ADD - CONSTRAINT [FK_Orders_Accounts] FOREIGN KEY - ( - [Account_ID] - ) REFERENCES [dbo].[Accounts] ( - [Account_ID] - ) --- Creating Test Data -- 2003-02-15 8:15:00/ 2003-02-15 8:15:00 - -INSERT INTO [dbo].[Orders] VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO [dbo].[Orders] VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO [dbo].[Orders] VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO [dbo].[Orders] VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO [dbo].[Orders] VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO [dbo].[Orders] VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO [dbo].[Orders] VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO [dbo].[Orders] VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO [dbo].[Orders] VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO [dbo].[Orders] VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); - diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/other-init.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/other-init.sql deleted file mode 100644 index eaff2e2..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/other-init.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Others]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - drop table [dbo].[Others] -END - -CREATE TABLE [dbo].[Others] ( - [Other_Int] [int] NULL , - [Other_Long] [BigInt] NULL -) ON [PRIMARY] - --- Creating Test Data - -INSERT INTO [dbo].[Others] VALUES(1, 8888888); -INSERT INTO [dbo].[Others] VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/swap-procedure.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/swap-procedure.sql deleted file mode 100644 index 981ffc5..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/swap-procedure.sql +++ /dev/null @@ -1,34 +0,0 @@ -CREATE PROCEDURE dbo.[ps_swap_email_address] -@First_Email [nvarchar] (64) output, -@Second_Email [nvarchar] (64) output -AS - -Declare @ID1 int -Declare @ID2 int - -Declare @Email1 [nvarchar] (64) -Declare @Email2 [nvarchar] (64) - - SELECT @ID1 = Account_ID, @Email1 = Account_Email - from Accounts - where Account_Email = @First_Email - - SELECT @ID2 = Account_ID, @Email2 = Account_Email - from Accounts - where Account_Email = @Second_Email - - UPDATE Accounts - set Account_Email = @Email2 - where Account_ID = @ID1 - - UPDATE Accounts - set Account_Email = @Email1 - where Account_ID = @ID2 - - SELECT @First_Email = Account_Email - from Accounts - where Account_ID = @ID1 - - SELECT @Second_Email = Account_Email - from Accounts - where Account_ID = @ID2 diff --git a/src/IBatisNet.Common.Test/Scripts/MSSQL/user-init.sql b/src/IBatisNet.Common.Test/Scripts/MSSQL/user-init.sql deleted file mode 100644 index 7551da4..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MSSQL/user-init.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Creating Table - -use [NHibernate] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - drop table [dbo].[Users] -END - -CREATE TABLE [dbo].[Users] ( - LogonID nvarchar(20) NOT NULL default '0', - Name nvarchar(40) default NULL, - Password nvarchar(20) default NULL, - EmailAddress nvarchar(40) default NULL, - LastLogon datetime default NULL, - PRIMARY KEY (LogonID) -) diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/DataBase.sql b/src/IBatisNet.Common.Test/Scripts/MySql/DataBase.sql deleted file mode 100644 index 989f260..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/DataBase.sql +++ /dev/null @@ -1,132 +0,0 @@ -use mysql; - -drop database iBatisNet; -create database iBatisNet; - -drop database NHibernate; -create database NHibernate; - -grant all privileges on iBatisNet.* to IBatisNet@'%' identified by 'test'; -grant all privileges on iBatisNet.* to IBatisNet@localhost identified by 'test'; -grant all privileges on iBatisNet.* to IBatisNet@localhost.localdomain identified by 'test'; - -grant all privileges on NHibernate.* to NHibernate@'%' identified by 'test'; -grant all privileges on NHibernate.* to NHibernate@localhost identified by 'test'; -grant all privileges on NHibernate.* to NHibernate@localhost.localdomain identified by 'test'; - - -/*==============================================================*/ -/* Nom de la base : MYSQL */ -/* Nom de SGBD : MySQL 3.23 */ -/* Date de cration : 27/05/2004 20:51:40 */ -/*==============================================================*/ - -use iBatisNet; - -drop table if exists ACCOUNTS; - -drop table if exists CATEGORIES; - -drop table if exists ENUMERATIONS; - -drop table if exists LINEITEMS; - -drop table if exists ORDERS; - -drop table if exists OTHERS; - -/*==============================================================*/ -/* Table : ACCOUNTS */ -/*==============================================================*/ -create table ACCOUNTS -( - ACCOUNT_ID int not null, - ACCOUNT_FIRSTNAME varchar(32) not null, - ACCOUNT_LASTNAME varchar(32) not null, - ACCOUNT_EMAIL varchar(128), - primary key (ACCOUNT_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : CATEGORIES */ -/*==============================================================*/ -create table CATEGORIES -( - CATEGORY_ID int not null AUTO_INCREMENT, - CATEGORY_NAME varchar(32), - CATEGORY_GUID varchar(36), - primary key (CATEGORY_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : ENUMERATIONS */ -/*==============================================================*/ -create table ENUMERATIONS -( - ENUM_ID int not null, - ENUM_DAY int not null, - ENUM_COLOR int not null, - ENUM_MONTH int, - primary key (ENUM_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : LINEITEMS */ -/*==============================================================*/ -create table LINEITEMS -( - LINEITEM_ID int not null, - ORDER_ID int not null, - LINEITEM_CODE varchar(32) not null, - LINEITEM_QUANTITY int not null, - LINEITEM_PRICE decimal(18,2), - LINEITEM_PICTURE blob, - primary key (ORDER_ID, LINEITEM_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : ORDERS */ -/*==============================================================*/ -create table ORDERS -( - ORDER_ID int not null, - ACCOUNT_ID int not null, - ORDER_DATE datetime, - ORDER_CARDTYPE varchar(32), - ORDER_CARDNUMBER varchar(32), - ORDER_CARDEXPIRY varchar(32), - ORDER_STREET varchar(32), - ORDER_CITY varchar(32), - ORDER_PROVINCE varchar(32), - ORDER_POSTALCODE varchar(32), - ORDER_FAVOURITELINEITEM int, - primary key (ORDER_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : OTHERS */ -/*==============================================================*/ -create table OTHERS -( - OTHER_INT int, - OTHER_LONG bigint -) TYPE=INNODB; - - - -use NHibernate; - -drop table if exists USERS; - -/*==============================================================*/ -/* Table : USERS */ -/*==============================================================*/ -create table USERS -( - LOGONID varchar(20) not null default '0', - NAME varchar(40) default null, - PASSWORD varchar(20) default null, - EMAILADDRESS varchar(40) default null, - LASTLOGON datetime default null, - primary key (LOGONID) -) TYPE=INNODB; diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/account-init.sql b/src/IBatisNet.Common.Test/Scripts/MySql/account-init.sql deleted file mode 100644 index bedca8d..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/account-init.sql +++ /dev/null @@ -1,18 +0,0 @@ -use iBatisNet; - -drop table if exists ACCOUNTS; - -create table ACCOUNTS -( - ACCOUNT_ID int not null, - ACCOUNT_FIRSTNAME varchar(32) not null, - ACCOUNT_LASTNAME varchar(32) not null, - ACCOUNT_EMAIL varchar(128), - primary key (ACCOUNT_ID) -) TYPE=INNODB; - -INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(3,'William', 'Dalton', null); -INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null); \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/account-procedure.sql b/src/IBatisNet.Common.Test/Scripts/MySql/account-procedure.sql deleted file mode 100644 index ea067ad..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/account-procedure.sql +++ /dev/null @@ -1,2 +0,0 @@ - -use iBatisNet; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/category-init.sql b/src/IBatisNet.Common.Test/Scripts/MySql/category-init.sql deleted file mode 100644 index 20021b2..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/category-init.sql +++ /dev/null @@ -1,12 +0,0 @@ - -use iBatisNet; - -drop table if exists CATEGORIES; - -create table CATEGORIES -( - CATEGORY_ID int not null AUTO_INCREMENT, - CATEGORY_NAME varchar(32), - CATEGORY_GUID varchar(36), - primary key (CATEGORY_ID) -) TYPE=INNODB; diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/category-procedure.sql b/src/IBatisNet.Common.Test/Scripts/MySql/category-procedure.sql deleted file mode 100644 index ea067ad..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/category-procedure.sql +++ /dev/null @@ -1,2 +0,0 @@ - -use iBatisNet; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/enumeration-init.sql b/src/IBatisNet.Common.Test/Scripts/MySql/enumeration-init.sql deleted file mode 100644 index 3b3de8d..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/enumeration-init.sql +++ /dev/null @@ -1,18 +0,0 @@ - -use iBatisNet; - -drop table if exists ENUMERATIONS; - -create table ENUMERATIONS -( - ENUM_ID int not null, - ENUM_DAY int not null, - ENUM_COLOR int not null, - ENUM_MONTH int, - primary key (ENUM_ID) -) TYPE=INNODB; - -INSERT INTO Enumerations VALUES(1, 1, 1, 128); -INSERT INTO Enumerations VALUES(2, 2, 2, 2048); -INSERT INTO Enumerations VALUES(3, 3, 4, 256); -INSERT INTO Enumerations VALUES(4, 4, 8, null); diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/line-item-init.sql b/src/IBatisNet.Common.Test/Scripts/MySql/line-item-init.sql deleted file mode 100644 index b7c8f7d..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/line-item-init.sql +++ /dev/null @@ -1,37 +0,0 @@ - -use iBatisNet; - -drop table if exists LINEITEMS; - -create table LINEITEMS -( - LINEITEM_ID int not null, - ORDER_ID int not null, - LINEITEM_CODE varchar(32) not null, - LINEITEM_QUANTITY int not null, - LINEITEM_PRICE decimal(18,2), - LINEITEM_PICTURE blob, - primary key (ORDER_ID, LINEITEM_ID) -) TYPE=INNODB; - -INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null); -INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null); -INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null); -INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null); -INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null); -INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null); -INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null); -INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null); -INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null); -INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null); -INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null); -INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null); -INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null); -INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null); -INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null); -INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null); -INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null); -INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null); -INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null); -INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null); - diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/more-account-records.sql b/src/IBatisNet.Common.Test/Scripts/MySql/more-account-records.sql deleted file mode 100644 index b399b8c..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/more-account-records.sql +++ /dev/null @@ -1,7 +0,0 @@ - -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/order-init.sql b/src/IBatisNet.Common.Test/Scripts/MySql/order-init.sql deleted file mode 100644 index 87aa370..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/order-init.sql +++ /dev/null @@ -1,29 +0,0 @@ -drop table if exists ORDERS; - -create table ORDERS -( - ORDER_ID int not null, - ACCOUNT_ID int not null, - ORDER_DATE datetime, - ORDER_CARDTYPE varchar(32), - ORDER_CARDNUMBER varchar(32), - ORDER_CARDEXPIRY varchar(32), - ORDER_STREET varchar(32), - ORDER_CITY varchar(32), - ORDER_PROVINCE varchar(32), - ORDER_POSTALCODE varchar(32), - ORDER_FAVOURITELINEITEM int, - primary key (ORDER_ID) -) TYPE=INNODB; - -INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); - diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/other-init.sql b/src/IBatisNet.Common.Test/Scripts/MySql/other-init.sql deleted file mode 100644 index bc7375c..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/other-init.sql +++ /dev/null @@ -1,13 +0,0 @@ - -use iBatisNet; - -drop table if exists OTHERS; - -create table OTHERS -( - OTHER_INT int, - OTHER_LONG bigint -) TYPE=INNODB; - -INSERT INTO Others VALUES(1, 8888888); -INSERT INTO Others VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/swap-procedure.sql b/src/IBatisNet.Common.Test/Scripts/MySql/swap-procedure.sql deleted file mode 100644 index ea067ad..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/swap-procedure.sql +++ /dev/null @@ -1,2 +0,0 @@ - -use iBatisNet; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/MySql/user-init.sql b/src/IBatisNet.Common.Test/Scripts/MySql/user-init.sql deleted file mode 100644 index db947b5..0000000 --- a/src/IBatisNet.Common.Test/Scripts/MySql/user-init.sql +++ /dev/null @@ -1,14 +0,0 @@ - -use NHibernate; - -drop table if exists USERS; - -create table USERS -( - LOGONID varchar(20) not null default '0', - NAME varchar(40) default null, - PASSWORD varchar(20) default null, - EMAILADDRESS varchar(40) default null, - LASTLOGON datetime default null, - primary key (LOGONID) -) TYPE=INNODB; diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/DataBase.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/DataBase.sql deleted file mode 100644 index 6d8f454..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/DataBase.sql +++ /dev/null @@ -1,128 +0,0 @@ -/*==============================================================*/ -/* Nom de la base : ORACLE */ -/* Nom de SGBD : ORACLE Version 9i */ -/* Date de cration : 27/05/2004 20:55:37 */ -/*==============================================================*/ - - -DROP TABLE ACCOUNTS CASCADE CONSTRAINTS; - -DROP TABLE CATEGORIES CASCADE CONSTRAINTS; - -DROP TABLE ENUMERATIONS CASCADE CONSTRAINTS; - -DROP TABLE LINEITEMS CASCADE CONSTRAINTS; - -DROP TABLE ORDERS CASCADE CONSTRAINTS; - -DROP TABLE OTHERS CASCADE CONSTRAINTS; - -DROP SEQUENCE S_CATEGORIES; - -CREATE SEQUENCE S_CATEGORIES - START WITH 1 - MAXVALUE 1E27 - MINVALUE 1 - NOCYCLE - CACHE 20 - NOORDER; - -/*==============================================================*/ -/* Table : ACCOUNTS */ -/*==============================================================*/ - - -CREATE TABLE ACCOUNTS ( - ACCOUNT_ID INTEGER NOT NULL, - ACCOUNT_FIRSTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_LASTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_EMAIL VARCHAR2(128), - CONSTRAINT PK_ACCOUNTS PRIMARY KEY (ACCOUNT_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : CATEGORIES */ -/*==============================================================*/ - - -CREATE TABLE CATEGORIES ( - CATEGORY_ID NUMBER(6) NOT NULL, - CATEGORY_NAME VARCHAR2(32), - CATEGORY_GUID VARCHAR2(36) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : ENUMERATIONS */ -/*==============================================================*/ - - -CREATE TABLE ENUMERATIONS ( - ENUM_ID INTEGER NOT NULL, - ENUM_DAY INTEGER NOT NULL, - ENUM_COLOR INTEGER NOT NULL, - ENUM_MONTH INTEGER, - CONSTRAINT PK_ENUMERATIONS PRIMARY KEY (ENUM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : LINEITEMS */ -/*==============================================================*/ - - -CREATE TABLE LINEITEMS ( - LINEITEM_ID INTEGER NOT NULL, - ORDER_ID INTEGER NOT NULL, - LINEITEM_CODE VARCHAR2(32) NOT NULL, - LINEITEM_QUANTITY INTEGER NOT NULL, - LINEITEM_PRICE NUMBER(18,2), - LINEITEM_PICTURE BLOB, - CONSTRAINT PK_LINEITEMS PRIMARY KEY (ORDER_ID, LINEITEM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : ORDERS */ -/*==============================================================*/ - - -CREATE TABLE ORDERS ( - ORDER_ID INTEGER NOT NULL, - ACCOUNT_ID INTEGER NOT NULL, - ORDER_DATE DATE, - ORDER_CARDTYPE VARCHAR2(32), - ORDER_CARDNUMBER VARCHAR2(32), - ORDER_CARDEXPIRY VARCHAR2(32), - ORDER_STREET VARCHAR2(32), - ORDER_CITY VARCHAR2(32), - ORDER_PROVINCE VARCHAR2(32), - ORDER_POSTALCODE VARCHAR2(32), - ORDER_FAVOURITELINEITEM INTEGER, - CONSTRAINT PK_ORDERS PRIMARY KEY (ORDER_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : OTHERS */ -/*==============================================================*/ - - -CREATE TABLE OTHERS ( - OTHER_INT INT NULL , - OTHER_LONG INT NULL -) -NOLOGGING -NOCACHE -NOPARALLEL; diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/DataBaseNHibernate.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/DataBaseNHibernate.sql deleted file mode 100644 index 966675b..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/DataBaseNHibernate.sql +++ /dev/null @@ -1,17 +0,0 @@ -DROP TABLE USERS; - -/*==============================================================*/ -/* Table : USERS */ -/*==============================================================*/ - -CREATE TABLE USERS ( - LOGONID NVARCHAR2(20) DEFAULT '0', - NAME NVARCHAR2(40) DEFAULT NULL, - PASSWORD NVARCHAR2(20) DEFAULT NULL, - EMAILADDRESS NVARCHAR2(40) DEFAULT NULL, - LASTLOGON DATE DEFAULT NULL, - CONSTRAINT PK_USERS PRIMARY KEY (LOGONID) -) -NOLOGGING -NOCACHE -NOPARALLEL; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/account-init.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/account-init.sql deleted file mode 100644 index 7289fdc..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/account-init.sql +++ /dev/null @@ -1,18 +0,0 @@ -DROP TABLE ACCOUNTS CASCADE CONSTRAINTS; - -CREATE TABLE ACCOUNTS ( - ACCOUNT_ID INTEGER NOT NULL, - ACCOUNT_FIRSTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_LASTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_EMAIL VARCHAR2(128), - CONSTRAINT PK_ACCOUNTS PRIMARY KEY (ACCOUNT_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO ACCOUNTS VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com'); -INSERT INTO ACCOUNTS VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com'); -INSERT INTO ACCOUNTS VALUES(3,'William', 'Dalton', null); -INSERT INTO ACCOUNTS VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com'); -INSERT INTO ACCOUNTS VALUES(5,'Gilles', 'Bayon', null); diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/account-procedure.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/account-procedure.sql deleted file mode 100644 index 837bb17..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/account-procedure.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE OR REPLACE PROCEDURE prc_InsertAccount ( - p_Account_ID IN INTEGER, - p_Account_FirstName IN VARCHAR2, - p_Account_LastName IN VARCHAR2, - p_Account_Email IN VARCHAR2 ) -IS -BEGIN - INSERT INTO Accounts ( - Account_ID, - Account_FirstName, - Account_LastName, - Account_Email ) - VALUES ( - p_Account_ID, - p_Account_FirstName, - p_Account_LastName, - p_Account_Email ); -END; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/category-init.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/category-init.sql deleted file mode 100644 index d689165..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/category-init.sql +++ /dev/null @@ -1,20 +0,0 @@ -DROP TABLE CATEGORIES CASCADE CONSTRAINTS; - -DROP SEQUENCE S_CATEGORIES; - -CREATE SEQUENCE S_CATEGORIES - START WITH 1 - MAXVALUE 1E27 - MINVALUE 1 - NOCYCLE - CACHE 20 - NOORDER; - -CREATE TABLE CATEGORIES ( - CATEGORY_ID NUMBER(6) NOT NULL, - CATEGORY_NAME VARCHAR2(32), - CATEGORY_GUID VARCHAR2(36) -) -NOLOGGING -NOCACHE -NOPARALLEL; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/category-procedure.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/category-procedure.sql deleted file mode 100644 index b31d742..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/category-procedure.sql +++ /dev/null @@ -1,19 +0,0 @@ -CREATE OR REPLACE PROCEDURE prc_InsertCategory ( - p_Category_Name IN VARCHAR2, - p_Category_Guid IN VARCHAR2, - p_Category_Id OUT INT ) -IS -BEGIN - SELECT S_CATEGORIES.nextval - INTO p_Category_Id - FROM DUAL; - - INSERT INTO Categories ( - Category_Id, - Category_Name, - Category_Guid ) - VALUES ( - p_Category_Id, - p_Category_Name, - p_Category_Guid ); -END; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/enumeration-init.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/enumeration-init.sql deleted file mode 100644 index 20c8d58..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/enumeration-init.sql +++ /dev/null @@ -1,17 +0,0 @@ -DROP TABLE ENUMERATIONS CASCADE CONSTRAINTS; - -CREATE TABLE ENUMERATIONS ( - ENUM_ID INTEGER NOT NULL, - ENUM_DAY INTEGER NOT NULL, - ENUM_COLOR INTEGER NOT NULL, - ENUM_MONTH INTEGER, - CONSTRAINT PK_ENUMERATIONS PRIMARY KEY (ENUM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO ENUMERATIONS VALUES(1, 1, 1, 128); -INSERT INTO ENUMERATIONS VALUES(2, 2, 2, 2048); -INSERT INTO ENUMERATIONS VALUES(3, 3, 4, 256); -INSERT INTO ENUMERATIONS VALUES(4, 4, 8, NULL); diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/line-item-init.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/line-item-init.sql deleted file mode 100644 index 961af88..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/line-item-init.sql +++ /dev/null @@ -1,35 +0,0 @@ -DROP TABLE LINEITEMS CASCADE CONSTRAINTS; - -CREATE TABLE LINEITEMS ( - LINEITEM_ID INTEGER NOT NULL, - ORDER_ID INTEGER NOT NULL, - LINEITEM_CODE VARCHAR2(32) NOT NULL, - LINEITEM_QUANTITY INTEGER NOT NULL, - LINEITEM_PRICE NUMBER(18,2), - LINEITEM_PICTURE BLOB, - CONSTRAINT PK_LINEITEMS PRIMARY KEY (ORDER_ID, LINEITEM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO LINEITEMS VALUES (1, 10, 'ESM-34', 1, 45.43, NULL); -INSERT INTO LINEITEMS VALUES (2, 10, 'QSM-98', 8, 8.40, NULL); -INSERT INTO LINEITEMS VALUES (1, 9, 'DSM-78', 2, 45.40, NULL); -INSERT INTO LINEITEMS VALUES (2, 9, 'TSM-12', 2, 32.12, NULL); -INSERT INTO LINEITEMS VALUES (1, 8, 'DSM-16', 4, 41.30, NULL); -INSERT INTO LINEITEMS VALUES (2, 8, 'GSM-65', 1, 2.20, NULL); -INSERT INTO LINEITEMS VALUES (1, 7, 'WSM-27', 7, 52.10, NULL); -INSERT INTO LINEITEMS VALUES (2, 7, 'ESM-23', 2, 123.34, NULL); -INSERT INTO LINEITEMS VALUES (1, 6, 'QSM-39', 9, 12.12, NULL); -INSERT INTO LINEITEMS VALUES (2, 6, 'ASM-45', 6, 78.77, NULL); -INSERT INTO LINEITEMS VALUES (1, 5, 'ESM-48', 3, 43.87, NULL); -INSERT INTO LINEITEMS VALUES (2, 5, 'WSM-98', 7, 5.40, NULL); -INSERT INTO LINEITEMS VALUES (1, 4, 'RSM-57', 2, 78.90, NULL); -INSERT INTO LINEITEMS VALUES (2, 4, 'XSM-78', 9, 2.34, NULL); -INSERT INTO LINEITEMS VALUES (1, 3, 'DSM-59', 3, 5.70, NULL); -INSERT INTO LINEITEMS VALUES (2, 3, 'DSM-53', 3, 98.78, NULL); -INSERT INTO LINEITEMS VALUES (1, 2, 'DSM-37', 4, 7.80, NULL); -INSERT INTO LINEITEMS VALUES (2, 2, 'FSM-12', 2, 55.78, NULL); -INSERT INTO LINEITEMS VALUES (1, 1, 'ESM-48', 8, 87.60, NULL); -INSERT INTO LINEITEMS VALUES (2, 1, 'ESM-23', 1, 55.40, NULL); \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/more-account-records.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/more-account-records.sql deleted file mode 100644 index 847bb52..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/more-account-records.sql +++ /dev/null @@ -1,6 +0,0 @@ -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/order-init.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/order-init.sql deleted file mode 100644 index 212626e..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/order-init.sql +++ /dev/null @@ -1,30 +0,0 @@ -DROP TABLE ORDERS CASCADE CONSTRAINTS; - -CREATE TABLE ORDERS ( - ORDER_ID INTEGER NOT NULL, - ACCOUNT_ID INTEGER NOT NULL, - ORDER_DATE DATE, - ORDER_CARDTYPE VARCHAR2(32), - ORDER_CARDNUMBER VARCHAR2(32), - ORDER_CARDEXPIRY VARCHAR2(32), - ORDER_STREET VARCHAR2(32), - ORDER_CITY VARCHAR2(32), - ORDER_PROVINCE VARCHAR2(32), - ORDER_POSTALCODE VARCHAR2(32), - ORDER_FAVOURITELINEITEM INTEGER, - CONSTRAINT PK_ORDERS PRIMARY KEY (ORDER_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO ORDERS VALUES (1, 1, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO ORDERS VALUES (2, 4, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO ORDERS VALUES (3, 3, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO ORDERS VALUES (4, 2, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO ORDERS VALUES (5, 5, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO ORDERS VALUES (6, 5, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO ORDERS VALUES (7, 4, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO ORDERS VALUES (8, 3, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO ORDERS VALUES (9, 2, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO ORDERS VALUES (10, 1, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/other-init.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/other-init.sql deleted file mode 100644 index e9101f3..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/other-init.sql +++ /dev/null @@ -1,12 +0,0 @@ -DROP TABLE OTHERS; - -CREATE TABLE OTHERS ( - OTHER_INT INT NULL , - OTHER_LONG NUMBER NULL -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO OTHERS VALUES(1, 8888888); -INSERT INTO OTHERS VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/swap-procedure.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/swap-procedure.sql deleted file mode 100644 index b9b2e34..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/swap-procedure.sql +++ /dev/null @@ -1,62 +0,0 @@ -CREATE OR REPLACE PROCEDURE prc_SWAP_EMAIL_ADDRESS ( - p_first IN OUT VARCHAR2, - p_second IN OUT VARCHAR2 ) -IS - v_id1 NUMBER (5,0); - v_id2 NUMBER (5,0); - v_email1 VARCHAR2 (255); - v_email2 VARCHAR2 (255); -BEGIN - SELECT - ACCOUNT_ID, - ACCOUNT_EMAIL - INTO v_id1, - v_email1 - FROM - ACCOUNTS - WHERE - ACCOUNT_EMAIL = p_first; - - SELECT - ACCOUNT_ID, - ACCOUNT_EMAIL - INTO - v_id2, - v_email2 - FROM - ACCOUNTS - WHERE - ACCOUNT_EMAIL = p_second; - - UPDATE - ACCOUNTS - SET - ACCOUNT_EMAIL = v_email2 - WHERE - ACCOUNT_ID = v_id1; - - UPDATE - ACCOUNTS - SET - ACCOUNT_EMAIL = v_email1 - WHERE - ACCOUNT_ID = v_id2; - - SELECT - ACCOUNT_EMAIL - INTO - p_first - FROM - ACCOUNTS - WHERE - ACCOUNT_ID = v_id1; - - SELECT - ACCOUNT_EMAIL - INTO - p_second - FROM - ACCOUNTS - WHERE - ACCOUNT_ID = v_id2; -END; \ No newline at end of file diff --git a/src/IBatisNet.Common.Test/Scripts/Oracle/user-init.sql b/src/IBatisNet.Common.Test/Scripts/Oracle/user-init.sql deleted file mode 100644 index c1b1a79..0000000 --- a/src/IBatisNet.Common.Test/Scripts/Oracle/user-init.sql +++ /dev/null @@ -1,13 +0,0 @@ -DROP TABLE USERS; - -CREATE TABLE USERS ( - LOGONID NVARCHAR2(20) DEFAULT '0', - NAME NVARCHAR2(40) DEFAULT NULL, - PASSWORD NVARCHAR2(20) DEFAULT NULL, - EMAILADDRESS NVARCHAR2(40) DEFAULT NULL, - LASTLOGON DATE DEFAULT NULL, - CONSTRAINT PK_USERS PRIMARY KEY (LOGONID) -) -NOLOGGING -NOCACHE -NOPARALLEL; diff --git a/src/IBatisNet.Common.Test/bin/Debug/IBatisNet.Common.Test.dll.config b/src/IBatisNet.Common.Test/bin/Debug/IBatisNet.Common.Test.dll.config deleted file mode 100644 index 56e7a15..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/IBatisNet.Common.Test.dll.config +++ /dev/null @@ -1,94 +0,0 @@ - - - - - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/OctopusService.dll b/src/IBatisNet.Common.Test/bin/Debug/OctopusService.dll deleted file mode 100644 index db50f581dc437ec255c73e50c4db4ab785008469..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16384 zcmeHN&u`pR5FV##*#1ap)E+35;-o182~2)b6-b*+)-6rbG-(|Ig_Rnw*V&kO?Un6~ zx(J~hs06Bz%3lBnjtEr z!5S|@=Jbbq7a+laF^t>a|1dUwsp{*iZWMcAaIAmG80^>GzzNGP@$MUC-=}Kqgpu!+$ZEuiTQ$zROTOzQctmL;j@@d>Z%n(5vv$>;NN{UQ^~5Cu z4^fnLpY;5UyS2}BeY;_KmEiu)mTMvXD`V8s>wn#P~*=4tCM=M+G32TkWt1Kt& zuDJ*&ceZd8!fMS98tpp@VX)*?>XFS9w7X3=b|SB~wR7G}vOF{yH9fl$gmL0IG0ERr z#V%#THr^C!R>q7Q&GJQ`v1_q0WfknGY~YK8Z|lLYhc8?lpS}`*+W7s*FNY}i?R&+A z{iC-&?$kA{hoNJ;-l27LY?mjY3y(D`x#ss9KN<&F*I8?q*7qRM#X=aFzCUAoLHfYB zt~@-v=k8(b?`_|$Rult@0mXn~Krx^gPz)#r6a)W71~lnmpTN(}8>>${WBi=lw$5?< z?%=IF(ExhhmJDngg}Oi%T?C$>^U$Vfmd?VS0-l7;R++S|UXYkp{ap_$sV_y~f zB3coq(%3nvZMK<%?*iA>;)N|{m++)KT#YIBbI2E>^1AHW%)KdmZj9N?>OXVJ_hbSm ziRD}+RNcUx{kM6TS0#!8#eiZ!F`yVw3@8Q^1BwB~fMVd0F`%daGd}q8BfFxykYYeF fpcqgLC - - - - - DataMapper XML Schema Definition - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The document root. - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Access_OleDb.config b/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Access_OleDb.config deleted file mode 100644 index b71d34f..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Access_OleDb.config +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_Odbc.config b/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_Odbc.config deleted file mode 100644 index 9b00da6..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_Odbc.config +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_OleDb.config b/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_OleDb.config deleted file mode 100644 index b04d4b5..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_OleDb.config +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config b/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config deleted file mode 100644 index 3f8f3c3..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MySql_ByteFx.config b/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MySql_ByteFx.config deleted file mode 100644 index 448c6f4..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_MySql_ByteFx.config +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_ODP.config b/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_ODP.config deleted file mode 100644 index 6794537..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_ODP.config +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_OracleClient.config b/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_OracleClient.config deleted file mode 100644 index 5fc7433..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/SqlMap_Oracle_OracleClient.config +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/dao_Access_OleDb.config b/src/IBatisNet.Common.Test/bin/Debug/dao_Access_OleDb.config deleted file mode 100644 index d0c3ac2..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/dao_Access_OleDb.config +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_Odbc.config b/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_Odbc.config deleted file mode 100644 index aa54a13..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_Odbc.config +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_OleDb.config b/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_OleDb.config deleted file mode 100644 index 857b246..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_OleDb.config +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_SqlClient.config b/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_SqlClient.config deleted file mode 100644 index a2275b1..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/dao_MSSQL_SqlClient.config +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/dao_MySql_ByteFx.config b/src/IBatisNet.Common.Test/bin/Debug/dao_MySql_ByteFx.config deleted file mode 100644 index 6f29423..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/dao_MySql_ByteFx.config +++ /dev/null @@ -1,64 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_ODP.config b/src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_ODP.config deleted file mode 100644 index ec1591d..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_ODP.config +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_OracleClient.config b/src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_OracleClient.config deleted file mode 100644 index 0571be1..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/dao_Oracle_OracleClient.config +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/bin/Debug/providers.config b/src/IBatisNet.Common.Test/bin/Debug/providers.config deleted file mode 100644 index 1b6a2d2..0000000 --- a/src/IBatisNet.Common.Test/bin/Debug/providers.config +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common.Test/license.txt b/src/IBatisNet.Common.Test/license.txt deleted file mode 100644 index 85fe608..0000000 --- a/src/IBatisNet.Common.Test/license.txt +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2004 Gilles Bayon - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/IBatisNet.Common.Test/properties.xml b/src/IBatisNet.Common.Test/properties.xml deleted file mode 100644 index d7a2e54..0000000 --- a/src/IBatisNet.Common.Test/properties.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common/AssemblyInfo.cs b/src/IBatisNet.Common/AssemblyInfo.cs deleted file mode 100644 index b8ea650..0000000 --- a/src/IBatisNet.Common/AssemblyInfo.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Reflection; -using System.Security; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -#if dotnet2 -[assembly: CLSCompliant(true)] -[assembly: AssemblyTrademark("Licensed under the Apache License, Version 2.0")] -[assembly: AssemblyCulture("")] - -#endif - diff --git a/src/IBatisNet.Common/AssemblyKey.snk b/src/IBatisNet.Common/AssemblyKey.snk deleted file mode 100644 index 13fbcd622259850c6b38993633871cc83111a6d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098QbZRl6LIc;$@n{&7$%{%X$e8oZQ4P*5 z!Mzz4m;8CA=tPFM`2?{QoOfg2z8y_-v1xBv(z8?oUK+F^L|eW8vPB7S%r3i;JWH0@ z=Z0)jfweo+M|1;az2#0lL>iijqooOKaG1MCTef*Nn_P*W=m9E1I5lC%Ueh#krN_=m zXsJ*BQ(&U#a(|w9tVu#Zlqz?xorz+kmLqQSCxdUdpYNM)TGaC;y|s|2w*sW|&elbC zJ$2XWQL^1WRIl}`Y%2#JYJEQ)B#m`>mEzb9;?{@eTdQk1(la%bUc788JCGs()e$JD0bJOyPk)kh7*d%uHa}8Iwp#~PKN|2sGiKjz-#dLsgIYhmTDjT43f>RzLm@)%<|Jpm2QfD=JIJ-%4=QL8v5LCngTUe+a5q>J^ z-bNmPPt>aQdAWMeA#e+{btwK8%kcnN2&4CmVU*)8fFn_n($&dlbJ#O+op_N^GY=nZ z>A6hS*9uWS3m$X5X1})yK2vD$OYBI6N1VDo<&k5}+;rNRbRX)r&-U{xBALw4VorU` z)MVXeTS!|0&~Xb@Bx)^Q5E$VCrL0Np;3bnB8t{ - /// Information about a data source. - ///
  • The mybatisnet documentation source is in docbook format. More - information on this format and associated tools can be found in the - docbook section of this document. - The complete set of tools required to build the documentation bundle is the - following:

    - [Serializable] - [XmlRoot("dataSource", Namespace="http://ibatis.apache.org/dataMapper")] - public class DataSource : IDataSource - { - - #region Fields - [NonSerialized] - private string _connectionString = string.Empty; - [NonSerialized] - private IDbProvider _provider; - [NonSerialized] - private string _name = string.Empty; - #endregion - - #region Properties - /// - /// The connection string. - /// - [XmlAttribute("connectionString")] - public virtual string ConnectionString - { - get { return _connectionString; } - set - { - CheckPropertyString("ConnectionString", value); - _connectionString = value; - } - } - - /// - /// DataSource Name - /// - [XmlAttribute("name")] - public string Name - { - get { return _name; } - set - { - CheckPropertyString("Name", value); - _name = value; - } - } - - /// - /// The provider to use for this data source. - /// - [XmlIgnore] - public virtual IDbProvider DbProvider - { - get { return _provider; } - set { _provider = value; } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Constructor - /// - public DataSource() - { - } - #endregion - - #region Methods - - private void CheckPropertyString(string propertyName, string value) - { - if (value == null || value.Trim().Length == 0) - { - throw new ArgumentException( - "The "+propertyName+" property cannot be " + - "set to a null or empty string value.", propertyName); - } - } - - /// - /// ToString implementation. - /// - /// A string that describes the data source - public override string ToString() - { - return "Source: ConnectionString : "+ConnectionString; - } - #endregion - - } -} diff --git a/src/IBatisNet.Common/DataSourceDeSerializer.cs b/src/IBatisNet.Common/DataSourceDeSerializer.cs deleted file mode 100644 index 0aa9def..0000000 --- a/src/IBatisNet.Common/DataSourceDeSerializer.cs +++ /dev/null @@ -1,56 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 512878 $ - * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -#endregion - -namespace IBatisNet.Common -{ - /// - /// Summary description for DataSourceDeSerializer. - /// - public sealed class DataSourceDeSerializer - { - /// - /// Deserialize a DataSource object - /// - /// - /// - public static DataSource Deserialize(XmlNode node) - { - DataSource dataSource = new DataSource(); - NameValueCollection prop = NodeUtils.ParseAttributes(node); - - dataSource.ConnectionString = prop["connectionString"]; - dataSource.Name = prop["name"]; - - return dataSource; - } - } -} diff --git a/src/IBatisNet.Common/DbProvider.cs b/src/IBatisNet.Common/DbProvider.cs deleted file mode 100644 index b853f56..0000000 --- a/src/IBatisNet.Common/DbProvider.cs +++ /dev/null @@ -1,673 +0,0 @@ -#region Apache Notice - -/***************************************************************************** - * $Revision: 408099 $ - * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ - -#endregion - -#region Using - -using System; -using System.Data; -using System.Reflection; -using System.Xml.Serialization; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; - -#endregion - -namespace IBatisNet.Common -{ - /// - /// Information about a data provider. - /// - [Serializable] - [XmlRoot("provider", Namespace = "http://ibatis.apache.org/providers")] - public class DbProvider : IDbProvider - { - private const string SQLPARAMETER = "?"; - - #region Fields - - [NonSerialized] private bool _allowMARS; - [NonSerialized] private string _assemblyName = string.Empty; - [NonSerialized] private string _commandBuilderClass = string.Empty; - [NonSerialized] private Type _commandBuilderType; - [NonSerialized] private string _commandClass = string.Empty; - [NonSerialized] private string _connectionClass = string.Empty; - - [NonSerialized] private string _dataAdapterClass = string.Empty; - [NonSerialized] private int _dbCommandTimeOut; - [NonSerialized] private string _description = string.Empty; - [NonSerialized] private bool _isDefault; - [NonSerialized] private bool _isEnabled = true; - [NonSerialized] private string _name = string.Empty; - [NonSerialized] private Type _parameterDbType; - [NonSerialized] private string _parameterDbTypeClass = string.Empty; - [NonSerialized] private string _parameterDbTypeProperty = string.Empty; - [NonSerialized] private string _parameterPrefix = string.Empty; - [NonSerialized] private bool _setDbParameterPrecision = true; - [NonSerialized] private bool _setDbParameterScale = true; - [NonSerialized] private bool _setDbParameterSize = true; - [NonSerialized] private IDbConnection _templateConnection; - [NonSerialized] private bool _templateConnectionIsICloneable; - [NonSerialized] private IDbDataAdapter _templateDataAdapter; - [NonSerialized] private bool _templateDataAdapterIsICloneable; - [NonSerialized] private bool _useDeriveParameters = true; - [NonSerialized] private bool _useParameterPrefixInParameter = true; - [NonSerialized] private bool _useParameterPrefixInSql = true; - [NonSerialized] private bool _usePositionalParameters; - - [NonSerialized] - private string _connectionAdapterClass = string.Empty; - [NonSerialized] - private IConnectionAdapter _connectionAdapter = null; - - // private static readonly ILog _connectionLogger = LogManager.GetLogger("System.Data.IDbConnection"); - - #endregion - - #region Properties - - /// - /// An optional property to specify the DBCommand Timeout for - /// the specified provider. - /// - /// The DB command timeout. - public int DbCommandTimeout - { - get { return _dbCommandTimeOut; } - set { _dbCommandTimeOut = value; } - } - - /// - /// The name of the assembly which conatins the definition of the provider. - /// - /// Examples : "System.Data", "Microsoft.Data.Odbc" - [XmlAttribute("assemblyName")] - public string AssemblyName - { - get { return _assemblyName; } - set - { - CheckPropertyString("AssemblyName", value); - _assemblyName = value; - } - } - - - /// - /// Tell us if it is the default data source. - /// Default false. - /// - [XmlAttribute("default")] - public bool IsDefault - { - get { return _isDefault; } - set { _isDefault = value; } - } - - - /// - /// Tell us if this provider is enabled. - /// Default true. - /// - [XmlAttribute("enabled")] - public bool IsEnabled - { - get { return _isEnabled; } - set { _isEnabled = value; } - } - - /// - /// Tell us if this provider allows having multiple open with - /// the same . - /// - /// - /// It's a new feature in ADO.NET 2.0 and Sql Server 2005 that allows for multiple forward only read only result sets (MARS). - /// Some databases have supported this functionality for a long time : - /// Not Supported : DB2, MySql.Data, OLE DB provider [except Sql Server 2005 when using MDAC 9], SQLite, Obdc - /// Supported : Sql Server 2005, Npgsql - /// - [XmlAttribute("allowMARS")] - public bool AllowMARS - { - get { return _allowMARS; } - set { _allowMARS = value; } - } - - /// - /// The connection class name to use. - /// - /// - /// "System.Data.OleDb.OleDbConnection", - /// "System.Data.SqlClient.SqlConnection", - /// "Microsoft.Data.Odbc.OdbcConnection" - /// - [XmlAttribute("connectionClass")] - public string DbConnectionClass - { - get { return _connectionClass; } - set - { - CheckPropertyString("DbConnectionClass", value); - _connectionClass = value; - } - } - - /// - /// The connection adapter class name to use, if any. - /// - [XmlAttribute("connectionAdapterClass")] - public string ConnectionAdapterClass - { - get { return _connectionAdapterClass; } - set - { - _connectionAdapterClass = value; - } - } - - - /// - /// Does this ConnectionProvider require the use of a Named Prefix in the SQL - /// statement. - /// - /// - /// The OLE DB/ODBC .NET Provider does not support named parameters for - /// passing parameters to an SQL Statement or a stored procedure called - /// by an IDbCommand when CommandType is set to Text. - /// - /// For example, SqlClient requires select * from simple where simple_id = @simple_id - /// If this is false, like with the OleDb or Obdc provider, then it is assumed that - /// the ? can be a placeholder for the parameter in the SQL statement when CommandType - /// is set to Text. - /// - [XmlAttribute("useParameterPrefixInSql")] - public bool UseParameterPrefixInSql - { - get { return _useParameterPrefixInSql; } - set { _useParameterPrefixInSql = value; } - } - - /// - /// Does this ConnectionProvider require the use of the Named Prefix when trying - /// to reference the Parameter in the Command's Parameter collection. - /// - /// - /// This is really only useful when the UseParameterPrefixInSql = true. - /// When this is true the code will look like IDbParameter param = cmd.Parameters["@paramName"], - /// if this is false the code will be IDbParameter param = cmd.Parameters["paramName"] - ie - Oracle. - /// - [XmlAttribute("useParameterPrefixInParameter")] - public bool UseParameterPrefixInParameter - { - get { return _useParameterPrefixInParameter; } - set { _useParameterPrefixInParameter = value; } - } - - /// - /// The OLE DB/OBDC .NET Provider uses positional parameters that are marked with a - /// question mark (?) instead of named parameters. - /// - [XmlAttribute("usePositionalParameters")] - public bool UsePositionalParameters - { - get { return _usePositionalParameters; } - set { _usePositionalParameters = value; } - } - - /// - /// Used to indicate whether or not the provider - /// supports parameter size. - /// - /// - /// See JIRA-49 about SQLite.Net provider not supporting parameter size. - /// - [XmlAttribute("setDbParameterSize")] - public bool SetDbParameterSize - { - get { return _setDbParameterSize; } - set { _setDbParameterSize = value; } - } - - /// - /// Used to indicate whether or not the provider - /// supports parameter precision. - /// - /// - /// See JIRA-49 about SQLite.Net provider not supporting parameter precision. - /// - [XmlAttribute("setDbParameterPrecision")] - public bool SetDbParameterPrecision - { - get { return _setDbParameterPrecision; } - set { _setDbParameterPrecision = value; } - } - - /// - /// Used to indicate whether or not the provider - /// supports a parameter scale. - /// - /// - /// See JIRA-49 about SQLite.Net provider not supporting parameter scale. - /// - [XmlAttribute("setDbParameterScale")] - public bool SetDbParameterScale - { - get { return _setDbParameterScale; } - set { _setDbParameterScale = value; } - } - - /// - /// Used to indicate whether or not the provider - /// supports DeriveParameters method for procedure. - /// - [XmlAttribute("useDeriveParameters")] - public bool UseDeriveParameters - { - get { return _useDeriveParameters; } - set { _useDeriveParameters = value; } - } - - /// - /// The command class name to use. - /// - /// - /// "System.Data.SqlClient.SqlCommand" - /// - [XmlAttribute("commandClass")] - public string DbCommandClass - { - get { return _commandClass; } - set - { - CheckPropertyString("DbCommandClass", value); - _commandClass = value; - } - } - - - /// - /// The ParameterDbType class name to use. - /// - /// - /// "System.Data.SqlDbType" - /// - [XmlAttribute("parameterDbTypeClass")] - public string ParameterDbTypeClass - { - get { return _parameterDbTypeClass; } - set - { - CheckPropertyString("ParameterDbTypeClass", value); - _parameterDbTypeClass = value; - } - } - - - /// - /// The ParameterDbTypeProperty class name to use. - /// - /// - /// SqlDbType in SqlParamater.SqlDbType, - /// OracleType in OracleParameter.OracleType. - /// - [XmlAttribute("parameterDbTypeProperty")] - public string ParameterDbTypeProperty - { - get { return _parameterDbTypeProperty; } - set - { - CheckPropertyString("ParameterDbTypeProperty", value); - _parameterDbTypeProperty = value; - } - } - - /// - /// The dataAdapter class name to use. - /// - /// - /// "System.Data.SqlDbType" - /// - [XmlAttribute("dataAdapterClass")] - public string DataAdapterClass - { - get { return _dataAdapterClass; } - set - { - CheckPropertyString("DataAdapterClass", value); - _dataAdapterClass = value; - } - } - - /// - /// The commandBuilder class name to use. - /// - /// - /// "System.Data.OleDb.OleDbCommandBuilder", - /// "System.Data.SqlClient.SqlCommandBuilder", - /// "Microsoft.Data.Odbc.OdbcCommandBuilder" - /// - [XmlAttribute("commandBuilderClass")] - public string CommandBuilderClass - { - get { return _commandBuilderClass; } - set - { - CheckPropertyString("CommandBuilderClass", value); - _commandBuilderClass = value; - } - } - - - /// - /// Name used to identify the provider amongst the others. - /// - [XmlAttribute("name")] - public string Name - { - get { return _name; } - set - { - CheckPropertyString("Name", value); - _name = value; - } - } - - /// - /// Description. - /// - [XmlAttribute("description")] - public string Description - { - get { return _description; } - set { _description = value; } - } - - /// - /// Parameter prefix use in store procedure. - /// - /// @ for Sql Server. - [XmlAttribute("parameterPrefix")] - public string ParameterPrefix - { - get { return _parameterPrefix; } - set - { - if ((value == null) || (value.Length < 1)) - { - _parameterPrefix = ""; - } - else - { - _parameterPrefix = value; - } - } - } - - /// - /// Check if this provider is Odbc ? - /// - [XmlIgnore] - public bool IsObdc - { - get { return (_connectionClass.IndexOf(".Odbc.") > 0); } - } - - /// - /// Get the CommandBuilder Type for this provider. - /// - /// An object. - public Type CommandBuilderType - { - get { return _commandBuilderType; } - } - - /// - /// Get the ParameterDb Type for this provider. - /// - /// An object. - [XmlIgnore] - public Type ParameterDbType - { - get { return _parameterDbType; } - } - - #endregion - - #region Constructor (s) / Destructor - - #endregion - - #region Methods - - /// - /// Init the provider. - /// - public void Initialize() - { - Assembly assembly = null; - Type type = null; - - try - { - assembly = Assembly.Load(_assemblyName); - - // Build the DataAdapter template - type = assembly.GetType(_dataAdapterClass, true); - CheckPropertyType("DataAdapterClass", typeof (IDbDataAdapter), type); - _templateDataAdapter = (IDbDataAdapter) type.GetConstructor(Type.EmptyTypes).Invoke(null); - - // Build the connection template - type = assembly.GetType(_connectionClass, true); - CheckPropertyType("DbConnectionClass", typeof (IDbConnection), type); - _templateConnection = (IDbConnection) type.GetConstructor(Type.EmptyTypes).Invoke(null); - - // Get the CommandBuilder Type - _commandBuilderType = assembly.GetType(_commandBuilderClass, true); - if (_parameterDbTypeClass.IndexOf(',') > 0) - { - _parameterDbType = TypeUtils.ResolveType(_parameterDbTypeClass); - } - else - { - _parameterDbType = assembly.GetType(_parameterDbTypeClass, true); - } - - _templateConnectionIsICloneable = _templateConnection is ICloneable; - _templateDataAdapterIsICloneable = _templateDataAdapter is ICloneable; - - if (!string.IsNullOrWhiteSpace(_connectionAdapterClass)) - { - Type connectionAdapterType; - - if (_connectionAdapterClass.IndexOf(',') > 0) - connectionAdapterType = TypeUtils.ResolveType(_connectionAdapterClass); - else - connectionAdapterType = assembly.GetType(_connectionAdapterClass, true); - - _connectionAdapter = (IConnectionAdapter)Activator.CreateInstance(connectionAdapterType); - } - - } - catch (Exception e) - { - throw new ConfigurationException( - string.Format( - "Could not configure providers. Unable to load provider named \"{0}\" not found, failed. Cause: {1}", - _name, e.Message), e - ); - } - } - - - /// - /// Create a connection object for this provider. - /// - /// An 'IDbConnection' object. - public virtual IDbConnection CreateConnection() - { - // Cannot do that because on - // IDbCommand.Connection = cmdConnection - // .NET cast the cmdConnection to the real type (as SqlConnection) - // and we pass a proxy --> exception invalid cast ! - // if (_connectionLogger.IsDebugEnabled) - // { - // connection = (IDbConnection)IDbConnectionProxy.NewInstance(connection, this); - // } - - IDbConnection cn; - - if (_templateConnectionIsICloneable) - cn = (IDbConnection) ((ICloneable) _templateConnection).Clone(); - else - cn = (IDbConnection) Activator.CreateInstance(_templateConnection.GetType()); - - if (_connectionAdapter != null) - cn = _connectionAdapter.Adapt(cn); - - return cn; - } - - - /// - /// Create a command object for this provider. - /// - /// An 'IDbCommand' object. - public virtual IDbCommand CreateCommand() - { - return _templateConnection.CreateCommand(); - } - - /// - /// Create a dataAdapter object for this provider. - /// - /// An 'IDbDataAdapter' object. - public virtual IDbDataAdapter CreateDataAdapter() - { - if (_templateDataAdapterIsICloneable) - { - return (IDbDataAdapter) ((ICloneable) _templateDataAdapter).Clone(); - } - return (IDbDataAdapter) Activator.CreateInstance(_templateDataAdapter.GetType()); - } - - - /// - /// Create a IDbDataParameter object for this provider. - /// - /// An 'IDbDataParameter' object. - public virtual IDbDataParameter CreateDataParameter() - { - return _templateConnection.CreateCommand().CreateParameter(); - } - - /// - /// Change the parameterName into the correct format IDbCommand.CommandText - /// for the ConnectionProvider - /// - /// The unformatted name of the parameter - /// A parameter formatted for an IDbCommand.CommandText - public virtual string FormatNameForSql(string parameterName) - { - return _useParameterPrefixInSql ? (_parameterPrefix + parameterName) : SQLPARAMETER; - } - - /// - /// Changes the parameterName into the correct format for an IDbParameter - /// for the Driver. - /// - /// - /// For SqlServerConnectionProvider it will change id to @id - /// - /// The unformatted name of the parameter - /// A parameter formatted for an IDbParameter. - public virtual string FormatNameForParameter(string parameterName) - { - return _useParameterPrefixInParameter ? (_parameterPrefix + parameterName) : parameterName; - } - - /// - /// Equals implemantation. - /// - /// The test object. - /// A boolean. - public override bool Equals(object obj) - { - if ((obj != null) && (obj is IDbProvider)) - { - IDbProvider that = (IDbProvider)obj; - return ((_name == that.Name) && - (_assemblyName == that.AssemblyName) && - (_connectionClass == that.DbConnectionClass)); - } - return false; - } - - /// - /// A hashcode for the provider. - /// - /// An integer. - public override int GetHashCode() - { - return (_name.GetHashCode() ^ _assemblyName.GetHashCode() ^ _connectionClass.GetHashCode()); - } - - /// - /// ToString implementation. - /// - /// A string that describes the provider. - public override string ToString() - { - return "Provider " + _name; - } - - private void CheckPropertyString(string propertyName, string value) - { - if (value == null || value.Trim().Length == 0) - { - throw new ArgumentException( - "The " + propertyName + " property cannot be " + - "set to a null or empty string value.", propertyName); - } - } - - private void CheckPropertyType(string propertyName, Type expectedType, Type value) - { - if (value == null) - { - throw new ArgumentNullException( - propertyName, "The " + propertyName + " property cannot be null."); - } - if (!expectedType.IsAssignableFrom(value)) - { - throw new ArgumentException( - "The Type passed to the " + propertyName + " property must be an " + expectedType.Name + - " implementation."); - } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/IBatisNet.Common/Exceptions/ConfigurationException.cs b/src/IBatisNet.Common/Exceptions/ConfigurationException.cs deleted file mode 100644 index 7f0e6b1..0000000 --- a/src/IBatisNet.Common/Exceptions/ConfigurationException.cs +++ /dev/null @@ -1,111 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Runtime.Serialization; -#endregion - - - -namespace IBatisNet.Common.Exceptions -{ - - /// - /// A ConfigurationException is thrown when an error has occured in the configuration process. - /// - /// - /// When this exception occurs check the .xml or .config file. - /// - [Serializable] - public class ConfigurationException : IBatisNetException - { - - /// - /// Initializes a new instance of the class. - /// - /// - /// This constructor initializes the Message property of the new instance to a system-supplied message - /// that describes the error. - /// - public ConfigurationException() :base ("Could not configure the iBatis.NET framework."){ } - - /// - /// Initializes a new instance of the - /// class with a reference to the inner exception that is the cause of this exception. - /// - /// - /// This constructor initializes the Message property of the new instance to the Message property - /// of the passed in exception. - /// - /// - /// The exception that is the cause of the current exception. - /// If the innerException parameter is not a null reference (Nothing in Visual Basic), - /// the current exception is raised in a catch block that handles the inner exception. - /// - public ConfigurationException(Exception ex) : base (ex.Message,ex) {} - - /// - /// Initializes a new instance of the - /// class with a specified error message. - /// - /// - /// This constructor initializes the Message property of the new instance using - /// the message parameter. - /// - /// The message that describes the error. - public ConfigurationException( string message ) : base ( message ) { } - - /// - /// Initializes a new instance of the - /// class with a specified error message and a reference to the inner exception that is the cause of this exception. - /// - /// - /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - /// The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - /// - /// The message that describes the error. - /// The exception that caused the error - public ConfigurationException( string message, Exception inner ) : base ( message, inner ) { } - - /// - /// Initializes a new instance of the Exception class with serialized data. - /// - /// - /// This constructor is called during deserialization to reconstitute the exception - /// object transmitted over a stream. - /// - /// - /// The that holds the serialized object data about the exception being thrown. - /// - /// - /// The that contains contextual information about the source or destination. - /// - protected ConfigurationException(SerializationInfo info, StreamingContext context) : base (info, context) {} - - } -} diff --git a/src/IBatisNet.Common/Exceptions/ForeignKeyException.cs b/src/IBatisNet.Common/Exceptions/ForeignKeyException.cs deleted file mode 100644 index ef462f2..0000000 --- a/src/IBatisNet.Common/Exceptions/ForeignKeyException.cs +++ /dev/null @@ -1,104 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace IBatisNet.Common.Exceptions -{ - /// - /// A DALForeignKeyException is thrown when foreign key error occured in a sql statement. - /// - /// - /// This exception is not used by the framework. - /// - [Serializable] - public class ForeignKeyException : IBatisNetException - { - /// - /// Initializes a new instance of the DalException class. - /// - /// - /// This constructor initializes the Message property of the new instance - /// to a system-supplied message that describes the error. - /// - public ForeignKeyException() : base("A foreign key conflict has occurred.") { } - - /// - /// Initializes a new instance of the - /// class with a reference to the inner exception that is the cause of this exception. - /// - /// - /// This constructor initializes the Message property of the new instance to the Message property - /// of the passed in exception. - /// - /// - /// The exception that is the cause of the current exception. - /// If the innerException parameter is not a null reference (Nothing in Visual Basic), - /// the current exception is raised in a catch block that handles the inner exception. - /// - public ForeignKeyException(Exception ex) : base (ex.Message,ex) {} - - /// - /// Initializes a new instance of the - /// class with a specified error message. - /// - /// - /// This constructor initializes the Message property of the new instance using - /// the message parameter. - /// - /// The message that describes the error. - public ForeignKeyException( string message ) : base ( message ) { } - - /// - /// Initializes a new instance of the - /// class with a specified error message and a reference to the inner exception that is the cause of this exception. - /// - /// - /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - /// The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - /// - /// The message that describes the error. - /// The exception that caused the error - public ForeignKeyException( string message, Exception inner ) : base ( message, inner ) { } - - /// - /// Initializes a new instance of the Exception class with serialized data. - /// - /// - /// This constructor is called during deserialization to reconstitute the exception - /// object transmitted over a stream. - /// - /// - /// The that holds the serialized object data about the exception being thrown. - /// - /// - /// The that contains contextual information about the source or destination. - /// - protected ForeignKeyException(SerializationInfo info, StreamingContext context) : base (info, context) {} - - } -} diff --git a/src/IBatisNet.Common/Exceptions/IBatisNetException.cs b/src/IBatisNet.Common/Exceptions/IBatisNetException.cs deleted file mode 100644 index cf93aeb..0000000 --- a/src/IBatisNet.Common/Exceptions/IBatisNetException.cs +++ /dev/null @@ -1,111 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace IBatisNet.Common.Exceptions -{ - /// - /// The DalException is thrown when an error in the Dal occurs. - /// - /// - /// This is the base exception for all exceptions thrown in the framework. - /// - [Serializable] - public class IBatisNetException : System.ApplicationException - { - /// - /// Initializes a new instance of the class. - /// - /// - /// This constructor initializes the Message property of the new instance - /// to a system-supplied message that describes the error. - /// - public IBatisNetException() : base("iBatis.NET framework caused an exception.") { } - - /// - /// Initializes a new instance of the - /// class with a reference to the inner exception that is the cause of this exception. - /// - /// - /// This constructor initializes the Message property of the new instance - /// using the message parameter. - /// - /// - /// The exception that is the cause of the current exception. - /// If the innerException parameter is not a null reference (Nothing in Visual Basic), - /// the current exception is raised in a catch block that handles the inner exception. - /// - public IBatisNetException(Exception ex) : base("iBatis.NET framework caused an exception.", ex) { } - - /// - /// Initializes a new instance of the - /// class with a specified error message. - /// - /// - /// This constructor initializes the Message property of the new instance to - /// the Message property of the passed in exception. - /// - /// The message that describes the error. - public IBatisNetException( string message ) : base ( message ) { } - - /// - /// Initializes a new instance of the - /// class with a specified error message and a reference to the inner exception - /// that is the cause of this exception. - /// - /// - /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous - /// exception in the InnerException property. - /// The InnerException property returns the same value that is passed into the constructor, or a null reference - /// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - /// - /// The message that describes the error. - /// The exception that caused the error - public IBatisNetException( string message, Exception inner ) : base ( message, inner ) { } - - - /// - /// Initializes a new instance of the - /// class with serialized data. - /// - /// - /// This constructor is called during deserialization to reconstitute the - /// exception object transmitted over a stream. - /// - /// - /// The that holds the serialized - /// object data about the exception being thrown. - /// - /// - /// The that contains contextual - /// information about the source or destination. - /// - protected IBatisNetException(SerializationInfo info, StreamingContext context) : base (info, context) {} - - } -} diff --git a/src/IBatisNet.Common/Exceptions/ProbeException.cs b/src/IBatisNet.Common/Exceptions/ProbeException.cs deleted file mode 100644 index 6515a87..0000000 --- a/src/IBatisNet.Common/Exceptions/ProbeException.cs +++ /dev/null @@ -1,101 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 512878 $ - * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Runtime.Serialization; - -namespace IBatisNet.Common.Exceptions -{ - /// - /// Summary description for ProbeException. - /// - [Serializable] - public class ProbeException : IBatisNetException - { - /// - /// Initializes a new instance of the ProbeException class. - /// - /// - /// This constructor initializes the Message property of the new instance - /// to a system-supplied message that describes the error. - /// - public ProbeException() : base("A foreign key conflict has occurred.") { } - - /// - /// Initializes a new instance of the - /// class with a reference to the inner exception that is the cause of this exception. - /// - /// - /// This constructor initializes the Message property of the new instance to the Message property - /// of the passed in exception. - /// - /// - /// The exception that is the cause of the current exception. - /// If the innerException parameter is not a null reference (Nothing in Visual Basic), - /// the current exception is raised in a catch block that handles the inner exception. - /// - public ProbeException(Exception ex) : base (ex.Message,ex) {} - - /// - /// Initializes a new instance of the - /// class with a specified error message. - /// - /// - /// This constructor initializes the Message property of the new instance using - /// the message parameter. - /// - /// The message that describes the error. - public ProbeException( string message ) : base ( message ) { } - - /// - /// Initializes a new instance of the - /// class with a specified error message and a reference to the inner exception that is the cause of this exception. - /// - /// - /// An exception that is thrown as a direct result of a previous exception should include a reference to the previous exception in the InnerException property. - /// The InnerException property returns the same value that is passed into the constructor, or a null reference (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor. - /// - /// The message that describes the error. - /// The exception that caused the error - public ProbeException( string message, Exception inner ) : base ( message, inner ) { } - - /// - /// Initializes a new instance of the Exception class with serialized data. - /// - /// - /// This constructor is called during deserialization to reconstitute the exception - /// object transmitted over a stream. - /// - /// - /// The that holds the serialized object data about the exception being thrown. - /// - /// - /// The that contains contextual information about the source or destination. - /// - protected ProbeException(SerializationInfo info, StreamingContext context) : base (info, context) {} - - } -} diff --git a/src/IBatisNet.Common/IBatisNet.Common.Net40.build b/src/IBatisNet.Common/IBatisNet.Common.Net40.build deleted file mode 100644 index 87c1e0d..0000000 --- a/src/IBatisNet.Common/IBatisNet.Common.Net40.build +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.Common/IBatisNet.Common.build b/src/IBatisNet.Common/IBatisNet.Common.build deleted file mode 100644 index 76eae37..0000000 --- a/src/IBatisNet.Common/IBatisNet.Common.build +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common/IBatisNet.Common_net4.build b/src/IBatisNet.Common/IBatisNet.Common_net4.build deleted file mode 100644 index ae2c369..0000000 --- a/src/IBatisNet.Common/IBatisNet.Common_net4.build +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.Common/IConnectionAdapter.cs b/src/IBatisNet.Common/IConnectionAdapter.cs deleted file mode 100644 index 7dedd2a..0000000 --- a/src/IBatisNet.Common/IConnectionAdapter.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Data; -using System.Linq; -using System.Text; - -namespace IBatisNet.Common -{ - public interface IConnectionAdapter - { - IDbConnection Adapt(IDbConnection cn); - } -} diff --git a/src/IBatisNet.Common/IDalSession.cs b/src/IBatisNet.Common/IDalSession.cs deleted file mode 100644 index 97e017b..0000000 --- a/src/IBatisNet.Common/IDalSession.cs +++ /dev/null @@ -1,192 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 513043 $ - * $Date: 2007-02-28 15:56:03 -0700 (Wed, 28 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Data; -#endregion - - -namespace IBatisNet.Common -{ - /// - /// A template for a session in the iBATIS.NET framwork. - /// Holds the connection, the transaction ... - /// - public interface IDalSession : IDisposable - { - /// - /// The data source use by the session. - /// - IDataSource DataSource - { - get; - } - - /// - /// The Connection use by the session. - /// - IDbConnection Connection - { - get; - } - - /// - /// The Transaction use by the session. - /// - IDbTransaction Transaction - { - get; - } - - /// - /// Indicates if a transaction is open on - /// the session. - /// - bool IsTransactionStart - { - get; - } - - /// - /// Complete (commit) a transsaction - /// - void Complete(); - - /// - /// Open a connection. - /// - void OpenConnection(); - - /// - /// Open a connection, on the specified connection string. - /// - /// The connection string - void OpenConnection(string connectionString); - - /// - /// close a connection - /// - void CloseConnection(); - - /// - /// Open a connection and begin a transaction - /// - void BeginTransaction(); - - /// - /// Open a connection and begin a transaction on the specified connection string. - /// - /// The connection string - void BeginTransaction(string connectionString); - - /// - /// Begins a database transaction - /// - /// Open a connection. - void BeginTransaction(bool openConnection); - - /// - /// Open a connection and begin a transaction on the specified connection string. - /// - /// The connection string - /// The transaction isolation level for this connection. - void BeginTransaction(string connectionString, IsolationLevel isolationLevel); - - /// - /// Open a connection and begin a transaction at the data source - /// with the specified IsolationLevel value. - /// - /// The transaction isolation level for this connection. - void BeginTransaction(IsolationLevel isolationLevel); - - /// - /// Begins a transaction on the current connection - /// with the specified IsolationLevel value. - /// - /// The transaction isolation level for this connection. - /// The connection string - /// Open a connection. - void BeginTransaction(string connectionString, bool openConnection, IsolationLevel isolationLevel); - - /// - /// Begins a transaction on the current connection - /// with the specified IsolationLevel value. - /// - /// The transaction isolation level for this connection. - /// Open a connection. - void BeginTransaction(bool openConnection, IsolationLevel isolationLevel); - - /// - /// Commit a transaction and close the associated connection - /// - void CommitTransaction(); - - /// - /// Commits the database transaction. - /// - /// Close the connection - void CommitTransaction(bool closeConnection); - - /// - /// Rollbak a transaction and close the associated connection - /// - void RollBackTransaction(); - - /// - /// Rolls back a transaction from a pending state. - /// - /// Close the connection - void RollBackTransaction(bool closeConnection); - - /// - /// Create a command - /// - /// The type of the command - /// An IDbCommand. - IDbCommand CreateCommand(CommandType commandType); - - /// - /// Create an DataParameter - /// - /// An IDbDataParameter. - IDbDataParameter CreateDataParameter(); - - /// - /// Create a DataAdapter - /// - /// The statement or stored procedure - /// used to select records in the data source. - /// An IDbDataAdapter. - IDbDataAdapter CreateDataAdapter(IDbCommand command); - - /// - /// Create a DataAdapter - /// - /// An IDbDataAdapter. - IDbDataAdapter CreateDataAdapter(); - } -} diff --git a/src/IBatisNet.Common/IDataSource.cs b/src/IBatisNet.Common/IDataSource.cs deleted file mode 100644 index a9522fe..0000000 --- a/src/IBatisNet.Common/IDataSource.cs +++ /dev/null @@ -1,99 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006 - Apache Fondation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.Common -{ - /// - /// IDataSource - /// - public interface IDataSource - { - - /// - /// DataSource Name. - /// - string Name - { - set; - get; - } - - /// - /// Connection string used to create connections. - /// - string ConnectionString - { - set; - get; - } - - /// - /// The data provider. - /// - IDbProvider DbProvider - { - set; - get; - } - -/* - /// - /// Create a connection - /// - /// An IDbConnection - IDbConnection CreateConnection(); - - /// - /// Create a command object - /// - /// An IdbCommand - IDbCommand CreateCommand(); - IDbCommand GetCommand(string cmdText); - IDbCommand GetCommand(string cmdText, IDbConnection connection); - IDbCommand GetCommand(string cmdText, IDbConnection connection, IDbTransaction transaction); - - /// - /// Create a parameter object - /// - /// An IDataParameter - IDataParameter CreateParameter(); - // ou return IDbParameter ??? - - IDataParameter GetParameter(string name, DbType dataType); - IDataParameter GetParameter(string name, object value); - IDataParameter GetParameter(string name, DbType dataType, int size); - IDataParameter GetParameter(string name, DbType dataType, int size, string srcColumn); - - /// - /// Create a DataAdapter object - /// - /// An IDataAdapter - IDataAdapter CreateDataAdapter(); - IDataAdapter GetDataAdapter(IDbCommand selectCommand); - IDataAdapter GetDataAdapter(string selectCommandText, string selectConnectionString); - IDataAdapter GetDataAdapter(string selectCommandText, IDbConnection selectConnection); - */ - } -} diff --git a/src/IBatisNet.Common/IDbProvider.cs b/src/IBatisNet.Common/IDbProvider.cs deleted file mode 100644 index fd27493..0000000 --- a/src/IBatisNet.Common/IDbProvider.cs +++ /dev/null @@ -1,273 +0,0 @@ -using System; -using System.Data; -using System.Xml.Serialization; - -namespace IBatisNet.Common -{ - /// - /// Factory interface to create provider specific ado.net objects. - /// - public interface IDbProvider - { - - /// - /// The name of the assembly which conatins the definition of the provider. - /// - /// Examples : "System.Data", "Microsoft.Data.Odbc" - [XmlAttribute("assemblyName")] - string AssemblyName { get; set; } - - /// - /// Tell us if it is the default data source. - /// Default false. - /// - [XmlAttribute("default")] - bool IsDefault { get; set; } - - /// - /// Tell us if this provider is enabled. - /// Default true. - /// - [XmlAttribute("enabled")] - bool IsEnabled { get; set; } - - /// - /// Tell us if this provider allows having multiple open with - /// the same . - /// - [XmlAttribute("allowMultipleActiveDataReaders")] - bool AllowMARS { get; set; } - - /// - /// An optional property to specify the DBCommand Timeout for - /// the specified provider. - /// - [XmlAttribute("commandTimeout")] - int DbCommandTimeout { get; set; } - - /// - /// The connection class name to use. - /// - /// - /// "System.Data.OleDb.OleDbConnection", - /// "System.Data.SqlClient.SqlConnection", - /// "Microsoft.Data.Odbc.OdbcConnection" - /// - [XmlAttribute("connectionClass")] - string DbConnectionClass { get; set; } - - /// - /// The connection adapter class name to use, if any. - /// - [XmlAttribute("connectionAdapterClass")] - string ConnectionAdapterClass { get; set; } - - /// - /// Does this ConnectionProvider require the use of a Named Prefix in the SQL - /// statement. - /// - /// - /// The OLE DB/ODBC .NET Provider does not support named parameters for - /// passing parameters to an SQL Statement or a stored procedure called - /// by an IDbCommand when CommandType is set to Text. - /// - /// For example, SqlClient requires select * from simple where simple_id = @simple_id - /// If this is false, like with the OleDb or Obdc provider, then it is assumed that - /// the ? can be a placeholder for the parameter in the SQL statement when CommandType - /// is set to Text. - /// - [XmlAttribute("useParameterPrefixInSql")] - bool UseParameterPrefixInSql { get; set; } - - /// - /// Does this ConnectionProvider require the use of the Named Prefix when trying - /// to reference the Parameter in the Command's Parameter collection. - /// - /// - /// This is really only useful when the UseParameterPrefixInSql = true. - /// When this is true the code will look like IDbParameter param = cmd.Parameters["@paramName"], - /// if this is false the code will be IDbParameter param = cmd.Parameters["paramName"] - ie - Oracle. - /// - [XmlAttribute("useParameterPrefixInParameter")] - bool UseParameterPrefixInParameter { get; set; } - - /// - /// The OLE DB/OBDC .NET Provider uses positional parameters that are marked with a - /// question mark (?) instead of named parameters. - /// - [XmlAttribute("usePositionalParameters")] - bool UsePositionalParameters { get; set; } - - /// - /// Used to indicate whether or not the provider - /// supports parameter size. - /// - /// - /// See JIRA-49 about SQLite.Net provider not supporting parameter size. - /// - [XmlAttribute("setDbParameterSize")] - bool SetDbParameterSize { get; set; } - - /// - /// Used to indicate whether or not the provider - /// supports parameter precision. - /// - /// - /// See JIRA-49 about SQLite.Net provider not supporting parameter precision. - /// - [XmlAttribute("setDbParameterPrecision")] - bool SetDbParameterPrecision { get; set; } - - /// - /// Used to indicate whether or not the provider - /// supports a parameter scale. - /// - /// - /// See JIRA-49 about SQLite.Net provider not supporting parameter scale. - /// - [XmlAttribute("setDbParameterScale")] - bool SetDbParameterScale { get; set; } - - /// - /// Used to indicate whether or not the provider - /// supports DeriveParameters method for procedure. - /// - [XmlAttribute("useDeriveParameters")] - bool UseDeriveParameters { get; set; } - - /// - /// The command class name to use. - /// - /// - /// "System.Data.SqlClient.SqlCommand" - /// - [XmlAttribute("commandClass")] - string DbCommandClass { get; set; } - - /// - /// The ParameterDbType class name to use. - /// - /// - /// "System.Data.SqlDbType" - /// - [XmlAttribute("parameterDbTypeClass")] - string ParameterDbTypeClass { get; set; } - - /// - /// The ParameterDbTypeProperty class name to use. - /// - /// - /// SqlDbType in SqlParamater.SqlDbType, - /// OracleType in OracleParameter.OracleType. - /// - [XmlAttribute("parameterDbTypeProperty")] - string ParameterDbTypeProperty { get; set; } - - /// - /// The dataAdapter class name to use. - /// - /// - /// "System.Data.SqlDbType" - /// - [XmlAttribute("dataAdapterClass")] - string DataAdapterClass { get; set; } - - /// - /// The commandBuilder class name to use. - /// - /// - /// "System.Data.OleDb.OleDbCommandBuilder", - /// "System.Data.SqlClient.SqlCommandBuilder", - /// "Microsoft.Data.Odbc.OdbcCommandBuilder" - /// - [XmlAttribute("commandBuilderClass")] - string CommandBuilderClass { get; set; } - - /// - /// Name used to identify the provider amongst the others. - /// - [XmlAttribute("name")] - string Name { get; set; } - - /// - /// Description. - /// - [XmlAttribute("description")] - string Description { get; set; } - - /// - /// Parameter prefix use in store procedure. - /// - /// @ for Sql Server. - [XmlAttribute("parameterPrefix")] - string ParameterPrefix { get; set; } - - /// - /// Check if this provider is Odbc ? - /// - [XmlIgnore] - bool IsObdc { get; } - - /// - /// Create a connection object for this provider. - /// - /// An 'IDbConnection' object. - IDbConnection CreateConnection(); - - /// - /// Create a command object for this provider. - /// - /// An 'IDbCommand' object. - IDbCommand CreateCommand(); - - /// - /// Create a dataAdapter object for this provider. - /// - /// An 'IDbDataAdapter' object. - IDbDataAdapter CreateDataAdapter(); - - /// - /// Create a IDataParameter object for this provider. - /// - /// An 'IDbDataParameter' object. - IDbDataParameter CreateDataParameter(); - - /// - /// Create the CommandBuilder Type for this provider. - /// - /// An object. - Type CommandBuilderType { get; } - - /// - /// Get the ParameterDb Type for this provider. - /// - /// An object. - Type ParameterDbType { get; } - - - /// - /// Change the parameterName into the correct format IDbCommand.CommandText - /// for the ConnectionProvider - /// - /// The unformatted name of the parameter - /// A parameter formatted for an IDbCommand.CommandText - string FormatNameForSql(string parameterName); - - /// - /// Changes the parameterName into the correct format for an IDbParameter - /// for the Driver. - /// - /// - /// For SqlServerConnectionProvider it will change id to @id - /// - /// The unformatted name of the parameter - /// A parameter formatted for an IDbParameter. - string FormatNameForParameter(string parameterName); - - /// - /// Init the provider. - /// - void Initialize(); - - } -} \ No newline at end of file diff --git a/src/IBatisNet.Common/Logging/ConfigurationSectionHandler.cs b/src/IBatisNet.Common/Logging/ConfigurationSectionHandler.cs deleted file mode 100644 index 3e56f33..0000000 --- a/src/IBatisNet.Common/Logging/ConfigurationSectionHandler.cs +++ /dev/null @@ -1,224 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Configuration; -using System.Xml; -using IBatisNet.Common.Logging.Impl; -using ConfigurationException = IBatisNet.Common.Exceptions.ConfigurationException; - -namespace IBatisNet.Common.Logging -{ - /// - /// Used in an application's configuration file (App.Config or Web.Config) to configure the logging subsystem. - /// - /// - /// - /// An example configuration section that writes IBatisNet messages to the Console using the built-in Console Logger. - /// - /// - /// - /// - ///
    - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// - /// The following aliases are recognized for the type attribute of logFactoryAdapter: - /// - /// - /// CONSOLEAlias for IBatisNet.Common.Logging.Impl.ConsoleOutLoggerFA, IBatisNet.Common - /// TRACEAlias for IBatisNet.Common.Logging.Impl.TraceLoggerFA, IBatisNet.Common - /// NOOPAlias IBatisNet.Common.Logging.Impl.NoOpLoggerFA, IBatisNet.Common - /// - /// - public class ConfigurationSectionHandler: IConfigurationSectionHandler - { - - #region Fields - - private static readonly string LOGFACTORYADAPTER_ELEMENT = "logFactoryAdapter"; - private static readonly string LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB = "type"; - private static readonly string ARGUMENT_ELEMENT = "arg"; - private static readonly string ARGUMENT_ELEMENT_KEY_ATTRIB = "key"; - private static readonly string ARGUMENT_ELEMENT_VALUE_ATTRIB = "value"; - - #endregion - - /// - /// Constructor - /// - public ConfigurationSectionHandler() - { - } - - /// - /// Retrieves the of the logger the use by looking at the logFactoryAdapter element - /// of the logging configuration element. - /// - /// - /// - /// A object containing the specified type that implements - /// along with zero or more properties that will be - /// passed to the logger factory adapter's constructor as an . - /// - private LogSetting ReadConfiguration( XmlNode section ) - { - XmlNode logFactoryElement = section.SelectSingleNode( LOGFACTORYADAPTER_ELEMENT ); - - string factoryTypeString = string.Empty; - if ( logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB] != null ) - factoryTypeString = logFactoryElement.Attributes[LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB].Value; - - if ( factoryTypeString == string.Empty ) - { - throw new ConfigurationException - ( "Required Attribute '" - + LOGFACTORYADAPTER_ELEMENT_TYPE_ATTRIB - + "' not found in element '" - + LOGFACTORYADAPTER_ELEMENT - + "'" - ); - } - - Type factoryType = null; - try - { - if (String.Compare(factoryTypeString, "CONSOLE", true) == 0) - { - factoryType = typeof(ConsoleOutLoggerFA); - } - else if (String.Compare(factoryTypeString, "TRACE", true) == 0) - { - factoryType = typeof(TraceLoggerFA); - } - else if (String.Compare(factoryTypeString, "NOOP", true) == 0) - { - factoryType = typeof(NoOpLoggerFA); - } - else - { - factoryType = Type.GetType( factoryTypeString, true, false ); - } - } - catch ( Exception e ) - { - throw new ConfigurationException - ( "Unable to create type '" + factoryTypeString + "'" - , e - ); - } - - XmlNodeList propertyNodes = logFactoryElement.SelectNodes( ARGUMENT_ELEMENT ); - - NameValueCollection properties = null; -#if dotnet2 - properties = new NameValueCollection(StringComparer.InvariantCultureIgnoreCase); -#else - properties = new NameValueCollection( null, new CaseInsensitiveComparer() ); -#endif - foreach ( XmlNode propertyNode in propertyNodes ) - { - string key = string.Empty; - string itsValue = string.Empty; - - XmlAttribute keyAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_KEY_ATTRIB]; - XmlAttribute valueAttrib = propertyNode.Attributes[ARGUMENT_ELEMENT_VALUE_ATTRIB]; - - if ( keyAttrib == null ) - { - throw new ConfigurationException - ( "Required Attribute '" - + ARGUMENT_ELEMENT_KEY_ATTRIB - + "' not found in element '" - + ARGUMENT_ELEMENT - + "'" - ); - } - else - { - key = keyAttrib.Value; - } - - if ( valueAttrib != null ) - { - itsValue = valueAttrib.Value; - } - - properties.Add( key, itsValue ); - } - - return new LogSetting( factoryType, properties ); - } - - #region IConfigurationSectionHandler Members - - /// - /// Verifies that the logFactoryAdapter element appears once in the configuration section. - /// - /// The parent of the current item. - /// Additional information about the configuration process. - /// The configuration section to apply an XPath query too. - /// - /// A object containing the specified logFactoryAdapter type - /// along with user supplied configuration properties. - /// - public object Create(object parent, object configContext, XmlNode section) - { - int logFactoryElementsCount = section.SelectNodes( LOGFACTORYADAPTER_ELEMENT ).Count; - - if ( logFactoryElementsCount > 1 ) - { - throw new ConfigurationException( "Only one element allowed" ); - } - else if ( logFactoryElementsCount == 1 ) - { - return ReadConfiguration( section ); - } - else - { - return null; - } - } - - #endregion - } -} - diff --git a/src/IBatisNet.Common/Logging/IDataReaderProxy.cs b/src/IBatisNet.Common/Logging/IDataReaderProxy.cs deleted file mode 100644 index 82dc417..0000000 --- a/src/IBatisNet.Common/Logging/IDataReaderProxy.cs +++ /dev/null @@ -1,224 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Data; -using Castle.DynamicProxy; - -namespace IBatisNet.Common.Logging -{ - /// - /// Requires at least v1.1.5.0 of Castle.DynamicProxy - /// - /// - /// It is common for the user to expect a DataReader with zero or one DataRecords: - /// - /// - /// if (dr.Read()) - /// { - /// processDataReader(dr); - /// } - /// - /// - /// There is no way to know when the user is done processing the DataReader. There may be a lot more - /// code executed before 'dr' is Disposed() or Closed(). When Read() is called, we print out the - /// column headers as well as the data from the first DataRecord. - /// - /// DataReaders with 2 or more DataRecords benefit from a simple cache in which the code to generate the - /// log message does not make a call to the underlying _dataReader if the user has already requested the - /// value. If a DataRecord contains 50 columns and the user accessed 45 of those, the code to produce the - /// log message for the DataRecord will only need to make 5 calls to GetValue(i) for the missing columns - /// rather than iterating through all the columns and calling GetValue(i) to retrieve their value. One - /// could argue that unaccessed columns should not printed to the log. Since IBatisNet now supports - /// discriminator nodes in resultMaps, its important to display everything in the DataRecord - /// or else log messages may contain column values that are mis-aligned with column headers (i.e. some - /// log messages may have more column values than others when discriminators are in use). - /// - /// _isFirstRow and _isSecondRow could be replaced with: - /// - /// - /// private int _dataRecordsProcessed = 0; - /// - /// - /// We don't need to maintain a counter for the number of rows processed. We are only concerned with - /// the first and second DataRecords. - /// - public class IDataReaderProxy : IInterceptor - { - private IDataReader _dataReader = null; - private bool _isFirstRow = true; - private bool _isSecondRow = false; - private object[] _columnValuesCache = null; - private static readonly ILog _logger = LogManager.GetLogger("System.Data.IDataReader"); - private static readonly ArrayList _getters; - - static IDataReaderProxy() - { - // the following methods have a 0th argument of type int - _getters = new ArrayList(15); - _getters.Add("GetInt32"); - _getters.Add("GetValue"); - _getters.Add("GetBytes"); - _getters.Add("GetByte"); - _getters.Add("GetDecimal"); - _getters.Add("GetInt64"); - _getters.Add("GetDouble"); - _getters.Add("GetBoolean"); - _getters.Add("GetGuid"); - _getters.Add("GetDateTime"); - _getters.Add("GetFloat"); - _getters.Add("GetChars"); - _getters.Add("GetString"); - _getters.Add("GetChar"); - _getters.Add("GetIn16"); - } - - internal IDataReaderProxy(IDataReader dataReader) - { - _dataReader = dataReader; - } - - public static IDataReader NewInstance(IDataReader dataReader) - { - IInterceptor handler = new IDataReaderProxy(dataReader); - - object proxyDataReader = new ProxyGenerator().CreateProxy(typeof(IDataReader), handler, dataReader); - - return (IDataReader)proxyDataReader; - } - - public object Intercept(IInvocation invocation, params object[] arguments) - { - if (invocation.Method.Name == "Read") - { - #region Read() - if (_isFirstRow) - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - - for (int i=0;i<_dataReader.FieldCount;i++) - { - sb.Append(_dataReader.GetName(i) + ", "); - } - - _logger.Debug("Headers for \"" + _dataReader.GetHashCode() + "\": [" + sb.ToString(0, sb.Length - 2) + "]"); - - _isFirstRow = false; - - // advance to the next DataRecord - // (bool)invocation.Method.Invoke(_dataReader, arguments); - bool read = _dataReader.Read(); - - if (read == true) - { - // log values of the first (non-header) DataRecord - _columnValuesCache = new object[_dataReader.FieldCount]; - logColumnValues(); - - // if the user has chosen the 'while (dr.Read())' syntax, tell the second DataRecord - // that its contents have already been logged - _isSecondRow = true; - } - - return read; - } - else - { - if (_isSecondRow) - { - // we've already called logColumnValues() - _isSecondRow = false; - } - else - { - // the user is most likely iterating through the records using the 'while (dr.Read())' notation - logColumnValues(); - } - - _columnValuesCache = new object[_dataReader.FieldCount]; - - return invocation.Method.Invoke(_dataReader, arguments); - } - #endregion - } - else if (_getters.Contains(invocation.Method.Name)) - { - #region GetInt32(int), GetString(int), GetDateTime(int), etc. - // Cache repeated lookups: checking for null is probably faster than calling Invoke ??? - object value = _columnValuesCache[(int)arguments[0]]; - if (value == null) - { - value = invocation.Method.Invoke(_dataReader, arguments); - _columnValuesCache[(int)arguments[0]] = value; - } - else - { - // If someone wrote a custom type handler that makes repeated calls to GetXXXXX(int), we only make one call to Invoke - // _logger.Debug("Using cached value for column: [" + (int)arguments[0] + "]"); - } - return value; - #endregion - } - else - { - return invocation.Method.Invoke(_dataReader, arguments); - } - } - - private void logColumnValues() - { - System.Text.StringBuilder sb = new System.Text.StringBuilder(); - - for (int i=0;i<_columnValuesCache.Length;i++) - { - object value = _columnValuesCache[i]; - - if (value == null) - { - // _logger.Debug("Could not find existing value for column [" + i + "]"); - - value = _dataReader.GetValue(i); - - if (value == DBNull.Value) - { - value = "NULL"; - } - } - - sb.Append(value + ", "); - } - - // remove trailing comma and space - if (sb.Length > 2) - { - sb.Length -= 2; - } - - _logger.Debug("Results for \"" + _dataReader.GetHashCode() + "\": [" + sb.ToString() + "]"); - } - } -} \ No newline at end of file diff --git a/src/IBatisNet.Common/Logging/IDbCommandProxy.cs b/src/IBatisNet.Common/Logging/IDbCommandProxy.cs deleted file mode 100644 index ab4d2ce..0000000 --- a/src/IBatisNet.Common/Logging/IDbCommandProxy.cs +++ /dev/null @@ -1,80 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System.Data; -using Castle.DynamicProxy; - -namespace IBatisNet.Common.Logging -{ - /// - /// - /// - public class IDbCommandProxy : IInterceptor - { - private IDbCommand _command = null; - private static readonly ILog _dataReaderLogger = LogManager.GetLogger("System.Data.IDataReader"); - - internal IDbCommandProxy(IDbCommand command) - { - _command = command; - } - - /// - /// - /// - /// - /// - public static IDbCommand NewInstance(IDbCommand command) - { - IInterceptor handler = new IDbCommandProxy(command); - - object proxyCommand = new ProxyGenerator().CreateProxy(typeof(IDbCommand), handler, command); - - return (IDbCommand) proxyCommand; - } - - /// - /// - /// - /// - /// - /// - public object Intercept(IInvocation invocation, params object[] arguments) - { - object returnValue = invocation.Method.Invoke(_command, arguments); - - if (invocation.Method.Name == "ExecuteReader") - { - if (_dataReaderLogger.IsDebugEnabled) - { - returnValue = IDataReaderProxy.NewInstance((IDataReader)returnValue); - } - } - - return returnValue; - } - } -} diff --git a/src/IBatisNet.Common/Logging/IDbConnectionProxy.cs b/src/IBatisNet.Common/Logging/IDbConnectionProxy.cs deleted file mode 100644 index a7b84d4..0000000 --- a/src/IBatisNet.Common/Logging/IDbConnectionProxy.cs +++ /dev/null @@ -1,133 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.Data; -using Castle.DynamicProxy; - -#endregion - -namespace IBatisNet.Common.Logging -{ - /// - /// Summary description for IDbConnectionProxy. - /// - /// Not used. - [CLSCompliant(false)] - public class IDbConnectionProxy : IInterceptor - { - - #region Fields - private IDbConnection _connection = null; - private Provider _provider = null; - private static ArrayList _passthroughMethods = new ArrayList(); - private static readonly ILog _logger = LogManager.GetLogger( "System.Data.IDbConnection" ); - - #endregion - - #region Constructors - - static IDbConnectionProxy() - { - _passthroughMethods.Add("GetType"); - _passthroughMethods.Add("ToString"); - } - - /// - /// Constructor for a connection proxy - /// - /// The connection which been proxified. - /// The provider used - internal IDbConnectionProxy(IDbConnection connection, Provider provider) - { - _connection = connection; - _provider = provider; - } - #endregion - - #region Methods - - /// - /// Static constructor - /// - /// The connection which been proxified. - /// The provider used - /// A proxy - internal static IDbConnection NewInstance(IDbConnection connection, Provider provider) - { - object proxyConnection = null; - IInterceptor handler = new IDbConnectionProxy(connection, provider); - - ProxyGenerator proxyGenerator = new ProxyGenerator(); - - proxyConnection = proxyGenerator.CreateProxy(typeof(IDbConnection), handler, connection); - - return (IDbConnection) proxyConnection; - } - #endregion - - #region IInterceptor Members - - /// - /// - /// - /// - /// - /// - public object Intercept(IInvocation invocation, params object[] arguments) - { - object returnValue = null; - - if (invocation.Method.Name=="Open") - { - _connection.Open(); - if (_logger.IsDebugEnabled) - { - _logger.Debug( string.Format("Open Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), _provider.Description) ); - } - } - else if (invocation.Method.Name=="Close") - { - _connection.Close(); - if (_logger.IsDebugEnabled) - { - _logger.Debug( string.Format("Close Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), _provider.Description) ); - } - } - else //if ( !_passthroughMethods.Contains(invocation.Method.Name) ) - { - returnValue = invocation.Method.Invoke( _connection, arguments); - } - - return returnValue; - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Logging/ILog.cs b/src/IBatisNet.Common/Logging/ILog.cs deleted file mode 100644 index 0071a87..0000000 --- a/src/IBatisNet.Common/Logging/ILog.cs +++ /dev/null @@ -1,261 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.Common.Logging -{ - /// - /// The 7 logging levels used by Log are (in order): - /// - public enum LogLevel - { - /// - /// - /// - All = 0, - /// - /// - /// - Debug = 1, - /// - /// - /// - Info = 2, - /// - /// - /// - Warn = 3, - /// - /// - /// - Error = 4, - /// - /// - /// - Fatal = 5, - /// - /// Do not log anything. - /// - Off = 6, - } - - /// - /// A simple logging interface abstracting logging APIs. Inspired by log4net. - /// - public interface ILog - { - /// - /// Log a message object with the level. - /// - /// The message object to log. - void Debug( object message ); - - /// - /// Log a message object with the level including - /// the stack trace of the passed - /// as a parameter. - /// - /// The message object to log. - /// The exception to log, including its stack trace. - void Debug( object message, Exception exception ); - -// /// -// /// Logs a formatted message string with the level. -// /// -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void DebugFormat(string format, params object[] args); -// -// /// -// /// Logs a formatted message string with the level. -// /// -// /// An that supplies culture-specific formatting information -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void DebugFormat(IFormatProvider provider, string format, params object[] args); - - /// - /// Log a message object with the level. - /// - /// The message object to log. - void Error( object message ); - - /// - /// Log a message object with the level including - /// the stack trace of the passed - /// as a parameter. - /// - /// The message object to log. - /// The exception to log, including its stack trace. - void Error( object message, Exception exception ); - -// /// -// /// Logs a formatted message string with the level. -// /// -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void ErrorFormat(string format, params object[] args); -// -// /// -// /// Logs a formatted message string with the level. -// /// -// /// An that supplies culture-specific formatting information -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void ErrorFormat(IFormatProvider provider, string format, params object[] args); - - /// - /// Log a message object with the level. - /// - /// The message object to log. - void Fatal( object message ); - - /// - /// Log a message object with the level including - /// the stack trace of the passed - /// as a parameter. - /// - /// The message object to log. - /// The exception to log, including its stack trace. - void Fatal( object message, Exception exception ); - -// /// -// /// Logs a formatted message string with the level. -// /// -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void FatalFormat(string format, params object[] args); -// -// /// -// /// Logs a formatted message string with the level. -// /// -// /// An that supplies culture-specific formatting information -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void FatalFormat(IFormatProvider provider, string format, params object[] args); - - /// - /// Log a message object with the level. - /// - /// The message object to log. - void Info( object message ); - - /// - /// Log a message object with the level including - /// the stack trace of the passed - /// as a parameter. - /// - /// The message object to log. - /// The exception to log, including its stack trace. - void Info( object message, Exception exception ); - -// /// -// /// Logs a formatted message string with the level. -// /// -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void InfoFormat(string format, params object[] args); -// -// /// -// /// Logs a formatted message string with the level. -// /// -// /// An that supplies culture-specific formatting information -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void InfoFormat(IFormatProvider provider, string format, params object[] args); - - /// - /// Log a message object with the level. - /// - /// The message object to log. - void Warn( object message ); - - /// - /// Log a message object with the level including - /// the stack trace of the passed - /// as a parameter. - /// - /// The message object to log. - /// The exception to log, including its stack trace. - void Warn( object message, Exception exception ); - -// /// -// /// Logs a formatted message string with the level. -// /// -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void WarnFormat(string format, params object[] args); -// -// /// -// /// Logs a formatted message string with the level. -// /// -// /// An that supplies culture-specific formatting information -// /// A String containing zero or more format items -// /// An Object array containing zero or more objects to format -// void WarnFormat(IFormatProvider provider, string format, params object[] args); - - /// - /// Checks if this logger is enabled for the level. - /// - bool IsDebugEnabled - { - get; - } - - /// - /// Checks if this logger is enabled for the level. - /// - bool IsErrorEnabled - { - get; - } - - /// - /// Checks if this logger is enabled for the level. - /// - bool IsFatalEnabled - { - get; - } - - /// - /// Checks if this logger is enabled for the level. - /// - bool IsInfoEnabled - { - get; - } - - /// - /// Checks if this logger is enabled for the level. - /// - bool IsWarnEnabled - { - get; - } - } -} diff --git a/src/IBatisNet.Common/Logging/ILoggerFactoryAdapter.cs b/src/IBatisNet.Common/Logging/ILoggerFactoryAdapter.cs deleted file mode 100644 index 268f5bb..0000000 --- a/src/IBatisNet.Common/Logging/ILoggerFactoryAdapter.cs +++ /dev/null @@ -1,66 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections.Specialized; -using IBatisNet.Common.Logging.Impl; - -namespace IBatisNet.Common.Logging -{ - /// - /// Defines the members that logging implementations must implement. - /// - /// - /// Classes that implement this interface may optional implement a constructor that accepts - /// a which will contain zero or more user supplied configuration - /// properties. - /// - /// The IBatisNet.Common assembly ships with the following built-in implementations: - /// - /// - /// Writes output to Console.Out - /// Writes output to the System.Diagnostics.Trace sub-system - /// Ignores all messages - /// - /// - public interface ILoggerFactoryAdapter - { - /// - /// Get a instance by type. - /// - /// - /// - ILog GetLogger( Type type ); - - /// - /// Get a instance by name. - /// - /// - /// - ILog GetLogger( string name ); - - } -} diff --git a/src/IBatisNet.Common/Logging/Impl/AbstractLogger.cs b/src/IBatisNet.Common/Logging/Impl/AbstractLogger.cs deleted file mode 100644 index 3c8af8a..0000000 --- a/src/IBatisNet.Common/Logging/Impl/AbstractLogger.cs +++ /dev/null @@ -1,232 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 23:43:37 -0500 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Base class that implements the ILog interface. - /// - public abstract class AbstractLogger : ILog - { - /// - /// Concrete classes should override this method to perform the actual logging. - /// - /// - /// - /// - protected abstract void Write(LogLevel logLevel, object message, Exception e); - - /// - /// Concrete classes should override this method to determine if a particular - /// is enabled. - /// - /// - /// - protected abstract bool IsLevelEnabled(LogLevel logLevel); - - #region ILog Members - - /// - /// Log a message. - /// - /// The message to log. - public void Debug(object message) - { - Debug( message, null ); - } - - /// - /// Log a message with an optional . - /// - /// The message to log. - /// - /// The associated with the message. If there isn't any - /// associated with the message, pass . - /// - public void Debug(object message, Exception e) - { - if ( IsLevelEnabled( LogLevel.Debug ) ) - { - Write( LogLevel.Debug, message, e ); - } - } - - /// - /// Log a message. - /// - /// The message to log. - public void Error(object message) - { - Error( message, null ); - } - - /// - /// Log a message with an optional . - /// - /// The message to log. - /// - /// The associated with the message. If there isn't any - /// associated with the message, pass . - /// - public void Error(object message, Exception e) - { - if ( IsLevelEnabled( LogLevel.Error ) ) - { - Write( LogLevel.Error, message, e ); - } - } - - /// - /// Log a message. - /// - /// The message to log. - public void Fatal(object message) - { - Fatal( message, null ); - } - - /// - /// Log a message with an optional . - /// - /// The message to log. - /// - /// The associated with the message. If there isn't any - /// associated with the message, pass . - /// - public void Fatal(object message, Exception e) - { - if ( IsLevelEnabled( LogLevel.Fatal ) ) - { - Write( LogLevel.Fatal, message, e ); - } - } - - /// - /// Log a message. - /// - /// The message to log. - public void Info(object message) - { - Info( message, null ); - } - - /// - /// Log a message with an optional . - /// - /// The message to log. - /// - /// The associated with the message. If there isn't any - /// associated with the message, pass . - /// - public void Info(object message, Exception e) - { - if ( IsLevelEnabled( LogLevel.Info ) ) - { - Write( LogLevel.Info, message, e ); - } - } - - /// - /// Log a message. - /// - /// The message to log. - public void Warn(object message) - { - Warn( message, null ); - } - - /// - /// Log a message with an optional . - /// - /// The message to log. - /// - /// The associated with the message. If there isn't any - /// associated with the message, pass . - /// - public void Warn(object message, Exception e) - { - if ( IsLevelEnabled( LogLevel.Warn ) ) - { - Write( LogLevel.Warn, message, e ); - } - } - - /// - /// Returns if the current is greater than or - /// equal to . If it is, all messages will be sent to . - /// - public bool IsDebugEnabled - { - get { return IsLevelEnabled( LogLevel.Debug ); } - } - - /// - /// Returns if the current is greater than or - /// equal to . If it is, only messages with a of - /// and will be sent to . - /// - public bool IsErrorEnabled - { - get { return IsLevelEnabled( LogLevel.Error ); } - } - - /// - /// Returns if the current is greater than or - /// equal to . If it is, only messages with a of - /// will be sent to . - /// - public bool IsFatalEnabled - { - get { return IsLevelEnabled( LogLevel.Fatal ); } - } - - /// - /// Returns if the current is greater than or - /// equal to . If it is, only messages with a of - /// , , , and - /// will be sent to . - /// - public bool IsInfoEnabled - { - get { return IsLevelEnabled( LogLevel.Info ); } - } - - - /// - /// Returns if the current is greater than or - /// equal to . If it is, only messages with a of - /// , , and - /// will be sent to . - /// - public bool IsWarnEnabled - { - get { return IsLevelEnabled( LogLevel.Warn ); } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Logging/Impl/ConsoleOutLogger.cs b/src/IBatisNet.Common/Logging/Impl/ConsoleOutLogger.cs deleted file mode 100644 index 86e8980..0000000 --- a/src/IBatisNet.Common/Logging/Impl/ConsoleOutLogger.cs +++ /dev/null @@ -1,129 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Globalization; -using System.Text; - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Sends log messages to . - /// - public class ConsoleOutLogger : AbstractLogger - { - private bool _showDateTime = false; - private bool _showLogName = false; - private string _logName = string.Empty; - private LogLevel _currentLogLevel = LogLevel.All; - private string _dateTimeFormat = string.Empty; - private bool _hasDateTimeFormat = false; - - /// - /// Creates and initializes a logger that writes messages to . - /// - /// The name, usually type name of the calling class, of the logger. - /// The current logging threshold. Messages recieved that are beneath this threshold will not be logged. - /// Include the current time in the log message. - /// Include the instance name in the log message. - /// The date and time format to use in the log message. - public ConsoleOutLogger( string logName, LogLevel logLevel - , bool showDateTime, bool showLogName, string dateTimeFormat) - { - _logName = logName; - _currentLogLevel = logLevel; - _showDateTime = showDateTime; - _showLogName = showLogName; - _dateTimeFormat = dateTimeFormat; - - if (_dateTimeFormat != null && _dateTimeFormat.Length > 0) - { - _hasDateTimeFormat = true; - } - } - - /// - /// Do the actual logging by constructing the log message using a then - /// sending the output to . - /// - /// The of the message. - /// The log message. - /// An optional associated with the message. - protected override void Write( LogLevel level, object message, Exception e ) - { - // Use a StringBuilder for better performance - StringBuilder sb = new StringBuilder(); - // Append date-time if so configured - if ( _showDateTime ) - { - if ( _hasDateTimeFormat ) - { - sb.Append( DateTime.Now.ToString( _dateTimeFormat, CultureInfo.InvariantCulture )); - } - else - { - sb.Append( DateTime.Now ); - } - - sb.Append( " " ); - } - // Append a readable representation of the log level - sb.Append( string.Format( "[{0}]", level.ToString().ToUpper() ).PadRight( 8 ) ); - - // Append the name of the log instance if so configured - if ( _showLogName ) - { - sb.Append( _logName ).Append( " - " ); - } - - // Append the message - sb.Append( message.ToString() ); - - // Append stack trace if not null - if ( e != null ) - { - sb.Append(Environment.NewLine).Append( e.ToString() ); - } - - // Print to the appropriate destination - Console.Out.WriteLine( sb.ToString() ); - } - - /// - /// Determines if the given log level is currently enabled. - /// - /// - /// - protected override bool IsLevelEnabled( LogLevel level ) - { - int iLevel = (int)level; - int iCurrentLogLevel = (int)_currentLogLevel; - - // return iLevel.CompareTo(iCurrentLogLevel); better ??? - return ( iLevel >= iCurrentLogLevel ); - } - } -} diff --git a/src/IBatisNet.Common/Logging/Impl/ConsoleOutLoggerFA.cs b/src/IBatisNet.Common/Logging/Impl/ConsoleOutLoggerFA.cs deleted file mode 100644 index bcd790e..0000000 --- a/src/IBatisNet.Common/Logging/Impl/ConsoleOutLoggerFA.cs +++ /dev/null @@ -1,108 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 471478 $ - * $Date: 2006-11-05 10:53:41 -0700 (Sun, 05 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Factory for creating instances that write data to . - /// - public class ConsoleOutLoggerFA: ILoggerFactoryAdapter - { - private Hashtable _logs = Hashtable.Synchronized( new Hashtable() ); - private LogLevel _Level = LogLevel.All; - private bool _showDateTime = true; - private bool _showLogName = true; - private string _dateTimeFormat = string.Empty; - - /// - /// Looks for level, showDateTime, showLogName, dateTimeFormat items from - /// for use when the GetLogger methods are called. - /// - /// Contains user supplied configuration information. - public ConsoleOutLoggerFA(NameValueCollection properties) - { - try - { - _Level = (LogLevel)Enum.Parse( typeof(LogLevel), properties["level"], true ); - } - catch ( Exception ) - { - _Level = LogLevel.All; - } - try - { - _showDateTime = bool.Parse( properties["showDateTime"] ); - } - catch ( Exception ) - { - _showDateTime = true; - } - try - { - _showLogName = bool.Parse( properties["showLogName"] ); - } - catch ( Exception ) - { - _showLogName = true; - } - _dateTimeFormat = properties["dateTimeFormat"]; - } - - #region ILoggerFactoryAdapter Members - - /// - /// Get a ILog instance by . - /// - /// Usually the of the current class. - /// An ILog instance that will write data to . - public ILog GetLogger(Type type) - { - return GetLogger( type.FullName ); - } - - /// - /// Get a ILog instance by name. - /// - /// Usually a 's Name or FullName property. - /// An ILog instance that will write data to . - public ILog GetLogger(string name) - { - ILog log = _logs[name] as ILog; - if ( log == null ) - { - log = new ConsoleOutLogger( name, _Level, _showDateTime, _showLogName, _dateTimeFormat ); - _logs.Add( name, log ); - } - return log; - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Logging/Impl/NoOpLogger.cs b/src/IBatisNet.Common/Logging/Impl/NoOpLogger.cs deleted file mode 100644 index 5edac79..0000000 --- a/src/IBatisNet.Common/Logging/Impl/NoOpLogger.cs +++ /dev/null @@ -1,177 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 471478 $ - * $Date: 2006-11-05 10:53:41 -0700 (Sun, 05 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Silently ignores all log messages. - /// - public sealed class NoOpLogger: ILog - { - #region Members of ILog - - /// - /// Ignores message. - /// - /// - public void Debug(object message) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - /// - public void Debug(object message, Exception e) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - public void Error(object message) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - /// - public void Error(object message, Exception e) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - public void Fatal(object message) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - /// - public void Fatal(object message, Exception e) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - public void Info(object message) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - /// - public void Info(object message, Exception e) - { - // NOP - no operation - } - - /// - /// Ignores message. - /// - /// - public void Warn(object message) - { - // NOP - no operation - } - - - /// - /// Ignores message. - /// - /// - /// - public void Warn(object message, Exception e) - { - // NOP - no operation - } - - /// - /// Always returns . - /// - public bool IsDebugEnabled - { - get { return false; } - } - - /// - /// Always returns . - /// - public bool IsErrorEnabled - { - get { return false; } - - } - - /// - /// Always returns . - /// - public bool IsFatalEnabled - { - get { return false; } - } - - /// - /// Always returns . - /// - public bool IsInfoEnabled - { - get { return false; } - } - - /// - /// Always returns . - /// - public bool IsWarnEnabled - { - get { return false; } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/IBatisNet.Common/Logging/Impl/NoOpLoggerFA.cs b/src/IBatisNet.Common/Logging/Impl/NoOpLoggerFA.cs deleted file mode 100644 index 9e326d3..0000000 --- a/src/IBatisNet.Common/Logging/Impl/NoOpLoggerFA.cs +++ /dev/null @@ -1,85 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections.Specialized; - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Factory for creating "no operation" loggers that do nothing and whose Is*Enabled properties always - /// return false. - /// - /// - /// This factory creates a single instance of and always returns that - /// instance whenever an instance is requested. - /// - public sealed class NoOpLoggerFA : ILoggerFactoryAdapter - { - private ILog _nopLogger = new NoOpLogger(); - - /// - /// Constructor - /// - public NoOpLoggerFA() - { - // empty - } - - /// - /// Constructor - /// - public NoOpLoggerFA(NameValueCollection properties) - { - // empty - } - - #region ILoggerFactoryAdapter Members - - /// - /// Get a ILog instance by type - /// - /// - /// - public ILog GetLogger(Type type) - { - return _nopLogger; - } - - /// - /// Get a ILog instance by type name - /// - /// - /// - ILog ILoggerFactoryAdapter.GetLogger(string name) - { - return _nopLogger; - - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Logging/Impl/TraceLogger.cs b/src/IBatisNet.Common/Logging/Impl/TraceLogger.cs deleted file mode 100644 index 2332ff4..0000000 --- a/src/IBatisNet.Common/Logging/Impl/TraceLogger.cs +++ /dev/null @@ -1,134 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Diagnostics; -using System.Globalization; -using System.Text; - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Logger that sends output to the sub-system. - /// - public class TraceLogger: AbstractLogger - { - private bool _showDateTime = false; - private bool _showLogName = false; - private string _logName = string.Empty; - private LogLevel _currentLogLevel = LogLevel.All; - private string _dateTimeFormat = string.Empty; - private bool _hasDateTimeFormat = false; - - /// - /// Creates a new instance of the TraceLogger. - /// - /// The name for this instance (usually the fully qualified class name). - /// - /// The logging threshold. Log messages created with a - /// beneath this threshold will not be logged. - /// - /// Include the current time in the log message - /// Include the instance name in the log message - /// The date and time format to use in the log message - public TraceLogger( string logName, LogLevel logLevel - , bool showDateTime, bool showLogName, string dateTimeFormat) - { - _logName = logName; - _currentLogLevel = logLevel; - _showDateTime = showDateTime; - _showLogName = showLogName; - _dateTimeFormat = dateTimeFormat; - - if (_dateTimeFormat != null && _dateTimeFormat.Length > 0) - { - _hasDateTimeFormat = true; - } - } - - /// - /// Responsible for assembling and writing the log message to the tracing sub-system. - /// - /// - /// - /// - protected override void Write( LogLevel level, object message, Exception e ) - { - // Use a StringBuilder for better performance - StringBuilder sb = new StringBuilder(); - - // Append date-time if so configured - if ( _showDateTime ) - { - if ( _hasDateTimeFormat ) - { - sb.Append( DateTime.Now.ToString( _dateTimeFormat, CultureInfo.InvariantCulture )); - } - else - { - sb.Append( DateTime.Now ); - } - - sb.Append( " " ); - } - - // Append a readable representation of the log level - sb.Append( string.Format( "[{0}]", level.ToString().ToUpper() ).PadRight( 8 ) ); - - // Append the name of the log instance if so configured - if ( _showLogName ) - { - sb.Append( _logName ).Append( " - " ); - } - - // Append the message - sb.Append( message.ToString() ); - - // Append stack trace if not null - if ( e != null ) - { - sb.Append(Environment.NewLine).Append(e.ToString()); - } - - // Print to the appropriate destination - Trace.WriteLine( sb.ToString() ); - } - - /// - /// Is the given log level currently enabled ? - /// - /// - /// - protected override bool IsLevelEnabled( LogLevel level ) - { - int iLevel = (int)level; - int iCurrentLogLevel = (int)_currentLogLevel; - - return ( iLevel >= iCurrentLogLevel ); - } - } -} - diff --git a/src/IBatisNet.Common/Logging/Impl/TraceLoggerFA.cs b/src/IBatisNet.Common/Logging/Impl/TraceLoggerFA.cs deleted file mode 100644 index 27262e1..0000000 --- a/src/IBatisNet.Common/Logging/Impl/TraceLoggerFA.cs +++ /dev/null @@ -1,107 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; - -namespace IBatisNet.Common.Logging.Impl -{ - /// - /// Summary description for TraceLoggerFA. - /// - public class TraceLoggerFA: ILoggerFactoryAdapter - { - private Hashtable _logs = Hashtable.Synchronized( new Hashtable() ); - private LogLevel _Level = LogLevel.All; - private bool _showDateTime = true; - private bool _showLogName = true; - private string _dateTimeFormat = string.Empty; - - /// - /// Constructor - /// - /// - public TraceLoggerFA(NameValueCollection properties) - { - try - { - _Level = (LogLevel)Enum.Parse( typeof(LogLevel), properties["level"], true ); - } - catch ( Exception ) - { - _Level = LogLevel.All; - } - try - { - _showDateTime = bool.Parse( properties["showDateTime"] ); - } - catch ( Exception ) - { - _showDateTime = true; - } - try - { - _showLogName = bool.Parse( properties["showLogName"] ); - } - catch ( Exception ) - { - _showLogName = true; - } - _dateTimeFormat = properties["dateTimeFormat"]; - } - - #region ILoggerFactoryAdapter Members - - /// - /// Get a ILog instance by type - /// - /// - /// - public ILog GetLogger(Type type) - { - return GetLogger( type.FullName ); - } - - /// - /// Get a ILog instance by type name - /// - /// - /// - public ILog GetLogger(string name) - { - ILog log = _logs[name] as ILog; - if ( log == null ) - { - log = new TraceLogger( name, _Level, _showDateTime, _showLogName, _dateTimeFormat ); - _logs.Add( name, log ); - } - return log; - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Logging/LogManager.cs b/src/IBatisNet.Common/Logging/LogManager.cs deleted file mode 100644 index 26817b0..0000000 --- a/src/IBatisNet.Common/Logging/LogManager.cs +++ /dev/null @@ -1,204 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 474141 $ - * $Date: 2006-11-12 21:43:37 -0700 (Sun, 12 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Configuration; -using IBatisNet.Common.Logging.Impl; - -namespace IBatisNet.Common.Logging -{ - /// - /// Uses the specified to create instances - /// that are used to log messages. Inspired by log4net. - /// - public sealed class LogManager - { - private static ILoggerFactoryAdapter _adapter = null; - private static object _loadLock = new object(); - private static readonly string IBATIS_SECTION_LOGGING = "iBATIS/logging"; - - /// - /// Initializes a new instance of the class. - /// - /// - /// Uses a private access modifier to prevent instantiation of this class. - /// - private LogManager() - { } - - - /// - /// Gets or sets the adapter. - /// - /// - /// - /// The IBatisNet.Common assembly ships with the following built-in implementations: - /// - /// - /// Writes output to Console.Out - /// Writes output to the System.Diagnostics.Trace sub-system - /// Ignores all messages - /// - /// - /// The adapter. - public static ILoggerFactoryAdapter Adapter - { - get - { - if ( _adapter == null ) - { - lock (_loadLock) - { - if (_adapter == null) - { - _adapter = BuildLoggerFactoryAdapter(); - } - } - } - return _adapter; - } - set - { - lock (_loadLock) - { - _adapter = value; - } - } - - } - - - /// - /// Gets the logger. - /// - /// The type. - /// - public static ILog GetLogger( Type type ) - { - return Adapter.GetLogger( type ); - } - - - /// - /// Gets the logger. - /// - /// The name. - /// - public static ILog GetLogger( string name ) - { - return Adapter.GetLogger(name); - } - - - /// - /// Builds the logger factory adapter. - /// - /// - private static ILoggerFactoryAdapter BuildLoggerFactoryAdapter() - { - LogSetting setting = null; - try - { -#if dotnet2 - setting = (LogSetting)ConfigurationManager.GetSection(IBATIS_SECTION_LOGGING ); -#else - setting = (LogSetting)ConfigurationSettings.GetConfig( IBATIS_SECTION_LOGGING ); -#endif - } - catch ( Exception ex ) - { - ILoggerFactoryAdapter defaultFactory = BuildDefaultLoggerFactoryAdapter(); - ILog log = defaultFactory.GetLogger( typeof(LogManager) ); - log.Warn( "Unable to read configuration. Using default logger.", ex ); - return defaultFactory; - } - - if ( setting!= null && !typeof ( ILoggerFactoryAdapter ).IsAssignableFrom( setting.FactoryAdapterType ) ) - { - ILoggerFactoryAdapter defaultFactory = BuildDefaultLoggerFactoryAdapter(); - ILog log = defaultFactory.GetLogger( typeof(LogManager) ); - log.Warn( "Type " + setting.FactoryAdapterType.FullName + " does not implement ILoggerFactoryAdapter. Using default logger" ); - return defaultFactory; - } - - ILoggerFactoryAdapter instance = null; - - if (setting!=null) - { - if (setting.Properties.Count>0) - { - try - { - object[] args = {setting.Properties}; - - instance = (ILoggerFactoryAdapter)Activator.CreateInstance( setting.FactoryAdapterType, args ); - } - catch ( Exception ex ) - { - ILoggerFactoryAdapter defaultFactory = BuildDefaultLoggerFactoryAdapter(); - ILog log = defaultFactory.GetLogger( typeof(LogManager) ); - log.Warn( "Unable to create instance of type " + setting.FactoryAdapterType.FullName + ". Using default logger.", ex ); - return defaultFactory; - } - } - else - { - try - { - instance = (ILoggerFactoryAdapter)Activator.CreateInstance( setting.FactoryAdapterType ); - } - catch ( Exception ex ) - { - ILoggerFactoryAdapter defaultFactory = BuildDefaultLoggerFactoryAdapter(); - ILog log = defaultFactory.GetLogger( typeof(LogManager) ); - log.Warn( "Unable to create instance of type " + setting.FactoryAdapterType.FullName + ". Using default logger.", ex ); - return defaultFactory; - } - } - } - else - { - ILoggerFactoryAdapter defaultFactory = BuildDefaultLoggerFactoryAdapter(); - ILog log = defaultFactory.GetLogger( typeof(LogManager) ); - log.Warn( "Unable to read configuration IBatisNet/logging. Using default logger." ); - return defaultFactory; - } - - return instance; - } - - - /// - /// Builds the default logger factory adapter. - /// - /// - private static ILoggerFactoryAdapter BuildDefaultLoggerFactoryAdapter() - { - return new NoOpLoggerFA(); - } - } -} - diff --git a/src/IBatisNet.Common/Logging/LogSetting.cs b/src/IBatisNet.Common/Logging/LogSetting.cs deleted file mode 100644 index 1483dc0..0000000 --- a/src/IBatisNet.Common/Logging/LogSetting.cs +++ /dev/null @@ -1,79 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 471480 $ - * $Date: 2006-11-05 11:00:23 -0700 (Sun, 05 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections.Specialized; - -namespace IBatisNet.Common.Logging -{ - /// - /// Container used to hold configuration information from config file. - /// - internal class LogSetting - { - - #region Fields - - private Type _factoryAdapterType= null; - private NameValueCollection _properties = null; - - #endregion - - /// - /// - /// - /// - /// The type - /// that will be used for creating - /// - /// - /// Additional user supplied properties that are passed to the - /// 's constructor. - /// - public LogSetting ( Type factoryAdapterType , NameValueCollection properties ) - { - _factoryAdapterType = factoryAdapterType; - _properties = properties; - } - - /// - /// The type that will be used for creating - /// instances. - /// - public Type FactoryAdapterType - { - get { return _factoryAdapterType; } - } - - /// - /// Additional user supplied properties that are passed to the 's constructor. - /// - public NameValueCollection Properties - { - get { return _properties; } - } - } -} diff --git a/src/IBatisNet.Common/Pagination/IPaginatedList.cs b/src/IBatisNet.Common/Pagination/IPaginatedList.cs deleted file mode 100644 index a4feec6..0000000 --- a/src/IBatisNet.Common/Pagination/IPaginatedList.cs +++ /dev/null @@ -1,138 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; - -namespace IBatisNet.Common.Pagination -{ - /// - /// Summary description for IPaginatedList. - /// - public interface IPaginatedList : IList, IEnumerator - { - - /// - /// The maximum number of items per page. - /// - int PageSize - { - get; - } - - - /// - /// Is the current page the first page ? - /// True if the current page is the first page or if only - /// a single page exists. - /// - bool IsFirstPage - { - get; - } - - - /// - /// Is the current page a middle page (i.e. not first or last) ? - /// Return True if the current page is not the first or last page, - /// and more than one page exists (always returns false if only a - /// single page exists). - /// - bool IsMiddlePage - { - get; - } - - - /// - /// Is the current page the last page ? - /// Return True if the current page is the last page or if only - /// a single page exists. - /// - bool IsLastPage - { - get; - } - - - /// - /// Is a page available after the current page ? - /// Return True if the next page is available - /// - bool IsNextPageAvailable - { - get; - } - - - /// - /// Is a page available before the current page ? - /// Return True if the previous page is available - /// - bool IsPreviousPageAvailable - { - get; - } - - - /// - /// Moves to the next page after the current page. If the current - /// page is the last page, wrap to the first page. - /// - /// - bool NextPage(); - - - /// - /// Moves to the page before the current page. If the current - /// page is the first page, wrap to the last page. - /// - /// - bool PreviousPage(); - - - /// - /// Moves to a specified page. If the specified - /// page is beyond the last page, wrap to the first page. - /// If the specified page is before the first page, wrap - /// to the last page. - /// - /// The index of the specified page. - void GotoPage(int pageIndex); - - - /// - /// Returns the current page index, which is a zero based integer. - /// All paginated list implementations should know what index they are - /// on, even if they don't know the ultimate boundaries (min/max) - /// - int PageIndex - { - get; - } - - } -} diff --git a/src/IBatisNet.Common/Pagination/PaginatedArrayList.cs b/src/IBatisNet.Common/Pagination/PaginatedArrayList.cs deleted file mode 100644 index 46fa8fb..0000000 --- a/src/IBatisNet.Common/Pagination/PaginatedArrayList.cs +++ /dev/null @@ -1,504 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Collections; -#endregion - - -namespace IBatisNet.Common.Pagination -{ - /// - /// Summary description for PaginatedArrayList. - /// - public class PaginatedArrayList: IPaginatedList - { - - #region Fields - - private static ArrayList _emptyList = new ArrayList(); - - private int _pageSize = 0; - private int _pageIndex = 0; - private IList _list = null; - private IList _page = null; - #endregion - - #region Properties - /// - /// - /// - public bool IsEmpty - { - get - { - return (_page.Count == 0); - } - } - #endregion - - #region Constructor (s) / Destructor - - /// - /// - /// - /// - public PaginatedArrayList(int pageSize) - { - _pageSize = pageSize; - _pageIndex = 0; - _list = new ArrayList(); - Repaginate(); - } - - /// - /// - /// - /// - /// - public PaginatedArrayList(int initialCapacity, int pageSize) - { - _pageSize = pageSize; - _pageIndex = 0; - _list = new ArrayList(initialCapacity); - Repaginate(); - } - - /// - /// - /// - /// - /// - public PaginatedArrayList(ICollection c, int pageSize) - { - _pageSize = pageSize; - _pageIndex = 0; - _list = new ArrayList(c); - Repaginate(); - } - #endregion - - #region Methods - - /// - /// - /// - private void Repaginate() - { - if (_list.Count==0) - { - _page = _emptyList; - } - else - { - int start = _pageIndex * _pageSize; - int end = start + _pageSize - 1; - if (end >= _list.Count) - { - end = _list.Count - 1; - } - if (start >= _list.Count) - { - _pageIndex = 0; - Repaginate(); - } - else if (start < 0) - { - _pageIndex = _list.Count / _pageSize; - if (_list.Count % _pageSize == 0) - { - _pageIndex--; - } - Repaginate(); - } - else - { - _page = SubList(_list, start, end + 1); - } - } - } - - - /// - /// Provides a view of the IList pramaeter - /// from the specified position - /// to the specified position . - /// - /// The IList elements. - /// Starting position for the view of elements. - /// Ending position for the view of elements. - /// A view of list. - /// - /// - /// The list that is returned is just a view, it is still backed - /// by the orignal list. Any changes you make to it will be - /// reflected in the orignal list. - /// - private IList SubList(IList list, int fromIndex, int toIndex) - { - return ((ArrayList)list).GetRange(fromIndex, toIndex-fromIndex); - } - #endregion - - #region IPaginatedList Members - - /// - /// - /// - public int PageSize - { - get - { - return _pageSize; - } - } - - /// - /// - /// - public bool IsFirstPage - { - get - { - return (_pageIndex == 0); - } - } - - /// - /// - /// - public bool IsMiddlePage - { - get - { - return !(this.IsFirstPage || this.IsLastPage); - } - } - - /// - /// - /// - public bool IsLastPage - { - get - { - return _list.Count - ((_pageIndex + 1) * _pageSize) < 1; - } - } - - /// - /// - /// - public bool IsNextPageAvailable - { - get - { - return !this.IsLastPage; - } - } - - /// - /// - /// - public bool IsPreviousPageAvailable - { - get - { - return !this.IsFirstPage; - } - } - - /// - /// - /// - /// - public bool NextPage() - { - if (this.IsNextPageAvailable) - { - _pageIndex++; - Repaginate(); - return true; - } - else - { - return false; - } - } - - /// - /// - /// - /// - public bool PreviousPage() - { - if (this.IsPreviousPageAvailable) - { - _pageIndex--; - Repaginate(); - return true; - } - else - { - return false; - } - } - - /// - /// - /// - /// - public void GotoPage(int pageIndex) - { - _pageIndex = pageIndex; - Repaginate(); - } - - /// - /// - /// - public int PageIndex - { - get - { - return _pageIndex; - } - } - - #endregion - - #region IList Members - - /// - /// - /// - public bool IsReadOnly - { - get - { - return _list.IsReadOnly; - } - } - - /// - /// - /// - public object this[int index] - { - get - { - return _page[index]; - } - set - { - _list[index] = value; - Repaginate(); - } - } - - /// - /// - /// - /// - public void RemoveAt(int index) - { - _list.RemoveAt(index); - Repaginate(); - } - - /// - /// - /// - /// - /// - public void Insert(int index, object value) - { - _list.Insert(index, value); - Repaginate(); - } - - /// - /// - /// - /// - public void Remove(object value) - { - _list.Remove(value); - Repaginate(); - } - - /// - /// - /// - /// - /// - public bool Contains(object value) - { - return _page.Contains(value); - } - - /// - /// - /// - public void Clear() - { - _list.Clear(); - Repaginate(); - } - - /// - /// - /// - /// - /// - public int IndexOf(object value) - { - return _page.IndexOf(value); - } - - /// - /// - /// - /// - /// - public int Add(object value) - { - int i = _list.Add(value); - Repaginate(); - return i; - } - - /// - /// - /// - public bool IsFixedSize - { - get - { - return _list.IsFixedSize; - } - } - - #endregion - - #region ICollection Members - - /// - /// - /// - public bool IsSynchronized - { - get - { - return _page.IsSynchronized; - } - } - - /// - /// - /// - public int Count - { - get - { - return _page.Count; - } - } - - /// - /// - /// - /// - /// - public void CopyTo(Array array, int index) - { - _page.CopyTo(array, index); - } - - /// - /// - /// - public object SyncRoot - { - get - { - return _page.SyncRoot; - } - } - - #endregion - - #region IEnumerable Members - - /// - /// - /// - /// - public IEnumerator GetEnumerator() - { - return _page.GetEnumerator(); - } - - #endregion - - #region IEnumerator Members - - /// - /// Sets the enumerator to its initial position, - /// which is before the first element in the collection. - /// - public void Reset() - { - _page.GetEnumerator().Reset(); - } - - /// - /// Gets the current element in the page. - /// - public object Current - { - get - { - return _page.GetEnumerator().Current; - } - } - - /// - /// Advances the enumerator to the next element of the collection. - /// - /// - /// true if the enumerator was successfully advanced to the next element; - /// false if the enumerator has passed the end of the collection. - /// - public bool MoveNext() - { - return _page.GetEnumerator().MoveNext(); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/ProviderDeSerializer.cs b/src/IBatisNet.Common/ProviderDeSerializer.cs deleted file mode 100644 index d839b41..0000000 --- a/src/IBatisNet.Common/ProviderDeSerializer.cs +++ /dev/null @@ -1,77 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 512878 $ - * $LastChangedDate: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -#endregion - -namespace IBatisNet.Common -{ - /// - /// Summary description for ProviderDeSerializer. - /// - public sealed class ProviderDeSerializer - { - - /// - /// Deserializes the specified node in a . - /// - /// The node. - /// The - public static IDbProvider Deserialize(XmlNode node) - { - IDbProvider provider = new DbProvider(); - NameValueCollection prop = NodeUtils.ParseAttributes(node); - - provider.AssemblyName = prop["assemblyName"]; - provider.CommandBuilderClass = prop["commandBuilderClass"]; - provider.DbCommandClass = prop["commandClass"]; - provider.DbCommandTimeout = NodeUtils.GetIntAttribute(prop,"commandTimeout",30); - provider.DbConnectionClass = prop["connectionClass"]; - provider.ConnectionAdapterClass = prop["connectionAdapterClass"]; - provider.DataAdapterClass = prop["dataAdapterClass"]; - provider.Description = prop["description"]; - provider.IsDefault = NodeUtils.GetBooleanAttribute(prop, "default", false); - provider.IsEnabled = NodeUtils.GetBooleanAttribute(prop, "enabled", true); - provider.Name = prop["name"]; - provider.ParameterDbTypeClass = prop["parameterDbTypeClass"]; - provider.ParameterDbTypeProperty = prop["parameterDbTypeProperty"]; - provider.ParameterPrefix = prop["parameterPrefix"]; - provider.SetDbParameterPrecision = NodeUtils.GetBooleanAttribute(prop, "setDbParameterPrecision", true); - provider.SetDbParameterScale = NodeUtils.GetBooleanAttribute(prop, "setDbParameterScale", true); - provider.SetDbParameterSize = NodeUtils.GetBooleanAttribute(prop, "setDbParameterSize", true); - provider.UseDeriveParameters = NodeUtils.GetBooleanAttribute(prop, "useDeriveParameters", true); - provider.UseParameterPrefixInParameter = NodeUtils.GetBooleanAttribute(prop, "useParameterPrefixInParameter", true); - provider.UseParameterPrefixInSql = NodeUtils.GetBooleanAttribute(prop, "useParameterPrefixInSql", true); - provider.UsePositionalParameters = NodeUtils.GetBooleanAttribute(prop, "usePositionalParameters", false); - provider.AllowMARS = NodeUtils.GetBooleanAttribute(prop, "allowMARS", false); - - return provider; - } - } -} diff --git a/src/IBatisNet.Common/Transaction/IsolationLevel.cs b/src/IBatisNet.Common/Transaction/IsolationLevel.cs deleted file mode 100644 index b15f35e..0000000 --- a/src/IBatisNet.Common/Transaction/IsolationLevel.cs +++ /dev/null @@ -1,62 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -#endregion - -namespace IBatisNet.Common.Transaction -{ - /// - /// Specifies the isolation level of a transaction. - /// - public enum IsolationLevel : int - { - /// - /// Volatile data can be read but not modified, - /// and no new data can be added during the transaction. - /// - Serializable = 0, - /// - /// Volatile data can be read but not modified during the transaction. - /// New data may be added during the transaction. - /// - RepeatableRead = 1, - /// - /// Volatile data cannot be read during the transaction, but can be modified. - /// - ReadCommitted = 2, - /// - /// Volatile data can be read and modified during the transaction. - /// - ReadUncommitted = 3, - /// - /// Volatile data can be read but not modified, - /// and no new data can be added during the transaction. - /// - Unspecified = 4 - } -} diff --git a/src/IBatisNet.Common/Transaction/TransactionOptions.cs b/src/IBatisNet.Common/Transaction/TransactionOptions.cs deleted file mode 100644 index c3020b1..0000000 --- a/src/IBatisNet.Common/Transaction/TransactionOptions.cs +++ /dev/null @@ -1,48 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -#endregion - -namespace IBatisNet.Common.Transaction -{ - /// - /// Contains parameters that specify Transaction behaviors. - /// - public struct TransactionOptions - { - /// - /// Length of time that the transaction waits before automatically - /// closing itself - /// - public TimeSpan TimeOut; - /// - /// The isolation level of the transaction. - /// - public IsolationLevel IsolationLevel; - } -} diff --git a/src/IBatisNet.Common/Transaction/TransactionScope.cs b/src/IBatisNet.Common/Transaction/TransactionScope.cs deleted file mode 100644 index 791acfd..0000000 --- a/src/IBatisNet.Common/Transaction/TransactionScope.cs +++ /dev/null @@ -1,359 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.EnterpriseServices; -using System.Runtime.Remoting.Messaging; -using IBatisNet.Common.Logging; - -#endregion - -namespace IBatisNet.Common.Transaction -{ - /// - /// Simple interface to COM+ transactions through Enterprise Service. - /// Makes a code block transactional la Indigo (evolution will be easier, it's the same API) - /// It's important to make sure that each instance - /// of this class gets Close()'d. - /// Easiest way to do that is with the using statement in C#. - /// - /// - /// Don't support nested transaction scope with different transaction options. - /// - /// System.EnterpriseServices.ServiceDomain is available only on - /// - XP SP2 (or higher) - /// - Windows Server 2003 - /// - XP SP1 + Hotfix 828741 - /// and only in .Net 1.1. - /// It CAN'T be used on Windows 2000. - /// - /// http://support.microsoft.com/default.aspx/kb/319177/EN-US/ - /// - /// - /// using (TransactionScope tx = new TransactionScope()) - /// { - /// - /// // Open connection to database 1 - /// // Transaction will be automatically enlist into it - /// // Execute update in database 1 - /// // Open connection to database 2 - /// // Transaction will be automatically enlist into it - /// // Execute update in database 2 - /// - /// // the following code will be executed only if no exception - /// // occured in the above code; since we got here ok, let's vote for commit; - /// tx.Completed(); - /// } - /// when using call Dispose on the transaction scope at the end - /// of the using code block, the "ambient" transaction will be commited only and only if - /// the Completed method have been called. - /// - public class TransactionScope : IDisposable - { - #region Consts - private const string TX_SCOPE_COUNT = "_TX_SCOPE_COUNT_"; - private bool _consistent = false; - #endregion - - #region Fields - private bool _closed = false; - private TransactionScopeOptions _txScopeOptions; - private TransactionOptions _txOptions; - private static readonly ILog _logger = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType ); - #endregion - - #region Properties - - - /// - /// Changes the vote to commit (true) or to abort (false). - /// If all the TransactionScope instances involved in a - /// transaction have voted to commit, then the entire thing is committed. - /// If any TransactionScope instances involved in a - /// transaction vote to abort, then the entire thing is aborted. - /// - private bool Consistent - { - set - { - _consistent = value; - } - } - - /// - /// Count of the TransactionScope that have been open. - /// - public int TransactionScopeCount - { - get - { - object count = CallContext.GetData(TX_SCOPE_COUNT); - return (count == null) ? 0 : (int)count; - } - set - { - CallContext.SetData(TX_SCOPE_COUNT, value); - } - } - - /// - /// Returns whether or not the current thread is in a transaction context. - /// - public static bool IsInTransaction - { - get - { - return ContextUtil.IsInTransaction; - } - } - - - /// - /// Gets the current value of the vote. - /// - public bool IsVoteCommit - { - get - { - return ContextUtil.MyTransactionVote == TransactionVote.Commit; - } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Creates a new instance with a TransactionScopeOptions.Required - /// and TransactionOptions.IsolationLevel.ReadCommitted. - /// - public TransactionScope() - { - _txOptions = new TransactionOptions(); - _txOptions.IsolationLevel = IsolationLevel.ReadCommitted; - _txOptions.TimeOut = new TimeSpan(0,0,0,15); - - _txScopeOptions = TransactionScopeOptions.Required; - - EnterTransactionContext(); - } - - - - /// - /// Creates a new instance with the specified TransactionScopeOptions - /// and TransactionOptions.IsolationLevel.ReadCommitted. - /// - /// The specified TransactionScopeOptions - public TransactionScope(TransactionScopeOptions txScopeOptions) - { - _txOptions = new TransactionOptions(); - _txOptions.IsolationLevel = IsolationLevel.ReadCommitted; - _txOptions.TimeOut = new TimeSpan(0,0,0,15); - - _txScopeOptions = txScopeOptions; - - EnterTransactionContext(); - } - - - /// - /// Creates a new instance. - /// - /// The specified TransactionScopeOptions. - /// The specified TransactionOptions. - public TransactionScope(TransactionScopeOptions txScopeOptions, TransactionOptions options) - { - _txOptions = options; - _txScopeOptions = txScopeOptions; - - EnterTransactionContext(); - } - #endregion - - #region Methods - - /// - /// - /// - private void EnterTransactionContext() - { - if (++TransactionScopeCount == 1) - { - if (_logger.IsDebugEnabled) - { - _logger.Debug("Create a new ServiceConfig in ServiceDomain."); - } - - ServiceConfig config = new ServiceConfig(); - - config.TrackingEnabled = true; - config.TrackingAppName = "iBATIS.NET"; - config.TrackingComponentName = "TransactionScope"; - config.TransactionDescription = "iBATIS.NET Distributed Transaction"; - config.Transaction = TransactionScopeOptions2TransactionOption( _txScopeOptions ); - config.TransactionTimeout = _txOptions.TimeOut.Seconds; - config.IsolationLevel = IsolationLevel2TransactionIsolationLevel( _txOptions.IsolationLevel ); - - // every call to ServiceDomain.Enter() creates a new COM+ Context - //(verified by calls to ContextUtil.ContextId), - // and every call to ServiceDomain.Leave() terminates that context - ServiceDomain.Enter(config); - } - - _closed = false; - - if (_logger.IsDebugEnabled) - { - _logger.Debug("Open TransactionScope :"+ContextUtil.ContextId); - } - } - - - - /// - /// Give the correpondance of a TransactionScopeOptions ( la Indigo) object in a TransactionOption (COM+) object - /// - /// The TransactionScopeOptions to macth. - /// The TransactionOption correspondance - private TransactionOption TransactionScopeOptions2TransactionOption(TransactionScopeOptions transactionScopeOptions) - { - TransactionOption transactionOption; - - switch(transactionScopeOptions) - { - case TransactionScopeOptions.Mandatory: - throw new NotImplementedException("Will be used in Indigo."); - case TransactionScopeOptions.NotSupported: - transactionOption = TransactionOption.NotSupported; - break; - case TransactionScopeOptions.Required: - transactionOption = TransactionOption.Required; - break; - case TransactionScopeOptions.RequiresNew: - transactionOption = TransactionOption.RequiresNew; - break; - case TransactionScopeOptions.Supported: - transactionOption = TransactionOption.Supported; - break; - default: - transactionOption = TransactionOption.Required; - break; - } - return transactionOption; - } - - /// - /// Give the correpondance of a TransactionIsolationLevel ( la Indigo) object in a IsolationLevel (COM+) object - /// - /// The IsolationLevel to macth. - /// The TransactionIsolationLevel correspondance - private TransactionIsolationLevel IsolationLevel2TransactionIsolationLevel(IsolationLevel isolation) - { - TransactionIsolationLevel isolationLevel; - - switch(isolation) - { - case IsolationLevel.ReadCommitted: - isolationLevel = TransactionIsolationLevel.ReadCommitted; - break; - case IsolationLevel.ReadUncommitted: - isolationLevel = TransactionIsolationLevel.ReadUncommitted; - break; - case IsolationLevel.RepeatableRead: - isolationLevel = TransactionIsolationLevel.RepeatableRead; - break; - case IsolationLevel.Serializable: - isolationLevel = TransactionIsolationLevel.Serializable; - break; - case IsolationLevel.Unspecified: - throw new NotImplementedException("Will be used in Indigo."); - default: - isolationLevel = TransactionIsolationLevel.ReadCommitted; - break; - } - return isolationLevel; - } - - /// - /// Close the TransactionScope - /// - public void Close() - { - if (_closed == false) - { - if (_logger.IsDebugEnabled) - { - _logger.Debug("Close TransactionScope"); - } - - if (ContextUtil.IsInTransaction) - { - if (_consistent==true && (this.IsVoteCommit)) - { - ContextUtil.EnableCommit(); - } - else - { - ContextUtil.DisableCommit(); - } - } - - if (0 == --TransactionScopeCount) - { - if (_logger.IsDebugEnabled) - { - _logger.Debug("Leave in ServiceDomain "); - } - - ServiceDomain.Leave(); - } - - _closed = true; - } - } - - /// - /// Complete (commit) a transsaction - /// - public void Complete() - { - this.Consistent = true; - } - #endregion - - #region IDisposable Members - /// - /// Implementation of IDisposable so that this class - /// can be used with C#'s using statement. - /// - public void Dispose() - { - Close(); - } - #endregion - - } -} diff --git a/src/IBatisNet.Common/Transaction/TransactionScopeOptions.cs b/src/IBatisNet.Common/Transaction/TransactionScopeOptions.cs deleted file mode 100644 index bd83e0f..0000000 --- a/src/IBatisNet.Common/Transaction/TransactionScopeOptions.cs +++ /dev/null @@ -1,60 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -#endregion - -namespace IBatisNet.Common.Transaction -{ - /// - /// Describes how a transaction scope is associated with a transaction. - /// - public enum TransactionScopeOptions : int - { - /// - /// The transaction scope must be associated with a transaction. - /// If we are in a transaction scope join it. If we aren't, create a new one. - /// - Required = 0, - /// - /// Always creates a new transaction scope. - /// - RequiresNew = 1, - /// - /// Don't need a transaction scope, but if we are in a transaction scope then join it. - /// - Supported = 2, - /// - /// Means that cannot cannot be associated with a transaction scope. - /// - NotSupported = 3, - /// - /// The transaction scope must be associated with an existing transaction scope. - /// - Mandatory = 4 - } -} diff --git a/src/IBatisNet.Common/Utilities/ConfigWatcherHandler.cs b/src/IBatisNet.Common/Utilities/ConfigWatcherHandler.cs deleted file mode 100644 index 7614c65..0000000 --- a/src/IBatisNet.Common/Utilities/ConfigWatcherHandler.cs +++ /dev/null @@ -1,224 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 452570 $ - * $Date: 2006-10-03 11:00:01 -0600 (Tue, 03 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System.Collections; -using System.Collections.Specialized; -using System.IO; -using System.Threading; -using IBatisNet.Common.Logging; - -namespace IBatisNet.Common.Utilities -{ - - /// - /// Represents the method that handles calls from Configure. - /// - /// - /// obj is a null object in a DaoManager context. - /// obj is the reconfigured sqlMap in a SqlMap context. - /// - public delegate void ConfigureHandler(object obj); - - /// - /// - /// - public struct StateConfig - { - /// - /// Master Config File name. - /// - public string FileName; - /// - /// Delegate called when a file is changed, use it to rebuild. - /// - public ConfigureHandler ConfigureHandler; - } - - /// - /// Class used to watch config files. - /// - /// - /// Uses the to monitor - /// changes to a specified file. Because multiple change notifications - /// may be raised when the file is modified, a timer is used to - /// compress the notifications into a single event. The timer - /// waits for the specified time before delivering - /// the event notification. If any further - /// change notifications arrive while the timer is waiting it - /// is reset and waits again for the specified time to - /// elapse. - /// - public sealed class ConfigWatcherHandler - { - #region Fields - private static readonly ILog _logger = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType ); - - /// - /// The timer used to compress the notification events. - /// - private Timer _timer = null; - - /// - /// A list of configuration files to watch. - /// - private static ArrayList _filesToWatch = new ArrayList(); - - /// - /// The list of FileSystemWatcher. - /// - private static ArrayList _filesWatcher = new ArrayList(); - - /// - /// The default amount of time to wait after receiving notification - /// before reloading the config file. - /// - private const int TIMEOUT_MILLISECONDS = 500; - #endregion - - #region Constructor (s) / Destructor - /// - ///- - /// - /// - /// Represent the call context of the SqlMap or DaoManager ConfigureAndWatch method call. - /// - /// - public ConfigWatcherHandler(TimerCallback onWhatchedFileChange, StateConfig state) - { - for(int index = 0; index < _filesToWatch.Count; index++) - { - FileInfo configFile = (FileInfo)_filesToWatch[index]; - - AttachWatcher(configFile); - - // Create the timer that will be used to deliver events. Set as disabled - // callback : A TimerCallback delegate representing a method to be executed. - // state : An object containing information to be used by the callback method, or a null reference - // dueTime : The amount of time to delay before callback is invoked, in milliseconds. Specify Timeout.Infinite to prevent the timer from starting. Specify zero (0) to start the timer immediately - // period : The time interval between invocations of callback, in milliseconds. Specify Timeout.Infinite to disable periodic signaling - _timer = new Timer(onWhatchedFileChange, state, Timeout.Infinite, Timeout.Infinite); - } - } - #endregion - - #region Methods - - private void AttachWatcher(FileInfo configFile) - { - // Create a new FileSystemWatcher and set its properties. - FileSystemWatcher watcher = new FileSystemWatcher(); - - watcher.Path = configFile.DirectoryName; - watcher.Filter = configFile.Name; - - // Set the notification filters - watcher.NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.FileName; - - // Add event handlers. OnChanged will do for all event handlers that fire a FileSystemEventArgs - watcher.Changed += new FileSystemEventHandler(ConfigWatcherHandler_OnChanged); - watcher.Created += new FileSystemEventHandler(ConfigWatcherHandler_OnChanged); - watcher.Deleted += new FileSystemEventHandler(ConfigWatcherHandler_OnChanged); - watcher.Renamed += new RenamedEventHandler(ConfigWatcherHandler_OnRenamed); - - // Begin watching. - watcher.EnableRaisingEvents = true; - - _filesWatcher.Add(watcher); - } - - /// - /// Add a file to be monitored. - /// - /// - public static void AddFileToWatch(FileInfo configFile) - { - if (_logger.IsDebugEnabled) - { - // TODO: remove Path.GetFileName? - _logger.Debug("Adding file [" + Path.GetFileName(configFile.FullName) + "] to list of watched files."); - } - - _filesToWatch.Add( configFile ); - } - - /// - /// Reset the list of files being monitored. - /// - public static void ClearFilesMonitored() - { - _filesToWatch.Clear(); - - // Kill all FileSystemWatcher - for(int index = 0; index < _filesWatcher.Count; index++) - { - FileSystemWatcher fileWatcher = (FileSystemWatcher)_filesWatcher[index]; - - fileWatcher.EnableRaisingEvents = false; - fileWatcher.Dispose(); - } - } - - /// - /// Event handler used by . - /// - /// The firing the event. - /// The argument indicates the file that caused the event to be fired. - /// - /// This handler reloads the configuration from the file when the event is fired. - /// - private void ConfigWatcherHandler_OnChanged(object source, FileSystemEventArgs e) - { - if (_logger.IsDebugEnabled) - { - _logger.Debug("ConfigWatcherHandler : "+e.ChangeType+" [" + e.Name + "]"); - } - - // timer will fire only once - _timer.Change(TIMEOUT_MILLISECONDS, Timeout.Infinite); - } - - /// - /// Event handler used by . - /// - /// The firing the event. - /// The argument indicates the file that caused the event to be fired. - /// - /// This handler reloads the configuration from the file when the event is fired. - /// - private void ConfigWatcherHandler_OnRenamed(object source, RenamedEventArgs e) - { - if (_logger.IsDebugEnabled) - { - _logger.Debug("ConfigWatcherHandler : " + e.ChangeType + " [" + e.OldName + "/" +e.Name +"]"); - } - - // timer will fire only once - _timer.Change(TIMEOUT_MILLISECONDS, Timeout.Infinite); - } - #endregion - - } -} diff --git a/src/IBatisNet.Common/Utilities/DBHelperParameterCache.cs b/src/IBatisNet.Common/Utilities/DBHelperParameterCache.cs deleted file mode 100644 index 1de379d..0000000 --- a/src/IBatisNet.Common/Utilities/DBHelperParameterCache.cs +++ /dev/null @@ -1,262 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 591621 $ - * $Date: 2007-11-03 07:44:57 -0600 (Sat, 03 Nov 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Data; -using System.Reflection; -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities -{ - /// - /// DBHelperParameterCache provides functions to leverage a - /// static cache of procedure parameters, and the - /// ability to discover parameters for stored procedures at run-time. - /// - public sealed class DBHelperParameterCache - { - private Hashtable _paramCache = Hashtable.Synchronized(new Hashtable()); - - /// - /// Initializes a new instance of the class. - /// - public DBHelperParameterCache() { } - - #region private methods - - /// - /// Resolve at run time the appropriate set of Parameters for a stored procedure - /// - /// An IDalSession object - /// the name of the stored procedure - /// whether or not to include their return value parameter - /// - private IDataParameter[] DiscoverSpParameterSet(IDalSession session, string spName, bool includeReturnValueParameter) - { - return InternalDiscoverSpParameterSet( - session, - spName, - includeReturnValueParameter); - } - - - /// - /// Discover at run time the appropriate set of Parameters for a stored procedure - /// - /// An IDalSession object - /// Name of the stored procedure. - /// if set to true [include return value parameter]. - /// The stored procedure parameters. - private IDataParameter[] InternalDiscoverSpParameterSet(IDalSession session, string spName, - bool includeReturnValueParameter) - { -#if !dotnet2 - // SqlCommandBuilder.DeriveParameters() does not support transactions. - // If the command is within a transaction, you will get the following error: - // SqlCommandBuilder Execute requires the command to have a transaction object - // when the connection assigned to the command is in a pending local transaction - // even when the command object does in fact have a transaction object. - using (IDbConnection connection = session.DataSource.DbProvider.CreateConnection()) - { - connection.ConnectionString = session.DataSource.ConnectionString; - connection.Open(); - using (IDbCommand cmd = connection.CreateCommand()) - { - cmd.CommandType = CommandType.StoredProcedure; -#else - using (IDbCommand cmd = session.CreateCommand(CommandType.StoredProcedure)) - { -#endif - cmd.CommandText = spName; - - // The session connection object is always created but the connection is not alwys open - // so we try to open it in case. - session.OpenConnection(); - - DeriveParameters(session.DataSource.DbProvider, cmd); - - if (cmd.Parameters.Count > 0) { - IDataParameter firstParameter = (IDataParameter)cmd.Parameters[0]; - if (firstParameter.Direction == ParameterDirection.ReturnValue) { - if (!includeReturnValueParameter) { - cmd.Parameters.RemoveAt(0); - } - } - } - - - IDataParameter[] discoveredParameters = new IDataParameter[cmd.Parameters.Count]; - cmd.Parameters.CopyTo(discoveredParameters, 0); - return discoveredParameters; - } -#if !dotnet2 - } -#endif - } - - private void DeriveParameters(IDbProvider provider, IDbCommand command) - { - Type commandBuilderType; - - // Find the CommandBuilder - if (provider == null) - throw new ArgumentNullException("provider"); - if ((provider.CommandBuilderClass == null) || (provider.CommandBuilderClass.Length < 1)) - throw new Exception(String.Format( - "CommandBuilderClass not defined for provider \"{0}\".", - provider.Name)); - commandBuilderType = provider.CommandBuilderType; - - // Invoke the static DeriveParameter method on the CommandBuilder class - // NOTE: OracleCommandBuilder has no DeriveParameter method - try - { - commandBuilderType.InvokeMember("DeriveParameters", - BindingFlags.Public | BindingFlags.InvokeMethod | BindingFlags.Static, null, null, - new object[] {command}); - } - catch(Exception ex) - { - throw new IBatisNetException("Could not retrieve parameters for the store procedure named "+command.CommandText, ex); - } - } - - /// - /// Deep copy of cached IDataParameter array. - /// - /// - /// - private IDataParameter[] CloneParameters(IDataParameter[] originalParameters) - { - IDataParameter[] clonedParameters = new IDataParameter[originalParameters.Length]; - - int length = originalParameters.Length; - for (int i = 0, j = length; i < j; i++) - { - clonedParameters[i] = (IDataParameter) ((ICloneable) originalParameters[i]).Clone(); - } - - return clonedParameters; - } - - #endregion private methods, variables, and constructors - - #region caching functions - - /// - /// Add parameter array to the cache - /// - /// a valid connection string for an IDbConnection - /// the stored procedure name or SQL command - /// an array of IDataParameters to be cached - public void CacheParameterSet(string connectionString, string commandText, params IDataParameter[] commandParameters) - { - string hashKey = connectionString + ":" + commandText; - - _paramCache[hashKey] = commandParameters; - } - - - /// - /// Clear the parameter cache. - /// - public void Clear() - { - _paramCache.Clear(); - } - - /// - /// retrieve a parameter array from the cache - /// - /// a valid connection string for an IDbConnection - /// the stored procedure name or SQL command - /// an array of IDataParameters - public IDataParameter[] GetCachedParameterSet(string connectionString, string commandText) - { - string hashKey = connectionString + ":" + commandText; - - IDataParameter[] cachedParameters = (IDataParameter[]) _paramCache[hashKey]; - - if (cachedParameters == null) - { - return null; - } - else - { - return CloneParameters(cachedParameters); - } - } - - #endregion caching functions - - #region Parameter Discovery Functions - - /// - /// Retrieves the set of IDataParameters appropriate for the stored procedure - /// - /// - /// This method will query the database for this information, and then store it in a cache for future requests. - /// - /// a valid session - /// the name of the stored procedure - /// an array of IDataParameters - public IDataParameter[] GetSpParameterSet(IDalSession session, string spName) - { - return GetSpParameterSet(session, spName, false); - } - - /// - /// Retrieves the set of IDataParameters appropriate for the stored procedure - /// - /// - /// This method will query the database for this information, and then store it in a cache for future requests. - /// - /// a valid session - /// the name of the stored procedure - /// a bool value indicating whether the return value parameter should be included in the results - /// an array of IDataParameters - public IDataParameter[] GetSpParameterSet(IDalSession session, - string spName, bool includeReturnValueParameter) - { - string hashKey = session.DataSource.ConnectionString + ":" + spName + (includeReturnValueParameter ? ":include ReturnValue Parameter":""); - - IDataParameter[] cachedParameters; - - cachedParameters = (IDataParameter[]) _paramCache[hashKey]; - - if (cachedParameters == null) - { - _paramCache[hashKey] = DiscoverSpParameterSet(session, spName, includeReturnValueParameter); - cachedParameters = (IDataParameter[]) _paramCache[hashKey]; - } - - return CloneParameters(cachedParameters); - } - - #endregion Parameter Discovery Functions - } -} diff --git a/src/IBatisNet.Common/Utilities/HashCodeProvider.cs b/src/IBatisNet.Common/Utilities/HashCodeProvider.cs deleted file mode 100644 index 5d6de27..0000000 --- a/src/IBatisNet.Common/Utilities/HashCodeProvider.cs +++ /dev/null @@ -1,71 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 512878 $ - * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Runtime.CompilerServices; - -#endregion - -namespace IBatisNet.Common.Utilities -{ - using System.Reflection; - - /// - /// Summary description for HashCodeProvider. - /// - public sealed class HashCodeProvider - { - private static MethodInfo getHashCodeMethodInfo = null; - - static HashCodeProvider() - { - Type type = typeof(object); - getHashCodeMethodInfo = type.GetMethod("GetHashCode"); - } - - /// - /// Supplies a hash code for an object. - /// - /// The object. - /// A hash code - /// - /// Buggy in .NET V1.0 - /// .NET Fx v1.1 Update: - /// As of v1.1 of the framework, there is a method System.Runtime.CompilerServices.RuntimeHelpers.GetHashCode(object) that does this as well. - /// I will not use to Keep compatiblity with .NET V1.0 - /// - public static int GetIdentityHashCode(object obj) - { - //#if dotnet2 - //return RuntimeHelpers.GetHashCode(obj); - //#else - // call the underlying System.Object.GetHashCode() - return (int)getHashCodeMethodInfo.Invoke(obj, null); - //#endif - } - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/AbstractFactory.cs b/src/IBatisNet.Common/Utilities/Objects/AbstractFactory.cs deleted file mode 100644 index a7e4944..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/AbstractFactory.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-05-31 11:40:07 -0600 (Wed, 31 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// A implementation that for abstract type - /// - public class AbstractFactory : IFactory - { - private Type _typeToCreate = null; - - /// - /// Initializes a new instance of the class. - /// - /// The type to create. - public AbstractFactory(Type typeToCreate) - { - _typeToCreate = typeToCreate; - } - - #region IFactory Members - - /// - /// Create a new instance with the specified parameters - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// A new instance - /// - /// If you call a constructor with no parameters, pass null. - /// Anyway, what you pass will be ignore. - /// - public object CreateInstance(object[] parameters) - { - throw new ProbeException( - string.Format("Unable to optimize create instance. Cause : Could not find public constructor on the abstract type \"{0}\".", _typeToCreate.Name)); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs b/src/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs deleted file mode 100644 index 7d94cd3..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/ActivatorFactory.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// Create objects via Activator.CreateInstance - /// - public sealed class ActivatorFactory : IFactory - { - private Type _typeToCreate = null; - - /// - /// - /// - /// - public ActivatorFactory(Type typeToCreate) - { - _typeToCreate = typeToCreate; - } - - #region IFactory members - - /// - /// Create a new instance with the specified parameters - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// - /// If you call a constructor with no parameters, pass null. - /// Anyway, what you pass will be ignore. - /// - /// A new instance - public object CreateInstance(object[] parameters) - { - return Activator.CreateInstance( _typeToCreate, parameters ); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs b/src/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs deleted file mode 100644 index 957c810..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/ActivatorObjectFactory.cs +++ /dev/null @@ -1,52 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// A implementation that can create objects - /// via Activator.CreateInstance - /// - public class ActivatorObjectFactory : IObjectFactory - { - - #region IObjectFactory members - - /// - /// Create a new see instance for a given type - /// - /// The type instance to build - /// The types of the constructor arguments - /// Returns a new instance. - public IFactory CreateFactory(Type typeToCreate, Type[] types) - { - return new ActivatorFactory( typeToCreate ); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/DelegateFactory.cs b/src/IBatisNet.Common/Utilities/Objects/DelegateFactory.cs deleted file mode 100644 index 3d4d94f..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/DelegateFactory.cs +++ /dev/null @@ -1,126 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// A implementation that builds object via DynamicMethod. - /// - public sealed class DelegateFactory : IFactory - { - private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - - private delegate object Create(object[] parameters); - - private Create _create = null; - - #region IFactory members - - /// - /// Create a new instance with the specified parameters - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// - /// If you call a constructor with no parameters, pass null. - /// Anyway, what you pass will be ignore. - /// - /// A new instance - public object CreateInstance(object[] parameters) - { - return _create(parameters); - } - - #endregion - - /// - /// Initializes a new instance of the class. - /// - /// The instance type to create. - /// The types argument. - public DelegateFactory(Type typeToCreate, Type[] argumentTypes) - { - DynamicMethod dynamicMethod = new DynamicMethod("CreateImplementation", typeof(object), new Type[] { typeof(object[]) }, this.GetType().Module, false); - ILGenerator generatorIL = dynamicMethod.GetILGenerator(); - - // Emit the IL for Create method. - // Add test if contructeur not public - ConstructorInfo constructorInfo = typeToCreate.GetConstructor(VISIBILITY, null, argumentTypes, null); - if (constructorInfo==null || !constructorInfo.IsPublic) - { - throw new ProbeException( - string.Format("Unable to optimize create instance. Cause : Could not find public constructor matching specified arguments for type \"{0}\".", typeToCreate.Name)); - } - // new typeToCreate() or new typeToCreate(... arguments ...) - EmitArgsIL(generatorIL, argumentTypes); - generatorIL.Emit(OpCodes.Newobj, constructorInfo); - generatorIL.Emit(OpCodes.Ret); - - _create = (Create)dynamicMethod.CreateDelegate(typeof(Create)); - } - - /// - /// Emit parameter IL for a method call. - /// - /// IL generator. - /// Arguments type defined for a the constructor. - private void EmitArgsIL(ILGenerator il, Type[] argumentTypes) - { - // Add args. Since all args are objects, value types are unboxed. - // Refs to value types are to be converted to values themselves. - for (int i = 0; i < argumentTypes.Length; i++) - { - // Push args array reference on the stack , followed by the index. - // Ldelem will resolve them to args[i]. - il.Emit(OpCodes.Ldarg_0); // Argument 1 is argument array. - il.Emit(OpCodes.Ldc_I4, i); - il.Emit(OpCodes.Ldelem_Ref); - - // If param is a primitive/value type then we need to unbox it. - Type paramType = argumentTypes[i]; - if (paramType.IsValueType) - { - if (paramType.IsPrimitive || paramType.IsEnum) - { - il.Emit(OpCodes.Unbox, paramType); - il.Emit(BoxingOpCodes.GetOpCode(paramType)); - } - else if (paramType.IsValueType) - { - il.Emit(OpCodes.Unbox, paramType); - il.Emit(OpCodes.Ldobj, paramType); - } - } - } - } - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/DelegateObjectFactory.cs b/src/IBatisNet.Common/Utilities/Objects/DelegateObjectFactory.cs deleted file mode 100644 index e2ebb97..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/DelegateObjectFactory.cs +++ /dev/null @@ -1,107 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Text; -using IBatisNet.Common.Logging; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// A implementation that can create objects via DynamicMethod. - /// - public sealed class DelegateObjectFactory : IObjectFactory - { - private IDictionary _cachedfactories = new HybridDictionary(); - private object _padlock = new object(); - private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - #region IObjectFactory members - - /// - /// Create a new instance for a given type - /// - /// The type instance to build - /// The types of the constructor arguments - /// Returns a new see instance. - [MethodImpl(MethodImplOptions.Synchronized)] - public IFactory CreateFactory(Type typeToCreate, Type[] types) - { - string key = GenerateKey(typeToCreate, types); - - IFactory factory = _cachedfactories[key] as IFactory; - if (factory == null) - { - lock (_padlock) - { - factory = _cachedfactories[key] as IFactory; - if (factory == null) // double-check - { - if (typeToCreate.IsAbstract) - { - if (_logger.IsInfoEnabled) - { - _logger.Info("Create a stub IFactory for abstract type " + typeToCreate.Name); - } - factory = new AbstractFactory(typeToCreate); - } - else - { - factory = new DelegateFactory(typeToCreate, types); - } - _cachedfactories[key] = factory; - } - } - } - return factory; - } - - /// - /// Generates the key for a cache entry. - /// - /// The type instance to build. - /// The types of the constructor arguments - /// The key for a cache entry. - private string GenerateKey(Type typeToCreate, object[] arguments) - { - StringBuilder cacheKey = new StringBuilder(); - cacheKey.Append(typeToCreate.ToString()); - cacheKey.Append("."); - if ((arguments != null) && (arguments.Length != 0)) - { - for (int i=0; i - /// A implementation that can create objects via IL code - /// - public sealed class EmitObjectFactory : IObjectFactory - { - private IDictionary _cachedfactories = new HybridDictionary(); - private FactoryBuilder _factoryBuilder = null; - private object _padlock = new object(); - - /// - /// Initializes a new instance of the class. - /// - public EmitObjectFactory() - { - _factoryBuilder = new FactoryBuilder(); - } - - #region IObjectFactory members - - /// - /// Create a new instance for a given type - /// - /// The type instance to build - /// The types of the constructor arguments - /// Returns a new instance. - public IFactory CreateFactory(Type typeToCreate, Type[] types) - { - string key = GenerateKey(typeToCreate, types); - - IFactory factory = _cachedfactories[key] as IFactory; - if (factory == null) - { - lock (_padlock) - { - factory = _cachedfactories[key] as IFactory; - if (factory == null) // double-check - { - factory = _factoryBuilder.CreateFactory(typeToCreate, types); - _cachedfactories[key] = factory; - } - } - } - return factory; - } - - /// - /// Generates the key for a cache entry. - /// - /// The type instance to build. - /// The types of the constructor arguments - /// The key for a cache entry. - private string GenerateKey(Type typeToCreate, object[] arguments) - { - StringBuilder cacheKey = new StringBuilder(); - cacheKey.Append(typeToCreate.ToString()); - cacheKey.Append("."); - if ((arguments != null) && (arguments.Length != 0)) - { - for (int i=0; i - /// Build IFactory object via IL - /// - public class FactoryBuilder - { - private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - private const MethodAttributes CREATE_METHOD_ATTRIBUTES = MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.NewSlot | MethodAttributes.Virtual | MethodAttributes.Final; - private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - - private ModuleBuilder _moduleBuilder = null; - - /// - /// constructor - /// - public FactoryBuilder() - { - AssemblyName assemblyName = new AssemblyName(); - assemblyName.Name = "iBATIS.EmitFactory" + HashCodeProvider.GetIdentityHashCode(this).ToString(); - - // Create a new assembly with one module - AssemblyBuilder _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); - } - - - /// - /// Create a factory which build class of type typeToCreate - /// - /// The type instance to build - /// The types of the constructor arguments - /// Returns a new instance. - public IFactory CreateFactory(Type typeToCreate, Type[] types) - { - if (typeToCreate.IsAbstract) - { - if (_logger.IsInfoEnabled) - { - _logger.Info("Create a stub IFactory for abstract type " + typeToCreate.Name); - } - return new AbstractFactory(typeToCreate); - } - else - { - Type innerType = CreateFactoryType(typeToCreate, types); - ConstructorInfo ctor = innerType.GetConstructor(Type.EmptyTypes); - return (IFactory) ctor.Invoke(new object[] {}); - } - } - - - /// - /// Creates a . - /// - /// The type instance to create. - /// The types. - /// The - private Type CreateFactoryType(Type typeToCreate, Type[] types) - { - string typesName = string.Empty; - for(int i = 0; i < types.Length; i++) - { - typesName += types[i].Name.Replace("[]",string.Empty)+i.ToString(); - } - TypeBuilder typeBuilder = _moduleBuilder.DefineType("EmitFactoryFor" + typeToCreate.FullName + typesName, TypeAttributes.Public); - typeBuilder.AddInterfaceImplementation(typeof (IFactory)); - ImplementCreateInstance(typeBuilder, typeToCreate, types); - return typeBuilder.CreateType(); - } - - /// - /// Implements the create instance. - /// - /// The type builder. - /// The type to create. - /// The argument types. - private void ImplementCreateInstance(TypeBuilder typeBuilder, Type typeToCreate, Type[] argumentTypes ) - { - // object CreateInstance(object[] parameters); - MethodBuilder meth = typeBuilder.DefineMethod("CreateInstance", CREATE_METHOD_ATTRIBUTES, typeof (object), new Type[]{typeof(object[])} ); - ILGenerator il = meth.GetILGenerator(); - - // Add test if contructeur not public - ConstructorInfo ctor = typeToCreate.GetConstructor(VISIBILITY, null, argumentTypes, null); - if (ctor==null || !ctor.IsPublic) - { - throw new ProbeException( - string.Format("Unable to optimize create instance. Cause : Could not find public constructor matching specified arguments for type \"{0}\".", typeToCreate.Name)); - } - // new typeToCreate() or new typeToCreate(... arguments ...) - EmitArgsIL(il, argumentTypes); - il.Emit(OpCodes.Newobj, ctor); - il.Emit(OpCodes.Ret); - } - - /// - /// Emit parameter IL for a method call. - /// - /// IL generator. - /// Arguments type defined for a the constructor. - private void EmitArgsIL(ILGenerator il, Type[] argumentTypes) - { - // Add args. Since all args are objects, value types are unboxed. - // Refs to value types are to be converted to values themselves. - for (int i = 0; i < argumentTypes.Length; i++) - { - // Push args array reference on the stack , followed by the index. - // Ldelem will resolve them to args[i]. - il.Emit(OpCodes.Ldarg_1); // Argument 1 is argument array. - il.Emit(OpCodes.Ldc_I4, i); - il.Emit(OpCodes.Ldelem_Ref); - - // If param is a primitive/value type then we need to unbox it. - Type paramType = argumentTypes[i]; - if (paramType.IsValueType) - { - if (paramType.IsPrimitive || paramType.IsEnum) - { - il.Emit(OpCodes.Unbox, paramType); - il.Emit(BoxingOpCodes.GetOpCode(paramType)); - } - else if (paramType.IsValueType) - { - il.Emit(OpCodes.Unbox, paramType); - il.Emit(OpCodes.Ldobj, paramType); - } - } - } - } - - - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/FactoryLogAdapter.cs b/src/IBatisNet.Common/Utilities/Objects/FactoryLogAdapter.cs deleted file mode 100644 index 5b79ca9..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/FactoryLogAdapter.cs +++ /dev/null @@ -1,134 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-11-09 11:44:07 -0700 (Thu, 09 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Text; -using IBatisNet.Common.Logging; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// A wrapper arround an implementation which logs argument type and value - /// when CreateInstance is called. - /// - public class FactoryLogAdapter : IFactory - { - private IFactory _factory = null; - private string _typeName = string.Empty; - private string _parametersTypeName = string.Empty; - - private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - - /// - /// Initializes a new instance of the class. - /// - /// The type. - /// The paramters types. - /// The factory. - public FactoryLogAdapter(Type type, Type[] paramtersTypes, IFactory factory) - { - _factory = factory; - _typeName = type.FullName; - _parametersTypeName = GenerateParametersName(paramtersTypes); - } - - #region IFactory Members - - /// - /// Create a new instance with the specified parameters - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// A new instance - /// - /// If you call a constructor with no parameters, pass null. - /// Anyway, what you pass will be ignore. - /// - public object CreateInstance(object[] parameters) - { - object newObject = null; - - try - { - newObject = _factory.CreateInstance(parameters); - } - catch - { - _logger.Debug("Enabled to create instance for type '" + _typeName); - _logger.Debug(" using parameters type : " + _parametersTypeName ); - _logger.Debug(" using parameters value : " + GenerateLogInfoForParameterValue(parameters) ); - throw; - } - - return newObject; - } - - #endregion - - /// - /// Generates the a string containing all parameter type names. - /// - /// The types of the constructor arguments - /// The string. - private string GenerateParametersName(object[] arguments) - { - StringBuilder names = new StringBuilder(); - if ((arguments != null) && (arguments.Length != 0)) - { - for (int i=0; i - /// Generates the a string containing all parameters value. - /// - /// The arguments - /// The string. - private string GenerateLogInfoForParameterValue(object[] arguments) - { - StringBuilder values = new StringBuilder(); - if ((arguments != null) && (arguments.Length != 0)) - { - for (int i=0; i - /// Factory to create object for a given type - /// - public interface IFactory - { - /// - /// Create a new instance with the specified parameters - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// - /// If you call a constructor with no parameters, pass null. - /// Anyway, what you pass will be ignore. - /// - /// A new instance - object CreateInstance(object[] parameters); - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs b/src/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs deleted file mode 100644 index 04224cd..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/IObjectFactory.cs +++ /dev/null @@ -1,44 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// A factory that can create objects - /// - public interface IObjectFactory - { - /// - /// Create a new instance for a given type - /// - /// The type instance to build - /// The types of the constructor arguments - /// Returns a new see cref="IFactory"/> instance - IFactory CreateFactory(Type typeToCreate, Type[] types); - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/AccessorFactory.cs b/src/IBatisNet.Common/Utilities/Objects/Members/AccessorFactory.cs deleted file mode 100644 index 1bb22ab..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/AccessorFactory.cs +++ /dev/null @@ -1,64 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// Accessor factory - /// - public class AccessorFactory - { - private ISetAccessorFactory _setAccessorFactory = null; - private IGetAccessorFactory _getAccessorFactory = null; - - /// - /// The factory which build - /// - public ISetAccessorFactory SetAccessorFactory - { - get { return _setAccessorFactory; } - } - - /// - /// The factory which build - /// - public IGetAccessorFactory GetAccessorFactory - { - get { return _getAccessorFactory; } - } - - /// - /// Initializes a new instance of the class. - /// - /// The set accessor factory. - /// The get accessor factory. - public AccessorFactory(ISetAccessorFactory setAccessorFactory, - IGetAccessorFactory getAccessorFactory) - { - _setAccessorFactory = setAccessorFactory; - _getAccessorFactory = getAccessorFactory; - } - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/BaseAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/BaseAccessor.cs deleted file mode 100644 index a9e27ec..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/BaseAccessor.cs +++ /dev/null @@ -1,166 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// Abstract base class for member accessor - /// - public abstract class BaseAccessor - { - /// - /// The property name - /// - protected string propertyName = string.Empty; - - /// - /// The target type - /// - protected Type targetType = null; - - /// - /// The null internal value used by this member type - /// - protected object nullInternal = null; - - /// - /// List of type-opCode - /// - protected static IDictionary typeToOpcode = new HybridDictionary(); - - /// - /// Static constructor - /// "Initialize a private IDictionary with type-opCode pairs - /// - static BaseAccessor() - { - typeToOpcode[typeof(sbyte)] = OpCodes.Ldind_I1; - typeToOpcode[typeof(byte)] = OpCodes.Ldind_U1; - typeToOpcode[typeof(char)] = OpCodes.Ldind_U2; - typeToOpcode[typeof(short)] = OpCodes.Ldind_I2; - typeToOpcode[typeof(ushort)] = OpCodes.Ldind_U2; - typeToOpcode[typeof(int)] = OpCodes.Ldind_I4; - typeToOpcode[typeof(uint)] = OpCodes.Ldind_U4; - typeToOpcode[typeof(long)] = OpCodes.Ldind_I8; - typeToOpcode[typeof(ulong)] = OpCodes.Ldind_I8; - typeToOpcode[typeof(bool)] = OpCodes.Ldind_I1; - typeToOpcode[typeof(double)] = OpCodes.Ldind_R8; - typeToOpcode[typeof(float)] = OpCodes.Ldind_R4; - } - - - /// - /// Gets the property info. - /// - /// The target type. - /// - protected PropertyInfo GetPropertyInfo(Type target) - { - PropertyInfo propertyInfo = null; - - propertyInfo = target.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (propertyInfo == null) - { - if (target.IsInterface) - { - // JIRA 210 - // Fix for interface inheriting - // Loop through interfaces of the type - foreach (Type interfaceType in target.GetInterfaces()) - { - // Get propertyinfo and if found the break out of loop - propertyInfo = GetPropertyInfo(interfaceType); - if (propertyInfo != null) - { - break; - } - } - } - else - { - // deals with Overriding a property using new and reflection - // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx - propertyInfo = target.GetProperty(propertyName); - } - } - - return propertyInfo; - } - - /// - /// Get the null value for a given type - /// - /// - /// - protected object GetNullInternal(Type type) - { - if (type.IsValueType) - { - if (type.IsEnum) - { - return GetNullInternal(Enum.GetUnderlyingType(type)); - } - - if (type.IsPrimitive) - { - if (type == typeof(Int32)) { return 0; } - if (type == typeof(Double)) { return (Double)0; } - if (type == typeof(Int16)) { return (Int16)0; } - if (type == typeof(SByte)) { return (SByte)0; } - if (type == typeof(Int64)) { return (Int64)0; } - if (type == typeof(Byte)) { return (Byte)0; } - if (type == typeof(UInt16)) { return (UInt16)0; } - if (type == typeof(UInt32)) { return (UInt32)0; } - if (type == typeof(UInt64)) { return (UInt64)0; } - if (type == typeof(UInt64)) { return (UInt64)0; } - if (type == typeof(Single)) { return (Single)0; } - if (type == typeof(Boolean)) { return false; } - if (type == typeof(char)) { return '\0'; } - } - else - { - //DateTime : 01/01/0001 00:00:00 - //TimeSpan : 00:00:00 - //Guid : 00000000-0000-0000-0000-000000000000 - //Decimal : 0 - - if (type == typeof(DateTime)) { return DateTime.MinValue; } - if (type == typeof(Decimal)) { return 0m; } - if (type == typeof(Guid)) { return Guid.Empty; } - if (type == typeof(TimeSpan)) { return new TimeSpan(0, 0, 0); } - } - } - - return null; - } - - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/DelegateGetFieldAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/DelegateGetFieldAccessor.cs deleted file mode 100644 index 59a9fc8..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/DelegateGetFieldAccessor.cs +++ /dev/null @@ -1,133 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class defines a field get accessor and - /// provides Reflection.Emit-generated - /// via the new DynamicMethod (.NET V2). - /// - public sealed class DelegateFieldGetAccessor : BaseAccessor, IGetAccessor - { - private delegate object GetValue(object instance); - - private GetValue _get = null; - /// - /// The field name - /// - private string _fieldName = string.Empty; - /// - /// The class parent type - /// - private Type _fieldType = null; - - /// - /// Initializes a new instance of the class - /// for field get access via DynamicMethod. - /// - /// Type of the target object. - /// Name of the field. - public DelegateFieldGetAccessor(Type targetObjectType, string fieldName) - { - // this.targetType = targetObjectType; - _fieldName = fieldName; - - FieldInfo fieldInfo = targetObjectType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); - - // Make sure the field exists - if (fieldInfo == null) - { - throw new NotSupportedException( - string.Format("Field \"{0}\" does not exist for type " - + "{1}.", fieldName, targetObjectType)); - } - else - { - _fieldType = fieldInfo.FieldType; - this.nullInternal = this.GetNullInternal(_fieldType); - - DynamicMethod dynamicMethodGet = new DynamicMethod("GetImplementation", typeof(object), new Type[] { typeof(object) }, this.GetType().Module, false); - ILGenerator ilgen = dynamicMethodGet.GetILGenerator(); - - // Emit the IL for get access. - - // We need a reference to the current instance (stored in local argument index 0) - // so Ldfld can load from the correct instance (this one). - ilgen.Emit(OpCodes.Ldarg_0); - ilgen.Emit(OpCodes.Ldfld, fieldInfo); - if (_fieldType.IsValueType) - { - // Now, we execute the box opcode, which pops the value of field 'x', - // returning a reference to the filed value boxed as an object. - ilgen.Emit(OpCodes.Box, fieldInfo.FieldType); - } - ilgen.Emit(OpCodes.Ret); - _get = (GetValue)dynamicMethodGet.CreateDelegate(typeof(GetValue)); - } - } - - #region IAccessor Members - - - /// - /// Gets the field's name. - /// - /// - public string Name - { - get { return _fieldName; } - } - - /// - /// Gets the field's type. - /// - /// - public Type MemberType - { - get { return _fieldType; } - } - - #endregion - - #region IGet Members - - /// - /// Gets the field value from the specified target. - /// - /// Target object. - /// Property value. - public object Get(object target) - { - return _get(target); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs deleted file mode 100644 index 42e7da8..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs +++ /dev/null @@ -1,150 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class defines a get property accessor and - /// provides Reflection.Emit-generated - /// via the new DynamicMethod (.NET V2). - /// - public sealed class DelegatePropertyGetAccessor : BaseAccessor, IGetAccessor - { - private delegate object GetValue(object instance); - - private GetValue _get = null; - /// - /// The property type - /// - private Type _propertyType = null; - private bool _canRead = false; - - /// - /// Initializes a new instance of the class - /// for get property access via DynamicMethod. - /// - /// Type of the target object. - /// Name of the property. - public DelegatePropertyGetAccessor(Type targetObjectType, string propertyName) - { - targetType = targetObjectType; - this.propertyName = propertyName; - - PropertyInfo propertyInfo = GetPropertyInfo(targetObjectType); - - if (propertyInfo == null) - { - propertyInfo = targetType.GetProperty(propertyName); - } - - // Make sure the property exists - if(propertyInfo == null) - { - throw new NotSupportedException( - string.Format("Property \"{0}\" does not exist for type " - + "{1}.", propertyName, targetType)); - } - else - { - _propertyType = propertyInfo.PropertyType; - _canRead = propertyInfo.CanRead; - - this.nullInternal = this.GetNullInternal(_propertyType); - - if (propertyInfo.CanRead) - { - DynamicMethod dynamicMethod = new DynamicMethod("GetImplementation", typeof(object), new Type[] { typeof(object) }, this.GetType().Module, true); - ILGenerator ilgen = dynamicMethod.GetILGenerator(); - - // Emit the IL for get access. - MethodInfo targetGetMethod = propertyInfo.GetGetMethod(); - - ilgen.DeclareLocal(typeof(object)); - ilgen.Emit(OpCodes.Ldarg_0); //Load the first argument,(target object) - ilgen.Emit(OpCodes.Castclass, targetObjectType); //Cast to the source type - ilgen.EmitCall(OpCodes.Callvirt, targetGetMethod, null); //Get the property value - if (targetGetMethod.ReturnType.IsValueType) - { - ilgen.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box if necessary - } - ilgen.Emit(OpCodes.Stloc_0); //Store it - ilgen.Emit(OpCodes.Ldloc_0); - ilgen.Emit(OpCodes.Ret); - - _get = (GetValue)dynamicMethod.CreateDelegate(typeof(GetValue)); - } - } - } - - #region IAccessor Members - - /// - /// Gets the property's name. - /// - /// - public string Name - { - get { return propertyName; } - } - - /// - /// Gets the property's type. - /// - /// - public Type MemberType - { - get { return _propertyType; } - } - - #endregion - - #region IGet Members - - /// - /// Gets the field value from the specified target. - /// - /// Target object. - /// Property value. - public object Get(object target) - { - if (_canRead) - { - return _get(target); - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} doesn't have a get method.", propertyName, targetType)); - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertySetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertySetAccessor.cs deleted file mode 100644 index 866cd47..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/DelegatePropertySetAccessor.cs +++ /dev/null @@ -1,166 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class defines a set property accessor and - /// provides Reflection.Emit-generated - /// via the new DynamicMethod (.NET V2). - /// - public sealed class DelegatePropertySetAccessor : BaseAccessor, ISetAccessor - { - private delegate void SetValue(object instance, object value); - - private SetValue _set = null; - - /// - /// The property type - /// - private Type _propertyType = null; - private bool _canWrite = false; - - /// - /// Initializes a new instance of the class - /// for set property access via DynamicMethod. - /// - /// Type of the target object. - /// Name of the property. - public DelegatePropertySetAccessor(Type targetObjectType, string propName) - { - targetType = targetObjectType; - propertyName = propName; - - PropertyInfo propertyInfo = GetPropertyInfo(targetObjectType); - - // Make sure the property exists - if(propertyInfo == null) - { - throw new NotSupportedException( - string.Format("Property \"{0}\" does not exist for type " - + "{1}.", propertyName, targetType)); - } - else - { - _propertyType = propertyInfo.PropertyType; - _canWrite = propertyInfo.CanWrite; - - this.nullInternal = this.GetNullInternal(_propertyType); - - if (propertyInfo.CanWrite) - { - DynamicMethod dynamicMethod = new DynamicMethod("SetImplementation", null, new Type[] { typeof(object), typeof(object) }, this.GetType().Module, true); - ILGenerator ilgen = dynamicMethod.GetILGenerator(); - - // Emit the IL for set access. - MethodInfo targetSetMethod = propertyInfo.GetSetMethod(); - - Type paramType = targetSetMethod.GetParameters()[0].ParameterType; - ilgen.DeclareLocal(paramType); - ilgen.Emit(OpCodes.Ldarg_0); //Load the first argument (target object) - ilgen.Emit(OpCodes.Castclass, targetType); //Cast to the source type - ilgen.Emit(OpCodes.Ldarg_1); //Load the second argument (value object) - if (paramType.IsValueType) - { - ilgen.Emit(OpCodes.Unbox, paramType); //Unbox it - if (typeToOpcode[paramType] != null) - { - OpCode load = (OpCode)typeToOpcode[paramType]; - ilgen.Emit(load); //and load - } - else - { - ilgen.Emit(OpCodes.Ldobj, paramType); - } - } - else - { - ilgen.Emit(OpCodes.Castclass, paramType); //Cast class - } - ilgen.EmitCall(OpCodes.Callvirt, targetSetMethod, null); //Set the property value - ilgen.Emit(OpCodes.Ret); - - _set = (SetValue)dynamicMethod.CreateDelegate(typeof(SetValue)); - } - } - } - - #region IAccessor Members - - /// - /// Gets the property's name. - /// - /// - public string Name - { - get { return propertyName; } - } - - /// - /// Gets the property's type. - /// - /// - public Type MemberType - { - get { return _propertyType; } - } - - #endregion - - #region ISet Members - - /// - /// Sets the field for the specified target. - /// - /// Target object. - /// Value to set. - public void Set(object target, object value) - { - if (_canWrite) - { - object newValue = value; - if (newValue == null) - { - // If the value to assign is null, assign null internal value - newValue = nullInternal; - } - - _set(target, newValue); - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} doesn't have a set method.", propertyName, targetType)); - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/DelegateSetFieldAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/DelegateSetFieldAccessor.cs deleted file mode 100644 index 9f432cf..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/DelegateSetFieldAccessor.cs +++ /dev/null @@ -1,144 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-09 20:24:53 +0200 (dim., 09 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class defines a field get accessor and - /// provides Reflection.Emit-generated - /// via the new DynamicMethod (.NET V2). - /// - public sealed class DelegateFieldSetAccessor : BaseAccessor, ISetAccessor - { - private delegate void SetValue(object instance, object value); - - private SetValue _set = null; - - /// - /// The field name - /// - private string _fieldName = string.Empty; - /// - /// The class parent type - /// - private Type _fieldType = null; - - /// - /// Initializes a new instance of the class - /// for field get access via DynamicMethod. - /// - /// Type of the target object. - /// Name of the field. - public DelegateFieldSetAccessor(Type targetObjectType, string fieldName) - { - // this.targetType = targetObjectType; - _fieldName = fieldName; - - FieldInfo fieldInfo = targetObjectType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); - - // Make sure the field exists - if (fieldInfo == null) - { - throw new NotSupportedException( - string.Format("Field \"{0}\" does not exist for type " - + "{1}.", fieldName, targetObjectType)); - } - else - { - _fieldType = fieldInfo.FieldType; - this.nullInternal = this.GetNullInternal(_fieldType); - - // Emit the IL for set access. - DynamicMethod dynamicMethodSet = new DynamicMethod("SetImplementation", null, new Type[] { typeof(object), typeof(object) }, this.GetType().Module, false); - ILGenerator ilgen = dynamicMethodSet.GetILGenerator(); - - ilgen = dynamicMethodSet.GetILGenerator(); - - ilgen.Emit(OpCodes.Ldarg_0); - ilgen.Emit(OpCodes.Ldarg_1); - UnboxIfNeeded(fieldInfo.FieldType, ilgen); - ilgen.Emit(OpCodes.Stfld, fieldInfo); - ilgen.Emit(OpCodes.Ret); - - _set = (SetValue)dynamicMethodSet.CreateDelegate(typeof(SetValue)); - } - } - - #region IAccessor Members - - /// - /// Gets the field's name. - /// - /// - public string Name - { - get { return _fieldName; } - } - - /// - /// Gets the field's type. - /// - /// - public Type MemberType - { - get { return _fieldType; } - } - - #endregion - - #region ISet Members - - /// - /// Sets the field for the specified target. - /// - /// Target object. - /// Value to set. - public void Set(object target, object value) - { - object newValue = value; - if (newValue == null) - { - // If the value to assign is null, assign null internal value - newValue = nullInternal; - } - _set(target, newValue); - } - - #endregion - - private static void UnboxIfNeeded(Type type, ILGenerator generator) - { - if (type.IsValueType) - { - generator.Emit(OpCodes.Unbox_Any, type); - } - } - - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldGetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldGetAccessor.cs deleted file mode 100644 index 6f79747..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldGetAccessor.cs +++ /dev/null @@ -1,200 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an IL-based get access - /// to a field of a specified target class. - /// - /// Will Throw FieldAccessException on private field - public sealed class EmitFieldGetAccessor : BaseAccessor, IGetAccessor - { - private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - - /// - /// The field name - /// - private string _fieldName = string.Empty; - /// - /// The class parent type - /// - private Type _fieldType = null; - /// - /// The IL emitted IGet - /// - private IGet _emittedGet = null; - private Type _targetType = null; - - /// - /// Initializes a new instance of the class. - /// - /// Type of the target object. - /// Name of the field. - /// The assembly builder. - /// The module builder. - public EmitFieldGetAccessor(Type targetObjectType, string fieldName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - _targetType = targetObjectType; - _fieldName = fieldName; - - FieldInfo fieldInfo = _targetType.GetField(fieldName, VISIBILITY); - - // Make sure the field exists - if(fieldInfo == null) - { - throw new NotSupportedException( - string.Format("Field \"{0}\" does not exist for type " - + "{1}.", fieldName, targetObjectType)); - } - else - { - _fieldType = fieldInfo.FieldType; - this.EmitIL(assemblyBuilder, moduleBuilder); - } - } - - /// - /// This method create a new type oject for the the property accessor class - /// that will provide dynamic access. - /// - /// The assembly builder. - /// The module builder. - private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - // Create a new type object for the the field accessor class. - EmitType(moduleBuilder); - - // Create a new instance - _emittedGet = assemblyBuilder.CreateInstance("GetFor" + _targetType.FullName + _fieldName) as IGet; - - this.nullInternal = this.GetNullInternal(_fieldType); - - if (_emittedGet == null) - { - throw new NotSupportedException( - string.Format("Unable to create a get field accessor for '{0}' field on class '{0}'.", _fieldName, _fieldType)); - } - } - - /// - /// Create an type that will provide the set access method. - /// - /// - /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); - /// CodeAccessPermission.RevertAssert(); - /// - /// The module builder. - private void EmitType(ModuleBuilder moduleBuilder) - { - // Define a public class named "GetFor.FullTagetTypeName.FieldName" in the assembly. - TypeBuilder typeBuilder = moduleBuilder.DefineType("GetFor" + _targetType.FullName + _fieldName, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); - - // Mark the class as implementing IMemberAccessor. - typeBuilder.AddInterfaceImplementation(typeof(IGet)); - - // Add a constructor - typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); - - #region Emit Get - // Define a method named "Get" for the get operation (IMemberAccessor). - Type[] getParamTypes = new Type[] { typeof(object) }; - MethodBuilder getMethod = typeBuilder.DefineMethod("Get", - MethodAttributes.Public | MethodAttributes.Virtual, - typeof(object), - getParamTypes); - - // Get an ILGenerator and used it to emit the IL that we want. - ILGenerator getIL = getMethod.GetILGenerator(); - - FieldInfo targetField = _targetType.GetField(_fieldName, VISIBILITY); - - // Emit the IL for get access. - if (targetField != null) - { - // We need a reference to the current instance (stored in local argument index 1) - // so Ldfld can load from the correct instance (this one). - getIL.Emit(OpCodes.Ldarg_1); - getIL.Emit(OpCodes.Ldfld, targetField); - if (_fieldType.IsValueType) - { - // Now, we execute the box opcode, which pops the value of field 'x', - // returning a reference to the filed value boxed as an object. - getIL.Emit(OpCodes.Box, targetField.FieldType); - } - getIL.Emit(OpCodes.Ret); - } - else - { - getIL.ThrowException(typeof(MissingMethodException)); - } - #endregion - - // Load the type - typeBuilder.CreateType(); - } - - - #region IAccessor Members - - /// - /// Gets the field's name. - /// - /// - public string Name - { - get { return _fieldName; } - } - - /// - /// Gets the field's type. - /// - /// - public Type MemberType - { - get { return _fieldType; } - } - - #endregion - - #region IGet Members - - /// - /// Gets the value stored in the field for the specified target. - /// - /// Object to retrieve the field from. - /// The value. - public object Get(object target) - { - return _emittedGet.Get(target); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldSetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldSetAccessor.cs deleted file mode 100644 index ffff6f6..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/EmitFieldSetAccessor.cs +++ /dev/null @@ -1,217 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an IL-based set access - /// to a field of a specified target class. - /// - /// Will Throw FieldAccessException on private field - public sealed class EmitFieldSetAccessor : BaseAccessor, ISetAccessor - { - private const BindingFlags VISIBILITY = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - - /// - /// The field name - /// - private string _fieldName = string.Empty; - /// - /// The class parent type - /// - private Type _fieldType = null; - /// - /// The IL emitted ISet - /// - private ISet _emittedSet = null; - private Type _targetType = null; - - /// - /// Initializes a new instance of the class. - /// - /// Type of the target object. - /// Name of the field. - /// The assembly builder. - /// The module builder. - public EmitFieldSetAccessor(Type targetObjectType, string fieldName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - _targetType = targetObjectType; - _fieldName = fieldName; - - FieldInfo fieldInfo = _targetType.GetField(fieldName, VISIBILITY); - - // Make sure the field exists - if(fieldInfo == null) - { - throw new NotSupportedException( - string.Format("Field \"{0}\" does not exist for type " - + "{1}.", fieldName, targetObjectType)); - } - else - { - _fieldType = fieldInfo.FieldType; - this.EmitIL(assemblyBuilder, moduleBuilder); - } - } - - /// - /// This method create a new type oject for the the property accessor class - /// that will provide dynamic access. - /// - /// The assembly builder. - /// The module builder. - private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - // Create a new type object for the the field accessor class. - EmitType(moduleBuilder); - - // Create a new instance - _emittedSet = assemblyBuilder.CreateInstance("SetFor" + _targetType.FullName + _fieldName) as ISet; - - this.nullInternal = this.GetNullInternal(_fieldType); - - if (_emittedSet == null) - { - throw new NotSupportedException( - string.Format("Unable to create a set field accessor for '{0}' field on class '{0}'.", _fieldName, _fieldType)); - } - } - - /// - /// Create an type that will provide the set access method. - /// - /// - /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); - /// CodeAccessPermission.RevertAssert(); - /// - /// The module builder. - private void EmitType(ModuleBuilder moduleBuilder) - { - // Define a public class named "SetFor.FullTargetTypeName.FieldName" in the assembly. - TypeBuilder typeBuilder = moduleBuilder.DefineType("SetFor" + _targetType.FullName + _fieldName, TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); - - // Mark the class as implementing ISet. - typeBuilder.AddInterfaceImplementation(typeof(ISet)); - - // Add a constructor - typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); - - #region Emit Set - // Define a method named "Set" for the set operation (IMemberAccessor). - Type[] setParamTypes = new Type[] { typeof(object), typeof(object) }; - MethodBuilder setMethod = typeBuilder.DefineMethod("Set", - MethodAttributes.Public | MethodAttributes.Virtual, - null, - setParamTypes); - - // Get an ILGenerator and used to emit the IL that we want. - ILGenerator setIL = setMethod.GetILGenerator(); - - FieldInfo targetField = _targetType.GetField(_fieldName, VISIBILITY); - - // Emit the IL for the set access. - if (targetField != null) - { - setIL.Emit(OpCodes.Ldarg_1);//Load the first argument (target object) - setIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type - setIL.Emit(OpCodes.Ldarg_2);//Load the second argument (value object) - if (_fieldType.IsValueType) - { - setIL.Emit(OpCodes.Unbox, _fieldType); //Unbox it - if (typeToOpcode[_fieldType] != null) - { - OpCode load = (OpCode)typeToOpcode[_fieldType]; - setIL.Emit(load); //and load - } - else - { - setIL.Emit(OpCodes.Ldobj, _fieldType); - } - setIL.Emit(OpCodes.Stfld, targetField); //Set the field value - } - else - { - // setIL.Emit(OpCodes.Castclass, _fieldType); //Cast class - setIL.Emit(OpCodes.Stfld, targetField); - } - } - else - { - setIL.ThrowException(typeof(MissingMethodException)); - } - setIL.Emit(OpCodes.Ret); - #endregion - - // Load the type - typeBuilder.CreateType(); - } - - #region IAccessor Members - - /// - /// Gets the field's name. - /// - /// - public string Name - { - get { return _fieldName; } - } - - /// - /// Gets the field's type. - /// - /// - public Type MemberType - { - get { return _fieldType; } - } - - #endregion - - #region ISet Members - - /// - /// Sets the field for the specified target. - /// - /// Target object. - /// Value to set. - public void Set(object target, object value) - { - object newValue = value; - if (newValue == null) - { - // If the value to assign is null, assign null internal value - newValue = nullInternal; - } - _emittedSet.Set(target, newValue); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyGetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyGetAccessor.cs deleted file mode 100644 index 64eab6b..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertyGetAccessor.cs +++ /dev/null @@ -1,219 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an IL-based get access - /// to a property of a specified target class. - /// - public sealed class EmitPropertyGetAccessor : BaseAccessor, IGetAccessor - { - /// - /// The property name - /// - private string _propertyName = string.Empty; - /// - /// The property type - /// - private Type _propertyType = null; - /// - /// The class parent type - /// - private Type _targetType = null; - private bool _canRead = false; - /// - /// The IL emitted IGet - /// - private IGet _emittedGet = null; - - - /// - /// Initializes a new instance of the class. - /// - /// Type of the target object. - /// Name of the property. - /// The . - /// The . - public EmitPropertyGetAccessor(Type targetObjectType, string propertyName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - _targetType = targetObjectType; - _propertyName = propertyName; - - // deals with Overriding a property using new and reflection - // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx - PropertyInfo propertyInfo = _targetType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (propertyInfo == null) - { - propertyInfo = _targetType.GetProperty(propertyName); - } - - // Make sure the property exists - if(propertyInfo == null) - { - throw new NotSupportedException( - string.Format("Property \"{0}\" does not exist for type " - + "{1}.", propertyName, _targetType)); - } - else - { - this._propertyType = propertyInfo.PropertyType; - _canRead = propertyInfo.CanRead; - this.EmitIL(assemblyBuilder, moduleBuilder); - } - } - - /// - /// This method create a new type oject for the the property accessor class - /// that will provide dynamic access. - /// - /// The assembly builder. - /// The module builder. - private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - // Create a new type object for the the field accessor class. - EmitType(moduleBuilder); - - // Create a new instance - _emittedGet = assemblyBuilder.CreateInstance("GetFor" + _targetType.FullName + _propertyName) as IGet; - - this.nullInternal = this.GetNullInternal(_propertyType); - - if (_emittedGet == null) - { - throw new NotSupportedException( - string.Format("Unable to create a get property accessor for \"{0}\".", _propertyType)); - } - } - - /// - /// Create an type that will provide the set access method. - /// - /// - /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); - /// CodeAccessPermission.RevertAssert(); - /// - /// The module builder. - private void EmitType(ModuleBuilder moduleBuilder) - { - // Define a public class named "PropertyAccessorFor.FullTagetTypeName.PropertyName" in the assembly. - TypeBuilder typeBuilder = moduleBuilder.DefineType("GetFor" + _targetType.FullName + _propertyName, - TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); - - // Mark the class as implementing IMemberAccessor. - typeBuilder.AddInterfaceImplementation(typeof(IGet)); - - // Add a constructor - typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); - - #region Emit Get - // Define a method named "Get" for the get operation (IGet). - Type[] getParamTypes = new Type[] { typeof(object) }; - MethodBuilder methodBuilder = typeBuilder.DefineMethod("Get", - MethodAttributes.Public | MethodAttributes.Virtual, typeof(object), getParamTypes); - // Get an ILGenerator and used it to emit the IL that we want. - ILGenerator generatorIL = methodBuilder.GetILGenerator(); - - if (_canRead) - { - // Emit the IL for get access. - MethodInfo targetGetMethod = _targetType.GetMethod("get_" + _propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (targetGetMethod == null) - { - targetGetMethod = _targetType.GetMethod("get_" + _propertyName); - } - - generatorIL.DeclareLocal(typeof(object)); - generatorIL.Emit(OpCodes.Ldarg_1); //Load the first argument,(target object) - generatorIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type - generatorIL.EmitCall(OpCodes.Call, targetGetMethod, null); //Get the property value - if (targetGetMethod.ReturnType.IsValueType) - { - generatorIL.Emit(OpCodes.Box, targetGetMethod.ReturnType); //Box if necessary - } - generatorIL.Emit(OpCodes.Stloc_0); //Store it - generatorIL.Emit(OpCodes.Ldloc_0); - generatorIL.Emit(OpCodes.Ret); - } - else - { - generatorIL.ThrowException(typeof(MissingMethodException)); - } - #endregion - - // Load the type - typeBuilder.CreateType(); - } - - #region IAccessor Members - - /// - /// Gets the property's name. - /// - /// - public string Name - { - get { return _propertyName; } - } - - /// - /// Gets the property's type. - /// - /// - public Type MemberType - { - get { return _propertyType; } - } - - #endregion - - #region IGet Members - - /// - /// Gets the property value from the specified target. - /// - /// Target object. - /// Property value. - public object Get(object target) - { - if (_canRead) - { - return _emittedGet.Get(target); - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} doesn't have a get method.", _propertyName, _targetType)); - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertySetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertySetAccessor.cs deleted file mode 100644 index 1a5c569..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/EmitPropertySetAccessor.cs +++ /dev/null @@ -1,245 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using System.Reflection.Emit; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an IL-based set access - /// to a property of a specified target class. - /// - public sealed class EmitPropertySetAccessor : BaseAccessor, ISetAccessor - { - /// - /// The property name - /// - private string _propertyName = string.Empty; - /// - /// The property type - /// - private Type _propertyType = null; - /// - /// The class parent type - /// - private Type _targetType = null; - - private bool _canWrite = false; - /// - /// The IL emitted ISet - /// - private ISet _emittedSet = null; - - /// - /// Initializes a new instance of the class. - /// Generates the implementation for setter methods. - /// - /// Type of the target object. - /// Name of the property. - /// The . - /// The . - public EmitPropertySetAccessor(Type targetObjectType, string propertyName, AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - _targetType = targetObjectType; - _propertyName = propertyName; - - // deals with Overriding a property using new and reflection - // http://blogs.msdn.com/thottams/archive/2006/03/17/553376.aspx - PropertyInfo propertyInfo = _targetType.GetProperty(propertyName, BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (propertyInfo == null) - { - propertyInfo = _targetType.GetProperty(propertyName); - } - - // Make sure the property exists - if(propertyInfo == null) - { - throw new NotSupportedException( - string.Format("Property \"{0}\" does not exist for type " - + "{1}.", propertyName, _targetType)); - } - else - { - this._propertyType = propertyInfo.PropertyType; - _canWrite = propertyInfo.CanWrite; - this.EmitIL(assemblyBuilder, moduleBuilder); - } - } - - - /// - /// This method create a new type oject for the the property accessor class - /// that will provide dynamic access. - /// - /// The assembly builder. - /// The module builder. - private void EmitIL(AssemblyBuilder assemblyBuilder, ModuleBuilder moduleBuilder) - { - // Create a new type object for the the field accessor class. - EmitType(moduleBuilder); - - // Create a new instance - _emittedSet = assemblyBuilder.CreateInstance("SetFor" + _targetType.FullName + _propertyName) as ISet; - - this.nullInternal = this.GetNullInternal(_propertyType); - - if (_emittedSet == null) - { - throw new NotSupportedException( - string.Format("Unable to create a get propert accessor for '{0}' property on class '{1}'.", _propertyName, _propertyType.ToString())); - } - } - - - /// - /// Create an type that will provide the set access method. - /// - /// - /// new ReflectionPermission(PermissionState.Unrestricted).Assert(); - /// CodeAccessPermission.RevertAssert(); - /// - /// The module builder. - private void EmitType(ModuleBuilder moduleBuilder) - { - // Define a public class named "PropertyAccessorFor.FullTagetTypeName.PropertyName" in the assembly. - TypeBuilder typeBuilder = moduleBuilder.DefineType("SetFor" + _targetType.FullName + _propertyName, - TypeAttributes.Class | TypeAttributes.Public | TypeAttributes.Sealed); - - // Mark the class as implementing IMemberAccessor. - typeBuilder.AddInterfaceImplementation(typeof(ISet)); - - // Add a constructor - typeBuilder.DefineDefaultConstructor(MethodAttributes.Public); - - #region Emit Set - // Define a method named "Set" for the set operation (IMemberAccessor). - Type[] setParamTypes = new Type[] { typeof(object), typeof(object) }; - MethodBuilder methodBuilder = typeBuilder.DefineMethod("Set", - MethodAttributes.Public | MethodAttributes.Virtual, - null, - setParamTypes); - - // Get an ILGenerator and used to emit the IL that we want. - // Set(object, value); - ILGenerator generatorIL = methodBuilder.GetILGenerator(); - if (_canWrite) - { - // Emit the IL for the set access. - MethodInfo targetSetMethod = _targetType.GetMethod("set_" + _propertyName,BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (targetSetMethod == null) - { - targetSetMethod = _targetType.GetMethod("set_" + _propertyName); - } - Type paramType = targetSetMethod.GetParameters()[0].ParameterType; - - generatorIL.DeclareLocal(paramType); - generatorIL.Emit(OpCodes.Ldarg_1); //Load the first argument (target object) - generatorIL.Emit(OpCodes.Castclass, _targetType); //Cast to the source type - generatorIL.Emit(OpCodes.Ldarg_2); //Load the second argument (value object) - if (paramType.IsValueType) - { - generatorIL.Emit(OpCodes.Unbox, paramType); //Unbox it - if (typeToOpcode[paramType] != null) - { - OpCode load = (OpCode)typeToOpcode[paramType]; - generatorIL.Emit(load); //and load - } - else - { - generatorIL.Emit(OpCodes.Ldobj, paramType); - } - } - else - { - generatorIL.Emit(OpCodes.Castclass, paramType); //Cast class - } - generatorIL.EmitCall(OpCodes.Callvirt, targetSetMethod, null); //Set the property value - generatorIL.Emit(OpCodes.Ret); - } - else - { - generatorIL.ThrowException(typeof(MissingMethodException)); - } - #endregion - - // Load the type - typeBuilder.CreateType(); - } - - #region IAccessor Members - - /// - /// Gets the member name. - /// - /// - public string Name - { - get { return _propertyName; } - } - - /// - /// Gets the type of this member (field or property). - /// - /// - public Type MemberType - { - get { return _propertyType; } - } - - #endregion - - #region ISet Members - - /// - /// Sets the property for the specified target. - /// - /// Target object. - /// Value to set. - public void Set(object target, object value) - { - if (_canWrite) - { - object newValue = value; - if (newValue == null) - { - // If the value to assign is null, assign null internal value - newValue = nullInternal; - } - - _emittedSet.Set(target, newValue); - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} doesn't have a set method.", _propertyName, _targetType)); - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/GetAccessorFactory.cs b/src/IBatisNet.Common/Utilities/Objects/Members/GetAccessorFactory.cs deleted file mode 100644 index f09db64..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/GetAccessorFactory.cs +++ /dev/null @@ -1,293 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Reflection.Emit; -using System.Runtime.CompilerServices; -using System.Text; -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// A factory to build for a type. - /// - public class GetAccessorFactory : IGetAccessorFactory - { - private delegate IGetAccessor CreatePropertyGetAccessor(Type targetType, string propertyName); - private delegate IGetAccessor CreateFieldGetAccessor(Type targetType, string fieldName); - - private CreatePropertyGetAccessor _createPropertyGetAccessor = null; - private CreateFieldGetAccessor _createFieldGetAccessor = null; - - private IDictionary _cachedIGetAccessor = new HybridDictionary(); - private AssemblyBuilder _assemblyBuilder = null; - private ModuleBuilder _moduleBuilder = null; - private object _syncObject = new object(); - - /// - /// Initializes a new instance of the class. - /// - /// if set to true [allow code generation]. - public GetAccessorFactory(bool allowCodeGeneration) - { - if (allowCodeGeneration) - { - // Detect runtime environment and create the appropriate factory - if (Environment.Version.Major >= 2) - { -#if dotnet2 - _createPropertyGetAccessor = new CreatePropertyGetAccessor(CreateDynamicPropertyGetAccessor); - _createFieldGetAccessor = new CreateFieldGetAccessor(CreateDynamicFieldGetAccessor); -#endif - } - else - { - AssemblyName assemblyName = new AssemblyName(); - assemblyName.Name = "iBATIS.FastGetAccessor" + HashCodeProvider.GetIdentityHashCode(this).ToString(); - - // Create a new assembly with one module - _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); - - _createPropertyGetAccessor = new CreatePropertyGetAccessor(CreatePropertyAccessor); - _createFieldGetAccessor = new CreateFieldGetAccessor(CreateFieldAccessor); - } - } - else - { - _createPropertyGetAccessor = new CreatePropertyGetAccessor(CreateReflectionPropertyGetAccessor); - _createFieldGetAccessor = new CreateFieldGetAccessor(CreateReflectionFieldGetAccessor); - } - } - -#if dotnet2 - - - /// - /// Create a Dynamic IGetAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IGetAccessor CreateDynamicPropertyGetAccessor(Type targetType, string propertyName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - PropertyInfo propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); - - if (propertyInfo.CanRead) - { - MethodInfo methodInfo = null; -#if dotnet2 - methodInfo = propertyInfo.GetGetMethod(); -#else - methodInfo = targetType.GetMethod("get_" + propertyName); -#endif - if (methodInfo != null)// == visibilty public - { - return new DelegatePropertyGetAccessor(targetType, propertyName); - } - else - { - return new ReflectionPropertyGetAccessor(targetType, propertyName); - } - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} cannot be get.", propertyInfo.Name, targetType)); - } - } - - /// - /// Create a Dynamic IGetAccessor instance for a field - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IGetAccessor CreateDynamicFieldGetAccessor(Type targetType, string fieldName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - FieldInfo fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); - - if (fieldInfo.IsPublic) - { - return new DelegateFieldGetAccessor(targetType, fieldName); - } - else - { - return new ReflectionFieldGetAccessor(targetType, fieldName); - } - } -#endif - - - /// - /// Create a IGetAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IGetAccessor CreatePropertyAccessor(Type targetType, string propertyName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - PropertyInfo propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); - - if (propertyInfo.CanRead) - { - MethodInfo methodInfo = null; -#if dotnet2 - methodInfo = propertyInfo.GetGetMethod(); -#else - methodInfo = targetType.GetMethod("get_" + propertyName,BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (methodInfo == null) - { - methodInfo = targetType.GetMethod("get_" + propertyName); - } -#endif - if (methodInfo != null)// == visibilty public - { - return new EmitPropertyGetAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder); - } - else - { - return new ReflectionPropertyGetAccessor(targetType, propertyName); - } - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} cannot be get.", propertyInfo.Name, targetType)); - } - } - - /// - /// Create a IGetAccessor instance for a field - /// - /// Target object type. - /// Field name. - /// null if the generation fail - private IGetAccessor CreateFieldAccessor(Type targetType, string fieldName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - FieldInfo fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); - - if (fieldInfo.IsPublic) - { - return new EmitFieldGetAccessor(targetType, fieldName, _assemblyBuilder, _moduleBuilder); - } - else - { - return new ReflectionFieldGetAccessor(targetType, fieldName); - } - } - - /// - /// Create a Reflection IGetAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IGetAccessor CreateReflectionPropertyGetAccessor(Type targetType, string propertyName) - { - return new ReflectionPropertyGetAccessor(targetType, propertyName); - } - - /// - /// Create Reflection IGetAccessor instance for a field - /// - /// Target object type. - /// field name. - /// null if the generation fail - private IGetAccessor CreateReflectionFieldGetAccessor(Type targetType, string fieldName) - { - return new ReflectionFieldGetAccessor(targetType, fieldName); - } - - #region IGetAccessorFactory Members - - /// - /// Generate an instance. - /// - /// Target object type. - /// Field or Property name. - /// null if the generation fail - [MethodImpl(MethodImplOptions.Synchronized)] - public IGetAccessor CreateGetAccessor(Type targetType, string name) - { - string key = new StringBuilder(targetType.FullName).Append(".").Append(name).ToString(); - - if (_cachedIGetAccessor.Contains(key)) - { - return (IGetAccessor)_cachedIGetAccessor[key]; - } - else - { - IGetAccessor getAccessor = null; - lock (_syncObject) - { - if (!_cachedIGetAccessor.Contains(key)) - { - // Property - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - MemberInfo memberInfo = reflectionCache.GetGetter(name); - - if (memberInfo != null) - { - if (memberInfo is PropertyInfo) - { - getAccessor = _createPropertyGetAccessor(targetType, name); - _cachedIGetAccessor[key] = getAccessor; - } - else - { - getAccessor = _createFieldGetAccessor(targetType, name); - _cachedIGetAccessor[key] = getAccessor; - } - } - else - { - throw new ProbeException( - string.Format("No property or field named \"{0}\" exists for type " - + "{1}.", name, targetType)); - } - } - else - { - getAccessor = (IGetAccessor)_cachedIGetAccessor[key]; - } - } - return getAccessor; - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/IGetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/IGetAccessor.cs deleted file mode 100644 index 4ad1bac..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/IGetAccessor.cs +++ /dev/null @@ -1,39 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The interface defines a field/property get accessor. - /// provides Reflection.Emit-generated - /// implementations for drastically improved performance over default late-bind - /// invoke. - /// - public interface IGetAccessor : IAccessor, IGet - { - - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/ISetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/ISetAccessor.cs deleted file mode 100644 index c9b5e28..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/ISetAccessor.cs +++ /dev/null @@ -1,38 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-25 19:40:27 +0200 (mar., 25 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The interface defines a field/property set accessor. - /// provides Reflection.Emit-generated - /// implementations for drastically improved performance over default late-bind - /// invoke. - /// - public interface ISetAccessor : IAccessor, ISet - { - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs b/src/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs deleted file mode 100644 index 67c2aa0..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/MemberAccessorFactory.cs +++ /dev/null @@ -1,233 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Reflection.Emit; -using System.Runtime.CompilerServices; -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// A factory to build IMemberAccessor for a type. - /// - public class MemberAccessorFactory : IMemberAccessorFactory - { - private delegate IMemberAccessor CreateMemberPropertyAccessor(Type targetType, string propertyName); - private delegate IMemberAccessor CreateMemberFieldAccessor(Type targetType, string fieldName); - - private CreateMemberPropertyAccessor _createPropertyAccessor = null; - private CreateMemberFieldAccessor _createFieldAccessor = null; - - private IDictionary _cachedIMemberAccessor = new HybridDictionary(); - private AssemblyBuilder _assemblyBuilder = null; - private ModuleBuilder _moduleBuilder = null; - private object _syncObject = new object(); - - - /// - /// Initializes a new instance of the class. - /// - /// if set to true [allow code generation]. - public MemberAccessorFactory(bool allowCodeGeneration) - { - if (allowCodeGeneration) - { - // Detect runtime environment and create the appropriate factory - if (Environment.Version.Major >= 2) - { -#if dotnet2 - _createPropertyAccessor = new CreateMemberPropertyAccessor(CreateDelegatePropertyAccessor); - _createFieldAccessor = new CreateMemberFieldAccessor(CreateDynamicFieldAccessor); -#endif - } - else - { - AssemblyName assemblyName = new AssemblyName(); - assemblyName.Name = "iBATIS.FastPropertyAccessor"+HashCodeProvider.GetIdentityHashCode(this).ToString(); - - // Create a new assembly with one module - _assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); - - _createPropertyAccessor = new CreateMemberPropertyAccessor(CreateEmitPropertyAccessor); - _createFieldAccessor = new CreateMemberFieldAccessor(CreateFieldAccessor); - } - } - else - { - _createPropertyAccessor = new CreateMemberPropertyAccessor(CreateReflectionPropertyAccessor); - _createFieldAccessor = new CreateMemberFieldAccessor(CreateReflectionFieldAccessor); - } - - } - - /// - /// Generate an IMemberAccessor object - /// - /// Target object type. - /// Field or Property name. - /// null if the generation fail - [MethodImpl(MethodImplOptions.Synchronized)] - public IMemberAccessor CreateMemberAccessor(Type targetType, string name) - { - string key = targetType.FullName+name; - - if (_cachedIMemberAccessor.Contains(key)) - { - return (IMemberAccessor)_cachedIMemberAccessor[key]; - } - else - { - IMemberAccessor memberAccessor = null; - lock (_syncObject) - { - if (!_cachedIMemberAccessor.Contains(key)) - { - // Property - PropertyInfo propertyInfo = targetType.GetProperty(name); - - if (propertyInfo!=null) - { - memberAccessor = _createPropertyAccessor(targetType, name); - _cachedIMemberAccessor[key] = memberAccessor; - } - else - { - // Field - FieldInfo fieldInfo = targetType.GetField(name, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); - - if (fieldInfo!=null) - { - memberAccessor = _createFieldAccessor(targetType, name); - _cachedIMemberAccessor[key] = memberAccessor; - } - else - { - throw new ProbeException( - string.Format("No property or field named \"{0}\" exists for type " - + "{1}.",name, targetType)); - } - } - } - else - { - memberAccessor = (IMemberAccessor)_cachedIMemberAccessor[key]; - } - } - return memberAccessor; - } - } - -#if dotnet2 - /// - /// Create a Dynamic IMemberAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IMemberAccessor CreateDelegatePropertyAccessor(Type targetType, string propertyName) - { - return new DelegatePropertyAccessor(targetType, propertyName); - } - - /// - /// Create a Dynamic IMemberAccessor instance for a field - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IMemberAccessor CreateDynamicFieldAccessor(Type targetType, string fieldName) - { - FieldInfo fieldInfo = targetType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); - - if (fieldInfo.IsPublic) - { - return new DelegateFieldAccessor(targetType, fieldName); - } - else - { - return new ReflectionFieldAccessor(targetType, fieldName); - } - } -#endif - - /// - /// Create an IL IMemberAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IMemberAccessor CreateEmitPropertyAccessor(Type targetType, string propertyName) - { - return new EmitPropertyAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder); - } - - /// - /// Create a IMemberAccessor instance for a fiedl - /// - /// Target object type. - /// Field name. - /// null if the generation fail - private IMemberAccessor CreateFieldAccessor(Type targetType, string fieldName) - { - FieldInfo fieldInfo = targetType.GetField(fieldName, BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Public); - - if (fieldInfo.IsPublic) - { - return new EmitFieldAccessor(targetType, fieldName, _assemblyBuilder, _moduleBuilder); - } - else - { - return new ReflectionFieldAccessor(targetType, fieldName); - } - } - - /// - /// Create a Reflection IMemberAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private IMemberAccessor CreateReflectionPropertyAccessor(Type targetType, string propertyName) - { - return new ReflectionPropertyAccessor(targetType, propertyName); - } - - /// - /// Create Reflection IMemberAccessor instance for a field - /// - /// Target object type. - /// field name. - /// null if the generation fail - private IMemberAccessor CreateReflectionFieldAccessor(Type targetType, string fieldName) - { - return new ReflectionFieldAccessor(targetType, fieldName); - } - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs deleted file mode 100644 index 9801219..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldGetAccessor.cs +++ /dev/null @@ -1,80 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-05 22:23:27 +0200 (mer., 05 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an reflection get access - /// to a field of a specified target class. - /// - public sealed class ReflectionFieldGetAccessor : IGetAccessor - { - private FieldInfo _fieldInfo = null; - - /// - /// Initializes a new instance of the class. - /// - /// Type of the target. - /// Name of the field. - public ReflectionFieldGetAccessor(Type targetType, string fieldName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance( targetType ); - _fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); - } - - #region IGetAccessor Members - - /// - /// Gets the member name. - /// - public string Name - { - get { return _fieldInfo.Name; } - } - - /// - /// Gets the type of this member, such as field, property. - /// - public Type MemberType - { - get { return _fieldInfo.FieldType; } - } - - /// - /// Gets the value stored in the field for the specified target. - /// - /// Object to retrieve the field/property from. - /// The field alue. - public object Get(object target) - { - return _fieldInfo.GetValue(target); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs deleted file mode 100644 index 3fd8c15..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionFieldSetAccessor.cs +++ /dev/null @@ -1,80 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-05 22:23:27 +0200 (mer., 05 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an reflection set access - /// to a field of a specified target class. - /// - public sealed class ReflectionFieldSetAccessor : ISetAccessor - { - private FieldInfo _fieldInfo = null; - - /// - /// Initializes a new instance of the class. - /// - /// Type of the target. - /// Name of the field. - public ReflectionFieldSetAccessor(Type targetType, string fieldName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance( targetType ); - _fieldInfo = (FieldInfo)reflectionCache.GetGetter(fieldName); - } - - #region ISetAccessor Members - - /// - /// Gets the member name. - /// - public string Name - { - get { return _fieldInfo.Name; } - } - - /// - /// Gets the type of this member, such as field, property. - /// - public Type MemberType - { - get { return _fieldInfo.FieldType; } - } - - /// - /// Sets the value for the field of the specified target. - /// - /// Object to set the property on. - /// Property value. - public void Set(object target, object value) - { - _fieldInfo.SetValue(target, value); - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs deleted file mode 100644 index 944feba..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertyGetAccessor.cs +++ /dev/null @@ -1,100 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-05 22:23:27 +0200 (mer., 05 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an reflection get access - /// to a property of a specified target class. - /// - public sealed class ReflectionPropertyGetAccessor : IGetAccessor - { - private PropertyInfo _propertyInfo = null; - private string _propertyName = string.Empty; - private Type _targetType = null; - - /// - /// Initializes a new instance of the class. - /// - /// Type of the target. - /// Name of the property. - public ReflectionPropertyGetAccessor(Type targetType, string propertyName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance( targetType ); - _propertyInfo = (PropertyInfo)reflectionCache.GetGetter(propertyName); - - _targetType = targetType; - _propertyName = propertyName; - } - - - #region IAccessor Members - - /// - /// Gets the property name. - /// - public string Name - { - get { return _propertyInfo.Name; } - } - - /// - /// Gets the type of this property. - /// - public Type MemberType - { - get { return _propertyInfo.PropertyType; } - } - - #endregion - - #region IGet Members - - /// - /// Gets the value stored in the property for - /// the specified target. - /// - /// Object to retrieve the property from. - /// Property value. - public object Get(object target) - { - if (_propertyInfo.CanRead) - { - return _propertyInfo.GetValue(target, null); - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} doesn't have a get method.", _propertyName, _targetType)); - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs b/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs deleted file mode 100644 index e34f1bb..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/ReflectionPropertySetAccessor.cs +++ /dev/null @@ -1,98 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-30 10:41:07 +0200 (dim., 30 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// The class provides an reflection set access - /// to a property of a specified target class. - /// - public sealed class ReflectionPropertySetAccessor : ISetAccessor - { - private PropertyInfo _propertyInfo = null; - private string _propertyName = string.Empty; - private Type _targetType = null; - - /// - /// Initializes a new instance of the class. - /// - /// Type of the target. - /// Name of the property. - public ReflectionPropertySetAccessor(Type targetType, string propertyName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance( targetType ); - _propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); - - _targetType = targetType; - _propertyName = propertyName; - } - - #region IAccessor Members - - /// - /// Gets the property name. - /// - public string Name - { - get { return _propertyInfo.Name; } - } - - /// - /// Gets the type of this property. - /// - public Type MemberType - { - get { return _propertyInfo.PropertyType; } - } - - #endregion - - #region ISet Members - - /// - /// Sets the value for the property of the specified target. - /// - /// Object to set the property on. - /// Property value. - public void Set(object target, object value) - { - if (_propertyInfo.CanWrite) - { - _propertyInfo.SetValue(target, value, null); - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} doesn't have a set method.", _propertyName, _targetType)); - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/Members/SetAccessorFactory.cs b/src/IBatisNet.Common/Utilities/Objects/Members/SetAccessorFactory.cs deleted file mode 100644 index 9e20f77..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/Members/SetAccessorFactory.cs +++ /dev/null @@ -1,292 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-30 18:01:40 +0200 (dim., 30 avr. 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Reflection.Emit; -using System.Runtime.CompilerServices; -using System.Text; -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities.Objects.Members -{ - /// - /// A factory to build for a type. - /// - public class SetAccessorFactory : ISetAccessorFactory - { - private delegate ISetAccessor CreatePropertySetAccessor(Type targetType, string propertyName); - private delegate ISetAccessor CreateFieldSetAccessor(Type targetType, string fieldName); - - private CreatePropertySetAccessor _createPropertySetAccessor = null; - private CreateFieldSetAccessor _createFieldSetAccessor = null; - - private IDictionary _cachedISetAccessor = new HybridDictionary(); - private AssemblyBuilder _assemblyBuilder = null; - private ModuleBuilder _moduleBuilder = null; - private object _syncObject = new object(); - - /// - /// Initializes a new instance of the class. - /// - /// if set to true [allow code generation]. - public SetAccessorFactory(bool allowCodeGeneration) - { - if (allowCodeGeneration) - { - // Detect runtime environment and create the appropriate factory - if (Environment.Version.Major >= 2) - { -#if dotnet2 - _createPropertySetAccessor = new CreatePropertySetAccessor(CreateDynamicPropertySetAccessor); - _createFieldSetAccessor = new CreateFieldSetAccessor(CreateDynamicFieldSetAccessor); -#endif - } - else - { - AssemblyName assemblyName = new AssemblyName(); - assemblyName.Name = "iBATIS.FastSetAccessor" + HashCodeProvider.GetIdentityHashCode(this).ToString(); - - // Create a new assembly with one module - _assemblyBuilder = AssemblyBuilder.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run); - _moduleBuilder = _assemblyBuilder.DefineDynamicModule(assemblyName.Name + ".dll"); - - _createPropertySetAccessor = new CreatePropertySetAccessor(CreatePropertyAccessor); - _createFieldSetAccessor = new CreateFieldSetAccessor(CreateFieldAccessor); - } - } - else - { - _createPropertySetAccessor = new CreatePropertySetAccessor(CreateReflectionPropertySetAccessor); - _createFieldSetAccessor = new CreateFieldSetAccessor(CreateReflectionFieldSetAccessor); - } - } - -#if dotnet2 - - /// - /// Create a Dynamic ISetAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private ISetAccessor CreateDynamicPropertySetAccessor(Type targetType, string propertyName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - PropertyInfo propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); - - if (propertyInfo.CanWrite) - { - MethodInfo methodInfo = null; -#if dotnet2 - methodInfo = propertyInfo.GetSetMethod(); -#else - methodInfo = targetType.GetMethod("set_" + propertyName); -#endif - if (methodInfo!=null)// == visibilty public - { - return new DelegatePropertySetAccessor(targetType, propertyName); - } - else - { - return new ReflectionPropertySetAccessor(targetType, propertyName); - } - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} cannot be set.", propertyInfo.Name, targetType)); - } - } - - /// - /// Create a Dynamic ISetAccessor instance for a field - /// - /// Target object type. - /// field name. - /// null if the generation fail - private ISetAccessor CreateDynamicFieldSetAccessor(Type targetType, string fieldName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - FieldInfo fieldInfo = (FieldInfo)reflectionCache.GetSetter(fieldName); - - if (fieldInfo.IsPublic) - { - return new DelegateFieldSetAccessor(targetType, fieldName); - } - else - { - return new ReflectionFieldSetAccessor(targetType, fieldName); - } - } -#endif - - - /// - /// Create a ISetAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private ISetAccessor CreatePropertyAccessor(Type targetType, string propertyName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - PropertyInfo propertyInfo = (PropertyInfo)reflectionCache.GetSetter(propertyName); - - if (propertyInfo.CanWrite) - { - MethodInfo methodInfo = null; -#if dotnet2 - methodInfo = propertyInfo.GetSetMethod(); -#else - methodInfo = targetType.GetMethod("set_" + propertyName,BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly); - if (methodInfo == null) - { - methodInfo = targetType.GetMethod("set_" + propertyName); - } -#endif - if (methodInfo != null)// == visibilty public - { - return new EmitPropertySetAccessor(targetType, propertyName, _assemblyBuilder, _moduleBuilder); - } - else - { - return new ReflectionPropertySetAccessor(targetType, propertyName); - } - } - else - { - throw new NotSupportedException( - string.Format("Property \"{0}\" on type " - + "{1} cannot be set.", propertyInfo.Name, targetType)); - } - } - - /// - /// Create a ISetAccessor instance for a field - /// - /// Target object type. - /// Field name. - /// null if the generation fail - private ISetAccessor CreateFieldAccessor(Type targetType, string fieldName) - { - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - FieldInfo fieldInfo = (FieldInfo)reflectionCache.GetSetter(fieldName); - - if (fieldInfo.IsPublic) - { - return new EmitFieldSetAccessor(targetType, fieldName, _assemblyBuilder, _moduleBuilder); - } - else - { - return new ReflectionFieldSetAccessor(targetType, fieldName); - } - } - - /// - /// Create a Reflection ISetAccessor instance for a property - /// - /// Target object type. - /// Property name. - /// null if the generation fail - private ISetAccessor CreateReflectionPropertySetAccessor(Type targetType, string propertyName) - { - return new ReflectionPropertySetAccessor(targetType, propertyName); - } - - /// - /// Create Reflection ISetAccessor instance for a field - /// - /// Target object type. - /// field name. - /// null if the generation fail - private ISetAccessor CreateReflectionFieldSetAccessor(Type targetType, string fieldName) - { - return new ReflectionFieldSetAccessor(targetType, fieldName); - } - - #region ISetAccessorFactory Members - - /// - /// Generate an instance. - /// - /// Target object type. - /// Field or Property name. - /// null if the generation fail - [MethodImpl(MethodImplOptions.Synchronized)] - public ISetAccessor CreateSetAccessor(Type targetType, string name) - { - string key = new StringBuilder(targetType.FullName).Append(".").Append(name).ToString(); - - if (_cachedISetAccessor.Contains(key)) - { - return (ISetAccessor)_cachedISetAccessor[key]; - } - else - { - ISetAccessor setAccessor = null; - lock (_syncObject) - { - if (!_cachedISetAccessor.Contains(key)) - { - // Property - ReflectionInfo reflectionCache = ReflectionInfo.GetInstance(targetType); - MemberInfo memberInfo = reflectionCache.GetSetter(name); - - if (memberInfo != null) - { - if (memberInfo is PropertyInfo) - { - setAccessor = _createPropertySetAccessor(targetType, name); - _cachedISetAccessor[key] = setAccessor; - } - else - { - setAccessor = _createFieldSetAccessor(targetType, name); - _cachedISetAccessor[key] = setAccessor; - } - } - else - { - throw new ProbeException( - string.Format("No property or field named \"{0}\" exists for type " - + "{1}.", name, targetType)); - } - } - else - { - setAccessor = (ISetAccessor)_cachedISetAccessor[key]; - } - } - return setAccessor; - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs b/src/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs deleted file mode 100644 index 7166387..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/ObjectFactory.cs +++ /dev/null @@ -1,88 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Reflection; -using IBatisNet.Common.Logging; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// A factory to create objects - /// - public class ObjectFactory : IObjectFactory - { - private IObjectFactory _objectFactory = null; - private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - /// - /// Constructor - /// - /// - public ObjectFactory(bool allowCodeGeneration) - { - if (allowCodeGeneration) - { - // Detect runtime environment and create the appropriate factory - if (Environment.Version.Major >= 2) - { -#if dotnet2 - _objectFactory = new DelegateObjectFactory(); -#endif - } - else - { - _objectFactory = new EmitObjectFactory(); - } - } - else - { - _objectFactory = new ActivatorObjectFactory(); - } - } - - #region IObjectFactory members - - /// - /// Create a new factory instance for a given type - /// - /// The type instance to build - /// The types of the constructor arguments - /// Returns a new instance factory - public IFactory CreateFactory(Type typeToCreate, Type[] types) - { - if (_logger.IsDebugEnabled) - { - return new FactoryLogAdapter(typeToCreate, types, _objectFactory.CreateFactory(typeToCreate, types)); - } - else - { - return _objectFactory.CreateFactory(typeToCreate, types); - } - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs b/src/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs deleted file mode 100644 index 2b3caf4..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/ObjectProbe.cs +++ /dev/null @@ -1,740 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 513429 $ - * $Date: 2007-03-01 11:32:25 -0700 (Thu, 01 Mar 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Reflection; - -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities.Objects.Members; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// Description rsume de ObjectProbe. - /// - public sealed class ObjectProbe - { - private static ArrayList _simpleTypeMap = new ArrayList(); - - static ObjectProbe() - { - _simpleTypeMap.Add(typeof(string)); - _simpleTypeMap.Add(typeof(Byte)); - _simpleTypeMap.Add(typeof(Int16)); - _simpleTypeMap.Add(typeof(char)); - _simpleTypeMap.Add(typeof(Int32)); - _simpleTypeMap.Add(typeof(Int64)); - _simpleTypeMap.Add(typeof(Single)); - _simpleTypeMap.Add(typeof(Double)); - _simpleTypeMap.Add(typeof(Boolean)); - _simpleTypeMap.Add(typeof(DateTime)); - _simpleTypeMap.Add(typeof(Decimal)); - - // _simpleTypeMap.Add(typeof(Hashtable)); - // _simpleTypeMap.Add(typeof(SortedList)); - // _simpleTypeMap.Add(typeof(ArrayList)); - // _simpleTypeMap.Add(typeof(Array)); - - // simpleTypeMap.Add(LinkedList.class); - // simpleTypeMap.Add(HashSet.class); - // simpleTypeMap.Add(TreeSet.class); - // simpleTypeMap.Add(Vector.class); - // simpleTypeMap.Add(Hashtable.class); - _simpleTypeMap.Add(typeof(SByte)); - _simpleTypeMap.Add(typeof(UInt16)); - _simpleTypeMap.Add(typeof(UInt32)); - _simpleTypeMap.Add(typeof(UInt64)); - _simpleTypeMap.Add(typeof(IEnumerator)); - } - - - /// - /// Returns an array of the readable properties names exposed by an object - /// - /// The object - /// The properties name - public static string[] GetReadablePropertyNames(object obj) - { - return ReflectionInfo.GetInstance(obj.GetType()).GetReadableMemberNames(); - } - - - /// - /// Returns an array of the writeable members name exposed by a object - /// - /// The object - /// The members name - public static string[] GetWriteableMemberNames(object obj) - { - return ReflectionInfo.GetInstance(obj.GetType()).GetWriteableMemberNames(); - } - - - /// - /// Returns the type that the set expects to receive as a parameter when - /// setting a member value. - /// - /// The object to check - /// The name of the member - /// The type of the member - public static Type GetMemberTypeForSetter(object obj, string memberName) - { - Type type = obj.GetType(); - - if (obj is IDictionary) - { - IDictionary map = (IDictionary) obj; - object value = map[memberName]; - if (value == null) - { - type = typeof(object); - } - else - { - type = value.GetType(); - } - } - else - { - if (memberName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(memberName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - memberName = (string)enumerator.Current; - type = ReflectionInfo.GetInstance(type).GetSetterType(memberName); - } - } - else - { - type = ReflectionInfo.GetInstance(type).GetSetterType(memberName); - } - } - - return type; - } - - - /// - /// Returns the type that the set expects to receive as a parameter when - /// setting a member value. - /// - /// The class type to check - /// The name of the member - /// The type of the member - public static Type GetMemberTypeForSetter(Type type, string memberName) - { - Type memberType = type; - if (memberName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(memberName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - memberName = (string)enumerator.Current; - memberType = ReflectionInfo.GetInstance(memberType).GetSetterType(memberName); - } - } - else - { - memberType = ReflectionInfo.GetInstance(type).GetSetterType(memberName); - } - - return memberType; - } - - /// - /// Returns the type that the get expects to receive as a parameter when - /// setting a member value. - /// - /// The object to check - /// The name of the member - /// The type of the member - public static Type GetMemberTypeForGetter(object obj, string memberName) - { - Type type = obj.GetType(); - - if (obj is IDictionary) - { - IDictionary map = (IDictionary) obj; - object value = map[memberName]; - if (value == null) - { - type = typeof(object); - } - else - { - type = value.GetType(); - } - } - else - { - if (memberName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(memberName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - memberName = (string)enumerator.Current; - type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); - } - } - else - { - type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); - } - } - - return type; - } - - - /// - /// Returns the type that the get expects to receive as a parameter when - /// setting a member value. - /// - /// The type to check - /// The name of the member - /// The type of the member - public static Type GetMemberTypeForGetter(Type type, string memberName) - { - if (memberName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(memberName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - memberName = (string)enumerator.Current; - type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); - } - } - else - { - type = ReflectionInfo.GetInstance(type).GetGetterType(memberName); - } - - return type; - } - - - /// - /// Returns the MemberInfo of the set member on the specified type. - /// - /// The type to check - /// The name of the member - /// The type of the member - public static MemberInfo GetMemberInfoForSetter(Type type, string memberName) - { - MemberInfo memberInfo =null; - if (memberName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(memberName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - Type parentType = null; - - while (enumerator.MoveNext()) - { - memberName = (string)enumerator.Current; - parentType = type; - type = ReflectionInfo.GetInstance(type).GetSetterType(memberName); - } - memberInfo = ReflectionInfo.GetInstance(parentType).GetSetter(memberName); - } - else - { - memberInfo = ReflectionInfo.GetInstance(type).GetSetter(memberName); - } - - return memberInfo; - } - - - /// - /// Gets the value of an array member on the specified object. - /// - /// The obj. - /// The array index. - /// The accessor factory. - /// The member value. - private static object GetArrayMember(object obj, string indexedName, - AccessorFactory accessorFactory) - { - object value = null; - - try - { - int startIndex = indexedName.IndexOf("["); - int length = indexedName.IndexOf("]"); - string name = indexedName.Substring(0, startIndex); - string index = indexedName.Substring( startIndex+1, length-(startIndex+1)); - int i = System.Convert.ToInt32(index); - - if (name.Length > 0) - { - value = GetMember(obj, name, accessorFactory); - } - else - { - value = obj; - } - - if (value is IList) - { - value = ((IList) value)[i]; - } - else - { - throw new ProbeException("The '" + name + "' member of the " + obj.GetType().Name + " class is not a List or Array."); - } - } - catch (ProbeException pe) - { - throw pe; - } - catch(Exception e) - { - throw new ProbeException("Error getting ordinal value from .net object. Cause" + e.Message, e); - } - - return value; - } - - /// - /// Sets the array member. - /// - /// The obj. - /// Name of the indexed. - /// The value. - /// The accessor factory. - private static void SetArrayMember(object obj, string indexedName, object value, - AccessorFactory accessorFactory) - { - try - { - int startIndex = indexedName.IndexOf("["); - int length = indexedName.IndexOf("]"); - string name = indexedName.Substring(0, startIndex); - string index = indexedName.Substring( startIndex+1, length-(startIndex+1)); - int i = System.Convert.ToInt32(index); - - object list = null; - if (name.Length > 0) - { - list = GetMember(obj, name, accessorFactory); - } - else - { - list = obj; - } - - if (list is IList) - { - ((IList) list)[i] = value; - } - else - { - throw new ProbeException("The '" + name + "' member of the " + obj.GetType().Name + " class is not a List or Array."); - } - } - catch (ProbeException pe) - { - throw pe; - } - catch (Exception e) - { - throw new ProbeException("Error getting ordinal value from .net object. Cause" + e.Message, e); - } - } - - - /// - /// Return the specified member on an object. - /// - /// The Object on which to invoke the specified property. - /// Name of the member. - /// The accessor factory. - /// An Object representing the return value of the invoked property. - public static object GetMemberValue(object obj, string memberName, - AccessorFactory accessorFactory) - { - if (memberName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(memberName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - object value = obj; - string token = null; - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - value = GetMember(value, token, accessorFactory); - - if (value == null) - { - break; - } - } - return value; - } - else - { - return GetMember(obj, memberName, accessorFactory); - } - } - - - /// - /// Gets the member's value on the specified object. - /// - /// The obj. - /// Name of the member. - /// The accessor factory. - /// The member's value - public static object GetMember(object obj, string memberName, - AccessorFactory accessorFactory) - { - try - { - object value = null; - - if (memberName.IndexOf("[") > -1) - { - value = GetArrayMember(obj, memberName, accessorFactory); - } - else - { - if (obj is IDictionary) - { - value = ((IDictionary) obj)[memberName]; - } - else - { - Type targetType = obj.GetType(); - IGetAccessorFactory getAccessorFactory = accessorFactory.GetAccessorFactory; - IGetAccessor getAccessor = getAccessorFactory.CreateGetAccessor(targetType, memberName); - - if (getAccessor == null) - { - throw new ProbeException("No Get method for member " + memberName + " on instance of " + obj.GetType().Name); - } - try - { - value = getAccessor.Get(obj); - } - catch (Exception ae) - { - throw new ProbeException(ae); - } - } - } - return value; - } - catch (ProbeException pe) - { - throw pe; - } - catch(Exception e) - { - throw new ProbeException("Could not Set property '" + memberName + "' for " + obj.GetType().Name + ". Cause: " + e.Message, e); - } - } - - /// - /// Sets the member value. - /// - /// he Object on which to invoke the specified mmber. - /// Name of the member. - /// The member value. - /// The object factory. - /// The accessor factory. - public static void SetMemberValue(object obj, string memberName, object memberValue, - IObjectFactory objectFactory, - AccessorFactory accessorFactory) - { - if (memberName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(memberName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - enumerator.MoveNext(); - - string currentPropertyName = (string)enumerator.Current; - object child = obj; - - while (enumerator.MoveNext()) - { - Type type = GetMemberTypeForSetter(child, currentPropertyName); - object parent = child; - child = GetMember(parent, currentPropertyName, accessorFactory); - if (child == null) - { - try - { - IFactory factory = objectFactory.CreateFactory(type, Type.EmptyTypes); - child = factory.CreateInstance(Type.EmptyTypes); - - SetMemberValue(parent, currentPropertyName, child, objectFactory, accessorFactory); - } - catch (Exception e) - { - throw new ProbeException("Cannot set value of property '" + memberName + "' because '" + currentPropertyName + "' is null and cannot be instantiated on instance of " + type.Name + ". Cause:" + e.Message, e); - } - } - currentPropertyName = (string)enumerator.Current; - } - SetMember(child, currentPropertyName, memberValue, accessorFactory); - } - else - { - SetMember(obj, memberName, memberValue, accessorFactory); - } - } - - - /// - /// Sets the member. - /// - /// The obj. - /// Name of the member. - /// The member value. - /// The accessor factory. - public static void SetMember(object obj, string memberName, object memberValue, - AccessorFactory accessorFactory) - { - try - { - if (memberName.IndexOf("[") > -1) - { - SetArrayMember(obj, memberName, memberValue, accessorFactory); - } - else - { - if (obj is IDictionary) - { - ((IDictionary) obj)[memberName] = memberValue; - } - else - { - Type targetType = obj.GetType(); - ISetAccessorFactory setAccessorFactory = accessorFactory.SetAccessorFactory; - ISetAccessor setAccessor = setAccessorFactory.CreateSetAccessor(targetType, memberName); - - if (setAccessor == null) - { - throw new ProbeException("No Set method for member " + memberName + " on instance of " + obj.GetType().Name); - } - try - { - setAccessorFactory.CreateSetAccessor(targetType, memberName).Set(obj, memberValue); - } - catch (Exception ex) - { - throw new ProbeException(ex); - } - } - } - } - catch (ProbeException pe) - { - throw pe; - } - catch (Exception e) - { - throw new ProbeException("Could not Get property '" + memberName + "' for " + obj.GetType().Name + ". Cause: " + e.Message, e); - } - } - - - /// - /// Checks to see if a Object has a writable property/field be a given name - /// - /// The object to check - /// The property to check for - /// True if the property exists and is writable - public static bool HasWritableProperty(object obj, string propertyName) - { - bool hasProperty = false; - if (obj is IDictionary) - { - hasProperty = ((IDictionary) obj).Contains(propertyName); - } - else - { - if (propertyName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(propertyName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - Type type = obj.GetType(); - - while (enumerator.MoveNext()) - { - propertyName = (string)enumerator.Current; - type = ReflectionInfo.GetInstance(type).GetGetterType(propertyName); - hasProperty = ReflectionInfo.GetInstance(type).HasWritableMember(propertyName); - } - } - else - { - hasProperty = ReflectionInfo.GetInstance(obj.GetType()).HasWritableMember(propertyName); - } - } - return hasProperty; - } - - - /// - /// Checks to see if the Object have a property/field be a given name. - /// - /// The Object on which to invoke the specified property. - /// The name of the property to check for. - /// - /// True or false if the property exists and is readable. - /// - public static bool HasReadableProperty(object obj, string propertyName) - { - bool hasProperty = false; - - if (obj is IDictionary) - { - hasProperty = ((IDictionary) obj).Contains(propertyName); - } - else - { - if (propertyName.IndexOf('.') > -1) - { - StringTokenizer parser = new StringTokenizer(propertyName, "."); - IEnumerator enumerator = parser.GetEnumerator(); - Type type = obj.GetType(); - - while (enumerator.MoveNext()) - { - propertyName = (string)enumerator.Current; - type = ReflectionInfo.GetInstance(type).GetGetterType(propertyName); - hasProperty = ReflectionInfo.GetInstance(type).HasReadableMember(propertyName); - } - } - else - { - hasProperty = ReflectionInfo.GetInstance(obj.GetType()).HasReadableMember(propertyName); - } - } - - return hasProperty; - } - - /// - /// - /// - /// - /// - public static bool IsSimpleType(Type type) - { - if (_simpleTypeMap.Contains(type)) - { - return true; - } - else if (typeof(ICollection).IsAssignableFrom(type)) - { - return true; - } - else if (typeof(IDictionary).IsAssignableFrom(type)) - { - return true; - } - else if (typeof(IList).IsAssignableFrom(type)) - { - return true; - } - else if (typeof(IEnumerable).IsAssignableFrom(type)) - { - return true; - } - else - { - return false; - } - } - - -// /// -// /// Calculates a hash code for all readable properties of a object. -// /// -// /// The object to calculate the hash code for. -// /// The hash code. -// public static int ObjectHashCode(object obj) -// { -// return ObjectHashCode(obj, GetReadablePropertyNames(obj)); -// } -// -// -// /// -// /// Calculates a hash code for a subset of the readable properties of a object. -// /// -// /// The object to calculate the hash code for. -// /// A list of the properties to hash. -// /// The hash code. -// public static int ObjectHashCode(object obj, string[] properties ) -// { -// ArrayList alreadyDigested = new ArrayList(); -// -// int hashcode = obj.GetType().FullName.GetHashCode(); -// int length = properties.Length; -// for (int i = 0; i < length; i++) -// { -// object value = GetProperty(obj, properties[i]); -// if (value != null) -// { -// if (IsSimpleType(value.GetType())) -// { -// hashcode += value.GetHashCode(); -// hashcode += value.ToString().GetHashCode()*37; -// } -// else -// { -// // It's a Object -// // Check to avoid endless loop (circular dependency) -// if (value != obj) -// { -// if (!alreadyDigested.Contains(value)) -// { -// alreadyDigested.Add(value); -// hashcode += ObjectHashCode(value); -// } -// } -// } -// hashcode *= 29; -// } -// } -// return hashcode; -// } - - } -} diff --git a/src/IBatisNet.Common/Utilities/Objects/ReflectionInfo.cs b/src/IBatisNet.Common/Utilities/Objects/ReflectionInfo.cs deleted file mode 100644 index f7901b2..0000000 --- a/src/IBatisNet.Common/Utilities/Objects/ReflectionInfo.cs +++ /dev/null @@ -1,342 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 511513 $ - * $Date: 2007-02-25 06:46:57 -0700 (Sun, 25 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; - -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities.Objects -{ - /// - /// This class represents a cached set of class definition information that - /// allows for easy mapping between property names and get/set methods. - /// - public sealed class ReflectionInfo - { - /// - /// - /// - public static BindingFlags BINDING_FLAGS_PROPERTY - = BindingFlags.Public - | BindingFlags.NonPublic - | BindingFlags.Instance - ; - - - /// - /// - /// - public static BindingFlags BINDING_FLAGS_FIELD - = BindingFlags.Public - | BindingFlags.NonPublic - | BindingFlags.Instance - - ; - - private static readonly string[] _emptyStringArray = new string[0]; - private static ArrayList _simleTypeMap = new ArrayList(); - private static Hashtable _reflectionInfoMap = Hashtable.Synchronized(new Hashtable()); - - private string _className = string.Empty; - private string[] _readableMemberNames = _emptyStringArray; - private string[] _writeableMemberNames = _emptyStringArray; - // (memberName, MemberInfo) - private Hashtable _setMembers = new Hashtable(); - // (memberName, MemberInfo) - private Hashtable _getMembers = new Hashtable(); - // (memberName, member type) - private Hashtable _setTypes = new Hashtable(); - // (memberName, member type) - private Hashtable _getTypes = new Hashtable(); - - /// - /// - /// - public string ClassName - { - get { return _className; } - } - - /// - /// - /// - static ReflectionInfo() - { - _simleTypeMap.Add(typeof(string)); - _simleTypeMap.Add(typeof(byte)); - _simleTypeMap.Add(typeof(char)); - _simleTypeMap.Add(typeof(bool)); - _simleTypeMap.Add(typeof(Guid)); - _simleTypeMap.Add(typeof(Int16)); - _simleTypeMap.Add(typeof(Int32)); - _simleTypeMap.Add(typeof(Int64)); - _simleTypeMap.Add(typeof(Single)); - _simleTypeMap.Add(typeof(Double)); - _simleTypeMap.Add(typeof(Decimal)); - _simleTypeMap.Add(typeof(DateTime)); - _simleTypeMap.Add(typeof(TimeSpan)); - _simleTypeMap.Add(typeof(Hashtable)); - _simleTypeMap.Add(typeof(SortedList)); - _simleTypeMap.Add(typeof(ListDictionary)); - _simleTypeMap.Add(typeof(HybridDictionary)); - - - // _simleTypeMap.Add(Class.class); - // _simleTypeMap.Add(Collection.class); - // _simleTypeMap.Add(HashMap.class); - // _simleTypeMap.Add(TreeMap.class); - _simleTypeMap.Add(typeof(ArrayList)); - // _simleTypeMap.Add(HashSet.class); - // _simleTypeMap.Add(TreeSet.class); - // _simleTypeMap.Add(Vector.class); - _simleTypeMap.Add(typeof(IEnumerator)); - } - - /// - /// - /// - /// - private ReflectionInfo(Type type) - { - _className = type.Name; - AddMembers(type); - - string[] getArray = new string[_getMembers.Count]; - _getMembers.Keys.CopyTo(getArray,0); - _readableMemberNames = getArray; - - string[] setArray = new string[_setMembers.Count]; - _setMembers.Keys.CopyTo(setArray,0); - _writeableMemberNames = setArray; - } - - /// - /// - /// - /// - private void AddMembers(Type type) - { - #region Properties - PropertyInfo[] properties = type.GetProperties(BINDING_FLAGS_PROPERTY); - for (int i = 0; i < properties.Length; i++) - { - if (properties[i].CanWrite) - { - string name = properties[i].Name; - _setMembers[name] = properties[i]; - _setTypes[name] = properties[i].PropertyType; - } - if (properties[i].CanRead) - { - string name = properties[i].Name; - _getMembers[name] = properties[i]; - _getTypes[name] = properties[i].PropertyType; - } - } - - #endregion - - #region Fields - FieldInfo[] fields = type.GetFields(BINDING_FLAGS_FIELD) ; - for (int i = 0; i < fields.Length; i++) - { - string name = fields[i].Name; - _setMembers[name] = fields[i]; - _setTypes[name] = fields[i].FieldType; - _getMembers[name] = fields[i]; - _getTypes[name] = fields[i].FieldType; - } - #endregion - - // Fix for problem with interfaces inheriting other interfaces - if (type.IsInterface) - { - // Loop through interfaces for the type and add members from - // these types too - foreach (Type interf in type.GetInterfaces()) - { - AddMembers(interf); - } - } - } - - /// - /// - /// - /// - /// - public MemberInfo GetSetter(string memberName) - { - MemberInfo memberInfo = (MemberInfo) _setMembers[memberName]; - - if (memberInfo == null) - { - throw new ProbeException("There is no Set member named '" + memberName + "' in class '" + _className + "'"); - } - - return memberInfo; - } - - - /// - /// Gets the . - /// - /// Member's name. - /// The - public MemberInfo GetGetter(string memberName) - { - MemberInfo memberInfo = _getMembers[memberName] as MemberInfo; - if (memberInfo == null) - { - throw new ProbeException("There is no Get member named '" + memberName + "' in class '" + _className + "'"); - } - return memberInfo; - } - - - /// - /// Gets the type of the member. - /// - /// Member's name. - /// - public Type GetSetterType(string memberName) - { - Type type = (Type) _setTypes[memberName]; - if (type == null) - { - throw new ProbeException("There is no Set member named '" + memberName + "' in class '" + _className + "'"); - } - return type; - } - - /// - /// - /// - /// - /// - public Type GetGetterType(string memberName) - { - Type type = (Type) _getTypes[memberName]; - if (type == null) - { - throw new ProbeException("There is no Get member named '" + memberName + "' in class '" + _className + "'"); - } - return type; - } - - /// - /// - /// - /// - public string[] GetReadableMemberNames() - { - return _readableMemberNames; - } - - /// - /// - /// - /// - public string[] GetWriteableMemberNames() - { - return _writeableMemberNames; - } - - /// - /// - /// - /// - /// - public bool HasWritableMember(string memberName) - { - return _setMembers.ContainsKey(memberName); - } - - /// - /// - /// - /// - /// - public bool HasReadableMember(string memberName) - { - return _getMembers.ContainsKey(memberName); - } - - /// - /// - /// - /// - /// - public static bool IsKnownType(Type type) - { - if (_simleTypeMap.Contains(type)) - { - return true; - } - else if (typeof(IList).IsAssignableFrom(type)) - { - return true; - } - else if (typeof(IDictionary).IsAssignableFrom(type)) - { - return true; - } - else if (typeof(IEnumerator).IsAssignableFrom(type)) - { - return true; - } - else - { - return false; - } - } - - /// - /// Gets an instance of ReflectionInfo for the specified type. - /// summary> - /// The type for which to lookup the method cache. - /// The properties cache for the type - public static ReflectionInfo GetInstance(Type type) - { - lock (type) - { - ReflectionInfo cache = (ReflectionInfo) _reflectionInfoMap[type]; - if (cache == null) - { - cache = new ReflectionInfo(type); - _reflectionInfoMap.Add(type, cache); - } - return cache; - } - } - - - } - -} diff --git a/src/IBatisNet.Common/Utilities/Proxy/CachedProxyGenerator.cs b/src/IBatisNet.Common/Utilities/Proxy/CachedProxyGenerator.cs deleted file mode 100644 index ee5bfc3..0000000 --- a/src/IBatisNet.Common/Utilities/Proxy/CachedProxyGenerator.cs +++ /dev/null @@ -1,144 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.Collections.Specialized; -using Castle.DynamicProxy; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Logging; - -#endregion - -namespace IBatisNet.Common.Utilities.Proxy -{ - /// - /// An ProxyGenerator with cache that uses the Castle.DynamicProxy library. - /// - [CLSCompliant(false)] - public class CachedProxyGenerator : ProxyGenerator - { - private static readonly ILog _log = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType ); - - // key = mapped type - // value = proxy type - private IDictionary _cachedProxyTypes =null; - - /// - /// Cosntructor - /// - public CachedProxyGenerator() - { - _cachedProxyTypes = new HybridDictionary(); - } - - /// - /// Generates a proxy implementing all the specified interfaces and - /// redirecting method invocations to the specifed interceptor. - /// - /// Interface to be implemented - /// instance of - /// The target object. - /// Proxy instance - public override object CreateProxy(Type theInterface, IInterceptor interceptor, object target) - { - return CreateProxy(new Type[] {theInterface}, interceptor, target); - } - - /// - /// Generates a proxy implementing all the specified interfaces and - /// redirecting method invocations to the specifed interceptor. - /// - /// Array of interfaces to be implemented - /// instance of - /// The target object. - /// Proxy instance - public override object CreateProxy(Type[] interfaces, IInterceptor interceptor, object target) - { - try - { - System.Type proxyType = null; - System.Type targetType = target.GetType(); - - lock( _cachedProxyTypes.SyncRoot ) - { - proxyType = _cachedProxyTypes[ targetType ] as System.Type; - - if( proxyType == null ) - { - proxyType = ProxyBuilder.CreateInterfaceProxy(interfaces, targetType ); - _cachedProxyTypes[ targetType ] = proxyType; - } - } - return base.CreateProxyInstance( proxyType, interceptor, target ); - } - catch( Exception e ) - { - _log.Error( "Castle Dynamic Proxy Generator failed", e ); - throw new IBatisNetException( "Castle Proxy Generator failed", e ); - } - } - - - - /// - /// Generates a proxy implementing all the specified interfaces and - /// redirecting method invocations to the specifed interceptor. - /// This proxy is for object different from IList or ICollection - /// - /// The target type - /// The interceptor. - /// The arguments for constructor. - /// - public override object CreateClassProxy(Type targetType, IInterceptor interceptor, params object[] argumentsForConstructor) - { - try - { - System.Type proxyType = null; - - lock( _cachedProxyTypes.SyncRoot ) - { - proxyType = _cachedProxyTypes[ targetType ] as System.Type; - - if( proxyType == null ) - { - proxyType = ProxyBuilder.CreateClassProxy(targetType); - _cachedProxyTypes[ targetType ] = proxyType; - } - } - return CreateClassProxyInstance( proxyType, interceptor, argumentsForConstructor ); - } - catch( Exception e ) - { - _log.Error( "Castle Dynamic Class-Proxy Generator failed", e ); - throw new IBatisNetException( "Castle Proxy Generator failed", e ); - } - - } - } -} diff --git a/src/IBatisNet.Common/Utilities/Proxy/ProxyGeneratorFactory.cs b/src/IBatisNet.Common/Utilities/Proxy/ProxyGeneratorFactory.cs deleted file mode 100644 index ec5ce1d..0000000 --- a/src/IBatisNet.Common/Utilities/Proxy/ProxyGeneratorFactory.cs +++ /dev/null @@ -1,55 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004-2005 - Apache Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using Castle.DynamicProxy; -using IBatisNet.Common.Logging; - -namespace IBatisNet.Common.Utilities.Proxy -{ - /// - /// A Factory for getting the ProxyGenerator. - /// - [CLSCompliant(false)] - public sealed class ProxyGeneratorFactory - { - private static readonly ILog log = LogManager.GetLogger( typeof( ProxyGeneratorFactory ) ); - - private static ProxyGenerator _generator = new CachedProxyGenerator(); - - private ProxyGeneratorFactory() - { - // should not be created. - } - - /// - public static ProxyGenerator GetProxyGenerator() - { - //TODO: make this read from a configuration file!!! At this point anybody - // could substitue in their own IProxyGenerator and LazyInitializer. - return _generator; - } - } -} diff --git a/src/IBatisNet.Common/Utilities/Resources.cs b/src/IBatisNet.Common/Utilities/Resources.cs deleted file mode 100644 index e9d58c9..0000000 --- a/src/IBatisNet.Common/Utilities/Resources.cs +++ /dev/null @@ -1,643 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408099 $ - * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections.Specialized; -using System.IO; -using System.Reflection; -using System.Security.Permissions; -using System.Xml; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Logging; -using IBatisNet.Common.Utilities.TypesResolver; -using IBatisNet.Common.Xml; - -#endregion - -namespace IBatisNet.Common.Utilities -{ - /// - /// A class to simplify access to resources. - /// - /// The file can be loaded from the application root directory - /// (use the resource attribute) - /// or from any valid URL (use the url attribute). - /// For example,to load a fixed path file, use: - /// <properties url=file:///c:/config/my.properties /> - /// - public class Resources - { - - #region Fields - private static string _applicationBase = AppDomain.CurrentDomain.SetupInformation.ApplicationBase; - private static string _baseDirectory = AppDomain.CurrentDomain.BaseDirectory; - //private static CachedTypeResolver _cachedTypeResolver = null; - - private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - - #endregion - - #region Properties - /// - /// The name of the directory containing the application - /// - public static string ApplicationBase - { - get - { - return _applicationBase; - } - } - - /// - /// The name of the directory used to probe the assemblies. - /// - public static string BaseDirectory - { - get - { - return _baseDirectory; - } - } - - - #endregion - - #region Constructor (s) / Destructor - static Resources() - { - //_cachedTypeResolver = new CachedTypeResolver(); - } - #endregion - - #region Methods - - /// - /// Protocole separator - /// - public const string PROTOCOL_SEPARATOR = "://"; - - /// - /// Strips protocol name from the resource name - /// - /// Name of the resource - /// Name of the resource without protocol name - public static string GetFileSystemResourceWithoutProtocol(string filePath) - { - int pos = filePath.IndexOf(PROTOCOL_SEPARATOR); - if (pos == -1) - { - return filePath; - } - else - { - // skip forward slashes after protocol name, if any - if (filePath.Length > pos + PROTOCOL_SEPARATOR.Length) - { - while (filePath[++pos] == '/') - { - ; - } - } - return filePath.Substring(pos); - } - } - - /// - /// Get config file - /// - /// - /// A config resource path. - /// - /// An XmlDocument representation of the config file - public static XmlDocument GetConfigAsXmlDocument(string resourcePath) - { - XmlDocument config = new XmlDocument(); - XmlTextReader reader = null; - resourcePath = GetFileSystemResourceWithoutProtocol(resourcePath); - - if (!Resources.FileExists(resourcePath)) - { - resourcePath = Path.Combine(_baseDirectory, resourcePath); - } - - try - { - reader = new XmlTextReader( resourcePath ); - config.Load(reader); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load config file \"{0}\". Cause : {1}", - resourcePath, - e.Message ) ,e); - } - finally - { - if (reader != null) - { - reader.Close(); - } - } - return config; - - } - - /// - /// Determines whether the specified file exists. - /// - /// The file to check. - /// - /// true if the caller has the required permissions and path contains the name of an existing file - /// false if the caller has the required permissions and path doesn't contain the name of an existing file - /// else exception - /// - public static bool FileExists(string filePath) - { - if (File.Exists(filePath) ) - { - // true if the caller has the required permissions and path contains the name of an existing file; - return true; - } - else - { - // This method also returns false if the caller does not have sufficient permissions - // to read the specified file, - // no exception is thrown and the method returns false regardless of the existence of path. - // So we check permissiion and throw an exception if no permission - FileIOPermission filePermission = null; - try - { - // filePath must be the absolute path of the file. - filePermission = new FileIOPermission(FileIOPermissionAccess.Read, filePath); - } - catch - { - return false; - } - try - { - filePermission.Demand(); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("iBATIS doesn't have the right to read the config file \"{0}\". Cause : {1}", - filePath, - e.Message ) ,e); - } - - return false; - } - } - - - /// - /// Load an XML resource from a location specify by the node. - /// - /// An location node - /// the global properties - /// Return the Xml document load. - public static XmlDocument GetAsXmlDocument(XmlNode node, NameValueCollection properties) - { - XmlDocument xmlDocument = null; - - if (node.Attributes["resource"] != null) - { - string ressource = NodeUtils.ParsePropertyTokens( node.Attributes["resource"].Value, properties); - xmlDocument = Resources.GetResourceAsXmlDocument( ressource ); - } - else if (node.Attributes["url"] != null) - { - string url = NodeUtils.ParsePropertyTokens( node.Attributes["url"].Value, properties); - xmlDocument = Resources.GetUrlAsXmlDocument( url ); - } - else if (node.Attributes["embedded"] != null) - { - string embedded = NodeUtils.ParsePropertyTokens( node.Attributes["embedded"].Value, properties); - xmlDocument = Resources.GetEmbeddedResourceAsXmlDocument(embedded); - } - - return xmlDocument; - } - - - /// - /// Get the path resource of an url or resource location. - /// - /// The specification from where to load. - /// the global properties - /// - public static string GetValueOfNodeResourceUrl(XmlNode node, NameValueCollection properties) - { - string path = null; - - if (node.Attributes["resource"] != null) - { - string ressource = NodeUtils.ParsePropertyTokens( node.Attributes["resource"].Value, properties); - path = Path.Combine(_applicationBase, ressource); - } - else if (node.Attributes["url"] != null) - { - string url = NodeUtils.ParsePropertyTokens( node.Attributes["url"].Value, properties); - path = url; - } - - return path; - } - - /// - /// Get XmlDocument from a stream resource - /// - /// - /// - public static XmlDocument GetStreamAsXmlDocument(Stream resource) - { - XmlDocument config = new XmlDocument(); - - try - { - config.Load(resource); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load XmlDocument via stream. Cause : {0}", - e.Message ) ,e); - } - - return config; - } - - /// - /// Get XmlDocument from a FileInfo resource - /// - /// - /// - public static XmlDocument GetFileInfoAsXmlDocument(FileInfo resource) - { - XmlDocument config = new XmlDocument(); - - try - { - config.Load( resource.FullName ); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load XmlDocument via FileInfo. Cause : {0}", - e.Message ) ,e); - } - - return config; - } - - /// - /// Get XmlDocument from a Uri resource - /// - /// - /// - public static XmlDocument GetUriAsXmlDocument(Uri resource) - { - XmlDocument config = new XmlDocument(); - - try - { - config.Load( resource.AbsoluteUri ); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load XmlDocument via Uri. Cause : {0}", - e.Message ) ,e); - } - - return config; - } - - /// - /// Get XmlDocument from relative (from root directory of the application) path resource - /// - /// - /// - public static XmlDocument GetResourceAsXmlDocument(string resource) - { - XmlDocument config = new XmlDocument(); - - try - { - config.Load( Path.Combine(_applicationBase, resource) ); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load file via resource \"{0}\" as resource. Cause : {1}", - resource, - e.Message ) ,e); - } - - return config; - } - - - /// - /// Get XmlDocument from absolute path resource - /// - /// - /// - public static XmlDocument GetUrlAsXmlDocument(string url) - { - XmlDocument config = new XmlDocument(); - - try - { - config.Load(url); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load file via url \"{0}\" as url. Cause : {1}", - url, - e.Message ) ,e); - } - - return config; - } - - - /// - /// - /// - /// - /// - public static XmlDocument GetEmbeddedResourceAsXmlDocument(string resource) - { - XmlDocument config = new XmlDocument(); - bool isLoad = false; - - FileAssemblyInfo fileInfo = new FileAssemblyInfo (resource); - if (fileInfo.IsAssemblyQualified) - { - Assembly assembly = null; -#if dotnet2 - assembly = Assembly.Load(fileInfo.AssemblyName); -#else - assembly = Assembly.LoadWithPartialName (fileInfo.AssemblyName); -#endif - Stream stream = assembly.GetManifestResourceStream(fileInfo.ResourceFileName); - // JIRA - IBATISNET-103 - if (stream == null) - { - stream = assembly.GetManifestResourceStream(fileInfo.FileName); - } - if (stream != null) - { - try - { - config.Load(stream); - isLoad = true; - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load file \"{0}\" in embedded resource. Cause : {1}", - resource, - e.Message ) ,e); - } - } - } - else - { - // bare type name... loop thru all loaded assemblies - Assembly [] assemblies = AppDomain.CurrentDomain.GetAssemblies (); - foreach (Assembly assembly in assemblies) - { - Stream stream = assembly.GetManifestResourceStream(fileInfo.FileName); - if (stream != null) - { - try - { - config.Load(stream); - isLoad = true; - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load file \"{0}\" in embedded resource. Cause : ", - resource, - e.Message ) ,e); - } - break; - } - } - } - - if (isLoad == false) - { - _logger.Error("Could not load embedded resource from assembly"); - throw new ConfigurationException( - string.Format("Unable to load embedded resource from assembly \"{0}\".", - fileInfo.OriginalFileName)); - } - - return config; - } - - - /// - /// Load a file from a given resource path - /// - /// - /// The resource path - /// - /// return a FileInfo - public static FileInfo GetFileInfo(string resourcePath) - { - FileInfo fileInfo = null; - resourcePath = GetFileSystemResourceWithoutProtocol(resourcePath); - - if ( !Resources.FileExists(resourcePath)) - { - resourcePath = Path.Combine(_applicationBase, resourcePath); - } - - try - { - //argument : The fully qualified name of the new file, or the relative file name. - fileInfo = new FileInfo(resourcePath); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Unable to load file \"{0}\". Cause : \"{1}\"", resourcePath, e.Message),e); - } - return fileInfo; - - } - - - /// - /// Resolves the supplied type name into a instance. - /// - /// - /// The (possibly partially assembly qualified) name of a . - /// - /// - /// A resolved instance. - /// - /// - /// If the type cannot be resolved. - /// - [Obsolete("Use IBatisNet.Common.Utilities.TypeUtils")] - public static Type TypeForName(string typeName) - { - return TypeUtils.ResolveType(typeName); - //_cachedTypeResolver.Resolve(className); - } - - #endregion - - #region Inner Class : FileAssemblyInfo - /// - /// Holds data about a and it's - /// attendant . - /// - internal class FileAssemblyInfo - { - #region Constants - /// - /// The string that separates file name - /// from their attendant - /// names in an assembly qualified type name. - /// - public const string FileAssemblySeparator = ","; - #endregion - - #region Fields - private string _unresolvedAssemblyName= string.Empty; - private string _unresolvedFileName= string.Empty; - private string _originalFileName= string.Empty; - #endregion - - #region Properties - - /// - /// The resource file name . - /// - public string ResourceFileName - { - get { return AssemblyName+"."+FileName; } - } - - /// - /// The original name. - /// - public string OriginalFileName - { - get { return _originalFileName; } - } - - /// - /// The file name portion. - /// - public string FileName - { - get { return _unresolvedFileName; } - } - - /// - /// The (unresolved, possibly partial) name of the attandant assembly. - /// - public string AssemblyName - { - get { return _unresolvedAssemblyName; } - } - - /// - /// Is the type name being resolved assembly qualified? - /// - public bool IsAssemblyQualified - { - get - { - if (AssemblyName == null || AssemblyName.Trim().Length==0) - { - return false; - } - else - { - return true; - } - } - } - - #endregion - - #region Constructor (s) / Destructor - /// - /// Creates a new instance of the FileAssemblyInfo class. - /// - /// - /// The unresolved name of a . - /// - public FileAssemblyInfo (string unresolvedFileName) - { - SplitFileAndAssemblyNames (unresolvedFileName); - } - #endregion - - #region Methods - /// - /// - /// - /// - private void SplitFileAndAssemblyNames (string originalFileName) - { - _originalFileName = originalFileName; - - int separatorIndex = originalFileName.IndexOf(FileAssemblyInfo.FileAssemblySeparator); - - if (separatorIndex < 0) - { - _unresolvedFileName = originalFileName.Trim(); - _unresolvedAssemblyName = null; // IsAssemblyQualified will return false - } - else - { - _unresolvedFileName = originalFileName.Substring(0, separatorIndex).Trim(); - _unresolvedAssemblyName = originalFileName.Substring(separatorIndex + 1).Trim(); - } - } - #endregion - - } - #endregion - - } -} diff --git a/src/IBatisNet.Common/Utilities/ScriptRunner.cs b/src/IBatisNet.Common/Utilities/ScriptRunner.cs deleted file mode 100644 index bfa40b6..0000000 --- a/src/IBatisNet.Common/Utilities/ScriptRunner.cs +++ /dev/null @@ -1,192 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Data; -using System.IO; - -using IBatisNet.Common.Exceptions; - -namespace IBatisNet.Common.Utilities -{ - /// - /// Description rsume de ScriptRunner. - /// - public class ScriptRunner - { - /// - /// Constructor - /// - public ScriptRunner() - { - } - - /// - /// Run an sql script - /// - /// The dataSouce that will be used to run the script. - /// a path to an sql script file. - public void RunScript(IDataSource dataSource, string sqlScriptPath) { - RunScript(dataSource, sqlScriptPath, true); - } - - /// - /// Run an sql script - /// - /// The dataSouce that will be used to run the script. - /// a path to an sql script file. - /// parse out the statements in the sql script file. - public void RunScript(IDataSource dataSource, string sqlScriptPath, bool doParse) - { - // Get script file - FileInfo fi = new FileInfo(sqlScriptPath); - string script = fi.OpenText().ReadToEnd(); - - ArrayList sqlStatements = new ArrayList(); - - if (doParse) { - switch(dataSource.DbProvider.Name) { - case "oracle9.2": - case "oracle10.1": - case "oracleClient1.0": - case "ByteFx": - case "MySql": - sqlStatements = ParseScript(script); - break; - case "OleDb1.1": - if (dataSource.ConnectionString.IndexOf("Microsoft.Jet.OLEDB")>0) - { - // Access - sqlStatements = ParseScript(script); - } - else - { - sqlStatements.Add(script); - } - break; - default: - sqlStatements.Add(script); - break; - } - } - else { - switch(dataSource.DbProvider.Name) { - case "oracle9.2": - case "oracle10.1": - case "oracleClient1.0": - case "ByteFx": - case "MySql": - script = script.Replace("\r\n"," "); - script = script.Replace("\t"," "); - sqlStatements.Add(script); - break; - case "OleDb1.1": - if (dataSource.ConnectionString.IndexOf("Microsoft.Jet.OLEDB")>0) - { - // Access - script = script.Replace("\r\n"," "); - script = script.Replace("\t"," "); - sqlStatements.Add(script); - } - else - { - sqlStatements.Add(script); - } - break; - default: - sqlStatements.Add(script); - break; - } - } - - try - { - ExecuteStatements(dataSource, sqlStatements); - } - catch (System.Exception e) - { - throw new IBatisNetException("Unable to execute the sql: " + fi.Name, e); - } - finally - { - // - } - } - - /// - /// Execute the given sql statements - /// - /// The dataSouce that will be used. - /// An ArrayList of sql statements to execute. - private void ExecuteStatements(IDataSource dataSource, ArrayList sqlStatements) { - IDbConnection connection = dataSource.DbProvider.CreateConnection(); - connection.ConnectionString = dataSource.ConnectionString; - connection.Open(); - IDbTransaction transaction = connection.BeginTransaction(); - - IDbCommand command = connection.CreateCommand(); - - command.Connection = connection; - command.Transaction = transaction; - - try { - foreach (string sqlStatement in sqlStatements) { - command.CommandText = sqlStatement; - command.ExecuteNonQuery(); - } - transaction.Commit(); - } - catch(System.Exception e) { - transaction.Rollback(); - throw (e); - } - finally { - connection.Close(); - } - } - - /// - /// Parse and tokenize the sql script into multiple statements - /// - /// the script to parse - private ArrayList ParseScript(string script) { - ArrayList statements = new ArrayList(); - StringTokenizer parser = new StringTokenizer(script, ";"); - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) { - string statement= ((string)enumerator.Current).Replace("\r\n"," "); - statement = statement.Trim(); - if (statement != string.Empty) { - statements.Add(statement); - } - } - - return statements; - } - } -} diff --git a/src/IBatisNet.Common/Utilities/StringTokenizer.cs b/src/IBatisNet.Common/Utilities/StringTokenizer.cs deleted file mode 100644 index 32c547f..0000000 --- a/src/IBatisNet.Common/Utilities/StringTokenizer.cs +++ /dev/null @@ -1,212 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Text; - -namespace IBatisNet.Common.Utilities -{ - - /// - /// A StringTokenizer java like object - /// - public class StringTokenizer : IEnumerable - { - - private static readonly string _defaultDelim=" \t\n\r\f"; - string _origin = string.Empty; - string _delimiters = string.Empty; - bool _returnDelimiters = false; - - /// - /// Constructs a StringTokenizer on the specified String, using the - /// default delimiter set (which is " \t\n\r\f"). - /// - /// The input String - public StringTokenizer(string str) - { - _origin = str; - _delimiters = _defaultDelim; - _returnDelimiters = false; - } - - - /// - /// Constructs a StringTokenizer on the specified String, - /// using the specified delimiter set. - /// - /// The input String - /// The delimiter String - public StringTokenizer(string str, string delimiters) - { - _origin = str; - _delimiters = delimiters; - _returnDelimiters = false; - } - - - /// - /// Constructs a StringTokenizer on the specified String, - /// using the specified delimiter set. - /// - /// The input String - /// The delimiter String - /// Returns delimiters as tokens or skip them - public StringTokenizer(string str, string delimiters, bool returnDelimiters) - { - _origin = str; - _delimiters = delimiters; - _returnDelimiters = returnDelimiters; - } - - - /// - /// - /// - /// - public IEnumerator GetEnumerator() - { - return new StringTokenizerEnumerator(this); - } - - - /// - /// Returns the number of tokens in the String using - /// the current deliminter set. This is the number of times - /// nextToken() can return before it will generate an exception. - /// Use of this routine to count the number of tokens is faster - /// than repeatedly calling nextToken() because the substrings - /// are not constructed and returned for each token. - /// - public int TokenNumber - { - get - { - int count = 0; - int currpos = 0; - int maxPosition = _origin.Length; - - while (currpos < maxPosition) - { - while (!_returnDelimiters && - (currpos < maxPosition) && - (_delimiters.IndexOf(_origin[currpos]) >= 0)) - { - currpos++; - } - - if (currpos >= maxPosition) - { - break; - } - - int start = currpos; - while ((currpos < maxPosition) && - (_delimiters.IndexOf(_origin[currpos]) < 0)) - { - currpos++; - } - if (_returnDelimiters && (start == currpos) && - (_delimiters.IndexOf(_origin[currpos]) >= 0)) - { - currpos++; - } - count++; - } - return count; - - } - - } - - - private class StringTokenizerEnumerator : IEnumerator - { - private StringTokenizer _stokenizer; - private int _cursor = 0; - private string _next = null; - - public StringTokenizerEnumerator(StringTokenizer stok) - { - _stokenizer = stok; - } - - public bool MoveNext() - { - _next = GetNext(); - return _next != null; - } - - public void Reset() - { - _cursor = 0; - } - - public object Current - { - get - { - return _next; - } - } - - private string GetNext() - { - char c; - bool isDelim; - - if( _cursor >= _stokenizer._origin.Length ) - return null; - - c = _stokenizer._origin[_cursor]; - isDelim = (_stokenizer._delimiters.IndexOf(c) != -1); - - if ( isDelim ) - { - _cursor++; - if ( _stokenizer._returnDelimiters ) - { - return c.ToString(); - } - return GetNext(); - } - - int nextDelimPos = _stokenizer._origin.IndexOfAny(_stokenizer._delimiters.ToCharArray(), _cursor); - if (nextDelimPos == -1) - { - nextDelimPos = _stokenizer._origin.Length; - } - - string nextToken = _stokenizer._origin.Substring(_cursor, nextDelimPos - _cursor); - _cursor = nextDelimPos; - return nextToken; - } - - } - } - -} diff --git a/src/IBatisNet.Common/Utilities/TypeUtils.cs b/src/IBatisNet.Common/Utilities/TypeUtils.cs deleted file mode 100644 index a910122..0000000 --- a/src/IBatisNet.Common/Utilities/TypeUtils.cs +++ /dev/null @@ -1,256 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -#if dotnet2 -using System.Collections.Generic; -#endif -using IBatisNet.Common.Utilities.TypesResolver; - -namespace IBatisNet.Common.Utilities -{ - /// - /// Helper methods with regard to type. - /// - /// - ///

    - /// Mainly for internal use within the framework. - ///

    - ///
    - public sealed class TypeUtils - { - #region Fields - - private static readonly ITypeResolver _internalTypeResolver = new CachedTypeResolver(new TypeResolver()); - - #endregion - - #region Constructor (s) / Destructor - - /// - /// Creates a new instance of the class. - /// - /// - ///

    - /// This is a utility class, and as such exposes no public constructors. - ///

    - ///
    - private TypeUtils() - { - } - - #endregion - - /// - /// Resolves the supplied type name into a - /// instance. - /// - /// - /// The (possibly partially assembly qualified) name of a - /// . - /// - /// - /// A resolved instance. - /// - /// - /// If the type cannot be resolved. - /// - public static Type ResolveType(string typeName) - { - Type type = TypeRegistry.ResolveType(typeName); - if (type == null) - { - type = _internalTypeResolver.Resolve(typeName); - } - return type; - } - - /// - /// Instantiate a 'Primitive' Type. - /// - /// a typeCode. - /// An object. - public static object InstantiatePrimitiveType(TypeCode typeCode) - { - object resultObject = null; - - switch (typeCode) - { - case TypeCode.Boolean: - resultObject = new Boolean(); - break; - case TypeCode.Byte: - resultObject = new Byte(); - break; - case TypeCode.Char: - resultObject = new Char(); - break; - case TypeCode.DateTime: - resultObject = new DateTime(); - break; - case TypeCode.Decimal: - resultObject = new Decimal(); - break; - case TypeCode.Double: - resultObject = new Double(); - break; - case TypeCode.Int16: - resultObject = new Int16(); - break; - case TypeCode.Int32: - resultObject = new Int32(); - break; - case TypeCode.Int64: - resultObject = new Int64(); - break; - case TypeCode.SByte: - resultObject = new SByte(); - break; - case TypeCode.Single: - resultObject = new Single(); - break; - case TypeCode.String: - resultObject = ""; - break; - case TypeCode.UInt16: - resultObject = new UInt16(); - break; - case TypeCode.UInt32: - resultObject = new UInt32(); - break; - case TypeCode.UInt64: - resultObject = new UInt64(); - break; - } - return resultObject; - } - -#if dotnet2 - /// - /// Instantiate a Nullable Type. - /// - /// The nullable type. - /// An object. - public static object InstantiateNullableType(Type type) - { - object resultObject = null; - - if (type== typeof(bool?)) - { - resultObject = new Nullable(false); - } - else if (type== typeof(byte?)) - { - resultObject = new Nullable(byte.MinValue); - } - else if (type== typeof(char?)) - { - resultObject = new Nullable(char.MinValue); - } - else if (type == typeof(DateTime?)) - { - resultObject = new Nullable(DateTime.MinValue); - } - else if (type == typeof(decimal?)) - { - resultObject = new Nullable(decimal.MinValue); - } - else if (type == typeof(double?)) - { - resultObject = new Nullable(double.MinValue); - } - else if (type == typeof(Int16?)) - { - resultObject = new Nullable(Int16.MinValue); - } - else if (type == typeof(Int32?)) - { - resultObject = new Nullable(Int32.MinValue); - } - else if (type == typeof(Int64?)) - { - resultObject = new Nullable(Int64.MinValue); - } - else if (type == typeof(SByte?)) - { - resultObject = new Nullable(SByte.MinValue); - } - else if (type == typeof(Single?)) - { - resultObject = new Nullable(Single.MinValue); - } - else if (type == typeof(UInt16?)) - { - resultObject = new Nullable(UInt16.MinValue); - } - else if (type == typeof(UInt32?)) - { - resultObject = new Nullable(UInt32.MinValue); - } - else if (type == typeof(UInt64?)) - { - resultObject = new Nullable(UInt64.MinValue); - } - - return resultObject; - } - - /// - /// Determines whether the specified type is implement generic Ilist interface. - /// - /// The type. - /// - /// true if the specified type is implement generic Ilist interface; otherwise, false. - /// - public static bool IsImplementGenericIListInterface(Type type) - { - bool ret = false; - - if (!type.IsGenericType) - { - ret = false; - } - - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IList<>)) - { - return true; - } - else // check if one of the derived interfaces is IList<> - { - Type[] interfaceTypes = type.GetInterfaces(); - foreach (Type interfaceType in interfaceTypes) - { - ret = IsImplementGenericIListInterface(interfaceType); - if (ret) - { - break; - } - } - } - return ret; - } -#endif - } -} diff --git a/src/IBatisNet.Common/Utilities/TypesResolver/CachedTypeResolver.cs b/src/IBatisNet.Common/Utilities/TypesResolver/CachedTypeResolver.cs deleted file mode 100644 index 796538c..0000000 --- a/src/IBatisNet.Common/Utilities/TypesResolver/CachedTypeResolver.cs +++ /dev/null @@ -1,123 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408099 $ - * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Remarks -// Inpspired from Spring.NET -#endregion - -#region Imports - -using System; -using System.Collections; -using System.Collections.Specialized; - -#endregion - -namespace IBatisNet.Common.Utilities.TypesResolver -{ - /// - /// Resolves (instantiates) a by it's (possibly - /// assembly qualified) name, and caches the - /// instance against the type name. - /// - public class CachedTypeResolver : ITypeResolver - { - #region Fields - /// - /// The cache, mapping type names ( instances) against - /// instances. - /// - private IDictionary _typeCache = new HybridDictionary(); - - private ITypeResolver _typeResolver = null; - #endregion - - #region Constructor (s) / Destructor - /// - /// Creates a new instance of the class. - /// - /// - /// The that this instance will delegate - /// actual resolution to if a - /// cannot be found in this instance's cache. - /// - /// - /// If the supplied is . - /// - public CachedTypeResolver(ITypeResolver typeResolver) - { - _typeResolver = typeResolver; - } - #endregion - - #region ITypeResolver Members - - /// - /// Resolves the supplied to a - /// - /// instance. - /// - /// - /// The (possibly partially assembly qualified) name of a - /// . - /// - /// - /// A resolved instance. - /// - /// - /// If the supplied could not be resolved - /// to a . - /// - public Type Resolve(string typeName) - { - if (typeName == null || typeName.Trim().Length == 0) - { - throw new TypeLoadException("Could not load type from string value '" + typeName + "'."); - } - Type type = null; - try - { - type = _typeCache[typeName] as Type; - if (type == null) - { - type = _typeResolver.Resolve(typeName); - _typeCache[typeName] = type; - } - } - catch (Exception ex) - { - if (ex is TypeLoadException) - { - throw; - } - throw new TypeLoadException("Could not load type from string value '" + typeName + "'.", ex); - } - return type; - } - - - #endregion - } -} diff --git a/src/IBatisNet.Common/Utilities/TypesResolver/ITypeResolver.cs b/src/IBatisNet.Common/Utilities/TypesResolver/ITypeResolver.cs deleted file mode 100644 index 73c74d0..0000000 --- a/src/IBatisNet.Common/Utilities/TypesResolver/ITypeResolver.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Remarks -// Inpspired from Spring.NET -#endregion - -using System; - -namespace IBatisNet.Common.Utilities.TypesResolver -{ - /// - /// Resolves a by name. - /// - /// - ///

    - /// The rationale behind the creation of this interface is to centralise - /// the resolution of type names to instances - /// beyond that offered by the plain vanilla - /// method call. - ///

    - ///
    - public interface ITypeResolver - { - /// - /// Resolves the supplied to a - /// - /// instance. - /// - /// - /// The (possibly partially assembly qualified) name of a - /// . - /// - /// - /// A resolved instance. - /// - /// - /// If the supplied could not be resolved - /// to a . - /// - Type Resolve(string typeName); - } -} \ No newline at end of file diff --git a/src/IBatisNet.Common/Utilities/TypesResolver/TypeRegistry.cs b/src/IBatisNet.Common/Utilities/TypesResolver/TypeRegistry.cs deleted file mode 100644 index bbcb6f7..0000000 --- a/src/IBatisNet.Common/Utilities/TypesResolver/TypeRegistry.cs +++ /dev/null @@ -1,454 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports - -using System; -using System.Collections; -using System.Collections.Specialized; - -#endregion - -namespace IBatisNet.Common.Utilities.TypesResolver -{ - /// - /// Provides access to a central registry of aliased s. - /// - /// - ///

    - /// Simplifies configuration by allowing aliases to be used instead of - /// fully qualified type names. - ///

    - ///

    - /// Comes 'pre-loaded' with a number of convenience alias' for the more - /// common types; an example would be the 'int' (or 'Integer' - /// for Visual Basic.NET developers) alias for the - /// type. - ///

    - ///
    - public class TypeRegistry - { - #region Constants - - /// - /// The alias around the 'list' type. - /// - public const string ArrayListAlias1 = "arraylist"; - /// - /// Another alias around the 'list' type. - /// - public const string ArrayListAlias2 = "list"; - - /// - /// Another alias around the 'bool' type. - /// - public const string BoolAlias = "bool"; - /// - /// The alias around the 'bool' type. - /// - public const string BooleanAlias = "boolean"; - - /// - /// The alias around the 'byte' type. - /// - public const string ByteAlias = "byte"; - - /// - /// The alias around the 'char' type. - /// - public const string CharAlias = "char"; - - /// - /// The alias around the 'DateTime' type. - /// - public const string DateAlias1 = "datetime"; - /// - /// Another alias around the 'DateTime' type. - /// - public const string DateAlias2 = "date"; - - /// - /// The alias around the 'decimal' type. - /// - public const string DecimalAlias = "decimal"; - - /// - /// The alias around the 'double' type. - /// - public const string DoubleAlias = "double"; - - - /// - /// The alias around the 'float' type. - /// - public const string FloatAlias = "float"; - /// - /// Another alias around the 'float' type. - /// - public const string SingleAlias = "single"; - - /// - /// The alias around the 'guid' type. - /// - public const string GuidAlias = "guid"; - - /// - /// The alias around the 'Hashtable' type. - /// - public const string HashtableAlias1 = "hashtable"; - /// - /// Another alias around the 'Hashtable' type. - /// - public const string HashtableAlias2 = "map"; - /// - /// Another alias around the 'Hashtable' type. - /// - public const string HashtableAlias3 = "hashmap"; - - /// - /// The alias around the 'short' type. - /// - public const string Int16Alias1 = "int16"; - /// - /// Another alias around the 'short' type. - /// - public const string Int16Alias2 = "short"; - - - /// - /// The alias around the 'int' type. - /// - public const string Int32Alias1 = "int32"; - /// - /// Another alias around the 'int' type. - /// - public const string Int32Alias2 = "int"; - /// - /// Another alias around the 'int' type. - /// - public const string Int32Alias3 = "integer"; - - /// - /// The alias around the 'long' type. - /// - public const string Int64Alias1 = "int64"; - /// - /// Another alias around the 'long' type. - /// - public const string Int64Alias2 = "long"; - - /// - /// The alias around the 'unsigned short' type. - /// - public const string UInt16Alias1 = "uint16"; - /// - /// Another alias around the 'unsigned short' type. - /// - public const string UInt16Alias2 = "ushort"; - - /// - /// The alias around the 'unsigned int' type. - /// - public const string UInt32Alias1 = "uint32"; - /// - /// Another alias around the 'unsigned int' type. - /// - public const string UInt32Alias2 = "uint"; - - /// - /// The alias around the 'unsigned long' type. - /// - public const string UInt64Alias1 = "uint64"; - /// - /// Another alias around the 'unsigned long' type. - /// - public const string UInt64Alias2 = "ulong"; - - /// - /// The alias around the 'SByte' type. - /// - public const string SByteAlias = "sbyte"; - - /// - /// The alias around the 'string' type. - /// - public const string StringAlias = "string"; - - /// - /// The alias around the 'TimeSpan' type. - /// - public const string TimeSpanAlias = "timespan"; - -#if dotnet2 - /// - /// The alias around the 'int?' type. - /// - public const string NullableInt32Alias = "int?"; - - /// - /// The alias around the 'int?[]' array type. - /// - public const string NullableInt32ArrayAlias = "int?[]"; - - /// - /// The alias around the 'decimal?' type. - /// - public const string NullableDecimalAlias = "decimal?"; - - /// - /// The alias around the 'decimal?[]' array type. - /// - public const string NullableDecimalArrayAlias = "decimal?[]"; - - /// - /// The alias around the 'char?' type. - /// - public const string NullableCharAlias = "char?"; - - /// - /// The alias around the 'char?[]' array type. - /// - public const string NullableCharArrayAlias = "char?[]"; - - /// - /// The alias around the 'long?' type. - /// - public const string NullableInt64Alias = "long?"; - - /// - /// The alias around the 'long?[]' array type. - /// - public const string NullableInt64ArrayAlias = "long?[]"; - - /// - /// The alias around the 'short?' type. - /// - public const string NullableInt16Alias = "short?"; - - /// - /// The alias around the 'short?[]' array type. - /// - public const string NullableInt16ArrayAlias = "short?[]"; - - /// - /// The alias around the 'unsigned int?' type. - /// - public const string NullableUInt32Alias = "uint?"; - - /// - /// The alias around the 'unsigned long?' type. - /// - public const string NullableUInt64Alias = "ulong?"; - - /// - /// The alias around the 'ulong?[]' array type. - /// - public const string NullableUInt64ArrayAlias = "ulong?[]"; - - /// - /// The alias around the 'uint?[]' array type. - /// - public const string NullableUInt32ArrayAlias = "uint?[]"; - - /// - /// The alias around the 'unsigned short?' type. - /// - public const string NullableUInt16Alias = "ushort?"; - - /// - /// The alias around the 'ushort?[]' array type. - /// - public const string NullableUInt16ArrayAlias = "ushort?[]"; - - /// - /// The alias around the 'double?' type. - /// - public const string NullableDoubleAlias = "double?"; - - /// - /// The alias around the 'double?[]' array type. - /// - public const string NullableDoubleArrayAlias = "double?[]"; - - /// - /// The alias around the 'float?' type. - /// - public const string NullableFloatAlias = "float?"; - - /// - /// The alias around the 'float?[]' array type. - /// - public const string NullableFloatArrayAlias = "float?[]"; - - /// - /// The alias around the 'bool?' type. - /// - public const string NullableBoolAlias = "bool?"; - - /// - /// The alias around the 'bool?[]' array type. - /// - public const string NullableBoolArrayAlias = "bool?[]"; -#endif - #endregion - - #region Fields - private static IDictionary _types = new Hashtable(); - #endregion - - #region Constructor (s) / Destructor - /// - /// Creates a new instance of the class. - /// - /// - ///

    - /// This is a utility class, and as such has no publicly visible - /// constructors. - ///

    - ///
    - private TypeRegistry() {} - - /// - /// Initialises the static properties of the TypeAliasResolver class. - /// - static TypeRegistry() - { - // Initialize a dictionary with some fully qualifiaed name - _types[ArrayListAlias1] = typeof (ArrayList); - _types[ArrayListAlias2] = typeof (ArrayList); - - _types[BoolAlias] = typeof (bool); - _types[BooleanAlias] = typeof (bool); - - _types[ByteAlias] = typeof (byte); - - _types[CharAlias] = typeof (char); - - _types[DateAlias1] = typeof (DateTime); - _types[DateAlias2] = typeof (DateTime); - - _types[DecimalAlias] = typeof (decimal); - - _types[DoubleAlias] = typeof (double); - - _types[FloatAlias] = typeof (float); - _types[SingleAlias] = typeof (float); - - _types[GuidAlias] = typeof (Guid); - - _types[HashtableAlias1] = typeof (Hashtable); - _types[HashtableAlias2] = typeof (Hashtable); - _types[HashtableAlias3] = typeof (Hashtable); - - _types[Int16Alias1] = typeof (short); - _types[Int16Alias2] = typeof (short); - - _types[Int32Alias1] = typeof (int); - _types[Int32Alias2] = typeof (int); - _types[Int32Alias3] = typeof (int); - - _types[Int64Alias1] = typeof (long); - _types[Int64Alias2] = typeof (long); - - _types[UInt16Alias1] = typeof (ushort); - _types[UInt16Alias2] = typeof (ushort); - - _types[UInt32Alias1] = typeof (uint); - _types[UInt32Alias2] = typeof (uint); - - _types[UInt64Alias1] = typeof (ulong); - _types[UInt64Alias2] = typeof (ulong); - - _types[SByteAlias] = typeof (sbyte); - - _types[StringAlias] = typeof (string); - - _types[TimeSpanAlias] = typeof (string); - -#if dotnet2 - _types[NullableInt32Alias] = typeof(int?); - _types[NullableInt32ArrayAlias] = typeof(int?[]); - - _types[NullableDecimalAlias] = typeof(decimal?); - _types[NullableDecimalArrayAlias] = typeof(decimal?[]); - - _types[NullableCharAlias] = typeof(char?); - _types[NullableCharArrayAlias] = typeof(char?[]); - - _types[NullableInt64Alias] = typeof(long?); - _types[NullableInt64ArrayAlias] = typeof(long?[]); - - _types[NullableInt16Alias] = typeof(short?); - _types[NullableInt16ArrayAlias] = typeof(short?[]); - - _types[NullableUInt32Alias] = typeof(uint?); - _types[NullableUInt32ArrayAlias] = typeof(uint?[]); - - _types[NullableUInt64Alias] = typeof(ulong?); - _types[NullableUInt64ArrayAlias] = typeof(ulong?[]); - - _types[NullableUInt16Alias] = typeof(ushort?); - _types[NullableUInt16ArrayAlias] = typeof(ushort?[]); - - _types[NullableDoubleAlias] = typeof(double?); - _types[NullableDoubleArrayAlias] = typeof(double?[]); - - _types[NullableFloatAlias] = typeof(float?); - _types[NullableFloatArrayAlias] = typeof(float?[]); - - _types[NullableBoolAlias] = typeof(bool?); - _types[NullableBoolArrayAlias] = typeof(bool?[]); -#endif - } - #endregion - - #region Methods - - /// - /// Resolves the supplied to a . - /// - /// - /// The alias to resolve. - /// - /// - /// The the supplied was - /// associated with, or if no - /// was previously registered for the supplied . - /// - /// The alis name will be convert in lower character before the resolution. - /// - /// If the supplied is or - /// contains only whitespace character(s). - /// - public static Type ResolveType(string alias) - { - return (Type)_types[alias.ToLower()]; - } - - #endregion - - } -} diff --git a/src/IBatisNet.Common/Utilities/TypesResolver/TypeResolver.cs b/src/IBatisNet.Common/Utilities/TypesResolver/TypeResolver.cs deleted file mode 100644 index 0ad47af..0000000 --- a/src/IBatisNet.Common/Utilities/TypesResolver/TypeResolver.cs +++ /dev/null @@ -1,617 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 663728 $ - * $LastChangedDate: 2008-06-05 14:40:05 -0600 (Thu, 05 Jun 2008) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Remarks -// Inpspired from Spring.NET -#endregion - -#region Using - -using System; - -#if dotnet2 -using System.Collections.Generic; -#endif -using System.Reflection; - -using System.IO; -using System.Text; -using System.Text.RegularExpressions; -#endregion - -namespace IBatisNet.Common.Utilities.TypesResolver -{ - /// - /// Resolves a by name. - /// - /// - ///

    - /// The rationale behind the creation of this class is to centralise the - /// resolution of type names to instances beyond that - /// offered by the plain vanilla System.Type.GetType method call. - ///

    - ///
    - /// $Id: TypeResolver.cs,v 1.5 2004/09/28 07:51:47 springboy Exp $ - public class TypeResolver : ITypeResolver - { - private const string NULLABLE_TYPE = "System.Nullable"; - - #region ITypeResolver Members - /// - /// Resolves the supplied to a - /// instance. - /// - /// - /// The unresolved name of a . - /// - /// - /// A resolved instance. - /// - /// - /// If the supplied could not be resolved - /// to a . - /// - public virtual Type Resolve(string typeName) - { -#if dotnet2 - Type type = ResolveGenericType(typeName.Replace(" ", string.Empty)); - if (type == null) - { - type = ResolveType(typeName.Replace(" ", string.Empty)); - } - return type; -#else - return ResolveType(typeName.Replace(" ", string.Empty)); -#endif - } - #endregion - -#if dotnet2 - /// - /// Resolves the supplied generic , - /// substituting recursively all its type parameters., - /// to a instance. - /// - /// - /// The (possibly generic) name of a . - /// - /// - /// A resolved instance. - /// - /// - /// If the supplied could not be resolved - /// to a . - /// - private Type ResolveGenericType(string typeName) - { - #region Sanity Check - if (typeName == null || typeName.Trim().Length==0) - { - throw BuildTypeLoadException(typeName); - } - #endregion - - if (typeName.StartsWith(NULLABLE_TYPE)) - { - return null; - } - else - { - GenericArgumentsInfo genericInfo = new GenericArgumentsInfo(typeName); - Type type = null; - try - { - if (genericInfo.ContainsGenericArguments) - { - type = TypeUtils.ResolveType(genericInfo.GenericTypeName); - if (!genericInfo.IsGenericDefinition) - { - string[] unresolvedGenericArgs = genericInfo.GetGenericArguments(); - Type[] genericArgs = new Type[unresolvedGenericArgs.Length]; - for (int i = 0; i < unresolvedGenericArgs.Length; i++) - { - genericArgs[i] = TypeUtils.ResolveType(unresolvedGenericArgs[i]); - } - type = type.MakeGenericType(genericArgs); - } - } - } - catch (Exception ex) - { - if (ex is TypeLoadException) - { - throw; - } - throw BuildTypeLoadException(typeName, ex); - } - return type; - } - } -#endif - - /// - /// Resolves the supplied to a - /// - /// instance. - /// - /// - /// The (possibly partially assembly qualified) name of a - /// . - /// - /// - /// A resolved instance. - /// - /// - /// If the supplied could not be resolved - /// to a . - /// - private Type ResolveType(string typeName) - { - #region Sanity Check - if (typeName == null || typeName.Trim().Length == 0) - { - throw BuildTypeLoadException(typeName); - } - #endregion - - TypeAssemblyInfo typeInfo = new TypeAssemblyInfo(typeName); - Type type = null; - try - { - type = (typeInfo.IsAssemblyQualified) ? - LoadTypeDirectlyFromAssembly(typeInfo) : - LoadTypeByIteratingOverAllLoadedAssemblies(typeInfo); - } - catch (Exception ex) - { - throw BuildTypeLoadException(typeName, ex); - } - if (type == null) - { - throw BuildTypeLoadException(typeName); - } - return type; - } - - /// - /// Uses - /// to load an and then the attendant - /// referred to by the - /// parameter. - /// - /// - ///

    - /// is - /// deprecated in .NET 2.0, but is still used here (even when this class is - /// compiled for .NET 2.0); - /// will - /// still resolve (non-.NET Framework) local assemblies when given only the - /// display name of an assembly (the behaviour for .NET Framework assemblies - /// and strongly named assemblies is documented in the docs for the - /// method). - ///

    - ///
    - /// - /// The assembly and type to be loaded. - /// - /// - /// A , or . - /// - /// - /// - /// - private static Type LoadTypeDirectlyFromAssembly(TypeAssemblyInfo typeInfo) - { - Type type = null; - // assembly qualified... load the assembly, then the Type - Assembly assembly = null; - -#if dotnet2 - assembly = Assembly.Load(typeInfo.AssemblyName); -#else - assembly = Assembly.LoadWithPartialName (typeInfo.AssemblyName); -#endif - - if (assembly != null) - { - type = assembly.GetType(typeInfo.TypeName, true, true); - } - return type; - } - - /// - /// Check all assembly - /// to load the attendant referred to by - /// the parameter. - /// - /// - /// The type to be loaded. - /// - /// - /// A , or . - /// - private static Type LoadTypeByIteratingOverAllLoadedAssemblies(TypeAssemblyInfo typeInfo) - { - Type type = null; - Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); - foreach (Assembly assembly in assemblies) - { - type = assembly.GetType(typeInfo.TypeName, false, false); - if (type != null) - { - break; - } - } - return type; - } - - private static TypeLoadException BuildTypeLoadException(string typeName) - { - return new TypeLoadException("Could not load type from string value '" + typeName + "'."); - } - - private static TypeLoadException BuildTypeLoadException(string typeName, Exception ex) - { - return new TypeLoadException("Could not load type from string value '" + typeName + "'.", ex); - } - -#if dotnet2 - #region Inner Class : GenericArgumentsInfo - - /// - /// Holder for the generic arguments when using type parameters. - /// - /// - ///

    - /// Type parameters can be applied to classes, interfaces, - /// structures, methods, delegates, etc... - ///

    - ///
    - internal class GenericArgumentsInfo - { - #region Constants - - /// - /// The generic arguments prefix. - /// - public const string GENERIC_ARGUMENTS_PREFIX = "[["; - - /// - /// The generic arguments suffix. - /// - public const string GENERIC_ARGUMENTS_SUFFIX = "]]"; - - /// - /// The character that separates a list of generic arguments. - /// - public const string GENERIC_ARGUMENTS_SEPARATOR = "],["; - - #endregion - - #region Fields - - private string _unresolvedGenericTypeName = string.Empty; - private string[] _unresolvedGenericArguments = null; - private readonly static Regex generic = new Regex(@"`\d*\[\[", RegexOptions.Compiled); - #endregion - - #region Constructor (s) / Destructor - - /// - /// Creates a new instance of the GenericArgumentsInfo class. - /// - /// - /// The string value to parse looking for a generic definition - /// and retrieving its generic arguments. - /// - public GenericArgumentsInfo(string value) - { - ParseGenericArguments(value); - } - - #endregion - - #region Properties - - /// - /// The (unresolved) generic type name portion - /// of the original value when parsing a generic type. - /// - public string GenericTypeName - { - get { return _unresolvedGenericTypeName; } - } - - - /// - /// Is the string value contains generic arguments ? - /// - /// - ///

    - /// A generic argument can be a type parameter or a type argument. - ///

    - ///
    - public bool ContainsGenericArguments - { - get - { - return (_unresolvedGenericArguments != null && - _unresolvedGenericArguments.Length > 0); - } - } - - /// - /// Is generic arguments only contains type parameters ? - /// - public bool IsGenericDefinition - { - get - { - if (_unresolvedGenericArguments == null) - return false; - - foreach (string arg in _unresolvedGenericArguments) - { - if (arg.Length > 0) - return false; - } - return true; - } - } - - #endregion - - #region Methods - - /// - /// Returns an array of unresolved generic arguments types. - /// - /// - ///

    - /// A empty string represents a type parameter that - /// did not have been substituted by a specific type. - ///

    - ///
    - /// - /// An array of strings that represents the unresolved generic - /// arguments types or an empty array if not generic. - /// - public string[] GetGenericArguments() - { - if (_unresolvedGenericArguments == null) - { - return new string[] { }; - } - - return _unresolvedGenericArguments; - } - - private void ParseGenericArguments(string originalString) - { - // Check for match - bool isMatch = generic.IsMatch(originalString); - if (!isMatch) - { - _unresolvedGenericTypeName = originalString; - } - else - { - int argsStartIndex = originalString.IndexOf(GENERIC_ARGUMENTS_PREFIX); - int argsEndIndex = originalString.LastIndexOf(GENERIC_ARGUMENTS_SUFFIX); - if (argsEndIndex != -1) - { - SplitGenericArguments(originalString.Substring( - argsStartIndex + 1, argsEndIndex - argsStartIndex)); - - _unresolvedGenericTypeName = originalString.Remove(argsStartIndex, argsEndIndex - argsStartIndex + 2); - } - } - } - - private void SplitGenericArguments(string originalArgs) - { - IList arguments = new List(); - - if (originalArgs.Contains(GENERIC_ARGUMENTS_SEPARATOR)) - { - arguments = Parse(originalArgs); - } - else - { - string argument = originalArgs.Substring(1, originalArgs.Length - 2).Trim(); - arguments.Add(argument); - } - _unresolvedGenericArguments = new string[arguments.Count]; - arguments.CopyTo(_unresolvedGenericArguments, 0); - } - - private IList Parse(string args) - { - StringBuilder argument = new StringBuilder(); - IList arguments = new List(); - - TextReader input = new StringReader(args); - int nbrOfRightDelimiter = 0; - bool findRight = false; - do - { - char ch = (char)input.Read(); - if (ch == '[') - { - nbrOfRightDelimiter++; - findRight = true; - } - else if (ch == ']') - { - nbrOfRightDelimiter--; - } - argument.Append(ch); - - //Find one argument - if (findRight && nbrOfRightDelimiter == 0) - { - string arg = argument.ToString(); - arg = arg.Substring(1, arg.Length - 2); - arguments.Add(arg); - input.Read(); - argument = new StringBuilder(); - } - } - while (input.Peek() != -1); - - return arguments; - } - #endregion - } - - #endregion -#endif - - #region Inner Class : TypeAssemblyInfo - - /// - /// Holds data about a and it's - /// attendant . - /// - internal class TypeAssemblyInfo - { - #region Constants - - /// - /// The string that separates a name - /// from the name of it's attendant - /// in an assembly qualified type name. - /// - public const string TYPE_ASSEMBLY_SEPARATOR = ","; - public const string NULLABLE_TYPE = "System.Nullable"; - public const string NULLABLE_TYPE_ASSEMBLY_SEPARATOR = "]],"; - #endregion - - #region Fields - - private string _unresolvedAssemblyName = string.Empty; - private string _unresolvedTypeName = string.Empty; - - #endregion - - #region Constructor (s) / Destructor - - /// - /// Creates a new instance of the TypeAssemblyInfo class. - /// - /// - /// The unresolved name of a . - /// - public TypeAssemblyInfo(string unresolvedTypeName) - { - SplitTypeAndAssemblyNames(unresolvedTypeName); - } - - #endregion - - #region Properties - - /// - /// The (unresolved) type name portion of the original type name. - /// - public string TypeName - { - get { return _unresolvedTypeName; } - } - - /// - /// The (unresolved, possibly partial) name of the attandant assembly. - /// - public string AssemblyName - { - get { return _unresolvedAssemblyName; } - } - - /// - /// Is the type name being resolved assembly qualified? - /// - public bool IsAssemblyQualified - { - get { return HasText(AssemblyName); } - } - - #endregion - - #region Methods - - private bool HasText(string target) - { - if (target == null) - { - return false; - } - else - { - return HasLength(target.Trim()); - } - } - - private bool HasLength(string target) - { - return (target != null && target.Length > 0); - } - - private void SplitTypeAndAssemblyNames(string originalTypeName) - { - if (originalTypeName.StartsWith(NULLABLE_TYPE)) - { - int typeAssemblyIndex = originalTypeName.IndexOf(NULLABLE_TYPE_ASSEMBLY_SEPARATOR); - if (typeAssemblyIndex < 0) - { - _unresolvedTypeName = originalTypeName; - } - else - { - _unresolvedTypeName = originalTypeName.Substring(0, typeAssemblyIndex + 2).Trim(); - _unresolvedAssemblyName = originalTypeName.Substring(typeAssemblyIndex + 3).Trim(); - } - } - else - { - int typeAssemblyIndex = originalTypeName.IndexOf(TYPE_ASSEMBLY_SEPARATOR); - if (typeAssemblyIndex < 0) - { - _unresolvedTypeName = originalTypeName; - } - else - { - _unresolvedTypeName = originalTypeName.Substring(0, typeAssemblyIndex).Trim(); - _unresolvedAssemblyName = originalTypeName.Substring(typeAssemblyIndex + 1).Trim(); - } - } - } - - #endregion - } - - #endregion - } -} diff --git a/src/IBatisNet.Common/Xml/NodeUtils.cs b/src/IBatisNet.Common/Xml/NodeUtils.cs deleted file mode 100644 index 631965f..0000000 --- a/src/IBatisNet.Common/Xml/NodeUtils.cs +++ /dev/null @@ -1,182 +0,0 @@ -using System; -using System.Xml; -using System.Collections.Specialized; - -namespace IBatisNet.Common.Xml -{ - /// - /// Summary description for NodeUtils. - /// - public sealed class NodeUtils - { - - /// - /// Searches for the attribute with the specified name in this attributes list. - /// - /// - /// The key - /// - public static string GetStringAttribute(NameValueCollection attributes, string name) - { - string value = attributes[name]; - if (value == null) - { - return string.Empty; - } - else - { - return value; - } - } - - /// - /// Searches for the attribute with the specified name in this attributes list. - /// - /// - /// The key - /// The default value to be returned if the attribute is not found. - /// - public static string GetStringAttribute(NameValueCollection attributes, string name, string def) - { - string value = attributes[name]; - if (value == null) - { - return def; - } - else - { - return value; - } - } - /// - /// Searches for the attribute with the specified name in this attributes list. - /// - /// - /// The key - /// The default value to be returned if the attribute is not found. - /// - public static byte GetByteAttribute(NameValueCollection attributes, string name, byte def) - { - string value = attributes[name]; - if (value == null) - { - return def; - } - else - { - return XmlConvert.ToByte(value); - } - } - - /// - /// Searches for the attribute with the specified name in this attributes list. - /// - /// - /// The key - /// The default value to be returned if the attribute is not found. - /// - public static int GetIntAttribute(NameValueCollection attributes, string name, int def) - { - string value = attributes[name]; - if (value == null) - { - return def; - } - else - { - return XmlConvert.ToInt32(value); - } - } - - /// - /// Searches for the attribute with the specified name in this attributes list. - /// - /// - /// The key - /// The default value to be returned if the attribute is not found. - /// - public static bool GetBooleanAttribute(NameValueCollection attributes, string name, bool def) - { - string value = attributes[name]; - if (value == null) - { - return def; - } - else - { - return XmlConvert.ToBoolean(value); - } - } - - /// - /// - /// - /// - /// - public static NameValueCollection ParseAttributes(XmlNode node) - { - return ParseAttributes(node, null); - } - - /// - /// - /// - /// - /// - /// - public static NameValueCollection ParseAttributes(XmlNode node, NameValueCollection variables) - { - NameValueCollection attributes = new NameValueCollection(); - int count = node.Attributes.Count; - for (int i = 0; i < count; i++) - { - XmlAttribute attribute = node.Attributes[i]; - String value = ParsePropertyTokens(attribute.Value, variables); - attributes.Add(attribute.Name, value); - } - return attributes; - } - - - /// - /// Replace properties by their values in the given string - /// - /// - /// - /// - public static string ParsePropertyTokens(string str, NameValueCollection properties) - { - string OPEN = "${"; - string CLOSE = "}"; - - string newString = str; - if (newString != null && properties != null) - { - int start = newString.IndexOf(OPEN); - int end = newString.IndexOf(CLOSE); - - while (start > -1 && end > start) - { - string prepend = newString.Substring(0, start); - string append = newString.Substring(end + CLOSE.Length); - - int index = start + OPEN.Length; - string propName = newString.Substring(index, end-index); - string propValue = properties.Get(propName); - if (propValue == null) - { - newString = prepend + propName + append; - } - else - { - newString = prepend + propValue + append; - } - start = newString.IndexOf(OPEN); - end = newString.IndexOf(CLOSE); - } - } - return newString; - } - - } -} diff --git a/src/IBatisNet.Common/licence.txt b/src/IBatisNet.Common/licence.txt deleted file mode 100644 index 85fe608..0000000 --- a/src/IBatisNet.Common/licence.txt +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2004 Gilles Bayon - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/IBatisNet.Common/notice.txt b/src/IBatisNet.Common/notice.txt deleted file mode 100644 index 6cc7442..0000000 --- a/src/IBatisNet.Common/notice.txt +++ /dev/null @@ -1,13 +0,0 @@ -ADDITIONAL TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -FOR COMPLETE TERMS, SEE ALSO LICENSE.TXT, WHICH IS INCORPORATED BY REFERENCE - -This product includes software derived from "iBATIS Database Layer" and -"iBATIS SQL Maps" developed by Clinton Begin (http://www.ibatis.com/). - -Permission to use the name "iBATIS.NET" in connection with this -product has been granted by Clinton Begin. - -The names "iBATIS.NET" or "Clinton Begin" must not be used to endorse -or promote products derived from this software without prior written -permission of Clinton Begin. For written permission, please contact -clinton.begin@ibatis.com. \ No newline at end of file diff --git a/src/IBatisNet.Common/provider.xsd b/src/IBatisNet.Common/provider.xsd deleted file mode 100644 index 4144fb2..0000000 --- a/src/IBatisNet.Common/provider.xsd +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Extensions/AssemblyInfo.cs b/src/IBatisNet.DataAccess.Extensions/AssemblyInfo.cs deleted file mode 100644 index c935848..0000000 --- a/src/IBatisNet.DataAccess.Extensions/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -[assembly: AssemblyTitle("IBatisNet.DataAccess.Extensions")] -[assembly: AssemblyDescription("SVN 179390")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("iBATIS.NET DataAccess Extensions")] -[assembly: AssemblyCopyright("Copyright 2004,2005 The Apache Software Foundation")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Revision and Build Numbers -// by using the '*' as shown below: - -[assembly: AssemblyVersion("1.6.0")] - -// -// In order to sign your assembly you must specify a key to use. Refer to the -// Microsoft .NET Framework documentation for more information on assembly signing. -// -// Use the attributes below to control which key is used for signing. -// -// Notes: -// (*) If no key is specified, the assembly is not signed. -// (*) KeyName refers to a key that has been installed in the Crypto Service -// Provider (CSP) on your machine. KeyFile refers to a file which contains -// a key. -// (*) If the KeyFile and the KeyName values are both specified, the -// following processing occurs: -// (1) If the KeyName can be found in the CSP, that key is used. -// (2) If the KeyName does not exist and the KeyFile does exist, the key -// in the KeyFile is installed into the CSP and used. -// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility. -// When specifying the KeyFile, the location of the KeyFile should be -// relative to the project output directory which is -// %Project Directory%\obj\. For example, if your KeyFile is -// located in the project directory, you would specify the AssemblyKeyFile -// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework -// documentation for more information on this. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSession.cs b/src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSession.cs deleted file mode 100644 index cb757e7..0000000 --- a/src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSession.cs +++ /dev/null @@ -1,357 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Data; - -using IBatisNet.Common; - -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; - -using NHibernate; -using NHibernate.Cfg; - -using log4net; - -#endregion - -namespace IBatisNet.DataAccess.Extensions.DaoSessionHandlers -{ - /// - /// Summary description for NHibernateDaoSession. - /// - public class NHibernateDaoSession : DaoSession - { - #region Fields - private ISessionFactory _factory = null; - private ISession _session = null; - private ITransaction _transaction = null; - private bool _consistent = false; - - #endregion - - #region Properties - - /// - /// Changes the vote for transaction to commit (true) or to abort (false). - /// - private bool Consistent - { - set - { - _consistent = value; - } - } - - /// - /// - /// - public ISession Session - { - get { return _session; } - } - - /// - /// - /// - public ISessionFactory Factory - { - get { return _factory; } - } - - /// - /// - /// - public override DataSource DataSource - { - get - { - throw new DataAccessException("DataSource is not supported with Hibernate."); - } - } - - /// - /// - /// - public override IDbConnection Connection - { - get { return _session.Connection; } - } - - /// - /// - /// - public override IDbTransaction Transaction - { - get { return (_session.Transaction as IDbTransaction); } - } - - #endregion - - #region Constructor (s) / Destructor - /// - /// - /// - /// - /// - public NHibernateDaoSession(DaoManager daoManager, ISessionFactory factory):base(daoManager) - { - _factory = factory; - } - #endregion - - #region Methods - - /// - /// Complete (commit) a transaction - /// - /// - /// Use in 'using' syntax. - /// - public override void Complete() - { - this.Consistent = true; - } - - /// - /// Opens a database connection. - /// - public override void OpenConnection() - { - _session = _factory.OpenSession(); - } - - /// - /// Closes the connection - /// - public override void CloseConnection() - { - _session.Flush();// or Close ? - } - - /// - /// Begins a transaction. - /// - public override void BeginTransaction() - { - try - { - _session = _factory.OpenSession(); - _transaction = _session.BeginTransaction(); - } - catch (HibernateException e) - { - throw new DataAccessException("Error starting Hibernate transaction. Cause: " + e.Message, e); - } - } - - /// - /// Begins a database transaction - /// - /// Open a connection. - public override void BeginTransaction(bool openConnection) - { - if (openConnection) - { - this.BeginTransaction(); - } - else - { - if (_session == null) - { - throw new DataAccessException("NHibernateDaoSession could not invoke BeginTransaction(). A Connection must be started. Call OpenConnection() first."); - } - try - { - _transaction = _session.BeginTransaction(); - } - catch (HibernateException e) - { - throw new DataAccessException("Error starting Hibernate transaction. Cause: " + e.Message, e); - } - } - } - - /// - /// Begins a transaction at the data source with the specified IsolationLevel value. - /// - /// The transaction isolation level for this connection. - public override void BeginTransaction(IsolationLevel isolationLevel) - { - throw new DataAccessException("IsolationLevel is not supported with Hibernate transaction."); - } - - /// - /// Begins a transaction on the current connection - /// with the specified IsolationLevel value. - /// - /// The transaction isolation level for this connection. - /// Open a connection. - public override void BeginTransaction(bool openConnection, IsolationLevel isolationLevel) - { - throw new DataAccessException("IsolationLevel is not supported with Hibernate transaction."); - } - - /// - /// Commits the database transaction. - /// - /// - /// Will close the session. - /// - public override void CommitTransaction() - { - try - { - _transaction.Commit(); - _session.Close(); - } - catch (HibernateException e) - { - throw new DataAccessException("Error committing Hibernate transaction. Cause: " + e.Message, e); - } - } - - /// - /// Commits the database transaction. - /// - /// Close the session - public override void CommitTransaction(bool closeConnection) - { - try - { - _transaction.Commit(); - if(closeConnection) - { - _session.Close(); - } - } - catch (HibernateException e) - { - throw new DataAccessException("Error committing Hibernate transaction. Cause: " + e.Message, e); - } - } - - /// - /// Rolls back a transaction from a pending state. - /// - /// - /// Will close the session. - /// - public override void RollBackTransaction() - { - try - { - _transaction.Rollback(); - _session.Close(); - } - catch (HibernateException e) - { - throw new DataAccessException("Error ending Hibernate transaction. Cause: " + e.Message, e); - } - } - - /// - /// Rolls back a transaction from a pending state. - /// - /// Close the connection - public override void RollBackTransaction(bool closeConnection) - { - try - { - _transaction.Rollback(); - if(closeConnection) - { - _session.Close(); - } - } - catch (HibernateException e) - { - throw new DataAccessException("Error ending Hibernate transaction. Cause: " + e.Message, e); - } - } - - /// - /// - /// - /// - /// - public override IDbCommand CreateCommand(CommandType commandType) - { - throw new DataAccessException("CreateCommand is not supported with Hibernate."); - } - - /// - /// - /// - /// - public override IDataParameter CreateDataParameter() - { - throw new DataAccessException("CreateDataParameter is not supported with Hibernate."); - } - - /// - /// - /// - /// - public override IDbDataAdapter CreateDataAdapter() - { - throw new DataAccessException("CreateDataAdapter is not supported with Hibernate."); - } - - /// - /// - /// - /// - /// - public override IDbDataAdapter CreateDataAdapter(IDbCommand command) - { - throw new DataAccessException("CreateDataAdapter is not supported with Hibernate."); - } - #endregion - - #region IDisposable Members - /// - /// Releasing, or resetting resources. - /// - public override void Dispose() - { - if (_consistent) - { - this.CommitTransaction(); - } - else - { - this.RollBackTransaction(); - } - _session.Dispose(); - } - #endregion - - } -} diff --git a/src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSessionHandler.cs b/src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSessionHandler.cs deleted file mode 100644 index 8b05991..0000000 --- a/src/IBatisNet.DataAccess.Extensions/DaoSessionHandlers/NHibernateDaoSessionHandler.cs +++ /dev/null @@ -1,134 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Collections; -using System.Collections.Specialized; -using IBatisNet.Common; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; - -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; - -using NHibernate.Cfg; -using NHibernate; -#endregion - -namespace IBatisNet.DataAccess.Extensions.DaoSessionHandlers -{ - /// - /// Summary description for NHibernateDaoSessionHandler. - /// - public class NHibernateDaoSessionHandler : IDaoSessionHandler - { - #region Constants - private const string CONNECTION_STRING = "hibernate.connection.connection_string"; - #endregion - - #region Fields - private ISessionFactory _factory = null; - #endregion - - #region Properties - /// - /// - /// - public ISessionFactory Factory - { - get { return _factory; } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// - /// - public NHibernateDaoSessionHandler() - { - - } - #endregion - - #region Methods - /// - /// - /// - /// - /// - public void Configure(NameValueCollection properties,IDictionary resources) - { - string mapping = string.Empty; - - try - { - NHibernate.Cfg.Configuration config = new NHibernate.Cfg.Configuration(); - - // Set the connection string retrieve on the datasource - config.SetProperty( CONNECTION_STRING, (resources["DataSource"] as DataSource).ConnectionString ); - - foreach(DictionaryEntry entry in resources) - { - if ((entry.Key.ToString()).StartsWith("class.")) - { - config.AddClass( Resources.TypeForName( entry.Value.ToString() ) ); - } - if ((entry.Key.ToString())=="mapping") - { - mapping = entry.Value.ToString(); - } - - config.SetProperty( entry.Key.ToString(), entry.Value.ToString() ); - } - - if (mapping.Length>0) - { - config.AddAssembly(mapping); - } - _factory = config.BuildSessionFactory(); - } - catch(Exception e) - { - throw new ConfigurationException(string.Format("DaoManager could not configure NHibernateDaoSessionHandler. Cause: {0}", e.Message), e); - } - } - - - /// - /// - /// - /// - /// - public DaoSession GetDaoSession(DaoManager daoManager) - { - return (new NHibernateDaoSession(daoManager, _factory)); - } - #endregion - - } -} diff --git a/src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.build b/src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.build deleted file mode 100644 index 5bd3588..0000000 --- a/src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.build +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.csproj b/src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.csproj deleted file mode 100644 index cdfec10..0000000 --- a/src/IBatisNet.DataAccess.Extensions/IBatisNet.DataAccess.Extensions.csproj +++ /dev/null @@ -1,133 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Extensions/license.txt b/src/IBatisNet.DataAccess.Extensions/license.txt deleted file mode 100644 index 85fe608..0000000 --- a/src/IBatisNet.DataAccess.Extensions/license.txt +++ /dev/null @@ -1,201 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2004 Gilles Bayon - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/src/IBatisNet.DataAccess.Extensions/notice.txt b/src/IBatisNet.DataAccess.Extensions/notice.txt deleted file mode 100644 index 6cc7442..0000000 --- a/src/IBatisNet.DataAccess.Extensions/notice.txt +++ /dev/null @@ -1,13 +0,0 @@ -ADDITIONAL TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION -FOR COMPLETE TERMS, SEE ALSO LICENSE.TXT, WHICH IS INCORPORATED BY REFERENCE - -This product includes software derived from "iBATIS Database Layer" and -"iBATIS SQL Maps" developed by Clinton Begin (http://www.ibatis.com/). - -Permission to use the name "iBATIS.NET" in connection with this -product has been granted by Clinton Begin. - -The names "iBATIS.NET" or "Clinton Begin" must not be used to endorse -or promote products derived from this software without prior written -permission of Clinton Begin. For written permission, please contact -clinton.begin@ibatis.com. \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/AssemblyInfo.cs b/src/IBatisNet.DataAccess.Test/AssemblyInfo.cs deleted file mode 100644 index 76201ae..0000000 --- a/src/IBatisNet.DataAccess.Test/AssemblyInfo.cs +++ /dev/null @@ -1,58 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; - -// -// Les informations gnrales relatives un assembly dpendent de -// l'ensemble d'attributs suivant. Pour modifier les informations -// associes un assembly, changez les valeurs de ces attributs. -// -[assembly: AssemblyTitle("")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("")] -[assembly: AssemblyCopyright("")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// -// Les informations de version pour un assembly se composent des quatre valeurs suivantes: -// -// Version principale -// Version secondaire -// Numro de build -// Rvision -// -// Vous pouvez spcifier toutes les valeurs ou indiquer des numros de rvision et de build par dfaut -// en utilisant '*', comme ci-dessous : - -[assembly: AssemblyVersion("1.0.*")] - -// -// Pour signer votre assembly, vous devez spcifier la cl utiliser. Consultez -// la documentation Microsoft .NET Framework pour plus d'informations sur la signature d'un assembly. -// -// Utilisez les attributs ci-dessous pour contrler la cl utilise lors de la signature. -// -// Remarques: -// (*) Si aucune cl n'est spcifie, l'assembly n'est pas sign. -// (*) KeyName fait rfrence une cl installe dans le fournisseur de -// services cryptographiques (CSP) de votre ordinateur. KeyFile fait rfrence un fichier qui contient -// une cl. -// (*) Si les valeurs de KeyFile et de KeyName sont spcifies, le -// traitement suivant se produit: -// (1) Si KeyName se trouve dans le CSP, la cl est utilise. -// (2) Si KeyName n'existe pas mais que KeyFile existe, la cl -// de KeyFile est installe dans le CSP et utilise. -// (*) Pour crer KeyFile, vous pouvez utiliser l'utilitaire sn.exe (Strong Name, Nom fort). -// Lors de la spcification de KeyFile, son emplacement doit tre -// relatif au rpertoire de sortie du projet qui est -// %Project Directory%\obj\. Par exemple, si votre KeyFile se trouve -// dans le rpertoire du projet, vous devez spcifier l'attribut -// AssemblyKeyFile sous la forme [assembly: AssemblyKeyFile("..\\..\\mykey.snk")] -// (*) DelaySign (signature diffre) est une option avance. Pour plus d'informations, consultez la -// documentation Microsoft .NET Framework. -// -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFile("")] -[assembly: AssemblyKeyName("")] diff --git a/src/IBatisNet.DataAccess.Test/ChangeLog.txt b/src/IBatisNet.DataAccess.Test/ChangeLog.txt deleted file mode 100644 index eff77cd..0000000 --- a/src/IBatisNet.DataAccess.Test/ChangeLog.txt +++ /dev/null @@ -1,5 +0,0 @@ -IBatisNet DataAccess test Change Log - ------------------------------- -1.5.* - XX/XX/XXXX ------------------------------- diff --git a/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/AccountDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/AccountDao.cs deleted file mode 100644 index 0502c7a..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/AccountDao.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System; -using System.Collections; -using System.Data; - -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; - -using IBatisNet.DataAccess.Test.Dao.Interfaces; -using IBatisNet.DataAccess.Test.Implementations; - -using IBatisNet.DataAccess.Test.Domain; - -namespace IBatisNet.DataAccess.Test.Dao.Implementations.Ado -{ - /// - /// Description rsume de SqlAccountDao. - /// - public class AccountDao : BaseDao, IAccountDao - { - // Sql Server - private const string SELECT_ACCOUNT_BY_ID ="select Account_ID, Account_FirstName, Account_LastName, Account_Email from Accounts where Account_ID = @Account_ID"; - private const string INSERT_ACCOUNT = "insert into Accounts (Account_ID, Account_FirstName, Account_LastName, Account_Email) values (@Account_ID, @Account_FirstName, @Account_LastName, @Account_Email)"; - private const string UPDATE_ACCOUNT = "update Accounts set Account_FirstName = @Account_FirstName, Account_LastName = @Account_LastName, Account_Email = @Account_Email where Account_ID = @Account_ID"; - private const string DELETE_ACCOUNT = "delete from Accounts where Account_ID = @Account_ID"; - - // OLEDB doesn't support named parameters !!! - // Caution : You must declare the parameters in the order declaration - private const string OLEDB_SELECT_ACCOUNT_BY_ID ="select Account_ID, Account_FirstName, Account_LastName, Account_Email from Accounts where Account_ID = ?"; - private const string OLEDB_INSERT_ACCOUNT ="insert into Accounts (Account_ID, Account_FirstName, Account_LastName, Account_Email) values (?, ?, ?, ?)"; - private const string OLEDB_UPDATE_ACCOUNT ="update Accounts set Account_FirstName = ?, Account_LastName = ?, Account_Email = ? where Account_ID = ?"; - private const string OLEDB_DELETE_ACCOUNT ="delete from Accounts where Account_ID = ?"; - - private const string PARAM_ACCOUNT_ID = "@Account_ID"; - private const string PARAM_ACCOUNT_FIRSTNAME = "@Account_FirstName"; - private const string PARAM_ACCOUNT_LASTNAME = "@Account_LastName"; - private const string PARAM_ACCOUNT_EMAIL = "@Account_Email"; - - /// - /// Create an account - /// - /// The account to create - public void Create(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = INSERT_ACCOUNT; - } - else - { - command.CommandText = OLEDB_INSERT_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_FIRSTNAME; - sqlParameter.Value = account.FirstName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_LASTNAME; - sqlParameter.Value = account.LastName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_EMAIL; - sqlParameter.Value = account.EmailAddress; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing SqlAccountDao.Create. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - - /// - /// Update an account - /// - /// The account to create - public void Update(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = UPDATE_ACCOUNT; - } - else - { - command.CommandText = OLEDB_UPDATE_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_FIRSTNAME; - sqlParameter.Value = account.FirstName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_LASTNAME; - sqlParameter.Value = account.LastName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_EMAIL; - sqlParameter.Value = account.EmailAddress; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing SqlAccountDao.Update. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - - /// - /// Get an account by his id. - /// - /// An account id. - /// An account. - public Account GetAccountById(int accountID) - { - IDbCommand command = null; - DaoSession daoSession = null; - Account account = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = SELECT_ACCOUNT_BY_ID; - } - else - { - command.CommandText = OLEDB_SELECT_ACCOUNT_BY_ID; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = accountID; - command.Parameters.Add( sqlParameter ); - - IDataReader dataReader; - - dataReader = command.ExecuteReader(); - - if (dataReader.Read()) - { - account = PopulateAccount(dataReader); - } - - dataReader.Close(); - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing SqlAccountDao.GetAccountById. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - - return account; - } - - - /// - /// Delete an account - /// - /// The account to delete - public void Delete(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = DELETE_ACCOUNT; - } - else - { - command.CommandText = OLEDB_DELETE_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing SqlAccountDao.Delete. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - /// - /// Populate an account object from an datareader object. - /// - /// The datareader ue to populate the account. - /// The account. - private Account PopulateAccount(IDataReader dataReader) - { - Account account = null; - - account = new Account(); - - account.Id = (int)dataReader["Account_Id"]; - account.EmailAddress = dataReader.GetString(dataReader.GetOrdinal("Account_Email")); - account.FirstName = dataReader.GetString(dataReader.GetOrdinal("Account_FirstName")); - account.LastName = dataReader.GetString(dataReader.GetOrdinal("Account_LastName")); - - return account; - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/MySqlAccountDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/MySqlAccountDao.cs deleted file mode 100644 index 39df411..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/MySqlAccountDao.cs +++ /dev/null @@ -1,276 +0,0 @@ -using System; -using System.Collections; -using System.Data; - -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; - -using IBatisNet.DataAccess.Test.Dao.Interfaces; -using IBatisNet.DataAccess.Test.Implementations; - -using IBatisNet.DataAccess.Test.Domain; - -namespace IBatisNet.DataAccess.Test.Dao.Implementations.Ado -{ - /// - /// Description rsume de MySqlAccountDao. - /// - public class MySqlAccountDao : BaseDao, IAccountDao - { - // MySql - private const string SELECT_ACCOUNT_BY_ID ="select Account_ID, Account_FirstName, Account_LastName, Account_Email from Accounts where Account_ID = @Account_ID"; - private const string INSERT_ACCOUNT = "insert into Accounts (Account_ID, Account_FirstName, Account_LastName, Account_Email) values (@Account_ID, @Account_FirstName, @Account_LastName, @Account_Email)"; - private const string UPDATE_ACCOUNT = "update Accounts set Account_FirstName = @Account_FirstName, Account_LastName = @Account_LastName, Account_Email = @Account_Email where Account_ID = @Account_ID"; - private const string DELETE_ACCOUNT = "delete from Accounts where Account_ID = @Account_ID"; - - // OLEDB doesn't support named parameters !!! - // Caution : You must declare the parameters in the order declaration - private const string OLEDB_SELECT_ACCOUNT_BY_ID ="select Account_ID, Account_FirstName, Account_LastName, Account_Email from Accounts where Account_ID = ?"; - private const string OLEDB_INSERT_ACCOUNT ="insert into Accounts (Account_ID, Account_FirstName, Account_LastName, Account_Email) values (?, ?, ?, ?)"; - private const string OLEDB_UPDATE_ACCOUNT ="update Accounts set Account_FirstName = ?, Account_LastName = ?, Account_Email = ? where Account_ID = ?"; - private const string OLEDB_DELETE_ACCOUNT ="delete from Accounts where Account_ID = ?"; - - private const string PARAM_ACCOUNT_ID = "@Account_ID"; - private const string PARAM_ACCOUNT_FIRSTNAME = "@Account_FirstName"; - private const string PARAM_ACCOUNT_LASTNAME = "@Account_LastName"; - private const string PARAM_ACCOUNT_EMAIL = "@Account_Email"; - - /// - /// Create an account - /// - /// The account to create - public void Create(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = INSERT_ACCOUNT; - } - else - { - command.CommandText = OLEDB_INSERT_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_FIRSTNAME; - sqlParameter.Value = account.FirstName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_LASTNAME; - sqlParameter.Value = account.LastName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_EMAIL; - sqlParameter.Value = account.EmailAddress; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing MySqlAccountDao.Create. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - - /// - /// Update an account - /// - /// The account to create - public void Update(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = UPDATE_ACCOUNT; - } - else - { - command.CommandText = OLEDB_UPDATE_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_FIRSTNAME; - sqlParameter.Value = account.FirstName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_LASTNAME; - sqlParameter.Value = account.LastName; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_EMAIL; - sqlParameter.Value = account.EmailAddress; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing MySqlAccountDao.Update. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - - /// - /// Get an account by his id. - /// - /// An account id. - /// An account. - public Account GetAccountById(int accountID) - { - IDbCommand command = null; - DaoSession daoSession = null; - Account account = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = SELECT_ACCOUNT_BY_ID; - } - else - { - command.CommandText = OLEDB_SELECT_ACCOUNT_BY_ID; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = accountID; - command.Parameters.Add( sqlParameter ); - - IDataReader dataReader; - - dataReader = command.ExecuteReader(); - - if (dataReader.Read()) - { - account = PopulateAccount(dataReader); - } - - dataReader.Close(); - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing MySqlAccountDao.GetAccountById. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - - return account; - } - - - /// - /// Delete an account - /// - /// The account to delete - public void Delete(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = DELETE_ACCOUNT; - } - else - { - command.CommandText = OLEDB_DELETE_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing MySqlAccountDao.Delete. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - /// - /// Populate an account object from an datareader object. - /// - /// The datareader ue to populate the account. - /// The account. - private Account PopulateAccount(IDataReader dataReader) - { - Account account = null; - - account = new Account(); - - account.Id = (int)dataReader["Account_Id"]; - account.EmailAddress = dataReader.GetString(dataReader.GetOrdinal("Account_Email")); - account.FirstName = dataReader.GetString(dataReader.GetOrdinal("Account_FirstName")); - account.LastName = dataReader.GetString(dataReader.GetOrdinal("Account_LastName")); - - return account; - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/OracleAccountDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/OracleAccountDao.cs deleted file mode 100644 index 9c2854e..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Implementations/Ado/OracleAccountDao.cs +++ /dev/null @@ -1,292 +0,0 @@ -using System; -using System.Collections; -using System.Data; - -using IBatisNet.DataAccess; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; - -using IBatisNet.DataAccess.Test.Dao.Interfaces; -using IBatisNet.DataAccess.Test.Implementations; - -using IBatisNet.DataAccess.Test.Domain; - -namespace IBatisNet.DataAccess.Test.Dao.Implementations.Ado -{ - /// - /// Description rsume de OracleAccountDao. - /// - public class OracleAccountDao : BaseDao, IAccountDao - { - // Oracle - private const string SELECT_ACCOUNT_BY_ID ="select Account_ID, Account_FirstName, Account_LastName, Account_Email from Accounts where Account_ID = :Account_ID"; - private const string INSERT_ACCOUNT = "insert into Accounts (Account_ID, Account_FirstName, Account_LastName, Account_Email) values (:Account_ID, :Account_FirstName, :Account_LastName, :Account_Email)"; - private const string UPDATE_ACCOUNT = "update Accounts set Account_FirstName = :Account_FirstName, Account_LastName = :Account_LastName, Account_Email = :Account_Email where Account_ID = :Account_ID"; - private const string DELETE_ACCOUNT = "delete from Accounts where Account_ID = :Account_ID"; - - // OLEDB doesn't support named parameters !!! - // Caution : You must declare the parameters in the order declaration - private const string OLEDB_SELECT_ACCOUNT_BY_ID ="select Account_ID, Account_FirstName, Account_LastName, Account_Email from Accounts where Account_ID = ?"; - private const string OLEDB_INSERT_ACCOUNT ="insert into Accounts (Account_ID, Account_FirstName, Account_LastName, Account_Email) values (?, ?, ?, ?)"; - private const string OLEDB_UPDATE_ACCOUNT ="update Accounts set Account_FirstName = ?, Account_LastName = ?, Account_Email = ? where Account_ID = ?"; - private const string OLEDB_DELETE_ACCOUNT ="delete from Accounts where Account_ID = ?"; - - private const string PARAM_ACCOUNT_ID = ":Account_ID"; - private const string PARAM_ACCOUNT_FIRSTNAME = ":Account_FirstName"; - private const string PARAM_ACCOUNT_LASTNAME = ":Account_LastName"; - private const string PARAM_ACCOUNT_EMAIL = ":Account_Email"; - - /// - /// Create an account - /// - /// The account to create - public void Create(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = INSERT_ACCOUNT; - } - else - { - command.CommandText = OLEDB_INSERT_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - sqlParameter.DbType = DbType.Int32; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_FIRSTNAME; - sqlParameter.Value = account.FirstName; - sqlParameter.DbType = DbType.String; - sqlParameter.Size = 32; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_LASTNAME; - sqlParameter.Value = account.LastName; - sqlParameter.DbType = DbType.String; - sqlParameter.Size = 32; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_EMAIL; - sqlParameter.Value = account.EmailAddress; - sqlParameter.DbType = DbType.String; - sqlParameter.Size = 128; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing OracleAccountDao.Create. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - - /// - /// Update an account - /// - /// The account to create - public void Update(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = UPDATE_ACCOUNT; - } - else - { - command.CommandText = OLEDB_UPDATE_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_FIRSTNAME; - sqlParameter.Value = account.FirstName; - sqlParameter.DbType = DbType.String; - sqlParameter.Size = 32; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_LASTNAME; - sqlParameter.Value = account.LastName; - sqlParameter.DbType = DbType.String; - sqlParameter.Size = 32; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_EMAIL; - sqlParameter.Value = account.EmailAddress; - sqlParameter.DbType = DbType.String; - sqlParameter.Size = 128; - command.Parameters.Add( sqlParameter ); - - sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - sqlParameter.DbType = DbType.Int32; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing OracleAccountDao.Update. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - - /// - /// Get an account by his id. - /// - /// An account id. - /// An account. - public Account GetAccountById(int accountID) - { - IDbCommand command = null; - DaoSession daoSession = null; - Account account = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = SELECT_ACCOUNT_BY_ID; - } - else - { - command.CommandText = OLEDB_SELECT_ACCOUNT_BY_ID; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = accountID; - sqlParameter.DbType = DbType.Int32; - command.Parameters.Add( sqlParameter ); - - IDataReader dataReader; - - dataReader = command.ExecuteReader(); - - if (dataReader.Read()) - { - account = PopulateAccount(dataReader); - } - - dataReader.Close(); - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing OracleAccountDao.GetAccountById. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - - return account; - } - - - /// - /// Delete an account - /// - /// The account to delete - public void Delete(Account account) - { - IDbCommand command = null; - DaoSession daoSession = null; - - daoSession = this.GetContext(); - - command = daoSession.CreateCommand(CommandType.Text); - - try - { - if (daoSession.DataSource.DbProvider.UseParameterPrefixInSql) - { - command.CommandText = DELETE_ACCOUNT; - } - else - { - command.CommandText = OLEDB_DELETE_ACCOUNT; - } - - IDbDataParameter sqlParameter = command.CreateParameter(); - sqlParameter.ParameterName = PARAM_ACCOUNT_ID; - sqlParameter.Value = account.Id; - sqlParameter.DbType = DbType.Int32; - command.Parameters.Add( sqlParameter ); - - command.ExecuteNonQuery(); - - command.Parameters.Clear(); - } - catch (System.Exception e) - { - throw new DataAccessException("Error executing OracleAccountDao.Delete. Cause :" + e.Message, e); - } - finally - { - command.Dispose(); - } - } - - /// - /// Populate an account object from an datareader object. - /// - /// The datareader ue to populate the account. - /// The account. - private Account PopulateAccount(IDataReader dataReader) - { - Account account = null; - - account = new Account(); - - account.Id = int.Parse(dataReader["Account_Id"].ToString()); - account.EmailAddress = dataReader.GetString(dataReader.GetOrdinal("Account_Email")); - account.FirstName = dataReader.GetString(dataReader.GetOrdinal("Account_FirstName")); - account.LastName = dataReader.GetString(dataReader.GetOrdinal("Account_LastName")); - - return account; - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/Dao/Implementations/BaseDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Implementations/BaseDao.cs deleted file mode 100644 index fe17d52..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Implementations/BaseDao.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -using IBatisNet.Common; -using IBatisNet.DataAccess; //DaoManager, DaoSession -using IBatisNet.DataAccess.Interfaces; //IDao - -namespace IBatisNet.DataAccess.Test.Implementations -{ - /// - /// Description rsume de BaseDao. - /// - public class BaseDao: IDao - { - /// - /// Get the sesion. - /// - /// A DaoSession - protected DaoSession GetContext() - { - IDaoManager daoManager = DaoManager.GetInstance(this); - return (daoManager.LocalDaoSession as DaoSession); - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/Dao/Implementations/DataMapper/AccountDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Implementations/DataMapper/AccountDao.cs deleted file mode 100644 index e52ff28..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Implementations/DataMapper/AccountDao.cs +++ /dev/null @@ -1,112 +0,0 @@ -using System; - -using IBatisNet.DataMapper; -using IBatisNet.DataAccess.DaoSessionHandlers; // SqlMapDaoSession -using IBatisNet.DataAccess.Exceptions; - -// Domain Dao -using IBatisNet.DataAccess.Test.Dao.Interfaces; // IAccountDao -using IBatisNet.DataAccess.Test.Implementations; // BaseDao - -using IBatisNet.DataAccess.Test.Domain; - -namespace IBatisNet.DataAccess.Test.Dao.Implementations.DataMapper -{ - /// - /// Summary description for SqlAccountViaSqlMapDao. - /// - public class AccountDao : BaseDao, IAccountDao - { - - /// - /// Create an account - /// - /// The account to create - public void Create(Account account) - { - SqlMapDaoSession sqlMapDaoSession = null; - - try - { - sqlMapDaoSession = (SqlMapDaoSession)this.GetContext(); - - ISqlMapper sqlMap = sqlMapDaoSession.SqlMap; - - sqlMap.Insert("InsertAccountViaParameterMap", account); - } - catch(DataAccessException ex) - { - throw new DataAccessException("Error executing SqlAccountViaSqlMapDao.Create. Cause :" +ex.Message,ex); - } - } - - /// - /// Update an account - /// - /// The account to Update - public void Update(Account account) - { - SqlMapDaoSession sqlMapDaoSession = null; - - try - { - sqlMapDaoSession = (SqlMapDaoSession)this.GetContext(); - - ISqlMapper sqlMap = sqlMapDaoSession.SqlMap; - - sqlMap.Update("UpdateAccountViaParameterMap", account); - } - catch(DataAccessException ex) - { - throw new DataAccessException("Error executing SqlAccountViaSqlMapDao.Create. Cause :" +ex.Message,ex); - } - } - - /// - /// Update an account - /// - /// The account to Delete - public void Delete(Account account) - { - SqlMapDaoSession sqlMapDaoSession = null; - - try - { - sqlMapDaoSession = (SqlMapDaoSession)this.GetContext(); - - ISqlMapper sqlMap = sqlMapDaoSession.SqlMap; - - sqlMap.Delete("DeleteAccountViaInlineParameters", account); - } - catch(DataAccessException ex) - { - throw new DataAccessException("Error executing SqlAccountViaSqlMapDao.Delete. Cause :" +ex.Message,ex); - } - } - - /// - /// Get an account by his id. - /// - /// An account id. - /// An account. - public Account GetAccountById(int accountID) - { - SqlMapDaoSession sqlMapDaoSession = null; - - try - { - sqlMapDaoSession = (SqlMapDaoSession)this.GetContext(); - - ISqlMapper sqlMap = sqlMapDaoSession.SqlMap; - - return (Account) sqlMap.QueryForObject("GetAccountViaColumnName", accountID); - } - catch(DataAccessException ex) - { - throw new DataAccessException("Error executing SqlAccountViaSqlMapDao.GetAccountById. Cause :" +ex.Message,ex); - } - } - - - } -} diff --git a/src/IBatisNet.DataAccess.Test/Dao/Implementations/NHibernate/UserDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Implementations/NHibernate/UserDao.cs deleted file mode 100644 index c8e4988..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Implementations/NHibernate/UserDao.cs +++ /dev/null @@ -1,68 +0,0 @@ -using System; - -using IBatisNet.DataMapper; -using IBatisNet.DataAccess.Extensions.DaoSessionHandlers; // NHibernateDaoSession -using IBatisNet.DataAccess.Exceptions; - -// Domain Dao -using IBatisNet.DataAccess.Test.Dao.Interfaces; // IUserDao -using IBatisNet.DataAccess.Test.Implementations; // BaseDao - -using IBatisNet.DataAccess.Test.Domain; - -using NHibernate; - -namespace IBatisNet.DataAccess.Test.Dao.Implementations.NHibernate -{ - /// - /// Summary description for UserDao. - /// - public class UserDao : BaseDao, IUserDao - { - /// - /// Create an user - /// - /// The user to create - public void Create(User user) - { - NHibernateDaoSession nHibernateDaoSession = null; - - try - { - nHibernateDaoSession = (NHibernateDaoSession)this.GetContext(); - - ISession session = nHibernateDaoSession.Session; - - session.Save( user ); - } - catch(DataAccessException ex) - { - throw new DataAccessException("Error executing UserDao.Create. Cause :" +ex.Message,ex); - } - } - - /// - /// Load a user - /// - public User Load(string id) - { - NHibernateDaoSession nHibernateDaoSession = null; - User user = null; - - try - { - nHibernateDaoSession = (NHibernateDaoSession)this.GetContext(); - - ISession session = nHibernateDaoSession.Session; - - user = session.Load(typeof(User),id) as User; - } - catch(Exception ex) - { - throw new DataAccessException("Error executing UserDao.Create. Cause :" +ex.Message,ex); - } - - return user; - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/Dao/Interfaces/IAccountDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Interfaces/IAccountDao.cs deleted file mode 100644 index f2aa9fb..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Interfaces/IAccountDao.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; - -using IBatisNet.DataAccess.Interfaces; -using IBatisNet.DataAccess.Test.Domain; - -namespace IBatisNet.DataAccess.Test.Dao.Interfaces -{ - /// - /// Description rsume de IAccountDao. - /// - public interface IAccountDao - { - /// - /// Get an account by his id. - /// - /// An account id. - /// An account. - Account GetAccountById(int accountID); - - /// - /// Create an account - /// - /// The account to create - void Create(Account account); - - /// - /// Update an account - /// - /// The account to create - void Update(Account account); - - /// - /// Delete an account - /// - /// The account to delete - void Delete(Account account); - } -} diff --git a/src/IBatisNet.DataAccess.Test/Dao/Interfaces/IuserDao.cs b/src/IBatisNet.DataAccess.Test/Dao/Interfaces/IuserDao.cs deleted file mode 100644 index 501682c..0000000 --- a/src/IBatisNet.DataAccess.Test/Dao/Interfaces/IuserDao.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; - -using IBatisNet.DataAccess.Interfaces; -using IBatisNet.DataAccess.Test.Domain; - -namespace IBatisNet.DataAccess.Test.Dao.Interfaces -{ - /// - /// Summary description for IuserDao. - /// - public interface IUserDao : IDao - { - /// - /// Create an user - /// - /// The user to create - void Create(User user); - - /// - /// Load a user - /// - User Load(string id); - } -} diff --git a/src/IBatisNet.DataAccess.Test/DataBase-Template.config b/src/IBatisNet.DataAccess.Test/DataBase-Template.config deleted file mode 100644 index e1ddafb..0000000 --- a/src/IBatisNet.DataAccess.Test/DataBase-Template.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Domain/Account.cs b/src/IBatisNet.DataAccess.Test/Domain/Account.cs deleted file mode 100644 index 1dff1cc..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/Account.cs +++ /dev/null @@ -1,76 +0,0 @@ -using System; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Description rsume de Account. - /// - public class Account - { - private int _id; - private string _firstName; - private string _lastName; - private string _emailAddress; - private int[] _ids = null; - - public int Id - { - get - { - return _id; - } - set - { - _id = value; - } - } - - public string FirstName - { - get - { - return _firstName; - } - set - { - _firstName = value; - } - } - - public string LastName - { - get - { - return _lastName; - } - set - { - _lastName = value; - } - } - - public string EmailAddress - { - get - { - return _emailAddress; - } - set - { - _emailAddress = value; - } - } - - public int[] Ids - { - get - { - return _ids; - } - set - { - _ids = value; - } - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/AccountBis.cs b/src/IBatisNet.DataAccess.Test/Domain/AccountBis.cs deleted file mode 100644 index bca910c..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/AccountBis.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Description rsume de AccountBis. - /// - public class AccountBis - { - public int Id; - public string FirstName; - public string LastName; - public string EmailAddress; - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/AccountCollection.cs b/src/IBatisNet.DataAccess.Test/Domain/AccountCollection.cs deleted file mode 100644 index 08417a9..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/AccountCollection.cs +++ /dev/null @@ -1,2362 +0,0 @@ - -using System; -using System.Collections; - -// Generated with CodeSmith - -namespace IBatisNet.DataAccess.Test.Domain -{ - #region Interface IAccountCollection - - /// - /// Defines size, enumerators, and synchronization methods for strongly - /// typed collections of elements. - /// - /// - /// IAccountCollection provides an - /// that is strongly typed for elements. - /// - - public interface IAccountCollection - { - #region Properties - #region Count - - /// - /// Gets the number of elements contained in the - /// . - /// - /// The number of elements contained in the - /// . - /// Please refer to for details. - - int Count { get; } - - #endregion - #region IsSynchronized - - /// - /// Gets a value indicating whether access to the - /// is synchronized (thread-safe). - /// - /// true if access to the is - /// synchronized (thread-safe); otherwise, false. The default is false. - /// Please refer to for details. - - bool IsSynchronized { get; } - - #endregion - #region SyncRoot - - /// - /// Gets an object that can be used to synchronize access - /// to the . - /// - /// An object that can be used to synchronize access - /// to the . - /// Please refer to for details. - - object SyncRoot { get; } - - #endregion - #endregion - #region Methods - #region CopyTo - - /// - /// Copies the entire to a one-dimensional - /// of elements, starting at the specified index of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// The zero-based index in - /// at which copying begins. - /// - /// is a null reference. - /// - /// is less than zero. - /// - /// is equal to or greater than the length of . - /// -or- - /// The number of elements in the source is greater - /// than the available space from to the end of the destination - /// . - /// Please refer to for details. - - void CopyTo(Account[] array, int arrayIndex); - - #endregion - #region GetEnumerator - - /// - /// Returns an that can - /// iterate through the . - /// - /// An - /// for the entire . - /// Please refer to for details. - - IAccountEnumerator GetEnumerator(); - - #endregion - #endregion - } - - #endregion - #region Interface IAccountList - - /// - /// Represents a strongly typed collection of - /// objects that can be individually accessed by index. - /// - /// - /// IAccountList provides an - /// that is strongly typed for elements. - /// - - public interface - IAccountList: IAccountCollection - { - #region Properties - #region IsFixedSize - - /// - /// Gets a value indicating whether the has a fixed size. - /// - /// true if the has a fixed size; - /// otherwise, false. The default is false. - /// Please refer to for details. - - bool IsFixedSize { get; } - - #endregion - #region IsReadOnly - - /// - /// Gets a value indicating whether the is read-only. - /// - /// true if the is read-only; - /// otherwise, false. The default is false. - /// Please refer to for details. - - bool IsReadOnly { get; } - - #endregion - #region Item - - /// - /// Gets or sets the element at the specified index. - /// - /// The zero-based index of the - /// element to get or set. - /// - /// The element at the specified . - /// - /// - /// is less than zero. - /// -or- - /// is equal to or greater than - /// . - /// - /// - /// The property is set and the is read-only. - /// Please refer to for details. - - Account this[int index] { get; set; } - - #endregion - #endregion - #region Methods - #region Add - - /// - /// Adds a to the end - /// of the . - /// - /// The object - /// to be added to the end of the . - /// This argument can be a null reference. - /// - /// The index at which - /// the has been added. - /// - /// The is read-only. - /// -or- - /// The IAccountList has a fixed size. - /// Please refer to for details. - - int Add(Account value); - - #endregion - #region Clear - - /// - /// Removes all elements from the . - /// - /// - /// The is read-only. - /// -or- - /// The IAccountList has a fixed size. - /// Please refer to for details. - - void Clear(); - - #endregion - #region Contains - - /// - /// Determines whether the - /// contains the specified element. - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// true if is found in the - /// ; otherwise, false. - /// Please refer to for details. - - bool Contains(Account value); - - #endregion - #region IndexOf - - /// - /// Returns the zero-based index of the first occurrence of the specified - /// in the . - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// - /// The zero-based index of the first occurrence of - /// in the , if found; otherwise, -1. - /// - /// Please refer to for details. - - int IndexOf(Account value); - - #endregion - #region Insert - - /// - /// Inserts a element into the - /// at the specified index. - /// - /// The zero-based index at which - /// should be inserted. - /// The object - /// to insert into the . - /// This argument can be a null reference. - /// - /// - /// is less than zero. - /// -or- - /// is greater than - /// . - /// - /// - /// The is read-only. - /// -or- - /// The IAccountList has a fixed size. - /// Please refer to for details. - - void Insert(int index, Account value); - - #endregion - #region Remove - - /// - /// Removes the first occurrence of the specified - /// from the . - /// - /// The object - /// to remove from the . - /// This argument can be a null reference. - /// - /// - /// The is read-only. - /// -or- - /// The IAccountList has a fixed size. - /// Please refer to for details. - - void Remove(Account value); - - #endregion - #region RemoveAt - - /// - /// Removes the element at the specified index of the - /// . - /// - /// The zero-based index of the element to remove. - /// - /// is less than zero. - /// -or- - /// is equal to or greater than - /// . - /// - /// - /// The is read-only. - /// -or- - /// The IAccountList has a fixed size. - /// Please refer to for details. - - void RemoveAt(int index); - - #endregion - #endregion - } - - #endregion - #region Interface IAccountEnumerator - - /// - /// Supports type-safe iteration over a collection that - /// contains elements. - /// - /// - /// IAccountEnumerator provides an - /// that is strongly typed for elements. - /// - - public interface IAccountEnumerator - { - #region Properties - #region Current - - /// - /// Gets the current element in the collection. - /// - /// The current element in the collection. - /// The enumerator is positioned - /// before the first element of the collection or after the last element. - /// -or- - /// The collection was modified after the enumerator was created. - /// Please refer to for details, but note - /// that Current fails if the collection was modified since the last successful - /// call to or . - - Account Current { get; } - - #endregion - #endregion - #region Methods - #region MoveNext - - /// - /// Advances the enumerator to the next element of the collection. - /// - /// true if the enumerator was successfully advanced to the next element; - /// false if the enumerator has passed the end of the collection. - /// - /// The collection was modified after the enumerator was created. - /// Please refer to for details. - - bool MoveNext(); - - #endregion - #region Reset - - /// - /// Sets the enumerator to its initial position, - /// which is before the first element in the collection. - /// - /// - /// The collection was modified after the enumerator was created. - /// Please refer to for details. - - void Reset(); - - #endregion - #endregion - } - - #endregion - #region Class AccountCollection - - /// - /// Implements a strongly typed collection of elements. - /// - /// - /// AccountCollection provides an - /// that is strongly typed for elements. - /// - - [Serializable] - public class AccountCollection: - IAccountList, IList, ICloneable - { - #region Private Fields - - private const int _defaultCapacity = 16; - - private Account[] _array = null; - private int _count = 0; - - [NonSerialized] - private int _version = 0; - - #endregion - #region Private Constructors - - // helper type to identify private ctor - private enum Tag { Default } - - private AccountCollection(Tag tag) { } - - #endregion - #region Public Constructors - #region AccountCollection() - - /// - /// Initializes a new instance of the class. - /// - /// - /// Initializes a new instance of the class - /// that is empty and has the default initial capacity. - /// - /// Please refer to for details. - - public AccountCollection() - { - this._array = new Account[_defaultCapacity]; - } - - #endregion - #region AccountCollection(Int32) - - /// - /// Initializes a new instance of the class - /// that is empty and has the specified initial capacity. - /// - /// The number of elements that the new - /// is initially capable of storing. - /// - /// is less than zero. - /// Please refer to for details. - - public AccountCollection(int capacity) - { - if (capacity < 0) - throw new ArgumentOutOfRangeException("capacity", - capacity, "Argument cannot be negative."); - - this._array = new Account[capacity]; - } - - #endregion - #region AccountCollection(AccountCollection) - - /// - /// Initializes a new instance of the class - /// that contains elements copied from the specified collection and - /// that has the same initial capacity as the number of elements copied. - /// - /// The - /// whose elements are copied to the new collection. - /// - /// is a null reference. - /// Please refer to for details. - - public AccountCollection(AccountCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - this._array = new Account[collection.Count]; - AddRange(collection); - } - - #endregion - #region AccountCollection(Account[]) - - /// - /// Initializes a new instance of the class - /// that contains elements copied from the specified - /// array and that has the same initial capacity as the number of elements copied. - /// - /// An of - /// elements that are copied to the new collection. - /// - /// is a null reference. - /// Please refer to for details. - - public AccountCollection(Account[] array) - { - if (array == null) - throw new ArgumentNullException("array"); - - this._array = new Account[array.Length]; - AddRange(array); - } - - #endregion - #endregion - #region Protected Properties - #region InnerArray - - /// - /// Gets the list of elements contained in the instance. - /// - /// - /// A one-dimensional with zero-based indexing that contains all - /// elements in the . - /// - /// - /// Use InnerArray to access the element array of a - /// instance that might be a read-only or synchronized wrapper. This is necessary because - /// the element array field of wrapper classes is always a null reference. - /// - - protected virtual Account[] InnerArray - { - get { return this._array; } - } - - #endregion - #endregion - #region Public Properties - #region Capacity - - /// - /// Gets or sets the capacity of the . - /// - /// The number of elements that the - /// can contain. - /// - /// Capacity is set to a value that is less than . - /// Please refer to for details. - - public virtual int Capacity - { - get { return this._array.Length; } - set - { - if (value == this._array.Length) return; - - if (value < this._count) - throw new ArgumentOutOfRangeException("Capacity", - value, "Value cannot be less than Count."); - - if (value == 0) - { - this._array = new Account[_defaultCapacity]; - return; - } - - Account[] newArray = new Account[value]; - Array.Copy(this._array, newArray, this._count); - this._array = newArray; - } - } - - #endregion - #region Count - - /// - /// Gets the number of elements contained in the . - /// - /// - /// The number of elements contained in the . - /// - /// Please refer to for details. - - public virtual int Count - { - get { return this._count; } - } - - #endregion - #region IsFixedSize - - /// - /// Gets a value indicating whether the has a fixed size. - /// - /// true if the has a fixed size; - /// otherwise, false. The default is false. - /// Please refer to for details. - - public virtual bool IsFixedSize - { - get { return false; } - } - - #endregion - #region IsReadOnly - - /// - /// Gets a value indicating whether the is read-only. - /// - /// true if the is read-only; - /// otherwise, false. The default is false. - /// Please refer to for details. - - public virtual bool IsReadOnly - { - get { return false; } - } - - #endregion - #region IsSynchronized - - /// - /// Gets a value indicating whether access to the - /// is synchronized (thread-safe). - /// - /// true if access to the is - /// synchronized (thread-safe); otherwise, false. The default is false. - /// Please refer to for details. - - public virtual bool IsSynchronized - { - get { return false; } - } - - #endregion - #region IsUnique - - /// - /// Gets a value indicating whether the - /// ensures that all elements are unique. - /// - /// - /// true if the ensures that all - /// elements are unique; otherwise, false. The default is false. - /// - /// - /// IsUnique returns true exactly if the - /// is exposed through a wrapper. - /// Please refer to for details. - /// - - public virtual bool IsUnique - { - get { return false; } - } - - #endregion - #region Item: Account - - /// - /// Gets or sets the element at the specified index. - /// - /// The zero-based index of the - /// element to get or set. - /// - /// The element at the specified . - /// - /// - /// is less than zero. - /// -or- - /// is equal to or greater than . - /// - /// - /// The property is set and the is read-only. - /// -or- - /// The property is set, the AccountCollection already contains the - /// specified element at a different index, and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual Account this[int index] - { - get - { - ValidateIndex(index); - return this._array[index]; - } - set - { - ValidateIndex(index); - ++this._version; - this._array[index] = value; - } - } - - #endregion - #region IList.Item: Object - - /// - /// Gets or sets the element at the specified index. - /// - /// The zero-based index of the element to get or set. - /// - /// The element at the specified . When the property - /// is set, this value must be compatible with . - /// - /// - /// is less than zero. - /// -or- - /// is equal to or greater than . - /// - /// The property is set to a value - /// that is not compatible with . - /// - /// The property is set and the is read-only. - /// -or- - /// The property is set, the AccountCollection already contains the - /// specified element at a different index, and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - object IList.this[int index] - { - get { return this[index]; } - set { this[index] = (Account) value; } - } - - #endregion - #region SyncRoot - - /// - /// Gets an object that can be used to synchronize - /// access to the . - /// - /// An object that can be used to synchronize - /// access to the . - /// - /// Please refer to for details. - - public virtual object SyncRoot - { - get { return this; } - } - - #endregion - #endregion - #region Public Methods - #region Add(Account) - - /// - /// Adds a to the end of the . - /// - /// The object - /// to be added to the end of the . - /// This argument can be a null reference. - /// - /// The index at which the - /// has been added. - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// -or- - /// The AccountCollection already contains the specified - /// , and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual int Add(Account value) - { - if (this._count == this._array.Length) - EnsureCapacity(this._count + 1); - - ++this._version; - this._array[this._count] = value; - return this._count++; - } - - #endregion - #region IList.Add(Object) - - /// - /// Adds an to the end of the . - /// - /// - /// The object to be added to the end of the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// The index at which the - /// has been added. - /// - /// is not compatible with . - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// -or- - /// The AccountCollection already contains the specified - /// , and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - int IList.Add(object value) - { - return Add((Account) value); - } - - #endregion - #region AddRange(AccountCollection) - - /// - /// Adds a range of elements to the end of the . - /// - /// - /// Adds the elements of another collection to the end of the . - /// - /// The whose elements - /// should be added to the end of the current collection. - /// - /// is a null reference. - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// -or- - /// The AccountCollection already contains one or more elements - /// in the specified , and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual void AddRange(AccountCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - if (collection.Count == 0) return; - if (this._count + collection.Count > this._array.Length) - EnsureCapacity(this._count + collection.Count); - - ++this._version; - Array.Copy(collection.InnerArray, 0, - this._array, this._count, collection.Count); - this._count += collection.Count; - } - - #endregion - #region AddRange(Account[]) - - /// - /// Adds the elements of a array - /// to the end of the . - /// - /// An of elements - /// that should be added to the end of the . - /// - /// is a null reference. - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// -or- - /// The AccountCollection already contains one or more elements - /// in the specified , and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual void AddRange(Account[] array) - { - if (array == null) - throw new ArgumentNullException("array"); - - if (array.Length == 0) return; - if (this._count + array.Length > this._array.Length) - EnsureCapacity(this._count + array.Length); - - ++this._version; - Array.Copy(array, 0, this._array, this._count, array.Length); - this._count += array.Length; - } - - #endregion - #region BinarySearch - - /// - /// Searches the entire sorted for an - /// element using the default comparer - /// and returns the zero-based index of the element. - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// The zero-based index of in the sorted - /// , if is found; - /// otherwise, a negative number, which is the bitwise complement of the index - /// of the next element that is larger than or, if there - /// is no larger element, the bitwise complement of . - /// - /// Neither nor the elements of the - /// implement the interface. - /// Please refer to for details. - - public virtual int BinarySearch(Account value) - { - return Array.BinarySearch(this._array, 0, this._count, value); - } - - #endregion - #region Clear - - /// - /// Removes all elements from the . - /// - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// Please refer to for details. - - public virtual void Clear() - { - if (this._count == 0) return; - - ++this._version; - Array.Clear(this._array, 0, this._count); - this._count = 0; - } - - #endregion - #region Clone - - /// - /// Creates a shallow copy of the . - /// - /// A shallow copy of the . - /// Please refer to for details. - - public virtual object Clone() - { - AccountCollection collection = new AccountCollection(this._count); - - Array.Copy(this._array, 0, collection._array, 0, this._count); - collection._count = this._count; - collection._version = this._version; - - return collection; - } - - #endregion - #region Contains(Account) - - /// - /// Determines whether the - /// contains the specified element. - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// true if is found in the - /// ; otherwise, false. - /// Please refer to for details. - - public bool Contains(Account value) - { - return (IndexOf(value) >= 0); - } - - #endregion - #region IList.Contains(Object) - - /// - /// Determines whether the contains the specified element. - /// - /// The object to locate in the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// true if is found in the - /// ; otherwise, false. - /// - /// is not compatible with . - /// Please refer to for details. - - bool IList.Contains(object value) - { - return Contains((Account) value); - } - - #endregion - #region CopyTo(Account[]) - - /// - /// Copies the or a portion of it to a one-dimensional array. - /// - /// - /// Copies the entire to a one-dimensional - /// of elements, starting at the beginning of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// - /// is a null reference. - /// - /// The number of elements in the source is greater - /// than the available space in the destination . - /// Please refer to for details. - - public virtual void CopyTo(Account[] array) - { - CheckTargetArray(array, 0); - Array.Copy(this._array, array, this._count); - } - - #endregion - #region CopyTo(Account[], Int32) - - /// - /// Copies the entire to a one-dimensional - /// of elements, starting at the specified index of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// The zero-based index in - /// at which copying begins. - /// - /// is a null reference. - /// - /// is less than zero. - /// - /// is equal to or greater than the length of . - /// -or- - /// The number of elements in the source is greater than the - /// available space from to the end of the destination - /// . - /// Please refer to for details. - - public virtual void CopyTo(Account[] array, int arrayIndex) - { - CheckTargetArray(array, arrayIndex); - Array.Copy(this._array, 0, array, arrayIndex, this._count); - } - - #endregion - #region ICollection.CopyTo(Array, Int32) - - /// - /// Copies the entire to a one-dimensional , - /// starting at the specified index of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// The zero-based index in - /// at which copying begins. - /// - /// is a null reference. - /// - /// is less than zero. - /// - /// is multidimensional. - /// -or- - /// is equal to or greater than the length of . - /// -or- - /// The number of elements in the source is greater than the - /// available space from to the end of the destination - /// . - /// - /// The type cannot be cast automatically - /// to the type of the destination . - /// Please refer to for details. - - void ICollection.CopyTo(Array array, int arrayIndex) - { - CopyTo((Account[]) array, arrayIndex); - } - - #endregion - #region GetEnumerator: IAccountEnumerator - - /// - /// Returns an that can - /// iterate through the . - /// - /// An - /// for the entire . - /// Please refer to for details. - - public virtual IAccountEnumerator GetEnumerator() - { - return new Enumerator(this); - } - - #endregion - #region IEnumerable.GetEnumerator: IEnumerator - - /// - /// Returns an that can - /// iterate through the . - /// - /// An - /// for the entire . - /// Please refer to for details. - - IEnumerator IEnumerable.GetEnumerator() - { - return (IEnumerator) GetEnumerator(); - } - - #endregion - #region IndexOf(Account) - - /// - /// Returns the zero-based index of the first occurrence of the specified - /// in the . - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// - /// The zero-based index of the first occurrence of - /// in the , if found; otherwise, -1. - /// - /// Please refer to for details. - - public virtual int IndexOf(Account value) - { - return Array.IndexOf(this._array, value, 0, this._count); - } - - #endregion - #region IList.IndexOf(Object) - - /// - /// Returns the zero-based index of the first occurrence of the specified - /// in the . - /// - /// The object to locate in the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// - /// The zero-based index of the first occurrence of - /// in the , if found; otherwise, -1. - /// - /// - /// is not compatible with . - /// Please refer to for details. - - int IList.IndexOf(object value) - { - return IndexOf((Account) value); - } - - #endregion - #region Insert(Int32, Account) - - /// - /// Inserts a element into the - /// at the specified index. - /// - /// The zero-based index at which - /// should be inserted. - /// The object - /// to insert into the . - /// This argument can be a null reference. - /// - /// - /// is less than zero. - /// -or- - /// is greater than . - /// - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// -or- - /// The AccountCollection already contains the specified - /// , and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual void Insert(int index, Account value) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (index > this._count) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot exceed Count."); - - if (this._count == this._array.Length) - EnsureCapacity(this._count + 1); - - ++this._version; - if (index < this._count) - Array.Copy(this._array, index, - this._array, index + 1, this._count - index); - - this._array[index] = value; - ++this._count; - } - - #endregion - #region IList.Insert(Int32, Object) - - /// - /// Inserts an element into the at the specified index. - /// - /// The zero-based index at which - /// should be inserted. - /// The object to insert into the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// - /// is less than zero. - /// -or- - /// is greater than . - /// - /// - /// is not compatible with . - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// -or- - /// The AccountCollection already contains the specified - /// , and the AccountCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - void IList.Insert(int index, object value) - { - Insert(index, (Account) value); - } - - #endregion - #region ReadOnly - - /// - /// Returns a read-only wrapper for the specified . - /// - /// The to wrap. - /// A read-only wrapper around . - /// - /// is a null reference. - /// Please refer to for details. - - public static AccountCollection ReadOnly(AccountCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - return new ReadOnlyList(collection); - } - - #endregion - #region Remove(Account) - - /// - /// Removes the first occurrence of the specified - /// from the . - /// - /// The object - /// to remove from the . - /// This argument can be a null reference. - /// - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// Please refer to for details. - - public virtual void Remove(Account value) - { - int index = IndexOf(value); - if (index >= 0) RemoveAt(index); - } - - #endregion - #region IList.Remove(Object) - - /// - /// Removes the first occurrence of the specified - /// from the . - /// - /// The object to remove from the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// - /// is not compatible with . - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// Please refer to for details. - - void IList.Remove(object value) - { - Remove((Account) value); - } - - #endregion - #region RemoveAt - - /// - /// Removes the element at the specified index of the . - /// - /// The zero-based index of the element to remove. - /// - /// is less than zero. - /// -or- - /// is equal to or greater than . - /// - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// Please refer to for details. - - public virtual void RemoveAt(int index) - { - ValidateIndex(index); - - ++this._version; - if (index < --this._count) - Array.Copy(this._array, index + 1, - this._array, index, this._count - index); - - this._array[this._count] = null; - } - - #endregion - #region RemoveRange - - /// - /// Removes the specified range of elements from the . - /// - /// The zero-based starting index of the range - /// of elements to remove. - /// The number of elements to remove. - /// - /// and do not denote a - /// valid range of elements in the . - /// - /// is less than zero. - /// -or- - /// is less than zero. - /// - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// Please refer to for details. - - public virtual void RemoveRange(int index, int count) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (count < 0) - throw new ArgumentOutOfRangeException("count", - count, "Argument cannot be negative."); - - if (index + count > this._count) - throw new ArgumentException( - "Arguments denote invalid range of elements."); - - if (count == 0) return; - - ++this._version; - this._count -= count; - - if (index < this._count) - Array.Copy(this._array, index + count, - this._array, index, this._count - index); - - Array.Clear(this._array, this._count, count); - } - - #endregion - #region Reverse() - - /// - /// Reverses the order of the elements in the - /// or a portion of it. - /// - /// - /// Reverses the order of the elements in the entire . - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Reverse() - { - if (this._count <= 1) return; - ++this._version; - Array.Reverse(this._array, 0, this._count); - } - - #endregion - #region Reverse(Int32, Int32) - - /// - /// Reverses the order of the elements in the specified range. - /// - /// The zero-based starting index of the range - /// of elements to reverse. - /// The number of elements to reverse. - /// - /// and do not denote a - /// valid range of elements in the . - /// - /// is less than zero. - /// -or- - /// is less than zero. - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Reverse(int index, int count) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (count < 0) - throw new ArgumentOutOfRangeException("count", - count, "Argument cannot be negative."); - - if (index + count > this._count) - throw new ArgumentException( - "Arguments denote invalid range of elements."); - - if (count <= 1 || this._count <= 1) return; - ++this._version; - Array.Reverse(this._array, index, count); - } - - #endregion - #region Sort() - - /// - /// Sorts the elements in the or a portion of it. - /// - /// - /// Sorts the elements in the entire - /// using the implementation of each element. - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Sort() - { - if (this._count <= 1) return; - ++this._version; - Array.Sort(this._array, 0, this._count); - } - - #endregion - #region Sort(IComparer) - - /// - /// Sorts the elements in the entire - /// using the specified interface. - /// - /// - /// The implementation to use when comparing elements. - /// -or- - /// A null reference to use the implementation - /// of each element. - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Sort(IComparer comparer) - { - if (this._count <= 1) return; - ++this._version; - Array.Sort(this._array, 0, this._count, comparer); - } - - #endregion - #region Sort(Int32, Int32, IComparer) - - /// - /// Sorts the elements in the specified range - /// using the specified interface. - /// - /// The zero-based starting index of the range - /// of elements to sort. - /// The number of elements to sort. - /// - /// The implementation to use when comparing elements. - /// -or- - /// A null reference to use the implementation - /// of each element. - /// - /// and do not denote a - /// valid range of elements in the . - /// - /// is less than zero. - /// -or- - /// is less than zero. - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Sort(int index, int count, IComparer comparer) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (count < 0) - throw new ArgumentOutOfRangeException("count", - count, "Argument cannot be negative."); - - if (index + count > this._count) - throw new ArgumentException( - "Arguments denote invalid range of elements."); - - if (count <= 1 || this._count <= 1) return; - ++this._version; - Array.Sort(this._array, index, count, comparer); - } - - #endregion - #region Synchronized - - /// - /// Returns a synchronized (thread-safe) wrapper - /// for the specified . - /// - /// The to synchronize. - /// - /// A synchronized (thread-safe) wrapper around . - /// - /// - /// is a null reference. - /// Please refer to for details. - - public static AccountCollection Synchronized(AccountCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - return new SyncList(collection); - } - - #endregion - #region ToArray - - /// - /// Copies the elements of the to a new - /// of elements. - /// - /// A one-dimensional of - /// elements containing copies of the elements of the . - /// Please refer to for details. - - public virtual Account[] ToArray() - { - Account[] array = new Account[this._count]; - Array.Copy(this._array, array, this._count); - return array; - } - - #endregion - #region TrimToSize - - /// - /// Sets the capacity to the actual number of elements in the . - /// - /// - /// The is read-only. - /// -or- - /// The AccountCollection has a fixed size. - /// Please refer to for details. - - public virtual void TrimToSize() - { - Capacity = this._count; - } - - #endregion - #region Unique - - /// - /// Returns a wrapper for the specified - /// ensuring that all elements are unique. - /// - /// The to wrap. - /// - /// A wrapper around ensuring that all elements are unique. - /// - /// - /// contains duplicate elements. - /// - /// is a null reference. - /// - /// The Unique wrapper provides a set-like collection by ensuring - /// that all elements in the are unique. - /// - /// Unique raises an if the specified - /// contains any duplicate elements. The returned - /// wrapper raises a whenever the user attempts - /// to add an element that is already contained in the AccountCollection. - /// - /// Note: The Unique wrapper reflects any changes made - /// to the underlying , including the possible - /// creation of duplicate elements. The uniqueness of all elements is therefore - /// no longer assured if the underlying collection is manipulated directly. - /// - - public static AccountCollection Unique(AccountCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - for (int i = collection.Count - 1; i > 0; i--) - if (collection.IndexOf(collection[i]) < i) - throw new ArgumentException("collection", - "Argument cannot contain duplicate elements."); - - return new UniqueList(collection); - } - - #endregion - #endregion - #region Private Methods - #region CheckEnumIndex - - private void CheckEnumIndex(int index) - { - if (index < 0 || index >= this._count) - throw new InvalidOperationException( - "Enumerator is not on a collection element."); - } - - #endregion - #region CheckEnumVersion - - private void CheckEnumVersion(int version) - { - if (version != this._version) - throw new InvalidOperationException( - "Enumerator invalidated by modification to collection."); - } - - #endregion - #region CheckTargetArray - - private void CheckTargetArray(Array array, int arrayIndex) - { - if (array == null) - throw new ArgumentNullException("array"); - if (array.Rank > 1) - throw new ArgumentException( - "Argument cannot be multidimensional.", "array"); - - if (arrayIndex < 0) - throw new ArgumentOutOfRangeException("arrayIndex", - arrayIndex, "Argument cannot be negative."); - if (arrayIndex >= array.Length) - throw new ArgumentException( - "Argument must be less than array length.", "arrayIndex"); - - if (this._count > array.Length - arrayIndex) - throw new ArgumentException( - "Argument section must be large enough for collection.", "array"); - } - - #endregion - #region EnsureCapacity - - private void EnsureCapacity(int minimum) - { - int newCapacity = (this._array.Length == 0 ? - _defaultCapacity : this._array.Length * 2); - - if (newCapacity < minimum) newCapacity = minimum; - Capacity = newCapacity; - } - - #endregion - #region ValidateIndex - - private void ValidateIndex(int index) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (index >= this._count) - throw new ArgumentOutOfRangeException("index", - index, "Argument must be less than Count."); - } - - #endregion - #endregion - #region Class Enumerator - - [Serializable] - private sealed class Enumerator: - IAccountEnumerator, IEnumerator - { - #region Private Fields - - private readonly AccountCollection _collection; - private readonly int _version; - private int _index; - - #endregion - #region Internal Constructors - - internal Enumerator(AccountCollection collection) - { - this._collection = collection; - this._version = collection._version; - this._index = -1; - } - - #endregion - #region Public Properties - - public Account Current - { - get - { - this._collection.CheckEnumIndex(this._index); - this._collection.CheckEnumVersion(this._version); - return this._collection[this._index]; - } - } - - object IEnumerator.Current - { - get { return Current; } - } - - #endregion - #region Public Methods - - public bool MoveNext() - { - this._collection.CheckEnumVersion(this._version); - return (++this._index < this._collection.Count); - } - - public void Reset() - { - this._collection.CheckEnumVersion(this._version); - this._index = -1; - } - - #endregion - } - - #endregion - #region Class ReadOnlyList - - [Serializable] - private sealed class ReadOnlyList: AccountCollection - { - #region Private Fields - - private AccountCollection _collection; - - #endregion - #region Internal Constructors - - internal ReadOnlyList(AccountCollection collection): - base(Tag.Default) - { - this._collection = collection; - } - - #endregion - #region Protected Properties - - protected override Account[] InnerArray - { - get { return this._collection.InnerArray; } - } - - #endregion - #region Public Properties - - public override int Capacity - { - get { return this._collection.Capacity; } - set - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); } - } - - public override int Count - { - get { return this._collection.Count; } - } - - public override bool IsFixedSize - { - get { return true; } - } - - public override bool IsReadOnly - { - get { return true; } - } - - public override bool IsSynchronized - { - get { return this._collection.IsSynchronized; } - } - - public override bool IsUnique - { - get { return this._collection.IsUnique; } - } - - public override Account this[int index] - { - get { return this._collection[index]; } - set - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); } - } - - public override object SyncRoot - { - get { return this._collection.SyncRoot; } - } - - #endregion - #region Public Methods - - public override int Add(Account value) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void AddRange(AccountCollection collection) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void AddRange(Account[] array) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override int BinarySearch(Account value) - { - return this._collection.BinarySearch(value); - } - - public override void Clear() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override object Clone() - { - return new ReadOnlyList((AccountCollection) this._collection.Clone()); - } - - public override void CopyTo(Account[] array) - { - this._collection.CopyTo(array); - } - - public override void CopyTo(Account[] array, int arrayIndex) - { - this._collection.CopyTo(array, arrayIndex); - } - - public override IAccountEnumerator GetEnumerator() - { - return this._collection.GetEnumerator(); - } - - public override int IndexOf(Account value) - { - return this._collection.IndexOf(value); - } - - public override void Insert(int index, Account value) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Remove(Account value) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void RemoveAt(int index) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void RemoveRange(int index, int count) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Reverse() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Reverse(int index, int count) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Sort() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Sort(IComparer comparer) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Sort(int index, int count, IComparer comparer) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override Account[] ToArray() - { - return this._collection.ToArray(); - } - - public override void TrimToSize() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - #endregion - } - - #endregion - #region Class SyncList - - [Serializable] - private sealed class SyncList: AccountCollection - { - #region Private Fields - - private AccountCollection _collection; - private object _root; - - #endregion - #region Internal Constructors - - internal SyncList(AccountCollection collection): - base(Tag.Default) - { - - this._root = collection.SyncRoot; - this._collection = collection; - } - - #endregion - #region Protected Properties - - protected override Account[] InnerArray - { - get { lock (this._root) return this._collection.InnerArray; } - } - - #endregion - #region Public Properties - - public override int Capacity - { - get { lock (this._root) return this._collection.Capacity; } - set { lock (this._root) this._collection.Capacity = value; } - } - - public override int Count - { - get { lock (this._root) return this._collection.Count; } - } - - public override bool IsFixedSize - { - get { return this._collection.IsFixedSize; } - } - - public override bool IsReadOnly - { - get { return this._collection.IsReadOnly; } - } - - public override bool IsSynchronized - { - get { return true; } - } - - public override bool IsUnique - { - get { return this._collection.IsUnique; } - } - - public override Account this[int index] - { - get { lock (this._root) return this._collection[index]; } - set { lock (this._root) this._collection[index] = value; } - } - - public override object SyncRoot - { - get { return this._root; } - } - - #endregion - #region Public Methods - - public override int Add(Account value) - { - lock (this._root) return this._collection.Add(value); - } - - public override void AddRange(AccountCollection collection) - { - lock (this._root) this._collection.AddRange(collection); - } - - public override void AddRange(Account[] array) - { - lock (this._root) this._collection.AddRange(array); - } - - public override int BinarySearch(Account value) - { - lock (this._root) return this._collection.BinarySearch(value); - } - - public override void Clear() - { - lock (this._root) this._collection.Clear(); - } - - public override object Clone() - { - lock (this._root) - return new SyncList((AccountCollection) this._collection.Clone()); - } - - public override void CopyTo(Account[] array) - { - lock (this._root) this._collection.CopyTo(array); - } - - public override void CopyTo(Account[] array, int arrayIndex) - { - lock (this._root) this._collection.CopyTo(array, arrayIndex); - } - - public override IAccountEnumerator GetEnumerator() - { - lock (this._root) return this._collection.GetEnumerator(); - } - - public override int IndexOf(Account value) - { - lock (this._root) return this._collection.IndexOf(value); - } - - public override void Insert(int index, Account value) - { - lock (this._root) this._collection.Insert(index, value); - } - - public override void Remove(Account value) - { - lock (this._root) this._collection.Remove(value); - } - - public override void RemoveAt(int index) - { - lock (this._root) this._collection.RemoveAt(index); - } - - public override void RemoveRange(int index, int count) - { - lock (this._root) this._collection.RemoveRange(index, count); - } - - public override void Reverse() - { - lock (this._root) this._collection.Reverse(); - } - - public override void Reverse(int index, int count) - { - lock (this._root) this._collection.Reverse(index, count); - } - - public override void Sort() - { - lock (this._root) this._collection.Sort(); - } - - public override void Sort(IComparer comparer) - { - lock (this._root) this._collection.Sort(comparer); - } - - public override void Sort(int index, int count, IComparer comparer) - { - lock (this._root) this._collection.Sort(index, count, comparer); - } - - public override Account[] ToArray() - { - lock (this._root) return this._collection.ToArray(); - } - - public override void TrimToSize() - { - lock (this._root) this._collection.TrimToSize(); - } - - #endregion - } - - #endregion - #region Class UniqueList - - [Serializable] - private sealed class UniqueList: AccountCollection - { - #region Private Fields - - private AccountCollection _collection; - - #endregion - #region Internal Constructors - - internal UniqueList(AccountCollection collection): - base(Tag.Default) - { - this._collection = collection; - } - - #endregion - #region Protected Properties - - protected override Account[] InnerArray - { - get { return this._collection.InnerArray; } - } - - #endregion - #region Public Properties - - public override int Capacity - { - get { return this._collection.Capacity; } - set { this._collection.Capacity = value; } - } - - public override int Count - { - get { return this._collection.Count; } - } - - public override bool IsFixedSize - { - get { return this._collection.IsFixedSize; } - } - - public override bool IsReadOnly - { - get { return this._collection.IsReadOnly; } - } - - public override bool IsSynchronized - { - get { return this._collection.IsSynchronized; } - } - - public override bool IsUnique - { - get { return true; } - } - - public override Account this[int index] - { - get { return this._collection[index]; } - set - { - CheckUnique(index, value); - this._collection[index] = value; - } - } - - public override object SyncRoot - { - get { return this._collection.SyncRoot; } - } - - #endregion - #region Public Methods - - public override int Add(Account value) - { - CheckUnique(value); - return this._collection.Add(value); - } - - public override void AddRange(AccountCollection collection) - { - foreach (Account value in collection) - CheckUnique(value); - - this._collection.AddRange(collection); - } - - public override void AddRange(Account[] array) - { - foreach (Account value in array) - CheckUnique(value); - - this._collection.AddRange(array); - } - - public override int BinarySearch(Account value) - { - return this._collection.BinarySearch(value); - } - - public override void Clear() - { - this._collection.Clear(); - } - - public override object Clone() - { - return new UniqueList((AccountCollection) this._collection.Clone()); - } - - public override void CopyTo(Account[] array) - { - this._collection.CopyTo(array); - } - - public override void CopyTo(Account[] array, int arrayIndex) - { - this._collection.CopyTo(array, arrayIndex); - } - - public override IAccountEnumerator GetEnumerator() - { - return this._collection.GetEnumerator(); - } - - public override int IndexOf(Account value) - { - return this._collection.IndexOf(value); - } - - public override void Insert(int index, Account value) - { - CheckUnique(value); - this._collection.Insert(index, value); - } - - public override void Remove(Account value) - { - this._collection.Remove(value); - } - - public override void RemoveAt(int index) - { - this._collection.RemoveAt(index); - } - - public override void RemoveRange(int index, int count) - { - this._collection.RemoveRange(index, count); - } - - public override void Reverse() - { - this._collection.Reverse(); - } - - public override void Reverse(int index, int count) - { - this._collection.Reverse(index, count); - } - - public override void Sort() - { - this._collection.Sort(); - } - - public override void Sort(IComparer comparer) - { - this._collection.Sort(comparer); - } - - public override void Sort(int index, int count, IComparer comparer) - { - this._collection.Sort(index, count, comparer); - } - - public override Account[] ToArray() - { - return this._collection.ToArray(); - } - - public override void TrimToSize() - { - this._collection.TrimToSize(); - } - - #endregion - #region Private Methods - - private void CheckUnique(Account value) - { - if (IndexOf(value) >= 0) - throw new NotSupportedException( - "Unique collections cannot contain duplicate elements."); - } - - private void CheckUnique(int index, Account value) - { - int existing = IndexOf(value); - if (existing >= 0 && existing != index) - throw new NotSupportedException( - "Unique collections cannot contain duplicate elements."); - } - - #endregion - } - - #endregion - } - - #endregion -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/Category.cs b/src/IBatisNet.DataAccess.Test/Domain/Category.cs deleted file mode 100644 index 9af9bd6..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/Category.cs +++ /dev/null @@ -1,73 +0,0 @@ -using System; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Summary description for Category. - /// - public class Category - { - private int _id; - private string _name; - private Guid _guid; - - public Guid EmptyGuid - { - get - { - return Guid.Empty; - } - } - - public Guid Guid - { - get - { - return _guid; - } - set - { - _guid = value; - } - } - - public string GuidString { - get { - return _guid.ToString(); - } - set { - if (value == null) { - _guid = Guid.Empty; - } - else { - _guid = new Guid(value.ToString()); - } - } - } - - public int Id - { - get - { - return _id; - } - set - { - _id = value; - } - } - - public string Name - { - get - { - return _name; - } - set - { - _name = value; - } - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/Complex.cs b/src/IBatisNet.DataAccess.Test/Domain/Complex.cs deleted file mode 100644 index 760b488..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/Complex.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System; -using System.Collections; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Description rsume de Complex. - /// - public class Complex - { - private Hashtable _map = null; - - public Hashtable Map - { - get - { - return _map; - } - set - { - _map = value; - } - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/Enumeration.cs b/src/IBatisNet.DataAccess.Test/Domain/Enumeration.cs deleted file mode 100644 index de6945a..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/Enumeration.cs +++ /dev/null @@ -1,102 +0,0 @@ -using System; - -namespace IBatisNet.DataAccess.Test.Domain -{ - public enum Days - { - Sat=1, - Sun, - Mon, - Tue, - Wed, - Thu, - Fri - }; - - [FlagsAttribute] - public enum Colors - { - Red = 1, - Green = 2, - Blue = 4, - Yellow = 8 - }; - - [Flags()] - public enum Months : long - { - January = 1, - February =2, - March =4, - April =8, - May =16, - June =32, - July =64, - August =128, - September =256, - October =512, - November =1024, - December =2048, - All = January|February|March|April|May|June|July|August|September|October|November|December - } - - /// - /// Summary description for EnumTest. - /// - public class Enumeration - { - private Days _day; - private Months _month; - private Colors _color; - private int _id; - - public Months Month - { - get - { - return _month; - } - set - { - _month = value; - } - } - - public int Id - { - get - { - return _id; - } - set - { - _id = value; - } - } - - public Days Day - { - get - { - return _day; - } - set - { - _day = value; - } - } - - public Colors Color - { - get - { - return _color; - } - set - { - _color = value; - } - } - } - -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/LineItem.cs b/src/IBatisNet.DataAccess.Test/Domain/LineItem.cs deleted file mode 100644 index 803a3e7..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/LineItem.cs +++ /dev/null @@ -1,116 +0,0 @@ -using System; -using System.Drawing; -using System.Drawing.Imaging; -using System.IO; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Description rsume de LineItem. - /// - public class LineItem - { - private int _id; - private Order _order; - private string _code; - private int _quantity; - private decimal _price; - private byte[] _pictureData = null; - - public int Id - { - get - { - return _id; - } - set - { - _id = value; - } - } - - public Order Order - { - get - { - return _order; - } - set - { - _order = value; - } - } - - public string Code - { - get - { - return _code; - } - set - { - _code = value; - } - } - - public int Quantity - { - get - { - return _quantity; - } - set - { - _quantity = value; - } - } - - public decimal Price - { - get - { - return _price; - } - set - { - _price = value; - } - } - public byte[] PictureData - { - get{ return _pictureData; } - set{ _pictureData = value; } - } - public Image Picture - { - set - { - _pictureData = LineItem.ConvertToByteArray( value ); - } - get - { - return LineItem.ConvertToImage( _pictureData ); - } - } - - #region Image converters - static protected byte[] ConvertToByteArray( Image picture ) - { - MemoryStream memoryStream = new MemoryStream(); - picture.Save( memoryStream, ImageFormat.Jpeg ); - return memoryStream.ToArray (); - } - static protected Image ConvertToImage( byte[] pictureData ) - { - if (pictureData != null) - { - return Image.FromStream( new MemoryStream( pictureData ) ); - } - else - { - return null; - } - } - #endregion - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/LineItemCollection.cs b/src/IBatisNet.DataAccess.Test/Domain/LineItemCollection.cs deleted file mode 100644 index 8888bbd..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/LineItemCollection.cs +++ /dev/null @@ -1,2171 +0,0 @@ - -using System; -using System.Collections; - -namespace IBatisNet.DataAccess.Test.Domain -{ - #region Interface ILineItemCollection - - /// - /// Defines size, enumerators, and synchronization methods for strongly - /// typed collections of elements. - /// - /// - /// ILineItemCollection provides an - /// that is strongly typed for elements. - /// - - public interface ILineItemCollection - { - #region Properties - #region Count - - /// - /// Gets the number of elements contained in the - /// . - /// - /// The number of elements contained in the - /// . - /// Please refer to for details. - - int Count { get; } - - #endregion - #region IsSynchronized - - /// - /// Gets a value indicating whether access to the - /// is synchronized (thread-safe). - /// - /// true if access to the is - /// synchronized (thread-safe); otherwise, false. The default is false. - /// Please refer to for details. - - bool IsSynchronized { get; } - - #endregion - #region SyncRoot - - /// - /// Gets an object that can be used to synchronize access - /// to the . - /// - /// An object that can be used to synchronize access - /// to the . - /// Please refer to for details. - - object SyncRoot { get; } - - #endregion - #endregion - #region Methods - #region CopyTo - - /// - /// Copies the entire to a one-dimensional - /// of elements, starting at the specified index of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// The zero-based index in - /// at which copying begins. - /// - /// is a null reference. - /// - /// is less than zero. - /// - /// is equal to or greater than the length of . - /// -or- - /// The number of elements in the source is greater - /// than the available space from to the end of the destination - /// . - /// Please refer to for details. - - void CopyTo(LineItem[] array, int arrayIndex); - - #endregion - #region GetEnumerator - - /// - /// Returns an that can - /// iterate through the . - /// - /// An - /// for the entire . - /// Please refer to for details. - - ILineItemEnumerator GetEnumerator(); - - #endregion - #endregion - } - - #endregion - #region Interface ILineItemList - - /// - /// Represents a strongly typed collection of - /// objects that can be individually accessed by index. - /// - /// - /// ILineItemList provides an - /// that is strongly typed for elements. - /// - - public interface - ILineItemList: ILineItemCollection,IList - { - - } - - #endregion - #region Interface ILineItemEnumerator - - /// - /// Supports type-safe iteration over a collection that - /// contains elements. - /// - /// - /// ILineItemEnumerator provides an - /// that is strongly typed for elements. - /// - - public interface ILineItemEnumerator - { - #region Properties - #region Current - - /// - /// Gets the current element in the collection. - /// - /// The current element in the collection. - /// The enumerator is positioned - /// before the first element of the collection or after the last element. - /// -or- - /// The collection was modified after the enumerator was created. - /// Please refer to for details, but note - /// that Current fails if the collection was modified since the last successful - /// call to or . - - LineItem Current { get; } - - #endregion - #endregion - #region Methods - #region MoveNext - - /// - /// Advances the enumerator to the next element of the collection. - /// - /// true if the enumerator was successfully advanced to the next element; - /// false if the enumerator has passed the end of the collection. - /// - /// The collection was modified after the enumerator was created. - /// Please refer to for details. - - bool MoveNext(); - - #endregion - #region Reset - - /// - /// Sets the enumerator to its initial position, - /// which is before the first element in the collection. - /// - /// - /// The collection was modified after the enumerator was created. - /// Please refer to for details. - - void Reset(); - - #endregion - #endregion - } - - #endregion - #region Class LineItemCollection - - /// - /// Implements a strongly typed collection of elements. - /// - /// - /// LineItemCollection provides an - /// that is strongly typed for elements. - /// - - [Serializable] - public class LineItemCollection: - ILineItemList, IList, ICloneable - { - #region Private Fields - - private const int _defaultCapacity = 16; - - private LineItem[] _array = null; - private int _count = 0; - - [NonSerialized] - private int _version = 0; - - #endregion - #region Private Constructors - - // helper type to identify private ctor - private enum Tag { Default } - - private LineItemCollection(Tag tag) { } - - #endregion - #region Public Constructors - #region LineItemCollection() - - /// - /// Initializes a new instance of the class. - /// - /// - /// Initializes a new instance of the class - /// that is empty and has the default initial capacity. - /// - /// Please refer to for details. - - public LineItemCollection() - { - this._array = new LineItem[_defaultCapacity]; - } - - #endregion - #region LineItemCollection(Int32) - - /// - /// Initializes a new instance of the class - /// that is empty and has the specified initial capacity. - /// - /// The number of elements that the new - /// is initially capable of storing. - /// - /// is less than zero. - /// Please refer to for details. - - public LineItemCollection(int capacity) - { - if (capacity < 0) - throw new ArgumentOutOfRangeException("capacity", - capacity, "Argument cannot be negative."); - - this._array = new LineItem[capacity]; - } - - #endregion - #region LineItemCollection(LineItemCollection) - - /// - /// Initializes a new instance of the class - /// that contains elements copied from the specified collection and - /// that has the same initial capacity as the number of elements copied. - /// - /// The - /// whose elements are copied to the new collection. - /// - /// is a null reference. - /// Please refer to for details. - - public LineItemCollection(LineItemCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - this._array = new LineItem[collection.Count]; - AddRange(collection); - } - - #endregion - #region LineItemCollection(LineItem[]) - - /// - /// Initializes a new instance of the class - /// that contains elements copied from the specified - /// array and that has the same initial capacity as the number of elements copied. - /// - /// An of - /// elements that are copied to the new collection. - /// - /// is a null reference. - /// Please refer to for details. - - public LineItemCollection(LineItem[] array) - { - if (array == null) - throw new ArgumentNullException("array"); - - this._array = new LineItem[array.Length]; - AddRange(array); - } - - #endregion - #endregion - #region Protected Properties - #region InnerArray - - /// - /// Gets the list of elements contained in the instance. - /// - /// - /// A one-dimensional with zero-based indexing that contains all - /// elements in the . - /// - /// - /// Use InnerArray to access the element array of a - /// instance that might be a read-only or synchronized wrapper. This is necessary because - /// the element array field of wrapper classes is always a null reference. - /// - - protected virtual LineItem[] InnerArray - { - get { return this._array; } - } - - #endregion - #endregion - #region Public Properties - #region Capacity - - /// - /// Gets or sets the capacity of the . - /// - /// The number of elements that the - /// can contain. - /// - /// Capacity is set to a value that is less than . - /// Please refer to for details. - - public virtual int Capacity - { - get { return this._array.Length; } - set - { - if (value == this._array.Length) return; - - if (value < this._count) - throw new ArgumentOutOfRangeException("Capacity", - value, "Value cannot be less than Count."); - - if (value == 0) - { - this._array = new LineItem[_defaultCapacity]; - return; - } - - LineItem[] newArray = new LineItem[value]; - Array.Copy(this._array, newArray, this._count); - this._array = newArray; - } - } - - #endregion - #region Count - - /// - /// Gets the number of elements contained in the . - /// - /// - /// The number of elements contained in the . - /// - /// Please refer to for details. - - public virtual int Count - { - get { return this._count; } - } - - #endregion - #region IsFixedSize - - /// - /// Gets a value indicating whether the has a fixed size. - /// - /// true if the has a fixed size; - /// otherwise, false. The default is false. - /// Please refer to for details. - - public virtual bool IsFixedSize - { - get { return false; } - } - - #endregion - #region IsReadOnly - - /// - /// Gets a value indicating whether the is read-only. - /// - /// true if the is read-only; - /// otherwise, false. The default is false. - /// Please refer to for details. - - public virtual bool IsReadOnly - { - get { return false; } - } - - #endregion - #region IsSynchronized - - /// - /// Gets a value indicating whether access to the - /// is synchronized (thread-safe). - /// - /// true if access to the is - /// synchronized (thread-safe); otherwise, false. The default is false. - /// Please refer to for details. - - public virtual bool IsSynchronized - { - get { return false; } - } - - #endregion - #region IsUnique - - /// - /// Gets a value indicating whether the - /// ensures that all elements are unique. - /// - /// - /// true if the ensures that all - /// elements are unique; otherwise, false. The default is false. - /// - /// - /// IsUnique returns true exactly if the - /// is exposed through a wrapper. - /// Please refer to for details. - /// - - public virtual bool IsUnique - { - get { return false; } - } - - #endregion - #region Item: LineItem - - /// - /// Gets or sets the element at the specified index. - /// - /// The zero-based index of the - /// element to get or set. - /// - /// The element at the specified . - /// - /// - /// is less than zero. - /// -or- - /// is equal to or greater than . - /// - /// - /// The property is set and the is read-only. - /// -or- - /// The property is set, the LineItemCollection already contains the - /// specified element at a different index, and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual LineItem this[int index] - { - get - { - ValidateIndex(index); - return this._array[index]; - } - set - { - ValidateIndex(index); - ++this._version; - this._array[index] = value; - } - } - - #endregion - #region IList.Item: Object - - /// - /// Gets or sets the element at the specified index. - /// - /// The zero-based index of the element to get or set. - /// - /// The element at the specified . When the property - /// is set, this value must be compatible with . - /// - /// - /// is less than zero. - /// -or- - /// is equal to or greater than . - /// - /// The property is set to a value - /// that is not compatible with . - /// - /// The property is set and the is read-only. - /// -or- - /// The property is set, the LineItemCollection already contains the - /// specified element at a different index, and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - object IList.this[int index] - { - get { return this[index]; } - set { this[index] = (LineItem) value; } - } - - #endregion - #region SyncRoot - - /// - /// Gets an object that can be used to synchronize - /// access to the . - /// - /// An object that can be used to synchronize - /// access to the . - /// - /// Please refer to for details. - - public virtual object SyncRoot - { - get { return this; } - } - - #endregion - #endregion - #region Public Methods - #region Add(LineItem) - - /// - /// Adds a to the end of the . - /// - /// The object - /// to be added to the end of the . - /// This argument can be a null reference. - /// - /// The index at which the - /// has been added. - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// -or- - /// The LineItemCollection already contains the specified - /// , and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual int Add(LineItem value) - { - if (this._count == this._array.Length) - EnsureCapacity(this._count + 1); - - ++this._version; - this._array[this._count] = value; - return this._count++; - } - - #endregion - #region IList.Add(Object) - - /// - /// Adds an to the end of the . - /// - /// - /// The object to be added to the end of the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// The index at which the - /// has been added. - /// - /// is not compatible with . - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// -or- - /// The LineItemCollection already contains the specified - /// , and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - int IList.Add(object value) - { - return Add((LineItem) value); - } - - #endregion - #region AddRange(LineItemCollection) - - /// - /// Adds a range of elements to the end of the . - /// - /// - /// Adds the elements of another collection to the end of the . - /// - /// The whose elements - /// should be added to the end of the current collection. - /// - /// is a null reference. - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// -or- - /// The LineItemCollection already contains one or more elements - /// in the specified , and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual void AddRange(LineItemCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - if (collection.Count == 0) return; - if (this._count + collection.Count > this._array.Length) - EnsureCapacity(this._count + collection.Count); - - ++this._version; - Array.Copy(collection.InnerArray, 0, - this._array, this._count, collection.Count); - this._count += collection.Count; - } - - #endregion - #region AddRange(LineItem[]) - - /// - /// Adds the elements of a array - /// to the end of the . - /// - /// An of elements - /// that should be added to the end of the . - /// - /// is a null reference. - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// -or- - /// The LineItemCollection already contains one or more elements - /// in the specified , and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual void AddRange(LineItem[] array) - { - if (array == null) - throw new ArgumentNullException("array"); - - if (array.Length == 0) return; - if (this._count + array.Length > this._array.Length) - EnsureCapacity(this._count + array.Length); - - ++this._version; - Array.Copy(array, 0, this._array, this._count, array.Length); - this._count += array.Length; - } - - #endregion - #region BinarySearch - - /// - /// Searches the entire sorted for an - /// element using the default comparer - /// and returns the zero-based index of the element. - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// The zero-based index of in the sorted - /// , if is found; - /// otherwise, a negative number, which is the bitwise complement of the index - /// of the next element that is larger than or, if there - /// is no larger element, the bitwise complement of . - /// - /// Neither nor the elements of the - /// implement the interface. - /// Please refer to for details. - - public virtual int BinarySearch(LineItem value) - { - return Array.BinarySearch(this._array, 0, this._count, value); - } - - #endregion - #region Clear - - /// - /// Removes all elements from the . - /// - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// Please refer to for details. - - public virtual void Clear() - { - if (this._count == 0) return; - - ++this._version; - Array.Clear(this._array, 0, this._count); - this._count = 0; - } - - #endregion - #region Clone - - /// - /// Creates a shallow copy of the . - /// - /// A shallow copy of the . - /// Please refer to for details. - - public virtual object Clone() - { - LineItemCollection collection = new LineItemCollection(this._count); - - Array.Copy(this._array, 0, collection._array, 0, this._count); - collection._count = this._count; - collection._version = this._version; - - return collection; - } - - #endregion - #region Contains(LineItem) - - /// - /// Determines whether the - /// contains the specified element. - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// true if is found in the - /// ; otherwise, false. - /// Please refer to for details. - - public bool Contains(LineItem value) - { - return (IndexOf(value) >= 0); - } - - #endregion - #region IList.Contains(Object) - - /// - /// Determines whether the contains the specified element. - /// - /// The object to locate in the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// true if is found in the - /// ; otherwise, false. - /// - /// is not compatible with . - /// Please refer to for details. - - bool IList.Contains(object value) - { - return Contains((LineItem) value); - } - - #endregion - #region CopyTo(LineItem[]) - - /// - /// Copies the or a portion of it to a one-dimensional array. - /// - /// - /// Copies the entire to a one-dimensional - /// of elements, starting at the beginning of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// - /// is a null reference. - /// - /// The number of elements in the source is greater - /// than the available space in the destination . - /// Please refer to for details. - - public virtual void CopyTo(LineItem[] array) - { - CheckTargetArray(array, 0); - Array.Copy(this._array, array, this._count); - } - - #endregion - #region CopyTo(LineItem[], Int32) - - /// - /// Copies the entire to a one-dimensional - /// of elements, starting at the specified index of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// The zero-based index in - /// at which copying begins. - /// - /// is a null reference. - /// - /// is less than zero. - /// - /// is equal to or greater than the length of . - /// -or- - /// The number of elements in the source is greater than the - /// available space from to the end of the destination - /// . - /// Please refer to for details. - - public virtual void CopyTo(LineItem[] array, int arrayIndex) - { - CheckTargetArray(array, arrayIndex); - Array.Copy(this._array, 0, array, arrayIndex, this._count); - } - - #endregion - #region ICollection.CopyTo(Array, Int32) - - /// - /// Copies the entire to a one-dimensional , - /// starting at the specified index of the target array. - /// - /// The one-dimensional that is the destination of the - /// elements copied from the . - /// The Array must have zero-based indexing. - /// The zero-based index in - /// at which copying begins. - /// - /// is a null reference. - /// - /// is less than zero. - /// - /// is multidimensional. - /// -or- - /// is equal to or greater than the length of . - /// -or- - /// The number of elements in the source is greater than the - /// available space from to the end of the destination - /// . - /// - /// The type cannot be cast automatically - /// to the type of the destination . - /// Please refer to for details. - - void ICollection.CopyTo(Array array, int arrayIndex) - { - CopyTo((LineItem[]) array, arrayIndex); - } - - #endregion - #region GetEnumerator: ILineItemEnumerator - - /// - /// Returns an that can - /// iterate through the . - /// - /// An - /// for the entire . - /// Please refer to for details. - - public virtual ILineItemEnumerator GetEnumerator() - { - return new Enumerator(this); - } - - #endregion - #region IEnumerable.GetEnumerator: IEnumerator - - /// - /// Returns an that can - /// iterate through the . - /// - /// An - /// for the entire . - /// Please refer to for details. - - IEnumerator IEnumerable.GetEnumerator() - { - return (IEnumerator) GetEnumerator(); - } - - #endregion - #region IndexOf(LineItem) - - /// - /// Returns the zero-based index of the first occurrence of the specified - /// in the . - /// - /// The object - /// to locate in the . - /// This argument can be a null reference. - /// - /// - /// The zero-based index of the first occurrence of - /// in the , if found; otherwise, -1. - /// - /// Please refer to for details. - - public virtual int IndexOf(LineItem value) - { - return Array.IndexOf(this._array, value, 0, this._count); - } - - #endregion - #region IList.IndexOf(Object) - - /// - /// Returns the zero-based index of the first occurrence of the specified - /// in the . - /// - /// The object to locate in the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// - /// The zero-based index of the first occurrence of - /// in the , if found; otherwise, -1. - /// - /// - /// is not compatible with . - /// Please refer to for details. - - int IList.IndexOf(object value) - { - return IndexOf((LineItem) value); - } - - #endregion - #region Insert(Int32, LineItem) - - /// - /// Inserts a element into the - /// at the specified index. - /// - /// The zero-based index at which - /// should be inserted. - /// The object - /// to insert into the . - /// This argument can be a null reference. - /// - /// - /// is less than zero. - /// -or- - /// is greater than . - /// - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// -or- - /// The LineItemCollection already contains the specified - /// , and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - public virtual void Insert(int index, LineItem value) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (index > this._count) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot exceed Count."); - - if (this._count == this._array.Length) - EnsureCapacity(this._count + 1); - - ++this._version; - if (index < this._count) - Array.Copy(this._array, index, - this._array, index + 1, this._count - index); - - this._array[index] = value; - ++this._count; - } - - #endregion - #region IList.Insert(Int32, Object) - - /// - /// Inserts an element into the at the specified index. - /// - /// The zero-based index at which - /// should be inserted. - /// The object to insert into the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// - /// is less than zero. - /// -or- - /// is greater than . - /// - /// - /// is not compatible with . - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// -or- - /// The LineItemCollection already contains the specified - /// , and the LineItemCollection - /// ensures that all elements are unique. - /// Please refer to for details. - - void IList.Insert(int index, object value) - { - Insert(index, (LineItem) value); - } - - #endregion - #region ReadOnly - - /// - /// Returns a read-only wrapper for the specified . - /// - /// The to wrap. - /// A read-only wrapper around . - /// - /// is a null reference. - /// Please refer to for details. - - public static LineItemCollection ReadOnly(LineItemCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - return new ReadOnlyList(collection); - } - - #endregion - #region Remove(LineItem) - - /// - /// Removes the first occurrence of the specified - /// from the . - /// - /// The object - /// to remove from the . - /// This argument can be a null reference. - /// - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// Please refer to for details. - - public virtual void Remove(LineItem value) - { - int index = IndexOf(value); - if (index >= 0) RemoveAt(index); - } - - #endregion - #region IList.Remove(Object) - - /// - /// Removes the first occurrence of the specified - /// from the . - /// - /// The object to remove from the . - /// This argument must be compatible with . - /// This argument can be a null reference. - /// - /// - /// is not compatible with . - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// Please refer to for details. - - void IList.Remove(object value) - { - Remove((LineItem) value); - } - - #endregion - #region RemoveAt - - /// - /// Removes the element at the specified index of the . - /// - /// The zero-based index of the element to remove. - /// - /// is less than zero. - /// -or- - /// is equal to or greater than . - /// - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// Please refer to for details. - - public virtual void RemoveAt(int index) - { - ValidateIndex(index); - - ++this._version; - if (index < --this._count) - Array.Copy(this._array, index + 1, - this._array, index, this._count - index); - - this._array[this._count] = null; - } - - #endregion - #region RemoveRange - - /// - /// Removes the specified range of elements from the . - /// - /// The zero-based starting index of the range - /// of elements to remove. - /// The number of elements to remove. - /// - /// and do not denote a - /// valid range of elements in the . - /// - /// is less than zero. - /// -or- - /// is less than zero. - /// - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// Please refer to for details. - - public virtual void RemoveRange(int index, int count) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (count < 0) - throw new ArgumentOutOfRangeException("count", - count, "Argument cannot be negative."); - - if (index + count > this._count) - throw new ArgumentException( - "Arguments denote invalid range of elements."); - - if (count == 0) return; - - ++this._version; - this._count -= count; - - if (index < this._count) - Array.Copy(this._array, index + count, - this._array, index, this._count - index); - - Array.Clear(this._array, this._count, count); - } - - #endregion - #region Reverse() - - /// - /// Reverses the order of the elements in the - /// or a portion of it. - /// - /// - /// Reverses the order of the elements in the entire . - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Reverse() - { - if (this._count <= 1) return; - ++this._version; - Array.Reverse(this._array, 0, this._count); - } - - #endregion - #region Reverse(Int32, Int32) - - /// - /// Reverses the order of the elements in the specified range. - /// - /// The zero-based starting index of the range - /// of elements to reverse. - /// The number of elements to reverse. - /// - /// and do not denote a - /// valid range of elements in the . - /// - /// is less than zero. - /// -or- - /// is less than zero. - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Reverse(int index, int count) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (count < 0) - throw new ArgumentOutOfRangeException("count", - count, "Argument cannot be negative."); - - if (index + count > this._count) - throw new ArgumentException( - "Arguments denote invalid range of elements."); - - if (count <= 1 || this._count <= 1) return; - ++this._version; - Array.Reverse(this._array, index, count); - } - - #endregion - #region Sort() - - /// - /// Sorts the elements in the or a portion of it. - /// - /// - /// Sorts the elements in the entire - /// using the implementation of each element. - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Sort() - { - if (this._count <= 1) return; - ++this._version; - Array.Sort(this._array, 0, this._count); - } - - #endregion - #region Sort(IComparer) - - /// - /// Sorts the elements in the entire - /// using the specified interface. - /// - /// - /// The implementation to use when comparing elements. - /// -or- - /// A null reference to use the implementation - /// of each element. - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Sort(IComparer comparer) - { - if (this._count <= 1) return; - ++this._version; - Array.Sort(this._array, 0, this._count, comparer); - } - - #endregion - #region Sort(Int32, Int32, IComparer) - - /// - /// Sorts the elements in the specified range - /// using the specified interface. - /// - /// The zero-based starting index of the range - /// of elements to sort. - /// The number of elements to sort. - /// - /// The implementation to use when comparing elements. - /// -or- - /// A null reference to use the implementation - /// of each element. - /// - /// and do not denote a - /// valid range of elements in the . - /// - /// is less than zero. - /// -or- - /// is less than zero. - /// - /// - /// The is read-only. - /// Please refer to for details. - - public virtual void Sort(int index, int count, IComparer comparer) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (count < 0) - throw new ArgumentOutOfRangeException("count", - count, "Argument cannot be negative."); - - if (index + count > this._count) - throw new ArgumentException( - "Arguments denote invalid range of elements."); - - if (count <= 1 || this._count <= 1) return; - ++this._version; - Array.Sort(this._array, index, count, comparer); - } - - #endregion - #region Synchronized - - /// - /// Returns a synchronized (thread-safe) wrapper - /// for the specified . - /// - /// The to synchronize. - /// - /// A synchronized (thread-safe) wrapper around . - /// - /// - /// is a null reference. - /// Please refer to for details. - - public static LineItemCollection Synchronized(LineItemCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - return new SyncList(collection); - } - - #endregion - #region ToArray - - /// - /// Copies the elements of the to a new - /// of elements. - /// - /// A one-dimensional of - /// elements containing copies of the elements of the . - /// Please refer to for details. - - public virtual LineItem[] ToArray() - { - LineItem[] array = new LineItem[this._count]; - Array.Copy(this._array, array, this._count); - return array; - } - - #endregion - #region TrimToSize - - /// - /// Sets the capacity to the actual number of elements in the . - /// - /// - /// The is read-only. - /// -or- - /// The LineItemCollection has a fixed size. - /// Please refer to for details. - - public virtual void TrimToSize() - { - Capacity = this._count; - } - - #endregion - #region Unique - - /// - /// Returns a wrapper for the specified - /// ensuring that all elements are unique. - /// - /// The to wrap. - /// - /// A wrapper around ensuring that all elements are unique. - /// - /// - /// contains duplicate elements. - /// - /// is a null reference. - /// - /// The Unique wrapper provides a set-like collection by ensuring - /// that all elements in the are unique. - /// - /// Unique raises an if the specified - /// contains any duplicate elements. The returned - /// wrapper raises a whenever the user attempts - /// to add an element that is already contained in the LineItemCollection. - /// - /// Note: The Unique wrapper reflects any changes made - /// to the underlying , including the possible - /// creation of duplicate elements. The uniqueness of all elements is therefore - /// no longer assured if the underlying collection is manipulated directly. - /// - - public static LineItemCollection Unique(LineItemCollection collection) - { - if (collection == null) - throw new ArgumentNullException("collection"); - - for (int i = collection.Count - 1; i > 0; i--) - if (collection.IndexOf(collection[i]) < i) - throw new ArgumentException("collection", - "Argument cannot contain duplicate elements."); - - return new UniqueList(collection); - } - - #endregion - #endregion - #region Private Methods - #region CheckEnumIndex - - private void CheckEnumIndex(int index) - { - if (index < 0 || index >= this._count) - throw new InvalidOperationException( - "Enumerator is not on a collection element."); - } - - #endregion - #region CheckEnumVersion - - private void CheckEnumVersion(int version) - { - if (version != this._version) - throw new InvalidOperationException( - "Enumerator invalidated by modification to collection."); - } - - #endregion - #region CheckTargetArray - - private void CheckTargetArray(Array array, int arrayIndex) - { - if (array == null) - throw new ArgumentNullException("array"); - if (array.Rank > 1) - throw new ArgumentException( - "Argument cannot be multidimensional.", "array"); - - if (arrayIndex < 0) - throw new ArgumentOutOfRangeException("arrayIndex", - arrayIndex, "Argument cannot be negative."); - if (arrayIndex >= array.Length) - throw new ArgumentException( - "Argument must be less than array length.", "arrayIndex"); - - if (this._count > array.Length - arrayIndex) - throw new ArgumentException( - "Argument section must be large enough for collection.", "array"); - } - - #endregion - #region EnsureCapacity - - private void EnsureCapacity(int minimum) - { - int newCapacity = (this._array.Length == 0 ? - _defaultCapacity : this._array.Length * 2); - - if (newCapacity < minimum) newCapacity = minimum; - Capacity = newCapacity; - } - - #endregion - #region ValidateIndex - - private void ValidateIndex(int index) - { - if (index < 0) - throw new ArgumentOutOfRangeException("index", - index, "Argument cannot be negative."); - - if (index >= this._count) - throw new ArgumentOutOfRangeException("index", - index, "Argument must be less than Count."); - } - - #endregion - #endregion - #region Class Enumerator - - [Serializable] - private sealed class Enumerator: - ILineItemEnumerator, IEnumerator - { - #region Private Fields - - private readonly LineItemCollection _collection; - private readonly int _version; - private int _index; - - #endregion - #region Internal Constructors - - internal Enumerator(LineItemCollection collection) - { - this._collection = collection; - this._version = collection._version; - this._index = -1; - } - - #endregion - #region Public Properties - - public LineItem Current - { - get - { - this._collection.CheckEnumIndex(this._index); - this._collection.CheckEnumVersion(this._version); - return this._collection[this._index]; - } - } - - object IEnumerator.Current - { - get { return Current; } - } - - #endregion - #region Public Methods - - public bool MoveNext() - { - this._collection.CheckEnumVersion(this._version); - return (++this._index < this._collection.Count); - } - - public void Reset() - { - this._collection.CheckEnumVersion(this._version); - this._index = -1; - } - - #endregion - } - - #endregion - #region Class ReadOnlyList - - [Serializable] - private sealed class ReadOnlyList: LineItemCollection - { - #region Private Fields - - private LineItemCollection _collection; - - #endregion - #region Internal Constructors - - internal ReadOnlyList(LineItemCollection collection): - base(Tag.Default) - { - this._collection = collection; - } - - #endregion - #region Protected Properties - - protected override LineItem[] InnerArray - { - get { return this._collection.InnerArray; } - } - - #endregion - #region Public Properties - - public override int Capacity - { - get { return this._collection.Capacity; } - set - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); } - } - - public override int Count - { - get { return this._collection.Count; } - } - - public override bool IsFixedSize - { - get { return true; } - } - - public override bool IsReadOnly - { - get { return true; } - } - - public override bool IsSynchronized - { - get { return this._collection.IsSynchronized; } - } - - public override bool IsUnique - { - get { return this._collection.IsUnique; } - } - - public override LineItem this[int index] - { - get { return this._collection[index]; } - set - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); } - } - - public override object SyncRoot - { - get { return this._collection.SyncRoot; } - } - - #endregion - #region Public Methods - - public override int Add(LineItem value) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void AddRange(LineItemCollection collection) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void AddRange(LineItem[] array) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override int BinarySearch(LineItem value) - { - return this._collection.BinarySearch(value); - } - - public override void Clear() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override object Clone() - { - return new ReadOnlyList((LineItemCollection) this._collection.Clone()); - } - - public override void CopyTo(LineItem[] array) - { - this._collection.CopyTo(array); - } - - public override void CopyTo(LineItem[] array, int arrayIndex) - { - this._collection.CopyTo(array, arrayIndex); - } - - public override ILineItemEnumerator GetEnumerator() - { - return this._collection.GetEnumerator(); - } - - public override int IndexOf(LineItem value) - { - return this._collection.IndexOf(value); - } - - public override void Insert(int index, LineItem value) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Remove(LineItem value) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void RemoveAt(int index) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void RemoveRange(int index, int count) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Reverse() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Reverse(int index, int count) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Sort() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Sort(IComparer comparer) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override void Sort(int index, int count, IComparer comparer) - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - public override LineItem[] ToArray() - { - return this._collection.ToArray(); - } - - public override void TrimToSize() - { - throw new NotSupportedException( - "Read-only collections cannot be modified."); - } - - #endregion - } - - #endregion - #region Class SyncList - - [Serializable] - private sealed class SyncList: LineItemCollection - { - #region Private Fields - - private LineItemCollection _collection; - private object _root; - - #endregion - #region Internal Constructors - - internal SyncList(LineItemCollection collection): - base(Tag.Default) - { - - this._root = collection.SyncRoot; - this._collection = collection; - } - - #endregion - #region Protected Properties - - protected override LineItem[] InnerArray - { - get { lock (this._root) return this._collection.InnerArray; } - } - - #endregion - #region Public Properties - - public override int Capacity - { - get { lock (this._root) return this._collection.Capacity; } - set { lock (this._root) this._collection.Capacity = value; } - } - - public override int Count - { - get { lock (this._root) return this._collection.Count; } - } - - public override bool IsFixedSize - { - get { return this._collection.IsFixedSize; } - } - - public override bool IsReadOnly - { - get { return this._collection.IsReadOnly; } - } - - public override bool IsSynchronized - { - get { return true; } - } - - public override bool IsUnique - { - get { return this._collection.IsUnique; } - } - - public override LineItem this[int index] - { - get { lock (this._root) return this._collection[index]; } - set { lock (this._root) this._collection[index] = value; } - } - - public override object SyncRoot - { - get { return this._root; } - } - - #endregion - #region Public Methods - - public override int Add(LineItem value) - { - lock (this._root) return this._collection.Add(value); - } - - public override void AddRange(LineItemCollection collection) - { - lock (this._root) this._collection.AddRange(collection); - } - - public override void AddRange(LineItem[] array) - { - lock (this._root) this._collection.AddRange(array); - } - - public override int BinarySearch(LineItem value) - { - lock (this._root) return this._collection.BinarySearch(value); - } - - public override void Clear() - { - lock (this._root) this._collection.Clear(); - } - - public override object Clone() - { - lock (this._root) - return new SyncList((LineItemCollection) this._collection.Clone()); - } - - public override void CopyTo(LineItem[] array) - { - lock (this._root) this._collection.CopyTo(array); - } - - public override void CopyTo(LineItem[] array, int arrayIndex) - { - lock (this._root) this._collection.CopyTo(array, arrayIndex); - } - - public override ILineItemEnumerator GetEnumerator() - { - lock (this._root) return this._collection.GetEnumerator(); - } - - public override int IndexOf(LineItem value) - { - lock (this._root) return this._collection.IndexOf(value); - } - - public override void Insert(int index, LineItem value) - { - lock (this._root) this._collection.Insert(index, value); - } - - public override void Remove(LineItem value) - { - lock (this._root) this._collection.Remove(value); - } - - public override void RemoveAt(int index) - { - lock (this._root) this._collection.RemoveAt(index); - } - - public override void RemoveRange(int index, int count) - { - lock (this._root) this._collection.RemoveRange(index, count); - } - - public override void Reverse() - { - lock (this._root) this._collection.Reverse(); - } - - public override void Reverse(int index, int count) - { - lock (this._root) this._collection.Reverse(index, count); - } - - public override void Sort() - { - lock (this._root) this._collection.Sort(); - } - - public override void Sort(IComparer comparer) - { - lock (this._root) this._collection.Sort(comparer); - } - - public override void Sort(int index, int count, IComparer comparer) - { - lock (this._root) this._collection.Sort(index, count, comparer); - } - - public override LineItem[] ToArray() - { - lock (this._root) return this._collection.ToArray(); - } - - public override void TrimToSize() - { - lock (this._root) this._collection.TrimToSize(); - } - - #endregion - } - - #endregion - #region Class UniqueList - - [Serializable] - private sealed class UniqueList: LineItemCollection - { - #region Private Fields - - private LineItemCollection _collection; - - #endregion - #region Internal Constructors - - internal UniqueList(LineItemCollection collection): - base(Tag.Default) - { - this._collection = collection; - } - - #endregion - #region Protected Properties - - protected override LineItem[] InnerArray - { - get { return this._collection.InnerArray; } - } - - #endregion - #region Public Properties - - public override int Capacity - { - get { return this._collection.Capacity; } - set { this._collection.Capacity = value; } - } - - public override int Count - { - get { return this._collection.Count; } - } - - public override bool IsFixedSize - { - get { return this._collection.IsFixedSize; } - } - - public override bool IsReadOnly - { - get { return this._collection.IsReadOnly; } - } - - public override bool IsSynchronized - { - get { return this._collection.IsSynchronized; } - } - - public override bool IsUnique - { - get { return true; } - } - - public override LineItem this[int index] - { - get { return this._collection[index]; } - set - { - CheckUnique(index, value); - this._collection[index] = value; - } - } - - public override object SyncRoot - { - get { return this._collection.SyncRoot; } - } - - #endregion - #region Public Methods - - public override int Add(LineItem value) - { - CheckUnique(value); - return this._collection.Add(value); - } - - public override void AddRange(LineItemCollection collection) - { - foreach (LineItem value in collection) - CheckUnique(value); - - this._collection.AddRange(collection); - } - - public override void AddRange(LineItem[] array) - { - foreach (LineItem value in array) - CheckUnique(value); - - this._collection.AddRange(array); - } - - public override int BinarySearch(LineItem value) - { - return this._collection.BinarySearch(value); - } - - public override void Clear() - { - this._collection.Clear(); - } - - public override object Clone() - { - return new UniqueList((LineItemCollection) this._collection.Clone()); - } - - public override void CopyTo(LineItem[] array) - { - this._collection.CopyTo(array); - } - - public override void CopyTo(LineItem[] array, int arrayIndex) - { - this._collection.CopyTo(array, arrayIndex); - } - - public override ILineItemEnumerator GetEnumerator() - { - return this._collection.GetEnumerator(); - } - - public override int IndexOf(LineItem value) - { - return this._collection.IndexOf(value); - } - - public override void Insert(int index, LineItem value) - { - CheckUnique(value); - this._collection.Insert(index, value); - } - - public override void Remove(LineItem value) - { - this._collection.Remove(value); - } - - public override void RemoveAt(int index) - { - this._collection.RemoveAt(index); - } - - public override void RemoveRange(int index, int count) - { - this._collection.RemoveRange(index, count); - } - - public override void Reverse() - { - this._collection.Reverse(); - } - - public override void Reverse(int index, int count) - { - this._collection.Reverse(index, count); - } - - public override void Sort() - { - this._collection.Sort(); - } - - public override void Sort(IComparer comparer) - { - this._collection.Sort(comparer); - } - - public override void Sort(int index, int count, IComparer comparer) - { - this._collection.Sort(index, count, comparer); - } - - public override LineItem[] ToArray() - { - return this._collection.ToArray(); - } - - public override void TrimToSize() - { - this._collection.TrimToSize(); - } - - #endregion - #region Private Methods - - private void CheckUnique(LineItem value) - { - if (IndexOf(value) >= 0) - throw new NotSupportedException( - "Unique collections cannot contain duplicate elements."); - } - - private void CheckUnique(int index, LineItem value) - { - int existing = IndexOf(value); - if (existing >= 0 && existing != index) - throw new NotSupportedException( - "Unique collections cannot contain duplicate elements."); - } - - #endregion - } - - #endregion - } - - #endregion -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/Order.cs b/src/IBatisNet.DataAccess.Test/Domain/Order.cs deleted file mode 100644 index e5809ce..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/Order.cs +++ /dev/null @@ -1,204 +0,0 @@ -using System; -using System.Collections; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Description rsume de Order. - /// - public class Order - { - private int _id; - private Account _account; - private System.DateTime _date; - private string _cardType; - private string _cardNumber; - private string _cardExpiry; - private string _street; - private string _city; - private string _province; - private string _postalCode; - private IList _lineItemsIList; - private IList _lineItems;//LineItemCollection - private LineItem[] _lineItemsArray; - private LineItem _favouriteLineItem; - - public LineItem FavouriteLineItem - { - get - { - return _favouriteLineItem; - } - set - { - _favouriteLineItem = value; - } - } - - public IList LineItemsIList - { - get - { - return _lineItemsIList; - } - set - { - _lineItemsIList = value; - } - } - - - public IList LineItems - { - get - { - return _lineItems; - } - set - { - _lineItems = value; - } - } - - public LineItem[] LineItemsArray - { - get - { - return _lineItemsArray; - } - set - { - _lineItemsArray = value; - } - } - - public string PostalCode - { - get - { - return _postalCode; - } - set - { - _postalCode = value; - } - } - - public string Province - { - get - { - return _province; - } - set - { - _province = value; - } - } - - public string City - { - get - { - return _city; - } - set - { - _city = value; - } - } - - public string Street - { - get - { - return _street; - } - set - { - _street = value; - } - } - - public string CardExpiry - { - get - { - return _cardExpiry; - } - set - { - _cardExpiry = value; - } - } - - public string CardNumber - { - get - { - return _cardNumber; - } - set - { - _cardNumber = value; - } - } - - public string CardType - { - get - { - return _cardType; - } - set - { - _cardType = value; - } - } - - public Account Account - { - get - { - return _account; - } - set - { - _account = value; - } - } - - public int Id - { - get - { - return _id; - } - set - { - _id = value; - } - } - - public System.DateTime Date - { - get - { - return _date; - } - set - { - _date = value; - } - } - - public System.DateTime OrderDate { - get { - return _date; - } - set { - _date = value; - } - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/Other.cs b/src/IBatisNet.DataAccess.Test/Domain/Other.cs deleted file mode 100644 index 5882089..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/Other.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Description rsume de Other. - /// - public class Other - { - private int _int; - private long _long; - - public int Int - { - get - { - return _int; - } - set - { - _int = value; - } - } - - public long Long - { - get - { - return _long; - } - set - { - _long = value; - } - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/Search.cs b/src/IBatisNet.DataAccess.Test/Domain/Search.cs deleted file mode 100644 index 0b52726..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/Search.cs +++ /dev/null @@ -1,63 +0,0 @@ -using System; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Summary description for Search. - /// - public class Search - { - private int _numberSearch; - private DateTime _startDate; - private string _operande; - private bool _startDateAnd; - - public bool StartDateAnd - { - get - { - return _startDateAnd; - } - set - { - _startDateAnd = value; - } - } - - public string Operande - { - get - { - return _operande; - } - set - { - _operande = value; - } - } - - public DateTime StartDate - { - get - { - return _startDate; - } - set - { - _startDate = value; - } - } - - public int NumberSearch - { - get - { - return _numberSearch; - } - set - { - _numberSearch = value; - } - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/Domain/User.cs b/src/IBatisNet.DataAccess.Test/Domain/User.cs deleted file mode 100644 index 9f42b2f..0000000 --- a/src/IBatisNet.DataAccess.Test/Domain/User.cs +++ /dev/null @@ -1,52 +0,0 @@ -using System; - -namespace IBatisNet.DataAccess.Test.Domain -{ - /// - /// Summary description for User. - /// - public class User - { - private string id; - private string userName; - private string password; - private string emailAddress; - private DateTime lastLogon; - - - public User() - { - } - - public string Id - { - get { return id; } - set { id = value; } - } - - public string UserName - { - get { return userName; } - set { userName = value; } - } - - public string Password - { - get { return password; } - set { password = value; } - } - - public string EmailAddress - { - get { return emailAddress; } - set { emailAddress = value; } - } - - public DateTime LastLogon - { - get { return lastLogon; } - set { lastLogon = value; } - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2005.csproj b/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2005.csproj deleted file mode 100644 index 9202f5b..0000000 --- a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2005.csproj +++ /dev/null @@ -1,327 +0,0 @@ - - - Local - 8.0.50727 - 2.0 - {888FE332-F7B7-4248-AEE1-73E14EB9C042} - Debug - AnyCPU - - - - - IBatisNet.DataAccess.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.DataAccess.Test - OnBuildSuccess - - - - - - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - - - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B} - IBatisNet.Common.Logging.Log4Net.2005 - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.2005 - - - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708} - IBatisNet.DataAccess.2005 - - - {F3E45F39-3224-4EAD-B138-EB5CC0E32824} - IBatisNet.DataMapper.20005 - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2010.csproj b/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2010.csproj deleted file mode 100644 index db7e410..0000000 --- a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.2010.csproj +++ /dev/null @@ -1,368 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {888FE332-F7B7-4248-AEE1-73E14EB9C042} - Debug - AnyCPU - - - - - IBatisNet.DataAccess.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.DataAccess.Test - OnBuildSuccess - - - - - - - v4.0 - 2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - - False - ..\External-Bin\nunit\2.4.8\nunit.framework.dll - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B} - IBatisNet.Common.Logging.Log4Net.2010 - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.2010 - - - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708} - IBatisNet.DataAccess.2010 - - - {F3E45F39-3224-4EAD-B138-EB5CC0E32824} - IBatisNet.DataMapper.2010 - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net35.2010.csproj b/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net35.2010.csproj deleted file mode 100644 index febc442..0000000 --- a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net35.2010.csproj +++ /dev/null @@ -1,365 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {888FE332-F7B7-4248-AEE1-73E14EB9C042} - Debug - AnyCPU - - - - - IBatisNet.DataAccess.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.DataAccess.Test - OnBuildSuccess - - - - - - - v3.5 - 2.0 - - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - - - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B} - IBatisNet.Common.Logging.Log4Net.Net35.2010 - - - {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE} - IBatisNet.Common.Net35.2010 - - - {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708} - IBatisNet.DataAccess.Net35.2010 - - - {F3E45F39-3224-4EAD-B138-EB5CC0E32824} - IBatisNet.DataMapper.Net35.2010 - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net45.2012.csproj b/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net45.2012.csproj deleted file mode 100644 index aa47410..0000000 --- a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.Net45.2012.csproj +++ /dev/null @@ -1,373 +0,0 @@ - - - - Local - 8.0.50727 - 2.0 - {888FE332-F7B7-4248-AEE1-73E14EB9C042} - Debug - AnyCPU - - - - - IBatisNet.DataAccess.Test - - - JScript - Grid - IE50 - false - Library - IBatisNet.DataAccess.Test - OnBuildSuccess - - - - - - - v4.0 - 2.0 - publish\ - true - Disk - false - Foreground - 7 - Days - false - false - true - 0 - 1.0.0.%2a - false - false - true - - - - bin\Debug\ - false - 285212672 - false - - - TRACE;DEBUG;dotnet2 - - - true - 4096 - false - - - false - false - false - false - 4 - full - prompt - AllRules.ruleset - false - - - bin\Release\ - false - 285212672 - false - - - TRACE;dotnet2 - - - false - 4096 - false - - - true - false - false - false - 4 - none - prompt - AllRules.ruleset - false - - - - False - ..\External-Bin\nunit\2.4.8\nunit.framework.dll - - - System - - - - System.Data - - - System.Drawing - - - System.XML - - - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - Code - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - False - .NET Framework 3.5 SP1 Client Profile - false - - - False - .NET Framework 3.5 SP1 - true - - - False - Windows Installer 3.1 - true - - - - - {023fe8d7-7e1a-4ddf-a0ea-8fb0e1b3122b} - IBatisNet.Common.Logging.Log4Net.Net45.2012 - - - {bbc8da4a-ea88-41d9-8b93-929b8f3adade} - IBatisNet.Common.Net45.2012 - - - {befc4a45-7df9-40e4-942c-82dc1ba5e708} - IBatisNet.DataAccess.Net45.2012 - - - {f3e45f39-3224-4ead-b138-eb5cc0e32824} - IBatisNet.DataMapper.Net45.2012 - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.build b/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.build deleted file mode 100644 index 5f72e35..0000000 --- a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.build +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.csproj b/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.csproj deleted file mode 100644 index cb112f9..0000000 --- a/src/IBatisNet.DataAccess.Test/IBatisNet.DataAccess.Test.csproj +++ /dev/null @@ -1,778 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/IBatisNet.DataMapper.Test.build b/src/IBatisNet.DataAccess.Test/IBatisNet.DataMapper.Test.build deleted file mode 100644 index 9a2a32b..0000000 --- a/src/IBatisNet.DataAccess.Test/IBatisNet.DataMapper.Test.build +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Account.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Account.xml deleted file mode 100644 index aca7879..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Account.xml +++ /dev/null @@ -1,447 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Category.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Category.xml deleted file mode 100644 index 5e86e2e..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Category.xml +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - - - - - - - - - - - select @@IDENTITY as [value]; - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:Guid#); - - - - - - select @@IDENTITY as [value]; - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value:Guid#); - - - - - - select @@IDENTITY as [value]; - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value#); - - - - - select @@IDENTITY as [value]; - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:Guid#); - - - - - select @@IDENTITY as [value]; - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - - - - - - select @@IDENTITY as [value]; - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - - - - update Categories set - Category_Name =?, - Category_Guid = ? - where - Category_Id = ? - - - - sp_InsertCategorie - - - - - select @@IDENTITY as [value] - - - - - - - - - - - - - - - - - - select - Category_ID as [Id], - Category_Name as [Name], - Category_Guid as [Guid] - from Categories - - - Category_Guid=#Guid:Guid# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Complex.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Complex.xml deleted file mode 100644 index 2d81f7c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Complex.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - select Account_ID from Accounts where Account_ID = #obj.Map.Id# - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Document.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Document.xml deleted file mode 100644 index e989746..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Document.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - * - from Documents - order by Document_Type, Document_Id - - - - select - * - from Documents - order by Document_Type, Document_Id - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/DynamicAccount.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/DynamicAccount.xml deleted file mode 100644 index 158b1ac..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/DynamicAccount.xml +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = 'Joe' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - - - $statement$ - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #Ids[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - and Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - Account_ID in - - #Ids[]# - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - Account_Email = 'clinton.begin@ibatis.com' - - - Account_Email = #EmailAddress# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #[]# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #Id# - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - (Account_FirstName = #FirstName# - - Account_LastName = #LastName# - - ) - - - Account_Email like #EmailAddress# - - - Account_ID = #Id# - - - order by Account_LastName - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - ((Account_ID $Operande$ #NumberSearch#) or - (Account_ID $Operande$ #NumberSearch#)) - - - = #StartDate# ]]> - - - = #StartDate# ]]> - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Enumeration.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Enumeration.xml deleted file mode 100644 index 77292ed..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Enumeration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - insert into Enumerations - (Enum_ID, Enum_Day, Enum_Color, Enum_Month) - values - (?, ?, ?, ?) - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/LineItem.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/LineItem.xml deleted file mode 100644 index c4afe66..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/LineItem.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - LineItem_Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - order by LineItem_Code - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price, - LineItem_Picture as PictureData - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - - - select - LineItem_ID, - LineItem_Code, - LineItem_Quantity, - LineItem_Price - from LineItems - where LineItem_ID = #value# - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) - values - (?, ?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - - - - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - - - - delete from LineItems where Order_ID = 10 - - delete from LineItems where Order_ID = 9 - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Order.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Order.xml deleted file mode 100644 index 4df6947..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Order.xml +++ /dev/null @@ -1,328 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select * from Orders where Order_ID = #value# - - - - select - Order_ID, - Order_Date, - Order_CardExpiry, - Order_CardType, - Order_CardNumber, - Order_Street, - Order_City, - Order_Province, - Order_PostalCode - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders - - - - select - Order_Date - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select - Orders.Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode, - LineItems.Order_ID as Order_Id, LineItem_ID, LineItem_Code, LineItem_Quantity, - LineItem_Price - from Orders, LineItems - where Orders.Order_ID = LineItems.Order_ID - and Order_FavouriteLineItem = LineItems.LineItem_ID - and Orders.Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select distinct Order_CardNumber from Orders - order by Order_CardNumber - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Other.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Other.xml deleted file mode 100644 index 8e6cf3c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/Other.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - select - Other_Int, - Other_Long - from Others - - - Other_Int = #year# - - - - Other_Long = #areaid# - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/ResultClass.xml b/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/ResultClass.xml deleted file mode 100644 index 387e817..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Access/OleDb/ResultClass.xml +++ /dev/null @@ -1,104 +0,0 @@ - - - - - - - - select 1 from Orders where Order_ID = #value# - - - - - select 155 from Orders where Order_ID = #value# - - - - select 'a' from Orders where Order_ID = #value# - - - - - select '2003-02-15 8:15:00' from Orders where Order_ID = #value# - - - - select 1.56 from Orders where Order_ID = #value# - - - - - select 99.5 from Orders where Order_ID= #value# - - - - - select 'CD5ABF17-4BBC-4C86-92F1-257735414CF4' from Orders where Order_ID = #value# - - - - select 32111 from Orders where Order_ID = #value# - - - - select 999999 from Orders where Order_ID = #value# - - - - select 9223372036854775800 from Orders where Order_ID = #value# - - - - - select 92233.5 from Orders where Order_ID = #value# - - - - select 'VISA' - from Orders where Order_ID = #value# - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Account.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Account.xml deleted file mode 100644 index 60f2f33..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Account.xml +++ /dev/null @@ -1,440 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Category.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Category.xml deleted file mode 100644 index a3fe83e..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Category.xml +++ /dev/null @@ -1,170 +0,0 @@ - - - - - - - - - - - - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:UniqueIdentifier#); - select SCOPE_IDENTITY() as value - - - - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value:UniqueIdentifier#); - select SCOPE_IDENTITY() as value - - - - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value#); - select SCOPE_IDENTITY() as value - - - - - select @@IDENTITY as value - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:UniqueIdentifier#) - - - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - select SCOPE_IDENTITY() as value - - - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - select SCOPE_IDENTITY() as value - - - - update Categories set - Category_Name =?, - Category_Guid = ? - where - Category_Id = ? - - - - sp_InsertCategorie - - - - - select @@IDENTITY as value - - - - - - - - - - - - - - - - - - select - Category_ID as Id, - Category_Name as Name, - Category_Guid as Guid - from Categories - - - Category_Guid=#Guid:UniqueIdentifier# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Complex.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Complex.xml deleted file mode 100644 index 9520431..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Complex.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - select Account_ID from Accounts where Account_ID = #obj.Map.Id# - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/DynamicAccount.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/DynamicAccount.xml deleted file mode 100644 index ab0aee6..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/DynamicAccount.xml +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = 'Joe' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - - - $statement$ - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #Ids[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - and Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - Account_ID in - - #Ids[]# - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - Account_Email = 'clinton.begin@ibatis.com' - - - Account_Email = #EmailAddress# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #[]# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #Id# - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - (Account_FirstName = #FirstName# - - Account_LastName = #LastName# - - ) - - - Account_Email like #EmailAddress# - - - Account_ID = #Id# - - - order by Account_LastName - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - ((Account_ID $Operande$ #NumberSearch#) or - (Account_ID $Operande$ #NumberSearch#)) - - - = #StartDate# ]]> - - - = #StartDate# ]]> - - - - order by Account_LastName - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Enumeration.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Enumeration.xml deleted file mode 100644 index c1ac0e1..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Enumeration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - insert into Enumerations - (Enum_ID, Enum_Day, Enum_Color, Enum_Month) - values - (?, ?, ?, ?) - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/LineItem.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/LineItem.xml deleted file mode 100644 index cdb8db2..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/LineItem.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - LineItem_Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - order by LineItem_Code - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price, - LineItem_Picture as PictureData - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - - - select - LineItem_ID, - LineItem_Code, - LineItem_Quantity, - LineItem_Price - from LineItems - where LineItem_ID = #value# - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) - values - (?, ?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - - - - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Order.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Order.xml deleted file mode 100644 index 9027297..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Order.xml +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select * from Orders where Order_ID = #value# - - - - select - Order_ID, - Order_Date, - Order_CardExpiry, - Order_CardType, - Order_CardNumber, - Order_Street, - Order_City, - Order_Province, - Order_PostalCode - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders - - - - select - Order_Date - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders, LineItems - where Orders.Order_ID = LineItems.Order_ID - and Order_FavouriteLineItem = LineItems.LineItem_ID - and Orders.Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select distinct Order_CardNumber from Orders - order by Order_CardNumber - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Other.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Other.xml deleted file mode 100644 index 8e6cf3c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/Odbc/Other.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - select - Other_Int, - Other_Long - from Others - - - Other_Int = #year# - - - - Other_Long = #areaid# - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Account.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Account.xml deleted file mode 100644 index c879466..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Account.xml +++ /dev/null @@ -1,439 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Category.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Category.xml deleted file mode 100644 index 63bd51d..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Category.xml +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - - - - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:Guid#); - select SCOPE_IDENTITY() as value - - - - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value:Guid#); - select SCOPE_IDENTITY() as value - - - - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value#); - select SCOPE_IDENTITY() as value - - - - - select @@IDENTITY as value - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:Guid#) - - - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - select SCOPE_IDENTITY() as value - - - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - select SCOPE_IDENTITY() as value - - - - update Categories set - Category_Name =?, - Category_Guid = ? - where - Category_Id = ? - - - - sp_InsertCategorie - - - - - select @@IDENTITY as value - - - - - - - - - - - - - - - - - - - select - Category_ID as Id, - Category_Name as Name, - Category_Guid as Guid - from Categories - - - Category_Guid=#Guid:Guid# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Complex.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Complex.xml deleted file mode 100644 index 2d81f7c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Complex.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - select Account_ID from Accounts where Account_ID = #obj.Map.Id# - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/DynamicAccount.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/DynamicAccount.xml deleted file mode 100644 index 158b1ac..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/DynamicAccount.xml +++ /dev/null @@ -1,385 +0,0 @@ - - - - - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = 'Joe' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - - - $statement$ - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #Ids[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - and Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - Account_ID in - - #Ids[]# - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - Account_Email = 'clinton.begin@ibatis.com' - - - Account_Email = #EmailAddress# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #[]# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #Id# - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - (Account_FirstName = #FirstName# - - Account_LastName = #LastName# - - ) - - - Account_Email like #EmailAddress# - - - Account_ID = #Id# - - - order by Account_LastName - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - ((Account_ID $Operande$ #NumberSearch#) or - (Account_ID $Operande$ #NumberSearch#)) - - - = #StartDate# ]]> - - - = #StartDate# ]]> - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Enumeration.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Enumeration.xml deleted file mode 100644 index 96bf897..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Enumeration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - insert into Enumerations - (Enum_ID, Enum_Day, Enum_Color, Enum_Month) - values - (?, ?, ?, ?) - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/LineItem.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/LineItem.xml deleted file mode 100644 index cf813bc..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/LineItem.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - LineItem_Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - order by LineItem_Code - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price, - LineItem_Picture as PictureData - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - - - select - LineItem_ID, - LineItem_Code, - LineItem_Quantity, - LineItem_Price - from LineItems - where LineItem_ID = #value# - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) - values - (?, ?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - - - - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Order.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Order.xml deleted file mode 100644 index bd1565e..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Order.xml +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select * from Orders where Order_ID = #value# - - - - select - Order_ID, - Order_Date, - Order_CardExpiry, - Order_CardType, - Order_CardNumber, - Order_Street, - Order_City, - Order_Province, - Order_PostalCode - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders - - - - select - Order_Date - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders, LineItems - where Orders.Order_ID = LineItems.Order_ID - and Order_FavouriteLineItem = LineItems.LineItem_ID - and Orders.Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select distinct Order_CardNumber from Orders - order by Order_CardNumber - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Other.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Other.xml deleted file mode 100644 index 8e6cf3c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/OleDb/Other.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - select - Other_Int, - Other_Long - from Others - - - Other_Int = #year# - - - - Other_Long = #areaid# - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Account.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Account.xml deleted file mode 100644 index 2c8e015..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Account.xml +++ /dev/null @@ -1,485 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Category.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Category.xml deleted file mode 100644 index aef920e..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Category.xml +++ /dev/null @@ -1,171 +0,0 @@ - - - - - - - - - - - - - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:UniqueIdentifier#); - select SCOPE_IDENTITY() as value - - - - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value:UniqueIdentifier#); - select SCOPE_IDENTITY() as value - - - - - insert into Categories - (Category_Name, Category_Guid) - values - ('toto', #value#); - select SCOPE_IDENTITY() as value - - - - - - select @@IDENTITY as value - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #Guid:UniqueIdentifier#) - - - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - select SCOPE_IDENTITY() as value - - - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - select SCOPE_IDENTITY() as value - - - - update Categories set - Category_Name =?, - Category_Guid = ? - where - Category_Id = ? - - - - sp_InsertCategorie - - - - - select @@IDENTITY as value - - - - - - - - - - - - - - - - - - select - Category_ID as Id, - Category_Name as Name, - Category_Guid as Guid - from Categories - - - Category_Guid=#Guid:UniqueIdentifier# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Complex.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Complex.xml deleted file mode 100644 index e0da522..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Complex.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - select Account_ID from Accounts where Account_ID = #obj.Map.Id# - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml deleted file mode 100644 index b03c464..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = 'Joe' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - - - $statement$ - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #Ids[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - and Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - Account_ID in - - #Ids[]# - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - Account_Email = 'clinton.begin@ibatis.com' - - - Account_Email = #EmailAddress# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #[]# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #Id# - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - (Account_FirstName = #FirstName# - - Account_LastName = #LastName# - - ) - - - Account_Email like #EmailAddress# - - - Account_ID = #Id# - - - order by Account_LastName - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - ((Account_ID $Operande$ #NumberSearch#) or - (Account_ID $Operande$ #NumberSearch#)) - - - = #StartDate# ]]> - - - = #StartDate# ]]> - - - - order by Account_LastName - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Enumeration.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Enumeration.xml deleted file mode 100644 index b4f98ae..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Enumeration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - insert into Enumerations - (Enum_ID, Enum_Day, Enum_Color, Enum_Month) - values - (?, ?, ?, ?) - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/LineItem.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/LineItem.xml deleted file mode 100644 index c53f16d..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/LineItem.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - LineItem_Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - order by LineItem_Code - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price, - LineItem_Picture as PictureData - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - - - select - LineItem_ID, - LineItem_Code, - LineItem_Quantity, - LineItem_Price - from LineItems - where LineItem_ID = #value# - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) - values - (?, ?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - - - - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Order.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Order.xml deleted file mode 100644 index 21b5c71..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Order.xml +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select * from Orders where Order_ID = #value# - - - - select - Order_ID, - Order_Date, - Order_CardExpiry, - Order_CardType, - Order_CardNumber, - Order_Street, - Order_City, - Order_Province, - Order_PostalCode - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders - - - - select - Order_Date - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders, LineItems - where Orders.Order_ID = LineItems.Order_ID - and Order_FavouriteLineItem = LineItems.LineItem_ID - and Orders.Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select distinct Order_CardNumber from Orders - order by Order_CardNumber - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Other.xml b/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Other.xml deleted file mode 100644 index 8e6cf3c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MSSQL/SqlClient/Other.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - select - Other_Int, - Other_Long - from Others - - - Other_Int = #year# - - - - Other_Long = #areaid# - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Account.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Account.xml deleted file mode 100644 index 3bb557f..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Account.xml +++ /dev/null @@ -1,485 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - - sp_InsertAccount - - - - ps_swap_email_address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Category.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Category.xml deleted file mode 100644 index 5b17e20..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Category.xml +++ /dev/null @@ -1,162 +0,0 @@ - - - - - - - - - - - - - - - - select LAST_INSERT_ID() as value - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #GuidString:Varchar#); - - - - - - select LAST_INSERT_ID() as value - - insert into Categories - (Category_Name, Category_Guid) - values - (#Name#, #GuidString:Varchar#) - - - - - - select LAST_INSERT_ID() as value - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - - - - - - select LAST_INSERT_ID() as value - - insert into Categories - (Category_Name, Category_Guid) - values - (?,?); - - - - update Categories set - Category_Name =?, - Category_Guid = ? - where - Category_Id = ? - - - - sp_InsertCategorie - - - - - select LAST_INSERT_ID() as value - - - - - - - - - - - - - - - - - - select - Category_ID as Id, - Category_Name as Name, - Category_Guid as Guid - from Categories - - - Category_Guid=#GuidString:Varchar# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Complex.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Complex.xml deleted file mode 100644 index e0da522..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Complex.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - select Account_ID from Accounts where Account_ID = #obj.Map.Id# - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/DynamicAccount.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/DynamicAccount.xml deleted file mode 100644 index d5fe978..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/DynamicAccount.xml +++ /dev/null @@ -1,387 +0,0 @@ - - - - - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = 'Joe' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - - - $statement$ - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #Ids[]# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - and Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - Account_ID in - - #Ids[]# - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - Account_Email = 'clinton.begin@ibatis.com' - - - Account_Email = #EmailAddress# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - Account_ID IN - - #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #[]# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #[]# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #Id# - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - (Account_FirstName = #FirstName# - - Account_LastName = #LastName# - - ) - - - Account_Email like #EmailAddress# - - - Account_ID = #Id# - - - order by Account_LastName - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - ((Account_ID $Operande$ #NumberSearch#) or - (Account_ID $Operande$ #NumberSearch#)) - - - = #StartDate# ]]> - - - = #StartDate# ]]> - - - - order by Account_LastName - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Enumeration.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Enumeration.xml deleted file mode 100644 index c1ac0e1..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Enumeration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - insert into Enumerations - (Enum_ID, Enum_Day, Enum_Color, Enum_Month) - values - (?, ?, ?, ?) - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/LineItem.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/LineItem.xml deleted file mode 100644 index f5293ae..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/LineItem.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - LineItem_Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - order by LineItem_Code - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price, - LineItem_Picture as PictureData - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - - - select - LineItem_ID, - LineItem_Code, - LineItem_Quantity, - LineItem_Price - from LineItems - where LineItem_ID = #value# - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) - values - (?, ?, ?, ?, ?, ?); - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - - - - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#) - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Order.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Order.xml deleted file mode 100644 index f0763c7..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Order.xml +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select * from Orders where Order_ID = #value# - - - - select - Order_ID, - Order_Date, - Order_CardExpiry, - Order_CardType, - Order_CardNumber, - Order_Street, - Order_City, - Order_Province, - Order_PostalCode - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders - - - - select - Order_Date - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders, LineItems - where Orders.Order_ID = LineItems.Order_ID - and Order_FavouriteLineItem = LineItems.LineItem_ID - and Orders.Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select distinct Order_CardNumber from Orders - order by Order_CardNumber - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Other.xml b/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Other.xml deleted file mode 100644 index 8e6cf3c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/MySql/ByteFx/Other.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - select - Other_Int, - Other_Long - from Others - - - Other_Int = #year# - - - - Other_Long = #areaid# - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Account.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Account.xml deleted file mode 100644 index fa4a8e7..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Account.xml +++ /dev/null @@ -1,563 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id:Int32# - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id:Int32#, '$FirstName$', '$LastName$', '$EmailAddress$') - - - - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id:Int32#, '$FirstName$', '$LastName$', #EmailAddress:VarChar2:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id:Int32#, '$FirstName$', '$LastName$', '$EmailAddress$' ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id:Int32#, '$FirstName$', '$LastName$', '$EmailAddress$' ) - - - - delete from Accounts - where Account_ID = #Id:Int32# - - - - - - - - - - - - - - - call prc_InsertAccount(?, ?, ?, ?) - - - - - call prc_Swap_Email_Address(?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Category.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Category.xml deleted file mode 100644 index 3a76b76..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Category.xml +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - - - - - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (#Id:Int32#, #Name#, #GuidString:VarChar2#) - - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (?, ?, ?) - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (?,?,?) - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (?,?,?) - - - - - update Categories set - Category_Id = ?, - Category_Name =?, - Category_Guid = ? - where - Category_Id = ? - - - - - call prc_InsertCategory(?, ?, ?) - - - - - select s_categories.nextval as value from dual - - - - - - - - - - - - - - - - - - - - select - Category_ID as Id, - Category_Name as Name, - Category_Guid as GuidString - from Categories - - - Category_Guid=#GuidString:VarChar2# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Complex.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Complex.xml deleted file mode 100644 index a921f41..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Complex.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - select Account_ID from Accounts where Account_ID = #obj.Map.Id:Int32# - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/DynamicAccount.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/DynamicAccount.xml deleted file mode 100644 index 2fecd36..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/DynamicAccount.xml +++ /dev/null @@ -1,424 +0,0 @@ - - - - - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = 'Joe' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = #value:Int32# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = '$value$' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - - $statement$ - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]:Int32# - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #Ids[]:Int32# - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE ( - - Account_FirstName LIKE #NamePatterns[]# - - ) - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE ( - - Account_FirstName LIKE #[]# - - ) - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]:Int32# - - and Account_ID IN - - #[]:Int32# - - ORDER BY Account_Id ASC - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id:Int32# - - - Account_ID in - - #Ids[]:Int32# - - - - Account_FirstName = '$FirstName$' - - - Account_LastName = '$LastName$' - - - - Account_Email = 'clinton.begin@ibatis.com' - - - Account_Email = '$EmailAddress$' - - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - Account_ID IN - - #[]:Int32# - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #[]:Int32# - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #[]:Int32# - - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #Id:Int32# - - - Account_FirstName = '$FirstName$' - - - Account_LastName = '$LastName$' - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id:Int32# - - - - - Account_FirstName = '$FirstName$' - - - Account_LastName = '$LastName$' - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - (Account_FirstName = '$FirstName$' - - Account_LastName = '$LastName$' - - ) - - - Account_Email like '%$EmailAddress$%' - - - Account_ID = #Id:Int32# - - - order by Account_LastName - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - ((Account_ID $Operande$ #NumberSearch:Int32#) or - (Account_ID $Operande$ #NumberSearch:Int32#)) - - - = TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]> - - - = TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]> - - - - order by Account_LastName - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Enumeration.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Enumeration.xml deleted file mode 100644 index f00507c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Enumeration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - insert into Enumerations - (Enum_ID, Enum_Day, Enum_Color, Enum_Month) - values - (?, ?, ?, ?) - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/LineItem.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/LineItem.xml deleted file mode 100644 index 67d5f1a..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/LineItem.xml +++ /dev/null @@ -1,215 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - LineItem_Price - from LineItems - where Order_ID = #Order_ID:Int32# - and LineItem_ID = #LineItem_ID:Int32# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value:Int32# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value:Int32# - order by LineItem_Code - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems - where Order_ID = #Order_ID:Int32# - and LineItem_ID = #LineItem_ID:Int32# - - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price, - LineItem_Picture as PictureData - from LineItems - where Order_ID = #Order_ID:Int32# - and LineItem_ID = #LineItem_ID:Int32# - - - - - - select - LineItem_ID, - LineItem_Code, - LineItem_Quantity, - LineItem_Price - from LineItems - where LineItem_ID = #value:Int32# - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?) - - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) - values - (?, ?, ?, ?, ?, ?) - - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?) - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - - - - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Order.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Order.xml deleted file mode 100644 index be3b13c..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Order.xml +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select * from Orders where Order_ID = #value:Int32# - - - - select - Order_ID, - Order_Date, - Order_CardExpiry, - Order_CardType, - Order_CardNumber, - Order_Street, - Order_City, - Order_Province, - Order_PostalCode - from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders - - - - select - Order_Date - from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders, LineItems - where Orders.Order_ID = LineItems.Order_ID - and Order_FavouriteLineItem = LineItems.LineItem_ID - and Orders.Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select * from Orders where Order_ID = #value:Int32# - - - - select distinct Order_CardNumber from Orders - order by Order_CardNumber - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Other.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Other.xml deleted file mode 100644 index 249a249..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/ODP/Other.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - select - Other_Int, - Other_Long - from Others - - - Other_Int = #year:Int32# - - - - Other_Long = #areaid:Int64# - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Account.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Account.xml deleted file mode 100644 index c25bbcc..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Account.xml +++ /dev/null @@ -1,523 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (?, ?, ?, ?) - - - - update Accounts set - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - update Accounts set - Account_ID = ?, - Account_FirstName = ?, - Account_LastName = ?, - Account_Email = ? - where - Account_ID = ? - - - - delete from Accounts - where - Account_ID = #Id# - - - - - - - - - - - - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress# - ) - - - - - - update Accounts set - Account_FirstName = #FirstName#, - Account_LastName = #LastName#, - Account_Email = #EmailAddress:VarChar:no_email@provided.com# - where - Account_ID = #Id# - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - (#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com# - ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) - values - ( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# ) - - - - delete from Accounts - where Account_ID = #Id# - and Account_ID = #Id# - - - - - - - - - - - - - prc_InsertAccount - - - - prc_Swap_Email_Address - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Category.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Category.xml deleted file mode 100644 index 3d69e5d..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Category.xml +++ /dev/null @@ -1,220 +0,0 @@ - - - - - - - - - - - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (#Id#, #Name#, #GuidString:VarChar#) - - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (#Id#, #Name#, #GuidString:VarChar#) - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (?,?,?) - - - - - select s_categories.nextval as value from dual - - insert into Categories - (Category_Id, Category_Name, Category_Guid) - values - (?,?,?) - - - - - update Categories set - Category_Name = ?, - Category_Guid = ? - where - Category_Id = ? - - - - - prc_InsertCategory - - - - - select s_categories.nextval as value from dual - - - - - - - - - - - - - - - - - - - - select - Category_ID as Id, - Category_Name as Name, - Category_Guid as GuidString - from Categories - - - Category_Guid=#GuidString:VarChar# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Complex.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Complex.xml deleted file mode 100644 index 5f16e9b..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Complex.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - select Account_ID from Accounts where Account_ID = #obj.Map.Id# - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/DynamicAccount.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/DynamicAccount.xml deleted file mode 100644 index 251a287..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/DynamicAccount.xml +++ /dev/null @@ -1,432 +0,0 @@ - - - - - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = 'Joe' - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_FirstName = #value# - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - where Account_ID = 1 - - - - - - - $statement$ - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #Ids[]# - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE ( - - Account_FirstName LIKE #NamePatterns[]# - - ) - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE ( - - Account_FirstName LIKE #[]# - - ) - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - WHERE Account_ID IN - - #[]# - - and Account_ID IN - - #[]# - - ORDER BY Account_Id ASC - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - Account_ID in - - #Ids[]# - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - Account_Email = 'clinton.begin@ibatis.com' - - - Account_Email = #EmailAddress# - - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - Account_ID IN - - #[]# - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #[]# - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #[]# - - - - ORDER BY Account_Id ASC - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - - Account_ID = #Id# - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - Account_ID = #Id# - - - - - Account_FirstName = #FirstName# - - - Account_LastName = #LastName# - - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - (Account_FirstName = #FirstName# - - Account_LastName = #LastName# - - ) - - - Account_Email like #EmailAddress# - - - Account_ID = #Id# - - - order by Account_LastName - - - - - select - Account_ID as Id, - Account_FirstName as FirstName, - Account_LastName as LastName, - Account_Email as EmailAddress - from Accounts - - - ((Account_ID $Operande$ #NumberSearch#) or - (Account_ID $Operande$ #NumberSearch#)) - - - = TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]> - - - = TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]> - - - - order by Account_LastName - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Enumeration.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Enumeration.xml deleted file mode 100644 index c1ac0e1..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Enumeration.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - insert into Enumerations - (Enum_ID, Enum_Day, Enum_Color, Enum_Month) - values - (?, ?, ?, ?) - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/LineItem.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/LineItem.xml deleted file mode 100644 index d2c55f8..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/LineItem.xml +++ /dev/null @@ -1,191 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select - LineItem_Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems where Order_ID = #value# - order by LineItem_Code - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - select - LineItem_ID as Id, - LineItem_Code as Code, - LineItem_Quantity as Quantity, - LineItem_Price as Price, - LineItem_Picture as PictureData - from LineItems - where Order_ID = #Order_ID# - and LineItem_ID = #LineItem_ID# - - - - - - select - LineItem_ID, - LineItem_Code, - LineItem_Quantity, - LineItem_Price - from LineItems - where LineItem_ID = #value# - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (?, ?, ?, ?, ?) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture) - values - (?, ?, ?, ?, ?, ?) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Number#) - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - - - - - select 99 from LineItems where LineItem_ID = 1 and Order_ID=1 - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Number#) - - - - insert into LineItems - (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price) - values - (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Number#) - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Order.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Order.xml deleted file mode 100644 index ad1f5a1..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Order.xml +++ /dev/null @@ -1,323 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - select * from Orders where Order_ID = #value# - - - - select - Order_ID, - Order_Date, - Order_CardExpiry, - Order_CardType, - Order_CardNumber, - Order_Street, - Order_City, - Order_Province, - Order_PostalCode - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders - - - - select - Order_Date - from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders, LineItems - where Orders.Order_ID = LineItems.Order_ID - and Order_FavouriteLineItem = LineItems.LineItem_ID - and Orders.Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select * from Orders where Order_ID = #value# - - - - select distinct Order_CardNumber from Orders - order by Order_CardNumber - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - insert into Orders - (Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, - Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) - values - (?, ?, ?, ?, ?, ?, ?, ?, ?, ?) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Other.xml b/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Other.xml deleted file mode 100644 index f5a62b1..0000000 --- a/src/IBatisNet.DataAccess.Test/Maps/Oracle/OracleClient/Other.xml +++ /dev/null @@ -1,39 +0,0 @@ - - - - - - - - - - - - - - - - - - select - Other_Int, - Other_Long - from Others - - - Other_Int = #year# - - - - Other_Long = #areaid# - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MSSQL/AdoDaoTest.cs b/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MSSQL/AdoDaoTest.cs deleted file mode 100644 index 4d6d001..0000000 --- a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MSSQL/AdoDaoTest.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Configuration; -using IBatisNet.DataAccess.Configuration; -using NUnit.Framework; - -namespace IBatisNet.DataAccess.Test.NUnit.DaoTests.Ado.MSSQL -{ - /// - /// Summary description for AdoDaoTest. - /// - [Category("MSSQL")] - public class AdoDaoTest : BaseDaoTest - { - /// - /// Initialisation - /// - [TestFixtureSetUp] - public void FixtureSetUp() - { - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -#if dotnet2 - builder.Configure( "dao_MSSQL_" - + ConfigurationManager.AppSettings["providerType"] + ".config"); - daoManager = DaoManager.GetInstance(); -#else - builder.Configure( "dao_MSSQL_" - + ConfigurationSettings.AppSettings["providerType"] + ".config" ); - daoManager = DaoManager.GetInstance(); -#endif - - } - - /// - /// Initialisation - /// - [SetUp] - public void SetUp() - { - InitScript( daoManager.LocalDataSource, ScriptDirectory + "account-init.sql" ); - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MySql/AdoDaoTest.cs b/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MySql/AdoDaoTest.cs deleted file mode 100644 index ba5dfbc..0000000 --- a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/MySql/AdoDaoTest.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Configuration; -using IBatisNet.DataAccess.Configuration; -using NUnit.Framework; - -namespace IBatisNet.DataAccess.Test.NUnit.DaoTests.Ado.MySql -{ - /// - /// Summary description for AdoDaoTest. - /// - [Category("MySql")] - public class AdoDaoTest : BaseDaoTest - { - /// - /// Initialisation - /// - [TestFixtureSetUp] - public void FixtureSetUp() - { - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -#if dotnet2 - builder.Configure( "dao_MySql_" - + ConfigurationManager.AppSettings["providerType"] + ".config"); -#else - builder.Configure( "dao_MySql_" - + ConfigurationSettings.AppSettings["providerType"] + ".config" ); -#endif - daoManager = DaoManager.GetInstance(); - - } - - /// - /// Initialisation - /// - [SetUp] - public void SetUp() - { - InitScript( daoManager.LocalDataSource, ScriptDirectory + "account-init.sql" ); - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/Oracle/AdoDaoTest.cs b/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/Oracle/AdoDaoTest.cs deleted file mode 100644 index 1f94087..0000000 --- a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/ADO/Oracle/AdoDaoTest.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Configuration; -using IBatisNet.DataAccess.Configuration; -using NUnit.Framework; - -namespace IBatisNet.DataAccess.Test.NUnit.DaoTests.Ado.Oracle -{ - /// - /// Summary description for AdoDaoTest. - /// - [Category("Oracle")] - public class AdoDaoTest : BaseDaoTest - { - /// - /// Initialisation - /// - [TestFixtureSetUp] - public void FixtureSetUp() - { - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); - builder.Configure( "dao_Oracle_" - + ConfigurationSettings.AppSettings["providerType"] + ".config" ); - daoManager = DaoManager.GetInstance(); - - } - - /// - /// Initialisation - /// - [SetUp] - public void SetUp() - { - InitScript( daoManager.LocalDataSource, ScriptDirectory + "account-init.sql" ); - } - } -} diff --git a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/BaseDaoTest.cs b/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/BaseDaoTest.cs deleted file mode 100644 index 873d652..0000000 --- a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/BaseDaoTest.cs +++ /dev/null @@ -1,392 +0,0 @@ -// DataSource definition - // ScriptRunner definition -using System; -using System.Configuration; -using System.IO; -using System.Threading; -using IBatisNet.Common; -using IBatisNet.Common.Utilities; -using IBatisNet.DataAccess.Configuration; -using IBatisNet.DataAccess.Test.Dao.Interfaces; -using IBatisNet.DataAccess.Test.Domain; -using NUnit.Framework; - -namespace IBatisNet.DataAccess.Test.NUnit.DaoTests -{ - /// - /// Summary description for BaseDaoTest. - /// - [TestFixture] - public abstract class BaseDaoTest - { - /// - /// A daoManager - /// - protected static IDaoManager daoManager = null; - - protected static string ScriptDirectory = null; - - private ManualResetEvent _startEvent = new ManualResetEvent(false); - private ManualResetEvent _stopEvent = new ManualResetEvent(false); - - /// - /// Constructor - /// - static BaseDaoTest() - { - #if dotnet2 - ScriptDirectory = Path.Combine(Path.Combine(Path.Combine(Path.Combine(Resources.ApplicationBase, ".."), ".."), "Scripts"), ConfigurationManager.AppSettings["database"]) + Path.DirectorySeparatorChar; - - #else - ScriptDirectory = Path.Combine(Path.Combine(Path.Combine(Path.Combine(Resources.ApplicationBase, ".."), ".."), "Scripts"), ConfigurationSettings.AppSettings["database"]) + Path.DirectorySeparatorChar; - #endif - } - - - /// - /// Run a sql batch for the datasource. - /// - /// The datasource. - /// The sql batch - protected static void InitScript(IDataSource datasource, string script) - { - ScriptRunner runner = new ScriptRunner(); - - runner.RunScript(datasource, script); - } - - [Test] - public void MultipleContext() - { - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); - builder.Configure( "dao_Multiple_Context.config" ); - IDaoManager daoManager1 = DaoManager.GetInstance("Contex1"); - IDaoManager daoManager2 = DaoManager.GetInstance("Contex2"); - - Assert.IsNotNull(daoManager1); - Assert.IsNotNull(daoManager2); - Assert.IsTrue(daoManager2.LocalDataSource.ConnectionString != daoManager1.LocalDataSource.ConnectionString); - Assert.IsTrue(daoManager2.LocalDataSource.DbProvider.Name != daoManager1.LocalDataSource.DbProvider.Name); - - daoManager1.OpenConnection(); - daoManager2.OpenConnection(); - - daoManager1.CloseConnection(); - daoManager2.CloseConnection(); - } - - #region Dao statement tests - - - - /// - /// Verify that DaoManager.GetDao("Account") - /// return an object that implemetent the interface IAccountDao. - /// - [Test] - public void TestGetDao() - { - Type type = typeof (IAccountDao); - - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - Assert.IsNotNull(accountDao); - Assert.IsTrue(type.IsInstanceOfType(accountDao)); - } - - /// - /// Test Open connection with a connection string - /// - [Test] - public void TestOpenConnection() - { - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - - Account account = NewAccount(); - - try - { - daoManager.OpenConnection(daoManager.LocalDataSource.ConnectionString); - accountDao.Create(account); - - account = accountDao.GetAccountById(1001); - } - catch (Exception e) - { - // Ignore - Console.WriteLine("TestCreateAccount, error cause : " + e.Message); - } - finally - { - daoManager.CloseConnection(); - } - - Assert.IsNotNull(account); - Assert.AreEqual("Calamity.Jane@somewhere.com", account.EmailAddress); - } - - /// - /// Test CreateAccount - /// - [Test] - public void TestCreateAccount() - { - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - Account account = NewAccount(); - - try - { - daoManager.OpenConnection(); - accountDao.Create(account); - - account = accountDao.GetAccountById(1001); - } - catch (Exception e) - { - // Ignore - Console.WriteLine("TestCreateAccount, error cause : " + e.Message); - } - finally - { - daoManager.CloseConnection(); - } - - Assert.IsNotNull(account); - Assert.AreEqual("Calamity.Jane@somewhere.com", account.EmailAddress); - } - - /// - /// Test CreateAccount - /// - [Test] - public void TestCreateAccountExplicitOpenSession() - { - IAccountDao accountDao = daoManager[typeof (IAccountDao)] as IAccountDao; - - Account account = NewAccount(); - - try - { - accountDao.Create(account); - - account = accountDao.GetAccountById(1001); - } - catch (Exception e) - { - // Ignore - Console.WriteLine("TestCreateAccount, error cause : " + e.Message); - } - finally - { - } - - Assert.IsNotNull(account); - Assert.AreEqual("Calamity.Jane@somewhere.com", account.EmailAddress); - } - - /// - /// Test Transaction Rollback - /// - [Test] - public void TestTransactionRollback() - { - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - Account account = NewAccount(); - daoManager.OpenConnection(); - Account account2 = accountDao.GetAccountById(1); - daoManager.CloseConnection(); - - account2.EmailAddress = "someotherAddress@somewhere.com"; - - try - { - daoManager.BeginTransaction(); - - accountDao.Create(account); - accountDao.Update(account2); - throw new Exception("BOOM!"); - - //daoManager.CommitTransaction(); - } - catch - { - daoManager.RollBackTransaction(); - } - finally - { - } - - daoManager.OpenConnection(); - account = accountDao.GetAccountById(account.Id); - account2 = accountDao.GetAccountById(1); - daoManager.CloseConnection(); - - Assert.IsNull(account); - Assert.AreEqual("Joe.Dalton@somewhere.com", account2.EmailAddress); - } - - - /// - /// Test Transaction Commit - /// - [Test] - public void TestTransactionCommit() - { - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - Account account = NewAccount(); - - daoManager.OpenConnection(); - Account account2 = accountDao.GetAccountById(1); - daoManager.CloseConnection(); - - account2.EmailAddress = "someotherAddress@somewhere.com"; - - try - { - daoManager.BeginTransaction(); - accountDao.Create(account); - accountDao.Update(account2); - daoManager.CommitTransaction(); - } - finally - { - // Nothing - } - - daoManager.OpenConnection(); - account = accountDao.GetAccountById(account.Id); - account2 = accountDao.GetAccountById(1); - daoManager.CloseConnection(); - - Assert.IsNotNull(account); - Assert.AreEqual("someotherAddress@somewhere.com", account2.EmailAddress); - } - - /// - /// Test Delete - /// - [Test] - public void TestDeleteAccount() - { - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - Account account = NewAccount(); - - daoManager.OpenConnection(); - - accountDao.Create(account); - account = accountDao.GetAccountById(1001); - - Assert.IsNotNull(account); - Assert.AreEqual("Calamity.Jane@somewhere.com", account.EmailAddress); - - accountDao.Delete(account); - - account = accountDao.GetAccountById(1001); - Assert.IsNull(account); - - daoManager.CloseConnection(); - } - - /// - /// Test Using syntax on daoManager.OpenConnection - /// - [Test] - public void TestUsingConnection() - { - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - using (IDalSession session = daoManager.OpenConnection()) - { - Account account = NewAccount(); - accountDao.Create(account); - } // compiler will call Dispose on DaoSession - } - - /// - /// Test Test Using syntax on daoManager.BeginTransaction - /// - [Test] - public void TestUsingTransaction() - { - IAccountDao accountDao = (IAccountDao) daoManager[typeof (IAccountDao)]; - - using (IDalSession session = daoManager.BeginTransaction()) - { - Account account = NewAccount(); - Account account2 = accountDao.GetAccountById(1); - account2.EmailAddress = "someotherAddress@somewhere.com"; - - accountDao.Create(account); - accountDao.Update(account2); - - session.Complete(); // Commit - } // compiler will call Dispose on IDalSession - } - - #endregion - - #region Thread test - - [Test] - public void TestCommonUsageMultiThread() - { - const int threadCount = 10; - - Thread[] threads = new Thread[threadCount]; - - for (int i = 0; i < threadCount; i++) - { - threads[i] = new Thread(new ThreadStart(ExecuteMethodUntilSignal)); - threads[i].Start(); - } - - _startEvent.Set(); - - Thread.CurrentThread.Join(1*2000); - - _stopEvent.Set(); - } - - public void ExecuteMethodUntilSignal() - { - _startEvent.WaitOne(int.MaxValue, false); - - IAccountDao accountDao = daoManager[typeof (IAccountDao)] as IAccountDao; - - while (!_stopEvent.WaitOne(1, false)) - { - Assert.IsFalse(daoManager.IsDaoSessionStarted()); - - Account account = account = accountDao.GetAccountById(1); - - Assert.IsFalse(daoManager.IsDaoSessionStarted()); - - Assert.AreEqual(1, account.Id, "account.Id"); - Assert.AreEqual("Joe", account.FirstName, "account.FirstName"); - Assert.AreEqual("Dalton", account.LastName, "account.LastName"); - } - } - - #endregion - - /// - /// Create a new account with id = 1001 - /// - /// An account - protected Account NewAccount() - { - Account account = new Account(); - account.Id = 1001; - account.FirstName = "Calamity"; - account.LastName = "Jane"; - account.EmailAddress = "Calamity.Jane@somewhere.com"; - return account; - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/MutipleDaoTest.cs b/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/MutipleDaoTest.cs deleted file mode 100644 index 7c202e9..0000000 --- a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/MutipleDaoTest.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System; -using System.Configuration; -using IBatisNet.Common.Transaction; -using IBatisNet.DataAccess.Configuration; -using IBatisNet.DataAccess.Test.Dao.Interfaces; -using IBatisNet.DataAccess.Test.Domain; -using NUnit.Framework; - -namespace IBatisNet.DataAccess.Test.NUnit.DaoTests -{ - /// - /// Summary description for MutipleDaoTest. - /// - [TestFixture] - public class MutipleDaoTest: BaseDaoTest - { - /// - /// An other daoManager - /// - protected DaoManager daoManager2 = null; - - /// - /// Initialisation - /// - [SetUp] - public void SetUp() - { - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); - builder.Configure( "dao"+ "_" + ConfigurationSettings.AppSettings["database"] + "_" - + ConfigurationSettings.AppSettings["providerType"] + ".config" ); - - daoManager = DaoManager.GetInstance("SqlMapDao"); - daoManager2 = DaoManager.GetInstance("NHibernateDao"); - - InitScript( daoManager.LocalDataSource, ScriptDirectory + "account-init.sql" ); - InitScript( daoManager2.LocalDataSource, ScriptDirectory + "user-init.sql" ); - } - - - /// - /// Test Create user - /// - [Test] - [Category("NHibernate")] - public void TestCreateUser () - { - IUserDao userDao = (IUserDao)daoManager2[typeof(IUserDao)]; - - User newUser = new User(); - newUser.Id = "joe_cool"; - newUser.UserName = "Joseph Cool"; - newUser.Password = "abc123"; - newUser.EmailAddress = "joe@cool.com"; - newUser.LastLogon = DateTime.Now; - - try - { - daoManager2.OpenConnection(); - userDao.Create(newUser); - } - catch(Exception e) - { - // Ignore - Console.WriteLine("TestCreateUser, error cause : "+e.Message); - } - finally - { - daoManager2.CloseConnection(); - } - - DateTime stamp = DateTime.Now; - User joeCool = null; - try - { - // open another session to retrieve the just inserted user - daoManager2.OpenConnection(); - - //The User object you get back is live! - joeCool = userDao.Load("joe_cool"); - - Assert.IsNotNull(joeCool); - Assert.AreEqual("Joseph Cool", joeCool.UserName); - - //Change its properties and it will get persisted to the database on Close. - // set Joe Cool's Last Login property - joeCool.LastLogon = stamp; - } - catch(Exception e) - { - // Ignore - Console.WriteLine("TestCreateUser, error cause : "+e.Message); - } - finally - { - // flush the changes from the Session to the Database - daoManager2.CloseConnection(); - } - - daoManager2.OpenConnection(); - //The User object you get back is live! - joeCool = userDao.Load("joe_cool"); - daoManager2.CloseConnection(); - - Assert.IsNotNull(joeCool); - Assert.AreEqual("Joseph Cool", joeCool.UserName); - Assert.AreEqual(stamp.ToString(), joeCool.LastLogon.ToString()); - } - - - /// - /// Test mutiple dao in TransactionScope - /// - [Test] - [Category("MTS")] - [Category("NHibernate")] - public void TestUsingTransactionScope () - { - Account account = NewAccount(); - IAccountDao accountDao = daoManager[typeof(IAccountDao)] as IAccountDao; - IUserDao userDao = daoManager2[typeof(IUserDao)] as IUserDao; - DateTime stamp = DateTime.Now.AddDays(2); - User joeCool = null; - - daoManager.OpenConnection(); - accountDao.Create(account); - daoManager.CloseConnection(); - - User newUser = new User(); - newUser.Id = "joe_cool"; - newUser.UserName = "Joseph Cool"; - newUser.Password = "abc123"; - newUser.EmailAddress = "joe@cool.com"; - newUser.LastLogon = DateTime.Now; - - daoManager2.OpenConnection(); - userDao.Create(newUser); - daoManager2.CloseConnection(); - - using (TransactionScope tx = new TransactionScope()) - { - daoManager.OpenConnection(); - account = accountDao.GetAccountById(1001); - account.FirstName = "TestTransactionScope"; - accountDao.Update(account); - daoManager.CloseConnection(); - - daoManager2.OpenConnection(); - joeCool = userDao.Load("joe_cool"); - joeCool.LastLogon = stamp; - daoManager2.CloseConnection(); - - //tx.Complete(); // not call complte --> RollBack - } - - //---------------------------------------- - daoManager.OpenConnection(); - account = accountDao.GetAccountById(1001); - daoManager.CloseConnection(); - - Assert.IsNotNull(account); - Assert.AreEqual("Calamity.Jane@somewhere.com", account.EmailAddress); - Assert.IsFalse( "TestTransactionScope"==account.FirstName ); - - //---------------- - daoManager2.OpenConnection(); - joeCool = userDao.Load("joe_cool"); - daoManager2.CloseConnection(); - - Assert.IsNotNull(joeCool); - Assert.AreEqual("Joseph Cool", joeCool.UserName); - Assert.IsFalse( stamp.ToString()==joeCool.LastLogon.ToString() ); - } - - - - /// - /// Test Create user - /// - [Test] - [Category("NHibernate")] - public void TestNestedDao() - { - IAccountDao accountDao = daoManager[typeof(IAccountDao)] as IAccountDao; - IUserDao userDao = daoManager2[typeof(IUserDao)] as IUserDao; - DateTime stamp = DateTime.Now.AddDays(2); - User joeCool = null; - User newUser = new User(); - Account account = NewAccount(); - - newUser.Id = "joe_cool"; - newUser.UserName = "Joseph Cool"; - newUser.Password = "abc123"; - newUser.EmailAddress = "joe@cool.com"; - newUser.LastLogon = DateTime.Now; - - daoManager.OpenConnection(); - daoManager2.OpenConnection(); - accountDao.Create(account); - userDao.Create(newUser); - daoManager.CloseConnection(); - daoManager2.CloseConnection(); - - account = null; - daoManager.OpenConnection(); - account = accountDao.GetAccountById(1001); - daoManager.CloseConnection(); - Assert.IsNotNull(account); - Assert.AreEqual("Calamity.Jane@somewhere.com", account.EmailAddress); - - daoManager2.OpenConnection(); - joeCool = userDao.Load("joe_cool"); - daoManager2.CloseConnection(); - - Assert.IsNotNull(joeCool); - Assert.AreEqual("Joseph Cool", joeCool.UserName); - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/NHibernateDaoTest.cs b/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/NHibernateDaoTest.cs deleted file mode 100644 index b32df52..0000000 --- a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/NHibernateDaoTest.cs +++ /dev/null @@ -1,127 +0,0 @@ -// DataSource definition - // ScriptRunner definition -using System; -using System.Configuration; -using System.IO; -using IBatisNet.Common; -using IBatisNet.Common.Utilities; -using IBatisNet.DataAccess.Configuration; -using IBatisNet.DataAccess.Test.Dao.Interfaces; -using IBatisNet.DataAccess.Test.Domain; -using NUnit.Framework; - -namespace IBatisNet.DataAccess.Test.NUnit.DaoTests -{ - /// - /// Summary description for NHibernateDaoTest. - /// - [TestFixture] - public class NHibernateDaoTest - { - /// - /// A daoManager - /// - private static DaoManager _daoManager = null; - - /// - /// Initialisation - /// - [SetUp] - public void SetUp() - { - string scriptDirectory = Path.Combine(Path.Combine(Path.Combine(Path.Combine(Resources.ApplicationBase, ".."), ".."), "Scripts"), ConfigurationSettings.AppSettings["database"]) + Path.DirectorySeparatorChar; -// Resources.RootDirectory + Path.DirectorySeparatorChar + -// "Scripts" + Path.DirectorySeparatorChar + -// ConfigurationSettings.AppSettings["database"]+ Path.DirectorySeparatorChar; - - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); - builder.Configure("dao" + "_" + ConfigurationSettings.AppSettings["database"] + "_" + ConfigurationSettings.AppSettings["providerType"] + ".config"); - - _daoManager = DaoManager.GetInstance("NHibernateDao"); - - InitScript(_daoManager.LocalDataSource, scriptDirectory + "user-init.sql"); - } - - /// - /// Run a sql batch for the datasource. - /// - /// The datasource. - /// The sql batch - protected static void InitScript(DataSource datasource, string script) - { - ScriptRunner runner = new ScriptRunner(); - - runner.RunScript(datasource, script); - } - - /// - /// Test Create user - /// - [Test] - [Category("NHibernate")] - public void TestCreateUser() - { - IUserDao userDao = (IUserDao) _daoManager[typeof (IUserDao)]; - - User newUser = new User(); - newUser.Id = "joe_cool"; - newUser.UserName = "Joseph Cool"; - newUser.Password = "abc123"; - newUser.EmailAddress = "joe@cool.com"; - newUser.LastLogon = DateTime.Now; - - try - { - _daoManager.OpenConnection(); - userDao.Create(newUser); - } - catch (Exception e) - { - // Ignore - Console.WriteLine("TestCreateUser, error cause : " + e.Message); - } - finally - { - _daoManager.CloseConnection(); - } - - DateTime stamp = DateTime.Now; - User joeCool = null; - try - { - // open another session to retrieve the just inserted user - _daoManager.OpenConnection(); - - //The User object you get back is live! - joeCool = userDao.Load("joe_cool"); - - Assert.IsNotNull(joeCool); - Assert.AreEqual("Joseph Cool", joeCool.UserName); - - //Change its properties and it will get persisted to the database on Close. - // set Joe Cool's Last Login property - joeCool.LastLogon = stamp; - } - catch (Exception e) - { - // Ignore - Console.WriteLine("TestCreateUser, error cause : " + e.Message); - } - finally - { - // flush the changes from the Session to the Database - _daoManager.CloseConnection(); - } - - _daoManager.OpenConnection(); - //The User object you get back is live! - joeCool = userDao.Load("joe_cool"); - _daoManager.CloseConnection(); - - Assert.IsNotNull(joeCool); - Assert.AreEqual("Joseph Cool", joeCool.UserName); - Assert.AreEqual(stamp.ToString(), joeCool.LastLogon.ToString()); - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/SqlMapDaoTest.cs b/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/SqlMapDaoTest.cs deleted file mode 100644 index ca0f6ab..0000000 --- a/src/IBatisNet.DataAccess.Test/NUnit/DaoTests/SqlMapDaoTest.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Configuration; -using IBatisNet.DataAccess.Configuration; -using NUnit.Framework; - -namespace IBatisNet.DataAccess.Test.NUnit.DaoTests -{ - /// - /// Summary description for SqlMapDaoTesto. - /// - public class SqlMapDaoTest : BaseDaoTest - { - /// - /// Initialisation - /// - [TestFixtureSetUp] - public void FixtureSetUp() - { - DomDaoManagerBuilder builder = new DomDaoManagerBuilder(); -#if dotnet2 - builder.Configure("dao" + "_" + ConfigurationManager.AppSettings["database"] + "_" - + ConfigurationManager.AppSettings["providerType"] + ".config"); -#else - builder.Configure( "dao"+ "_" + ConfigurationSettings.AppSettings["database"] + "_" - + ConfigurationSettings.AppSettings["providerType"] + ".config" ); -#endif - daoManager = DaoManager.GetInstance("SqlMapDao"); - } - - /// - /// Initialisation - /// - [SetUp] - public void SetUp() - { - InitScript( daoManager.LocalDataSource, ScriptDirectory + "account-init.sql" ); - } - - } -} diff --git a/src/IBatisNet.DataAccess.Test/ReadMe.txt b/src/IBatisNet.DataAccess.Test/ReadMe.txt deleted file mode 100644 index fc2f93b..0000000 --- a/src/IBatisNet.DataAccess.Test/ReadMe.txt +++ /dev/null @@ -1,12 +0,0 @@ - -To pass tests for MS Sql Server ------------------------------- -1/ Create the database with the script 'scripts\MSSQL\DBCreation.sql' - -2/ In 'bin/IBatisNet.Test.dll.config' : - set the database to MSSQL, - set the providerType key to a provider : - - 'SqlClient' to run test via native .Net provider for Sql Server. - - 'Oledb' to run test via Oledb provider for Sql Server. - - 'Odbc' to run test via Odbc provider for Sql Server. - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/DataBase.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/DataBase.sql deleted file mode 100644 index 02a1f4b..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/DataBase.sql +++ /dev/null @@ -1,80 +0,0 @@ -/* Certain queries must be run through ADO since Access does not - recognize some SQL DDL keywords/data types (such as DECIMAL - or DEFAULT) through the Access SQL Query window */ - -drop table ACCOUNTS; - -drop table CATEGORIES; - -drop table ENUMERATIONS; - -drop table LINEITEMS; - -drop table ORDERS; - -drop table OTHERS; - -create table ACCOUNTS -( - [ACCOUNT_ID] long not null, - [ACCOUNT_FIRSTNAME] text(32) not null, - [ACCOUNT_LASTNAME] text(32) not null, - [ACCOUNT_EMAIL] text(128), - constraint pkAccounts - primary key ([ACCOUNT_ID]) -); - -create table CATEGORIES -( - [CATEGORY_ID] counter not null, - [CATEGORY_NAME] text(32), - [CATEGORY_GUID] guid, - constraint pkCategories - primary key ([CATEGORY_ID]) -); - -create table ENUMERATIONS -( - [ENUM_ID] long not null, - [ENUM_DAY] long not null, - [ENUM_COLOR] long not null, - [ENUM_MONTH] long, - constraint pkEnumerations - primary key ([ENUM_ID]) -); - -create table LINEITEMS -( - [LINEITEM_ID] long not null, - [ORDER_ID] long not null, - [LINEITEM_CODE] text(32) not null, - [LINEITEM_QUANTITY] long not null, - [LINEITEM_PRICE] decimal(18,2), - [LINEITEM_PICTURE] longbinary, - constraint pkLineItems - primary key ([ORDER_ID], [LINEITEM_ID]) -); - -create table ORDERS -( - [ORDER_ID] long not null, - [ACCOUNT_ID] long not null, - [ORDER_DATE] datetime, - [ORDER_CARDTYPE] text(32), - [ORDER_CARDNUMBER] text(32), - [ORDER_CARDEXPIRY] text(32), - [ORDER_STREET] text(32), - [ORDER_CITY] text(32), - [ORDER_PROVINCE] text(32), - [ORDER_POSTALCODE] text(32), - [ORDER_FAVOURITELINEITEM] long, - constraint pkOrders - primary key ([ORDER_ID]) -); - -create table OTHERS -( - OTHER_INT long, - OTHER_LONG decimal -); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/DataBaseNHibernate.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/DataBaseNHibernate.sql deleted file mode 100644 index cdb212a..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/DataBaseNHibernate.sql +++ /dev/null @@ -1,16 +0,0 @@ -/* Certain queries must be run through ADO since Access does not - recognize some SQL DDL keywords/data types (such as DECIMAL - or DEFAULT) through the Access SQL Query window */ - -drop table USERS; - -create table USERS -( - [LOGONID] text(20) not null default 0, - [NAME] text(40) default null, - [PASSWORD] text(20) default null, - [EMAILADDRESS] text(40) default null, - [LASTLOGON] datetime default null, - constraint pkUsers - primary key ([LOGONID]) -); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/account-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/account-init.sql deleted file mode 100644 index 50e2776..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/account-init.sql +++ /dev/null @@ -1,17 +0,0 @@ -drop table ACCOUNTS; - -create table ACCOUNTS -( - [ACCOUNT_ID] long not null, - [ACCOUNT_FIRSTNAME] text(32) not null, - [ACCOUNT_LASTNAME] text(32) not null, - [ACCOUNT_EMAIL] text(128), - constraint pkAccounts - primary key ([ACCOUNT_ID]) -); - -INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(3,'William', 'Dalton', null); -INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null); \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/account-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/account-procedure.sql deleted file mode 100644 index 12c2522..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/account-procedure.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT NULL; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/category-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/category-init.sql deleted file mode 100644 index bd3eff2..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/category-init.sql +++ /dev/null @@ -1,10 +0,0 @@ -drop table CATEGORIES; - -create table CATEGORIES -( - [CATEGORY_ID] counter not null, - [CATEGORY_NAME] text(32), - [CATEGORY_GUID] guid, - constraint pkCategories - primary key ([CATEGORY_ID]) -); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/category-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/category-procedure.sql deleted file mode 100644 index 12c2522..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/category-procedure.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT NULL; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/documents-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/documents-init.sql deleted file mode 100644 index b81c6ca..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/documents-init.sql +++ /dev/null @@ -1,19 +0,0 @@ -drop table DOCUMENTS; - -create table DOCUMENTS -( - [DOCUMENT_ID] long not null, - [DOCUMENT_TITLE] text(32), - [DOCUMENT_TYPE] text(32), - [DOCUMENT_PAGENUMBER] long, - [DOCUMENT_CITY] text(32), - constraint pkAccounts - primary key ([DOCUMENT_ID]) -); - -INSERT INTO Documents VALUES (1, 'The World of Null-A', 'Book', 55, null); -INSERT INTO Documents VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon'); -INSERT INTO Documents VALUES (3, 'Lord of the Rings', 'Book', 3587, null); -INSERT INTO Documents VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris'); -INSERT INTO Documents VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris'); -INSERT INTO Documents VALUES (6, 'Foundation', 'Monograph', 557, null); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/enumeration-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/enumeration-init.sql deleted file mode 100644 index 0e3d8c0..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/enumeration-init.sql +++ /dev/null @@ -1,16 +0,0 @@ -drop table ENUMERATIONS; - -create table ENUMERATIONS -( - [ENUM_ID] long not null, - [ENUM_DAY] long not null, - [ENUM_COLOR] long not null, - [ENUM_MONTH] long, - constraint pkEnumerations - primary key ([ENUM_ID]) -); - -INSERT INTO Enumerations VALUES(1, 1, 1, 128); -INSERT INTO Enumerations VALUES(2, 2, 2, 2048); -INSERT INTO Enumerations VALUES(3, 3, 4, 256); -INSERT INTO Enumerations VALUES(4, 4, 8, null); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/line-item-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/line-item-init.sql deleted file mode 100644 index 2214f25..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/line-item-init.sql +++ /dev/null @@ -1,35 +0,0 @@ -drop table LINEITEMS; - -create table LINEITEMS -( - [LINEITEM_ID] long not null, - [ORDER_ID] long not null, - [LINEITEM_CODE] text(32) not null, - [LINEITEM_QUANTITY] long not null, - [LINEITEM_PRICE] decimal(18,2), - [LINEITEM_PICTURE] longbinary, - constraint pkLineItems - primary key ([ORDER_ID], [LINEITEM_ID]) -); - -INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null); -INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null); -INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null); -INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null); -INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null); -INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null); -INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null); -INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null); -INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null); -INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null); -INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null); -INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null); -INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null); -INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null); -INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null); -INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null); -INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null); -INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null); -INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null); -INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/more-account-records.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/more-account-records.sql deleted file mode 100644 index 847bb52..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/more-account-records.sql +++ /dev/null @@ -1,6 +0,0 @@ -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/order-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/order-init.sql deleted file mode 100644 index d540562..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/order-init.sql +++ /dev/null @@ -1,30 +0,0 @@ -drop table ORDERS; - -create table ORDERS -( - [ORDER_ID] long not null, - [ACCOUNT_ID] long not null, - [ORDER_DATE] datetime, - [ORDER_CARDTYPE] text(32), - [ORDER_CARDNUMBER] text(32), - [ORDER_CARDEXPIRY] text(32), - [ORDER_STREET] text(32), - [ORDER_CITY] text(32), - [ORDER_PROVINCE] text(32), - [ORDER_POSTALCODE] text(32), - [ORDER_FAVOURITELINEITEM] long, - constraint pkOrders - primary key ([ORDER_ID]) -); - -INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/other-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/other-init.sql deleted file mode 100644 index 2acb011..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/other-init.sql +++ /dev/null @@ -1,10 +0,0 @@ -drop table OTHERS; - -create table OTHERS -( - OTHER_INT long, - OTHER_LONG decimal -); - -INSERT INTO Others VALUES(1, 8888888); -INSERT INTO Others VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/swap-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/swap-procedure.sql deleted file mode 100644 index 12c2522..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/swap-procedure.sql +++ /dev/null @@ -1 +0,0 @@ -SELECT NULL; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Access/user-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Access/user-init.sql deleted file mode 100644 index 00d9f6d..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Access/user-init.sql +++ /dev/null @@ -1,12 +0,0 @@ -drop table USERS; - -create table USERS -( - [LOGONID] text(20) not null default 0, - [NAME] text(40) default null, - [PASSWORD] text(20) default null, - [EMAILADDRESS] text(40) default null, - [LASTLOGON] datetime default null, - constraint pkUsers - primary key ([LOGONID]) -); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DBCreation.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DBCreation.sql deleted file mode 100644 index b4e017d..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DBCreation.sql +++ /dev/null @@ -1,89 +0,0 @@ --- MSQL DATABASE - -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet') - DROP DATABASE [IBatisNet] -GO - -CREATE DATABASE [IBatisNet] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'IBatisNet', N'autoclose', N'true' -GO - -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false' -GO - -exec sp_dboption N'IBatisNet', N'trunc. log', N'true' -GO - -exec sp_dboption N'IBatisNet', N'torn page detection', N'true' -GO - -exec sp_dboption N'IBatisNet', N'read only', N'false' -GO - -exec sp_dboption N'IBatisNet', N'dbo use', N'false' -GO - -exec sp_dboption N'IBatisNet', N'single', N'false' -GO - -exec sp_dboption N'IBatisNet', N'autoshrink', N'true' -GO - -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false' -GO - -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false' -GO - -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false' -GO - -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true' -GO - -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'IBatisNet', N'db chaining', N'false' -GO - -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') - exec sp_droplogin N'IBatisNet' -GO - -use [IBatisNet] -GO - -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english' - exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382) - EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet' -GO - -exec sp_addrolemember N'db_owner', N'IBatisNet' -GO \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DataBase.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DataBase.sql deleted file mode 100644 index 75a1f97..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/DataBase.sql +++ /dev/null @@ -1,179 +0,0 @@ --- MSQL DATABASE 'IBatisNet' - -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet') - DROP DATABASE [IBatisNet] -GO - -CREATE DATABASE [IBatisNet] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'IBatisNet', N'autoclose', N'true' -GO - -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false' -GO - -exec sp_dboption N'IBatisNet', N'trunc. log', N'true' -GO - -exec sp_dboption N'IBatisNet', N'torn page detection', N'true' -GO - -exec sp_dboption N'IBatisNet', N'read only', N'false' -GO - -exec sp_dboption N'IBatisNet', N'dbo use', N'false' -GO - -exec sp_dboption N'IBatisNet', N'single', N'false' -GO - -exec sp_dboption N'IBatisNet', N'autoshrink', N'true' -GO - -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false' -GO - -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false' -GO - -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false' -GO - -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false' -GO - -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true' -GO - -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'IBatisNet', N'db chaining', N'false' -GO - -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') - exec sp_droplogin N'IBatisNet' -GO - -use [IBatisNet] -GO - -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english' - exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382) - EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet' -GO - -exec sp_addrolemember N'db_owner', N'IBatisNet' -GO - --- MSQL DATABASE 'NHibernate' - -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'NHibernate') - DROP DATABASE [NHibernate] -GO - -CREATE DATABASE [NHibernate] - COLLATE Latin1_General_CI_AS -GO - -exec sp_dboption N'NHibernate', N'autoclose', N'true' -GO - -exec sp_dboption N'NHibernate', N'bulkcopy', N'false' -GO - -exec sp_dboption N'NHibernate', N'trunc. log', N'true' -GO - -exec sp_dboption N'NHibernate', N'torn page detection', N'true' -GO - -exec sp_dboption N'NHibernate', N'read only', N'false' -GO - -exec sp_dboption N'NHibernate', N'dbo use', N'false' -GO - -exec sp_dboption N'NHibernate', N'single', N'false' -GO - -exec sp_dboption N'NHibernate', N'autoshrink', N'true' -GO - -exec sp_dboption N'NHibernate', N'ANSI null default', N'false' -GO - -exec sp_dboption N'NHibernate', N'recursive triggers', N'false' -GO - -exec sp_dboption N'NHibernate', N'ANSI nulls', N'false' -GO - -exec sp_dboption N'NHibernate', N'concat null yields null', N'false' -GO - -exec sp_dboption N'NHibernate', N'cursor close on commit', N'false' -GO - -exec sp_dboption N'NHibernate', N'default to local cursor', N'false' -GO - -exec sp_dboption N'NHibernate', N'quoted identifier', N'false' -GO - -exec sp_dboption N'NHibernate', N'ANSI warnings', N'false' -GO - -exec sp_dboption N'NHibernate', N'auto create statistics', N'true' -GO - -exec sp_dboption N'NHibernate', N'auto update statistics', N'true' -GO - -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) ) - exec sp_dboption N'NHibernate', N'db chaining', N'false' -GO - -if exists (select * from master.dbo.syslogins where loginname = N'NHibernate') - exec sp_droplogin N'NHibernate' -GO - -use [NHibernate] -GO - -if not exists (select * from master.dbo.syslogins where loginname = N'NHibernate') -BEGIN - declare @logindb nvarchar(132), @loginpass nvarchar(132), @loginlang nvarchar(132) - select @logindb = N'NHibernate', @loginpass=N'test', @loginlang = N'us_english' - exec sp_addlogin N'NHibernate', @loginpass, @logindb, @loginlang -END -GO - -if not exists (select * from dbo.sysusers where name = N'NHibernate' and uid < 16382) - EXEC sp_grantdbaccess N'NHibernate', N'NHibernate' -GO - -exec sp_addrolemember N'db_owner', N'NHibernate' -GO \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-init.sql deleted file mode 100644 index 4b8e3ec..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-init.sql +++ /dev/null @@ -1,47 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Accounts]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Accounts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) - ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Accounts - - drop table [dbo].[Accounts] -END - -CREATE TABLE [dbo].[Accounts] ( - [Account_ID] [int] NOT NULL , - [Account_FirstName] [varchar] (32) NOT NULL , - [Account_LastName] [varchar] (32) NOT NULL , - [Account_Email] [varchar] (128) NULL, - [Account_Banner_Option] [varchar] (255), - [Account_Cart_Option] [int] -) ON [PRIMARY] - -ALTER TABLE [dbo].[Accounts] WITH NOCHECK ADD - CONSTRAINT [PK_Account] PRIMARY KEY CLUSTERED - ( - [Account_ID] - ) ON [PRIMARY] - --- Creating Test Data - -INSERT INTO [dbo].[Accounts] VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200); -INSERT INTO [dbo].[Accounts] VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200); -INSERT INTO [dbo].[Accounts] VALUES(3,'William', 'Dalton', null, 'Non', 100); -INSERT INTO [dbo].[Accounts] VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100); -INSERT INTO [dbo].[Accounts] VALUES(5,'Gilles', 'Bayon', null, 'Oui', 100); - --- Store procedure - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[ps_InsertAccount] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[ps_SelectAccount] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_swap_email_address]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[ps_swap_email_address] - - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-procedure.sql deleted file mode 100644 index 292c5f1..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/account-procedure.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE PROCEDURE dbo.[sp_InsertAccount] -@Account_ID [int], -@Account_FirstName [nvarchar] (40), -@Account_LastName [varchar] (32), -@Account_Email [varchar] (128) -AS -insert into Accounts - (Account_ID, Account_FirstName, Account_LastName, Account_Email) -values - (@Account_ID, @Account_FirstName, @Account_LastName, @Account_Email) - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-init.sql deleted file mode 100644 index 3dbd888..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-init.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[Categories] - -CREATE TABLE [dbo].[Categories] ( - [Category_Id] [int] IDENTITY (1, 1) NOT NULL , - [Category_Name] [varchar] (32) NULL, - [Category_Guid] [uniqueidentifier] NULL -) ON [PRIMARY] - --- Store procedure - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_InsertCategorie]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) -drop procedure [dbo].[sp_InsertCategorie] diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-procedure.sql deleted file mode 100644 index b6202a4..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/category-procedure.sql +++ /dev/null @@ -1,10 +0,0 @@ -CREATE PROCEDURE dbo.[sp_InsertCategorie] -@Category_Id [int] output, -@Category_Name [varchar] (32), -@Category_Guid [uniqueidentifier] -AS -insert into Categories - (Category_Name, Category_Guid ) -values - (@Category_Name, @Category_Guid) -SELECT @Category_Id = SCOPE_IDENTITY() \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/enumeration-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/enumeration-init.sql deleted file mode 100644 index 65b1e26..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/enumeration-init.sql +++ /dev/null @@ -1,30 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Enumerations]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - drop table [dbo].[Enumerations] -END - -CREATE TABLE [dbo].[Enumerations] ( - [Enum_ID] [int] NOT NULL , - [Enum_Day] [int] NOT NULL , - [Enum_Color] [int] NOT NULL, - [Enum_Month] [int] NULL -) ON [PRIMARY] - -ALTER TABLE [dbo].[Enumerations] WITH NOCHECK ADD - CONSTRAINT [PK_Enum] PRIMARY KEY CLUSTERED - ( - [Enum_ID] - ) ON [PRIMARY] - --- Creating Test Data - -INSERT INTO [dbo].[Enumerations] VALUES(1, 1, 1, 128); -INSERT INTO [dbo].[Enumerations] VALUES(2, 2, 2, 2048); -INSERT INTO [dbo].[Enumerations] VALUES(3, 3, 4, 256); -INSERT INTO [dbo].[Enumerations] VALUES(4, 4, 8, null); - - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/line-item-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/line-item-init.sql deleted file mode 100644 index e25a49d..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/line-item-init.sql +++ /dev/null @@ -1,53 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LineItems]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -drop table [dbo].[LineItems] - -CREATE TABLE [dbo].[LineItems] ( - [LineItem_ID] [int] NOT NULL , - [Order_ID] [int] NOT NULL , - [LineItem_Code] [varchar] (32) NOT NULL , - [LineItem_Quantity] [int] NOT NULL , - [LineItem_Price] [decimal](18, 2) NULL, - [LineItem_Picture] [image] null -) ON [PRIMARY] - -ALTER TABLE [dbo].[LineItems] WITH NOCHECK ADD - CONSTRAINT [PK_LinesItem] PRIMARY KEY CLUSTERED - ( - [LineItem_ID], - [Order_ID] - ) ON [PRIMARY] - -ALTER TABLE [dbo].[LineItems] ADD - CONSTRAINT [FK_LineItems_Orders] FOREIGN KEY - ( - [Order_ID] - ) REFERENCES [dbo].[Orders] ( - [Order_ID] - ) --- Creating Test Data - -INSERT INTO [dbo].[LineItems] VALUES (1, 10, 'ESM-34', 1, 45.43, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 10, 'QSM-98', 8, 8.40, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 9, 'DSM-78', 2, 45.40, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 9, 'TSM-12', 2, 32.12, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 8, 'DSM-16', 4, 41.30, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 8, 'GSM-65', 1, 2.20, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 7, 'WSM-27', 7, 52.10, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 7, 'ESM-23', 2, 123.34, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 6, 'QSM-39', 9, 12.12, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 6, 'ASM-45', 6, 78.77, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 5, 'ESM-48', 3, 43.87, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 5, 'WSM-98', 7, 5.40, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 4, 'RSM-57', 2, 78.90, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 4, 'XSM-78', 9, 2.34, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 3, 'DSM-59', 3, 5.70, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 3, 'DSM-53', 3, 98.78, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 2, 'DSM-37', 4, 7.80, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 2, 'FSM-12', 2, 55.78, null); -INSERT INTO [dbo].[LineItems] VALUES (1, 1, 'ESM-48', 8, 87.60, null); -INSERT INTO [dbo].[LineItems] VALUES (2, 1, 'ESM-23', 1, 55.40, null); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/more-account-records.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/more-account-records.sql deleted file mode 100644 index c7dc605..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/more-account-records.sql +++ /dev/null @@ -1,11 +0,0 @@ - - - --- Creating Test Data - -INSERT INTO [dbo].[Accounts] VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO [dbo].[Accounts] VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO [dbo].[Accounts] VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO [dbo].[Accounts] VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO [dbo].[Accounts] VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/order-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/order-init.sql deleted file mode 100644 index 648eda6..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/order-init.sql +++ /dev/null @@ -1,53 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1) - ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders - - drop table [dbo].[Orders] -END - -CREATE TABLE [dbo].[Orders] ( - [Order_ID] [int] NOT NULL , - [Account_ID] [int] NOT NULL , - [Order_Date] [datetime] NULL , - [Order_CardType] [varchar] (32) NULL , - [Order_CardNumber] [varchar] (32) NULL , - [Order_CardExpiry] [varchar] (32) NULL , - [Order_Street] [varchar] (32) NULL , - [Order_City] [varchar] (32) NULL , - [Order_Province] [varchar] (32) NULL , - [Order_PostalCode] [varchar] (32) NULL , - [Order_FavouriteLineItem] [int] NULL -) ON [PRIMARY] - -ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD - CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED - ( - [Order_ID] - ) ON [PRIMARY] - - -ALTER TABLE [dbo].[Orders] ADD - CONSTRAINT [FK_Orders_Accounts] FOREIGN KEY - ( - [Account_ID] - ) REFERENCES [dbo].[Accounts] ( - [Account_ID] - ) --- Creating Test Data -- 2003-02-15 8:15:00/ 2003-02-15 8:15:00 - -INSERT INTO [dbo].[Orders] VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO [dbo].[Orders] VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO [dbo].[Orders] VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO [dbo].[Orders] VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO [dbo].[Orders] VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO [dbo].[Orders] VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO [dbo].[Orders] VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO [dbo].[Orders] VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO [dbo].[Orders] VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO [dbo].[Orders] VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/other-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/other-init.sql deleted file mode 100644 index eaff2e2..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/other-init.sql +++ /dev/null @@ -1,18 +0,0 @@ --- Creating Table - -use [IBatisNet] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Others]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - drop table [dbo].[Others] -END - -CREATE TABLE [dbo].[Others] ( - [Other_Int] [int] NULL , - [Other_Long] [BigInt] NULL -) ON [PRIMARY] - --- Creating Test Data - -INSERT INTO [dbo].[Others] VALUES(1, 8888888); -INSERT INTO [dbo].[Others] VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/swap-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/swap-procedure.sql deleted file mode 100644 index 981ffc5..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/swap-procedure.sql +++ /dev/null @@ -1,34 +0,0 @@ -CREATE PROCEDURE dbo.[ps_swap_email_address] -@First_Email [nvarchar] (64) output, -@Second_Email [nvarchar] (64) output -AS - -Declare @ID1 int -Declare @ID2 int - -Declare @Email1 [nvarchar] (64) -Declare @Email2 [nvarchar] (64) - - SELECT @ID1 = Account_ID, @Email1 = Account_Email - from Accounts - where Account_Email = @First_Email - - SELECT @ID2 = Account_ID, @Email2 = Account_Email - from Accounts - where Account_Email = @Second_Email - - UPDATE Accounts - set Account_Email = @Email2 - where Account_ID = @ID1 - - UPDATE Accounts - set Account_Email = @Email1 - where Account_ID = @ID2 - - SELECT @First_Email = Account_Email - from Accounts - where Account_ID = @ID1 - - SELECT @Second_Email = Account_Email - from Accounts - where Account_ID = @ID2 diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/user-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/user-init.sql deleted file mode 100644 index 7551da4..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MSSQL/user-init.sql +++ /dev/null @@ -1,17 +0,0 @@ --- Creating Table - -use [NHibernate] - -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) -BEGIN - drop table [dbo].[Users] -END - -CREATE TABLE [dbo].[Users] ( - LogonID nvarchar(20) NOT NULL default '0', - Name nvarchar(40) default NULL, - Password nvarchar(20) default NULL, - EmailAddress nvarchar(40) default NULL, - LastLogon datetime default NULL, - PRIMARY KEY (LogonID) -) diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/DataBase.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/DataBase.sql deleted file mode 100644 index 989f260..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/DataBase.sql +++ /dev/null @@ -1,132 +0,0 @@ -use mysql; - -drop database iBatisNet; -create database iBatisNet; - -drop database NHibernate; -create database NHibernate; - -grant all privileges on iBatisNet.* to IBatisNet@'%' identified by 'test'; -grant all privileges on iBatisNet.* to IBatisNet@localhost identified by 'test'; -grant all privileges on iBatisNet.* to IBatisNet@localhost.localdomain identified by 'test'; - -grant all privileges on NHibernate.* to NHibernate@'%' identified by 'test'; -grant all privileges on NHibernate.* to NHibernate@localhost identified by 'test'; -grant all privileges on NHibernate.* to NHibernate@localhost.localdomain identified by 'test'; - - -/*==============================================================*/ -/* Nom de la base : MYSQL */ -/* Nom de SGBD : MySQL 3.23 */ -/* Date de cration : 27/05/2004 20:51:40 */ -/*==============================================================*/ - -use iBatisNet; - -drop table if exists ACCOUNTS; - -drop table if exists CATEGORIES; - -drop table if exists ENUMERATIONS; - -drop table if exists LINEITEMS; - -drop table if exists ORDERS; - -drop table if exists OTHERS; - -/*==============================================================*/ -/* Table : ACCOUNTS */ -/*==============================================================*/ -create table ACCOUNTS -( - ACCOUNT_ID int not null, - ACCOUNT_FIRSTNAME varchar(32) not null, - ACCOUNT_LASTNAME varchar(32) not null, - ACCOUNT_EMAIL varchar(128), - primary key (ACCOUNT_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : CATEGORIES */ -/*==============================================================*/ -create table CATEGORIES -( - CATEGORY_ID int not null AUTO_INCREMENT, - CATEGORY_NAME varchar(32), - CATEGORY_GUID varchar(36), - primary key (CATEGORY_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : ENUMERATIONS */ -/*==============================================================*/ -create table ENUMERATIONS -( - ENUM_ID int not null, - ENUM_DAY int not null, - ENUM_COLOR int not null, - ENUM_MONTH int, - primary key (ENUM_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : LINEITEMS */ -/*==============================================================*/ -create table LINEITEMS -( - LINEITEM_ID int not null, - ORDER_ID int not null, - LINEITEM_CODE varchar(32) not null, - LINEITEM_QUANTITY int not null, - LINEITEM_PRICE decimal(18,2), - LINEITEM_PICTURE blob, - primary key (ORDER_ID, LINEITEM_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : ORDERS */ -/*==============================================================*/ -create table ORDERS -( - ORDER_ID int not null, - ACCOUNT_ID int not null, - ORDER_DATE datetime, - ORDER_CARDTYPE varchar(32), - ORDER_CARDNUMBER varchar(32), - ORDER_CARDEXPIRY varchar(32), - ORDER_STREET varchar(32), - ORDER_CITY varchar(32), - ORDER_PROVINCE varchar(32), - ORDER_POSTALCODE varchar(32), - ORDER_FAVOURITELINEITEM int, - primary key (ORDER_ID) -) TYPE=INNODB; - -/*==============================================================*/ -/* Table : OTHERS */ -/*==============================================================*/ -create table OTHERS -( - OTHER_INT int, - OTHER_LONG bigint -) TYPE=INNODB; - - - -use NHibernate; - -drop table if exists USERS; - -/*==============================================================*/ -/* Table : USERS */ -/*==============================================================*/ -create table USERS -( - LOGONID varchar(20) not null default '0', - NAME varchar(40) default null, - PASSWORD varchar(20) default null, - EMAILADDRESS varchar(40) default null, - LASTLOGON datetime default null, - primary key (LOGONID) -) TYPE=INNODB; diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/account-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/account-init.sql deleted file mode 100644 index bedca8d..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/account-init.sql +++ /dev/null @@ -1,18 +0,0 @@ -use iBatisNet; - -drop table if exists ACCOUNTS; - -create table ACCOUNTS -( - ACCOUNT_ID int not null, - ACCOUNT_FIRSTNAME varchar(32) not null, - ACCOUNT_LASTNAME varchar(32) not null, - ACCOUNT_EMAIL varchar(128), - primary key (ACCOUNT_ID) -) TYPE=INNODB; - -INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(3,'William', 'Dalton', null); -INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com'); -INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null); \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/account-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/account-procedure.sql deleted file mode 100644 index ea067ad..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/account-procedure.sql +++ /dev/null @@ -1,2 +0,0 @@ - -use iBatisNet; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/category-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/category-init.sql deleted file mode 100644 index 20021b2..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/category-init.sql +++ /dev/null @@ -1,12 +0,0 @@ - -use iBatisNet; - -drop table if exists CATEGORIES; - -create table CATEGORIES -( - CATEGORY_ID int not null AUTO_INCREMENT, - CATEGORY_NAME varchar(32), - CATEGORY_GUID varchar(36), - primary key (CATEGORY_ID) -) TYPE=INNODB; diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/category-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/category-procedure.sql deleted file mode 100644 index ea067ad..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/category-procedure.sql +++ /dev/null @@ -1,2 +0,0 @@ - -use iBatisNet; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/enumeration-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/enumeration-init.sql deleted file mode 100644 index 3b3de8d..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/enumeration-init.sql +++ /dev/null @@ -1,18 +0,0 @@ - -use iBatisNet; - -drop table if exists ENUMERATIONS; - -create table ENUMERATIONS -( - ENUM_ID int not null, - ENUM_DAY int not null, - ENUM_COLOR int not null, - ENUM_MONTH int, - primary key (ENUM_ID) -) TYPE=INNODB; - -INSERT INTO Enumerations VALUES(1, 1, 1, 128); -INSERT INTO Enumerations VALUES(2, 2, 2, 2048); -INSERT INTO Enumerations VALUES(3, 3, 4, 256); -INSERT INTO Enumerations VALUES(4, 4, 8, null); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/line-item-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/line-item-init.sql deleted file mode 100644 index b7c8f7d..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/line-item-init.sql +++ /dev/null @@ -1,37 +0,0 @@ - -use iBatisNet; - -drop table if exists LINEITEMS; - -create table LINEITEMS -( - LINEITEM_ID int not null, - ORDER_ID int not null, - LINEITEM_CODE varchar(32) not null, - LINEITEM_QUANTITY int not null, - LINEITEM_PRICE decimal(18,2), - LINEITEM_PICTURE blob, - primary key (ORDER_ID, LINEITEM_ID) -) TYPE=INNODB; - -INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null); -INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null); -INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null); -INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null); -INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null); -INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null); -INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null); -INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null); -INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null); -INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null); -INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null); -INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null); -INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null); -INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null); -INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null); -INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null); -INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null); -INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null); -INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null); -INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/more-account-records.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/more-account-records.sql deleted file mode 100644 index b399b8c..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/more-account-records.sql +++ /dev/null @@ -1,7 +0,0 @@ - -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/order-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/order-init.sql deleted file mode 100644 index 87aa370..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/order-init.sql +++ /dev/null @@ -1,29 +0,0 @@ -drop table if exists ORDERS; - -create table ORDERS -( - ORDER_ID int not null, - ACCOUNT_ID int not null, - ORDER_DATE datetime, - ORDER_CARDTYPE varchar(32), - ORDER_CARDNUMBER varchar(32), - ORDER_CARDEXPIRY varchar(32), - ORDER_STREET varchar(32), - ORDER_CITY varchar(32), - ORDER_PROVINCE varchar(32), - ORDER_POSTALCODE varchar(32), - ORDER_FAVOURITELINEITEM int, - primary key (ORDER_ID) -) TYPE=INNODB; - -INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/other-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/other-init.sql deleted file mode 100644 index bc7375c..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/other-init.sql +++ /dev/null @@ -1,13 +0,0 @@ - -use iBatisNet; - -drop table if exists OTHERS; - -create table OTHERS -( - OTHER_INT int, - OTHER_LONG bigint -) TYPE=INNODB; - -INSERT INTO Others VALUES(1, 8888888); -INSERT INTO Others VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/swap-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/swap-procedure.sql deleted file mode 100644 index ea067ad..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/swap-procedure.sql +++ /dev/null @@ -1,2 +0,0 @@ - -use iBatisNet; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/MySql/user-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/MySql/user-init.sql deleted file mode 100644 index db947b5..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/MySql/user-init.sql +++ /dev/null @@ -1,14 +0,0 @@ - -use NHibernate; - -drop table if exists USERS; - -create table USERS -( - LOGONID varchar(20) not null default '0', - NAME varchar(40) default null, - PASSWORD varchar(20) default null, - EMAILADDRESS varchar(40) default null, - LASTLOGON datetime default null, - primary key (LOGONID) -) TYPE=INNODB; diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBase.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBase.sql deleted file mode 100644 index 6d8f454..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBase.sql +++ /dev/null @@ -1,128 +0,0 @@ -/*==============================================================*/ -/* Nom de la base : ORACLE */ -/* Nom de SGBD : ORACLE Version 9i */ -/* Date de cration : 27/05/2004 20:55:37 */ -/*==============================================================*/ - - -DROP TABLE ACCOUNTS CASCADE CONSTRAINTS; - -DROP TABLE CATEGORIES CASCADE CONSTRAINTS; - -DROP TABLE ENUMERATIONS CASCADE CONSTRAINTS; - -DROP TABLE LINEITEMS CASCADE CONSTRAINTS; - -DROP TABLE ORDERS CASCADE CONSTRAINTS; - -DROP TABLE OTHERS CASCADE CONSTRAINTS; - -DROP SEQUENCE S_CATEGORIES; - -CREATE SEQUENCE S_CATEGORIES - START WITH 1 - MAXVALUE 1E27 - MINVALUE 1 - NOCYCLE - CACHE 20 - NOORDER; - -/*==============================================================*/ -/* Table : ACCOUNTS */ -/*==============================================================*/ - - -CREATE TABLE ACCOUNTS ( - ACCOUNT_ID INTEGER NOT NULL, - ACCOUNT_FIRSTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_LASTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_EMAIL VARCHAR2(128), - CONSTRAINT PK_ACCOUNTS PRIMARY KEY (ACCOUNT_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : CATEGORIES */ -/*==============================================================*/ - - -CREATE TABLE CATEGORIES ( - CATEGORY_ID NUMBER(6) NOT NULL, - CATEGORY_NAME VARCHAR2(32), - CATEGORY_GUID VARCHAR2(36) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : ENUMERATIONS */ -/*==============================================================*/ - - -CREATE TABLE ENUMERATIONS ( - ENUM_ID INTEGER NOT NULL, - ENUM_DAY INTEGER NOT NULL, - ENUM_COLOR INTEGER NOT NULL, - ENUM_MONTH INTEGER, - CONSTRAINT PK_ENUMERATIONS PRIMARY KEY (ENUM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : LINEITEMS */ -/*==============================================================*/ - - -CREATE TABLE LINEITEMS ( - LINEITEM_ID INTEGER NOT NULL, - ORDER_ID INTEGER NOT NULL, - LINEITEM_CODE VARCHAR2(32) NOT NULL, - LINEITEM_QUANTITY INTEGER NOT NULL, - LINEITEM_PRICE NUMBER(18,2), - LINEITEM_PICTURE BLOB, - CONSTRAINT PK_LINEITEMS PRIMARY KEY (ORDER_ID, LINEITEM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : ORDERS */ -/*==============================================================*/ - - -CREATE TABLE ORDERS ( - ORDER_ID INTEGER NOT NULL, - ACCOUNT_ID INTEGER NOT NULL, - ORDER_DATE DATE, - ORDER_CARDTYPE VARCHAR2(32), - ORDER_CARDNUMBER VARCHAR2(32), - ORDER_CARDEXPIRY VARCHAR2(32), - ORDER_STREET VARCHAR2(32), - ORDER_CITY VARCHAR2(32), - ORDER_PROVINCE VARCHAR2(32), - ORDER_POSTALCODE VARCHAR2(32), - ORDER_FAVOURITELINEITEM INTEGER, - CONSTRAINT PK_ORDERS PRIMARY KEY (ORDER_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -/*==============================================================*/ -/* Table : OTHERS */ -/*==============================================================*/ - - -CREATE TABLE OTHERS ( - OTHER_INT INT NULL , - OTHER_LONG INT NULL -) -NOLOGGING -NOCACHE -NOPARALLEL; diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBaseNHibernate.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBaseNHibernate.sql deleted file mode 100644 index 966675b..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/DataBaseNHibernate.sql +++ /dev/null @@ -1,17 +0,0 @@ -DROP TABLE USERS; - -/*==============================================================*/ -/* Table : USERS */ -/*==============================================================*/ - -CREATE TABLE USERS ( - LOGONID NVARCHAR2(20) DEFAULT '0', - NAME NVARCHAR2(40) DEFAULT NULL, - PASSWORD NVARCHAR2(20) DEFAULT NULL, - EMAILADDRESS NVARCHAR2(40) DEFAULT NULL, - LASTLOGON DATE DEFAULT NULL, - CONSTRAINT PK_USERS PRIMARY KEY (LOGONID) -) -NOLOGGING -NOCACHE -NOPARALLEL; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-init.sql deleted file mode 100644 index 7289fdc..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-init.sql +++ /dev/null @@ -1,18 +0,0 @@ -DROP TABLE ACCOUNTS CASCADE CONSTRAINTS; - -CREATE TABLE ACCOUNTS ( - ACCOUNT_ID INTEGER NOT NULL, - ACCOUNT_FIRSTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_LASTNAME VARCHAR2(32) NOT NULL, - ACCOUNT_EMAIL VARCHAR2(128), - CONSTRAINT PK_ACCOUNTS PRIMARY KEY (ACCOUNT_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO ACCOUNTS VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com'); -INSERT INTO ACCOUNTS VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com'); -INSERT INTO ACCOUNTS VALUES(3,'William', 'Dalton', null); -INSERT INTO ACCOUNTS VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com'); -INSERT INTO ACCOUNTS VALUES(5,'Gilles', 'Bayon', null); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-procedure.sql deleted file mode 100644 index 837bb17..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/account-procedure.sql +++ /dev/null @@ -1,18 +0,0 @@ -CREATE OR REPLACE PROCEDURE prc_InsertAccount ( - p_Account_ID IN INTEGER, - p_Account_FirstName IN VARCHAR2, - p_Account_LastName IN VARCHAR2, - p_Account_Email IN VARCHAR2 ) -IS -BEGIN - INSERT INTO Accounts ( - Account_ID, - Account_FirstName, - Account_LastName, - Account_Email ) - VALUES ( - p_Account_ID, - p_Account_FirstName, - p_Account_LastName, - p_Account_Email ); -END; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-init.sql deleted file mode 100644 index d689165..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-init.sql +++ /dev/null @@ -1,20 +0,0 @@ -DROP TABLE CATEGORIES CASCADE CONSTRAINTS; - -DROP SEQUENCE S_CATEGORIES; - -CREATE SEQUENCE S_CATEGORIES - START WITH 1 - MAXVALUE 1E27 - MINVALUE 1 - NOCYCLE - CACHE 20 - NOORDER; - -CREATE TABLE CATEGORIES ( - CATEGORY_ID NUMBER(6) NOT NULL, - CATEGORY_NAME VARCHAR2(32), - CATEGORY_GUID VARCHAR2(36) -) -NOLOGGING -NOCACHE -NOPARALLEL; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-procedure.sql deleted file mode 100644 index b31d742..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/category-procedure.sql +++ /dev/null @@ -1,19 +0,0 @@ -CREATE OR REPLACE PROCEDURE prc_InsertCategory ( - p_Category_Name IN VARCHAR2, - p_Category_Guid IN VARCHAR2, - p_Category_Id OUT INT ) -IS -BEGIN - SELECT S_CATEGORIES.nextval - INTO p_Category_Id - FROM DUAL; - - INSERT INTO Categories ( - Category_Id, - Category_Name, - Category_Guid ) - VALUES ( - p_Category_Id, - p_Category_Name, - p_Category_Guid ); -END; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/enumeration-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/enumeration-init.sql deleted file mode 100644 index 20c8d58..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/enumeration-init.sql +++ /dev/null @@ -1,17 +0,0 @@ -DROP TABLE ENUMERATIONS CASCADE CONSTRAINTS; - -CREATE TABLE ENUMERATIONS ( - ENUM_ID INTEGER NOT NULL, - ENUM_DAY INTEGER NOT NULL, - ENUM_COLOR INTEGER NOT NULL, - ENUM_MONTH INTEGER, - CONSTRAINT PK_ENUMERATIONS PRIMARY KEY (ENUM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO ENUMERATIONS VALUES(1, 1, 1, 128); -INSERT INTO ENUMERATIONS VALUES(2, 2, 2, 2048); -INSERT INTO ENUMERATIONS VALUES(3, 3, 4, 256); -INSERT INTO ENUMERATIONS VALUES(4, 4, 8, NULL); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/line-item-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/line-item-init.sql deleted file mode 100644 index 961af88..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/line-item-init.sql +++ /dev/null @@ -1,35 +0,0 @@ -DROP TABLE LINEITEMS CASCADE CONSTRAINTS; - -CREATE TABLE LINEITEMS ( - LINEITEM_ID INTEGER NOT NULL, - ORDER_ID INTEGER NOT NULL, - LINEITEM_CODE VARCHAR2(32) NOT NULL, - LINEITEM_QUANTITY INTEGER NOT NULL, - LINEITEM_PRICE NUMBER(18,2), - LINEITEM_PICTURE BLOB, - CONSTRAINT PK_LINEITEMS PRIMARY KEY (ORDER_ID, LINEITEM_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO LINEITEMS VALUES (1, 10, 'ESM-34', 1, 45.43, NULL); -INSERT INTO LINEITEMS VALUES (2, 10, 'QSM-98', 8, 8.40, NULL); -INSERT INTO LINEITEMS VALUES (1, 9, 'DSM-78', 2, 45.40, NULL); -INSERT INTO LINEITEMS VALUES (2, 9, 'TSM-12', 2, 32.12, NULL); -INSERT INTO LINEITEMS VALUES (1, 8, 'DSM-16', 4, 41.30, NULL); -INSERT INTO LINEITEMS VALUES (2, 8, 'GSM-65', 1, 2.20, NULL); -INSERT INTO LINEITEMS VALUES (1, 7, 'WSM-27', 7, 52.10, NULL); -INSERT INTO LINEITEMS VALUES (2, 7, 'ESM-23', 2, 123.34, NULL); -INSERT INTO LINEITEMS VALUES (1, 6, 'QSM-39', 9, 12.12, NULL); -INSERT INTO LINEITEMS VALUES (2, 6, 'ASM-45', 6, 78.77, NULL); -INSERT INTO LINEITEMS VALUES (1, 5, 'ESM-48', 3, 43.87, NULL); -INSERT INTO LINEITEMS VALUES (2, 5, 'WSM-98', 7, 5.40, NULL); -INSERT INTO LINEITEMS VALUES (1, 4, 'RSM-57', 2, 78.90, NULL); -INSERT INTO LINEITEMS VALUES (2, 4, 'XSM-78', 9, 2.34, NULL); -INSERT INTO LINEITEMS VALUES (1, 3, 'DSM-59', 3, 5.70, NULL); -INSERT INTO LINEITEMS VALUES (2, 3, 'DSM-53', 3, 98.78, NULL); -INSERT INTO LINEITEMS VALUES (1, 2, 'DSM-37', 4, 7.80, NULL); -INSERT INTO LINEITEMS VALUES (2, 2, 'FSM-12', 2, 55.78, NULL); -INSERT INTO LINEITEMS VALUES (1, 1, 'ESM-48', 8, 87.60, NULL); -INSERT INTO LINEITEMS VALUES (2, 1, 'ESM-23', 1, 55.40, NULL); \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/more-account-records.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/more-account-records.sql deleted file mode 100644 index 847bb52..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/more-account-records.sql +++ /dev/null @@ -1,6 +0,0 @@ -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com'); -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com'); -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null); -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com'); -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null); - diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/order-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/order-init.sql deleted file mode 100644 index 212626e..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/order-init.sql +++ /dev/null @@ -1,30 +0,0 @@ -DROP TABLE ORDERS CASCADE CONSTRAINTS; - -CREATE TABLE ORDERS ( - ORDER_ID INTEGER NOT NULL, - ACCOUNT_ID INTEGER NOT NULL, - ORDER_DATE DATE, - ORDER_CARDTYPE VARCHAR2(32), - ORDER_CARDNUMBER VARCHAR2(32), - ORDER_CARDEXPIRY VARCHAR2(32), - ORDER_STREET VARCHAR2(32), - ORDER_CITY VARCHAR2(32), - ORDER_PROVINCE VARCHAR2(32), - ORDER_POSTALCODE VARCHAR2(32), - ORDER_FAVOURITELINEITEM INTEGER, - CONSTRAINT PK_ORDERS PRIMARY KEY (ORDER_ID) -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO ORDERS VALUES (1, 1, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2); -INSERT INTO ORDERS VALUES (2, 4, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1); -INSERT INTO ORDERS VALUES (3, 3, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2); -INSERT INTO ORDERS VALUES (4, 2, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1); -INSERT INTO ORDERS VALUES (5, 5, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2); -INSERT INTO ORDERS VALUES (6, 5, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1); -INSERT INTO ORDERS VALUES (7, 4, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2); -INSERT INTO ORDERS VALUES (8, 3, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1); -INSERT INTO ORDERS VALUES (9, 2, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2); -INSERT INTO ORDERS VALUES (10, 1, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1); diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/other-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/other-init.sql deleted file mode 100644 index e9101f3..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/other-init.sql +++ /dev/null @@ -1,12 +0,0 @@ -DROP TABLE OTHERS; - -CREATE TABLE OTHERS ( - OTHER_INT INT NULL , - OTHER_LONG NUMBER NULL -) -NOLOGGING -NOCACHE -NOPARALLEL; - -INSERT INTO OTHERS VALUES(1, 8888888); -INSERT INTO OTHERS VALUES(2, 9999999999); \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/swap-procedure.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/swap-procedure.sql deleted file mode 100644 index b9b2e34..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/swap-procedure.sql +++ /dev/null @@ -1,62 +0,0 @@ -CREATE OR REPLACE PROCEDURE prc_SWAP_EMAIL_ADDRESS ( - p_first IN OUT VARCHAR2, - p_second IN OUT VARCHAR2 ) -IS - v_id1 NUMBER (5,0); - v_id2 NUMBER (5,0); - v_email1 VARCHAR2 (255); - v_email2 VARCHAR2 (255); -BEGIN - SELECT - ACCOUNT_ID, - ACCOUNT_EMAIL - INTO v_id1, - v_email1 - FROM - ACCOUNTS - WHERE - ACCOUNT_EMAIL = p_first; - - SELECT - ACCOUNT_ID, - ACCOUNT_EMAIL - INTO - v_id2, - v_email2 - FROM - ACCOUNTS - WHERE - ACCOUNT_EMAIL = p_second; - - UPDATE - ACCOUNTS - SET - ACCOUNT_EMAIL = v_email2 - WHERE - ACCOUNT_ID = v_id1; - - UPDATE - ACCOUNTS - SET - ACCOUNT_EMAIL = v_email1 - WHERE - ACCOUNT_ID = v_id2; - - SELECT - ACCOUNT_EMAIL - INTO - p_first - FROM - ACCOUNTS - WHERE - ACCOUNT_ID = v_id1; - - SELECT - ACCOUNT_EMAIL - INTO - p_second - FROM - ACCOUNTS - WHERE - ACCOUNT_ID = v_id2; -END; \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/user-init.sql b/src/IBatisNet.DataAccess.Test/Scripts/Oracle/user-init.sql deleted file mode 100644 index c1b1a79..0000000 --- a/src/IBatisNet.DataAccess.Test/Scripts/Oracle/user-init.sql +++ /dev/null @@ -1,13 +0,0 @@ -DROP TABLE USERS; - -CREATE TABLE USERS ( - LOGONID NVARCHAR2(20) DEFAULT '0', - NAME NVARCHAR2(40) DEFAULT NULL, - PASSWORD NVARCHAR2(20) DEFAULT NULL, - EMAILADDRESS NVARCHAR2(40) DEFAULT NULL, - LASTLOGON DATE DEFAULT NULL, - CONSTRAINT PK_USERS PRIMARY KEY (LOGONID) -) -NOLOGGING -NOCACHE -NOPARALLEL; diff --git a/src/IBatisNet.DataAccess.Test/User.hbm.xml b/src/IBatisNet.DataAccess.Test/User.hbm.xml deleted file mode 100644 index 092df29..0000000 --- a/src/IBatisNet.DataAccess.Test/User.hbm.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/IBatisNet.DataAccess.Test.dll.config b/src/IBatisNet.DataAccess.Test/bin/Debug/IBatisNet.DataAccess.Test.dll.config deleted file mode 100644 index 65dd82c..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/IBatisNet.DataAccess.Test.dll.config +++ /dev/null @@ -1,98 +0,0 @@ - - - - - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Access_OleDb.config b/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Access_OleDb.config deleted file mode 100644 index 7478107..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Access_OleDb.config +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_Odbc.config b/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_Odbc.config deleted file mode 100644 index 9738d4f..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_Odbc.config +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_OleDb.config b/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_OleDb.config deleted file mode 100644 index ace82b3..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_OleDb.config +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config b/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config deleted file mode 100644 index 7c011b4..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MySql_ByteFx.config b/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MySql_ByteFx.config deleted file mode 100644 index 106246e..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_MySql_ByteFx.config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_ODP.config b/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_ODP.config deleted file mode 100644 index 9415e9b..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_ODP.config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_OracleClient.config b/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_OracleClient.config deleted file mode 100644 index 0c35c7f..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/SqlMap_Oracle_OracleClient.config +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Access_OleDb.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Access_OleDb.config deleted file mode 100644 index 1577f78..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Access_OleDb.config +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_Odbc.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_Odbc.config deleted file mode 100644 index db0ddba..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_Odbc.config +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_OleDb.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_OleDb.config deleted file mode 100644 index 4a49ed2..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_OleDb.config +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_SqlClient.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_SqlClient.config deleted file mode 100644 index c6e4831..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MSSQL_SqlClient.config +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Multiple_Context.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Multiple_Context.config deleted file mode 100644 index b07d390..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Multiple_Context.config +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MySql_ByteFx.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MySql_ByteFx.config deleted file mode 100644 index a6f38f2..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_MySql_ByteFx.config +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_ODP.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_ODP.config deleted file mode 100644 index 5bb1289..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_ODP.config +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_OracleClient.config b/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_OracleClient.config deleted file mode 100644 index f432a56..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/dao_Oracle_OracleClient.config +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess.Test/bin/Debug/providers.config b/src/IBatisNet.DataAccess.Test/bin/Debug/providers.config deleted file mode 100644 index 1b6a2d2..0000000 --- a/src/IBatisNet.DataAccess.Test/bin/Debug/providers.config +++ /dev/null @@ -1,325 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess/AssemblyInfo.cs b/src/IBatisNet.DataAccess/AssemblyInfo.cs deleted file mode 100644 index 25597a3..0000000 --- a/src/IBatisNet.DataAccess/AssemblyInfo.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Reflection; - -// -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -// -#if dotnet2 -[assembly: CLSCompliant(true)] - - -[assembly: AssemblyCompany("http://ibatis.apache.org/")] -[assembly: AssemblyProduct("iBATIS.NET")] -[assembly: AssemblyCopyright("Copyright 2007,2005 The Apache Software Foundation")] -[assembly: AssemblyTrademark("Licensed under the Apache License, Version 2.0")] -[assembly: AssemblyCulture("")] - -#if DEBUG -#else -#if dotnet2 -[assembly: AssemblyConfiguration("net-2.0.win32; Release")] -#else -[assembly: AssemblyConfiguration("net-1.1.win32; Release")] -#endif -[assembly: AssemblyDelaySign(false)] -[assembly: AssemblyKeyFileAttribute("..\\..\\..\\AssemblyKey.snk")] -#endif -#endif - -[assembly: AssemblyTitle("iBATIS.DataAccess")] -[assembly: AssemblyDescription("Data Access Object (DAO) design pattern implementation.")] - - -[assembly: AssemblyVersion("1.9.2")] diff --git a/src/IBatisNet.DataAccess/ChangeLog.txt b/src/IBatisNet.DataAccess/ChangeLog.txt deleted file mode 100644 index 2364554..0000000 --- a/src/IBatisNet.DataAccess/ChangeLog.txt +++ /dev/null @@ -1,74 +0,0 @@ -IBatisNet DataAccess Change Log - ------------------------------- -1.6.1 - 01/March/2007 BETA ------------------------------- -- Support for DataMapper 1.6.1 - ------------------------------- -1.6.0 - 01/Feb/2007 BETA ------------------------------- -- Support for DataMapper 1.6.0 - ------------------------------- -1.8.1 - 27/07/2006 GA ------------------------------- -- Support for DataMapper 1.5.1 - ------------------------------- -1.8 - 05/07/2006 BETA ------------------------------- -- Added IDaoManager interface to simplify mock or stub, methods returning DaoManager instance now return IDaoManager DaoManager. - ------------------------------- -1.7 - 15/12/2005 ------------------------------- -- Updated to log4net V1.2.9 -- Updated to Castle.DynamicProxy V1.1.5.0 -- Re-add signing on assembly -- Added custom logger support, IBATIS now need a custom section in your application config file - Exemple (for log4NET) : - - -
    - -
    - - - - - - - - - -- Removes use of Xml serilization for loading config, boost init -- IBATISNET-102 Calling DaoManager in different threads causes an Exception -- Allow Intellisense in Visual Studio 2003 for Dao.config file -- Updated schemas header - dao.config - - providers.config - - ------------------------------- -1.6.1 - 10-June-2005 ------------------------------- -- Fixed JIRA-38 Removed use of innerXml since properties node could be null/missing -- Improvement JIRA-75/63 - - - - ( To resolve IBATISNET-63 ) - -- Added new API to DomDaoManagerBuilder.Configure(...)[old API DaoManager.Configure(...) are marked as obsolete] -- Added New syntax to configure daoSessionHandler (old is too supported) - - - - - -- Re-Add providers tag (optional) in Dao.Config -- Fixed JIRA-69 Added support for global setting in ressource and url attribute (JIRA-69) \ No newline at end of file diff --git a/src/IBatisNet.DataAccess/Configuration/Dao.cs b/src/IBatisNet.DataAccess/Configuration/Dao.cs deleted file mode 100644 index 4171aa1..0000000 --- a/src/IBatisNet.DataAccess/Configuration/Dao.cs +++ /dev/null @@ -1,184 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Xml.Serialization; - -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.DataAccess.Interfaces; -using IBatisNet.DataAccess; -#endregion - -namespace IBatisNet.DataAccess.Configuration -{ - /// - /// Summary description for - /// - [Serializable] - [XmlRoot("dao", Namespace="http://ibatis.apache.org/dataAccess")] - public class Dao - { - #region Fields - [NonSerialized] - private string _interface; - [NonSerialized] - private string _implementation; - [NonSerialized] - private Type _daoImplementation = null; - [NonSerialized] - private Type _daoInterface = null; - [NonSerialized] - private IDao _daoInstance= null; - [NonSerialized] - private IDao _proxy = null; - [NonSerialized] - private DaoManager _daoManager = null; - #endregion - - #region Properties - /// - /// The implementation class of the dao. - /// - /// IBatisNet.DataAccess.Test.Implementations.MSSQL.SqlAccountDao - [XmlAttribute("implementation")] - public string Implementation - { - get { return _implementation; } - set - { - if ((value == null) || (value.Length < 1)) - { - throw new ArgumentNullException("The implementation attribut is mandatory in a dao tag."); - } - _implementation = value; - } - } - - - /// - /// The Interface class that the dao must implement. - /// - [XmlAttribute("interface")] - public string Interface - { - get { return _interface; } - set - { - if ((value == null) || (value.Length < 1)) - { - throw new ArgumentNullException("The interface attribut is mandatory in a dao tag."); - } - _interface = value; - } - } - - /// - /// The dao interface type. - /// - [XmlIgnoreAttribute] - public Type DaoInterface - { - get { return _daoInterface; } - - } - - /// - /// The dao implementation type. - /// - [XmlIgnoreAttribute] - public Type DaoImplementation - { - get { return _daoImplementation; } - - } - - /// - /// The concrete dao. - /// - [XmlIgnoreAttribute] - public IDao DaoInstance - { - get { return _daoInstance; } - - } - - /// - /// The proxy dao. - /// - [XmlIgnoreAttribute] - public IDao Proxy - { - get { return _proxy; } - - } - - /// - /// The DaoManager who manage this dao. - /// - [XmlIgnoreAttribute] - public DaoManager DaoManager - { - get { return _daoManager; } - - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public Dao() - { - } - #endregion - - #region Methods - /// - /// Initialize dao object. - /// - public void Initialize(DaoManager daoManager) - { - try - { - _daoManager = daoManager; - _daoImplementation = TypeUtils.ResolveType(this.Implementation); - _daoInterface = TypeUtils.ResolveType(this.Interface); - // Create a new instance of the Dao object. - _daoInstance = _daoImplementation.GetConstructor(Type.EmptyTypes).Invoke(null) as IDao; - _proxy = DaoProxy.NewInstance(this); - } - catch(Exception e) - { - throw new ConfigurationException(string.Format("Error configuring DAO. Cause: {0}", e.Message), e); - } - } - - #endregion - - } -} diff --git a/src/IBatisNet.DataAccess/Configuration/DaoProxy.cs b/src/IBatisNet.DataAccess/Configuration/DaoProxy.cs deleted file mode 100644 index ed25c4e..0000000 --- a/src/IBatisNet.DataAccess/Configuration/DaoProxy.cs +++ /dev/null @@ -1,185 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports - -using System; -using System.Collections; -using System.Reflection; -using Castle.DynamicProxy; -using IBatisNet.Common.Logging; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; - -#endregion - -namespace IBatisNet.DataAccess.Configuration -{ - /// - /// Summary description for DaoProxy. - /// - [CLSCompliant(false)] - public class DaoProxy : IInterceptor - { - #region Fields - private static ArrayList _passthroughMethods = new ArrayList(); - private Dao _daoImplementation; - private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - #endregion - - #region Constructor (s) / Destructor - /// - /// Constructor for a DaoProxy - /// - static DaoProxy() - { - _passthroughMethods.Add("GetType"); - _passthroughMethods.Add("ToString"); - } - - /// - /// Create a new proxy for the Dao - /// - /// The dao object to proxy - public DaoProxy(Dao dao) - { - _daoImplementation = dao; - } - #endregion - - #region Methods - /// - /// - /// - /// - /// - public static IDao NewInstance(Dao dao) - { - ProxyGenerator proxyGenerator = new ProxyGenerator(); - IInterceptor handler = new DaoProxy(dao); -// Type[] interfaces = {dao.DaoInterface, typeof(IDao)}; - return proxyGenerator.CreateInterfaceProxyWithTarget(dao.DaoInstance,handler); - - } - #endregion - - #region IInterceptor menbers - public void Intercept(IInvocation invocation) - { - Object result = null; - - #region Logging - if (_logger.IsDebugEnabled) - { - _logger.Debug("Dao Proxy call to " + invocation.Method.Name); - } - #endregion - - if (_passthroughMethods.Contains(invocation.Method.Name)) - { - try - { - result = invocation.Method.Invoke(_daoImplementation.DaoInstance, invocation.Arguments); - } - catch (Exception e) - { - throw UnWrapException(e, invocation.Method.Name); - } - } - else - { - DaoManager daoManager = _daoImplementation.DaoManager; - if ( daoManager.IsDaoSessionStarted() ) - { - try - { - result = invocation.Method.Invoke(_daoImplementation.DaoInstance, invocation.Arguments); - } - catch (Exception e) - { - throw UnWrapException(e, invocation.Method.Name); - } - } - else - { - #region Logging - if (_logger.IsDebugEnabled) - { - _logger.Debug("Dao Proxy, Open a connection "); - } - #endregion - // Open a connection - try - { - daoManager.OpenConnection(); - result = invocation.Method.Invoke(_daoImplementation.DaoInstance, invocation.Arguments); - } - catch (Exception e) - { - throw UnWrapException(e, invocation.Method.Name); - } - finally - { - daoManager.CloseConnection(); - } - } - } - - #region Logging - if (_logger.IsDebugEnabled) - { - _logger.Debug("End of proxyfied call to " + invocation.Method.Name); - } - #endregion - - - } - - private Exception UnWrapException(Exception ex, string methodName) - { - Exception e = ex; - while (true) - { - if (typeof(DataAccessException).IsInstanceOfType(e)) - { - return e; - } - else if (e.InnerException != null) - { - e = e.InnerException; - } - else - { - e = new DataAccessException( string.Format("DaoProxy : unable to intercept method name '{0}', cause : {1}", methodName, e.Message), e); - } - } - } - - #endregion - - - } -} diff --git a/src/IBatisNet.DataAccess/Configuration/DaoSessionHandler.cs b/src/IBatisNet.DataAccess/Configuration/DaoSessionHandler.cs deleted file mode 100644 index b2f40c8..0000000 --- a/src/IBatisNet.DataAccess/Configuration/DaoSessionHandler.cs +++ /dev/null @@ -1,133 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities; - -#endregion - -namespace IBatisNet.DataAccess.Configuration -{ - /// - /// Description rsume de DaoSessionHandler. - /// - [Serializable] - [XmlRoot("handler", Namespace="http://ibatis.apache.org/dataAccess")] - public class DaoSessionHandler - { - #region Fields - [NonSerialized] - private string _name = string.Empty; - [NonSerialized] - private string _implementation =string.Empty; - [NonSerialized] - private bool _isDefault = false; - #endregion - - #region Properties - /// - /// - /// - [XmlAttribute("default")] - public bool IsDefault - { - get { return _isDefault; } - set {_isDefault = value;} - } - - - /// - /// - /// - /// - /// Examples of Type: "IBatisNet.DataAccess.DaoSessionHandlers.SimpleDaoSessionHandler" - /// - [XmlAttribute("implementation")] - public string Implementation - { - get { return _implementation; } - set - { - if ((value == null) || (value.Length < 1)) - throw new ArgumentNullException("Implementation"); - _implementation = value; - } - } - - /// - /// The impelmenattion type - /// - public Type TypeInstance - { - get { return TypeUtils.ResolveType(_implementation); } - } - - /// - /// - /// - [XmlAttribute("id")] - public string Name - { - get { return _name; } - set - { - if ((value == null) || (value.Length < 1)) - throw new ArgumentNullException("Name"); - _name = value; - } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public DaoSessionHandler() - { - } - - /// - /// Constructor - /// - /// - /// - public DaoSessionHandler(string name, string implementation) - { - if ((implementation == null) || (implementation.Length < 1)) - throw new ArgumentNullException("implementation"); - if ((name == null) || (name.Length < 1)) - throw new ArgumentNullException("name"); - - _implementation = implementation; - _name = name; - } - #endregion - - } -} diff --git a/src/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs b/src/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs deleted file mode 100644 index 0ae19e1..0000000 --- a/src/IBatisNet.DataAccess/Configuration/DomDaoManagerBuilder.cs +++ /dev/null @@ -1,854 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 515322 $ - * $Date: 2007-03-06 15:23:03 -0700 (Tue, 06 Mar 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.IO; -using System.Reflection; -using System.Threading; -using System.Xml; -using IBatisNet.Common; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Logging; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Xml; -using IBatisNet.DataAccess.Configuration.Serializers; -using IBatisNet.DataAccess.Interfaces; -using IBatisNet.DataAccess.Scope; - -#endregion - -namespace IBatisNet.DataAccess.Configuration -{ - /// - /// Summary description for DomDaoManagerBuilder. - /// - public class DomDaoManagerBuilder - { - #region Constants - - /// - /// - /// - public const string DAO_NAMESPACE_PREFIX = "dao"; - private const string PROVIDERS_NAMESPACE_PREFIX = "provider"; - private const string PROVIDER_XML_NAMESPACE = "http://ibatis.apache.org/providers"; - private const string DAO_XML_NAMESPACE = "http://ibatis.apache.org/dataAccess"; - - private const string KEY_ATTRIBUTE = "key"; - private const string VALUE_ATTRIBUTE = "value"; - private const string ID_ATTRIBUTE = "id"; - - private readonly object [] EmptyObjects = new object [] {}; - - /// - /// Key for default config name - /// - public const string DEFAULT_FILE_CONFIG_NAME = "dao.config"; - /// - /// Key for default provider name - /// - public const string DEFAULT_PROVIDER_NAME = "_DEFAULT_PROVIDER_NAME"; - /// - /// Key for default dao session handler name - /// - public const string DEFAULT_DAOSESSIONHANDLER_NAME = "DEFAULT_DAOSESSIONHANDLER_NAME"; - - /// - /// Token for xml path to properties elements. - /// - private const string XML_PROPERTIES = "properties"; - - /// - /// Token for xml path to property elements. - /// - private const string XML_PROPERTY = "property"; - - /// - /// Token for xml path to settings add elements. - /// - private const string XML_SETTINGS_ADD = "/*/add"; - - /// - /// Token for xml path to DaoConfig providers element. - /// - private static string XML_CONFIG_PROVIDERS = "daoConfig/providers"; - - /// - /// Token for providers config file name. - /// - private const string PROVIDERS_FILE_NAME = "providers.config"; - - /// - /// Token for xml path to provider elements. - /// - private const string XML_PROVIDER = "providers/provider"; - - /// - /// Token for xml path to dao session handlers element. - /// - private const string XML_DAO_SESSION_HANDLERS = "daoConfig/daoSessionHandlers"; - - /// - /// Token for xml path to handler element. - /// - private const string XML_HANDLER = "handler"; - - /// - /// Token for xml path to dao context element. - /// - private const string XML_DAO_CONTEXT = "daoConfig/context"; - - /// - /// Token for xml path to database provider elements. - /// - private const string XML_DATABASE_PROVIDER = "database/provider"; - - /// - /// Token for xml path to database source elements. - /// - private const string XML_DATABASE_DATASOURCE = "database/dataSource"; - - /// - /// Token for xml path to dao session handler elements. - /// - private const string XML_DAO_SESSION_HANDLER = "daoSessionHandler"; - - /// - /// Token for xml path to dao elements. - /// - private const string XML_DAO = "daoFactory/dao"; - - #endregion - - #region Fields - - private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - - #endregion - - #region Constructor (s) / Destructor - - /// - /// Constructor. - /// - public DomDaoManagerBuilder(){ } - - #endregion - - #region Configure - - /// - /// Configure DaoManagers from via the default file config. - /// (accesd as relative ressource path from your Application root) - /// - public void Configure() - { - Configure( DomDaoManagerBuilder.DEFAULT_FILE_CONFIG_NAME ); - } - - /// - /// Configure DaoManagers from an XmlDocument. - /// - /// An xml configuration document. - public void Configure( XmlDocument document ) - { - BuildDaoManagers( document, false ); - } - - /// - /// Configure DaoManagers from a file path. - /// - /// - /// A relative ressource path from your Application root - /// or a absolue file path file:\\c:\dir\a.config - /// - public void Configure(string resource) - { - XmlDocument document = null; - if (resource.StartsWith("file://")) - { - document = Resources.GetUrlAsXmlDocument( resource.Remove(0, 7) ); - } - else - { - document = Resources.GetResourceAsXmlDocument( resource ); - } - BuildDaoManagers( document, false ); - } - - - /// - /// Configure DaoManagers from a stream. - /// - /// A stream resource - public void Configure(Stream resource) - { - XmlDocument document = Resources.GetStreamAsXmlDocument( resource ); - BuildDaoManagers( document, false ); - } - - /// - /// Configure DaoManagers from a FileInfo. - /// - /// A FileInfo resource - /// An SqlMap - public void Configure(FileInfo resource) - { - XmlDocument document = Resources.GetFileInfoAsXmlDocument( resource ); - BuildDaoManagers( document, false ); - } - - /// - /// Configure DaoManagers from an Uri. - /// - /// A Uri resource - /// - public void Configure(Uri resource) - { - XmlDocument document = Resources.GetUriAsXmlDocument( resource ); - BuildDaoManagers( document, false ); - } - - /// - /// Configure and monitor the configuration file for modifications and - /// automatically reconfigure - /// - /// - /// Delegate called when a file is changed to rebuild the - /// - public void ConfigureAndWatch(ConfigureHandler configureDelegate) - { - ConfigureAndWatch( DomDaoManagerBuilder.DEFAULT_FILE_CONFIG_NAME, configureDelegate ); - } - - - /// - /// Configure and monitor the configuration file for modifications and - /// automatically reconfigure - /// - /// - /// A relative ressource path from your Application root - /// or an absolue file path file://c:\dir\a.config - /// - /// - /// Delegate called when the file has changed, to rebuild the dal. - /// - public void ConfigureAndWatch(string resource, ConfigureHandler configureDelegate) - { - XmlDocument document = null; - if (resource.StartsWith("file://")) - { - document = Resources.GetUrlAsXmlDocument( resource.Remove(0, 7) ); - } - else - { - document = Resources.GetResourceAsXmlDocument( resource ); - } - - ConfigWatcherHandler.ClearFilesMonitored(); - ConfigWatcherHandler.AddFileToWatch( Resources.GetFileInfo( resource ) ); - - BuildDaoManagers( document, true ); - - TimerCallback callBakDelegate = new TimerCallback( DomDaoManagerBuilder.OnConfigFileChange ); - - StateConfig state = new StateConfig(); - state.FileName = resource; - state.ConfigureHandler = configureDelegate; - - new ConfigWatcherHandler( callBakDelegate, state ); - } - - - /// - /// Configure and monitor the configuration file for modifications - /// and automatically reconfigure SqlMap. - /// - /// - /// A FileInfo to your config file. - /// - /// - /// Delegate called when the file has changed, to rebuild the dal. - /// - /// An SqlMap - public void ConfigureAndWatch( FileInfo resource, ConfigureHandler configureDelegate ) - { - XmlDocument document = Resources.GetFileInfoAsXmlDocument(resource); - - ConfigWatcherHandler.ClearFilesMonitored(); - ConfigWatcherHandler.AddFileToWatch( resource ); - - BuildDaoManagers( document, true ); - - TimerCallback callBakDelegate = new TimerCallback( DomDaoManagerBuilder.OnConfigFileChange ); - - StateConfig state = new StateConfig(); - state.FileName = resource.FullName; - state.ConfigureHandler = configureDelegate; - - new ConfigWatcherHandler( callBakDelegate, state ); - } - - /// - /// Called when the configuration has been updated. - /// - /// The state config. - public static void OnConfigFileChange(object obj) - { - StateConfig state = (StateConfig)obj; - state.ConfigureHandler(null); - } - - - #endregion - - #region Methods - - /// - /// Build DaoManagers from config document. - /// -// [MethodImpl(MethodImplOptions.Synchronized)] - public void BuildDaoManagers(XmlDocument document, bool useConfigFileWatcher) - { - ConfigurationScope configurationScope = new ConfigurationScope(); - - configurationScope.UseConfigFileWatcher = useConfigFileWatcher; - configurationScope.DaoConfigDocument = document; - - configurationScope.XmlNamespaceManager = new XmlNamespaceManager(configurationScope.DaoConfigDocument.NameTable); - configurationScope.XmlNamespaceManager.AddNamespace(DAO_NAMESPACE_PREFIX, DAO_XML_NAMESPACE); - configurationScope.XmlNamespaceManager.AddNamespace(PROVIDERS_NAMESPACE_PREFIX, PROVIDER_XML_NAMESPACE); - - try - { - GetConfig( configurationScope ); - } - catch(Exception ex) - { - throw new ConfigurationException( configurationScope.ErrorContext.ToString(), ex); - } - } - - /// - /// Load and build the dao managers. - /// - /// The scope of the configuration - private void GetConfig(ConfigurationScope configurationScope) - { - GetProviders( configurationScope ); - GetDaoSessionHandlers( configurationScope ); - GetContexts( configurationScope ); - } - - - /// - /// Load and initialize providers from specified file. - /// - /// The scope of the configuration - private void GetProviders(ConfigurationScope configurationScope) - { - IDbProvider provider = null; - XmlDocument xmlProviders = null; - - configurationScope.ErrorContext.Activity = "Loading Providers config file"; - - XmlNode providersNode = null; - providersNode = configurationScope.DaoConfigDocument.SelectSingleNode( ApplyNamespacePrefix(XML_CONFIG_PROVIDERS), configurationScope.XmlNamespaceManager); - - if (providersNode != null ) - { - xmlProviders = Resources.GetAsXmlDocument( providersNode, configurationScope.Properties ); - } - else - { - xmlProviders = Resources.GetConfigAsXmlDocument(PROVIDERS_FILE_NAME); - } - - foreach (XmlNode node in xmlProviders.SelectNodes(ApplyProviderNamespacePrefix(XML_PROVIDER), configurationScope.XmlNamespaceManager ) ) - { - configurationScope.ErrorContext.Resource = node.InnerXml.ToString(); - - provider = ProviderDeSerializer.Deserialize(node); - - if (provider.IsEnabled == true) - { - configurationScope.ErrorContext.ObjectId = provider.Name; - configurationScope.ErrorContext.MoreInfo = "initialize provider"; - - provider.Initialize() ; - configurationScope.Providers.Add(provider.Name, provider); - if (provider.IsDefault == true) - { - if (configurationScope.Providers[DEFAULT_PROVIDER_NAME] == null) - { - configurationScope.Providers.Add(DEFAULT_PROVIDER_NAME, provider); - } - else - { - throw new ConfigurationException( - string.Format("Error while configuring the Provider named \"{0}\" There can be only one default Provider.",provider.Name)); - } - } - } - } - - configurationScope.ErrorContext.Reset(); - } - - - /// - /// Load and initialize custom DaoSession Handlers. - /// - /// The scope of the configuration - private void GetDaoSessionHandlers(ConfigurationScope configurationScope) - { - XmlNode daoSessionHandlersNode = null; - - configurationScope.ErrorContext.Activity = "loading custom DaoSession Handlers"; - - daoSessionHandlersNode = configurationScope.DaoConfigDocument.SelectSingleNode( ApplyNamespacePrefix(XML_DAO_SESSION_HANDLERS), configurationScope.XmlNamespaceManager); - - if (daoSessionHandlersNode != null) - { - foreach (XmlNode node in daoSessionHandlersNode.SelectNodes( ApplyNamespacePrefix(XML_HANDLER), configurationScope.XmlNamespaceManager)) - { - configurationScope.ErrorContext.Resource = node.InnerXml.ToString(); - - DaoSessionHandler daoSessionHandler = DaoSessionHandlerDeSerializer.Deserialize(node, configurationScope); - - configurationScope.ErrorContext.ObjectId = daoSessionHandler.Name; - configurationScope.ErrorContext.MoreInfo = "build daoSession handler"; - - configurationScope.DaoSectionHandlers[daoSessionHandler.Name] = daoSessionHandler.TypeInstance; - - if (daoSessionHandler.IsDefault == true) - { - configurationScope.DaoSectionHandlers[DEFAULT_DAOSESSIONHANDLER_NAME] = daoSessionHandler.TypeInstance; - } - } - } - - configurationScope.ErrorContext.Reset(); - } - - - /// - /// Build dao contexts - /// - /// The scope of the configuration - private void GetContexts(ConfigurationScope configurationScope) - { - DaoManager daoManager = null; - XmlAttribute attribute = null; - - // Init - DaoManager.Reset(); - - // Build one daoManager for each context - foreach (XmlNode contextNode in configurationScope.DaoConfigDocument.SelectNodes(ApplyNamespacePrefix(XML_DAO_CONTEXT), configurationScope.XmlNamespaceManager)) - { - configurationScope.ErrorContext.Activity = "build daoManager"; - configurationScope.NodeContext = contextNode; - - #region Configure a new DaoManager - - attribute = contextNode.Attributes["id"]; - daoManager = DaoManager.NewInstance(attribute.Value); - - configurationScope.ErrorContext.Activity += daoManager.Id; - - // default - attribute = contextNode.Attributes["default"]; - if (attribute != null) - { - if (attribute.Value=="true") - { - daoManager.IsDefault = true; - } - else - { - daoManager.IsDefault= false; - } - } - else - { - daoManager.IsDefault= false; - } - #endregion - - #region Properties - ParseGlobalProperties( configurationScope ); - #endregion - - #region provider - daoManager.DbProvider = ParseProvider( configurationScope ); - - configurationScope.ErrorContext.Resource = string.Empty; - configurationScope.ErrorContext.MoreInfo = string.Empty; - configurationScope.ErrorContext.ObjectId = string.Empty; - #endregion - - #region DataSource - daoManager.DataSource = ParseDataSource( configurationScope ); - daoManager.DataSource.DbProvider = daoManager.DbProvider; - #endregion - - #region DaoSessionHandler - - XmlNode nodeSessionHandler = contextNode.SelectSingleNode( ApplyNamespacePrefix(XML_DAO_SESSION_HANDLER), configurationScope.XmlNamespaceManager); - - configurationScope.ErrorContext.Activity = "configure DaoSessionHandler"; - - // The resources use to initialize the SessionHandler - IDictionary resources = new Hashtable(); - // By default, add the DataSource - resources.Add( "DataSource", daoManager.DataSource); - // By default, add the useConfigFileWatcher - resources.Add( "UseConfigFileWatcher", configurationScope.UseConfigFileWatcher); - - IDaoSessionHandler sessionHandler = null; - Type typeSessionHandler = null; - - if (nodeSessionHandler!= null) - { - configurationScope.ErrorContext.Resource = nodeSessionHandler.InnerXml.ToString(); - - typeSessionHandler = configurationScope.DaoSectionHandlers[nodeSessionHandler.Attributes[ID_ATTRIBUTE].Value] as Type; - - // Parse property node - foreach(XmlNode nodeProperty in nodeSessionHandler.SelectNodes( ApplyNamespacePrefix(XML_PROPERTY), configurationScope.XmlNamespaceManager )) - { - resources.Add(nodeProperty.Attributes["name"].Value, - NodeUtils.ParsePropertyTokens(nodeProperty.Attributes["value"].Value, configurationScope.Properties)); - } - } - else - { - typeSessionHandler = configurationScope.DaoSectionHandlers[DEFAULT_DAOSESSIONHANDLER_NAME] as Type; - } - - // Configure the sessionHandler - configurationScope.ErrorContext.ObjectId = typeSessionHandler.FullName; - - try - { - sessionHandler =(IDaoSessionHandler)Activator.CreateInstance(typeSessionHandler, EmptyObjects); - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("DaoManager could not configure DaoSessionHandler. DaoSessionHandler of type \"{0}\", failed. Cause: {1}", typeSessionHandler.Name, e.Message),e - ); - } - - sessionHandler.Configure(configurationScope.Properties, resources ); - - daoManager.DaoSessionHandler = sessionHandler; - - configurationScope.ErrorContext.Resource = string.Empty; - configurationScope.ErrorContext.MoreInfo = string.Empty; - configurationScope.ErrorContext.ObjectId = string.Empty; - #endregion - - #region Build Daos - ParseDaoFactory(configurationScope, daoManager); - #endregion - - #region Register DaoManager - - configurationScope.ErrorContext.MoreInfo = "register DaoManager"; - configurationScope.ErrorContext.ObjectId = daoManager.Id; - - DaoManager.RegisterDaoManager(daoManager.Id, daoManager); - - configurationScope.ErrorContext.Resource = string.Empty; - configurationScope.ErrorContext.MoreInfo = string.Empty; - configurationScope.ErrorContext.ObjectId = string.Empty; - #endregion - } - } - - - /// - /// Initialize the list of variables defined in the - /// properties file. - /// - /// The scope of the configuration - private void ParseGlobalProperties(ConfigurationScope configurationScope) - { - XmlNode nodeProperties = configurationScope.NodeContext.SelectSingleNode(ApplyNamespacePrefix(XML_PROPERTIES), configurationScope.XmlNamespaceManager); - - configurationScope.ErrorContext.Activity = "add global properties"; - - if (nodeProperties != null) - { - if (nodeProperties.HasChildNodes) - { - foreach (XmlNode propertyNode in nodeProperties.SelectNodes(ApplyNamespacePrefix(XML_PROPERTY), configurationScope.XmlNamespaceManager)) - { - XmlAttribute keyAttrib = propertyNode.Attributes[KEY_ATTRIBUTE]; - XmlAttribute valueAttrib = propertyNode.Attributes[VALUE_ATTRIBUTE]; - - if ( keyAttrib != null && valueAttrib!=null) - { - configurationScope.Properties.Add( keyAttrib.Value, valueAttrib.Value); - _logger.Info( string.Format("Add property \"{0}\" value \"{1}\"",keyAttrib.Value,valueAttrib.Value) ); - } - else - { - // Load the file defined by the attribute - XmlDocument propertiesConfig = Resources.GetAsXmlDocument(propertyNode, configurationScope.Properties); - - foreach (XmlNode node in propertiesConfig.SelectNodes(XML_SETTINGS_ADD)) - { - configurationScope.Properties[node.Attributes[KEY_ATTRIBUTE].Value] = node.Attributes[VALUE_ATTRIBUTE].Value; - _logger.Info( string.Format("Add property \"{0}\" value \"{1}\"",node.Attributes[KEY_ATTRIBUTE].Value,node.Attributes[VALUE_ATTRIBUTE].Value) ); - } - } - } - } - else - { - // JIRA-38 Fix - // element's InnerXml is currently an empty string anyway - // since are in properties file - - configurationScope.ErrorContext.Resource = nodeProperties.OuterXml.ToString(); - - // Load the file defined by the attribute - XmlDocument propertiesConfig = Resources.GetAsXmlDocument(nodeProperties, configurationScope.Properties); - - foreach (XmlNode node in propertiesConfig.SelectNodes(XML_SETTINGS_ADD)) - { - configurationScope.Properties[node.Attributes[KEY_ATTRIBUTE].Value] = node.Attributes[VALUE_ATTRIBUTE].Value; - _logger.Info( string.Format("Add property \"{0}\" value \"{1}\"",node.Attributes[KEY_ATTRIBUTE].Value,node.Attributes[VALUE_ATTRIBUTE].Value) ); - } - } -// // Load the file defined by the resource attribut -// XmlDocument propertiesConfig = Resources.GetAsXmlDocument(nodeProperties, configurationScope.Properties); -// -// foreach (XmlNode node in propertiesConfig.SelectNodes("/settings/add")) -// { -// configurationScope.Properties[node.Attributes["key"].Value] = node.Attributes["value"].Value; -// } - } - - configurationScope.ErrorContext.Resource = string.Empty; - configurationScope.ErrorContext.MoreInfo = string.Empty; - } - - - /// - /// Initialize the provider - /// - /// The scope of the configuration - /// A provider - private IDbProvider ParseProvider(ConfigurationScope configurationScope) - { - XmlNode node = configurationScope.NodeContext.SelectSingleNode( ApplyNamespacePrefix(XML_DATABASE_PROVIDER), configurationScope.XmlNamespaceManager); - - configurationScope.ErrorContext.Activity = "configure provider"; - - if (node != null) - { - configurationScope.ErrorContext.Resource = node.OuterXml.ToString(); - string providerName = NodeUtils.ParsePropertyTokens(node.Attributes["name"].Value, configurationScope.Properties); - - configurationScope.ErrorContext.ObjectId = providerName; - - if (configurationScope.Providers.Contains(providerName) == true) - { - return (IDbProvider)configurationScope.Providers[providerName]; - } - else - { - throw new ConfigurationException( - string.Format("Error while configuring the Provider named \"{0}\" in the Context named \"{1}\".", - providerName, configurationScope.NodeContext.Attributes["name"].Value)); - } - } - else - { - if(configurationScope.Providers.Contains(DEFAULT_PROVIDER_NAME) == true) - { - return (IDbProvider) configurationScope.Providers[DEFAULT_PROVIDER_NAME]; - } - else - { - throw new ConfigurationException( - string.Format("Error while configuring the Context named \"{0}\". There is no default provider.", - configurationScope.NodeContext.Attributes["name"].Value)); - } - } - } - - - // /// -// /// Build a provider -// /// -// /// -// /// -// /// -// /// Not use, I use it to test if it faster than serializer. -// /// But the tests are not concluant... -// /// -// private static Provider BuildProvider(XmlNode node) -// { -// XmlAttribute attribute = null; -// Provider provider = new Provider(); -// -// attribute = node.Attributes["assemblyName"]; -// provider.AssemblyName = attribute.Value; -// attribute = node.Attributes["default"]; -// if (attribute != null) -// { -// provider.IsDefault = Convert.ToBoolean( attribute.Value ); -// } -// attribute = node.Attributes["enabled"]; -// if (attribute != null) -// { -// provider.IsEnabled = Convert.ToBoolean( attribute.Value ); -// } -// attribute = node.Attributes["connectionClass"]; -// provider.ConnectionClass = attribute.Value; -// attribute = node.Attributes["UseParameterPrefixInSql"]; -// if (attribute != null) -// { -// provider.UseParameterPrefixInSql = Convert.ToBoolean( attribute.Value ); -// } -// attribute = node.Attributes["useParameterPrefixInParameter"]; -// if (attribute != null) -// { -// provider.UseParameterPrefixInParameter = Convert.ToBoolean( attribute.Value ); -// } -// attribute = node.Attributes["usePositionalParameters"]; -// if (attribute != null) -// { -// provider.UsePositionalParameters = Convert.ToBoolean( attribute.Value ); -// } -// attribute = node.Attributes["commandClass"]; -// provider.CommandClass = attribute.Value; -// attribute = node.Attributes["parameterClass"]; -// provider.ParameterClass = attribute.Value; -// attribute = node.Attributes["parameterDbTypeClass"]; -// provider.ParameterDbTypeClass = attribute.Value; -// attribute = node.Attributes["parameterDbTypeProperty"]; -// provider.ParameterDbTypeProperty = attribute.Value; -// attribute = node.Attributes["dataAdapterClass"]; -// provider.DataAdapterClass = attribute.Value; -// attribute = node.Attributes["commandBuilderClass"]; -// provider.CommandBuilderClass = attribute.Value; -// attribute = node.Attributes["commandBuilderClass"]; -// provider.CommandBuilderClass = attribute.Value; -// attribute = node.Attributes["name"]; -// provider.Name = attribute.Value; -// attribute = node.Attributes["parameterPrefix"]; -// provider.ParameterPrefix = attribute.Value; -// -// return provider; -// } - - - /// - /// Build the data source object - /// - /// The scope of the configuration - /// A DataSource - private DataSource ParseDataSource(ConfigurationScope configurationScope) - { - DataSource dataSource = null; - XmlNode node = configurationScope.NodeContext.SelectSingleNode( ApplyNamespacePrefix(XML_DATABASE_DATASOURCE), configurationScope.XmlNamespaceManager); - - configurationScope.ErrorContext.Resource = node.InnerXml.ToString(); - configurationScope.ErrorContext.MoreInfo = "configure data source"; - - dataSource = DataSourceDeSerializer.Deserialize( node ); -// (DataSource)serializer.Deserialize(new XmlNodeReader(node)); - - dataSource.ConnectionString = NodeUtils.ParsePropertyTokens(dataSource.ConnectionString, configurationScope.Properties); - - configurationScope.ErrorContext.Resource = string.Empty; - configurationScope.ErrorContext.MoreInfo = string.Empty; - - return dataSource; - } - - - /// - /// Parse dao factory tag - /// - /// The scope of the configuration - /// - private void ParseDaoFactory(ConfigurationScope configurationScope, DaoManager daoManager) - { - Dao dao = null; - - configurationScope.ErrorContext.MoreInfo = "configure dao"; - - foreach (XmlNode node in configurationScope.NodeContext.SelectNodes(ApplyNamespacePrefix(XML_DAO), configurationScope.XmlNamespaceManager )) - { - dao = DaoDeSerializer.Deserialize(node, configurationScope); - //(Dao) serializer.Deserialize(new XmlNodeReader(node)); - - configurationScope.ErrorContext.ObjectId = dao.Implementation; - - dao.Initialize(daoManager); - daoManager.RegisterDao(dao); - } - - configurationScope.ErrorContext.Resource = string.Empty; - configurationScope.ErrorContext.MoreInfo = string.Empty; - configurationScope.ErrorContext.ObjectId = string.Empty; - } - - /// - /// Apply an XML NameSpace - /// - /// - /// - public string ApplyNamespacePrefix( string elementName ) - { - return DAO_NAMESPACE_PREFIX+ ":" + elementName. - Replace("/","/"+DAO_NAMESPACE_PREFIX+":"); - } - - /// - /// Apply the provider namespace prefix - /// - /// - /// - public string ApplyProviderNamespacePrefix( string elementName ) - { - return PROVIDERS_NAMESPACE_PREFIX+ ":" + elementName. - Replace("/","/"+PROVIDERS_NAMESPACE_PREFIX+":"); - } - #endregion - - } -} diff --git a/src/IBatisNet.DataAccess/Configuration/Serializers/DaoDeSerializer.cs b/src/IBatisNet.DataAccess/Configuration/Serializers/DaoDeSerializer.cs deleted file mode 100644 index eeb9865..0000000 --- a/src/IBatisNet.DataAccess/Configuration/Serializers/DaoDeSerializer.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataAccess.Scope; - -#endregion - -namespace IBatisNet.DataAccess.Configuration.Serializers -{ - /// - /// Summary description for DaoDeSerializer. - /// - public class DaoDeSerializer - { - /// - /// Deserialize a Dao object - /// - /// - /// - /// - public static Dao Deserialize(XmlNode node, ConfigurationScope configScope) - { - Dao dao = new Dao(); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - dao.Implementation = NodeUtils.GetStringAttribute(prop, "implementation"); - dao.Interface = NodeUtils.GetStringAttribute(prop, "interface"); - - return dao; - } - } -} diff --git a/src/IBatisNet.DataAccess/Configuration/Serializers/DaoSessionHandlerDeSerializer.cs b/src/IBatisNet.DataAccess/Configuration/Serializers/DaoSessionHandlerDeSerializer.cs deleted file mode 100644 index b2d18e2..0000000 --- a/src/IBatisNet.DataAccess/Configuration/Serializers/DaoSessionHandlerDeSerializer.cs +++ /dev/null @@ -1,60 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataAccess.Scope; - -#endregion - -namespace IBatisNet.DataAccess.Configuration.Serializers -{ - /// - /// Summary description for DaoSessionHandlerDeSerializer. - /// - public class DaoSessionHandlerDeSerializer - { - /// - /// Deserialize a Dao object - /// - /// - /// - /// - public static DaoSessionHandler Deserialize(XmlNode node, ConfigurationScope configScope) - { - DaoSessionHandler daoSessionHandler = new DaoSessionHandler(); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - daoSessionHandler.Implementation = NodeUtils.GetStringAttribute(prop, "implementation"); - daoSessionHandler.Name = NodeUtils.GetStringAttribute(prop, "id"); - daoSessionHandler.IsDefault = NodeUtils.GetBooleanAttribute(prop, "default", false); - - return daoSessionHandler; - } - } -} diff --git a/src/IBatisNet.DataAccess/DaoConfig.xsd b/src/IBatisNet.DataAccess/DaoConfig.xsd deleted file mode 100644 index 1de774b..0000000 --- a/src/IBatisNet.DataAccess/DaoConfig.xsd +++ /dev/null @@ -1,115 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataAccess/DaoManager.cs b/src/IBatisNet.DataAccess/DaoManager.cs deleted file mode 100644 index 5ca8ffb..0000000 --- a/src/IBatisNet.DataAccess/DaoManager.cs +++ /dev/null @@ -1,630 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 515322 $ - * $Date: 2007-03-06 15:23:03 -0700 (Tue, 06 Mar 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections.Specialized; -using System.Data; -using System.Threading; -using System.Xml; -using IBatisNet.Common; -using IBatisNet.Common.Utilities; -using IBatisNet.DataAccess.Configuration; -using IBatisNet.DataAccess.Exceptions; -using IBatisNet.DataAccess.Interfaces; -using IBatisNet.DataAccess.SessionStore; - -#endregion - -namespace IBatisNet.DataAccess -{ - - /// - /// DaoManager is a facade class that provides convenient access to the rest - /// of the DAO framework. It's primary responsibilities include: - /// - Reading configuration information and initializing the framework - /// - Managing different contexts for different configurations - /// - Providing access to Dao implementation - /// - Providing access to the DaoSession pool for connections, transactions - /// - /// - ///
    -    /// Exemple 1:
    -    /// IDaoManager daoManager = DaoManager.GetInstance("PetStore"); 
    -    /// ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category");
    -    /// DaoSession daoSession = daoManager.GetDaoSession();
    -    /// daoSession.OpenConnection();
    -    /// ArrayList categoryList = categoryGetCategoryList(5,daoSession);
    -    /// daoSession.CloseConnection(daoSession);
    -    /// 

    - /// Exemple 2: - /// IDaoManager daoManager = DaoManager.GetInstance("PetStore"); - /// ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category"); - /// daoManager.OpenConnection(); - /// ArrayList categoryList = categoryGetCategoryList(5); - /// daoManager.CloseConnection(); - /// - /// Exemple 3: - /// Product p1 = new Product(); - /// Product p2 = new Product(); - /// Category c 1= new Category() - /// c1.Add(p1); - /// c2.Add(p2); - ///

    - /// IDaoManager daoManager = DaoManager.GetInstance("PetStore"); - /// ICategoryDao categoryDao = (ICategoryDao) daoManager.GetDao("Category"); - /// IProductDao productDao = (IProductDao) daoManager.GetDao("Product"); - /// daoManager.BeginTransaction(); - /// try - /// { - /// productInsert(p1); - /// productInsert(p2); - /// categoryInsert(c1); - /// daoManager.CommitTransaction(); - /// } - ///catch - ///{ - /// daoManager.RollBackTransaction(); - ///}

    -    ///
    -    public class DaoManager : IDaoManager
    -    {
    -        #region Constants
    -        /// 
    -        /// Key for default context name
    -        /// 
    -        public const string DEFAULT_CONTEXT_NAME = "_DEFAULT_CONTEXT_NAME";
    -        #endregion
    -
    -        #region Fields
    -        /// 
    -        /// 
    -        /// 
    -        ///
    -        ///(contextName, daoManager)
    -        ///
    -        protected static HybridDictionary DaoContextMap = new HybridDictionary();
    -
    -        private IDataSource _dataSource = null;
    -        private IDbProvider _provider = null;
    -        private string _name = string.Empty;
    -        private IDaoSessionHandler _daoSessionHandler = null;
    -        private bool _isDefault = false;
    -        //(daoName, IDao)
    -        private HybridDictionary _daoMap = new HybridDictionary();
    -        //(dao implementation, Dao)
    -        private static HybridDictionary _daoImplementationMap = new HybridDictionary();
    -
    -        /// 
    -        /// Container session unique for each 'thread'. 
    -        /// 
    -        private ISessionStore _sessionStore = null;
    -        #endregion
    -
    -        #region Properties
    -
    -        /// 
    -        /// Allow to set a custom session store like the 
    -        /// 
    -        /// Set it after the configuration and before use of the 
    -        /// 
    -        /// daoManager.SessionStore = new HybridWebThreadSessionStore( daoManager.Id );
    -        /// 
    -        public ISessionStore SessionStore
    -        {
    -            set { _sessionStore = value; }
    -        }
    -
    -
    -        /// 
    -        /// Gets or sets the data source.
    -        /// 
    -        /// The data source.
    -        internal IDataSource DataSource
    -        {
    -            get { return _dataSource; }
    -            set { _dataSource = value; }
    -        }
    -
    -        /// 
    -        /// 
    -        /// 
    -        internal IDbProvider DbProvider
    -        {
    -            get { return _provider; }
    -            set { _provider = value; }
    -        }
    -
    -        /// 
    -        /// Gets the local data source.
    -        /// 
    -        /// The local data source.
    -        public IDataSource LocalDataSource
    -        {
    -            get { return _dataSource; }
    -        }
    -
    -        /// 
    -        /// DaoManager name
    -        /// 
    -        public string Id
    -        {
    -            get { return _name; }
    -            set { _name = value; }
    -        }
    -
    -        /// 
    -        /// 
    -        /// 
    -        internal IDaoSessionHandler DaoSessionHandler
    -        {
    -            get { return _daoSessionHandler; }
    -            set { _daoSessionHandler = value; }
    -        }
    -
    -        /// 
    -        /// 
    -        /// 
    -        internal bool IsDefault
    -        {
    -            get { return _isDefault; }
    -            set { _isDefault = value; }
    -        }
    -
    -        /// 
    -        /// 
    -        /// 
    -        internal HybridDictionary DaoMap
    -        {
    -            get { return _daoMap; }
    -            set { _daoMap = value; }
    -        }
    -
    -        /// 
    -        /// Gets the local DAO session.
    -        /// 
    -        /// The local DAO session.
    -        public IDalSession LocalDaoSession
    -        {
    -            get 
    -            { 
    -                if (_sessionStore.LocalSession == null) 
    -                {
    -                    throw new DataAccessException("DaoManager could not invoke LocalDaoSession. No DaoSession was started. Call OpenConnection() or BeginTransaction first.");
    -                }
    -                return _sessionStore.LocalSession;
    -            }
    -        }
    -
    -        #endregion
    -
    -        #region Constructor (s) / Destructor
    -        /// 
    -        /// Make the default constructor private to prevent
    -        /// instances from being created.
    -        /// 
    -        private DaoManager(string id) 
    -        {
    -            Id = id;
    -            _sessionStore = SessionStoreFactory.GetSessionStore(id);
    -        }
    -        #endregion
    -
    -        #region Methods
    -
    -        #region Configure
    -
    -        /// 
    -        /// Configure an DaoManager from via the default file config.
    -        /// (accesd as relative ressource path from your Application root)
    -        /// 
    -        [Obsolete("This method will be removed in a future version, use DomDaoManagerBuilder.Configure.", false)]
    -        public static void Configure()
    -        {
    -            Configure( DomDaoManagerBuilder.DEFAULT_FILE_CONFIG_NAME );
    -        }
    -
    -
    -        /// 
    -        /// Configure an DaoManager from via a file.
    -        /// 
    -        /// 
    -        /// A relative ressource path from your Application root.
    -        /// 
    -        [Obsolete("This method will be removed in a future version, use DomDaoManagerBuilder.Configure.", false)]
    -        public static void Configure(string resource)
    -        {
    -            XmlDocument document = Resources.GetResourceAsXmlDocument( resource );
    -            new DomDaoManagerBuilder().BuildDaoManagers( document, false );
    -        }
    -
    -
    -        /// 
    -        /// Configure and monitor the configuration file for modifications and 
    -        /// automatically reconfigure  
    -        /// 
    -        /// 
    -        /// Delegate called when a file is changed to rebuild the 
    -        /// 
    -        [Obsolete("This method will be removed in a future version, use DomDaoManagerBuilder.Configure.", false)]
    -        public static void ConfigureAndWatch(ConfigureHandler configureDelegate)
    -        {
    -            ConfigureAndWatch( DomDaoManagerBuilder.DEFAULT_FILE_CONFIG_NAME, configureDelegate );
    -        }
    -
    -
    -        /// 
    -        /// Configure and monitor the configuration file for modifications and 
    -        /// automatically reconfigure  
    -        /// 
    -        /// 
    -        /// A relative ressource path from your Application root.
    -        /// 
    -        ///
    -        /// Delegate called when the file has changed, to rebuild the dal.
    -        /// 
    -        [Obsolete("This method will be removed in a future version, use DomDaoManagerBuilder.Configure.", false)]
    -        public static void ConfigureAndWatch(string resource, ConfigureHandler configureDelegate)
    -        {
    -            ConfigWatcherHandler.ClearFilesMonitored();
    -            ConfigWatcherHandler.AddFileToWatch( Resources.GetFileInfo( resource ) );
    -
    -            XmlDocument document = Resources.GetConfigAsXmlDocument( resource );
    -            new DomDaoManagerBuilder().BuildDaoManagers( document, true );
    -
    -            TimerCallback callBackDelegate = new TimerCallback( DomDaoManagerBuilder.OnConfigFileChange );
    -
    -            StateConfig state = new StateConfig();
    -            state.FileName = resource;
    -            state.ConfigureHandler = configureDelegate;
    -
    -            new ConfigWatcherHandler( callBackDelegate, state );
    -        }
    -
    -        #endregion
    -
    -        #region Static
    -
    -        /// 
    -        /// Cleared all reference to 
    -        /// 
    -        internal static void Reset()
    -        {
    -            //DaoManagerReverseLookup.Clear();
    -            DaoContextMap.Clear();
    -        }
    -
    -        /// 
    -        /// Create anew instance of a DaoManager
    -        /// 
    -        /// A DaoManager.
    -        internal static DaoManager NewInstance(string id) 
    -        {
    -            return new DaoManager(id);
    -        }
    -
    -        /// 
    -        /// Gets the default DaoManager.
    -        /// 
    -        /// A DaoManager.
    -        public static IDaoManager GetInstance() 
    -        {
    -            return (DaoManager)DaoContextMap[DEFAULT_CONTEXT_NAME];
    -        }
    -
    -        /// 
    -        /// Gets a DaoManager registered with the specified id.
    -        /// 
    -        /// The name of the DaoManger.
    -        /// A DaoManager.
    -        public static IDaoManager GetInstance(string contextName) 
    -        {
    -            return (DaoManager) DaoContextMap[contextName];
    -        }
    -
    -        /// 
    -        /// Get the DaoManager associated with this a Dao instance
    -        /// 
    -        /// A Dao instance.
    -        /// A DaoManager
    -        public static IDaoManager GetInstance(IDao dao) 
    -        {
    -            Dao daoImplementation = _daoImplementationMap[dao] as Dao;
    -            return daoImplementation.DaoManager;
    -        }
    -
    -        /// 
    -        /// Register a DaoManager
    -        /// 
    -        /// 
    -        /// 
    -        internal static void RegisterDaoManager(string contextName, DaoManager daoManager) 
    -        {
    -            if ( DaoContextMap.Contains(contextName) ) 
    -            {
    -                throw new DataAccessException("There is already a DAO Context with the ID '" + contextName + "'.");
    -            }
    -            DaoContextMap.Add(contextName, daoManager);
    -
    -            if (daoManager.IsDefault==true) 
    -            {
    -                if (DaoContextMap[DEFAULT_CONTEXT_NAME] == null) 
    -                {
    -                    DaoContextMap.Add(DEFAULT_CONTEXT_NAME, daoManager);
    -                } 
    -                else 
    -                {
    -                    throw new DataAccessException("Error while configuring DaoManager.  There can be only one default DAO context.");
    -                }
    -            }
    -        }
    -
    -        #endregion
    -
    -        #region Work with DaoSession
    -
    -        /// 
    -        /// Get a new DaoSession
    -        /// 
    -        /// 
    -        public DaoSession GetDaoSession() 								   										   
    -        {
    -            if (_daoSessionHandler == null) 
    -            {
    -                throw new DataAccessException("DaoManager could not get DaoSession. DaoSessionHandler was null (possibly not configured).");
    -            }
    -            return _daoSessionHandler.GetDaoSession(this);
    -        }
    -
    -        /// 
    -        /// Determines whether [is DAO session started].
    -        /// 
    -        /// 
    -        /// 	true if [is DAO session started]; otherwise, false.
    -        /// 
    -        public bool IsDaoSessionStarted()
    -        {
    -            return (_sessionStore.LocalSession != null);
    -        }
    -
    -        /// 
    -        /// Open a connection.
    -        /// 
    -        /// A IDalSession.
    -        public IDalSession OpenConnection() 
    -        {
    -            if (_daoSessionHandler== null) 
    -            {
    -                throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
    -            }
    -            if (_sessionStore.LocalSession != null) 
    -            {
    -                throw new DataAccessException("DaoManager could not invoke OpenConnection(). A connection is already started. Call CloseConnection first.");
    -            }
    -            IDalSession session = _daoSessionHandler.GetDaoSession(this);
    -            _sessionStore.Store(session);
    -            session.OpenConnection();
    -            return session;
    -        }
    -
    -        /// 
    -        /// Open a connection, on the specified connection string.
    -        /// 
    -        /// The connection string
    -        public IDalSession OpenConnection(string connectionString)
    -        {
    -            if (_daoSessionHandler== null) 
    -            {
    -                throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
    -            }
    -            if (_sessionStore.LocalSession != null) 
    -            {
    -                throw new DataAccessException("DaoManager could not invoke OpenConnection(). A connection is already started. Call CloseConnection first.");
    -            }
    -            IDalSession session = _daoSessionHandler.GetDaoSession(this);
    -            _sessionStore.Store(session);
    -            session.OpenConnection(connectionString);
    -            return session;	
    -
    -        }
    -
    -        /// 
    -        /// Close a connection
    -        /// 
    -        public void CloseConnection()
    -        {
    -            if (_sessionStore.LocalSession == null) 
    -            {
    -                throw new DataAccessException("DaoManager could not invoke CloseConnection(). No connection was started. Call OpenConnection() first.");
    -            }
    -            try
    -            {
    -                IDalSession session = _sessionStore.LocalSession;
    -                session.CloseConnection();	
    -            } 
    -            catch(Exception ex)
    -            {
    -                throw new DataAccessException("DaoManager could not CloseConnection(). Cause :"+ex.Message, ex);
    -            }
    -            finally 
    -            {
    -                _sessionStore.Dispose();
    -            }
    -        }
    -
    -        /// 
    -        /// Begins a database transaction.
    -        /// 
    -        /// A IDalSession
    -        public IDalSession BeginTransaction() 
    -        {
    -            if (_daoSessionHandler == null) 
    -            {
    -                throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
    -            }
    -            if (_sessionStore.LocalSession != null) 
    -            {
    -                throw new DataAccessException("DaoManager could not invoke BeginTransaction(). A DaoSession is already started. Call CommitTransaction() or RollbackTransaction first.");
    -            }
    -            IDalSession session = _daoSessionHandler.GetDaoSession(this);
    -            _sessionStore.Store(session);
    -            session.BeginTransaction();
    -            return session;
    -        }
    -
    -        /// 
    -        /// Begins a database transaction with the specified isolation level.
    -        /// 
    -        /// 
    -        /// The isolation level under which the transaction should run.
    -        /// 
    -        /// A IDalSession.
    -        public IDalSession BeginTransaction(IsolationLevel isolationLevel) 
    -        {
    -            if (_daoSessionHandler == null) 
    -            {
    -                throw new DataAccessException("DaoManager could not get DaoSession.  DaoSessionPool was null (possibly not configured).");
    -            }
    -            if (_sessionStore.LocalSession != null) 
    -            {
    -                throw new DataAccessException("DaoManager could not invoke BeginTransaction(). A DaoSession is already started. Call CommitTransaction() or RollbackTransaction first.");
    -            }
    -
    -            IDalSession session = _daoSessionHandler.GetDaoSession(this);
    -            _sessionStore.Store(session);
    -            session.BeginTransaction(isolationLevel);
    -            return session;
    -        }
    -
    -        /// 
    -        /// Commits the database transaction.
    -        /// 
    -        /// 
    -        /// Close the connection.
    -        /// 
    -        public void CommitTransaction()
    -        {
    -            if (_sessionStore.LocalSession == null) 
    -            {
    -                throw new DataAccessException("DaoManager could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first.");
    -            }
    -            try
    -            {
    -                IDalSession session = _sessionStore.LocalSession;
    -                session.CommitTransaction();
    -            } 
    -            finally 
    -            {
    -                _sessionStore.Dispose();
    -            }
    -        }
    -
    -        /// 
    -        /// Rolls back a transaction from a pending state.
    -        /// 
    -        /// 
    -        /// Close the connection.
    -        /// 
    -        public void RollBackTransaction()
    -        {
    -            if (_sessionStore.LocalSession == null) 
    -            {
    -                throw new DataAccessException("DaoManager could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first.");
    -            }
    -            try
    -            {
    -                IDalSession session = _sessionStore.LocalSession;
    -                session.RollBackTransaction();	
    -            } 
    -            finally 
    -            {
    -                _sessionStore.Dispose();
    -            }
    -        }
    -
    -        /// 
    -        /// Release the local session.
    -        /// 
    -        /// Use in SqlMapDaoSession
    -        internal void Dispose()
    -        {
    -            _sessionStore.Dispose();
    -        }
    -
    -        #endregion
    -
    -        #region IDao access
    -        /// 
    -        /// Gets a Dao instance for the requested interface type.
    -        /// 
    -        public IDao this[Type daoInterface]
    -        {
    -            get
    -            {
    -                Dao dao = _daoMap[daoInterface] as Dao;
    -                if (dao == null) 
    -                {
    -                    throw new DataException("There is no DAO implementation found for " + daoInterface.Name + " in this context.");
    -                }
    -                IDao idao = dao.Proxy;
    -                return idao;
    -            }
    -        }
    -
    -        /// 
    -        /// Gets a Dao instance for the requested interface type.
    -        /// 
    -        /// The requested interface type.
    -        /// A Dao instance
    -        public IDao GetDao(Type daoInterface)
    -        {
    -            return this[daoInterface];
    -        }
    -
    -        /// 
    -        /// Register a dao
    -        /// 
    -        /// 
    -        internal void RegisterDao(Dao dao) 
    -        {
    -            if ( DaoMap.Contains(dao.DaoInterface) ) 
    -            {
    -                throw new DataException("More than one implementation for '" + dao.Interface + "' was configured.  " +
    -                    "Only one implementation per context is allowed.");
    -            }
    -            DaoMap.Add(dao.DaoInterface, dao);
    -
    -            _daoImplementationMap.Add(dao.Proxy, dao);
    -            _daoImplementationMap.Add(dao.DaoInstance, dao);
    -        }
    -        #endregion
    -
    -        #endregion
    -
    -
    -    }
    -}
    diff --git a/src/IBatisNet.DataAccess/DaoSession.cs b/src/IBatisNet.DataAccess/DaoSession.cs
    deleted file mode 100644
    index ee6b0f6..0000000
    --- a/src/IBatisNet.DataAccess/DaoSession.cs
    +++ /dev/null
    @@ -1,247 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 513043 $
    - * $Date: 2007-02-28 15:56:03 -0700 (Wed, 28 Feb 2007) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Imports
    -
    -using System.Data;
    -using IBatisNet.Common;
    -
    -#endregion
    -
    -namespace IBatisNet.DataAccess
    -{
    -	/// 
    -	/// Abstract definition of a DataAccess Session
    -	/// 
    -	public abstract class DaoSession : IDalSession
    -	{
    -
    -		#region Fields
    -		/// 
    -		/// 
    -		/// 
    -		protected DaoManager daoManager = null;
    -		#endregion
    -
    -		#region Constructor (s) / Destructor
    -		/// 
    -		/// The DaoManager that manages this Dao instance will be passed
    -		/// in as the parameter to this constructor automatically upon
    -		/// instantiation.
    -		/// 
    -		/// 
    -		public DaoSession(DaoManager daoManager) 
    -		{
    -			this.daoManager = daoManager;
    -		}
    -		#endregion
    -
    -		#region IDalSession Members
    -
    -		#region Properties
    -
    -        /// 
    -        /// The data source use by the session.
    -        /// 
    -        /// 
    -		public abstract IDataSource DataSource
    -		{
    -			get;
    -		}
    -
    -
    -        /// 
    -        /// The Connection use by the session.
    -        /// 
    -        /// 
    -		public abstract IDbConnection Connection
    -		{
    -			get;
    -		}
    -
    -
    -        /// 
    -        /// Indicates if a transaction is open  on
    -        /// the session.
    -        /// 
    -        public abstract bool IsTransactionStart
    -		{
    -			get;
    -		}
    -
    -        /// 
    -        /// The Transaction use by the session.
    -        /// 
    -        /// 
    -        public abstract IDbTransaction Transaction
    -        {
    -            get;
    -        }
    -
    -		#endregion
    -
    -		#region Methods
    -
    -		/// 
    -		/// Complete (commit) a transaction
    -		/// 
    -		public abstract void Complete();
    -
    -		/// 
    -		/// Opens a database connection.
    -		/// 
    -		public abstract void OpenConnection();
    -
    -		/// 
    -		/// Open a connection, on the specified connection string.
    -		/// 
    -		/// The connection string
    -		public abstract void OpenConnection(string connectionString);
    -
    -		/// 
    -		/// Closes the connection
    -		/// 
    -		public abstract void CloseConnection();
    -
    -		/// 
    -		/// Begins a transaction.
    -		/// 
    -		public abstract void BeginTransaction();
    -
    -		/// 
    -		/// Open a connection and begin a transaction on the specified connection string.
    -		/// 
    -		/// The connection string
    -		public abstract void BeginTransaction(string connectionString);
    -
    -		/// 
    -		/// Begins a database transaction
    -		/// 
    -		/// Open a connection.
    -		public abstract void BeginTransaction(bool openConnection);
    -
    -		/// 
    -		/// Begins a transaction at the data source with the specified IsolationLevel value.
    -		/// 
    -		/// The transaction isolation level for this connection.
    -		public abstract void BeginTransaction(IsolationLevel isolationLevel);
    -
    -		/// 
    -		/// Open a connection and begin a transaction on the specified connection string.
    -		/// 
    -		/// The connection string
    -		/// The transaction isolation level for this connection.
    -		public abstract void BeginTransaction(string connectionString, IsolationLevel isolationLevel);
    -
    -		/// 
    -		/// Begins a transaction on the current connection
    -		/// with the specified IsolationLevel value.
    -		/// 
    -		/// The transaction isolation level for this connection.
    -		/// Open a connection.
    -		public abstract void BeginTransaction(bool openConnection, IsolationLevel isolationLevel);
    -
    -		/// 
    -		/// Begins a transaction on the current connection
    -		/// with the specified IsolationLevel value.
    -		/// 
    -		/// The transaction isolation level for this connection.
    -		/// The connection string
    -		/// Open a connection.
    -		public abstract void BeginTransaction(string connectionString, bool openConnection, IsolationLevel isolationLevel);
    -
    -		/// 
    -		/// Commits the database transaction.
    -		/// 
    -		/// 
    -		/// Will close the connection.
    -		/// 
    -		public abstract void CommitTransaction();
    -
    -		/// 
    -		/// Commits the database transaction.
    -		/// 
    -		/// Close the connection
    -		public abstract void CommitTransaction(bool closeConnection);
    -
    -		/// 
    -		/// Rolls back a transaction from a pending state.
    -		/// 
    -		/// 
    -		/// Will close the connection.
    -		/// 
    -		public abstract void RollBackTransaction();
    -		
    -		/// 
    -		/// Rolls back a transaction from a pending state.
    -		/// 
    -		/// Close the connection
    -		public abstract void RollBackTransaction(bool closeConnection);
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public abstract IDbCommand CreateCommand(CommandType commandType);
    -		
    -
    -		/// 
    -		/// Create an IDataParameter
    -		/// 
    -		/// An IDataParameter.
    -		public abstract IDbDataParameter CreateDataParameter();
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public abstract IDbDataAdapter CreateDataAdapter();
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public abstract IDbDataAdapter CreateDataAdapter(IDbCommand command);
    -		#endregion
    -
    -		#endregion
    -
    -		#region IDisposable Members
    -
    -		#region Methods
    -
    -		/// 
    -		/// Releasing, or resetting resources.
    -		/// 
    -		public abstract void Dispose();
    -
    -		#endregion
    -
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSession.cs b/src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSession.cs
    deleted file mode 100644
    index 04f8d40..0000000
    --- a/src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSession.cs
    +++ /dev/null
    @@ -1,537 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 513043 $
    - * $Date: 2007-02-28 15:56:03 -0700 (Wed, 28 Feb 2007) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Imports
    -
    -using System;
    -using System.Data;
    -using System.Reflection;
    -using IBatisNet.Common;
    -using IBatisNet.Common.Logging;
    -using IBatisNet.DataAccess.Exceptions;
    -
    -#endregion
    -
    -
    -namespace IBatisNet.DataAccess.DaoSessionHandlers
    -{
    -	/// 
    -	/// An ADO.NET implementation of the DataAccess Session .
    -	/// 
    -	public class SimpleDaoSession : DaoSession
    -	{
    -
    -		#region Fields
    -		private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType );
    -
    -		private IDataSource _dataSource = null;
    -		private bool _isTransactionOpen = false;
    -		private bool _consistent = false;
    -
    -		/// 
    -		/// Holds value of connection
    -		/// 
    -		private IDbConnection _connection = null;
    -
    -		/// 
    -		/// Holds value of transaction
    -		/// 
    -		private IDbTransaction _transaction = null;
    -		#endregion
    -
    -		#region Properties
    -
    -
    -        /// 
    -        /// The data source use by the session.
    -        /// 
    -        /// 
    -		public override IDataSource DataSource
    -		{
    -			get { return _dataSource; }
    -		}
    -
    -
    -        /// 
    -        /// The Connection use by the session.
    -        /// 
    -        /// 
    -		public override IDbConnection Connection
    -		{
    -			get { return _connection; }
    -		}
    -
    -
    -        /// 
    -        /// The Transaction use by the session.
    -        /// 
    -        /// 
    -		public override IDbTransaction Transaction
    -		{
    -			get { return _transaction; }
    -		}
    -
    -
    -        /// 
    -        /// Indicates if a transaction is open  on
    -        /// the session.
    -        /// 
    -        /// 
    -        public override bool IsTransactionStart
    -        {
    -            get { return _isTransactionOpen; }
    -        }
    -
    -		/// 
    -		/// Changes the vote for transaction to commit (true) or to abort (false).
    -		/// 
    -		private bool Consistent
    -		{
    -			set { _consistent = value; }
    -		}
    -		#endregion
    -
    -		#region Constructor (s) / Destructor
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public SimpleDaoSession(DaoManager daoManager, DataSource dataSource):base(daoManager) 
    -		{
    -			_dataSource = dataSource;
    -		}
    -		#endregion
    -
    -		#region Methods
    -
    -		/// 
    -		/// Complete (commit) a transaction
    -		/// 
    -		/// 
    -		/// Use in 'using' syntax.
    -		/// 
    -		public override void Complete()
    -		{
    -			this.Consistent = true;
    -		}
    -
    -		/// 
    -		/// Opens a database connection.
    -		/// 
    -		public override void OpenConnection()
    -		{
    -			this.OpenConnection(_dataSource.ConnectionString);
    -		}
    -
    -		/// 
    -		/// Open a connection, on the specified connection string.
    -		/// 
    -		/// The connection string
    -		public override void OpenConnection(string connectionString)
    -		{
    -			if (_connection == null)
    -			{
    -				_connection =  _dataSource.DbProvider.CreateConnection();
    -				_connection.ConnectionString = connectionString;
    -				try
    -				{
    -					_connection.Open();
    -					if (_logger.IsDebugEnabled)
    -					{
    -						_logger.Debug(string.Format("Open Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), _dataSource.DbProvider.Description) );
    -					}
    -				}
    -				catch(Exception ex)
    -				{
    -					throw new DataAccessException( string.Format("Unable to open connection to \"{0}\".", _dataSource.DbProvider.Description), ex );
    -				}
    -			}
    -			else if (_connection.State != ConnectionState.Open)
    -			{
    -				try
    -				{
    -					_connection.Open();
    -					if (_logger.IsDebugEnabled)
    -					{
    -						_logger.Debug(string.Format("Open Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), _dataSource.DbProvider.Description) );
    -					}
    -				}
    -				catch(Exception ex)
    -				{
    -					throw new DataAccessException(string.Format("Unable to open connection to \"{0}\".", _dataSource.DbProvider.Description), ex );
    -				}
    -			}
    -		}
    -
    -		/// 
    -		/// Closes the connection
    -		/// 
    -		public override void CloseConnection()
    -		{
    -			if ( (_connection != null) && (_connection.State == ConnectionState.Open) )
    -			{
    -				_connection.Close();
    -				if (_logger.IsDebugEnabled)
    -				{
    -					_logger.Debug(string.Format("Close Connection \"{0}\" to \"{1}\".", _connection.GetHashCode().ToString(), _dataSource.DbProvider.Description));
    -				}
    -			}
    -			_connection = null;
    -		}
    -
    -		/// 
    -		/// Begins a transaction.
    -		/// 
    -		/// 
    -		/// Oepn a connection.
    -		/// 
    -		public override void BeginTransaction()
    -		{
    -			this.BeginTransaction( _dataSource.ConnectionString );
    -		}
    -
    -		/// 
    -		/// Open a connection and begin a transaction on the specified connection string.
    -		/// 
    -		/// The connection string
    -		public override void BeginTransaction(string connectionString)
    -		{
    -			if (_connection == null || _connection.State != ConnectionState.Open)
    -			{
    -				this.OpenConnection( connectionString );
    -			}
    -			_transaction = _connection.BeginTransaction();
    -			if (_logger.IsDebugEnabled)
    -			{
    -				_logger.Debug("Begin Transaction.");
    -			}			
    -			_isTransactionOpen = true;
    -		}
    -
    -		/// 
    -		/// Begins a database transaction
    -		/// 
    -		/// Open a connection.
    -		public override void BeginTransaction(bool openConnection)
    -		{
    -			if (openConnection)
    -			{
    -				this.BeginTransaction();
    -			}
    -			else
    -			{
    -				if (_connection == null || _connection.State != ConnectionState.Open)
    -				{
    -					throw new DataAccessException("SimpleDaoSession could not invoke BeginTransaction(). A Connection must be started. Call OpenConnection() first.");
    -				}
    -				_transaction = _connection.BeginTransaction();
    -				if (_logger.IsDebugEnabled)
    -				{
    -					_logger.Debug("Begin Transaction.");
    -				}	
    -				_isTransactionOpen = true;
    -			}
    -		}
    -
    -		/// 
    -		/// Begins a transaction at the data source with the specified IsolationLevel value.
    -		/// 
    -		/// The transaction isolation level for this connection.
    -		public override void BeginTransaction(IsolationLevel isolationLevel)
    -		{
    -			this.BeginTransaction( _dataSource.ConnectionString, isolationLevel );
    -		}
    -
    -		/// 
    -		/// Open a connection and begin a transaction on the specified connection string.
    -		/// 
    -		/// The connection string
    -		/// The transaction isolation level for this connection.
    -		public override void BeginTransaction(string connectionString, IsolationLevel isolationLevel)
    -		{
    -			if (_connection == null || _connection.State != ConnectionState.Open)
    -			{
    -				this.OpenConnection( connectionString );
    -			}
    -			_transaction = _connection.BeginTransaction(isolationLevel);
    -			if (_logger.IsDebugEnabled)
    -			{
    -				_logger.Debug("Begin Transaction.");
    -			}
    -			_isTransactionOpen = true;			
    -		}
    -
    -		/// 
    -		/// Begins a transaction on the current connection
    -		/// with the specified IsolationLevel value.
    -		/// 
    -		/// The transaction isolation level for this connection.
    -		/// Open the connection ?
    -		public override void BeginTransaction(bool openConnection, IsolationLevel isolationLevel)
    -		{
    -			this.BeginTransaction( _dataSource.ConnectionString, openConnection, isolationLevel );
    -		}
    -
    -		/// 
    -		/// Begins a transaction on the current connection
    -		/// with the specified IsolationLevel value.
    -		/// 
    -		/// The transaction isolation level for this connection.
    -		/// The connection string
    -		/// Open a connection.
    -		public override void BeginTransaction(string connectionString, bool openConnection, IsolationLevel isolationLevel)
    -		{
    -			if (openConnection)
    -			{
    -				this.BeginTransaction(connectionString, isolationLevel);
    -			}
    -			else
    -			{
    -				if (_connection == null || _connection.State != ConnectionState.Open)
    -				{
    -					throw new DataAccessException("SimpleDaoSession could not invoke StartTransaction(). A Connection must be started. Call OpenConnection() first.");
    -				}
    -				_transaction = _connection.BeginTransaction(isolationLevel);
    -				if (_logger.IsDebugEnabled)
    -				{
    -					_logger.Debug("Begin Transaction.");
    -				}	
    -				_isTransactionOpen = true;
    -			}			
    -		}
    -
    -		/// 
    -		/// Commits the database transaction.
    -		/// 
    -		/// 
    -		/// Will close the connection.
    -		/// 
    -		public override void CommitTransaction()
    -		{
    -			if (_logger.IsDebugEnabled)
    -			{
    -				_logger.Debug("Commit Transaction");
    -			}		
    -	
    -			_transaction.Commit();
    -			_transaction.Dispose();
    -			_transaction= null;
    -            _isTransactionOpen = false;
    -
    -			if (_connection.State != ConnectionState.Closed)
    -			{
    -				CloseConnection();
    -			}
    -		}
    -
    -		/// 
    -		/// Commits the database transaction.
    -		/// 
    -		/// Close the connection
    -		public override void CommitTransaction(bool closeConnection)
    -		{
    -			if (_logger.IsDebugEnabled)
    -			{
    -				_logger.Debug("Commit Transaction");
    -			}
    -
    -			_transaction.Commit();
    -			_transaction.Dispose();
    -			_transaction= null;
    -            _isTransactionOpen = false;
    -
    -			if (closeConnection)
    -			{
    -				if (_connection.State != ConnectionState.Closed)
    -				{
    -					CloseConnection();
    -				}
    -			}
    -		}
    -		/// 
    -		/// Rolls back a transaction from a pending state.
    -		/// 
    -		/// 
    -		/// Will close the connection.
    -		/// 
    -		public override void RollBackTransaction()
    -		{
    -			if (_logger.IsDebugEnabled)
    -			{
    -				_logger.Debug("RollBack Transaction");
    -			}
    -
    -			_transaction.Rollback();
    -			_transaction.Dispose();
    -			_transaction = null;
    -            _isTransactionOpen = false;
    -
    -			if (_connection.State != ConnectionState.Closed)
    -			{
    -				CloseConnection();
    -			}
    -		}
    -
    -		/// 
    -		/// Rolls back a transaction from a pending state.
    -		/// 
    -		/// Close the connection
    -		public override void RollBackTransaction(bool closeConnection)
    -		{
    -			if (_logger.IsDebugEnabled)
    -			{
    -				_logger.Debug("RollBack Transaction");
    -			}
    -
    -			_transaction.Rollback();
    -			_transaction.Dispose();
    -			_transaction = null;
    -            _isTransactionOpen = false;
    -
    -			if (closeConnection)
    -			{
    -				if (_connection.State != ConnectionState.Closed)
    -				{
    -					CloseConnection();
    -				}
    -			}
    -		}
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public override IDbCommand CreateCommand(CommandType commandType)
    -		{
    -			IDbCommand command = null;
    -
    -            command = _connection.CreateCommand();// _dataSource.DbProvider.CreateCommand();
    -			command.CommandType = commandType;
    -			//command.Connection = _connection;
    -
    -			// Assign transaction
    -			if (_transaction != null)
    -			{
    -				try
    -				{
    -					command.Transaction = _transaction;
    -				}
    -				catch 
    -				{}
    -			}
    -			// Assign connection timeout
    -			if (_connection!= null)
    -			{
    -				try // MySql provider doesn't suppport it !
    -				{
    -					command.CommandTimeout = _connection.ConnectionTimeout;
    -				}
    -				catch(NotSupportedException e)
    -				{
    -					_logger.Info(e.Message);
    -				}			
    -			}
    -			return command;
    -		}
    -
    -		/// 
    -		/// Create an IDataParameter
    -		/// 
    -		/// An IDataParameter.
    -		public override IDbDataParameter CreateDataParameter()
    -		{
    -			IDbDataParameter dataParameter = _dataSource.DbProvider.CreateDataParameter();
    -
    -			return dataParameter;
    -		}
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public override IDbDataAdapter CreateDataAdapter()
    -		{
    -			return _dataSource.DbProvider.CreateDataAdapter();
    -		}
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public override IDbDataAdapter CreateDataAdapter(IDbCommand command)
    -		{
    -			IDbDataAdapter dataAdapter = null;
    -
    -			dataAdapter = _dataSource.DbProvider.CreateDataAdapter();
    -			dataAdapter.SelectCommand = command;
    -
    -			return dataAdapter;
    -			
    -		}
    -		#endregion
    -
    -		#region IDisposable Members
    -		/// 
    -		/// 
    -		/// 
    -		public override void Dispose()
    -		{
    -			if (_logger.IsDebugEnabled)
    -			{
    -				_logger.Debug("Dispose DaoSession");
    -			}
    -
    -			if (_isTransactionOpen == false)
    -			{
    -				if (_connection.State != ConnectionState.Closed)
    -				{
    -					daoManager.CloseConnection();
    -				}
    -			}
    -			else
    -			{
    -				if (_consistent)
    -				{
    -					daoManager.CommitTransaction();
    -				    _isTransactionOpen = false;
    -				}
    -				else
    -				{
    -					if (_connection.State != ConnectionState.Closed)
    -					{
    -						daoManager.RollBackTransaction();
    -                        _isTransactionOpen = false;
    -					}
    -				}
    -			}
    -		}
    -		#endregion
    -	}
    -
    -}
    diff --git a/src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSessionHandler.cs b/src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSessionHandler.cs
    deleted file mode 100644
    index 2895fae..0000000
    --- a/src/IBatisNet.DataAccess/DaoSessionHandlers/SimpleDaoSessionHandler.cs
    +++ /dev/null
    @@ -1,84 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Using
    -
    -using System.Collections;
    -using System.Collections.Specialized;
    -using IBatisNet.Common;
    -using IBatisNet.DataAccess.Exceptions;
    -using IBatisNet.DataAccess.Interfaces;
    -
    -#endregion
    -
    -namespace IBatisNet.DataAccess.DaoSessionHandlers
    -{
    -	/// 
    -	/// Summary description for SimpleDaoSessionHandler.
    -	/// 
    -	public class SimpleDaoSessionHandler : IDaoSessionHandler
    -	{
    -		#region Fields
    -		private DataSource _dataSource;
    -		#endregion
    -
    -		#region Constructor (s) / Destructor
    -		/// 
    -		/// 
    -		/// 
    -		public SimpleDaoSessionHandler()
    -		{
    -		}
    -		#endregion
    -
    -		#region Methods
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public void Configure(NameValueCollection properties, IDictionary resources)
    -		{
    -			_dataSource = (DataSource) resources["DataSource"];
    -		}
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public DaoSession GetDaoSession(DaoManager daoManager)
    -		{
    -			if (_dataSource == null) 
    -			{
    -				throw new DataAccessException("Source is null in DaoSessionHandler (check the context source configurationin config).");
    -			}
    -			return (new SimpleDaoSession(daoManager,_dataSource));
    -		}
    -		#endregion
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSession.cs b/src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSession.cs
    deleted file mode 100644
    index 137c078..0000000
    --- a/src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSession.cs
    +++ /dev/null
    @@ -1,309 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 513043 $
    - * $Date: 2007-02-28 15:56:03 -0700 (Wed, 28 Feb 2007) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Imports
    -
    -using System.Data;
    -using IBatisNet.Common;
    -using IBatisNet.DataMapper;
    -
    -#endregion
    -
    -namespace IBatisNet.DataAccess.DaoSessionHandlers
    -{
    -	/// 
    -	/// An SqlMappper implementation of the DataAccess Session.
    -	/// 
    -	//public class SqlMapDaoSession : DaoSession
    -	//{
    -	//	#region Fields
    -	//	private ISqlMapper _sqlMap = null;
    -	//	#endregion
    -
    -	//	#region Properties
    -
    -
    - //       /// 
    - //       /// Gets the SQL map.
    - //       /// 
    - //       /// The SQL map.
    -	//	public ISqlMapper SqlMap
    -	//	{
    -	//		get { return _sqlMap; }
    -	//	}
    -
    -
    - //       /// 
    - //       /// The data source use by the session.
    - //       /// 
    - //       /// 
    -	//	public override IDataSource DataSource
    -	//	{
    -	//		get { return _sqlMap.LocalSession.DataSource; }
    -	//	}
    -
    -
    - //       /// 
    - //       /// The Connection use by the session.
    - //       /// 
    - //       /// 
    -	//	public override IDbConnection Connection
    -	//	{
    -	//		get { return _sqlMap.LocalSession.Connection; }
    -	//	}
    -
    -
    - //       /// 
    - //       /// The Transaction use by the session.
    - //       /// 
    - //       /// 
    -	//	public override IDbTransaction Transaction
    -	//	{
    -	//		get { return _sqlMap.LocalSession.Transaction; }
    -	//	}
    -
    - //       /// 
    - //       /// Indicates if a transaction is open  on
    - //       /// the session.
    - //       /// 
    - //       /// 
    - //       public override bool IsTransactionStart
    - //       {
    - //           get { return _sqlMap.LocalSession.IsTransactionStart; }
    - //       }
    -
    -	//	#endregion
    -
    -	//	#region Constructor (s) / Destructor
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	public SqlMapDaoSession(DaoManager daoManager, ISqlMapper sqlMap):base(daoManager) 
    -	//	{
    -	//		_sqlMap = sqlMap;
    -	//	}
    -	//	#endregion
    -
    -	//	#region Methods
    -
    -	//	/// 
    -	//	/// Complete (commit) a transaction
    -	//	/// 
    -	//	/// 
    -	//	/// Use in 'using' syntax.
    -	//	/// 
    -	//	public override void Complete()
    -	//	{
    -	//		_sqlMap.LocalSession.Complete();
    -	//	}
    -
    -	//	/// 
    -	//	/// Opens a database connection.
    -	//	/// 
    -	//	public override void OpenConnection()
    -	//	{
    -	//		_sqlMap.OpenConnection();
    -	//	}
    -
    -	//	/// 
    -	//	/// Open a connection, on the specified connection string.
    -	//	/// 
    -	//	/// The connection string
    -	//	public override void OpenConnection(string connectionString)
    -	//	{
    -	//		_sqlMap.OpenConnection(connectionString);
    -	//	}
    -
    -	//	/// 
    -	//	/// Closes the connection
    -	//	/// 
    -	//	public override void CloseConnection()
    -	//	{
    -	//		_sqlMap.CloseConnection();
    -	//	}
    -
    -	//	/// 
    -	//	/// Begins a transaction.
    -	//	/// 
    -	//	public override void BeginTransaction()
    -	//	{
    -	//		_sqlMap.BeginTransaction();
    -	//	}
    -
    -	//	/// 
    -	//	/// Open a connection and begin a transaction on the specified connection string.
    -	//	/// 
    -	//	/// The connection string
    -	//	public override void BeginTransaction(string connectionString)
    -	//	{
    -	//		_sqlMap.BeginTransaction( connectionString );		
    -	//	}
    -
    -	//	/// 
    -	//	/// Begins a database transaction
    -	//	/// 
    -	//	/// Open a connection.
    -	//	public override void BeginTransaction(bool openConnection)
    -	//	{
    -	//		_sqlMap.BeginTransaction(openConnection);
    -	//	}
    -
    -	//	/// 
    -	//	/// Begins a transaction at the data source with the specified IsolationLevel value.
    -	//	/// 
    -	//	/// The transaction isolation level for this connection.
    -	//	public override void BeginTransaction(IsolationLevel isolationLevel)
    -	//	{
    -	//		_sqlMap.BeginTransaction (isolationLevel);
    -	//	}
    -
    -	//	/// 
    -	//	/// Open a connection and begin a transaction on the specified connection string.
    -	//	/// 
    -	//	/// The connection string
    -	//	/// The transaction isolation level for this connection.
    -	//	public override void BeginTransaction(string connectionString, IsolationLevel isolationLevel)
    -	//	{
    -	//		_sqlMap.BeginTransaction ( connectionString, isolationLevel );
    -	//	}
    -
    -	//	/// 
    -	//	/// Begins a transaction on the current connection
    -	//	/// with the specified IsolationLevel value.
    -	//	/// 
    -	//	/// The transaction isolation level for this connection.
    -	//	/// Open a connection.
    -	//	public override void BeginTransaction(bool openConnection, IsolationLevel isolationLevel)
    -	//	{
    -	//		_sqlMap.BeginTransaction(openConnection, isolationLevel);
    -	//	}
    -
    -	//	/// 
    -	//	/// Begins a transaction on the current connection
    -	//	/// with the specified IsolationLevel value.
    -	//	/// 
    -	//	/// The transaction isolation level for this connection.
    -	//	/// The connection string
    -	//	/// Open a connection.
    -	//	public override void BeginTransaction(string connectionString, bool openConnection, IsolationLevel isolationLevel)
    -	//	{
    -	//		_sqlMap.BeginTransaction( connectionString, openConnection, isolationLevel );
    -	//	}
    -
    -	//	/// 
    -	//	/// Commits the database transaction.
    -	//	/// 
    -	//	/// 
    -	//	/// Will close the connection.
    -	//	/// 
    -	//	public override void CommitTransaction()
    -	//	{
    -	//		_sqlMap.CommitTransaction();
    -	//	}
    -
    -	//	/// 
    -	//	/// Commits the database transaction.
    -	//	/// 
    -	//	/// Close the connection
    -	//	public override void CommitTransaction(bool closeConnection)
    -	//	{
    -	//		_sqlMap.CommitTransaction(closeConnection);
    -	//	}
    -
    -	//	/// 
    -	//	/// Rolls back a transaction from a pending state.
    -	//	/// 
    -	//	/// 
    -	//	/// Will close the connection.
    -	//	/// 
    -	//	public override void RollBackTransaction()
    -	//	{
    -	//		_sqlMap.RollBackTransaction();
    -	//	}
    -
    -	//	/// 
    -	//	/// Rolls back a transaction from a pending state.
    -	//	/// 
    -	//	/// Close the connection
    -	//	public override void RollBackTransaction(bool closeConnection)
    -	//	{
    -	//		_sqlMap.RollBackTransaction(closeConnection);
    -	//	}
    -
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	public override IDbCommand CreateCommand(CommandType commandType)
    -	//	{
    -	//		return _sqlMap.LocalSession.CreateCommand(commandType);
    -	//	}
    -
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	public override IDbDataParameter CreateDataParameter()
    -	//	{
    -	//		return _sqlMap.LocalSession.CreateDataParameter();
    -	//	}
    -
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	public override IDbDataAdapter CreateDataAdapter()
    -	//	{
    -	//		return _sqlMap.LocalSession.CreateDataAdapter();
    -	//	}
    -
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	/// 
    -	//	public override IDbDataAdapter CreateDataAdapter(IDbCommand command)
    -	//	{
    -	//		return _sqlMap.LocalSession.CreateDataAdapter(command);
    -	//	}
    -	//	#endregion
    -
    -	//	#region IDisposable Members
    -	//	/// 
    -	//	/// Releasing, or resetting resources.
    -	//	/// 
    -	//	public override void Dispose()
    -	//	{
    -	//		_sqlMap.LocalSession.Dispose();
    -	//		daoManager.Dispose();
    -	//	}
    -	//	#endregion
    -
    -	//}
    -}
    diff --git a/src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSessionHandler.cs b/src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSessionHandler.cs
    deleted file mode 100644
    index 70844a1..0000000
    --- a/src/IBatisNet.DataAccess/DaoSessionHandlers/SqlMapDaoSessionHandler.cs
    +++ /dev/null
    @@ -1,137 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 417269 $
    - * $Date: 2006-06-26 12:21:12 -0600 (Mon, 26 Jun 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Using
    -
    -using System;
    -using System.Collections;
    -using System.Collections.Specialized;
    -using System.Xml;
    -using IBatisNet.Common;
    -using IBatisNet.Common.Exceptions;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataAccess.Interfaces;
    -using IBatisNet.DataMapper;
    -using IBatisNet.DataMapper.Configuration;
    -
    -#endregion
    -
    -namespace IBatisNet.DataAccess.DaoSessionHandlers
    -{
    -	/// 
    -	/// Summary description for SqlMapDaoSessionHandler.
    -	/// 
    -	public class SqlMapDaoSessionHandler : IDaoSessionHandler
    -	{
    -		#region Fields
    -        private ISqlMapper _sqlMap;
    -		#endregion
    -
    -		#region Properties
    -		/// 
    -		/// 
    -		/// 
    -        public ISqlMapper SqlMap
    -		{
    -			get { return _sqlMap; }
    -		}
    -		#endregion
    -
    -		#region Constructor (s) / Destructor
    -		/// 
    -		/// 
    -		/// 
    -		public SqlMapDaoSessionHandler()
    -		{
    -		}
    -		#endregion
    -		
    -		#region Methods
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public void Configure(NameValueCollection properties, IDictionary resources)
    -		{
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -			XmlDocument document = null;
    -
    -			try
    -			{
    -				DataSource dataSource = (DataSource) resources["DataSource"];
    -				bool useConfigFileWatcher = (bool) resources["UseConfigFileWatcher"];
    -				
    -				if (resources.Contains("resource")||resources.Contains("sqlMapConfigFile"))
    -				{
    -					string fileName = string.Empty;
    -					if (resources.Contains("resource"))
    -					{
    -						fileName = (string) resources["resource"];
    -					}else
    -					{
    -						fileName = (string) resources["sqlMapConfigFile"];
    -					}
    -					if (useConfigFileWatcher == true)
    -					{
    -						ConfigWatcherHandler.AddFileToWatch( Resources.GetFileInfo( fileName ) );
    -					}
    -					document = Resources.GetResourceAsXmlDocument(fileName);
    -				}
    -				else if ( resources.Contains("url") )
    -				{
    -					document = Resources.GetUrlAsXmlDocument( (string) resources["url"] );	
    -				}
    -				else if ( resources.Contains("embedded") )
    -				{
    -					document = Resources.GetEmbeddedResourceAsXmlDocument( (string) resources["embedded"] );	
    -				}
    -				else
    -				{
    -					throw new ConfigurationException("Invalid attribute on daoSessionHandler/property ");
    -				}
    -				_sqlMap = builder.Build( document, dataSource, useConfigFileWatcher, properties);
    -			}
    -			catch(Exception e)
    -			{
    -				throw new ConfigurationException(string.Format("DaoManager could not configure SqlMapDaoSessionHandler.Cause: {0}", e.Message),e);
    -			}
    -		}
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		public DaoSession GetDaoSession(DaoManager daoManager)
    -		{
    -            throw new Exception("figure out session");
    -			//return (new SqlMapDaoSession(daoManager, _sqlMap));
    -		}
    -		#endregion
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/Exceptions/DataAccessException.cs b/src/IBatisNet.DataAccess/Exceptions/DataAccessException.cs
    deleted file mode 100644
    index 6e09c33..0000000
    --- a/src/IBatisNet.DataAccess/Exceptions/DataAccessException.cs
    +++ /dev/null
    @@ -1,109 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using System;
    -using System.Runtime.Serialization;
    -
    -using IBatisNet.Common.Exceptions;
    -
    -namespace IBatisNet.DataAccess.Exceptions
    -{
    -	/// 
    -	/// The DataAccessException is thrown when an error in the Dao occurs.
    -	/// 
    -	[Serializable]
    -	public class DataAccessException : IBatisNetException
    -	{
    -		/// 
    -		/// Initializes a new instance of the  class.
    -		/// 
    -		/// 
    -		/// This constructor initializes the Message property of the new instance 
    -		/// to a system-supplied message that describes the error.
    -		/// 
    -		public DataAccessException() : base("iBatis.NET DataAccess component caused an exception.") { }
    -
    -		/// 
    -		/// Initializes a new instance of the  
    -		/// class with a reference to the inner exception that is the cause of this exception.
    -		/// 
    -		/// 
    -		/// This constructor initializes the Message property of the new instance 
    -		/// using the message parameter.
    -		/// 
    -		/// 
    -		/// The exception that is the cause of the current exception. 
    -		/// If the innerException parameter is not a null reference (Nothing in Visual Basic), 
    -		/// the current exception is raised in a catch block that handles the inner exception.
    -		/// 
    -		public DataAccessException(Exception ex) : base("iBatis.NET DataAccess framework caused an exception.", ex) {  }
    -
    -		/// 
    -		/// Initializes a new instance of the  
    -		/// class with a specified error message.
    -		/// 
    -		/// 
    -		/// This constructor initializes the Message property of the new instance to 
    -		/// the Message property of the passed in exception. 
    -		/// 
    -		/// The message that describes the error.
    -		public DataAccessException( string message ) : base ( message ) { }
    -
    -		/// 
    -		/// Initializes a new instance of the  
    -		/// class with a specified error message and a reference to the inner exception 
    -		/// that is the cause of this exception.
    -		/// 
    -		/// 
    -		/// An exception that is thrown as a direct result of a previous exception should include a reference to the previous 
    -		/// exception in the InnerException property. 
    -		/// The InnerException property returns the same value that is passed into the constructor, or a null reference 
    -		/// (Nothing in Visual Basic) if the InnerException property does not supply the inner exception value to the constructor.
    -		/// 
    -		/// The message that describes the error.
    -		/// The exception that caused the error
    -		public DataAccessException( string message, Exception inner ) : base ( message, inner ) { }
    -
    -		/// 
    -		/// Initializes a new instance of the  
    -		/// class with serialized data.
    -		/// 
    -		/// 
    -		/// This constructor is called during deserialization to reconstitute the 
    -		/// exception object transmitted over a stream.
    -		/// 
    -		/// 
    -		/// The  that holds the serialized 
    -		/// object data about the exception being thrown.
    -		/// 
    -		/// 
    -		/// The  that contains contextual 
    -		/// information about the source or destination. 
    -		/// 
    -		protected DataAccessException(SerializationInfo info, StreamingContext context) : base (info, context) {}
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj b/src/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj
    deleted file mode 100644
    index 1a12542..0000000
    --- a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.2005.csproj
    +++ /dev/null
    @@ -1,182 +0,0 @@
    -
    -  
    -    Local
    -    8.0.50727
    -    2.0
    -    {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataAccess
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataAccess
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    IBatisNet.DataAccess.xml
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    IBatisNet.DataAccess.xml
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -  
    -  
    -    
    -      Castle.DynamicProxy
    -      ..\External-Bin\Net\2.0\Castle.DynamicProxy.dll
    -    
    -    
    -      System
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Web
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -  
    -  
    -    
    -      {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}
    -      IBatisNet.Common.2005
    -    
    -    
    -      {F3E45F39-3224-4EAD-B138-EB5CC0E32824}
    -      IBatisNet.DataMapper.20005
    -    
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.2010.csproj b/src/IBatisNet.DataAccess/IBatisNet.DataAccess.2010.csproj
    deleted file mode 100644
    index c53155a..0000000
    --- a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.2010.csproj
    +++ /dev/null
    @@ -1,220 +0,0 @@
    -
    -
    -  
    -    Local
    -    8.0.50727
    -    2.0
    -    {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataAccess
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataAccess
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -    v4.0
    -    2.0
    -    
    -    publish\
    -    true
    -    Disk
    -    false
    -    Foreground
    -    7
    -    Days
    -    false
    -    false
    -    true
    -    0
    -    1.0.0.%2a
    -    false
    -    false
    -    true
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    IBatisNet.DataAccess.xml
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    IBatisNet.DataAccess.xml
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    
    -      False
    -      ..\External-Bin\Net\4.0\Castle.Core.dll
    -    
    -    
    -      System
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Web
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -  
    -  
    -    
    -      False
    -      .NET Framework 3.5 SP1 Client Profile
    -      false
    -    
    -    
    -      False
    -      .NET Framework 3.5 SP1
    -      true
    -    
    -    
    -      False
    -      Windows Installer 3.1
    -      true
    -    
    -  
    -  
    -    
    -      {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}
    -      IBatisNet.Common.2010
    -    
    -    
    -      {F3E45F39-3224-4EAD-B138-EB5CC0E32824}
    -      IBatisNet.DataMapper.2010
    -    
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net35.2010.csproj b/src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net35.2010.csproj
    deleted file mode 100644
    index 0cbdc12..0000000
    --- a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net35.2010.csproj
    +++ /dev/null
    @@ -1,220 +0,0 @@
    -
    -
    -  
    -    Local
    -    8.0.50727
    -    2.0
    -    {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataAccess
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataAccess
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -    v3.5
    -    2.0
    -    
    -    publish\
    -    true
    -    Disk
    -    false
    -    Foreground
    -    7
    -    Days
    -    false
    -    false
    -    true
    -    0
    -    1.0.0.%2a
    -    false
    -    false
    -    true
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    IBatisNet.DataAccess.xml
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    IBatisNet.DataAccess.xml
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    
    -      Castle.DynamicProxy
    -      ..\External-Bin\Net\2.0\Castle.DynamicProxy.dll
    -    
    -    
    -      System
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Web
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -  
    -  
    -    
    -      {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}
    -      IBatisNet.Common.Net35.2010
    -    
    -    
    -      {F3E45F39-3224-4EAD-B138-EB5CC0E32824}
    -      IBatisNet.DataMapper.Net35.2010
    -    
    -  
    -  
    -    
    -      False
    -      .NET Framework 3.5 SP1 Client Profile
    -      false
    -    
    -    
    -      False
    -      .NET Framework 3.5 SP1
    -      true
    -    
    -    
    -      False
    -      Windows Installer 3.1
    -      true
    -    
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net45.2012.csproj b/src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net45.2012.csproj
    deleted file mode 100644
    index b0d7e77..0000000
    --- a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.Net45.2012.csproj
    +++ /dev/null
    @@ -1,221 +0,0 @@
    -
    -
    -  
    -    Local
    -    8.0.50727
    -    2.0
    -    {BEFC4A45-7DF9-40E4-942C-82DC1BA5E708}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataAccess
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataAccess
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -    v4.0
    -    2.0
    -    
    -    publish\
    -    true
    -    Disk
    -    false
    -    Foreground
    -    7
    -    Days
    -    false
    -    false
    -    true
    -    0
    -    1.0.0.%2a
    -    false
    -    false
    -    true
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    IBatisNet.DataAccess.xml
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -    AllRules.ruleset
    -    false
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    IBatisNet.DataAccess.xml
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -    AllRules.ruleset
    -    false
    -  
    -  
    -    
    -      ..\External-Bin\Net\4.0\Castle.Core.dll
    -    
    -    
    -      System
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Web
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -  
    -  
    -    
    -      False
    -      .NET Framework 3.5 SP1 Client Profile
    -      false
    -    
    -    
    -      False
    -      .NET Framework 3.5 SP1
    -      true
    -    
    -    
    -      False
    -      Windows Installer 3.1
    -      true
    -    
    -  
    -  
    -    
    -      {bbc8da4a-ea88-41d9-8b93-929b8f3adade}
    -      IBatisNet.Common.Net45.2012
    -    
    -    
    -      {f3e45f39-3224-4ead-b138-eb5cc0e32824}
    -      IBatisNet.DataMapper.Net45.2012
    -    
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.build b/src/IBatisNet.DataAccess/IBatisNet.DataAccess.build
    deleted file mode 100644
    index 528881d..0000000
    --- a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.build
    +++ /dev/null
    @@ -1,28 +0,0 @@
    -
    -
    -    
    -    
    -        
    -        
    -            
    -                
    -            
    -            
    -                
    -            
    -            
    -                
    -                
    -            
    -			
    -				
    -			
    -        
    -    
    -
    diff --git a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj b/src/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj
    deleted file mode 100644
    index 0ce393a..0000000
    --- a/src/IBatisNet.DataAccess/IBatisNet.DataAccess.csproj
    +++ /dev/null
    @@ -1,271 +0,0 @@
    -
    -    
    -        
    -            
    -                
    -                
    -            
    -            
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -            
    -        
    -        
    -            
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -            
    -        
    -    
    -
    -
    diff --git a/src/IBatisNet.DataAccess/IDaoManager.cs b/src/IBatisNet.DataAccess/IDaoManager.cs
    deleted file mode 100644
    index 71ac317..0000000
    --- a/src/IBatisNet.DataAccess/IDaoManager.cs
    +++ /dev/null
    @@ -1,143 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Revision: 374175 $
    - * $LastChangedDate: 2006-03-22 22:39:21 +0100 (mer., 22 mars 2006) $
    - * $LastChangedBy: gbayon $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2006/2005 - The Apache Software Foundation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using System;
    -using System.Data;
    -
    -using IBatisNet.Common;
    -using IBatisNet.DataAccess.Interfaces;
    -using IBatisNet.DataAccess.SessionStore;
    -
    -namespace IBatisNet.DataAccess
    -{
    -    /// 
    -    /// Contract for a dao manager
    -    /// 
    -    public interface IDaoManager
    -    {
    -        /// 
    -        /// Name used to identify the the 
    -        /// 
    -        string Id { get;set; }
    -
    -        /// 
    -        /// Allow to set a custom session store like the 
    -        /// 
    -        /// Set it after the configuration and before use of the 
    -        /// 
    -        /// daoManager.SessionStore = new HybridWebThreadSessionStore( daoManager.Id );
    -        /// 
    -        ISessionStore SessionStore { set; }
    -        
    -        /// 
    -        /// Begins a database transaction with the specified isolation level.
    -        /// 
    -        /// 
    -        /// The isolation level under which the transaction should run.
    -        /// 
    -        /// A IDalSession.
    -        IDalSession BeginTransaction(IsolationLevel isolationLevel);
    -
    -        /// 
    -        /// Begins a database transaction.
    -        /// 
    -        /// A IDalSession
    -        IDalSession BeginTransaction();
    -
    -        /// 
    -        /// Close a connection
    -        /// 
    -        void CloseConnection();
    -
    -        /// 
    -        /// Commits the database transaction.
    -        /// 
    -        /// 
    -        /// Auto close the connection.
    -        /// 
    -        void CommitTransaction();
    -
    -        /// 
    -        /// Gets a Dao instance for the requested interface type.
    -        /// 
    -        /// The requested interface type.
    -        /// A Dao instance
    -        IDao GetDao(Type daoInterface);
    -
    -
    -        /// 
    -        /// Get a new DaoSession
    -        /// 
    -        /// A new DaoSession
    -        DaoSession GetDaoSession();
    -
    -
    -        /// 
    -        /// Determines whether [is DAO session started].
    -        /// 
    -        /// 
    -        /// 	true if [is DAO session started]; otherwise, false.
    -        /// 
    -        bool IsDaoSessionStarted();
    -
    -        /// 
    -        /// Gets the local DAO session.
    -        /// 
    -        /// The local DAO session.
    -        IDalSession LocalDaoSession { get; }
    -
    -        /// 
    -        /// Gets the local data source.
    -        /// 
    -        /// The local data source.
    -        IDataSource LocalDataSource { get; }
    -
    -
    -        /// 
    -        /// Open a connection, on the specified connection string.
    -        /// 
    -        /// The connection string
    -        IDalSession OpenConnection(string connectionString);
    -
    -        /// 
    -        /// Open a connection.
    -        /// 
    -        /// A IDalSession.
    -        IDalSession OpenConnection();
    -
    -        /// 
    -        /// Rolls back a transaction from a pending state.
    -        /// 
    -        /// 
    -        /// Close the connection.
    -        /// 
    -        void RollBackTransaction();
    -
    -        /// 
    -        /// Gets a Dao instance for the requested interface type.
    -        /// 
    -        IDao this[Type daoInterface] { get; }
    -    }
    -}
    diff --git a/src/IBatisNet.DataAccess/Interfaces/IDao.cs b/src/IBatisNet.DataAccess/Interfaces/IDao.cs
    deleted file mode 100644
    index 9bc7274..0000000
    --- a/src/IBatisNet.DataAccess/Interfaces/IDao.cs
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using System;
    -
    -namespace IBatisNet.DataAccess.Interfaces
    -{
    -	/// 
    -	/// Mark a class as a Dao object.
    -	/// 
    -	public interface IDao
    -	{
    -		
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/Interfaces/IDaoSessionHandler.cs b/src/IBatisNet.DataAccess/Interfaces/IDaoSessionHandler.cs
    deleted file mode 100644
    index b64cbaa..0000000
    --- a/src/IBatisNet.DataAccess/Interfaces/IDaoSessionHandler.cs
    +++ /dev/null
    @@ -1,56 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Using
    -
    -using System.Collections;
    -using System.Collections.Specialized;
    -
    -#endregion
    -
    -
    -namespace IBatisNet.DataAccess.Interfaces
    -{
    -	/// 
    -	/// Description rsume de IDaoSessionHandler.
    -	/// 
    -	public interface IDaoSessionHandler
    -	{
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		/// 
    -		DaoSession GetDaoSession(DaoManager daoManager);
    -
    -		/// 
    -		/// 
    -		/// 
    -		/// The properties scope
    -		/// A collection of object useful to init
    -		void Configure(NameValueCollection properties, IDictionary resources);
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/MessageManager.cs b/src/IBatisNet.DataAccess/MessageManager.cs
    deleted file mode 100644
    index 636c78f..0000000
    --- a/src/IBatisNet.DataAccess/MessageManager.cs
    +++ /dev/null
    @@ -1,134 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Autors
    -
    -/************************************************
    -* Gilles Bayon 
    -*************************************************/
    -#endregion 
    -
    -#region Using
    -
    -using System;
    -using System.Resources;
    -using System.Reflection; 
    -using System.IO;
    -#endregion 
    -
    -namespace IBatisNet.DataAccess
    -{
    -	/// 
    -	/// Summary description for MessageManager.
    -	/// 
    -	public class MessageManager
    -	{
    -		#region Fields
    -
    -		private const string RESOURCE_FILENAME = "IBatisNet.DataAccess";
    -		private static MessageManager _internalManager = new MessageManager();
    -		private ResourceManager _resourceManager= null;
    -
    -		#endregion 
    -
    -		#region Constructor
    -
    -		/// 
    -		/// Constructor.
    -		/// 
    -		public MessageManager()
    -		{
    -			_resourceManager = new ResourceManager(this.GetType().Namespace + RESOURCE_FILENAME, Assembly.GetExecutingAssembly());						
    -		}
    -		#endregion 
    -
    -		#region Properties
    -
    -		/// 
    -		/// Gets a message manager for the assembly resource file.
    -		/// 
    -		public static MessageManager Instance
    -		{
    -			get
    -			{
    -				return _internalManager;
    -			}
    -		}
    -
    -
    -
    -		/// 
    -		/// Gets the message with the specified key from the assembly resource file.
    -		/// 
    -		/// Key of the item to retrieve from the resource file.
    -		/// Value from the resource file identified by the key.
    -		public string this [ string key ]
    -		{
    -			get
    -			{
    -				return _resourceManager.GetString( key, System.Globalization.CultureInfo.CurrentUICulture );																
    -			}
    -		}
    -		#endregion 
    -
    -		#region Methods
    -
    -		/// 
    -		/// Gets a resource stream.
    -		/// 
    -		/// The resource key.
    -		/// A resource stream.
    -		public Stream GetStream( string name )
    -		{
    -			return Assembly.GetExecutingAssembly().GetManifestResourceStream(this.GetType().Namespace + "." + name); 
    -		}
    -
    -		/// 
    -		/// Formats a message stored in the assembly resource file.
    -		/// 
    -		/// The resource key.
    -		/// The format arguments.
    -		/// A formatted string.
    -		public string FormatMessage( string key, params object[] format )
    -		{
    -			return String.Format( System.Globalization.CultureInfo.CurrentCulture, this[key], format );  
    -		}
    -		#endregion 
    -
    -
    -		/// 
    -		/// Class used to expose constants that represent keys in the resource file.
    -		/// 
    -		internal abstract class MessageKeys
    -		{		
    -			internal const string ViewAlreadyConfigured = "ViewAlreadyConfigured";	
    -			internal const string CantFindCommandMapping = "CantFindCommandMapping";	
    -			internal const string CantGetNextView = "CantGetNextView";	
    -			internal const string DocumentNotValidated = "DocumentNotValidated";
    -
    -
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/Scope/ConfigurationScope.cs b/src/IBatisNet.DataAccess/Scope/ConfigurationScope.cs
    deleted file mode 100644
    index 85c08bb..0000000
    --- a/src/IBatisNet.DataAccess/Scope/ConfigurationScope.cs
    +++ /dev/null
    @@ -1,174 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Using
    -
    -using System.Collections.Specialized;
    -using System.Xml;
    -using IBatisNet.DataAccess.Configuration;
    -using IBatisNet.DataAccess.DaoSessionHandlers;
    -
    -#endregion
    -
    -namespace IBatisNet.DataAccess.Scope
    -{
    -	/// 
    -	/// Description rsume de ConfigurationScope.
    -	/// 
    -	public class ConfigurationScope
    -	{
    -		#region Fields
    -		
    -		private ErrorContext _errorContext = null;
    -		private HybridDictionary _providers = new HybridDictionary();
    -		private NameValueCollection _properties = new NameValueCollection();
    -		private HybridDictionary _daoSectionHandlers = new HybridDictionary();
    -		private bool _useConfigFileWatcher = false;
    -		private XmlDocument _daoConfigDocument = null;
    -		private XmlNode _nodeContext = null;
    -		private XmlNamespaceManager _nsmgr = null;
    -
    -		#endregion
    -	
    -		#region Constructors
    -
    -		/// 
    -		/// Default constructor
    -		/// 
    -		public ConfigurationScope()
    -		{
    -			_errorContext = new ErrorContext();
    -
    -			_providers.Clear();
    -			_daoSectionHandlers.Clear();
    -
    -			_daoSectionHandlers.Add(DomDaoManagerBuilder.DEFAULT_DAOSESSIONHANDLER_NAME, typeof(SimpleDaoSessionHandler));
    -			_daoSectionHandlers.Add("ADONET", typeof(SimpleDaoSessionHandler));
    -			_daoSectionHandlers.Add("SqlMap", typeof(SqlMapDaoSessionHandler));
    -
    -		}
    -		#endregion 
    -
    -		#region Properties
    -
    -		
    -		/// 
    -		/// XmlNamespaceManager
    -		/// 
    -		public XmlNamespaceManager XmlNamespaceManager
    -		{
    -			set { _nsmgr = value; }
    -			get { return _nsmgr; }
    -		}
    -
    -		/// 
    -		/// The current context node we are analizing
    -		/// 
    -		public XmlNode NodeContext
    -		{
    -			set
    -			{
    -				_nodeContext = value;
    -			}
    -			get
    -			{
    -				return _nodeContext;
    -			}
    -		}
    -
    -		/// 
    -		/// The XML dao config file
    -		/// 
    -		public XmlDocument DaoConfigDocument
    -		{
    -			set
    -			{
    -				_daoConfigDocument = value;
    -			}
    -			get
    -			{
    -				return _daoConfigDocument;
    -			}
    -		}
    -
    -		/// 
    -		/// Tell us if we use Configuration File Watcher
    -		/// 
    -		public bool UseConfigFileWatcher
    -		{
    -			set
    -			{
    -				_useConfigFileWatcher = value;
    -			}
    -			get
    -			{
    -				return _useConfigFileWatcher;
    -			}
    -		}
    -
    -		/// 
    -		///  Get the request's error context
    -		/// 
    -		public ErrorContext ErrorContext
    -		{
    -			get
    -			{
    -				return _errorContext;
    -			}
    -		}
    -
    -		/// 
    -		///  List of providers
    -		/// 
    -		public HybridDictionary Providers
    -		{
    -			get
    -			{
    -				return _providers;
    -			}
    -		}
    -
    -		/// 
    -		///  List of global properties
    -		/// 
    -		public NameValueCollection Properties
    -		{
    -			get
    -			{
    -				return _properties;
    -			}
    -		}
    -
    -		/// 
    -		/// List of Dao Section Handlers
    -		/// 
    -		public HybridDictionary DaoSectionHandlers
    -		{
    -			get { return _daoSectionHandlers; }
    -		}
    -		#endregion 
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/Scope/ErrorContext.cs b/src/IBatisNet.DataAccess/Scope/ErrorContext.cs
    deleted file mode 100644
    index 316733f..0000000
    --- a/src/IBatisNet.DataAccess/Scope/ErrorContext.cs
    +++ /dev/null
    @@ -1,166 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Using
    -using System;
    -using System.Text;
    -
    -#endregion
    -
    -namespace IBatisNet.DataAccess.Scope
    -{
    -	/// 
    -	/// An error context to help us create meaningful error messages.
    -	/// 
    -	public class ErrorContext
    -	{
    -		#region Fields
    -
    -		private string _resource;
    -		private string _activity;
    -		private string _objectId;
    -		private string _moreInfo;
    -		private Exception _cause;
    -		#endregion 
    -
    -		#region Properties
    -
    -		/// 
    -		/// The resource causing the problem
    -		/// 
    -		public string Resource
    -		{
    -			get { return _resource; }
    -			set { _resource = value; }
    -		}
    -
    -		/// 
    -		/// The activity that was happening when the error happened
    -		/// 
    -		public string Activity
    -		{
    -			get { return _activity; }
    -			set { _activity = value; }
    -		}
    -
    -		/// 
    -		/// The object ID where the problem happened
    -		/// 
    -		public string ObjectId
    -		{
    -			get { return _objectId; }
    -			set { _objectId = value; }
    -		}
    -
    -		/// 
    -		/// More information about the error
    -		/// 
    -		public string MoreInfo
    -		{
    -			get { return _moreInfo; }
    -			set { _moreInfo = value; }
    -		}
    -
    -		/// 
    -		/// The cause of the error
    -		/// 
    -		public Exception Cause
    -		{
    -			get { return _cause; }
    -			set { _cause = value; }
    -		}
    -
    -		#endregion 
    -
    -		#region Methods
    -
    -		/// 
    -		/// Clear the error context
    -		/// 
    -		public void Reset() 
    -		{
    -			_resource = string.Empty;
    -			_activity = string.Empty;
    -			_objectId = string.Empty;
    -			_moreInfo = string.Empty;
    -			_cause = null;
    -		}
    -
    -
    -		/// 
    -		/// ToString method for ErrorContext
    -		/// 
    -		/// 
    -		public override string ToString() 
    -		{
    -			StringBuilder message = new StringBuilder();
    -
    -
    -			// activity
    -			if (_activity != null && _activity.Length > 0) 
    -			{
    -				message.Append("\n- The error occurred while ");
    -				message.Append(_activity);
    -				message.Append(".");
    -			}			
    -
    -			// more info
    -			if (_moreInfo != null && _moreInfo.Length > 0) 
    -			{
    -				message.Append("\n- ");
    -				message.Append(_moreInfo);
    -			}
    -			
    -			// resource
    -			if (_resource != null && _resource.Length > 0) 
    -			{
    -				message.Append("\n- The error occurred in ");
    -				message.Append(_resource);
    -				message.Append(".");
    -			}
    -
    -			// object
    -			if (_objectId != null && _objectId.Length > 0) 
    -			{
    -				message.Append("  \n- Check the ");
    -				message.Append(_objectId);
    -				message.Append(".");
    -			}
    -
    -			// cause
    -			if (_cause != null) 
    -			{
    -				message.Append("\n- Cause: ");
    -				message.Append(_cause.ToString());
    -			}
    -
    -			return message.ToString();
    -		}
    -
    -		#endregion 
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/SessionHolder.cs b/src/IBatisNet.DataAccess/SessionHolder.cs
    deleted file mode 100644
    index 070a48a..0000000
    --- a/src/IBatisNet.DataAccess/SessionHolder.cs
    +++ /dev/null
    @@ -1,109 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 383115 $
    - * $Date: 2006-03-04 07:21:51 -0700 (Sat, 04 Mar 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2004 - Gilles Bayon
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#region Using
    -
    -using System.Runtime.Remoting.Messaging;
    -using IBatisNet.Common;
    -
    -#endregion
    -
    -namespace IBatisNet.DataAccess
    -{
    -	/// 
    -	/// Summary description for SessionHolder.
    -	/// 
    -	/// 
    -	/// See also LocalDataStoreSlot
    -	/// 
    -	public class SessionHolder
    -	{
    -		#region Constants
    -
    -		/// 
    -		/// Token for SqlMapConfig xml root.
    -		/// 
    -		private const string LOCAL_SESSION = "_IBATIS_LOCAL_DAOSESSION_";
    -
    -		#endregion
    -
    -		#region Fields
    -		private string _sessionName = string.Empty;
    -		#endregion
    -
    -		#region Constructor (s) / Destructor
    -
    -		/// 
    -		/// Constructor
    -		/// 
    -		/// The DaoManager name.
    -		public SessionHolder(string daoManagerName)
    -		{
    -			_sessionName = LOCAL_SESSION + daoManagerName;
    -		}
    -		#endregion
    -
    -
    -		#region ISessionContainer Members
    -
    -		#region Properties
    -		/// 
    -		/// Get the local session
    -		/// 
    -		public IDalSession LocalSession
    -		{
    -			get
    -			{
    -				return CallContext.GetData(_sessionName) as IDalSession;
    -			}
    -		}
    -		#endregion
    -
    -		#region Methods
    -		/// 
    -		/// Store the local session.
    -		/// Ensure that the session is unique for each thread.
    -		/// 
    -		/// The session to store
    -		public void Store(IDalSession session)
    -		{
    -			CallContext.SetData(_sessionName, session);
    -		}
    -
    -		/// 
    -		/// Remove the local session.
    -		/// 
    -		public void Dispose()
    -		{
    -			CallContext.SetData(_sessionName, null);
    -		}
    -
    -		#endregion
    -
    -		#endregion
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs b/src/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs
    deleted file mode 100644
    index 8770020..0000000
    --- a/src/IBatisNet.DataAccess/SessionStore/AbstractSessionStore.cs
    +++ /dev/null
    @@ -1,70 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 378715 $
    - * $Date: 2006-10-10 12:57:36 -0600 (Tue, 10 Oct 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2006 - Apache Fondation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using System;
    -using IBatisNet.Common;
    -
    -namespace IBatisNet.DataAccess.SessionStore
    -{
    -	/// 
    -	/// 
    -	/// 
    -	public abstract class AbstractSessionStore  : MarshalByRefObject, ISessionStore
    -	{
    -		const string KEY = "_IBATIS_LOCAL_DAOSESSION_";
    -	    /// 
    -	    /// session name
    -	    /// 
    -		protected string sessionName = string.Empty;
    -
    -		/// 
    -		/// Constructor
    -		/// 
    -        /// The DaoManager name.
    -        public AbstractSessionStore(string daoManagerId)
    -		{
    -            sessionName = KEY + daoManagerId;
    -		}
    -
    -		/// 
    -		/// Get the local session
    -		/// 
    -		public abstract IDalSession LocalSession
    -		{
    -			get; 
    -		}
    -
    -		/// 
    -		/// Store the specified session.
    -		/// 
    -		/// The session to store
    -        public abstract void Store(IDalSession session);
    -
    -		/// 
    -		/// Remove the local session from the storage.
    -		/// 
    -        public abstract void Dispose();
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs b/src/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs
    deleted file mode 100644
    index e48e061..0000000
    --- a/src/IBatisNet.DataAccess/SessionStore/CallContextSessionStore.cs
    +++ /dev/null
    @@ -1,72 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 378715 $
    - * $Date: 2006-10-10 12:57:36 -0600 (Tue, 10 Oct 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2006 - Apache Fondation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using System.Runtime.Remoting.Messaging;
    -using IBatisNet.Common;
    -
    -namespace IBatisNet.DataAccess.SessionStore
    -{
    -	/// 
    -	/// Provides an implementation of 
    -	/// which relies on CallContext
    -    /// This implementation will first get the current session from the current 
    -    /// thread. Do NOT use on web scenario (web applications or web services).
    -	/// 
    -	public class CallContextSessionStore : AbstractSessionStore
    -	{
    -        /// 
    -        /// Initializes a new instance of the  class.
    -        /// 
    -        /// The DaoManager name.
    -        public CallContextSessionStore(string daoManagerId) : base(daoManagerId)
    -		{}
    -
    -		/// 
    -		/// Get the local session
    -		/// 
    -		public override IDalSession LocalSession
    -		{
    -			get { return CallContext.GetData(sessionName) as IDalSession; }
    -		}
    -
    -		/// 
    -		/// Store the specified session.
    -		/// 
    -		/// The session to store
    -
    -		public override void Store(IDalSession session)
    -		{
    -			CallContext.SetData(sessionName, session);
    -		}
    -
    -		/// 
    -		/// Remove the local session.
    -		/// 
    -		public override void Dispose()
    -		{
    -			CallContext.SetData(sessionName, null);
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs b/src/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs
    deleted file mode 100644
    index a094a6d..0000000
    --- a/src/IBatisNet.DataAccess/SessionStore/HybridWebThreadSessionStore.cs
    +++ /dev/null
    @@ -1,102 +0,0 @@
    -
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 378715 $
    - * $Date: 2006-10-10 12:57:36 -0600 (Tue, 10 Oct 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2006 - Apache Fondation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using System.Runtime.Remoting.Messaging;
    -using System.Web;
    -using IBatisNet.Common;
    -
    -namespace IBatisNet.DataAccess.SessionStore
    -{
    -    /// 
    -    /// This implementation of will first try 
    -    /// to get the currentrequest, and if not found, will use a thread local.
    -    /// 
    -    /// 
    -    /// This is used for scenarios where most of the you need per request session, but you also does some work outside a 
    -    /// request (in a thread pool thread, for instance).
    -    /// 
    -    public class HybridWebThreadSessionStore : AbstractSessionStore
    -    {
    -
    -        /// 
    -        /// Initializes a new instance of the  class.
    -        /// 
    -        /// The DaoManager name.
    -        public HybridWebThreadSessionStore(string daoManagerId) : base(daoManagerId)
    -        { }
    -
    -        /// 
    -        /// Get the local session
    -        /// 
    -        public override IDalSession LocalSession
    -        {
    -            get
    -            {
    -                HttpContext currentContext = HttpContext.Current;
    -                if (currentContext == null)
    -                {
    -                    return CallContext.GetData(sessionName) as IDalSession;
    -                }
    -                return currentContext.Items[sessionName] as IDalSession;
    -            }
    -        }
    -
    -        /// 
    -        /// Store the specified session.
    -        /// 
    -        /// The session to store
    -        public override void Store(IDalSession session)
    -        {
    -            HttpContext currentContext = HttpContext.Current;
    -            if (currentContext == null)
    -            {
    -                CallContext.SetData(sessionName, session);
    -            }
    -            else
    -            {
    -                currentContext.Items[sessionName] = session;
    -            }
    -        }
    -
    -        /// 
    -        /// Remove the local session.
    -        /// 
    -        public override void Dispose()
    -        {
    -            HttpContext currentContext = HttpContext.Current;
    -            if (currentContext == null)
    -            {
    -                CallContext.SetData(sessionName, null);
    -            }
    -            else
    -            {
    -                currentContext.Items[sessionName] = null;
    -            }
    -        }
    -
    -
    -    }
    -}
    diff --git a/src/IBatisNet.DataAccess/SessionStore/ISessionStore.cs b/src/IBatisNet.DataAccess/SessionStore/ISessionStore.cs
    deleted file mode 100644
    index 37eed9d..0000000
    --- a/src/IBatisNet.DataAccess/SessionStore/ISessionStore.cs
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 378715 $
    - * $Date: 2006-06-29 13:57:52 -0600 (Thu, 29 Jun 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2006 - Apache Fondation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using IBatisNet.Common;
    -
    -namespace IBatisNet.DataAccess.SessionStore
    -{
    -
    -	/// 
    -	/// Provides the contract for implementors who want to store session.
    -	/// 
    -	public interface ISessionStore
    -	{
    -		/// 
    -		/// Get the local session
    -		/// 
    -		IDalSession LocalSession
    -		{
    -			get; 
    -		}
    -
    -		/// 
    -		/// Store the specified session.
    -		/// 
    -		/// The session to store
    -		void Store(IDalSession session);
    -
    -		/// 
    -		/// Remove the local session from the storage.
    -		/// 
    -		void Dispose();
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/SessionStore/SessionStoreFactory .cs b/src/IBatisNet.DataAccess/SessionStore/SessionStoreFactory .cs
    deleted file mode 100644
    index d87f1db..0000000
    --- a/src/IBatisNet.DataAccess/SessionStore/SessionStoreFactory .cs	
    +++ /dev/null
    @@ -1,58 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 378715 $
    - * $Date: 2007-03-06 15:23:03 -0700 (Tue, 06 Mar 2007) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2006 - Apache Fondation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -
    -namespace IBatisNet.DataAccess.SessionStore
    -{
    -	/// 
    -	/// Build a session container for a Windows or Web context.
    -	/// When running in the context of a web application the session object is 
    -	/// stored in HttpContext items and has 'per request' lifetime.
    -	/// When running in the context of a windows application the session object is 
    -	/// stored via CallContext.
    -	/// 
    -	public sealed class SessionStoreFactory
    -	{
    -
    -		/// 
    -		/// Get a session container for a Windows or Web context.
    -		/// 
    -		/// The DaoManager name.
    -		/// 
    -		static public ISessionStore GetSessionStore(string daoManagerName)
    -		{
    -			if (System.Web.HttpContext.Current == null)
    -			{
    -				return new CallContextSessionStore(daoManagerName);
    -			}
    -			else
    -			{
    -				return new WebSessionStore(daoManagerName);
    -			}
    -		}
    -
    -	}
    -}
    -
    diff --git a/src/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs b/src/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs
    deleted file mode 100644
    index 2ba39c5..0000000
    --- a/src/IBatisNet.DataAccess/SessionStore/WebSessionStore.cs
    +++ /dev/null
    @@ -1,90 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Header: $
    - * $Revision: 378715 $
    - * $Date: 2006-10-10 12:57:36 -0600 (Tue, 10 Oct 2006) $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2006 - Apache Fondation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -using System.Web;
    -using IBatisNet.Common;
    -using IBatisNet.Common.Exceptions;
    -
    -namespace IBatisNet.DataAccess.SessionStore
    -{
    -
    -	/// 
    -	/// Provides an implementation of 
    -	/// which relies on HttpContext. Suitable for web projects.
    -	/// 
    -	public class WebSessionStore : AbstractSessionStore
    -	{
    -        /// 
    -        /// Initializes a new instance of the  class.
    -        /// 
    -        /// The DaoManager name.
    -        public WebSessionStore(string daoManagerId) : base(daoManagerId)
    -		{}
    -
    -		/// 
    -		/// Get the local session
    -		/// 
    -		public override IDalSession LocalSession
    -		{
    -			get
    -			{
    -				HttpContext currentContext = ObtainSessionContext();
    -				return currentContext.Items[sessionName] as IDalSession;
    -			}
    -		}
    -
    -		/// 
    -		/// Store the specified session.
    -		/// 
    -		/// The session to store
    -
    -		public override void Store(IDalSession session)
    -		{
    -			HttpContext currentContext = ObtainSessionContext();
    -			currentContext.Items[sessionName] = session;
    -		}
    -
    -		/// 
    -		/// Remove the local session.
    -		/// 
    -		public override void Dispose()
    -		{
    -			HttpContext currentContext = ObtainSessionContext();
    -			currentContext.Items[sessionName] = null;
    -		}
    -
    -		
    -		private static HttpContext ObtainSessionContext()
    -		{
    -			HttpContext currentContext = HttpContext.Current;
    -	
    -			if (currentContext == null)
    -			{
    -				throw new IBatisNetException("WebSessionStore: Could not obtain reference to HttpContext");
    -			}
    -			return currentContext;
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataAccess/licence.txt b/src/IBatisNet.DataAccess/licence.txt
    deleted file mode 100644
    index 85fe608..0000000
    --- a/src/IBatisNet.DataAccess/licence.txt
    +++ /dev/null
    @@ -1,201 +0,0 @@
    - Apache License
    -                           Version 2.0, January 2004
    -                        http://www.apache.org/licenses/
    -
    -   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    -
    -   1. Definitions.
    -
    -      "License" shall mean the terms and conditions for use, reproduction,
    -      and distribution as defined by Sections 1 through 9 of this document.
    -
    -      "Licensor" shall mean the copyright owner or entity authorized by
    -      the copyright owner that is granting the License.
    -
    -      "Legal Entity" shall mean the union of the acting entity and all
    -      other entities that control, are controlled by, or are under common
    -      control with that entity. For the purposes of this definition,
    -      "control" means (i) the power, direct or indirect, to cause the
    -      direction or management of such entity, whether by contract or
    -      otherwise, or (ii) ownership of fifty percent (50%) or more of the
    -      outstanding shares, or (iii) beneficial ownership of such entity.
    -
    -      "You" (or "Your") shall mean an individual or Legal Entity
    -      exercising permissions granted by this License.
    -
    -      "Source" form shall mean the preferred form for making modifications,
    -      including but not limited to software source code, documentation
    -      source, and configuration files.
    -
    -      "Object" form shall mean any form resulting from mechanical
    -      transformation or translation of a Source form, including but
    -      not limited to compiled object code, generated documentation,
    -      and conversions to other media types.
    -
    -      "Work" shall mean the work of authorship, whether in Source or
    -      Object form, made available under the License, as indicated by a
    -      copyright notice that is included in or attached to the work
    -      (an example is provided in the Appendix below).
    -
    -      "Derivative Works" shall mean any work, whether in Source or Object
    -      form, that is based on (or derived from) the Work and for which the
    -      editorial revisions, annotations, elaborations, or other modifications
    -      represent, as a whole, an original work of authorship. For the purposes
    -      of this License, Derivative Works shall not include works that remain
    -      separable from, or merely link (or bind by name) to the interfaces of,
    -      the Work and Derivative Works thereof.
    -
    -      "Contribution" shall mean any work of authorship, including
    -      the original version of the Work and any modifications or additions
    -      to that Work or Derivative Works thereof, that is intentionally
    -      submitted to Licensor for inclusion in the Work by the copyright owner
    -      or by an individual or Legal Entity authorized to submit on behalf of
    -      the copyright owner. For the purposes of this definition, "submitted"
    -      means any form of electronic, verbal, or written communication sent
    -      to the Licensor or its representatives, including but not limited to
    -      communication on electronic mailing lists, source code control systems,
    -      and issue tracking systems that are managed by, or on behalf of, the
    -      Licensor for the purpose of discussing and improving the Work, but
    -      excluding communication that is conspicuously marked or otherwise
    -      designated in writing by the copyright owner as "Not a Contribution."
    -
    -      "Contributor" shall mean Licensor and any individual or Legal Entity
    -      on behalf of whom a Contribution has been received by Licensor and
    -      subsequently incorporated within the Work.
    -
    -   2. Grant of Copyright License. Subject to the terms and conditions of
    -      this License, each Contributor hereby grants to You a perpetual,
    -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    -      copyright license to reproduce, prepare Derivative Works of,
    -      publicly display, publicly perform, sublicense, and distribute the
    -      Work and such Derivative Works in Source or Object form.
    -
    -   3. Grant of Patent License. Subject to the terms and conditions of
    -      this License, each Contributor hereby grants to You a perpetual,
    -      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
    -      (except as stated in this section) patent license to make, have made,
    -      use, offer to sell, sell, import, and otherwise transfer the Work,
    -      where such license applies only to those patent claims licensable
    -      by such Contributor that are necessarily infringed by their
    -      Contribution(s) alone or by combination of their Contribution(s)
    -      with the Work to which such Contribution(s) was submitted. If You
    -      institute patent litigation against any entity (including a
    -      cross-claim or counterclaim in a lawsuit) alleging that the Work
    -      or a Contribution incorporated within the Work constitutes direct
    -      or contributory patent infringement, then any patent licenses
    -      granted to You under this License for that Work shall terminate
    -      as of the date such litigation is filed.
    -
    -   4. Redistribution. You may reproduce and distribute copies of the
    -      Work or Derivative Works thereof in any medium, with or without
    -      modifications, and in Source or Object form, provided that You
    -      meet the following conditions:
    -
    -      (a) You must give any other recipients of the Work or
    -          Derivative Works a copy of this License; and
    -
    -      (b) You must cause any modified files to carry prominent notices
    -          stating that You changed the files; and
    -
    -      (c) You must retain, in the Source form of any Derivative Works
    -          that You distribute, all copyright, patent, trademark, and
    -          attribution notices from the Source form of the Work,
    -          excluding those notices that do not pertain to any part of
    -          the Derivative Works; and
    -
    -      (d) If the Work includes a "NOTICE" text file as part of its
    -          distribution, then any Derivative Works that You distribute must
    -          include a readable copy of the attribution notices contained
    -          within such NOTICE file, excluding those notices that do not
    -          pertain to any part of the Derivative Works, in at least one
    -          of the following places: within a NOTICE text file distributed
    -          as part of the Derivative Works; within the Source form or
    -          documentation, if provided along with the Derivative Works; or,
    -          within a display generated by the Derivative Works, if and
    -          wherever such third-party notices normally appear. The contents
    -          of the NOTICE file are for informational purposes only and
    -          do not modify the License. You may add Your own attribution
    -          notices within Derivative Works that You distribute, alongside
    -          or as an addendum to the NOTICE text from the Work, provided
    -          that such additional attribution notices cannot be construed
    -          as modifying the License.
    -
    -      You may add Your own copyright statement to Your modifications and
    -      may provide additional or different license terms and conditions
    -      for use, reproduction, or distribution of Your modifications, or
    -      for any such Derivative Works as a whole, provided Your use,
    -      reproduction, and distribution of the Work otherwise complies with
    -      the conditions stated in this License.
    -
    -   5. Submission of Contributions. Unless You explicitly state otherwise,
    -      any Contribution intentionally submitted for inclusion in the Work
    -      by You to the Licensor shall be under the terms and conditions of
    -      this License, without any additional terms or conditions.
    -      Notwithstanding the above, nothing herein shall supersede or modify
    -      the terms of any separate license agreement you may have executed
    -      with Licensor regarding such Contributions.
    -
    -   6. Trademarks. This License does not grant permission to use the trade
    -      names, trademarks, service marks, or product names of the Licensor,
    -      except as required for reasonable and customary use in describing the
    -      origin of the Work and reproducing the content of the NOTICE file.
    -
    -   7. Disclaimer of Warranty. Unless required by applicable law or
    -      agreed to in writing, Licensor provides the Work (and each
    -      Contributor provides its Contributions) on an "AS IS" BASIS,
    -      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
    -      implied, including, without limitation, any warranties or conditions
    -      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
    -      PARTICULAR PURPOSE. You are solely responsible for determining the
    -      appropriateness of using or redistributing the Work and assume any
    -      risks associated with Your exercise of permissions under this License.
    -
    -   8. Limitation of Liability. In no event and under no legal theory,
    -      whether in tort (including negligence), contract, or otherwise,
    -      unless required by applicable law (such as deliberate and grossly
    -      negligent acts) or agreed to in writing, shall any Contributor be
    -      liable to You for damages, including any direct, indirect, special,
    -      incidental, or consequential damages of any character arising as a
    -      result of this License or out of the use or inability to use the
    -      Work (including but not limited to damages for loss of goodwill,
    -      work stoppage, computer failure or malfunction, or any and all
    -      other commercial damages or losses), even if such Contributor
    -      has been advised of the possibility of such damages.
    -
    -   9. Accepting Warranty or Additional Liability. While redistributing
    -      the Work or Derivative Works thereof, You may choose to offer,
    -      and charge a fee for, acceptance of support, warranty, indemnity,
    -      or other liability obligations and/or rights consistent with this
    -      License. However, in accepting such obligations, You may act only
    -      on Your own behalf and on Your sole responsibility, not on behalf
    -      of any other Contributor, and only if You agree to indemnify,
    -      defend, and hold each Contributor harmless for any liability
    -      incurred by, or claims asserted against, such Contributor by reason
    -      of your accepting any such warranty or additional liability.
    -
    -   END OF TERMS AND CONDITIONS
    -
    -   APPENDIX: How to apply the Apache License to your work.
    -
    -      To apply the Apache License to your work, attach the following
    -      boilerplate notice, with the fields enclosed by brackets "[]"
    -      replaced with your own identifying information. (Don't include
    -      the brackets!)  The text should be enclosed in the appropriate
    -      comment syntax for the file format. We also recommend that a
    -      file or class name and description of purpose be included on the
    -      same "printed page" as the copyright notice for easier
    -      identification within third-party archives.
    -
    -   Copyright 2004 Gilles Bayon
    -
    -   Licensed under the Apache License, Version 2.0 (the "License");
    -   you may not use this file except in compliance with the License.
    -   You may obtain a copy of the License at
    -
    -       http://www.apache.org/licenses/LICENSE-2.0
    -
    -   Unless required by applicable law or agreed to in writing, software
    -   distributed under the License is distributed on an "AS IS" BASIS,
    -   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    -   See the License for the specific language governing permissions and
    -   limitations under the License.
    diff --git a/src/IBatisNet.DataAccess/notice.txt b/src/IBatisNet.DataAccess/notice.txt
    deleted file mode 100644
    index 6cc7442..0000000
    --- a/src/IBatisNet.DataAccess/notice.txt
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -ADDITIONAL TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
    -FOR COMPLETE TERMS, SEE ALSO LICENSE.TXT, WHICH IS INCORPORATED BY REFERENCE
    -
    -This product includes software derived from "iBATIS Database Layer" and
    -"iBATIS SQL Maps" developed by Clinton Begin (http://www.ibatis.com/).
    -
    -Permission to use the name "iBATIS.NET" in connection with this 
    -product has been granted by Clinton Begin.
    -
    -The names "iBATIS.NET" or "Clinton Begin" must not be used to endorse  
    -or promote products derived from this software without prior written
    -permission of Clinton Begin. For written permission, please contact 
    -clinton.begin@ibatis.com.
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/AssemblyInfo.cs b/src/IBatisNet.DataMapper.Test/AssemblyInfo.cs
    deleted file mode 100644
    index 76201ae..0000000
    --- a/src/IBatisNet.DataMapper.Test/AssemblyInfo.cs
    +++ /dev/null
    @@ -1,58 +0,0 @@
    -using System.Reflection;
    -using System.Runtime.CompilerServices;
    -
    -//
    -// Les informations gnrales relatives  un assembly dpendent de 
    -// l'ensemble d'attributs suivant. Pour modifier les informations
    -// associes  un assembly, changez les valeurs de ces attributs.
    -//
    -[assembly: AssemblyTitle("")]
    -[assembly: AssemblyDescription("")]
    -[assembly: AssemblyConfiguration("")]
    -[assembly: AssemblyCompany("")]
    -[assembly: AssemblyProduct("")]
    -[assembly: AssemblyCopyright("")]
    -[assembly: AssemblyTrademark("")]
    -[assembly: AssemblyCulture("")]		
    -
    -//
    -// Les informations de version pour un assembly se composent des quatre valeurs suivantes:
    -//
    -//      Version principale
    -//      Version secondaire 
    -//      Numro de build
    -//      Rvision
    -//
    -// Vous pouvez spcifier toutes les valeurs ou indiquer des numros de rvision et de build par dfaut 
    -// en utilisant '*', comme ci-dessous :
    -
    -[assembly: AssemblyVersion("1.0.*")]
    -
    -//
    -// Pour signer votre assembly, vous devez spcifier la cl  utiliser. Consultez 
    -// la documentation Microsoft .NET Framework pour plus d'informations sur la signature d'un assembly.
    -//
    -// Utilisez les attributs ci-dessous pour contrler la cl utilise lors de la signature. 
    -//
    -// Remarques: 
    -//   (*) Si aucune cl n'est spcifie, l'assembly n'est pas sign.
    -//   (*) KeyName fait rfrence  une cl installe dans le fournisseur de
    -//       services cryptographiques (CSP) de votre ordinateur. KeyFile fait rfrence  un fichier qui contient
    -//       une cl.
    -//   (*) Si les valeurs de KeyFile et de KeyName sont spcifies, le 
    -//       traitement suivant se produit:
    -//       (1) Si KeyName se trouve dans le CSP, la cl est utilise.
    -//       (2) Si KeyName n'existe pas mais que KeyFile existe, la cl 
    -//           de KeyFile est installe dans le CSP et utilise.
    -//   (*) Pour crer KeyFile, vous pouvez utiliser l'utilitaire sn.exe (Strong Name, Nom fort).
    -//        Lors de la spcification de KeyFile, son emplacement doit tre
    -//        relatif au rpertoire de sortie du projet qui est
    -//       %Project Directory%\obj\. Par exemple, si votre KeyFile se trouve
    -//       dans le rpertoire du projet, vous devez spcifier l'attribut 
    -//       AssemblyKeyFile sous la forme [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
    -//   (*) DelaySign (signature diffre) est une option avance. Pour plus d'informations, consultez la
    -//       documentation Microsoft .NET Framework.
    -//
    -[assembly: AssemblyDelaySign(false)]
    -[assembly: AssemblyKeyFile("")]
    -[assembly: AssemblyKeyName("")]
    diff --git a/src/IBatisNet.DataMapper.Test/DataBase-Template.config b/src/IBatisNet.DataMapper.Test/DataBase-Template.config
    deleted file mode 100644
    index 232a900..0000000
    --- a/src/IBatisNet.DataMapper.Test/DataBase-Template.config
    +++ /dev/null
    @@ -1,23 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -	
    -  
    -	
    -	
    -	
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/A.cs b/src/IBatisNet.DataMapper.Test/Domain/A.cs
    deleted file mode 100644
    index 9e5db5d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/A.cs
    +++ /dev/null
    @@ -1,46 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for A.
    -	/// 
    -	public class A
    -	{
    -		private string _id;
    -		private string _libelle;
    -		private B _b;
    -		private E _e;
    -		private F _f;
    -
    -		public B B
    -		{
    -			get { return _b; }
    -			set { _b = value; }
    -		}
    -
    -		public E E
    -		{
    -			get { return _e; }
    -			set { _e = value; }
    -		}
    -
    -		public F F
    -		{
    -			get { return _f; }
    -			set { _f = value; }
    -		}
    -
    -		public string Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Libelle
    -		{
    -			get { return _libelle; }
    -			set { _libelle = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Account.cs b/src/IBatisNet.DataMapper.Test/Domain/Account.cs
    deleted file mode 100644
    index 870afd1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Account.cs
    +++ /dev/null
    @@ -1,150 +0,0 @@
    -using System;
    -using System.Collections;
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public interface IAccount
    -    {
    -        int Id { get; set; }
    -        string FirstName { get; set; }
    -        string LastName { get; set; }
    -        string EmailAddress { get; set; }
    -    }
    -
    -    public class BaseAccount : IAccount
    -    {
    -        private int id;
    -        private string firstName;
    -        private string lastName;
    -        private string emailAddress;
    -
    -        #region IAccount Members
    -
    -        public int Id
    -        {
    -            get { return id; }
    -            set { id = value; }
    -        }
    -
    -        public string FirstName
    -        {
    -            get { return firstName; }
    -            set { firstName = value; }
    -        }
    -
    -        public string LastName
    -        {
    -            get { return lastName; }
    -            set { lastName = value; }
    -        }
    -
    -        public string EmailAddress
    -        {
    -            get { return emailAddress; }
    -            set { emailAddress = value; }
    -        }
    -
    -        #endregion
    -    }
    -
    -	/// 
    -	/// Description rsume de Account.
    -	/// 
    -	[Serializable]
    -	public class Account
    -	{
    -		private int id;
    -		private string _firstName;
    -		private string _lastName;
    -		private string _emailAddress;
    -		private int[] _ids = null;
    -		private bool _bannerOption = false;
    -		private bool _cartOption = false;
    -	    private Document _document = null;
    -
    -        #if dotnet2
    -        protected IList documents = new List();
    -
    -        public IList Documents
    -        {
    -            get { return documents; }
    -        }
    -        #else
    -        protected IList documents = new ArrayList();
    -
    -        public IList Documents
    -        {
    -            get { return documents; }
    -        }
    -        #endif
    -
    -        public Account()
    -		{}
    -
    -        public Account(int identifiant, string firstName, string lastName)
    -		{
    -            id = identifiant;
    -			_firstName = firstName;
    -			_lastName = lastName;
    -		}
    -
    -        public Account(int identifiant, string firstName, string lastName, Document document)
    -        {
    -            id = identifiant;
    -            _firstName = firstName;
    -            _lastName = lastName;
    -            _document = document;
    -        }
    -
    -		public virtual int Id
    -		{
    -			get { return id; }
    -			set { id = value; }
    -		}
    -
    -		public string FirstName
    -		{
    -			get { return _firstName; }
    -			set { _firstName = value; }
    -		}
    -
    -		public string LastName
    -		{
    -			get { return _lastName; }
    -			set { _lastName = value; }
    -		}
    -
    -		public string EmailAddress
    -		{
    -			get { return _emailAddress; }
    -			set { _emailAddress = value; }
    -		}
    -
    -		public int[] Ids
    -		{
    -			get { return _ids; }
    -			set { _ids = value; }
    -		}
    -
    -		public bool BannerOption
    -		{
    -			get { return _bannerOption; }
    -			set { _bannerOption = value; }
    -		}
    -
    -		public bool CartOption
    -		{
    -			get { return _cartOption; }
    -			set { _cartOption = value; }
    -		}
    -
    -        public Document Document
    -        {
    -            get { return _document; }
    -            set { _document = value; }
    -        }
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/AccountBis.cs b/src/IBatisNet.DataMapper.Test/Domain/AccountBis.cs
    deleted file mode 100644
    index fce6335..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/AccountBis.cs
    +++ /dev/null
    @@ -1,15 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de AccountBis.
    -	/// 
    -	public class AccountBis
    -	{
    -		public int Id;
    -		public string FirstName;
    -		public string LastName;
    -		public string EmailAddress;
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/AccountCollection.cs b/src/IBatisNet.DataMapper.Test/Domain/AccountCollection.cs
    deleted file mode 100644
    index 5da039f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/AccountCollection.cs
    +++ /dev/null
    @@ -1,64 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -
    -
    -namespace IBatisNet.DataMapper.Test.Domain 
    -{
    -	public class AccountCollection : CollectionBase 
    -	{
    -		public AccountCollection() {}
    -
    -		public Account this[int index] 
    -		{
    -			get	{ return (Account)List[index]; }
    -			set { List[index] = value; }
    -		}
    -
    -		public int Add(Account value) 
    -		{
    -			return List.Add(value);
    -		}
    -
    -		public void AddRange(Account[] value) 
    -		{
    -			for (int i = 0;	i < value.Length; i++) 
    -			{
    -				Add(value[i]);
    -			}
    -		}
    -
    -		public void AddRange(AccountCollection value) 
    -		{
    -			for (int i = 0;	i < value.Count; i++) 
    -			{
    -				Add(value[i]);
    -			}
    -		}
    -
    -		public bool Contains(Account value) 
    -		{
    -			return List.Contains(value);
    -		}
    -
    -		public void CopyTo(Account[] array, int index) 
    -		{
    -			List.CopyTo(array, index);
    -		}
    -
    -		public int IndexOf(Account value) 
    -		{
    -			return List.IndexOf(value);
    -		}
    -		
    -		public void Insert(int index, Account value) 
    -		{
    -			List.Insert(index, value);
    -		}
    -		
    -		public void Remove(Account value) 
    -		{
    -			List.Remove(value);
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Address.cs b/src/IBatisNet.DataMapper.Test/Domain/Address.cs
    deleted file mode 100644
    index 102be65..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Address.cs
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class Address
    -    {
    -        private int id;
    -        public int Id
    -        {
    -            get { return id; }
    -            set { id = value; }
    -        }
    -
    -        private string street;
    -        public string Street
    -        {
    -            get { return street; }
    -            set { street = value; }
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Application.cs b/src/IBatisNet.DataMapper.Test/Domain/Application.cs
    deleted file mode 100644
    index e53dde9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Application.cs
    +++ /dev/null
    @@ -1,47 +0,0 @@
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -using System.Collections;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class Application
    -    {
    -        private int id;
    -        public int Id
    -        {
    -            get { return id; }
    -            set { id = value; }
    -        }
    -
    -        private string name;
    -        public string Name
    -        {
    -            get { return name; }
    -            set { name = value; }
    -        }
    -
    -        private Role role;
    -        public Role DefaultRole
    -        {
    -            get { return role; }
    -            set { role = value; }
    -        }
    -
    -#if dotnet2
    -        private IList users;
    -        public IList Users
    -        {
    -            get { return users; }
    -            set { users = value; }
    -        }
    -#else
    -        private IList users;
    -        public IList Users
    -        {
    -            get { return users; }
    -            set { roles = users; }
    -        }        
    -#endif
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/B.cs b/src/IBatisNet.DataMapper.Test/Domain/B.cs
    deleted file mode 100644
    index 3a9fd6d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/B.cs
    +++ /dev/null
    @@ -1,40 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for B.
    -	/// 
    -	public class B 
    -	{
    -		private C _c;
    -		private D _d;
    -		private string _id;
    -		private string _libelle;
    -
    -		public string Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Libelle
    -		{
    -			get { return _libelle; }
    -			set { _libelle = value; }
    -		}
    -
    -		public C C
    -		{
    -			get { return _c; }
    -			set { _c = value; }
    -		}
    -
    -
    -		public D D
    -		{
    -			get { return _d; }
    -			set { _d = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Book.cs b/src/IBatisNet.DataMapper.Test/Domain/Book.cs
    deleted file mode 100644
    index 47af152..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Book.cs
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de Book.
    -	/// 
    -	public class Book : Document
    -	{
    -		private int _pageNumber = -1;
    -
    -		public int PageNumber
    -		{
    -			get { return _pageNumber; }
    -			set { _pageNumber = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/C.cs b/src/IBatisNet.DataMapper.Test/Domain/C.cs
    deleted file mode 100644
    index e447d82..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/C.cs
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for C.
    -	/// 
    -	public class C 
    -	{
    -		private string _id;
    -		private string _libelle;
    -
    -		public string Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Libelle
    -		{
    -			get { return _libelle; }
    -			set { _libelle = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Category.cs b/src/IBatisNet.DataMapper.Test/Domain/Category.cs
    deleted file mode 100644
    index 838473b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Category.cs
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for Category.
    -	/// 
    -	public class Category
    -	{
    -		private int _id;
    -		private string _name;
    -		private Guid _guid;
    -	    private IList _products = new ArrayList();
    -
    -	    public IList Products
    -		{
    -			get { return _products; }
    -			set { _products = value; }
    -		}
    -	    
    -		public Guid EmptyGuid
    -		{
    -			get { return Guid.Empty; }
    -		}
    -
    -		public Guid Guid
    -		{
    -			get { return _guid; }
    -			set { _guid = value; }
    -		}
    -
    -		public string GuidString {
    -			get { return _guid.ToString();  }
    -			set 
    -			{ 
    -				if (value == null) {
    -					_guid = Guid.Empty;
    -				}
    -				else 
    -				{
    -					_guid = new Guid(value.ToString());
    -				}
    -			}
    -		}
    -
    -		public int Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Name
    -		{
    -			get { return _name; }
    -			set { _name = value; }
    -		}
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Child.cs b/src/IBatisNet.DataMapper.Test/Domain/Child.cs
    deleted file mode 100644
    index 45500ad..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Child.cs
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class Child
    -    {
    -        private int _id;
    -        public int Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        private byte[] _rowVersion;
    -        public byte[] RowVersion
    -        {
    -            get { return _rowVersion; }
    -            set { _rowVersion = value; }
    -        }
    -
    -        private int _parentId;
    -        public int ParentId
    -        {
    -            get { return _parentId; }
    -            set { _parentId = value; }
    -        }
    -
    -        private string _description;
    -        public string Description
    -        {
    -            get { return _description; }
    -            set { _description = value; }
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Complex.cs b/src/IBatisNet.DataMapper.Test/Domain/Complex.cs
    deleted file mode 100644
    index 813bbd0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Complex.cs
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de Complex.
    -	/// 
    -	public class Complex
    -	{
    -		private Hashtable _map = null;
    -
    -		public Hashtable Map 
    -		{
    -			get
    -			{
    -				return _map;
    -			}
    -			set
    -			{
    -				_map = value;
    -			}
    -		}
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Coupon.cs b/src/IBatisNet.DataMapper.Test/Domain/Coupon.cs
    deleted file mode 100644
    index f469c25..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Coupon.cs
    +++ /dev/null
    @@ -1,45 +0,0 @@
    -
    -
    -using System.Collections;
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class Coupon
    -    {
    -        private int id;
    -        private string _code;
    -
    -        public virtual int Id
    -        {
    -            get { return id; }
    -            set { id = value; }
    -        }
    -
    -        public string Code
    -        {
    -            get { return _code; }
    -            set { _code = value; }
    -        }
    -
    -#if dotnet2
    -        private IList _brandIds = new List();
    -         
    -        public IList BrandIds
    -        {
    -            get { return _brandIds; }
    -            set { _brandIds = value; }
    -        }
    -#else
    -        private IList _brandIds = new List();
    -         
    -        public IList BrandIds
    -        {
    -            get { return _brandIds; }
    -            set { _brandIds = value; }
    -        }
    -#endif
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/CustomInheritance.cs b/src/IBatisNet.DataMapper.Test/Domain/CustomInheritance.cs
    deleted file mode 100644
    index 4792ef0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/CustomInheritance.cs
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -using System;
    -
    -using IBatisNet.DataMapper.TypeHandlers;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de CustomInheritance.
    -	/// 
    -	public class CustomInheritance : ITypeHandlerCallback
    -	{
    -
    -		#region ITypeHandlerCallback members
    -
    -		public object ValueOf(string nullValue)
    -		{
    -			throw new NotImplementedException();
    -		}
    -
    -		public object GetResult(IResultGetter getter)
    -		{
    -			string type = getter.Value.ToString();
    -
    -			if (type=="Monograph" || type=="Book")
    -			{
    -				return "Book";
    -			}
    -			else if (type=="Tabloid" || type=="Broadsheet" || type=="Newspaper")
    -			{
    -
    -				return "Newspaper";
    -			}
    -			else
    -			{
    -				return "Document";
    -			}
    -
    -		}
    -
    -		public void SetParameter(IParameterSetter setter, object parameter)
    -		{
    -			throw new NotImplementedException(); 
    -		}
    -
    -        public object NullValue
    -        {
    -            get { throw new InvalidCastException("CustomInheritance TypeHandlerCallback could not cast a null value in the field."); }
    -        }
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/D.cs b/src/IBatisNet.DataMapper.Test/Domain/D.cs
    deleted file mode 100644
    index 8611899..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/D.cs
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for D.
    -	/// 
    -	public class D 
    -	{
    -		private string _id;
    -		private string _libelle;
    -
    -		public string Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Libelle
    -		{
    -			get { return _libelle; }
    -			set { _libelle = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Document.cs b/src/IBatisNet.DataMapper.Test/Domain/Document.cs
    deleted file mode 100644
    index 0a6ce5d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Document.cs
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary for Document.
    -	/// 
    -    [Serializable]
    -	public class Document
    -	{
    -		private int _id = -1;
    -		private string _title = string.Empty;
    -
    -		public int Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Title
    -		{
    -			get { return _title; }
    -			set { _title = value; }
    -		}
    -		
    -		public string Test
    -		{
    -			set { _title = value; }
    -		}
    -		
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/DocumentCollection.cs b/src/IBatisNet.DataMapper.Test/Domain/DocumentCollection.cs
    deleted file mode 100644
    index 0661f4f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/DocumentCollection.cs
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -namespace IBatisNet.DataMapper.Test.Domain 
    -{
    -	public class DocumentCollection : CollectionBase 
    -	{
    -		public DocumentCollection() {}
    -
    -		public Document this[int index] {
    -			get	{ return (Document)List[index]; }
    -			set { List[index] = value; }
    -		}
    -
    -		public int Add(Document value) {
    -			return List.Add(value);
    -		}
    -
    -		public void AddRange(Document[] value) {
    -			for (int i = 0;	i < value.Length; i++) {
    -				Add(value[i]);
    -			}
    -		}
    -
    -		public void AddRange(DocumentCollection value) {
    -			for (int i = 0;	i < value.Count; i++) {
    -				Add(value[i]);
    -			}
    -		}
    -
    -		public bool Contains(Document value) {
    -			return List.Contains(value);
    -		}
    -
    -		public void CopyTo(Document[] array, int index) {
    -			List.CopyTo(array, index);
    -		}
    -
    -		public int IndexOf(Document value) {
    -			return List.IndexOf(value);
    -		}
    -		
    -		public void Insert(int index, Document value) {
    -			List.Insert(index, value);
    -		}
    -		
    -		public void Remove(Document value) {
    -			List.Remove(value);
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/E.cs b/src/IBatisNet.DataMapper.Test/Domain/E.cs
    deleted file mode 100644
    index 2039fc7..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/E.cs
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for E.
    -	/// 
    -	public class E
    -	{
    -		private string _id;
    -		private string _libelle;
    -
    -		public string Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Libelle
    -		{
    -			get { return _libelle; }
    -			set { _libelle = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Enumeration.cs b/src/IBatisNet.DataMapper.Test/Domain/Enumeration.cs
    deleted file mode 100644
    index e4c9b52..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Enumeration.cs
    +++ /dev/null
    @@ -1,116 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -
    -    public enum ESearchProfile
    -    {
    -        Temp = 'T',
    -        Permanent = 'P'
    -    }
    -
    -	public enum Days 
    -	{
    -		Sat=1, 
    -		Sun, 
    -		Mon, 
    -		Tue, 
    -		Wed, 
    -		Thu, 
    -		Fri
    -	};
    -
    -	[FlagsAttribute]
    -	public enum Colors 
    -	{ 
    -		Red = 1, 
    -		Green = 2, 
    -		Blue = 4, 
    -		Yellow = 8 
    -	};
    -
    -	[Flags()]
    -	public enum Months : long
    -	{
    -		January  = 1,
    -		February =2,
    -		March =4,
    -		April =8,
    -		May =16,
    -		June =32,
    -		July =64,
    -		August =128,
    -		September =256,
    -		October =512,
    -		November =1024,
    -		December =2048,
    -		All = January|February|March|April|May|June|July|August|September|October|November|December
    -	}
    -
    -	/// 
    -	/// Summary description for EnumTest.
    -	/// 
    -	public class Enumeration
    -	{
    -		private Days _day;
    -		private Months _month;
    -		private Colors _color;
    -		private int _id;
    -        private ESearchProfile search = ESearchProfile.Temp;
    -
    -        public ESearchProfile SearchProfile
    -        {
    -            get { return search; }
    -            set { search = value; }
    -        }
    -
    -		public Months Month
    -		{
    -			get
    -			{
    -				return _month; 
    -			}
    -			set
    -			{ 
    -				_month = value; 
    -			}
    -		}
    -
    -		public int Id
    -		{
    -			get
    -			{
    -				return _id; 
    -			}
    -			set
    -			{ 
    -				_id = value; 
    -			}
    -		}
    -
    -		public Days Day
    -		{
    -			get
    -			{
    -				return _day; 
    -			}
    -			set
    -			{ 
    -				_day = value; 
    -			}
    -		}
    -
    -		public Colors Color
    -		{
    -			get
    -			{
    -				return _color; 
    -			}
    -			set
    -			{ 
    -				_color = value; 
    -			}
    -		}
    -	}
    -
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/F.cs b/src/IBatisNet.DataMapper.Test/Domain/F.cs
    deleted file mode 100644
    index a3e47d0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/F.cs
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for F.
    -	/// 
    -	public class F
    -	{
    -		private string _id;
    -		private string _libelle;
    -
    -		public string Id
    -		{
    -			get { return _id; }
    -			set { _id = value; }
    -		}
    -
    -		public string Libelle
    -		{
    -			get { return _libelle; }
    -			set { _libelle = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/GuidStringTypeHandlerCallback.cs b/src/IBatisNet.DataMapper.Test/Domain/GuidStringTypeHandlerCallback.cs
    deleted file mode 100644
    index 91e0ef8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/GuidStringTypeHandlerCallback.cs
    +++ /dev/null
    @@ -1,51 +0,0 @@
    -using System;
    -
    -using IBatisNet.DataMapper.TypeHandlers;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// GuidStringTypeHandlerCallback.
    -	/// 
    -	public class GuidStringTypeHandlerCallback : ITypeHandlerCallback
    -	{
    -		private const string GUIDNULL = "00000000-0000-0000-0000-000000000000";
    -
    -		#region ITypeHandlerCallback members
    -
    -		public object ValueOf(string nullValue)
    -		{
    -			if (GUIDNULL.Equals(nullValue)) 
    -			{
    -				return Guid.Empty;
    -			} 
    -			else 
    -			{
    -				throw new Exception("Unexpected value " + nullValue + " found where "+GUIDNULL+" was expected to represent a null value.");
    -			}		
    -		}
    -
    -		public object GetResult(IResultGetter getter)
    -		{
    -			try {
    -				Guid result = new Guid(getter.Value.ToString());
    -				return result;
    -			} 
    -			catch
    -			{
    - 				 throw new Exception("Unexpected value " + getter.Value.ToString() + " found where a valid GUID string value was expected.");
    -			}
    -		}
    -
    -		public void SetParameter(IParameterSetter setter, object parameter)
    -		{
    -			setter.Value = parameter.ToString();
    -		}
    -
    -        public object NullValue
    -        {
    -            get { throw new InvalidCastException("GuidStringTypeHandlerCallback could not cast a null value in a guid field."); }
    -        }
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/HundredsTypeHandlerCallback.cs b/src/IBatisNet.DataMapper.Test/Domain/HundredsTypeHandlerCallback.cs
    deleted file mode 100644
    index 0027258..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/HundredsTypeHandlerCallback.cs
    +++ /dev/null
    @@ -1,73 +0,0 @@
    -using System;
    -using IBatisNet.DataMapper.Exceptions;
    -using IBatisNet.DataMapper.TypeHandlers;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de HundredsTypeHandlerCallback.
    -	/// 
    -	public class HundredsTypeHandlerCallback : ITypeHandlerCallback
    -	{
    -
    -		#region ITypeHandlerCallback
    -
    -		public object ValueOf(string nullValue)
    -		{
    -			if ("100".Equals(nullValue)) 
    -			{
    -				return true;
    -			} 
    -			else if ("200".Equals(nullValue)) 
    -			{
    -				return false;
    -			} 
    -			else 
    -			{
    -				throw new DataMapperException("Unexpected value " + nullValue + " found where 100 or 200 was expected.");
    -			}
    -		}
    -
    -		public object GetResult(IResultGetter getter)
    -		{
    -			if (getter.Value != null && getter.Value != System.DBNull.Value) {
    -				int i = Convert.ToInt32(getter.Value);
    -				if (i == 100) 
    -				{
    -					return true;
    -				} 
    -				else if (i == 200) 
    -				{
    -					return false;
    -				} 
    -				else 
    -				{
    -					throw new DataMapperException("Unexpected value " + i + " found where 100 or 200 was expected.");
    -				}
    -			}
    -			else 
    -			{
    -				throw new DataMapperException("Unexpected null value found where 100 or 200 was expected.");
    -			}
    -		}
    -
    -		public void SetParameter(IParameterSetter setter, object parameter)
    -		{
    -			bool b = Convert.ToBoolean(parameter);
    -			if (b) 
    -			{
    -				setter.Value = 100;
    -			} 
    -			else 
    -			{
    -				setter.Value = 200;
    -			}		
    -		}
    -
    -        public object NullValue
    -        {
    -            get { throw new InvalidCastException("HundredsTypeHandlerCallback could not cast a null value in the field."); }
    -        }
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/ImmutableCategory.cs b/src/IBatisNet.DataMapper.Test/Domain/ImmutableCategory.cs
    deleted file mode 100644
    index 2ae4438..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/ImmutableCategory.cs
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain 
    -{
    -	public class ImmutableCategory 
    -	{
    -
    -		private int _id;
    -		private string _name;
    -		private Guid _guid;
    -
    -		public ImmutableCategory(int id, string name, Guid guid) {
    -
    -			_name = name;
    -			_id = id;
    -			_guid = guid;
    -		}
    -		
    -		public string Name {
    -			get { return _name; }
    -		}
    -
    -		
    -		public int Id {
    -			get { return _id; }
    -		}
    -
    -		
    -		public Guid Guid {
    -			get { return _guid; }
    -		}
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/ImmutableCategoryPropertyContainer.cs b/src/IBatisNet.DataMapper.Test/Domain/ImmutableCategoryPropertyContainer.cs
    deleted file mode 100644
    index 70ffa03..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/ImmutableCategoryPropertyContainer.cs
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -
    -namespace IBatisNet.DataMapper.Test.Domain {
    -	
    -	/// 
    -	/// A Container object that stores an immutable category as a property.
    -	/// 
    -	/// This container will be used to test constructor injection on an immutable category, when it's
    -	/// resultmapped through a another object's constructor.
    -	/// 
    -	public class ImmutableCategoryPropertyContainer 
    -	{
    -		private ImmutableCategory _immutableCategory;
    -
    -		public ImmutableCategory ImmutableCategory {
    -			get { return _immutableCategory; }
    -			set { _immutableCategory = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Item.cs b/src/IBatisNet.DataMapper.Test/Domain/Item.cs
    deleted file mode 100644
    index 68cdc0d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Item.cs
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class Item
    -    {
    -        private int _id;
    -        private string _status;
    -        private decimal _unitCost;
    -        private int _quantity;
    -
    -        public int Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        public string Status
    -        {
    -            get { return _status; }
    -            set { _status = value; }
    -        }
    -
    -        public decimal UnitCost
    -        {
    -            get { return _unitCost; }
    -            set { _unitCost = value; }
    -        }
    -
    -        public int Quantity
    -        {
    -            get { return _quantity; }
    -            set { _quantity = value; }
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/LineItem.cs b/src/IBatisNet.DataMapper.Test/Domain/LineItem.cs
    deleted file mode 100644
    index aa83441..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/LineItem.cs
    +++ /dev/null
    @@ -1,124 +0,0 @@
    -using System;
    -using System.Drawing;
    -using System.Drawing.Imaging;
    -using System.IO;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de LineItem.
    -	/// 
    -	[Serializable]
    -	public class LineItem
    -	{
    -		private int _id;
    -		private Order _order;
    -		private string _code;
    -		private int _quantity;
    -		private decimal _price = decimal.MinValue;
    -		private byte[] _pictureData = null;
    -
    -		public int Id
    -		{
    -			get
    -			{
    -				return _id; 
    -			}
    -			set
    -			{ 
    -				_id = value; 
    -			}
    -		}
    -
    -		public Order Order
    -		{
    -			get
    -			{
    -				return _order; 
    -			}
    -			set
    -			{ 
    -				_order = value; 
    -			}
    -		}
    -
    -		public string Code
    -		{
    -			get
    -			{
    -				return _code; 
    -			}
    -			set
    -			{ 
    -				_code = value; 
    -			}
    -		}
    -
    -		public int Quantity
    -		{
    -			get
    -			{
    -				return _quantity; 
    -			}
    -			set
    -			{ 
    -				_quantity = value; 
    -			}
    -		}
    -
    -		public decimal Price
    -		{
    -			get
    -			{
    -				return _price; 
    -			}
    -			set
    -			{ 
    -				_price = value; 
    -			}
    -		}
    -		public byte[] PictureData 
    -		{
    -			get{ return _pictureData; }
    -			set{ _pictureData = value; }
    -		}
    -		public Image Picture 
    -		{
    -			set
    -			{
    -                if (value!=null)
    -                {
    -				    _pictureData = LineItem.ConvertToByteArray( value ); 
    -                }
    -                else
    -                {
    -                    _pictureData = null;
    -                }
    -			}
    -			get
    -			{ 
    -				return LineItem.ConvertToImage( _pictureData ); 
    -			}
    -		}
    -
    -		#region Image converters
    -		static protected byte[] ConvertToByteArray( Image picture ) 
    -		{
    -			MemoryStream memoryStream = new MemoryStream();
    -			picture.Save( memoryStream, ImageFormat.Jpeg );
    -			return memoryStream.ToArray ();
    -		}
    -		static protected Image ConvertToImage( byte[] pictureData ) 
    -		{
    -			if (pictureData != null)
    -			{
    -				return Image.FromStream( new MemoryStream( pictureData ) );
    -			}
    -			else
    -			{
    -				return null;
    -			}
    -		}
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/LineItemCollection.cs b/src/IBatisNet.DataMapper.Test/Domain/LineItemCollection.cs
    deleted file mode 100644
    index a80713a..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/LineItemCollection.cs
    +++ /dev/null
    @@ -1,73 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -
    -namespace IBatisNet.DataMapper.Test.Domain 
    -{
    -	/// 
    -	/// In order to make this class strongly-proxified you have to mark virtual 
    -	/// each property/method you want be proxified.
    -	/// 
    -	[Serializable]
    -	public class LineItemCollection : CollectionBase 
    -	{
    -		public LineItemCollection() {}
    -
    -		public virtual LineItem this[int index] 
    -		{
    -			get	{ return (LineItem)List[index]; }
    -			set { List[index] = value; }
    -		}
    -
    -		public virtual int Add(LineItem value) 
    -		{
    -			return List.Add(value);
    -		}
    -
    -		public virtual void AddRange(LineItem[] value) 
    -		{
    -			for (int i = 0;	i < value.Length; i++) 
    -			{
    -				Add(value[i]);
    -			}
    -		}
    -
    -		public virtual void AddRange(LineItemCollection value) 
    -		{
    -			for (int i = 0;	i < value.Count; i++) 
    -			{
    -				Add(value[i]);
    -			}
    -		}
    -
    -		public virtual bool Contains(LineItem value) 
    -		{
    -			return List.Contains(value);
    -		}
    -
    -		public virtual void CopyTo(LineItem[] array, int index) 
    -		{
    -			List.CopyTo(array, index);
    -		}
    -
    -		public virtual int IndexOf(LineItem value) 
    -		{
    -			return List.IndexOf(value);
    -		}
    -		
    -		public virtual void Insert(int index, LineItem value) 
    -		{
    -			List.Insert(index, value);
    -		}
    -		
    -		public virtual void Remove(LineItem value) 
    -		{
    -			List.Remove(value);
    -		}
    -
    -		public new virtual int Count
    -		{
    -			get {return this.List.Count;}
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/LineItemCollection2.cs b/src/IBatisNet.DataMapper.Test/Domain/LineItemCollection2.cs
    deleted file mode 100644
    index 1e01daa..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/LineItemCollection2.cs
    +++ /dev/null
    @@ -1,22 +0,0 @@
    -using System;
    -using System.Collections.Generic;
    -using System.Collections.ObjectModel;
    -
    -using System.Text;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    [Serializable]
    -    public class LineItemCollection2 : Collection
    -    {
    -        public virtual new int Count
    -        {
    -            get { return base.Count; }
    -        }
    -
    -        public virtual new int IndexOf(LineItem item)
    -        {
    -            return base.IndexOf(item);
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Newspaper.cs b/src/IBatisNet.DataMapper.Test/Domain/Newspaper.cs
    deleted file mode 100644
    index a60dc6c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Newspaper.cs
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de Newspaper.
    -	/// 
    -	public class Newspaper : Document
    -	{
    -		private string _city = string.Empty;
    -
    -		public string City
    -		{
    -			get { return _city; }
    -			set { _city = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Nullable.cs b/src/IBatisNet.DataMapper.Test/Domain/Nullable.cs
    deleted file mode 100644
    index 53cc42d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Nullable.cs
    +++ /dev/null
    @@ -1,216 +0,0 @@
    -using System;
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class NullableClass
    -    {
    -
    -		public NullableClass()
    -		{
    -		}
    -
    -#if dotnet2
    -        private int _id = int.MinValue;
    -        private bool? _testBool = null;
    -        private byte? _testByte = null;
    -        private char? _testChar = null;
    -        private DateTime? _testDateTime = null;
    -        private decimal? _testDecimal = null;
    -        private double? _testDouble = null;
    -        private Guid? _testGuid = null;
    -        private Int16? _testInt16 = null;
    -        private Int32? _testInt32 = null;
    -        private Int64? _testInt64 = null;
    -        private Single? _testSingle = null;
    -        private TimeSpan? _testTimeSpan = null;
    -
    -        public NullableClass(Int32? id)
    -        {
    -            _testInt32 = id;
    -        }
    -
    -        public TimeSpan? TestTimeSpan
    -        {
    -            get { return _testTimeSpan; }
    -            set { _testTimeSpan = value; }
    -        }
    -
    -        public int Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        public bool? TestBool
    -        {
    -            get { return _testBool; }
    -            set { _testBool = value; }
    -        }
    -
    -        public byte? TestByte
    -        {
    -            get { return _testByte; }
    -            set { _testByte = value; }
    -        }
    -
    -        public char? TestChar
    -        {
    -            get { return _testChar; }
    -            set { _testChar = value; }
    -        }
    -
    -        public DateTime? TestDateTime
    -        {
    -            get { return _testDateTime; }
    -            set { _testDateTime = value; }
    -        }
    -
    -        public decimal? TestDecimal
    -        {
    -            get { return _testDecimal; }
    -            set { _testDecimal = value; }
    -        }
    -
    -        public double? TestDouble
    -        {
    -            get { return _testDouble; }
    -            set { _testDouble = value; }
    -        }
    -
    -        public Guid? TestGuid
    -        {
    -            get { return _testGuid; }
    -            set { _testGuid = value; }
    -        }
    -
    -        public Int16? TestInt16
    -        {
    -            get { return _testInt16; }
    -            set { _testInt16 = value; }
    -        }
    -
    -        public Int32? TestInt32
    -        {
    -            get { return _testInt32; }
    -            set { _testInt32 = value; }
    -        }
    -
    -        public Int64? TestInt64
    -        {
    -            get { return _testInt64; }
    -            set { _testInt64 = value; }
    -        }
    -
    -
    -        public Single? TestSingle
    -        {
    -            get { return _testSingle; }
    -            set { _testSingle = value; }
    -        }  
    -#else
    -        private int _id = int.MinValue;
    -        private bool _testBool = false;
    -        private byte _testByte = 1;
    -        private char _testChar = 'a';
    -        private DateTime _testDateTime = DateTime.MinValue;
    -        private decimal _testDecimal = 0;
    -        private double _testDouble = 0;
    -        private Guid _testGuid = Guid.NewGuid();
    -        private Int16 _testInt16 = 0;
    -        private Int32 _testInt32 = 0;
    -        private Int64 _testInt64 = 0;
    -        private Single _testSingle = 0;
    -		private TimeSpan _testTimeSpan;
    -
    -		public NullableClass(int id)
    -		{
    -			_id = id;
    -		}
    -
    -		public TimeSpan TestTimeSpan
    -		{
    -			get { return _testTimeSpan; }
    -			set { _testTimeSpan = value; }
    -		}
    -		
    -    	
    -        public int Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        public bool TestBool
    -        {
    -            get { return _testBool; }
    -            set { _testBool = value; }
    -        }
    -
    -        public byte TestByte
    -        {
    -            get { return _testByte; }
    -            set { _testByte = value; }
    -        }
    -
    -        public char TestChar
    -        {
    -            get { return _testChar; }
    -            set { _testChar = value; }
    -        }
    -
    -        public DateTime TestDateTime
    -        {
    -            get { return _testDateTime; }
    -            set { _testDateTime = value; }
    -        }
    -
    -        public decimal TestDecimal
    -        {
    -            get { return _testDecimal; }
    -            set { _testDecimal = value; }
    -        }
    -
    -        public double TestDouble
    -        {
    -            get { return _testDouble; }
    -            set { _testDouble = value; }
    -        }
    -
    -        public Guid TestGuid
    -        {
    -            get { return _testGuid; }
    -            set { _testGuid = value; }
    -        }
    -
    -        public Int16 TestInt16
    -        {
    -            get { return _testInt16; }
    -            set { _testInt16 = value; }
    -        }
    -
    -        public Int32 TestInt32
    -        {
    -            get { return _testInt32; }
    -            set { _testInt32 = value; }
    -        }
    -
    -        public Int64 TestInt64
    -        {
    -            get { return _testInt64; }
    -            set { _testInt64 = value; }
    -        }
    -
    -
    -        public Single TestSingle
    -        {
    -            get { return _testSingle; }
    -            set { _testSingle = value; }
    -        }  
    -#endif
    -
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/OneZeroBoolTypeHandlerCallback.cs b/src/IBatisNet.DataMapper.Test/Domain/OneZeroBoolTypeHandlerCallback.cs
    deleted file mode 100644
    index e14be6b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/OneZeroBoolTypeHandlerCallback.cs
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -using System;
    -using IBatisNet.DataMapper.Exceptions;
    -using IBatisNet.DataMapper.TypeHandlers;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// OneZeroBoolTypeHandlerCallback.
    -	/// 
    -	public class OneZeroBoolTypeHandlerCallback : ITypeHandlerCallback
    -	{
    -		private const int TRUE = 1;
    -		private const int FALSE = 0;
    -
    -		#region ITypeHandlerCallback members
    -
    -		public object ValueOf(string nullValue)
    -		{
    -			if (TRUE.ToString().Equals(nullValue)) 
    -			{
    -				return true;
    -			} 
    -			else if (FALSE.ToString().Equals(nullValue)) 
    -			{
    -				return false;
    -			} 
    -			else 
    -			{
    -				throw new DataMapperException("Unexpected value " + nullValue + " found where "+TRUE+" or "+FALSE+" was expected.");
    -			}		
    -		}
    -
    -		public object GetResult(IResultGetter getter)
    -		{
    -			int i = int.Parse(getter.Value.ToString());
    -			if (TRUE.Equals(i)) 
    -			{
    -				return true;
    -			}
    -			else if (FALSE.Equals(i)) 
    -			{
    -				return false;
    -			} 
    -			else 
    -			{
    - 				 throw new DataMapperException("Unexpected value " + i + " found where "+TRUE+" or "+FALSE+" was expected.");
    -			}
    -		}
    -
    -		public void SetParameter(IParameterSetter setter, object parameter)
    -		{
    -			bool b = Convert.ToBoolean(parameter);
    -			if (b) 
    -			{
    -				setter.Value = TRUE;
    -			} 
    -			else 
    -			{
    -				setter.Value = FALSE;
    -			}			
    -		}
    -
    -        public object NullValue
    -        {
    -            get { throw new InvalidCastException("OneZeroBoolTypeHandlerCallback could not cast a null value in a bool field."); }
    -        }
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Order.cs b/src/IBatisNet.DataMapper.Test/Domain/Order.cs
    deleted file mode 100644
    index 7127cc1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Order.cs
    +++ /dev/null
    @@ -1,234 +0,0 @@
    -using System;
    -using System.Collections;
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Description rsume de Order.
    -	/// 
    -	[Serializable]
    -	public class Order
    -	{
    -		private int _id;
    -		private Account _account;
    -		private DateTime _date;
    -		private string _cardType;
    -		private string _cardNumber;
    -		private string _cardExpiry;
    -		private string _street;
    -		private string _city;
    -		private string _province;
    -		private string _postalCode;
    -		private IList _lineItemsIList ;//= new ArrayList();
    -        private LineItemCollection _collection;
    -		private LineItem[] _lineItemsArray;
    -		private LineItem _favouriteLineItem;
    -
    -		public Order()
    -		{}
    -
    -		public Order(int id, Account account)
    -		{
    -			_id = id;
    -			_account = account;
    -		}
    -
    -		public Order(int id, Account account, IList lineItems)
    -		{
    -			_id = id;
    -			_account = account;
    -			_lineItemsIList = lineItems;
    -		}
    -
    -		public Order(int id, Account account, LineItem[] lineItemsArray)
    -		{
    -			_id = id;
    -			_account = account;
    -			_lineItemsArray = lineItemsArray;
    -		}
    -
    -		public Order(int id, Account account, LineItemCollection collection)
    -		{
    -			_id = id;
    -			_account = account;
    -            _collection = collection;
    -		}
    -
    -
    -#if dotnet2
    -        private IList _genericList;
    -        public IList LineItemsGenericList
    -        {
    -            get { return _genericList; }
    -            set { _genericList = value; }
    -        }
    -
    -        private LineItemCollection2 _genericCollection = null;
    -        public LineItemCollection2 LineItemsCollection2
    -        {
    -            get { return _genericCollection; }
    -            set { _genericCollection = value; }
    -        }
    -
    -        public Order(IList lineItems)
    -        {
    -            _genericList = lineItems;
    -        }
    -
    -        public Order(LineItemCollection2 collection)
    -        {
    -            _genericCollection = collection;
    -        }
    -#else
    -        private IList _genericList;
    -        public IList LineItemsGenericList
    -        {
    -            get { return _genericList; }
    -            set { _genericList = value; }
    -        }
    -
    -		public LineItemCollection LineItemsCollection2
    -		{
    -			get { return _collection; }
    -			set { _collection = value; }
    -		}
    -
    -        public Order(IList lineItems)
    -        {
    -            _genericList = lineItems;
    -        }
    -
    -        public Order(LineItemCollection collection)
    -        {
    -            _collection = collection;
    -        }
    -#endif
    -
    -        public LineItem FavouriteLineItem
    -		{
    -			get { return _favouriteLineItem; }
    -			set { _favouriteLineItem = value; }
    -		}
    -
    -		public IList LineItemsIList
    -		{
    -			get { return _lineItemsIList; }
    -			set { _lineItemsIList = value; }
    -		}
    -
    -
    -        public LineItemCollection LineItemsCollection
    -		{
    -            get { return _collection; }
    -            set { _collection = value; }
    -		}
    -
    -		public LineItem[] LineItemsArray
    -		{
    -			get { return _lineItemsArray; }
    -			set { _lineItemsArray = value; }
    -		}
    -
    -		public string PostalCode
    -		{
    -			get { return _postalCode; }
    -			set { _postalCode = value; }
    -		}
    -
    -		public string Province
    -		{
    -			get { return _province; }
    -			set { _province = value; }
    -		}
    -
    -		public string City
    -		{
    -			get { return _city; }
    -			set { _city = value; }
    -		}
    -
    -		public string Street
    -		{
    -			get { return _street; }
    -			set { _street = value; }
    -		}
    -
    -		public string CardExpiry
    -		{
    -			get
    -			{
    -				return _cardExpiry; 
    -			}
    -			set
    -			{ 
    -				_cardExpiry = value; 
    -			}
    -		}
    -
    -		public string CardNumber
    -		{
    -			get
    -			{
    -				return _cardNumber; 
    -			}
    -			set
    -			{ 
    -				_cardNumber = value; 
    -			}
    -		}
    -
    -		public string CardType
    -		{
    -			get
    -			{
    -				return _cardType; 
    -			}
    -			set
    -			{ 
    -				_cardType = value; 
    -			}
    -		}
    -
    -		public virtual Account Account
    -		{
    -			get { return _account; }
    -			set { _account = value; }
    -		}
    -
    -		public int Id
    -		{
    -			get
    -			{
    -				return _id; 
    -			}
    -			set
    -			{ 
    -				_id = value; 
    -			}
    -		}
    -
    -		public DateTime Date
    -		{
    -			get
    -			{
    -				return _date; 
    -			}
    -			set
    -			{ 
    -				_date = value; 
    -			}
    -		}
    -
    -		public DateTime OrderDate {
    -			get {
    -				return _date; 
    -			}
    -			set { 
    -				_date = value; 
    -			}
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Other.cs b/src/IBatisNet.DataMapper.Test/Domain/Other.cs
    deleted file mode 100644
    index 3fae49a..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Other.cs
    +++ /dev/null
    @@ -1,37 +0,0 @@
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Other.
    -	/// 
    -	public class Other
    -	{
    -		private int _int;
    -		private long _long;
    -		private bool _bool = false;
    -		private bool _bool2 = false;
    -
    -		public bool Bool2
    -		{
    -			get { return _bool2; }
    -			set { _bool2 = value; }
    -		}
    -
    -		public bool Bool
    -		{
    -			get { return _bool; }
    -			set { _bool = value; }
    -		}
    -
    -		public int Int
    -		{
    -			get { return _int; }
    -			set { _int = value; }
    -		}
    -
    -		public long Long
    -		{
    -			get { return _long; }
    -			set { _long = value; }
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/OuiNonBoolTypeHandlerCallback.cs b/src/IBatisNet.DataMapper.Test/Domain/OuiNonBoolTypeHandlerCallback.cs
    deleted file mode 100644
    index 46460a5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/OuiNonBoolTypeHandlerCallback.cs
    +++ /dev/null
    @@ -1,73 +0,0 @@
    -using System;
    -
    -using IBatisNet.DataMapper.TypeHandlers;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// OuiNonBoolTypeHandlerCallback.
    -	/// 
    -	/// 
    -	/// Used in account.xml on 
    -	///  < result property="BannerOption" type="bool" dbType="Varchar" column="Account_Banner_Option" />
    -	/// 
    -	public class OuiNonBoolTypeHandlerCallback : ITypeHandlerCallback
    -	{
    -		private const string YES = "Oui";
    -		private const string NO = "Non";
    -
    -		#region ITypeHandlerCallback members
    -
    -		public object ValueOf(string nullValue)
    -		{
    -			if (YES.Equals(nullValue)) 
    -			{
    -				return true;
    -			} 
    -			else if (NO.Equals(nullValue)) 
    -			{
    -				return false;
    -			} 
    -			else 
    -			{
    -				throw new Exception("Unexpected value " + nullValue + " found where "+YES+" or "+NO+" was expected.");
    -			}		
    -		}
    -
    -		public object GetResult(IResultGetter getter)
    -		{
    -			string s = getter.Value as string;
    -			if (YES.Equals(s)) 
    -			{
    -				return true;
    -			}
    -			else if (NO.Equals(s)) 
    -			{
    -				return false;
    -			} 
    -			else 
    -			{
    -				throw new Exception("Unexpected value " + s + " found where "+YES+" or "+NO+" was expected.");
    -			}
    -		}
    -
    -		public void SetParameter(IParameterSetter setter, object parameter)
    -		{
    -			bool b = Convert.ToBoolean(parameter);
    -			if (b) 
    -			{
    -				setter.Value = YES;
    -			} 
    -			else 
    -			{
    -				setter.Value = NO;
    -			}			
    -		}
    -
    -        public object NullValue
    -        {
    -            get { throw new InvalidCastException("OuiNonBoolTypeHandlerCallback could not cast a null value in the field."); }
    -        }
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Parent.cs b/src/IBatisNet.DataMapper.Test/Domain/Parent.cs
    deleted file mode 100644
    index fd2a9d9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Parent.cs
    +++ /dev/null
    @@ -1,37 +0,0 @@
    -
    -using System.Collections.Generic;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -
    -{
    -    public class Parent
    -    {
    -        private int _id;
    -        public int Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        private byte[] _rowVersion;
    -        public byte[] RowVersion
    -        {
    -            get { return _rowVersion; }
    -            set { _rowVersion = value; }
    -        }
    -
    -        private string _description;
    -        public string Description
    -        {
    -            get { return _description; }
    -            set { _description = value; }
    -        }
    -
    -        private IList _children;
    -        public IList Children
    -        {
    -            get { return _children; }
    -            set { _children = value; }
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Petshop/Category.cs b/src/IBatisNet.DataMapper.Test/Domain/Petshop/Category.cs
    deleted file mode 100644
    index 26ea4c2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Petshop/Category.cs
    +++ /dev/null
    @@ -1,64 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -
    -namespace IBatisNet.DataMapper.Test.Domain.Petshop
    -{
    -    /// 
    -    /// Business entity used to model category
    -    /// 
    -    [Serializable]
    -    public class Category
    -    {
    -        private string _Id;
    -        private string _name;
    -        private string _description;
    -        private IList _products = new ArrayList();
    -        
    -#if dotnet2
    -        private IList _genericList;
    -        public IList GenericProducts
    -        {
    -            get { return _genericList; }
    -            set { _genericList = value; }
    -        }
    -#else
    -        private IList _genericList;
    -        public IList GenericProducts
    -        {
    -            get { return _genericList; }
    -            set { _genericList = value; }
    -        }
    -#endif
    -
    -        #region Properties
    -        public string Id
    -        {
    -            get { return _Id; }
    -            set { _Id = value; }
    -        }
    -
    -        public string Name
    -        {
    -            get { return _name; }
    -            set { _name = value; }
    -        }
    -
    -
    -        public string Description
    -        {
    -            get { return _description; }
    -            set { _description = value; }
    -        }
    -
    -        public IList Products
    -        {
    -            get { return _products; }
    -            set { _products = value; }
    -        }
    -        #endregion
    -    }
    -}
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Petshop/Item.cs b/src/IBatisNet.DataMapper.Test/Domain/Petshop/Item.cs
    deleted file mode 100644
    index 91fd090..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Petshop/Item.cs
    +++ /dev/null
    @@ -1,81 +0,0 @@
    -
    -
    -namespace IBatisNet.DataMapper.Test.Domain.Petshop
    -{
    -    /// 
    -    /// Summary description for Item.
    -    /// 
    -    public class Item
    -    {
    -        #region Private Fields
    -        private string _id;
    -        private decimal _listPrice;
    -        private decimal _unitCost;
    -        private string _currency;
    -        private string _photo;
    -        private int _quantity;
    -        private string _attribute1;
    -        private string _status;
    -        private Product _product;
    -        #endregion
    -
    -        #region Properties
    -        public string Attribute1
    -        {
    -            get { return _attribute1; }
    -            set { _attribute1 = value; }
    -        }
    -
    -        public int Quantity
    -        {
    -            get { return _quantity; }
    -            set { _quantity = value; }
    -        }
    -
    -        public string Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        public decimal ListPrice
    -        {
    -            get { return _listPrice; }
    -            set { _listPrice = value; }
    -        }
    -
    -        public decimal UnitCost
    -        {
    -            get { return _unitCost; }
    -            set { _unitCost = value; }
    -        }
    -
    -        public string Currency
    -        {
    -            get { return _currency; }
    -            set { _currency = value; }
    -        }
    -
    -        public Product Product
    -        {
    -            get { return _product; }
    -            set { _product = value; }
    -        }
    -
    -
    -        public string Photo
    -        {
    -            set { _photo = value; }
    -            get { return _photo; }
    -        }
    -
    -        public string Status
    -        {
    -            set { _status = value; }
    -            get { return _status; }
    -        }
    -        #endregion
    -
    -    }
    -}
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Petshop/Product.cs b/src/IBatisNet.DataMapper.Test/Domain/Petshop/Product.cs
    deleted file mode 100644
    index 61dbd14..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Petshop/Product.cs
    +++ /dev/null
    @@ -1,76 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -
    -namespace IBatisNet.DataMapper.Test.Domain.Petshop
    -{
    -    /// 
    -    /// Business entity used to model a product
    -    /// 
    -    [Serializable]
    -    public class Product
    -    {
    -
    -        #region Private Fields
    -        private string _id;
    -        private string _name;
    -        private string _description;
    -        private Category _category;
    -        private IList _items = new ArrayList();
    -
    -        #endregion
    -
    -#if dotnet2
    -        private IList _genericList = new List();
    -        public IList GenericItems
    -        {
    -            get { return _genericList; }
    -            set { _genericList = value; }
    -        }
    -#else
    -        private IList _genericList;
    -        public IList GenericItems
    -        {
    -            get { return _genericList; }
    -            set { _genericList = value; }
    -        }        
    -#endif
    -
    -        #region Properties
    -
    -        public IList Items
    -        {
    -            get { return _items; }
    -            set { _items = value; }
    -        }
    -        
    -        public string Id
    -        {
    -            set { _id = value; }
    -            get { return _id; }
    -        }
    -
    -        public string Name
    -        {
    -            set { _name = value; }
    -            get { return _name; }
    -        }
    -
    -        public string Description
    -        {
    -            set { _description = value; }
    -            get { return _description; }
    -        }
    -
    -        public Category Category
    -        {
    -            set { _category = value; }
    -            get { return _category; }
    -        }
    -        #endregion
    -
    -    }
    -}
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Product.cs b/src/IBatisNet.DataMapper.Test/Domain/Product.cs
    deleted file mode 100644
    index 153df40..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Product.cs
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -using System.Collections;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    /// 
    -    /// 
    -    /// 
    -    public class Product
    -    {
    -        private int _id;
    -        private string _name;
    -        private IList _items = new ArrayList();
    -
    -        public int Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        public string Name
    -        {
    -            get { return _name; }
    -            set { _name = value; }
    -        }
    -        
    -        public IList Items
    -        {
    -            get { return _items; }
    -            set { _items = value; }
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Query.cs b/src/IBatisNet.DataMapper.Test/Domain/Query.cs
    deleted file mode 100644
    index 76e95a0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Query.cs
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for Query.
    -	/// 
    -	public class Query
    -	{
    -		private object _dataObject; 
    -
    -		public object DataObject
    -		{
    -			get{return _dataObject; }
    -			set { _dataObject = value;}
    -		} 
    -
    -	}
    -}
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Role.cs b/src/IBatisNet.DataMapper.Test/Domain/Role.cs
    deleted file mode 100644
    index 765dd5b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Role.cs
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class Role
    -    {
    -        private int id;
    -        public int Id
    -        {
    -            get { return id; }
    -            set { id = value; }
    -        }
    -
    -        private string name;
    -        public string Name
    -        {
    -            get { return name; }
    -            set { name = value; }
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Sample.cs b/src/IBatisNet.DataMapper.Test/Domain/Sample.cs
    deleted file mode 100644
    index f8ef705..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Sample.cs
    +++ /dev/null
    @@ -1,167 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description of Sample.
    -	/// 
    -	public class Sample
    -	{
    -		private int _firstId;
    -		private int _secondId;
    -		private int _thirdId;
    -		private int _fourthId;
    -		private int _fifthId;
    -		private int _sequenceId;
    -		private int _distributedId;
    -		private string _sampleChar;
    -		private decimal _sampleDecimal;
    -		private decimal _sampleMoney;
    -		private System.DateTime _sampleDate;
    -		private System.DateTime _sequenceDate;
    -
    -		public int FirstId
    -		{
    -			get
    -			{
    -				return _firstId; 
    -			}
    -			set
    -			{ 
    -				_firstId = value; 
    -			}
    -		}
    -
    -		public int SecondId
    -		{
    -			get
    -			{
    -				return _secondId; 
    -			}
    -			set
    -			{ 
    -				_secondId = value; 
    -			}
    -		}
    -
    -		public int ThirdId
    -		{
    -			get
    -			{
    -				return _thirdId; 
    -			}
    -			set
    -			{ 
    -				_thirdId = value; 
    -			}
    -		}
    -
    -		public int FourthId
    -		{
    -			get
    -			{
    -				return _fourthId; 
    -			}
    -			set
    -			{ 
    -				_fourthId = value; 
    -			}
    -		}
    -
    -		public int FifthId
    -		{
    -			get
    -			{
    -				return _fifthId; 
    -			}
    -			set
    -			{ 
    -				_fifthId = value; 
    -			}
    -		}
    -
    -		public int SequenceId
    -		{
    -			get
    -			{
    -				return _sequenceId; 
    -			}
    -			set
    -			{ 
    -				_sequenceId = value; 
    -			}
    -		}
    -
    -		public int DistributedId
    -		{
    -			get
    -			{
    -				return _distributedId; 
    -			}
    -			set
    -			{ 
    -				_distributedId = value; 
    -			}
    -		}
    -
    -		public string SampleChar
    -		{
    -			get
    -			{
    -				return _sampleChar; 
    -			}
    -			set
    -			{ 
    -				_sampleChar = value; 
    -			}
    -		}
    -
    -		public decimal SampleDecimal
    -		{
    -			get
    -			{
    -				return _sampleDecimal; 
    -			}
    -			set
    -			{ 
    -				_sampleDecimal = value; 
    -			}
    -		}
    -
    -		public decimal SampleMoney
    -		{
    -			get
    -			{
    -				return _sampleMoney; 
    -			}
    -			set
    -			{ 
    -				_sampleMoney = value; 
    -			}
    -		}
    -		
    -		public System.DateTime SampleDate
    -		{
    -			get
    -			{
    -				return _sampleDate; 
    -			}
    -			set
    -			{ 
    -				_sampleDate = value; 
    -			}
    -		}
    -
    -		public System.DateTime SequenceDate
    -		{
    -			get
    -			{
    -				return _sequenceDate; 
    -			}
    -			set
    -			{ 
    -				_sequenceDate = value; 
    -			}
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Search.cs b/src/IBatisNet.DataMapper.Test/Domain/Search.cs
    deleted file mode 100644
    index 505ac50..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Search.cs
    +++ /dev/null
    @@ -1,63 +0,0 @@
    -using System;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -	/// 
    -	/// Summary description for Search.
    -	/// 
    -	public class Search
    -	{
    -		private int _numberSearch;
    -		private DateTime _startDate;
    -		private string _operande;
    -		private bool _startDateAnd;
    -		
    -		public bool StartDateAnd
    -		{
    -			get
    -			{
    -				return _startDateAnd; 
    -			}
    -			set
    -			{ 
    -				_startDateAnd = value; 
    -			}
    -		}
    -
    -		public string Operande
    -		{
    -			get
    -			{
    -				return _operande; 
    -			}
    -			set
    -			{ 
    -				_operande = value; 
    -			}
    -		}
    -
    -		public DateTime StartDate
    -		{
    -			get
    -			{
    -				return _startDate; 
    -			}
    -			set
    -			{ 
    -				_startDate = value; 
    -			}
    -		}
    -
    -		public int NumberSearch
    -		{
    -			get
    -			{
    -				return _numberSearch; 
    -			}
    -			set
    -			{ 
    -				_numberSearch = value; 
    -			}
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/Simple.cs b/src/IBatisNet.DataMapper.Test/Domain/Simple.cs
    deleted file mode 100644
    index b67f44d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/Simple.cs
    +++ /dev/null
    @@ -1,63 +0,0 @@
    -using System;
    -using System.Text;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    [Serializable]
    -    public class Simple
    -    {
    -        private string _name = string.Empty;
    -        private string _address = string.Empty;
    -        private int _count = int.MinValue;
    -        private DateTime _date = new DateTime(2006, 03, 06, 12, 00, 00, 00);
    -        private decimal _pay = 78.78M;
    -        private int _id = 0;
    -
    -
    -        public Simple() { }
    -
    -        public void Init()
    -        {
    -            _name = "Someone with along name";
    -            _address = "1234 some street, some city, victoria, 3000, austaya";
    -            _count = 69;
    -            _date = DateTime.Now;
    -        }
    -
    -        public int Id
    -        {
    -            get { return _id; }
    -            set { _id = value; }
    -        }
    -
    -        public string Name
    -        {
    -            get { return _name; }
    -            set { _name = value; }
    -        }
    -
    -        public string Address
    -        {
    -            get { return _address; }
    -            set { _address = value; }
    -        }
    -
    -        public int Count
    -        {
    -            get { return _count; }
    -            set { _count = value; }
    -        }
    -
    -        public DateTime Date
    -        {
    -            get { return _date; }
    -            set { _date = value; }
    -        }
    -
    -        public decimal Pay
    -        {
    -            get { return _pay; }
    -            set { _pay = value; }
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/User.cs b/src/IBatisNet.DataMapper.Test/Domain/User.cs
    deleted file mode 100644
    index 2dcef31..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/User.cs
    +++ /dev/null
    @@ -1,54 +0,0 @@
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -using System.Collections;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -    public class ApplicationUser
    -    {
    -        private int id;
    -        public int Id
    -        {
    -            get { return id; }
    -            set { id = value; }
    -        }
    -
    -        private string name;
    -        public string UserName
    -        {
    -            get { return name; }
    -            set { name = value; }
    -        }
    -
    -        private Address address;
    -        public Address Address
    -        {
    -            get { return address; }
    -            set { address = value; }
    -        }
    -
    -        private bool isActive;
    -        public bool IsActive
    -        {
    -            get { return isActive; }
    -            set { isActive = value; }
    -        }
    -
    -#if dotnet2
    -        private IList roles;
    -        public IList Roles
    -        {
    -            get { return roles; }
    -            set { roles = value; }
    -        }
    -#else
    -        private IList roles;
    -        public IList Roles
    -        {
    -            get { return roles; }
    -            set { roles = value; }
    -        }        
    -#endif
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/Domain/VarcharCallBack.cs b/src/IBatisNet.DataMapper.Test/Domain/VarcharCallBack.cs
    deleted file mode 100644
    index ac3a829..0000000
    --- a/src/IBatisNet.DataMapper.Test/Domain/VarcharCallBack.cs
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -using System;
    -using System.Data;
    -using System.Data.SqlClient;
    -using IBatisNet.DataMapper.TypeHandlers;
    -
    -namespace IBatisNet.DataMapper.Test.Domain
    -{
    -
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj b/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj
    deleted file mode 100644
    index 8c39df3..0000000
    --- a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2005.csproj
    +++ /dev/null
    @@ -1,543 +0,0 @@
    -
    -  
    -    Local
    -    9.0.30729
    -    2.0
    -    {998B79D9-800F-493F-A263-306F06906E2F}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataMapper.Test
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataMapper.Test
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -    2.0
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    
    -    
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    
    -    
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -  
    -  
    -    
    -      log4net
    -      ..\External-Bin\Net\1.1\log4net.dll
    -    
    -    
    -    
    -      System
    -    
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Drawing
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -  
    -  
    -    
    -      {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}
    -      IBatisNet.Common.Logging.Log4Net.2005
    -    
    -    
    -      {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}
    -      IBatisNet.Common.2005
    -    
    -    
    -      {F3E45F39-3224-4EAD-B138-EB5CC0E32824}
    -      IBatisNet.DataMapper.20005
    -    
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2010.csproj b/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2010.csproj
    deleted file mode 100644
    index 8b114a1..0000000
    --- a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.2010.csproj
    +++ /dev/null
    @@ -1,583 +0,0 @@
    -
    -
    -  
    -    Local
    -    9.0.30729
    -    2.0
    -    {998B79D9-800F-493F-A263-306F06906E2F}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataMapper.Test
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataMapper.Test
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -    3.5
    -    v4.0
    -    publish\
    -    true
    -    Disk
    -    false
    -    Foreground
    -    7
    -    Days
    -    false
    -    false
    -    true
    -    0
    -    1.0.0.%2a
    -    false
    -    false
    -    true
    -    
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    
    -    
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    
    -    
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    
    -      log4net
    -      ..\External-Bin\Net\1.1\log4net.dll
    -    
    -    
    -      False
    -      ..\External-Bin\nunit\2.5.5.10112\nunit.framework.dll
    -    
    -    
    -      System
    -    
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Drawing
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -  
    -  
    -    
    -      {023FE8D7-7E1A-4DDF-A0EA-8FB0E1B3122B}
    -      IBatisNet.Common.Logging.Log4Net.2010
    -    
    -    
    -      {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}
    -      IBatisNet.Common.2010
    -    
    -    
    -      {F3E45F39-3224-4EAD-B138-EB5CC0E32824}
    -      IBatisNet.DataMapper.2010
    -    
    -  
    -  
    -    
    -      False
    -      .NET Framework 3.5 SP1 Client Profile
    -      false
    -    
    -    
    -      False
    -      .NET Framework 3.5 SP1
    -      true
    -    
    -    
    -      False
    -      Windows Installer 3.1
    -      true
    -    
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net35.2010.csproj b/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net35.2010.csproj
    deleted file mode 100644
    index 80e8bc9..0000000
    --- a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net35.2010.csproj
    +++ /dev/null
    @@ -1,576 +0,0 @@
    -
    -
    -  
    -    Local
    -    9.0.30729
    -    2.0
    -    {998B79D9-800F-493F-A263-306F06906E2F}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataMapper.Test
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataMapper.Test
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -    3.5
    -    v3.5
    -    
    -    publish\
    -    true
    -    Disk
    -    false
    -    Foreground
    -    7
    -    Days
    -    false
    -    false
    -    true
    -    0
    -    1.0.0.%2a
    -    false
    -    false
    -    true
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    
    -    
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    
    -    
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -    AllRules.ruleset
    -  
    -  
    -    
    -      log4net
    -      ..\External-Bin\Net\1.1\log4net.dll
    -    
    -    
    -    
    -      System
    -    
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Drawing
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -  
    -  
    -    
    -      False
    -      .NET Framework 3.5 SP1 Client Profile
    -      false
    -    
    -    
    -      False
    -      .NET Framework 3.5 SP1
    -      true
    -    
    -    
    -      False
    -      Windows Installer 3.1
    -      true
    -    
    -  
    -  
    -    
    -      {BBC8DA4A-EA88-41D9-8B93-929B8F3ADADE}
    -      IBatisNet.Common.Net35.2010
    -    
    -    
    -      {F3E45F39-3224-4EAD-B138-EB5CC0E32824}
    -      IBatisNet.DataMapper.Net35.2010
    -    
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net45.2012.csproj b/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net45.2012.csproj
    deleted file mode 100644
    index da1ba9b..0000000
    --- a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.Net45.2012.csproj
    +++ /dev/null
    @@ -1,676 +0,0 @@
    -
    -
    -  
    -    Local
    -    9.0.30729
    -    2.0
    -    {998B79D9-800F-493F-A263-306F06906E2F}
    -    Debug
    -    AnyCPU
    -    
    -    
    -    
    -    
    -    IBatisNet.DataMapper.Test
    -    
    -    
    -    JScript
    -    Grid
    -    IE50
    -    false
    -    Library
    -    IBatisNet.DataMapper.Test
    -    OnBuildSuccess
    -    
    -    
    -    
    -    
    -    
    -    
    -    3.5
    -    v4.0
    -    publish\
    -    true
    -    Disk
    -    false
    -    Foreground
    -    7
    -    Days
    -    false
    -    false
    -    true
    -    0
    -    1.0.0.%2a
    -    false
    -    false
    -    true
    -    
    -  
    -  
    -    bin\Debug\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;DEBUG;dotnet2
    -    
    -    
    -    true
    -    4096
    -    false
    -    
    -    
    -    false
    -    false
    -    false
    -    false
    -    4
    -    full
    -    prompt
    -    AllRules.ruleset
    -    false
    -  
    -  
    -    bin\Release\
    -    false
    -    285212672
    -    false
    -    
    -    
    -    TRACE;dotnet2
    -    
    -    
    -    false
    -    4096
    -    false
    -    
    -    
    -    true
    -    false
    -    false
    -    false
    -    4
    -    none
    -    prompt
    -    AllRules.ruleset
    -    false
    -  
    -  
    -    false
    -  
    -  
    -    
    -      log4net
    -      ..\External-Bin\Net\1.1\log4net.dll
    -    
    -    
    -      False
    -      ..\External-Bin\nunit\2.5.5.10112\nunit.framework.dll
    -    
    -    
    -      System
    -    
    -    
    -    
    -      System.Data
    -    
    -    
    -      System.Drawing
    -    
    -    
    -      System.XML
    -    
    -  
    -  
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -      Code
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -      Designer
    -    
    -    
    -      Designer
    -    
    -    
    -  
    -  
    -    
    -      False
    -      .NET Framework 3.5 SP1 Client Profile
    -      false
    -    
    -    
    -      False
    -      .NET Framework 3.5 SP1
    -      true
    -    
    -    
    -      False
    -      Windows Installer 3.1
    -      true
    -    
    -  
    -  
    -    
    -      {023fe8d7-7e1a-4ddf-a0ea-8fb0e1b3122b}
    -      IBatisNet.Common.Logging.Log4Net.Net45.2012
    -    
    -    
    -      {bbc8da4a-ea88-41d9-8b93-929b8f3adade}
    -      IBatisNet.Common.Net45.2012
    -    
    -    
    -      {f3e45f39-3224-4ead-b138-eb5cc0e32824}
    -      IBatisNet.DataMapper.Net45.2012
    -    
    -  
    -  
    -  
    -  
    -    
    -    
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.build b/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.build
    deleted file mode 100644
    index 225f706..0000000
    --- a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.build
    +++ /dev/null
    @@ -1,103 +0,0 @@
    -
    -
    -    
    -    
    -
    -		
    -
    -        
    -        
    -            
    -				
    -			
    -			
    -                
    -            
    -			
    -				
    -				
    -				
    -			
    -            
    -                
    -            
    -            
    -                
    -                
    -            
    -        
    -
    -        
    -            
    -                
    -            
    -        
    -
    -        
    -            
    -				
    -            
    -        
    -
    -        
    -            
    -                
    -            
    -        
    -				
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -            
    -				
    -            
    -        
    -
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -            
    -				
    -            
    -        
    -    
    -    
    -    
    - 		
    -        
    -            
    -            
    -            
    -                
    -                    
    -                    
    -                    
    -                    
    -                    
    -                
    -            
    -         
    -		
    -			
    -				
    -			
    -		
    -        
    -    
    -
    diff --git a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj b/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj
    deleted file mode 100644
    index 0fa398e..0000000
    --- a/src/IBatisNet.DataMapper.Test/IBatisNet.DataMapper.Test.csproj
    +++ /dev/null
    @@ -1,1315 +0,0 @@
    -
    -    
    -        
    -            
    -                
    -                
    -            
    -            
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -            
    -        
    -        
    -            
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -                
    -            
    -        
    -    
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/IBatisNet.Test.build b/src/IBatisNet.DataMapper.Test/IBatisNet.Test.build
    deleted file mode 100644
    index 9a2a32b..0000000
    --- a/src/IBatisNet.DataMapper.Test/IBatisNet.Test.build
    +++ /dev/null
    @@ -1,87 +0,0 @@
    -
    -
    -    
    -    
    -
    -		
    -
    -        
    -        
    -            
    -				
    -			
    -			
    -                
    -            
    -			
    -				
    -				
    -				
    -			
    -            
    -                
    -                
    -            
    -        
    -
    -        
    -            
    -                
    -				
    -            
    -        
    -
    -        
    -            
    -                
    -            
    -        
    -				
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -            
    -				
    -            
    -        
    -
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -            
    -				
    -            
    -        
    -    
    -    
    -    
    - 		
    -        
    -            
    -            
    -            
    -         
    -		
    -			
    -				
    -			
    -		
    -        
    -    
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml
    deleted file mode 100644
    index a449b69..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Account.xml
    +++ /dev/null
    @@ -1,539 +0,0 @@
    -
    -
    -
    -      
    -    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -		
    -       
    -	                                    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -	
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -
    -		
    -
    -		
    -
    -				
    -  
    -		
    -  
    -		
    -  
    -		 
    -		
    -		
    -  
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -		
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -		
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress:VarChar:no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -
    -			
    -		
    -			
    -				
    -		
    -		
    -			ps_InsertAccount
    -		
    -		
    -		
    -			ps_swap_email_address
    -		
    -	
    -
    -	
    -	   
    -		
    -
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -						
    -			
    -		
    -		
    -		
    -			
    -						
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Category.xml
    deleted file mode 100644
    index ebce58e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Category.xml
    +++ /dev/null
    @@ -1,205 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -	
    -		
    -    	
    -		
    -		
    -		
    -		
    -		
    -			
    -				select @@IDENTITY as [value];
    -            		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:Guid#);
    -		
    -
    -		
    -		
    -			
    -				select @@IDENTITY as [value];
    -            		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value:Guid#);
    -				
    -	
    -		
    -		
    -			
    -				select @@IDENTITY as [value];
    -            		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value#);
    -		
    -						
    -		
    -			
    -				select @@IDENTITY as [value];
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:Guid#);
    -		
    -		
    -		
    -			
    -				select @@IDENTITY as [value];
    -            		
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -		
    -			
    -		
    -			
    -				select @@IDENTITY as [value];
    -            			
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -				
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -				
    -		
    -			ps_InsertCategorie
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -
    -		
    -			
    -				select @@IDENTITY as [value]
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -			select
    -			Category_ID as [Id],
    -			Category_Name as [Name],
    -			Category_Guid as [Guid]
    -			from Categories  
    -			
    -				
    -					Category_Guid=#Guid:Guid#
    -				
    -			
    -						
    -	
    -	
    -	
    -
    -		
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -				
    -		
    -			
    -		
    -
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -			
    -		
    -			
    -		
    -						
    -		
    -			
    -			
    -			
    -		
    -								
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Complex.xml
    deleted file mode 100644
    index f618590..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Complex.xml
    +++ /dev/null
    @@ -1,24 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:VarChar:no_email@provided.com#
    -			)
    -				
    -		
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Document.xml
    deleted file mode 100644
    index bae3b4c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		 
    -			
    -			
    -			
    -			
    -			
    -		 
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -			select 
    -				*
    -			from Documents 
    -			order by Document_Type, Document_Id
    -		
    -		
    -				
    -		
    -		 
    -		
    -  
    -	
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/DynamicAccount.xml
    deleted file mode 100644
    index 2157a30..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/DynamicAccount.xml
    +++ /dev/null
    @@ -1,500 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -					
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -	
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like #EmailAddress#
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -			
    -			
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -		
    -				
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Enumeration.xml
    deleted file mode 100644
    index 0197d70..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/LineItem.xml
    deleted file mode 100644
    index 72cef04..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/LineItem.xml
    +++ /dev/null
    @@ -1,203 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -  	
    -  	
    -		
    -			
    -			delete from LineItems where Order_ID = 10;
    -			
    -			delete from LineItems where Order_ID = 9
    -		
    -		  
    -  
    -	
    -
    -  
    -	   
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -						
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Nullable.xml
    deleted file mode 100644
    index 7120804..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Nullable.xml
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Order.xml
    deleted file mode 100644
    index 211492b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Order.xml
    +++ /dev/null
    @@ -1,461 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	  
    -	
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -   
    -		
    -			
    -		
    -		
    -		
    -			
    -				
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -				
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -   
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		 
    -
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -				
    -
    -		
    -			select * from Orders
    -		
    -		
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select 
    -				Orders.Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -				Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode,
    -				LineItems.Order_ID as Order_Id, LineItem_ID, LineItem_Code, LineItem_Quantity,
    -				LineItem_Price
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -				
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -		
    -
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -						
    -					
    -		
    -		
    -
    -		
    -		
    -
    -		
    -
    -	
    -
    -	   
    -		
    -		
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -				
    -	
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Other.xml
    deleted file mode 100644
    index 12ac291..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/Other.xml
    +++ /dev/null
    @@ -1,170 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -					
    -	
    -	
    -	
    -	
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -				
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -					
    -	
    -
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ParameterClass.xml
    deleted file mode 100644
    index 9a6a9a2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ResultClass.xml
    deleted file mode 100644
    index a121b65..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Access/OleDb/ResultClass.xml
    +++ /dev/null
    @@ -1,128 +0,0 @@
    -
    -
    -
    -
    -		
    -	
    -		
    -			select CBool('True') from Orders where Order_ID = #dummy#
    -				
    -		
    -			
    -
    -		
    -			select CByte(155) from Orders where Order_ID = #value#
    -					
    -		
    -		
    -		
    -		
    -			select 'a' from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select Order_Date from Orders where Order_ID  = #value#
    -		
    -		
    -		
    -									
    -		
    -			select 1.56 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -
    -		
    -			select CDbl(99.5) from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -			select {CD5ABF17-4BBC-4C86-92F1-257735414CF4} from Orders where Order_ID = #value# 
    -		
    -		
    -		 
    -		
    -		
    -			select 32111 from Orders where Order_ID = #value#
    -		
    -		
    -			
    -			
    -		
    -			select 999999 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 9223372036854775800 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select CSng(92233.5) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml
    deleted file mode 100644
    index 60f4add..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Account.xml
    +++ /dev/null
    @@ -1,610 +0,0 @@
    -
    -
    -
    -       
    -    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -		
    -       
    -    
    -		
    -	
    -	
    -	
    -
    -    
    -    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -
    -       
    -    
    -		
    -		
    -		
    -
    -  		
    -					
    -		
    -  
    -  	
    -  
    -    	
    -		
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -		
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -				
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress:VarChar:no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -
    -			
    -		
    -				
    -						
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -        
    -        				
    -		
    -		
    -			ps_InsertAccount
    -		
    -		
    -		
    -			ps_swap_email_address
    -		
    -
    -		
    -			ps_SelectAccount
    -		
    -
    -    
    -      ps_SelectAllAccount
    -    
    -    
    -	
    -
    -	
    -	   
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -		
    -				
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Category.xml
    deleted file mode 100644
    index 63d15ff..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Category.xml
    +++ /dev/null
    @@ -1,208 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -  
    -    
    -      
    -      
    -      
    -    
    -  
    -  	
    -	
    -	
    -    
    -    	
    -		
    -		
    -	
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:UniqueIdentifier#);
    -			select SCOPE_IDENTITY() as value
    -		
    -
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value:UniqueIdentifier#);
    -			select SCOPE_IDENTITY() as value
    -				
    -
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value#);
    -			select SCOPE_IDENTITY() as value
    -		
    -						
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:UniqueIdentifier#)
    -		
    -		
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(${MyCategoryName}, #Guid:UniqueIdentifier#)
    -		
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -			select SCOPE_IDENTITY() as value
    -		
    -
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -			select SCOPE_IDENTITY() as value
    -		
    -				
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -		
    -		
    -			ps_InsertCategorie
    -		
    -		
    -		
    -			ps_InsertCategorie
    -		
    -				
    -		
    -			
    -				select @@IDENTITY as value
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as Guid
    -			from Categories  
    -			
    -				
    -					Category_Guid=#Guid:UniqueIdentifier#
    -				
    -			
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -				
    -		
    -			
    -		
    -
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -		
    -				
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Complex.xml
    deleted file mode 100644
    index 93fd941..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Complex.xml
    +++ /dev/null
    @@ -1,24 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:VarChar:no_email@provided.com#
    -			)
    -				
    -		
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Document.xml
    deleted file mode 100644
    index 54ec038..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -						
    -				
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -
    -		
    -				
    -		
    -		
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/DynamicAccount.xml
    deleted file mode 100644
    index b38167c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/DynamicAccount.xml
    +++ /dev/null
    @@ -1,501 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -	
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -	
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like #EmailAddress#
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -			
    -
    -			order by Account_LastName
    -		
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -				
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Enumeration.xml
    deleted file mode 100644
    index bff959b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/LineItem.xml
    deleted file mode 100644
    index 9353ec1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/LineItem.xml
    +++ /dev/null
    @@ -1,207 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -
    -    
    -      ps_SelectLineItem
    -    
    -    
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -				
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?);
    -		
    -				
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -    	
    -		
    -			
    -			delete from LineItems where Order_ID = 10
    -			
    -			delete from LineItems where Order_ID = 9
    -		
    -		
    -  
    -	
    -
    -  
    -	
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -				
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Nullable.xml
    deleted file mode 100644
    index 98e143f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Nullable.xml
    +++ /dev/null
    @@ -1,79 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -    
    -    
    -
    -    
    -
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Order.xml
    deleted file mode 100644
    index 9817edd..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Order.xml
    +++ /dev/null
    @@ -1,669 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -        
    -    
    -			
    -		
    -		
    -		
    -			
    -				
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -			
    -			
    -	  
    -	
    -	
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -    
    -          select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -   
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -			
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -				
    -
    -		
    -			select * from Orders
    -		
    -		
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -				
    -					
    -		
    -			
    -		
    -		
    -				
    -		
    -
    -		
    -
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -	
    -
    -	   
    -		
    -		
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -				
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Other.xml
    deleted file mode 100644
    index 158f8dd..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Other.xml
    +++ /dev/null
    @@ -1,167 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	                                    
    -		
    -			
    -			
    -				
    -					
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -		
    -	
    -	
    -	
    -			
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -					
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -						
    -	
    -
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -		
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ParameterClass.xml
    deleted file mode 100644
    index 9a6a9a2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ResultClass.xml
    deleted file mode 100644
    index 6d85cb8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/ResultClass.xml
    +++ /dev/null
    @@ -1,129 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -			select cast(1 as bit) from Orders where Order_ID = #dummy#
    -		
    -		
    -			
    -
    -		
    -			select cast(155 as tinyint) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast('a' as char) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -		
    -			select cast('2003-02-15 8:15:00' as datetime) from Orders where Order_ID  = #value#
    -		
    -		
    -		
    -									
    -		
    -			select cast(1.56 as decimal(9,2)) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -
    -		
    -			select cast(99.5 as float) from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -			select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as UniqueIdentifier) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(32111 as SmallInt) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast(999999 as int) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(9223372036854775800 as bigint) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(92233.5 as real) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Simple.xml
    deleted file mode 100644
    index 17887ee..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/Odbc/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    name = #Name#,
    -    address = #Address#,
    -    count = #Count#,
    -    date = #Date#,
    -    pay = #Pay#
    -    where
    -    id = #Id#
    -  
    -
    -
    -  
    -    delete Simples 
    -    where
    -    id = #value#
    -  
    -
    -  
    -    insert into Simples ( name, address, count, date, pay, id )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml
    deleted file mode 100644
    index e263359..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Account.xml
    +++ /dev/null
    @@ -1,606 +0,0 @@
    -
    -
    -
    -      
    -    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -		
    - 
    - 	
    -		
    -	
    -	      
    -	
    -
    -    
    -    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -
    -        
    -    
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -		
    -  		
    -		  
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -		
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress:VarChar:no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -		
    -			
    -		
    -				
    -						
    -		  	
    -		
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -        
    -           				
    -		
    -		
    -			ps_InsertAccount
    -		
    -		
    -		
    -			ps_swap_email_address
    -		
    -		
    -		
    -			ps_SelectAccount
    -		
    -
    -    
    -      ps_SelectAllAccount
    -    
    -    
    -	
    -
    -	
    -	   
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -		
    -				
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Category.xml
    deleted file mode 100644
    index 8a031ff..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Category.xml
    +++ /dev/null
    @@ -1,255 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -  
    -    
    -      
    -      
    -      
    -    
    -  
    -  	
    -	
    -	
    -		
    -    	
    -		
    -		
    -	
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:Guid#);
    -			select SCOPE_IDENTITY() as value
    -		
    -
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value:Guid#);
    -			select SCOPE_IDENTITY() as value
    -				
    -	
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value#);
    -			select SCOPE_IDENTITY() as value
    -		
    -						
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:Guid#)
    -		
    -		
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(${MyCategoryName}, #Guid:Guid#)
    -		
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -			select SCOPE_IDENTITY() as value
    -		
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -			select SCOPE_IDENTITY() as value
    -		
    -				
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -				
    -		
    -			ps_InsertCategorie
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -
    -		
    -			
    -				select @@IDENTITY as value
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as Guid
    -			from Categories  
    -			
    -				
    -					Category_Guid=#Guid:Guid#
    -				
    -			
    -						
    -	
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -				
    -		
    -			
    -		
    -
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -			
    -		
    -			
    -		
    -						
    -		
    -			
    -			
    -			
    -		
    -								
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Complex.xml
    deleted file mode 100644
    index 48d56d0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Complex.xml
    +++ /dev/null
    @@ -1,24 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -				
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/DynamicAccount.xml
    deleted file mode 100644
    index 8a75b0f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/DynamicAccount.xml
    +++ /dev/null
    @@ -1,502 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -	
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like #EmailAddress#
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -			
    -			
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -		
    -				
    -	
    -
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Enumeration.xml
    deleted file mode 100644
    index bff959b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/LineItem.xml
    deleted file mode 100644
    index 92506bb..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/LineItem.xml
    +++ /dev/null
    @@ -1,207 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -
    -    
    -      ps_SelectLineItem
    -    
    -
    -    
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -    	
    -		
    -			
    -			delete from LineItems where Order_ID = 10
    -			
    -			delete from LineItems where Order_ID = 9
    -		
    -		
    -  
    -	
    -
    -  
    -	
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -						
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Nullable.xml
    deleted file mode 100644
    index e19c8e8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Nullable.xml
    +++ /dev/null
    @@ -1,79 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -    
    -    
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Order.xml
    deleted file mode 100644
    index b46df78..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Order.xml
    +++ /dev/null
    @@ -1,668 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -		
    -		
    -		
    -			
    -				
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -						
    -	  
    -	
    -	
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -    
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -          select * from Orders where Order_ID = #value#
    -    
    -    
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -			
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -				
    -
    -		
    -			select * from Orders
    -		
    -		
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -				
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -		
    -				
    -					
    -
    -			
    -		
    -		
    -				
    -		
    -		
    -		
    -
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -	
    -
    -	   
    -		
    -		
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -				
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Other.xml
    deleted file mode 100644
    index eb4547c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Other.xml
    +++ /dev/null
    @@ -1,178 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -		
    -	
    -	
    -	
    -			
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -				
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -						
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -					
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -				
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -			
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -		
    -		
    -		
    -				
    -	
    -	
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ParameterClass.xml
    deleted file mode 100644
    index 9a6a9a2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ResultClass.xml
    deleted file mode 100644
    index d9b6052..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/ResultClass.xml
    +++ /dev/null
    @@ -1,130 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -			select cast(1 as bit) from Orders where Order_ID = #dummy#
    -		
    -		
    -			
    -
    -		
    -			select cast(155 as tinyint) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast('a' as char) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -		
    -			select cast('2003-02-15 8:15:00' as datetime) from Orders where Order_ID  = #value#
    -		
    -		
    -		
    -									
    -		
    -			select cast(1.56 as decimal(9,2)) from Orders where Order_ID = #value#
    -		
    -			
    -		
    -
    -		
    -			select cast(99.5 as float) from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -			select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as UniqueIdentifier) from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -		
    -		
    -			select cast(32111 as SmallInt) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast(999999 as int) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(9223372036854775800 as bigint) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(92233.5 as real) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Simple.xml
    deleted file mode 100644
    index 17887ee..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    name = #Name#,
    -    address = #Address#,
    -    count = #Count#,
    -    date = #Date#,
    -    pay = #Pay#
    -    where
    -    id = #Id#
    -  
    -
    -
    -  
    -    delete Simples 
    -    where
    -    id = #value#
    -  
    -
    -  
    -    insert into Simples ( name, address, count, date, pay, id )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/document.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/document.xml
    deleted file mode 100644
    index 53d6027..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/OleDb/document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -				
    -				
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -		
    -		
    -				
    -		
    -		
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
    deleted file mode 100644
    index 876b88e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Account.xml
    +++ /dev/null
    @@ -1,872 +0,0 @@
    -
    -
    -
    -	
    -       
    -	
    -		
    -    
    -    
    -
    -         
    -  
    -  
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -    
    -      
    -      
    -    
    -
    -  
    -
    -
    -  
    -    
    -    
    -      
    -      
    -      
    -    
    -    
    -   
    -
    -    
    -    
    -		
    -
    -    
    -   
    -    
    -
    -    
    -    
    -    
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -
    -  
    -
    -  
    -  
    -
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -
    -    
    -
    -    
    -
    -
    -    
    -
    -    
    -    
    -	  
    -		
    -		
    -
    -		
    -  
    -		
    -  
    -		
    -  
    -  		
    -		
    -  		
    -		
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -		
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress,type=string,dbType=Varchar,nullValue=no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -    
    -    
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -				
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -           
    -				
    -		
    -			ps_InsertAccount
    -		
    -		
    -		
    -			ps_swap_email_address
    -		
    -
    -		
    -			ps_SelectAccount
    -		
    -		
    -		
    -			ps_SelectAccount
    -		
    -	
    -		
    -			ps_SelectAccount
    -		
    -
    -    
    -      ps_SelectAllAccount
    -    
    -
    -    
    -      ps_SelectByIdList
    -    
    -    
    -	
    -
    -	
    -	
    -
    -    
    -        
    -    
    -    
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -			
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -								
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Category.xml
    deleted file mode 100644
    index b31b385..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Category.xml
    +++ /dev/null
    @@ -1,230 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -
    -  
    -    
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -    
    -    
    -  
    -  
    -  
    -
    -    
    -    		ps_InsertCategorieWithReturnValue
    -    
    -    
    -    
    -    
    -		
    -				
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:UniqueIdentifier#);
    -			select SCOPE_IDENTITY() as value
    -		
    -
    -    
    -      insert into Categories
    -      (Category_Name, Category_Guid)
    -      values
    -      (#Name#, #Guid:UniqueIdentifier#);
    -      select SCOPE_IDENTITY() as Category_ID
    -    
    -    
    -
    -    
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value:UniqueIdentifier#);
    -			select SCOPE_IDENTITY() as value
    -				
    -		
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				('toto', #value#);
    -			select SCOPE_IDENTITY() as value
    -		
    -		
    -		
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:UniqueIdentifier#)
    -		
    -		
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(${MyCategoryName}, #Guid:UniqueIdentifier#)
    -		
    -		
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -			select SCOPE_IDENTITY() as value
    -		
    -
    -		
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -			select SCOPE_IDENTITY() as value
    -		
    -		
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -				
    -		
    -			
    -				select @@IDENTITY as value
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as Guid
    -			from Categories  
    -			
    -				
    -					Category_Guid=#Guid:UniqueIdentifier#
    -				
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -			
    -    
    -		
    -			
    -			
    -		
    -
    -    
    -		
    -			
    -			
    -		
    -		
    -
    -		
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Complex.xml
    deleted file mode 100644
    index 092194f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Complex.xml
    +++ /dev/null
    @@ -1,25 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -				
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ConstructorInjection.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ConstructorInjection.xml
    deleted file mode 100644
    index 36b9cf8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ConstructorInjection.xml
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -
    -
    -
    -	
    -		
    -		
    -	
    -
    -	
    -
    -		
    -			
    -				
    -				
    -				
    -			
    -		
    -
    -		
    -			
    -		
    -	
    -
    -	
    -
    -		
    -    
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Coupons.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Coupons.xml
    deleted file mode 100644
    index c8f39a1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Coupons.xml
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -
    -  
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -    
    -
    -
    -  
    -
    -  
    -
    -  
    -
    -    
    -
    -    
    -
    -
    -
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Document.xml
    deleted file mode 100644
    index dae9857..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Document.xml
    +++ /dev/null
    @@ -1,82 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -			
    -	
    -	
    -	  	
    -		
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -				
    -	  
    -	
    -	
    -		
    -		
    -
    -    
    -    
    -		
    -		
    -		
    -
    -    
    -    
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml
    deleted file mode 100644
    index 194efe9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/DynamicAccount.xml
    +++ /dev/null
    @@ -1,531 +0,0 @@
    -
    -
    -
    -  
    -    
    -    
    -  
    -
    -  
    -
    -    
    -      
    -        
    -          
    -            Account_ID = #Id#
    -          
    -          
    -            Account_FirstName = #FirstName#
    -          
    -          
    -            Account_LastName = #LastName#
    -          
    -        
    -      
    -    
    -
    -    
    -    
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          
    -            Account_ID = #DataObject.Id#
    -          
    -          
    -            Account_FirstName = #DataObject.FirstName#
    -          
    -          
    -            Account_LastName = #DataObject.LastName#
    -          
    -        
    -      
    -    
    -
    -    
    -    
    -      SELECT
    -      Account_ID as Id,
    -      
    -        
    -          Account_FirstName as FirstName,
    -        
    -        
    -          Account_LastName as LastName,
    -        
    -      
    -
    -      Account_Email as EmailAddress
    -      FROM
    -      Accounts
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_FirstName = 'Joe'
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = #value#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_FirstName = #value#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -
    -    
    -      
    -        $statement$
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      WHERE Account_ID IN
    -      
    -        #[]#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      WHERE Account_ID IN
    -      
    -        #Ids[]#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      WHERE Account_ID IN
    -      
    -        #[]#
    -      
    -      and Account_ID IN
    -      
    -        #[]#
    -      
    -    
    -
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #Id#
    -        
    -        
    -          Account_ID in
    -          
    -            #Ids[]#
    -          
    -        
    -        
    -          Account_FirstName = #FirstName#
    -        
    -        
    -          Account_LastName = #LastName#
    -        
    -        
    -          
    -            Account_Email = 'gilles.bayon@nospam.org'
    -          
    -          
    -            Account_Email = #EmailAddress#
    -          
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as id,
    -      Account_FirstName	as _firstName,
    -      Account_LastName	as _lastName,
    -      Account_Email		as _emailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #id#
    -        
    -        
    -          Account_ID in
    -          
    -            #_ids[]#
    -          
    -        
    -        
    -          Account_FirstName = #FirstName#
    -        
    -        
    -          Account_LastName = #LastName#
    -        
    -        
    -          
    -            Account_Email = 'gilles.bayon@nospam.org'
    -          
    -          
    -            Account_Email = #_emailAddress#
    -          
    -        
    -      
    -    
    -
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        Account_ID IN
    -        
    -          #[]#
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #[]#
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          
    -            Account_ID = #[]#
    -          
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #Id#
    -        
    -      
    -      
    -        
    -          Account_FirstName = #FirstName#
    -        
    -        
    -          Account_LastName = #LastName#
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          (Account_FirstName = #FirstName#
    -          
    -            Account_LastName = #LastName#
    -          
    -          )
    -        
    -        
    -          Account_Email like #EmailAddress#
    -        
    -        
    -          Account_ID = #Id#
    -        
    -      
    -      order by Account_LastName
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          ((Account_ID $Operande$ #NumberSearch#) or
    -          (Account_ID $Operande$ #NumberSearch#))
    -        
    -        
    -          = #Operande# ]]>
    -        
    -        
    -          = #Operande# ]]>
    -        
    -      
    -
    -      order by Account_LastName
    -    
    -
    -    
    -      INSERT INTO $AccountsTableName$
    -      (
    -      Account_ID,
    -      Account_FirstName,
    -      Account_LastName
    -      )
    -      VALUES
    -      (
    -      #Account.Id#,
    -      #Account.FirstName#,
    -      #Account.LastName#
    -      )
    -      
    -        SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -      
    -    
    -
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/EmbedParameter.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/EmbedParameter.xml
    deleted file mode 100644
    index 85bf9b8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/EmbedParameter.xml
    +++ /dev/null
    @@ -1,366 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Enumeration.xml
    deleted file mode 100644
    index 25c7a4d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Enumeration.xml
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -      insert into Enumerations
    -      (Enum_ID, Enum_Day, Enum_Color, Enum_Month)
    -      values
    -      (?, ?, ?, ?)
    -    
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/GroupByMapping.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/GroupByMapping.xml
    deleted file mode 100644
    index 513389b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/GroupByMapping.xml
    +++ /dev/null
    @@ -1,225 +0,0 @@
    -
    -
    -
    -  
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -
    -  
    -
    -  
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -  
    -
    -  
    -
    -    
    -
    -    
    -    
    -      
    -
    -    
    -
    -    
    -
    -    
    -    
    -    
    -    
    -    
    -    
    -      select
    -      Orders.Order_ID,
    -      Order_City,
    -      LineItem_ID,
    -      LineItem_Code,
    -      LineItem_Quantity,
    -      LineItem_Price,
    -      Accounts.Account_Id,
    -      Accounts.Account_FirstName,
    -      Accounts.Account_LastName,
    -      Accounts.Account_Email
    -      FROM         Orders INNER JOIN
    -      LineItems ON Orders.Order_ID = LineItems.Order_ID LEFT OUTER JOIN
    -      Accounts ON Orders.Account_ID = Accounts.Account_ID
    -      Order by Orders.Order_ID
    -    
    -    
    -  
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/LineItem.xml
    deleted file mode 100644
    index 401a8dd..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/LineItem.xml
    +++ /dev/null
    @@ -1,235 +0,0 @@
    -
    -
    -
    -
    -  
    -    
    -    
    -    
    -  
    -  
    -    	
    -    
    -            
    -    
    -    
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -  
    -  
    -
    -    
    -      ps_SelectLineItem
    -    
    -    
    -    
    -      select
    -        LineItem_Price
    -        from LineItems
    -        where Order_ID = #Order_ID#
    -        and LineItem_ID = #LineItem_ID#
    -    
    -    
    -    
    -      select
    -        LineItem_ID as Id,
    -        LineItem_Code as Code,
    -        LineItem_Quantity as Quantity,
    -        LineItem_Price as Price
    -      from LineItems where Order_ID = #value#
    -    
    -    
    -    
    -      select
    -        LineItem_ID as Id,
    -        LineItem_Code as Code,
    -        LineItem_Quantity as Quantity,
    -        LineItem_Price as Price
    -      from LineItems where Order_ID = #value#
    -      order by LineItem_Code
    -    
    -
    -    
    -        select
    -        LineItem_ID as Id,
    -        LineItem_Code as Code,
    -        LineItem_Quantity as Quantity,
    -        LineItem_Price as Price
    -        from LineItems where Order_ID = #value#
    -        order by LineItem_Code
    -    
    -    
    -    
    -      select
    -      LineItem_ID as Id,
    -      LineItem_Code as Code,
    -      LineItem_Quantity as Quantity,
    -      LineItem_Price as Price
    -      from LineItems
    -      where Order_ID = #Order_ID#
    -      and LineItem_ID = #Order_FavouriteLineItem#
    -    
    -
    -    
    -      select
    -      LineItem_ID as Id,
    -      LineItem_Code as Code,
    -      LineItem_Quantity as Quantity,
    -      LineItem_Price as Price
    -      from LineItems
    -      where Order_ID = #Order_ID#
    -      and LineItem_ID = #LineItem_ID#
    -    
    -    
    -    
    -      select
    -        LineItem_ID as Id,
    -        LineItem_Code as Code,
    -        LineItem_Quantity as Quantity,
    -        LineItem_Price as Price,
    -        LineItem_Picture as PictureData				
    -        from LineItems
    -      where Order_ID = #Order_ID#
    -        and LineItem_ID = #LineItem_ID#
    -    
    -    
    -    
    -    
    -    
    -      select
    -        LineItem_ID,
    -        LineItem_Code,
    -        LineItem_Quantity,
    -        LineItem_Price
    -        from LineItems
    -        where LineItem_ID =  #value#
    -    
    -    
    -    
    -      insert into LineItems
    -      (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -      values
    -      (?, ?, ?, ?, ?);
    -    
    -    
    -    
    -      insert into LineItems
    -      (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -      values
    -      (?, ?, ?, ?, ?, ?);
    -    
    -    
    -    
    -      insert into LineItems
    -      (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -      values
    -      (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -      
    -        select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -      
    -    	
    -    
    -     
    -      
    -        select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -      
    -      insert into LineItems
    -      (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -      values
    -      (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -    
    -  
    -    
    -      insert into LineItems
    -      (LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -      values
    -      (#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -    
    -  
    -      
    -    
    -      
    -      delete from LineItems where Order_ID = 10
    -      
    -      delete from LineItems where Order_ID = 9
    -    
    -    
    -  
    -  
    -
    -  
    -  
    -
    -    
    -      
    -    
    -    
    -    
    -      
    -      
    -      			
    -      
    -      
    -    
    -        
    -    
    -      
    -      
    -      			
    -      
    -      
    -      
    -    
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/MapModule.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/MapModule.xml
    deleted file mode 100644
    index 2e09838..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/MapModule.xml
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -
    -
    -  
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Module/Order2.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Module/Order2.xml
    deleted file mode 100644
    index b1c43df..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Module/Order2.xml
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -
    -
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -  
    -    
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -  
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/NewsPaper.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/NewsPaper.xml
    deleted file mode 100644
    index 7427f0c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/NewsPaper.xml
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -
    -
    -
    -  
    -    
    -    
    -  
    -
    -  
    -
    -    
    -			
    -			
    -		
    -
    -    
    -      
    -    
    -
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Nullable.xml
    deleted file mode 100644
    index 03b2461..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Nullable.xml
    +++ /dev/null
    @@ -1,81 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -    
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle, TestTimeSpan)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#, #TestTimeSpan#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml
    deleted file mode 100644
    index 041cf5c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Order.xml
    +++ /dev/null
    @@ -1,946 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	  
    -	
    -		
    -			
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		  
    -		
    -		
    -			
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		  
    -		
    -		
    -			
    -				
    -				
    -					
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -				
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -				
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -				
    -			
    -      
    -      
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -		
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -				
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -	  
    -	
    -	
    -	
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -   
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -	    
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -    
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -					
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -    
    -		
    -			select * from Orders where Order_ID = #value#
    -				
    -
    -		
    -			select * from Orders
    -		
    -
    -    
    -      select * from Orders
    -    
    -    
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -											
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -			
    -		
    -					
    -		
    -			
    -		
    -			
    -				
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders
    -    
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -			
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -    
    -	
    -	  
    -
    -    
    -    
    -    
    -
    -    
    -
    -  
    -
    -	   
    -		
    -		
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Other.xml
    deleted file mode 100644
    index 029bac1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Other.xml
    +++ /dev/null
    @@ -1,171 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -					
    -	
    -	
    -	
    -	
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -				
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -		
    -
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -				
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -		
    -	
    -
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParameterClass.xml
    deleted file mode 100644
    index 9a6a9a2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild1.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild1.xml
    deleted file mode 100644
    index 9271e87..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild1.xml
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -
    -
    -
    -  
    -  
    -    
    -    
    -  
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild2.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild2.xml
    deleted file mode 100644
    index efbab0c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ParentChild2.xml
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -
    -
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ResultClass.xml
    deleted file mode 100644
    index 91c9a38..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/ResultClass.xml
    +++ /dev/null
    @@ -1,130 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -			select cast(1 as bit) from Orders where Order_ID = #dummy#
    -		
    -		
    -			
    -
    -		
    -			select cast(155 as tinyint) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast('a' as char) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -		
    -			select cast('2003-02-15 8:15:00' as datetime) from Orders where Order_ID  = #value#
    -		
    -		
    -		
    -									
    -		
    -			select cast(1.56 as decimal(9,2)) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -
    -		
    -			select cast(99.5 as float) from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -			select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as UniqueIdentifier) from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -		
    -		
    -			select cast(32111 as SmallInt) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast(999999 as int) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(9223372036854775800 as bigint) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(92233.5 as real) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Simple.xml
    deleted file mode 100644
    index 17887ee..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MSSQL/SqlClient/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    name = #Name#,
    -    address = #Address#,
    -    count = #Count#,
    -    date = #Date#,
    -    pay = #Pay#
    -    where
    -    id = #Id#
    -  
    -
    -
    -  
    -    delete Simples 
    -    where
    -    id = #value#
    -  
    -
    -  
    -    insert into Simples ( name, address, count, date, pay, id )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml
    deleted file mode 100644
    index 414e7a0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Account.xml
    +++ /dev/null
    @@ -1,619 +0,0 @@
    -
    -
    -
    -	
    -	
    -       
    -    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -		
    -       
    -	
    -		
    -	       
    -       
    -	                                    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -	
    -		
    -			
    -		
    -			
    -		
    -
    -  		
    -		
    -		
    -
    -		
    -		
    -    	
    -		
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -  
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress:varchar:no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:varchar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:varchar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:varchar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -			
    -				
    -		
    -		
    -					
    -				
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -        
    -        								
    -		
    -		
    -			ps_InsertAccount
    -		
    -		
    -		
    -			ps_swap_email_address
    -		
    -	
    -
    -	
    -	   
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -						
    -		
    -		
    -		
    -			
    -						
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Category.xml
    deleted file mode 100644
    index ad1dab0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Category.xml
    +++ /dev/null
    @@ -1,168 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            			
    -  			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #GuidString:varchar#);
    -		
    -		
    -		
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #GuidString:varchar#)
    -		
    -
    -				
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -
    -				
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -		
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -		
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as Guid
    -			from Categories  
    -			
    -				
    -					Category_Guid=#GuidString:varchar#
    -				
    -			
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Complex.xml
    deleted file mode 100644
    index d45a505..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Complex.xml
    +++ /dev/null
    @@ -1,24 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:varchar:no_email@provided.com#
    -			)
    -		
    -				
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Document.xml
    deleted file mode 100644
    index 53c573d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -		
    -				
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -			select 
    -				*
    -			from Documents 
    -			order by Document_Type, Document_Id
    -		
    -		
    -				
    -		
    -		
    -		
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/DynamicAccount.xml
    deleted file mode 100644
    index 970d3f4..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/DynamicAccount.xml
    +++ /dev/null
    @@ -1,502 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -	
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -	
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like #EmailAddress#
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -			
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -			
    -
    -			order by Account_LastName
    -		
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -		
    -				
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Enumeration.xml
    deleted file mode 100644
    index 4a63bd0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/LineItem.xml
    deleted file mode 100644
    index 660e296..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/LineItem.xml
    +++ /dev/null
    @@ -1,198 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -		
    -  		
    -		
    -			
    -			delete from LineItems where Order_ID = 10;
    -			
    -			delete from LineItems where Order_ID = 9;
    -				
    -  
    -  
    -	
    -
    -  
    -	   
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Nullable.xml
    deleted file mode 100644
    index 7120804..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Nullable.xml
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Order.xml
    deleted file mode 100644
    index 534babb..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Order.xml
    +++ /dev/null
    @@ -1,473 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	  
    -	
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -    
    -			
    -		
    -
    -		
    -			
    -		
    -				
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -			
    -						
    -	  
    -	
    -	
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -     
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -			
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders
    -		
    -
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -				
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -			
    -
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -				
    -				
    -		
    -			
    -		
    -						
    -		
    -		
    -
    -			
    -						
    -	
    -
    -	   
    -		
    -		
    -			
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Other.xml
    deleted file mode 100644
    index dbda901..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/Other.xml
    +++ /dev/null
    @@ -1,170 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -						
    -	
    -		
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -	
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -				
    -					
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=varchar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -					
    -	
    -	
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ParameterClass.xml
    deleted file mode 100644
    index 9a6a9a2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ResultClass.xml
    deleted file mode 100644
    index c10f591..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/ByteFx/ResultClass.xml
    +++ /dev/null
    @@ -1,134 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -			select 1 from Orders where Order_ID = #dummy#
    -		
    -		
    -			
    -
    -		
    -			select 155 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			
    -		
    -		
    -			select cast('a' as char) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast('2003-02-15 8:15:00' as datetime) from Orders where Order_ID  = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 1.56 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -
    -		
    -			select 99.5 from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -		
    -			select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as binary) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 32111 from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select 999999 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 9223372036854775800 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 92233.5 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml
    deleted file mode 100644
    index a0f9ce9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Account.xml
    +++ /dev/null
    @@ -1,619 +0,0 @@
    -
    -
    -
    -	
    -	
    -       
    -    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -		
    -       
    -	
    -		
    -	     
    -	       
    -	                                    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -	
    -		
    -			
    -		
    -			
    -		
    -
    -  		
    -		
    -		
    -		
    -		
    -		
    -    	
    -		
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -  
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress:VarChar:no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -			
    -
    -		
    -		
    -							
    -
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -        
    -        								
    -		
    -		
    -			ps_InsertAccount
    -		
    -		
    -		
    -			ps_swap_email_address
    -		
    -	
    -
    -	
    -	   
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -						
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Category.xml
    deleted file mode 100644
    index 7aa8949..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Category.xml
    +++ /dev/null
    @@ -1,168 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            			
    -  			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #GuidString:Varchar#);
    -		
    -		
    -		
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #GuidString:Varchar#)
    -		
    -
    -				
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -
    -				
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -		
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -		
    -		
    -			
    -				select LAST_INSERT_ID() as value
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as Guid
    -			from Categories  
    -			
    -				
    -					Category_Guid=#GuidString:Varchar#
    -				
    -			
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Complex.xml
    deleted file mode 100644
    index efdb245..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Complex.xml
    +++ /dev/null
    @@ -1,24 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:Varchar:no_email@provided.com#
    -			)
    -		
    -				
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Document.xml
    deleted file mode 100644
    index 53c573d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -		
    -				
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -			select 
    -				*
    -			from Documents 
    -			order by Document_Type, Document_Id
    -		
    -		
    -				
    -		
    -		
    -		
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/DynamicAccount.xml
    deleted file mode 100644
    index ddc8938..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/DynamicAccount.xml
    +++ /dev/null
    @@ -1,504 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -	
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like #EmailAddress#
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -			
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -			
    -
    -			order by Account_LastName
    -		
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -		
    -		
    -	
    -
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Enumeration.xml
    deleted file mode 100644
    index bff959b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/LineItem.xml
    deleted file mode 100644
    index 99086db..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/LineItem.xml
    +++ /dev/null
    @@ -1,198 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -		
    -  		
    -		
    -			
    -			delete from LineItems where Order_ID = 10;
    -			
    -			delete from LineItems where Order_ID = 9;
    -				
    -  
    -  
    -	
    -
    -  
    -	   
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Nullable.xml
    deleted file mode 100644
    index 7120804..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Nullable.xml
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Order.xml
    deleted file mode 100644
    index 710f46c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Order.xml
    +++ /dev/null
    @@ -1,472 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	  
    -	
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -    
    -			
    -		
    -
    -		
    -			
    -		
    -				
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -				
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -				
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -	  
    -	
    -	
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -				
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders
    -		
    -
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -				
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -			
    -
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -				
    -				
    -		
    -			
    -		
    -						
    -		
    -		
    -
    -							
    -	
    -
    -	   
    -		
    -		
    -			
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Other.xml
    deleted file mode 100644
    index 7099c3c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Other.xml
    +++ /dev/null
    @@ -1,169 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -				
    -	
    -		
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -				
    -	
    -	
    -	
    -	
    -		
    -			
    -	
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -				
    -					
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -					
    -	
    -	
    -		   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ParameterClass.xml
    deleted file mode 100644
    index 86ab6b9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ParameterClass.xml
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -		
    -		
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ResultClass.xml
    deleted file mode 100644
    index 16872aa..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/ResultClass.xml
    +++ /dev/null
    @@ -1,134 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -			select 1 from Orders where Order_ID = #dummy#
    -		
    -		
    -		
    -
    -		
    -			select 155 from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -		
    -			select cast('a' as char) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast('2003-02-15 8:15:00' as datetime) from Orders where Order_ID  = #value#
    -		
    -		
    -		
    -									
    -		
    -			select 1.56 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -
    -		
    -			select 99.5 from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -		
    -			select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as binary) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 32111 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 999999 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 9223372036854775800 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 92233.5 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Simple.xml
    deleted file mode 100644
    index 36298c7..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/MySql/MySql/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    `Name` = #Name#,
    -    `Address` = #Address#,
    -    `Count` = #Count#,
    -    `Date` = #Date#,
    -    `Pay` = #Pay#
    -    where
    -    `ID` = #Id#
    -  
    -
    -
    -  
    -    delete from Simples 
    -    where
    -    `Id` = #value#
    -  
    -
    -  
    -    insert into Simples ( `Name`, `Address`, `Count`, `Date`, `Pay`, `ID` )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml
    deleted file mode 100644
    index 748892b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Account.xml
    +++ /dev/null
    @@ -1,729 +0,0 @@
    -
    -
    -
    -
    -	
    -       
    -    
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -		
    -    
    -	
    -		
    -	         
    -       
    -	                                    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -	
    -		
    -			
    -		
    -			
    -		
    -		
    -
    -		
    -
    -		
    -
    -		
    -
    -		  
    -  
    -				
    -  
    -		
    -  
    -		
    -  
    -  		
    -		
    -  
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -  
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#)
    -		
    -		
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:Varchar2:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -							
    -				
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -        
    -        						
    -		
    -		
    -		
    -			prc_InsertAccount
    -		
    -		
    -		
    -		
    -			prc_Swap_Email_Address
    -		
    -
    -		
    -			REF_CURSOR_TEST.GET_ACCOUNTS_PROCEDURE
    -		
    -
    -		
    -			REF_CURSOR_TEST.GET_ACCOUNT_PROCEDURE
    -		
    -
    -	
    -
    -	
    -	   
    -	
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -					
    -
    -		
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -				
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Category.xml
    deleted file mode 100644
    index 85b1506..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Category.xml
    +++ /dev/null
    @@ -1,238 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -	
    -  	
    -	
    -
    -		
    -	
    -		
    -		
    -		
    -		
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            		
    -			insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid) 
    -			values 
    -				(#Id#, #Name#, #GuidString:Varchar2#)
    -		
    -		
    -		
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            		
    -            insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid) 
    -			values 
    -				(?, ?, ?)
    -		
    -		
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            	
    -			insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid)
    -			values 
    -				(?,?,?)
    -		
    -
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            	
    -			insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid)
    -			values 
    -				(?,?,?)
    -		
    -		
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -
    -		
    -		
    -			prc_InsertCategory
    -		
    -		
    -						
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as GuidString
    -			from Categories  
    -			
    -				
    -					Category_Guid=#GuidString:Varchar2#
    -				
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -		
    -		
    -				
    -		
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -				
    -		
    -					
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Complex.xml
    deleted file mode 100644
    index f83c1fc..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Complex.xml
    +++ /dev/null
    @@ -1,23 +0,0 @@
    - 
    -
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id:Int32#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:Varchar2:no_email@provided.com#
    -			)
    -				
    -		
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Document.xml
    deleted file mode 100644
    index e3d3808..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -		
    -			
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -			select 
    -				*
    -			from Documents 
    -			order by Document_Type, Document_Id
    -		
    -		
    -				
    -		
    -		
    -		
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/DynamicAccount.xml
    deleted file mode 100644
    index e5429a2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/DynamicAccount.xml
    +++ /dev/null
    @@ -1,541 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -			ORDER BY Account_Id ASC			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -			ORDER BY Account_Id ASC			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE (
    -			
    -				Account_FirstName LIKE #NamePatterns[]#
    -			
    -			)
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE (
    -			
    -				Account_FirstName LIKE #[]#
    -			
    -			)
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -			ORDER BY Account_Id ASC			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -  		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like '%$EmailAddress$%'
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -			
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]>
    -				
    -				
    -						= TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]>
    -				
    -			
    -
    -			order by Account_LastName
    -		
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -				
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Enumeration.xml
    deleted file mode 100644
    index 175fc95..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/LineItem.xml
    deleted file mode 100644
    index 8861f06..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/LineItem.xml
    +++ /dev/null
    @@ -1,214 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID:Int32#
    -				and LineItem_ID = #LineItem_ID:Int32#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value:Int32#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value:Int32#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID:Int32#
    -				and LineItem_ID = #LineItem_ID:Int32#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID:Int32#
    -				and LineItem_ID = #LineItem_ID:Int32#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?)
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?)
    -		
    -  
    -  		
    -  		
    -		
    -			
    -			BEGIN delete from LineItems where Order_ID = 10;
    -			
    -			delete from LineItems where Order_ID = 9; END;
    -		    
    -  
    -  
    -	
    -
    -  
    -	   
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Nullable.xml
    deleted file mode 100644
    index 7120804..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Nullable.xml
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Order.xml
    deleted file mode 100644
    index e0dbe08..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Order.xml
    +++ /dev/null
    @@ -1,475 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	  
    -	
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -		
    -		
    -		
    -			
    -				
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -			
    -						
    -	  
    -	
    -	
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -			
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -				
    -
    -		
    -			select * from Orders
    -		
    -
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID Id,
    -				Order_Date "Date",
    -				Order_CardExpiry CardExpiry,
    -				Order_CardType CardType,
    -				Order_CardNumber CardNumber,
    -				Order_Street Street,
    -				Order_City City,
    -				Order_Province Province,
    -				Order_PostalCode PostalCode,
    -				LineItem_ID "FavouriteLineItem.Id",
    -				LineItem_Code "FavouriteLineItem.Code",
    -				LineItem_Quantity "FavouriteLineItem.Quantity",
    -				LineItem_Price "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -				
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -			
    -	
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -				
    -		
    -					
    -		
    -		
    -
    -			
    -						
    -	
    -
    -	   
    -		
    -		
    -			
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Other.xml
    deleted file mode 100644
    index 83d03ea..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Other.xml
    +++ /dev/null
    @@ -1,191 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -				
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -				
    -	
    -	
    -	
    -
    -		
    -
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid:Int64# 
    -				  
    -			 
    -		
    -				
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool,handler=OneZeroBool# 
    -		
    -		
    -				
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool,handler=OneZeroBool#, 'Yes')
    -			
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool,handler=OneZeroBool#, #Bool2,type=bool,dbType=Varchar2#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool,handler=OneZeroBool#, #Bool2,handler=OuiNonBool#)
    -									
    -	
    -	
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ParameterClass.xml
    deleted file mode 100644
    index 6c20917..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ResultClass.xml
    deleted file mode 100644
    index fdcd4f2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/ResultClass.xml
    +++ /dev/null
    @@ -1,157 +0,0 @@
    -
    -
    -
    -
    -		
    -
    -		
    -			select 1 from dual where 1 = #dummy#
    -		
    -		
    -			
    -
    -		
    -			select 155 from dual where 1 = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast('a' as char) from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -		
    -			select TO_DATE('2003-02-15 8:15:00', 'YYYY-MM-DD HH:MI:SS') from dual where 1 = #value#
    -		
    -		
    -		
    -									
    -		
    -			select 1.56 from dual where 1 = #value#
    -		
    -		
    -		
    -
    -		
    -		
    -			select trunc(99.5,1) from dual where 1 = #value#
    -		
    -		
    -		
    -
    -		
    -			select 'CD5ABF17-4BBC-4C86-92F1-257735414CF4' from dual where 1 = #value#
    -		
    -		
    -		 
    -		
    -		
    -			select 32111 from dual where 1 = #value#
    -		
    -		
    -			
    -		
    -		
    -			select 999999 from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 9223372036854775800 from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -		
    -		
    -			select trunc(92233.5,1) from dual where 1 = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Simple.xml
    deleted file mode 100644
    index cdcb3b4..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/ODP/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    name = #Name#,
    -    address = #Address#,
    -    count = #Count#,
    -    "date" = #Date#,
    -    pay = #Pay#
    -    where
    -    id = #Id#
    -  
    -
    -
    -  
    -    delete Simples 
    -    where
    -    id = #value#
    -  
    -
    -  
    -    insert into Simples ( name, address, count, "date", pay, id )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml
    deleted file mode 100644
    index 539bcf5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Account.xml
    +++ /dev/null
    @@ -1,701 +0,0 @@
    -
    -
    -
    -	
    -	
    -       
    -    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -		
    -       
    -	
    -		
    -	         
    -	       
    -	                                    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -	
    -		
    -				
    -		
    -			
    -		
    -		
    -
    -		
    - 
    - 		
    -
    -		
    -
    -		  
    -  
    -		
    -		
    -		
    -  
    -		
    -  
    -		
    -		
    -  
    -		
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -  
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -
    -		
    -		
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress,type=string,dbType=Varchar,nullValue=no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			
    -			
    -					
    -		
    -				
    -		
    -							
    -		
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -        
    -        				
    -		
    -			prc_InsertAccount
    -		
    -		
    -		
    -			prc_Swap_Email_Address
    -		
    -		
    -		
    -			REF_CURSOR_TEST.GET_ACCOUNTS_PROCEDURE
    -		
    -		
    -		
    -			REF_CURSOR_TEST.GET_ACCOUNT_PROCEDURE
    -				
    -		
    -	
    -
    -	
    -	   
    -		
    -		
    -			
    -			
    -			
    -		
    -		
    -			
    -			
    -							
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Category.xml
    deleted file mode 100644
    index 2ccdb5b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Category.xml
    +++ /dev/null
    @@ -1,238 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -	
    -  	
    -	
    -
    -    
    -    	
    -		
    -		
    -		
    -		
    -		
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            		
    -			insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid) 
    -			values 
    -				(#Id#, #Name#, #GuidString:VarChar#)
    -		
    -		
    -		
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            		
    -            insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid) 
    -			values 
    -				(#Id#, #Name#, #GuidString:VarChar#)
    -		
    -		
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            	
    -			insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid)
    -			values 
    -				(?,?,?)
    -		
    -
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            	
    -			insert into Categories  
    -				(Category_Id, Category_Name, Category_Guid)
    -			values 
    -				(?,?,?)
    -		
    -		
    -		
    -			update Categories set
    -			Category_Name = ?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -
    -		
    -		
    -			prc_InsertCategory
    -		
    -		
    -		
    -			
    -				select s_categories.nextval as value from dual
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as GuidString
    -			from Categories  
    -			
    -				
    -					Category_Guid=#GuidString:VarChar#
    -				
    -			
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -		
    -
    -		
    -		
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Complex.xml
    deleted file mode 100644
    index c807100..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Complex.xml
    +++ /dev/null
    @@ -1,23 +0,0 @@
    - 
    -
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -				
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Document.xml
    deleted file mode 100644
    index eada584..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -		
    -			
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -			select 
    -				*
    -			from Documents 
    -			order by Document_Type, Document_Id
    -		
    -		
    -				
    -		
    -		
    -		
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/DynamicAccount.xml
    deleted file mode 100644
    index 7baf100..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/DynamicAccount.xml
    +++ /dev/null
    @@ -1,549 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -	
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -			ORDER BY Account_Id ASC			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -			ORDER BY Account_Id ASC			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE (
    -			
    -				Account_FirstName LIKE #NamePatterns[]#
    -			
    -			)
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE (
    -			
    -				Account_FirstName LIKE #[]#
    -			
    -			)
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -			ORDER BY Account_Id ASC			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -			ORDER BY Account_Id ASC
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -		  
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like #EmailAddress#
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -			
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]>
    -				
    -				
    -						= TO_CHAR(#StartDate#, 'mm/dd/yyyy') ]]>
    -				
    -			
    -
    -			order by Account_LastName
    -		
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -				
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Enumeration.xml
    deleted file mode 100644
    index bff959b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/LineItem.xml
    deleted file mode 100644
    index 5680d44..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/LineItem.xml
    +++ /dev/null
    @@ -1,205 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?)
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Number#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Number#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Number#)
    -		
    -  
    -  		
    -  		
    -		
    -			
    -			BEGIN delete from LineItems where Order_ID = 10;
    -			
    -			delete from LineItems where Order_ID = 9; END;
    -		  
    -  
    -  
    -	
    -
    -  
    -	   
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Nullable.xml
    deleted file mode 100644
    index 7120804..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Nullable.xml
    +++ /dev/null
    @@ -1,55 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Order.xml
    deleted file mode 100644
    index 0b3e3e3..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Order.xml
    +++ /dev/null
    @@ -1,457 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	  
    -	
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -		
    -		
    -		
    -			
    -				
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -			
    -					
    -	  
    -	
    -	
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -			
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders
    -		
    -
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID Id,
    -				Order_Date "Date",
    -				Order_CardExpiry CardExpiry,
    -				Order_CardType CardType,
    -				Order_CardNumber CardNumber,
    -				Order_Street Street,
    -				Order_City City,
    -				Order_Province Province,
    -				Order_PostalCode PostalCode,
    -				LineItem_ID "FavouriteLineItem.Id",
    -				LineItem_Code "FavouriteLineItem.Code",
    -				LineItem_Quantity "FavouriteLineItem.Quantity",
    -				LineItem_Price "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -				
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -			
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -				
    -					
    -		
    -		
    -
    -			
    -						
    -	
    -
    -	   
    -		
    -		
    -			
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Other.xml
    deleted file mode 100644
    index 872d854..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Other.xml
    +++ /dev/null
    @@ -1,170 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -				
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -				
    -
    -	
    -	
    -	
    -
    -		
    -	
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -				
    -				
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -						
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=VarChar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -									
    -	
    -	
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -		
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ParameterClass.xml
    deleted file mode 100644
    index 6c20917..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ResultClass.xml
    deleted file mode 100644
    index cf8d2ad..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/ResultClass.xml
    +++ /dev/null
    @@ -1,128 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -			select 1 from dual where 1 = #dummy#
    -		
    -		
    -		
    -
    -		
    -			select 155 from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast('a' as char) from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -		
    -			select TO_DATE('2003-02-15 8:15:00', 'YYYY-MM-DD HH:MI:SS') from dual where 1 = #value#
    -		
    -		
    -		
    -									
    -		
    -			select 1.56 from dual where 1 = #value#
    -		
    -		
    -		
    -
    -		
    -			select 99.5 from dual where 1 = #value#
    -		
    -		
    -		
    -
    -		
    -			select 'CD5ABF17-4BBC-4C86-92F1-257735414CF4' from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 32111 from dual where 1 = #value#
    -		
    -		
    -			
    -		
    -		
    -			select 999999 from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 9223372036854775800 from dual where 1 = #value#
    -		
    -		
    -				
    -		
    -		
    -			select 92233.5 from dual where 1 = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from dual where 1 = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Simple.xml
    deleted file mode 100644
    index cdcb3b4..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/Oracle/OracleClient/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    name = #Name#,
    -    address = #Address#,
    -    count = #Count#,
    -    "date" = #Date#,
    -    pay = #Pay#
    -    where
    -    id = #Id#
    -  
    -
    -
    -  
    -    delete Simples 
    -    where
    -    id = #value#
    -  
    -
    -  
    -    insert into Simples ( name, address, count, "date", pay, id )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Account.xml
    deleted file mode 100644
    index 03ebcef..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Account.xml
    +++ /dev/null
    @@ -1,651 +0,0 @@
    -
    -
    -
    -	
    -	
    -       
    -    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -			
    -		
    -    
    -       
    -	
    -		
    -	       
    -       
    -	
    -
    -    
    -    
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -	
    -	
    -
    -    
    -    
    -		
    -				
    -		
    -			
    -		
    -
    -  		
    -		
    -		
    -		
    -		
    -
    -		
    -
    -		
    -		
    -		
    -  
    -		
    -  
    -		
    -		
    -  
    -  		
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -  
    -		
    -
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress:Text:no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:Text:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:Text# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:Text# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -			
    -				
    -		
    -		
    -					
    -
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -        
    -        		
    -	
    -
    -	
    -	   
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Category.xml
    deleted file mode 100644
    index 1922092..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Category.xml
    +++ /dev/null
    @@ -1,196 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -  
    -    
    -      
    -      
    -      
    -    
    -  
    -
    -	
    -	
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -		
    -			
    -				SELECT cast(last_value as int) AS value
    -                FROM categories_category_id_seq
    -            			
    -  			insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #GuidString:Text#);
    -		
    -		
    -		
    -		
    -			
    -				SELECT cast(last_value as int) AS value
    -                FROM categories_category_id_seq
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #GuidString:Text#)
    -		
    -
    -		
    -			
    -				SELECT cast(last_value as int) AS value
    -                FROM categories_category_id_seq
    -            
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -
    -		
    -			
    -				SELECT cast(last_value as int) AS value
    -                FROM categories_category_id_seq
    -            
    -			insert into Categories  
    -				(Category_Name, Category_Guid)
    -			values 
    -				(?,?);
    -		
    -		
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -
    -		
    -			
    -				SELECT cast(last_value as int) AS value
    -                FROM categories_category_id_seq
    -            
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -				
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as GuidString
    -			from Categories  
    -			
    -				
    -					Category_Guid=#GuidString:Text#
    -				
    -			
    -		
    -	
    -	
    -	
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -		
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Complex.xml
    deleted file mode 100644
    index a77ac9f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Complex.xml
    +++ /dev/null
    @@ -1,24 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -	
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:Text:no_email@provided.com#
    -			)
    -		
    -				
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Document.xml
    deleted file mode 100644
    index 53c573d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Document.xml
    +++ /dev/null
    @@ -1,70 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -		
    -		
    -				
    -	
    -	
    -	  	
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -		
    -			select 
    -				*
    -			from Documents 
    -			order by Document_Type, Document_Id
    -		
    -		
    -				
    -		
    -		
    -		
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/DynamicAccount.xml
    deleted file mode 100644
    index 1b0818d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/DynamicAccount.xml
    +++ /dev/null
    @@ -1,501 +0,0 @@
    - 
    -
    -		
    -	
    -		
    -	
    -			
    -	
    -
    -		
    -			select
    -			Account_ID			as _id,
    -			Account_FirstName	as _firstName,
    -			Account_LastName	as _lastName,
    -			Account_Email		as _emailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #_id#
    -			
    -			
    -				Account_ID in
    -				
    -					#_ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #_emailAddress#
    -				
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -			SELECT
    -			Account_ID as Id,
    -			
    -				
    -					Account_FirstName as FirstName,
    -				
    -				
    -					Account_LastName as LastName,
    -				
    -			
    -
    -			Account_Email as EmailAddress
    -			FROM
    -			Accounts
    -		
    -	
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				where Account_FirstName = 'Joe'
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_FirstName = #value#
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			where Account_ID = 1
    -			
    -		
    -	
    -
    -		
    -			
    -			$statement$
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -		
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#Ids[]#
    -			
    -		
    -		
    -		 
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			WHERE Account_ID IN
    -			
    -				#[]#
    -			
    -				and Account_ID IN
    -			
    -				#[]#
    -			
    -		
    -
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #Id#
    -			
    -			
    -				Account_ID in
    -				
    -					#Ids[]#
    -				
    -			
    -			
    -				Account_FirstName = #FirstName#
    -			
    -			
    -				Account_LastName = #LastName#
    -			
    -			
    -				
    -				Account_Email = 'clinton.begin@ibatis.com'
    -				
    -				
    -				Account_Email = #EmailAddress#
    -				
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			Account_ID IN
    -			
    -				#[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -			
    -				Account_ID = #[]#
    -			
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -						Account_ID = #[]#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					
    -					Account_ID = #Id#
    -					
    -					
    -					Account_FirstName = #FirstName#
    -					
    -					
    -					Account_LastName = #LastName#
    -					
    -				
    -			
    -		
    -
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -				Account_ID = #Id#
    -				
    -			
    -			
    -				
    -				Account_FirstName = #FirstName#
    -				
    -				
    -				Account_LastName = #LastName#
    -				
    -			
    -		
    -  
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					(Account_FirstName = #FirstName#
    -					
    -					Account_LastName = #LastName#
    -					
    -					)
    -				
    -				
    -					Account_Email like #EmailAddress#
    -				
    -				
    -					Account_ID = #Id#
    -				
    -			
    -			order by Account_LastName
    -		
    -			
    -		
    -			select
    -			Account_ID			as Id,
    -			Account_FirstName	as FirstName,
    -			Account_LastName	as LastName,
    -			Account_Email		as EmailAddress
    -			from Accounts
    -			
    -				
    -					((Account_ID $Operande$ #NumberSearch#) or 
    -					(Account_ID $Operande$ #NumberSearch#)) 
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -				
    -						= #StartDate# ]]>
    -				
    -			
    -
    -			order by Account_LastName
    -		
    -		
    -		
    -			INSERT INTO $AccountsTableName$
    -			(
    -				Account_ID, 
    -				Account_FirstName,
    -				Account_LastName
    -			) 
    -			VALUES 
    -			(
    -				#Account.Id#, 
    -				#Account.FirstName#,
    -				#Account.LastName#
    -			)
    -			
    -				SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -						
    -				
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Enumeration.xml
    deleted file mode 100644
    index bff959b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Enumeration.xml
    +++ /dev/null
    @@ -1,60 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -			insert into Enumerations  
    -				(Enum_ID, Enum_Day, Enum_Color, Enum_Month) 
    -			values 
    -				(?, ?, ?, ?)
    -		
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/LineItem.xml
    deleted file mode 100644
    index f4c04e0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/LineItem.xml
    +++ /dev/null
    @@ -1,199 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -	  
    -	
    -	
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Numeric#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Numeric#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Numeric#)
    -		
    -		
    -  		
    -  		
    -		
    -			
    -			delete from LineItems where Order_ID = 10;
    -			
    -			delete from LineItems where Order_ID = 9;
    -				
    -  
    -  
    -	
    -
    -  
    -	   
    -		
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Nullable.xml
    deleted file mode 100644
    index 5baf2a5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Nullable.xml
    +++ /dev/null
    @@ -1,81 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -    
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        SELECT cast(last_value as int) AS value
    -        FROM nullable_id_seq
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Order.xml
    deleted file mode 100644
    index 810c723..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Order.xml
    +++ /dev/null
    @@ -1,638 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -    
    -			
    -		
    -
    -		
    -			
    -		
    -				
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -						
    -	  
    -	
    -	
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -			
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders
    -		
    -
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -				
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -			
    -
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -				
    -				
    -		
    -			
    -		
    -						
    -		
    -		
    -
    -		
    -
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -  
    -
    -	   
    -		
    -		
    -			
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Other.xml
    deleted file mode 100644
    index 524bfe5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Other.xml
    +++ /dev/null
    @@ -1,167 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -		
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -		
    -	
    -	
    -	
    -				
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -				
    -					
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Text#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -				
    -	
    -	
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ParameterClass.xml
    deleted file mode 100644
    index bca767c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ResultClass.xml
    deleted file mode 100644
    index 4c63739..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/ResultClass.xml
    +++ /dev/null
    @@ -1,128 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -      select TRUE from Orders where Order_ID = #dummy#
    -    
    -		
    -		
    -
    -		
    -			select 155 from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select 'a' from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select '2003-02-15 8:15:00'::timestamp from Orders where Order_ID  = #value#
    -		
    -		
    -		
    -									
    -		
    -			select 1.56 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -
    -		
    -			select CAST(99.5 as float8) from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -			select 'CD5ABF17-4BBC-4C86-92F1-257735414CF4' from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -		
    -		
    -			select 32111 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 999999 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select 9223372036854775800 from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select CAST(92233.5 as float4) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Simple.xml
    deleted file mode 100644
    index 495b9ce..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/PostgreSQL/Npgsql/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    name = #Name#,
    -    address = #Address#,
    -    count = #Count#,
    -    date = #Date#,
    -    pay = #Pay#
    -    where
    -    id = #Id#
    -  
    -
    -
    -  
    -    delete from Simples 
    -    where
    -    id = #value#
    -  
    -
    -  
    -    insert into Simples ( name, address, count, date, pay, id )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Account.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Account.xml
    deleted file mode 100644
    index 0c8f80e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Account.xml
    +++ /dev/null
    @@ -1,872 +0,0 @@
    -
    -
    -
    -	
    -       
    -	
    -		
    -    
    -    
    -
    -         
    -  
    -  
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -		
    -
    -    
    -      
    -      
    -    
    -
    -  
    -
    -
    -  
    -    
    -    
    -      
    -      
    -      
    -    
    -    
    -   
    -
    -    
    -    
    -		
    -
    -    
    -   
    -    
    -
    -    
    -    
    -    
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -
    -  
    -
    -  
    -  
    -
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -
    -    
    -
    -    
    -
    -
    -    
    -
    -    
    -    
    -	  
    -		
    -		
    -
    -		
    -  
    -		
    -  
    -		
    -  
    -  		
    -		
    -  		
    -		
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -
    -		
    -    
    -		
    -		
    -		
    -  
    -		
    -				
    -		
    -		
    -		
    -		
    -		
    -  
    -		
    -  
    -		
    -  
    -		
    -		
    -		
    -		
    -		 
    - 
    -		
    -
    -		
    -		
    -		 
    -					
    -		 
    -			insert into Accounts  
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -			values 
    -				(?, ?, ?, ?, ?, ?)
    -		
    -		
    -		 
    -			update Accounts set
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -		
    -		
    -			update Accounts set
    -			Account_ID = ?,
    -			Account_FirstName = ?,
    -			Account_LastName = ?,
    -			Account_Email = ?
    -			where
    -			Account_ID = ?
    -		
    -				
    -		
    -			delete from Accounts 
    -			where
    -			Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress#
    -			)
    -		
    -		
    -
    -		
    -		
    -			update Accounts set
    -			Account_FirstName = #FirstName#,
    -			Account_LastName = #LastName#,
    -			Account_Email = #EmailAddress,type=string,dbType=Varchar,nullValue=no_email@provided.com#
    -			where
    -			Account_ID = #Id#
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#Id#, #FirstName#, #LastName#, #EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				( #Id#, #FirstName#, #LastName#, #EmailAddress:VarChar# )
    -		
    -  
    -		
    -			delete from Accounts
    -			where Account_ID = #Id#
    -			and Account_ID = #Id#
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -    
    -    
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		 
    -			 
    -			 
    -			Accounts 
    -		 
    -		
    -				
    -		
    -			INSERT INTO Accounts
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email)
    -			VALUES(#Id#, #FirstName#, #LastName#
    -			
    -				
    -					#EmailAddress#
    -				
    -				
    -						null
    -				
    -			
    -			)
    -           
    -				
    -		
    -			ps_InsertAccount
    -		
    -		
    -		
    -			ps_swap_email_address
    -		
    -
    -		
    -			ps_SelectAccount
    -		
    -		
    -		
    -			ps_SelectAccount
    -		
    -	
    -		
    -			ps_SelectAccount
    -		
    -
    -    
    -      ps_SelectAllAccount
    -    
    -
    -    
    -      ps_SelectByIdList
    -    
    -    
    -	
    -
    -	
    -	
    -
    -    
    -        
    -    
    -    
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -			
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -								
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Category.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Category.xml
    deleted file mode 100644
    index 45070e5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Category.xml
    +++ /dev/null
    @@ -1,230 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -
    -  
    -    
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -    
    -    
    -  
    -  
    -  
    -
    -    
    -    		ps_InsertCategorieWithReturnValue
    -    
    -    
    -    
    -    
    -		
    -				
    -		
    -		
    -      insert into Categories
    -      (Category_Name, Category_Guid)
    -      values
    -      (#Name#, #Guid:UniqueIdentifier#);
    -      select LAST_INSERT_ROWID() as value;
    -    
    -
    -    
    -      insert into Categories
    -      (Category_Name, Category_Guid)
    -      values
    -      (#Name#, #Guid:UniqueIdentifier#);
    -      select LAST_INSERT_ROWID() as Category_ID
    -    
    -    
    -
    -    
    -		
    -      insert into Categories
    -      (Category_Name, Category_Guid)
    -      values
    -      ('toto', #value:UniqueIdentifier#);
    -      select LAST_INSERT_ROWID() as value
    -    		
    -		
    -		
    -		
    -      insert into Categories
    -      (Category_Name, Category_Guid)
    -      values
    -      ('toto', #value#);
    -      select LAST_INSERT_ROWID() as value
    -    
    -		
    -		
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(#Name#, #Guid:UniqueIdentifier#)
    -		
    -		
    -		
    -			
    -				${selectKey}
    -            			
    -            insert into Categories  
    -				(Category_Name, Category_Guid) 
    -			values 
    -				(${MyCategoryName}, #Guid:UniqueIdentifier#)
    -		
    -		
    -		
    -      insert into Categories
    -      (Category_Name, Category_Guid)
    -      values
    -      (?,?);
    -      select LAST_INSERT_ROWID() as value
    -    
    -
    -		
    -      insert into Categories
    -      (Category_Name, Category_Guid)
    -      values
    -      (?,?);
    -      select LAST_INSERT_ROWID()) as value
    -    
    -		
    -		
    -			update Categories set
    -			Category_Name =?,
    -			Category_Guid = ?
    -			where
    -			Category_Id = ?
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -
    -		
    -			ps_InsertCategorie
    -		
    -				
    -		
    -			
    -        select LAST_INSERT_ROWID() as value
    -      
    -            
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -			select
    -			Category_ID as Id,
    -			Category_Name as Name,
    -			Category_Guid as Guid
    -			from Categories  
    -			
    -				
    -					Category_Guid=#Guid:UniqueIdentifier#
    -				
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -			
    -    
    -		
    -			
    -			
    -		
    -
    -    
    -		
    -			
    -			
    -		
    -		
    -
    -		
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Complex.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Complex.xml
    deleted file mode 100644
    index 5d3e687..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Complex.xml
    +++ /dev/null
    @@ -1,25 +0,0 @@
    - 
    -
    -	
    -	
    -	
    -		
    -			select Account_ID from Accounts where Account_ID = #obj.Map.Id#
    -		
    -		
    -		
    -			insert into Accounts 
    -				(Account_ID, Account_FirstName, Account_LastName, Account_Email) 
    -			values 
    -				(#obj.Map.acct.Id#, #obj.Map.acct.FirstName#, #obj.Map.acct.LastName#, #obj.Map.acct.EmailAddress:VarChar:no_email@provided.com#
    -			)
    -		
    -				
    -	
    -
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ConstructorInjection.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ConstructorInjection.xml
    deleted file mode 100644
    index 3f0bd4d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ConstructorInjection.xml
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -
    -
    -
    -	
    -		
    -		
    -	
    -
    -	
    -
    -		
    -			
    -				
    -				
    -				
    -			
    -		
    -
    -		
    -			
    -		
    -	
    -
    -	
    -
    -		
    -    
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Coupons.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Coupons.xml
    deleted file mode 100644
    index 5b8c3ab..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Coupons.xml
    +++ /dev/null
    @@ -1,65 +0,0 @@
    -
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -
    -  
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -    
    -
    -
    -  
    -
    -  
    -
    -  
    -
    -    
    -
    -    
    -
    -
    -
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Document.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Document.xml
    deleted file mode 100644
    index eb2a729..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Document.xml
    +++ /dev/null
    @@ -1,82 +0,0 @@
    - 
    -
    -
    -	
    -		
    -		
    -			
    -	
    -	
    -	  	
    -		
    -			
    -			 
    -			
    -			
    -		
    -		
    -		
    -			 
    -			
    -			
    -		
    -		
    -		
    -			
    -		
    -				
    -	  
    -	
    -	
    -		
    -		
    -
    -    
    -    
    -		
    -		
    -		
    -
    -    
    -    
    -  
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/DynamicAccount.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/DynamicAccount.xml
    deleted file mode 100644
    index 3efd89a..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/DynamicAccount.xml
    +++ /dev/null
    @@ -1,531 +0,0 @@
    -
    -
    -
    -  
    -    
    -    
    -  
    -
    -  
    -
    -    
    -      
    -        
    -          
    -            Account_ID = #Id#
    -          
    -          
    -            Account_FirstName = #FirstName#
    -          
    -          
    -            Account_LastName = #LastName#
    -          
    -        
    -      
    -    
    -
    -    
    -    
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          
    -            Account_ID = #DataObject.Id#
    -          
    -          
    -            Account_FirstName = #DataObject.FirstName#
    -          
    -          
    -            Account_LastName = #DataObject.LastName#
    -          
    -        
    -      
    -    
    -
    -    
    -    
    -      SELECT
    -      Account_ID as Id,
    -      
    -        
    -          Account_FirstName as FirstName,
    -        
    -        
    -          Account_LastName as LastName,
    -        
    -      
    -
    -      Account_Email as EmailAddress
    -      FROM
    -      Accounts
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_FirstName = 'Joe'
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = #value#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_FirstName = #value#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        where Account_ID = 1
    -      
    -    
    -
    -
    -    
    -      
    -        $statement$
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      WHERE Account_ID IN
    -      
    -        #[]#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      WHERE Account_ID IN
    -      
    -        #Ids[]#
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      WHERE Account_ID IN
    -      
    -        #[]#
    -      
    -      and Account_ID IN
    -      
    -        #[]#
    -      
    -    
    -
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #Id#
    -        
    -        
    -          Account_ID in
    -          
    -            #Ids[]#
    -          
    -        
    -        
    -          Account_FirstName = #FirstName#
    -        
    -        
    -          Account_LastName = #LastName#
    -        
    -        
    -          
    -            Account_Email = 'gilles.bayon@nospam.org'
    -          
    -          
    -            Account_Email = #EmailAddress#
    -          
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as id,
    -      Account_FirstName	as _firstName,
    -      Account_LastName	as _lastName,
    -      Account_Email		as _emailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #id#
    -        
    -        
    -          Account_ID in
    -          
    -            #_ids[]#
    -          
    -        
    -        
    -          Account_FirstName = #FirstName#
    -        
    -        
    -          Account_LastName = #LastName#
    -        
    -        
    -          
    -            Account_Email = 'gilles.bayon@nospam.org'
    -          
    -          
    -            Account_Email = #_emailAddress#
    -          
    -        
    -      
    -    
    -
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        Account_ID IN
    -        
    -          #[]#
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #[]#
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          
    -            Account_ID = #[]#
    -          
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          Account_ID = #Id#
    -        
    -      
    -      
    -        
    -          Account_FirstName = #FirstName#
    -        
    -        
    -          Account_LastName = #LastName#
    -        
    -      
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          (Account_FirstName = #FirstName#
    -          
    -            Account_LastName = #LastName#
    -          
    -          )
    -        
    -        
    -          Account_Email like #EmailAddress#
    -        
    -        
    -          Account_ID = #Id#
    -        
    -      
    -      order by Account_LastName
    -    
    -
    -    
    -      select
    -      Account_ID			as Id,
    -      Account_FirstName	as FirstName,
    -      Account_LastName	as LastName,
    -      Account_Email		as EmailAddress
    -      from Accounts
    -      
    -        
    -          ((Account_ID $Operande$ #NumberSearch#) or
    -          (Account_ID $Operande$ #NumberSearch#))
    -        
    -        
    -          = #Operande# ]]>
    -        
    -        
    -          = #Operande# ]]>
    -        
    -      
    -
    -      order by Account_LastName
    -    
    -
    -    
    -      INSERT INTO $AccountsTableName$
    -      (
    -      Account_ID,
    -      Account_FirstName,
    -      Account_LastName
    -      )
    -      VALUES
    -      (
    -      #Account.Id#,
    -      #Account.FirstName#,
    -      #Account.LastName#
    -      )
    -      
    -        SELECT Account_ID FROM $AccountsTableName$ WHERE Account_ID = #Account.Id#
    -      
    -    
    -
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/EmbedParameter.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/EmbedParameter.xml
    deleted file mode 100644
    index 842fc62..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/EmbedParameter.xml
    +++ /dev/null
    @@ -1,366 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -
    -		
    -		
    -		
    -		
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Enumeration.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Enumeration.xml
    deleted file mode 100644
    index ebe1094..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Enumeration.xml
    +++ /dev/null
    @@ -1,61 +0,0 @@
    -
    -
    -	
    -	
    -		
    -	
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -      insert into Enumerations
    -      (Enum_ID, Enum_Day, Enum_Color, Enum_Month)
    -      values
    -      (?, ?, ?, ?)
    -    
    -		
    -	
    -	
    -	
    -		
    -			
    -			
    -			
    -			
    -		
    -	
    -	
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/GroupByMapping.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/GroupByMapping.xml
    deleted file mode 100644
    index 8d444b0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/GroupByMapping.xml
    +++ /dev/null
    @@ -1,225 +0,0 @@
    -
    -
    -
    -  
    -    
    -    
    -    
    -    
    -    
    -    
    -    
    -
    -  
    -
    -  
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -  
    -
    -  
    -
    -    
    -
    -    
    -    
    -      
    -
    -    
    -
    -    
    -
    -    
    -    
    -    
    -    
    -    
    -    
    -      select
    -      Orders.Order_ID,
    -      Order_City,
    -      LineItem_ID,
    -      LineItem_Code,
    -      LineItem_Quantity,
    -      LineItem_Price,
    -      Accounts.Account_Id,
    -      Accounts.Account_FirstName,
    -      Accounts.Account_LastName,
    -      Accounts.Account_Email
    -      FROM         Orders INNER JOIN
    -      LineItems ON Orders.Order_ID = LineItems.Order_ID LEFT OUTER JOIN
    -      Accounts ON Orders.Account_ID = Accounts.Account_ID
    -      Order by Orders.Order_ID
    -    
    -    
    -  
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/LineItem.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/LineItem.xml
    deleted file mode 100644
    index be661dc..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/LineItem.xml
    +++ /dev/null
    @@ -1,235 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -		
    -    
    -	
    -	
    -	  	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -		
    -		
    -	  
    -	
    -	
    -
    -    
    -      ps_SelectLineItem
    -    
    -    
    -		
    -			select
    -				LineItem_Price
    -				from LineItems
    -				where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price
    -			from LineItems where Order_ID = #value#
    -			order by LineItem_Code
    -		
    -
    -    
    -        select
    -        LineItem_ID as Id,
    -        LineItem_Code as Code,
    -        LineItem_Quantity as Quantity,
    -        LineItem_Price as Price
    -        from LineItems where Order_ID = #value#
    -        order by LineItem_Code
    -    
    -    
    -		
    -      select
    -      LineItem_ID as Id,
    -      LineItem_Code as Code,
    -      LineItem_Quantity as Quantity,
    -      LineItem_Price as Price
    -      from LineItems
    -      where Order_ID = #Order_ID#
    -      and LineItem_ID = #Order_FavouriteLineItem#
    -    
    -
    -    
    -      select
    -      LineItem_ID as Id,
    -      LineItem_Code as Code,
    -      LineItem_Quantity as Quantity,
    -      LineItem_Price as Price
    -      from LineItems
    -      where Order_ID = #Order_ID#
    -      and LineItem_ID = #LineItem_ID#
    -    
    -		
    -		
    -			select
    -				LineItem_ID as Id,
    -				LineItem_Code as Code,
    -				LineItem_Quantity as Quantity,
    -				LineItem_Price as Price,
    -				LineItem_Picture as PictureData				
    -				from LineItems
    -			where Order_ID = #Order_ID#
    -				and LineItem_ID = #LineItem_ID#
    -		
    -		
    -		
    -		
    -		
    -			select
    -				LineItem_ID,
    -				LineItem_Code,
    -				LineItem_Quantity,
    -				LineItem_Price
    -				from LineItems
    -				where LineItem_ID =  #value#
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price, LineItem_Picture)
    -			values
    -			(?, ?, ?, ?, ?, ?);
    -		
    -		
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			
    -		
    -		 
    -			
    -				select 99 from LineItems where LineItem_ID = 1 and Order_ID=1
    -			
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -		
    -			insert into LineItems
    -			(LineItem_ID, Order_ID, LineItem_Code, LineItem_Quantity, LineItem_Price)
    -			values
    -			(#Id#, #Order.Id#, #Code#, #Quantity#, #Price:Decimal#)
    -		
    -  
    -  		
    -		
    -			
    -			delete from LineItems where Order_ID = 10
    -			
    -			delete from LineItems where Order_ID = 9
    -		
    -		
    -  
    -	
    -
    -  
    -	
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -			
    -						
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -						
    -			
    -			
    -			
    -		
    -		
    -	
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/MapModule.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/MapModule.xml
    deleted file mode 100644
    index f12df29..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/MapModule.xml
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -
    -
    -  
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Module/Order2.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Module/Order2.xml
    deleted file mode 100644
    index b1c43df..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Module/Order2.xml
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -
    -
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -  
    -    
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -  
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/NewsPaper.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/NewsPaper.xml
    deleted file mode 100644
    index 38fa4fd..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/NewsPaper.xml
    +++ /dev/null
    @@ -1,23 +0,0 @@
    -
    -
    -
    -  
    -    
    -    
    -  
    -
    -  
    -
    -    
    -			
    -			
    -		
    -
    -    
    -      
    -    
    -
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Nullable.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Nullable.xml
    deleted file mode 100644
    index 64542d3..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Nullable.xml
    +++ /dev/null
    @@ -1,81 +0,0 @@
    -
    -
    -
    -  
    -    
    -  
    -
    -  
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -
    -    
    -    
    -    
    -
    -
    -    
    -    
    -    
    -      
    -        select SCOPE_IDENTITY() as value
    -      
    -      insert into Nullable
    -      (TestBool, TestByte, TestChar, TestDateTime, TestDecimal, TestDouble, TestGuid, TestInt16, TestInt32, TestInt64, TestSingle, TestTimeSpan)
    -      values
    -      (#TestBool#, #TestByte#, #TestChar#, #TestDateTime#, #TestDecimal#, #TestDouble#, #TestGuid#, #TestInt16#, #TestInt32#, #TestInt64#, #TestSingle#, #TestTimeSpan#)
    -    
    -    
    -  
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Order.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Order.xml
    deleted file mode 100644
    index 03ab202..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Order.xml
    +++ /dev/null
    @@ -1,946 +0,0 @@
    -
    -
    -
    -
    -	
    -		
    -	
    -
    -		
    -
    -	  
    -	
    -		
    -			
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		  
    -		
    -		
    -			
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		  
    -		
    -		
    -			
    -				
    -				
    -					
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -				
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -		
    -			
    -				
    -				
    -				
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -				
    -			
    -      
    -      
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -      
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -		
    -			
    -			
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -    
    -      
    -        
    -        
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -    
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -    
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -
    -    
    -      
    -    
    -    
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -
    -		
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -  
    -	
    -		
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -				
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -						
    -		
    -				
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -			
    -		
    -
    -    
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -      
    -    
    -    
    -	  
    -	
    -	
    -	
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -   
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -	    
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -    
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select Order_Date from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select
    -			Order_ID,
    -			Order_Date,
    -			Order_CardExpiry,
    -			Order_CardType,
    -			Order_CardNumber,
    -			Order_Street,
    -			Order_City,
    -			Order_Province,
    -			Order_PostalCode
    -			from Orders where Order_ID = #value#
    -		
    -					
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -    
    -		
    -			select * from Orders where Order_ID = #value#
    -				
    -
    -		
    -			select * from Orders
    -		
    -
    -    
    -      select * from Orders
    -    
    -    
    -		
    -			select
    -			Order_Date
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -
    -		
    -			select 
    -				Orders.Order_ID as Id,
    -				Order_Date as Date,
    -				Order_CardExpiry as CardExpiry,
    -				Order_CardType as CardType,
    -				Order_CardNumber as CardNumber,
    -				Order_Street as Street,
    -				Order_City as City,
    -				Order_Province as Province,
    -				Order_PostalCode as PostalCode,
    -				LineItem_ID as "FavouriteLineItem.Id",
    -				LineItem_Code as "FavouriteLineItem.Code",
    -				LineItem_Quantity as "FavouriteLineItem.Quantity",
    -				LineItem_Price as "FavouriteLineItem.Price"
    -			from Orders, LineItems
    -			where Orders.Order_ID = LineItems.Order_ID
    -			and Order_FavouriteLineItem = LineItems.LineItem_ID
    -			and Orders.Order_ID = #value#
    -		
    -											
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -				select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select distinct Order_CardNumber from Orders
    -			order by Order_CardNumber
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -		
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(#Id#, #Account.Id#, #Date#, #CardExpiry#, #CardType#, #CardNumber#, #Street#, #City#, #Province#, #PostalCode#)
    -				
    -		
    -		
    -			insert into Orders  
    -				(Order_ID, Account_ID, Order_Date, Order_CardExpiry, Order_CardType, 
    -					Order_CardNumber, Order_Street, Order_City, Order_Province, Order_PostalCode ) 
    -			values 
    -				(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
    -			
    -		
    -					
    -		
    -			
    -		
    -			
    -				
    -		
    -		
    -		
    -		
    -			
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders
    -    
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -			
    -		
    -		
    -			select * from Orders where Order_ID = #value#
    -		
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    -    
    -    
    -	
    -	  
    -
    -    
    -    
    -    
    -
    -    
    -
    -  
    -
    -	   
    -		
    -		
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -			
    -		
    -		
    -		 
    -				
    -			
    -			
    -			
    -						
    -			
    -			
    -						
    -			
    -					
    -		
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Other.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Other.xml
    deleted file mode 100644
    index dd85ec6..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Other.xml
    +++ /dev/null
    @@ -1,171 +0,0 @@
    -
    -
    -	
    -	
    -		
    -		
    -		
    -		
    -		
    -		
    -		
    -
    -		
    -	
    -	                                    
    -		
    -			
    -			
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -			
    -			
    -			
    -		
    -			
    -		
    -			
    -			
    -			
    -			
    -		
    -				
    -		
    -			
    -			
    -		
    -		
    -		
    -			
    -			
    -		
    -
    -		
    -			
    -			
    -			
    -
    -		
    -			
    -			
    -					
    -	
    -	
    -	
    -	
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			 
    -				 
    -				Other_Int = #year#  
    -				 
    -				 
    -				 
    -				Other_Long = #areaid# 
    -				  
    -			 
    -		
    -				
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Bit = #Bool# 
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String )
    -			values
    -			( #Int#, #Long#, #Bool#, 'Yes')
    -		
    -
    -		
    -		
    -			select
    -				Other_Int,
    -				Other_Long,
    -				Other_Bit, 
    -				Other_String
    -			from Others  
    -			Where Other_Int = #value#
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( ?, ?, ?, ?)
    -		
    -				
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,type=bool,dbType=Varchar#)
    -		
    -		
    -		
    -			Insert into Others
    -				( Other_Int, Other_Long, Other_Bit, Other_String  )
    -			values
    -			( #Int#, #Long#, #Bool#, #Bool2,handler=OuiNonBool#)
    -		
    -	
    -
    -	   
    -		
    -			
    -			
    -						
    -			
    -		
    -	
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParameterClass.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParameterClass.xml
    deleted file mode 100644
    index 192c25e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParameterClass.xml
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -
    -	
    -			
    -		
    -			UPDATE Accounts SET
    -				Account_Email = #DBNullValue#
    -			WHERE
    -				Account_Email IS NULL
    -				
    -		
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild1.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild1.xml
    deleted file mode 100644
    index d20ec1d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild1.xml
    +++ /dev/null
    @@ -1,41 +0,0 @@
    -
    -
    -
    -  
    -  
    -    
    -    
    -  
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild2.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild2.xml
    deleted file mode 100644
    index fd2a936..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ParentChild2.xml
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -
    -
    -
    -  
    -    
    -      
    -      
    -      
    -      
    -    
    -
    -    
    -      
    -      
    -      
    -      
    -    
    -  
    -
    -  
    -    
    -  
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ResultClass.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ResultClass.xml
    deleted file mode 100644
    index 1f7ed74..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/ResultClass.xml
    +++ /dev/null
    @@ -1,130 +0,0 @@
    -
    -
    -
    -
    -		
    -		
    -			select cast(1 as bit) from Orders where Order_ID = #dummy#
    -		
    -		
    -			
    -
    -		
    -			select cast(155 as tinyint) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast('a' as char) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -		
    -      select datetime(strftime('%s','2003-02-15 08:15:00'), 'unixepoch') from Orders where Order_ID  = #value#
    -    
    -		
    -		
    -									
    -		
    -			select cast(1.56 as decimal(9,2)) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -
    -		
    -			select cast(99.5 as float) from Orders where Order_ID= #value#
    -		
    -		
    -		
    -
    -		
    -			select cast('CD5ABF17-4BBC-4C86-92F1-257735414CF4' as UniqueIdentifier) from Orders where Order_ID = #value#
    -		
    -		
    -		 
    -		
    -		
    -			select cast(32111 as SmallInt) from Orders where Order_ID = #value#
    -		
    -		
    -			
    -		
    -		
    -			select cast(999999 as int) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(9223372036854775800 as bigint) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -		
    -			select cast(92233.5 as real) from Orders where Order_ID = #value#
    -		
    -		
    -		
    -						
    -		
    -			select 'VISA'
    -			from Orders where Order_ID = #value#
    -		
    -		
    -		
    -		
    -	
    -
    -
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Simple.xml b/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Simple.xml
    deleted file mode 100644
    index f72bf7f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Maps/SQLite3/Simple.xml
    +++ /dev/null
    @@ -1,38 +0,0 @@
    -
    -
    -
    -
    -  
    -
    -
    -
    -
    -  
    -    update Simples
    -    set
    -    name = #Name#,
    -    address = #Address#,
    -    count = #Count#,
    -    date = #Date#,
    -    pay = #Pay#
    -    where
    -    id = #Id#
    -  
    -
    -
    -  
    -    delete Simples 
    -    where
    -    id = #value#
    -  
    -
    -  
    -    insert into Simples ( name, address, count, date, pay, id )
    -    values
    -    (#Name#, #Address#, #Count#, #Date#, #Pay#, #Id#)
    -  
    -
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/BaseTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/BaseTest.cs
    deleted file mode 100644
    index be1a73b..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/BaseTest.cs
    +++ /dev/null
    @@ -1,287 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -using System.Data;
    -using System.IO;
    -using System.Reflection;
    -using System.Configuration;
    -using IBatisNet.DataMapper.Configuration;
    -using log4net;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.Common; // DataSource definition
    -using IBatisNet.Common.Utilities; // ScriptRunner definition
    -using IBatisNet.DataMapper; // SqlMap API
    -using IBatisNet.DataMapper.Test.Domain;
    -using System.Collections.Specialized;
    -
    -
    -[assembly: log4net.Config.XmlConfigurator(Watch = true)]
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -    public delegate string KeyConvert(string key);
    -
    -    /// 
    -    /// Summary description for BaseTest.
    -    /// 
    -    [TestFixture]
    -    public abstract class BaseTest
    -    {
    -        /// 
    -        /// The sqlMap
    -        /// 
    -        protected static ISqlMapper sqlMap = null;
    -        private static readonly ILog _logger = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
    -
    -        protected static string ScriptDirectory = null;
    -
    -        protected static KeyConvert ConvertKey = null;
    -
    -        /// 
    -        /// Constructor
    -        /// 
    -        static BaseTest()
    -        {
    -#if dotnet2
    -            ScriptDirectory = Path.Combine(Path.Combine(Path.Combine(Path.Combine(Resources.ApplicationBase, ".."), ".."), "Scripts"),
    -                ConfigurationManager.AppSettings["database"]) + Path.DirectorySeparatorChar;
    -#else
    -            ScriptDirectory = Path.Combine(Path.Combine(Path.Combine(Path.Combine(Resources.ApplicationBase, ".."), ".."), "Scripts"), 
    -                ConfigurationSettings.AppSettings["database"]) + Path.DirectorySeparatorChar;
    -#endif
    -        }
    -
    -        /// 
    -        /// Initialize an sqlMap
    -        /// 
    -        [TestFixtureSetUp]
    -        protected virtual void SetUpFixture()
    -        {
    -            //DateTime start = DateTime.Now;
    -
    -            DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -#if dotnet2
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection2, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int?");
    -            builder.Properties = properties;
    -
    -            string fileName = "sqlmap" + "_" + ConfigurationManager.AppSettings["database"] + "_" + ConfigurationManager.AppSettings["providerType"] + ".config";
    -#else
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace","IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -            builder.Properties = properties;
    -
    -			string fileName = "sqlmap" + "_" + ConfigurationSettings.AppSettings["database"] + "_" + ConfigurationSettings.AppSettings["providerType"] + ".config";
    -#endif
    -            try
    -            {
    -                sqlMap = builder.Configure(fileName);
    -            }
    -            catch (Exception ex)
    -            {
    -                Exception e = ex;
    -                while (e != null)
    -                {
    -                    Console.WriteLine(e.Message);
    -                    Console.WriteLine(e.StackTrace.ToString());
    -                    e = e.InnerException;
    -
    -                }
    -                throw;
    -            }
    -
    -            if (sqlMap.DataSource.DbProvider.Name.IndexOf("PostgreSql") >= 0)
    -            {
    -                BaseTest.ConvertKey = new KeyConvert(Lower);
    -            }
    -            else if (sqlMap.DataSource.DbProvider.Name.IndexOf("oracle") >= 0)
    -            {
    -                BaseTest.ConvertKey = new KeyConvert(Upper);
    -            }
    -            else
    -            {
    -                BaseTest.ConvertKey = new KeyConvert(Normal);
    -            }
    -
    -            //			string loadTime = DateTime.Now.Subtract(start).ToString();
    -            //			Console.WriteLine("Loading configuration time :"+loadTime);
    -        }
    -
    -        /// 
    -        /// Dispose the SqlMap
    -        /// 
    -        [TestFixtureTearDown]
    -        protected virtual void TearDownFixture()
    -        {
    -            sqlMap = null;
    -        }
    -
    -        protected static string Normal(string key)
    -        {
    -            return key;
    -        }
    -
    -        protected static string Upper(string key)
    -        {
    -            return key.ToUpper();
    -        }
    -
    -        protected static string Lower(string key)
    -        {
    -            return key.ToLower();
    -        }
    -
    -        /// 
    -        /// Configure the SqlMap
    -        /// 
    -        /// 
    -        /// Must verify ConfigureHandler signature.
    -        /// 
    -        /// 
    -        /// The reconfigured sqlMap.
    -        /// 
    -        protected static void Configure(object obj)
    -        {
    -            sqlMap = null;//(SqlMapper) obj;
    -        }
    -
    -        /// 
    -        /// Run a sql batch for the datasource.
    -        /// 
    -        /// The datasource.
    -        /// The sql batch
    -        protected static void InitScript(IDataSource datasource, string script)
    -        {
    -            InitScript(datasource, script, true);
    -        }
    -
    -        /// 
    -        /// Run a sql batch for the datasource.
    -        /// 
    -        /// The datasource.
    -        /// The sql batch
    -        /// parse out the statements in the sql script file.
    -        protected static void InitScript(IDataSource datasource, string script, bool doParse)
    -        {
    -            ScriptRunner runner = new ScriptRunner();
    -
    -            runner.RunScript(datasource, script, doParse);
    -        }
    -
    -        /// 
    -        /// Create a new account with id = 6
    -        /// 
    -        /// An account
    -        protected Account NewAccount6()
    -        {
    -            Account account = new Account();
    -            account.Id = 6;
    -            account.FirstName = "Calamity";
    -            account.LastName = "Jane";
    -            account.EmailAddress = "no_email@provided.com";
    -            return account;
    -        }
    -
    -        /// 
    -        /// Verify that the input account is equal to the account(id=1).
    -        /// 
    -        /// An account object
    -        protected void AssertGilles(Account account)
    -        {
    -            Assert.AreEqual(5, account.Id, "account.Id");
    -            Assert.AreEqual("Gilles", account.FirstName, "account.FirstName");
    -            Assert.AreEqual("Bayon", account.LastName, "account.LastName");
    -            Assert.AreEqual("gilles.bayon@nospam.org", account.EmailAddress, "account.EmailAddress");
    -        }
    -
    -        /// 
    -        /// Verify that the input account is equal to the account(id=1).
    -        /// 
    -        /// An account object
    -        protected void AssertAccount1(Account account)
    -        {
    -            Assert.AreEqual(1, account.Id, "account.Id");
    -            Assert.AreEqual("Joe", account.FirstName, "account.FirstName");
    -            Assert.AreEqual("Dalton", account.LastName, "account.LastName");
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", account.EmailAddress, "account.EmailAddress");
    -        }
    -
    -        /// 
    -        /// Verify that the input account is equal to the account(id=1).
    -        /// 
    -        /// An account as hashtable
    -        protected void AssertAccount1AsHashtable(Hashtable account)
    -        {
    -            Assert.AreEqual(1, (int)account["Id"], "account.Id");
    -            Assert.AreEqual("Joe", (string)account["FirstName"], "account.FirstName");
    -            Assert.AreEqual("Dalton", (string)account["LastName"], "account.LastName");
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", (string)account["EmailAddress"], "account.EmailAddress");
    -        }
    -
    -        /// 
    -        /// Verify that the input account is equal to the account(id=1).
    -        /// 
    -        /// An account as hashtable
    -        protected void AssertAccount1AsHashtableForResultClass(Hashtable account)
    -        {
    -            Assert.AreEqual(1, (int)account[BaseTest.ConvertKey("Id")], "account.Id");
    -            Assert.AreEqual("Joe", (string)account[BaseTest.ConvertKey("FirstName")], "account.FirstName");
    -            Assert.AreEqual("Dalton", (string)account[BaseTest.ConvertKey("LastName")], "account.LastName");
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", (string)account[BaseTest.ConvertKey("EmailAddress")], "account.EmailAddress");
    -        }
    -
    -        /// 
    -        /// Verify that the input account is equal to the account(id=6).
    -        /// 
    -        /// An account object
    -        protected void AssertAccount6(Account account)
    -        {
    -            Assert.AreEqual(6, account.Id, "account.Id");
    -            Assert.AreEqual("Calamity", account.FirstName, "account.FirstName");
    -            Assert.AreEqual("Jane", account.LastName, "account.LastName");
    -            Assert.IsNull(account.EmailAddress, "account.EmailAddress");
    -        }
    -
    -        /// 
    -        /// Verify that the input order is equal to the order(id=1).
    -        /// 
    -        /// An order object.
    -        protected void AssertOrder1(Order order)
    -        {
    -            DateTime date = new DateTime(2003, 2, 15, 8, 15, 00);
    -
    -            Assert.AreEqual(1, order.Id, "order.Id");
    -            Assert.AreEqual(date.ToString(), order.Date.ToString(), "order.Date");
    -            Assert.AreEqual("VISA", order.CardType, "order.CardType");
    -            Assert.AreEqual("999999999999", order.CardNumber, "order.CardNumber");
    -            Assert.AreEqual("05/03", order.CardExpiry, "order.CardExpiry");
    -            Assert.AreEqual("11 This Street", order.Street, "order.Street");
    -            Assert.AreEqual("Victoria", order.City, "order.City");
    -            Assert.AreEqual("BC", order.Province, "order.Id");
    -            Assert.AreEqual("C4B 4F4", order.PostalCode, "order.PostalCode");
    -        }
    -
    -        /// 
    -        /// Verify that the input order is equal to the order(id=1).
    -        /// 
    -        /// An order as hashtable.
    -        protected void AssertOrder1AsHashtable(Hashtable order)
    -        {
    -            DateTime date = new DateTime(2003, 2, 15, 8, 15, 00);
    -
    -            Assert.AreEqual(1, (int)order["Id"], "order.Id");
    -            Assert.AreEqual(date.ToString(), ((DateTime)order["Date"]).ToString(), "order.Date");
    -            Assert.AreEqual("VISA", (string)order["CardType"], "order.CardType");
    -            Assert.AreEqual("999999999999", (string)order["CardNumber"], "order.CardNumber");
    -            Assert.AreEqual("05/03", (string)order["CardExpiry"], "order.CardExpiry");
    -            Assert.AreEqual("11 This Street", (string)order["Street"], "order.Street");
    -            Assert.AreEqual("Victoria", (string)order["City"], "order.City");
    -            Assert.AreEqual("BC", (string)order["Province"], "order.Id");
    -            Assert.AreEqual("C4B 4F4", (string)order["PostalCode"], "order.PostalCode");
    -        }
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs
    deleted file mode 100644
    index 1b7d11b..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/CacheModelTest.cs
    +++ /dev/null
    @@ -1,106 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Collections.Specialized;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper.Configuration.Cache;
    -using IBatisNet.DataMapper.Configuration.Cache.Lru;
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.CacheController
    -{
    -	/// 
    -	/// Summary description for CacheKeyTest.
    -	/// 
    -	[TestFixture]
    -	public class CacheModelTest
    -	{
    -		[Test]
    -		/// 
    -		/// Returns reference to same instance of cached object
    -		/// 
    -		public void TestReturnInstanceOfCachedOject()
    -		{
    -			ICacheController cacheController = new LruCacheController();
    -			IDictionary props = new HybridDictionary();
    -			props.Add("CacheSize", "1");
    -			cacheController.Configure(props);
    -
    -			FlushInterval interval = new FlushInterval();
    -			interval.Hours = 1;
    -			interval.Initialize();
    -
    -			CacheModel cacheModel = new CacheModel();
    -			cacheModel.FlushInterval = interval;
    -			cacheModel.CacheController = cacheController;
    -			cacheModel.IsReadOnly = true;
    -			cacheModel.IsSerializable = false;
    -
    -			Order order = new Order(); 
    -			order.CardNumber = "CardNumber";
    -			order.Date = DateTime.Now;
    -            order.LineItemsCollection = new LineItemCollection();
    -			LineItem item = new LineItem();
    -			item.Code = "Code1";
    -            order.LineItemsCollection.Add(item);
    -			item = new LineItem();
    -			item.Code = "Code2";
    -            order.LineItemsCollection.Add(item);
    -
    -			CacheKey key = new CacheKey();
    -			key.Update(order);
    -
    -			int firstId = HashCodeProvider.GetIdentityHashCode(order);
    -			cacheModel[ key ] = order;
    -
    -			Order order2 = cacheModel[ key ] as Order;
    -			int secondId = HashCodeProvider.GetIdentityHashCode(order2);
    -			Assert.AreEqual(firstId, secondId, "hasCode different");
    -		}
    -
    -		[Test]
    -		/// 
    -		/// Returns copy of cached object
    -		/// 
    -		public void TestReturnCopyOfCachedOject()
    -		{
    -			ICacheController cacheController = new LruCacheController();
    -			IDictionary props = new HybridDictionary();
    -			props.Add("CacheSize", "1");
    -			cacheController.Configure(props);
    -
    -			FlushInterval interval = new FlushInterval();
    -			interval.Hours = 1;
    -			interval.Initialize();
    -
    -			CacheModel cacheModel = new CacheModel();
    -			cacheModel.FlushInterval = interval;
    -			cacheModel.CacheController = cacheController;
    -			cacheModel.IsReadOnly = false;
    -			cacheModel.IsSerializable = true;
    -
    -			Order order = new Order(); 
    -			order.CardNumber = "CardNumber";
    -			order.Date = DateTime.Now;
    -            order.LineItemsCollection = new LineItemCollection();
    -			LineItem item = new LineItem();
    -			item.Code = "Code1";
    -            order.LineItemsCollection.Add(item);
    -			item = new LineItem();
    -			item.Code = "Code2";
    -            order.LineItemsCollection.Add(item);
    -
    -			CacheKey key = new CacheKey();
    -			key.Update(order);
    -
    -			int firstId = HashCodeProvider.GetIdentityHashCode(order);
    -			cacheModel[ key ] = order;
    -
    -			Order order2 = cacheModel[ key ] as Order;
    -			int secondId = HashCodeProvider.GetIdentityHashCode(order2);
    -			Assert.AreNotEqual(firstId, secondId, "hasCode equal");
    -
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/FifoCacheControllerTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/FifoCacheControllerTest.cs
    deleted file mode 100644
    index 88e374e..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/FifoCacheControllerTest.cs
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -using IBatisNet.DataMapper.Configuration.Cache;
    -using IBatisNet.DataMapper.Configuration.Cache.Fifo;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.CacheController
    -{
    -	/// 
    -	/// Description rsume de FifoCacheControllerTest.
    -	/// 
    -	[TestFixture]
    -	public class FifoCacheControllerTest : LruCacheControllerTest
    -	{
    -
    -		protected override ICacheController GetController() 
    -		{
    -			return new FifoCacheController();
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/LruCacheControllerTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/LruCacheControllerTest.cs
    deleted file mode 100644
    index 0fe6722..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/LruCacheControllerTest.cs
    +++ /dev/null
    @@ -1,89 +0,0 @@
    -using System.Collections;
    -using System.Collections.Specialized;
    -using IBatisNet.DataMapper.Configuration.Cache;
    -using IBatisNet.DataMapper.Configuration.Cache.Lru;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.CacheController
    -{
    -	/// 
    -	/// Description rsume de LruCacheControllerTest.
    -	/// 
    -	[TestFixture]
    -	public class LruCacheControllerTest
    -	{
    -		protected virtual ICacheController GetController() 
    -		{
    -			return new LruCacheController();
    -		}
    -
    -		[Test]
    -		public virtual void TestSizeOne() 
    -		{
    -			ICacheController cc = GetController();
    -			IDictionary props = new HybridDictionary();
    -			props.Add("CacheSize", "1");
    -			cc.Configure(props);
    -
    -			string testKey = "testKey";
    -			string testVal = "testVal";
    -			cc[testKey] = testVal;
    -			Assert.AreEqual(testVal, cc[testKey] );
    -			
    -			string testKey2 = "testKey2";
    -			string testVal2 = "testVal2";
    -			cc[testKey2] = testVal2;
    -			Assert.AreEqual(testVal2, cc[testKey2]);
    -
    -			Assert.IsNull(cc[testKey]);
    -		}
    -
    -		[Test]
    -		public void TestGetAndPutObject() 
    -		{
    -			ICacheController cc = GetController();
    -			string testKey = "testKey";
    -			string testVal = "testVal";
    -
    -			Assert.AreEqual(cc[testKey], null);
    -
    -			cc[testKey] = testVal;
    -			Assert.AreEqual(cc[testKey], testVal);
    -
    -			cc[testKey] = null;
    -			Assert.AreEqual(cc[testKey], null);
    -		}
    -
    -		[Test]
    -		public void TestRemoveObject() 
    -		{
    -			ICacheController cc = GetController();
    -			string testKey = "testKey";
    -			string testVal = "testVal";
    -
    -			Assert.AreEqual(cc[testKey], null);
    -
    -			cc[testKey] = testVal;
    -			Assert.AreEqual(cc[testKey], testVal);
    -
    -			cc.Remove(testKey);
    -			Assert.AreEqual(cc[testKey], null);
    -		}
    -
    -		[Test]
    -		public void TestFlush() 
    -		{
    -			ICacheController cc = GetController();
    -			string testKey = "testKey";
    -			string testVal = "testVal";
    -
    -			Assert.AreEqual(cc[testKey], null);
    -
    -			cc[testKey] = testVal;
    -			Assert.AreEqual(cc[testKey], testVal);
    -
    -			cc.Flush();
    -			Assert.AreEqual(cc[testKey], null);
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/MemoryCacheControllerTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/MemoryCacheControllerTest.cs
    deleted file mode 100644
    index 0e0ba7a..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheController/MemoryCacheControllerTest.cs
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -using IBatisNet.DataMapper.Configuration.Cache;
    -using IBatisNet.DataMapper.Configuration.Cache.Memory;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.CacheController
    -{
    -	/// 
    -	/// Description rsume de MemoryCacheControllerTest.
    -	/// 
    -	[TestFixture]
    -	public class MemoryCacheControllerTest: LruCacheControllerTest
    -	{
    -
    -		protected override ICacheController GetController() 
    -		{
    -			return new MemoryCacheControler();
    -		}
    -
    -		[Test]
    -		public override void TestSizeOne() 
    -		{
    -			// This is not relevant for this model
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs
    deleted file mode 100644
    index a0300c9..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheKeyTest.cs
    +++ /dev/null
    @@ -1,86 +0,0 @@
    -
    -
    -using IBatisNet.DataMapper.Configuration.Cache;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for CacheKeyTest.
    -	/// 
    -	[TestFixture]
    -	public class CacheKeyTest
    -	{
    -		[Test]
    -		public void ShouldNotConsider1LAndNegative9223372034707292159LToBeEqual()
    -		{
    -			// old version of ObjectProbe gave TestClass based on these longs the same HashCode
    -			DoTestClassEquals(1L, -9223372034707292159L);
    -		}
    -
    -		[Test]
    -		public void ShouldNotConsider1LAndNegative9223372036524971138LToBeEqual()
    -		{
    -			// current version of ObjectProbe gives TestClass based on these longs the same HashCode
    -			DoTestClassEquals(1L, -9223372036524971138L);
    -		}
    -
    -		private static void DoTestClassEquals(long firstLong, long secondLong)
    -		{
    -			// Two cache keys are equal except for the parameter.
    -			CacheKey key = new CacheKey();
    -
    -			key.Update(firstLong);
    -
    -			CacheKey aDifferentKey = new CacheKey();
    -
    -			key.Update(secondLong);
    -
    -			Assert.IsFalse(aDifferentKey.Equals(key)); // should not be equal.
    -		}
    -
    -		[Test]
    -		public void CacheKeyWithSameHashcode() 
    -		{
    -			CacheKey key1 = new CacheKey();
    -			CacheKey key2 = new CacheKey();
    -
    -			key1.Update("HS1CS001");
    -			key2.Update("HS1D4001");
    -        /*
    -         The string hash algorithm is not an industry standard and is not guaranteed to produce the same behaviour between versions. 
    -         And in fact it does not. The .NET 2.0 CLR uses a different algorithm for string hashing than the .NET 1.1 CLR. 
    -        */
    -
    -#if dotnet2
    -            Assert.Ignore("The .NET 2.0 CLR uses a different algorithm for string hashing than the .NET 1.1 CLR.");
    -#else
    -			Assert.AreEqual( key1.GetHashCode(), key2.GetHashCode(), "Expect same hashcode.");
    -			Assert.IsFalse( key1.Equals(key2),"Expect not equal");
    -#endif
    -        }
    -
    -		[Test]
    -       
    -
    -		public void CacheKeyWithTwoParamsSameHashcode() 
    -		{
    -			CacheKey key1 = new CacheKey();
    -			CacheKey key2 = new CacheKey();
    -
    -			key1.Update("HS1CS001");
    -			key1.Update("HS1D4001");
    -
    -			key2.Update("HS1D4001");
    -			key2.Update("HS1CS001");
    -
    -#if dotnet2
    -            Assert.Ignore("The .NET 2.0 CLR uses a different algorithm for string hashing than the .NET 1.1 CLR.");
    -#else
    -			Assert.AreEqual(key1.GetHashCode(), key2.GetHashCode(), "Expect same hashcode.");
    -			Assert.IsFalse(key1.Equals(key2), "Expect not equal");
    -#endif
    -        }
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs
    deleted file mode 100644
    index bf9983c..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/CacheTest.cs
    +++ /dev/null
    @@ -1,552 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -using System.IO;
    -using System.Threading;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper.Configuration.Cache;
    -using IBatisNet.DataMapper.MappedStatements;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for ParameterMapTest.
    -	/// 
    -	[TestFixture] 
    -	public class CacheTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void SetUp() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false);    
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void TearDown()
    -		{
    -		    string path = ScriptDirectory + "teardown.sql";
    -            // does a teardown exist?
    -            if ((!File.Exists(path)) || (new FileInfo(path).Length == 0))
    -            {
    -                return;
    -            }
    -            InitScript(sqlMap.DataSource, path);
    -        } 
    -
    -		#endregion
    -
    -		#region Test cache
    -
    -        [Test]
    -        public void LRU_cache_should_work()
    -        {
    -            IList list = sqlMap.QueryForList("GetLruCachedAccountsViaResultMap", null);
    -
    -            int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -            list = sqlMap.QueryForList("GetLruCachedAccountsViaResultMap", null);
    -
    -            int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -            Assert.AreEqual(firstId, secondId);
    -
    -            list = sqlMap.QueryForList("GetLruCachedAccountsViaResultMap", null);
    -
    -            int thirdId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -            Assert.AreEqual(firstId, thirdId);
    -        }
    -
    -		/// 
    -		/// Test for JIRA 29
    -		/// 
    -		[Test] 
    -		public void TestJIRA28()
    -		{
    -			Account account = sqlMap.QueryForObject("GetNoAccountWithCache",-99) as Account;
    -
    -			Assert.IsNull(account);
    -		}
    -
    -        /// 
    -        /// Cache error with QueryForObject
    -        /// 
    -        [Test]
    -        public void TestJIRA242WithNoCache()
    -        {
    -            Account account = sqlMap.QueryForObject("GetNoAccountWithCache", -99);
    -            account = sqlMap.QueryForObject("GetNoAccountWithCache", -99);
    -
    -            Assert.IsNull(account);
    -        }
    -
    -        /// 
    -        /// Cache error with QueryForObject with object in cache
    -        /// 
    -        [Test]
    -        public void TestJIRA242WithCache()
    -        {
    -            Account account1 = sqlMap.QueryForObject("GetNoAccountWithCache", 1);
    -            AssertAccount1(account1);
    -            int firstId = HashCodeProvider.GetIdentityHashCode(account1);
    -
    -            Account account2 = sqlMap.QueryForObject("GetNoAccountWithCache", 1);
    -            AssertAccount1(account2);
    -
    -            int secondId = HashCodeProvider.GetIdentityHashCode(account2);
    -
    -            Assert.AreEqual(firstId, secondId);
    -        }
    -
    -        /// 
    -        /// Cache error with QueryForObjectwith object in cache
    -        /// 
    -        [Test]
    -        public void TestJIRA242_WithoutGeneric_WithCache()
    -        {
    -            Account account1 = sqlMap.QueryForObject("GetNoAccountWithCache", 1) as Account;
    -            AssertAccount1(account1);
    -            int firstId = HashCodeProvider.GetIdentityHashCode(account1);
    -
    -            Account account2 = sqlMap.QueryForObject("GetNoAccountWithCache", 1) as Account;
    -            AssertAccount1(account2);
    -
    -            int secondId = HashCodeProvider.GetIdentityHashCode(account2);
    -
    -            Assert.AreEqual(firstId, secondId);
    -        }
    -
    -	    /// 
    -		/// Test Cache query
    -		/// 
    -		/// 
    -		/// Used trace to see that the second query don't open an new connection
    -		/// 
    -        [Test]
    -        public void TestJIRA104()
    -		{
    -		    IList list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -		    int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -		    list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -		    int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -		    Assert.AreEqual(firstId, secondId);
    -		}
    -	    
    -		/// 
    -		/// Test Cache query
    -		/// 
    -		[Test] 
    -		public void TestQueryWithCache() 
    -		{
    -			IList list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -			list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			//Console.WriteLine(sqlMap.GetDataCacheStats());
    -
    -			int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -			Assert.AreEqual(firstId, secondId);
    -
    -			Account account = (Account) list[1];
    -			account.EmailAddress  = "somebody@cache.com";
    -			sqlMap.Update("UpdateAccountViaInlineParameters", account);
    -
    -			list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			int thirdId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -			Assert.IsTrue(firstId != thirdId);
    -
    -			//Console.WriteLine(sqlMap.GetDataCacheStats());
    -		}
    -
    -
    -		/// 
    -		/// Test flush Cache
    -		/// 
    -		[Test] 
    -		public void TestFlushDataCache() 
    -		{
    -			IList list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -			list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -			Assert.AreEqual(firstId, secondId);
    -
    -			sqlMap.FlushCaches();
    -
    -			list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			int thirdId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -            Assert.AreNotEqual(firstId, thirdId);
    -		}
    -
    -		[Test]
    -		public void TestFlushDataCacheOnExecute()
    -		{
    -			IList list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -			int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -			
    -		    list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -			int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -			Assert.AreEqual(firstId, secondId);
    -		    
    -			sqlMap.Update("UpdateAccountViaInlineParameters", list[0]);
    -			list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -			int thirdId = HashCodeProvider.GetIdentityHashCode(list);
    -            Assert.AreNotEqual(firstId ,thirdId);
    -		}
    -
    -		/// 
    -		/// Test MappedStatement Query With Threaded Cache
    -		/// 
    -		[Test]
    -		public void TestMappedStatementQueryWithThreadedCache() 
    -		{
    -			Hashtable results = new Hashtable();
    -
    -			TestCacheThread.StartThread(sqlMap, results, "GetCachedAccountsViaResultMap");
    -			int firstId = (int) results["id"];
    -
    -			TestCacheThread.StartThread(sqlMap, results, "GetCachedAccountsViaResultMap");
    -			int secondId = (int) results["id"];
    -
    -			Assert.AreEqual(firstId, secondId);
    -
    -			IList list = (IList) results["list"];
    -
    -			Account account = (Account) list[1];
    -			account.EmailAddress = "new.toto@somewhere.com";
    -			sqlMap.Update("UpdateAccountViaInlineParameters", account);
    -
    -			list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			int thirdId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -            Assert.AreNotEqual(firstId , thirdId);
    -		}
    -
    -		/// 
    -		/// Test MappedStatement Query With Threaded Read Write Cache
    -		/// 
    -		[Test]
    -		public void TestMappedStatementQueryWithThreadedReadWriteCache()
    -		{
    -			Hashtable results = new Hashtable();
    -
    -			TestCacheThread.StartThread(sqlMap, results, "GetRWCachedAccountsViaResultMap");
    -			int firstId = (int) results["id"];
    -
    -			TestCacheThread.StartThread(sqlMap, results, "GetRWCachedAccountsViaResultMap");
    -			int secondId = (int) results["id"];
    -
    -			Assert.AreNotEqual(firstId, secondId);
    -
    -			IList list = (IList) results["list"];
    -
    -			Account account = (Account) list[1];
    -			account.EmailAddress = "new.toto@somewhere.com";
    -			sqlMap.Update("UpdateAccountViaInlineParameters", account);
    -
    -			list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -
    -			int thirdId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -			Assert.AreNotEqual(firstId, thirdId);
    -		}
    -
    -        /// 
    -        /// Test MappedStatement Query With Threaded Read Write Cache
    -        /// Verifies that calls to the same query from different threads (and thus different
    -        /// sessions) do not return the same (cached) object.
    -        /// 
    -        [Test]
    -        public void TestMappedStatementQueryWithThreadedReadWriteNonSerializableCache()
    -        {
    -            Hashtable results = new Hashtable();
    -
    -            // run a SELECT query from two different threads.  TestCacheThread.StartThread joins the 
    -            // new thread to the current, so test execution does not continue until the new thread completes
    -            TestCacheThread.StartThread(sqlMap, results, "GetRWNSCachedAccountsViaResultMap");
    -            int firstId = (int)results["id"];
    -
    -            TestCacheThread.StartThread(sqlMap, results, "GetRWNSCachedAccountsViaResultMap");
    -            int secondId = (int)results["id"];
    -
    -            Assert.AreNotEqual(firstId, secondId);
    -
    -            IList list = (IList)results["list"];
    -
    -            Account account = (Account)list[1];
    -            account.EmailAddress = "new.toto@somewhere.com";
    -            sqlMap.Update("UpdateAccountViaInlineParameters", account);
    -
    -            list = sqlMap.QueryForList("GetRWNSCachedAccountsViaResultMap", null);
    -
    -            int thirdId = HashCodeProvider.GetIdentityHashCode(list);
    -            Assert.AreNotEqual(firstId, thirdId);
    -        }
    -
    -        /// 
    -        /// Test MappedStatement Query With Threaded Read Write Cache with a session.
    -        /// Verify that per-session caching (i.e. read/write, non-serializable) works within a given session.
    -        /// Nonserializable read/write caches determine the cache keys somewhat differently than
    -        /// serializable read/write caches, so separate tests are necessary for both
    -        /// 
    -        [Test]
    -        public void TestMappedStatementQueryWithReadWriteCacheWithSession()
    -        {
    -            IMappedStatement statement = sqlMap.GetMappedStatement("GetRWNSCachedAccountsViaResultMap");
    -            ISqlMapSession session = new SqlMapSession(sqlMap);
    -            session.OpenConnection();
    -
    -            int firstId = 0;
    -            int secondId = 0;
    -
    -            try
    -            {
    -                // execute the statement twice; the second call should result in a cache hit
    -                IList list = statement.ExecuteQueryForList(session, null);
    -                firstId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -                list = statement.ExecuteQueryForList(session, null);
    -                secondId = HashCodeProvider.GetIdentityHashCode(list);
    -            }
    -            finally
    -            {
    -                session.CloseConnection();
    -            }
    -
    -            Assert.AreEqual(firstId, secondId);
    -
    -        }
    -
    -        /// 
    -        /// Tests MappedStatement Query With Threaded Read/Write Non-Serializable Cache without a session.
    -        /// Per-session caching (i.e. read/write, non-serializable) doesn't work without a session, so
    -        /// caching will appear to fail (it actually does the caching but generates a new cache key for
    -        /// each request since the requests do not share a common session).  
    -        /// 
    -        [Test]
    -        public void TestMappedStatementQueryWithReadWriteCacheWithoutSession()
    -        {
    -            // ensure there is no session
    -            Assert.IsFalse(sqlMap.IsSessionStarted);
    -
    -            // run a SELECT query twice and check that the second call returns a different value than the first 
    -            IList list = sqlMap.QueryForList("GetRWNSCachedAccountsViaResultMap", null);
    -            int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -            list = sqlMap.QueryForList("GetRWNSCachedAccountsViaResultMap", null);
    -            int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -            // without a common session, the previous two calls should return different objects
    -            Assert.AreNotEqual(firstId, secondId);
    -
    -            // ensure there is still no session in case something else caused it to start
    -            Assert.IsFalse(sqlMap.IsSessionStarted);
    -        }
    -		/// 
    -		/// Test Cache Null Object
    -		/// 
    -		[Test]
    -		public void TestCacheNullObject()
    -		{
    -			CacheModel cache = GetCacheModel();
    -			CacheKey key = new CacheKey();
    -			key.Update("testKey");
    -
    -			cache[key] = null;
    -
    -			object returnedObject = cache[key];
    -			Assert.AreEqual(CacheModel.NULL_OBJECT, returnedObject);
    -			Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(CacheModel.NULL_OBJECT), HashCodeProvider.GetIdentityHashCode(returnedObject));
    -			Assert.AreEqual(1, cache.HitRatio);
    -		}
    -
    -
    -		/// 
    -		/// Test CacheHit
    -		/// 
    -		[Test]
    -		public void TestCacheHit() 
    -		{
    -			CacheModel cache = GetCacheModel();
    -			CacheKey key = new CacheKey();
    -			key.Update("testKey");
    -
    -			string value = "testValue";
    -			cache[key] = value;
    -
    -			object returnedObject = cache[key];
    -			Assert.AreEqual(value, returnedObject);
    -			Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(value), HashCodeProvider.GetIdentityHashCode(returnedObject));
    -			Assert.AreEqual(1, cache.HitRatio);
    -		}
    -
    -		/// 
    -		/// Test CacheMiss
    -		/// 
    -		[Test]
    -		public void TestCacheMiss() 
    -		{
    -			CacheModel cache = GetCacheModel();
    -			CacheKey key = new CacheKey();
    -			key.Update("testKey");
    -
    -			string value = "testValue";
    -			cache[key] = value;
    -
    -			CacheKey wrongKey = new CacheKey();
    -			wrongKey.Update("wrongKey");
    -
    -			object returnedObject = cache[wrongKey];
    -			Assert.IsTrue(!value.Equals(returnedObject));
    -			Assert.IsNull(returnedObject) ;
    -			Assert.AreEqual(0, cache.HitRatio);
    -		}
    -		
    -		/// 
    -		/// Test CacheHitMiss
    -		/// 
    -		[Test]
    -		public void TestCacheHitMiss() 
    -		{
    -			CacheModel cache = GetCacheModel();
    -			CacheKey key = new CacheKey();
    -			key.Update("testKey");
    -
    -			string value = "testValue";
    -			cache[key] = value;
    -
    -			object returnedObject = cache[key];
    -			Assert.AreEqual(value, returnedObject);
    -			Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(value), HashCodeProvider.GetIdentityHashCode(returnedObject));
    -
    -			CacheKey wrongKey = new CacheKey();
    -			wrongKey.Update("wrongKey");
    -
    -			returnedObject = cache[wrongKey];
    -			Assert.IsTrue(!value.Equals(returnedObject));
    -			Assert.IsNull(returnedObject) ;
    -			Assert.AreEqual(0.5, cache.HitRatio);
    -		}
    -
    -
    -		/// 
    -		/// Test Duplicate Add to Cache
    -		/// 
    -		/// IBATISNET-134
    -		[Test]
    -		public void TestDuplicateAddCache() 
    -		{
    -			CacheModel cache = GetCacheModel();
    -			CacheKey key = new CacheKey();
    -			key.Update("testKey");
    -			string value = "testValue";
    -
    -			object obj = null;
    -			obj = cache[key];
    -			Assert.IsNull(obj);
    -			obj = cache[key];
    -			Assert.IsNull(obj);
    -
    -			cache[key] = value;
    -			cache[key] = value;
    -
    -			object returnedObject = cache[key];
    -			Assert.AreEqual(value, returnedObject);
    -			Assert.AreEqual(HashCodeProvider.GetIdentityHashCode(value), HashCodeProvider.GetIdentityHashCode(returnedObject));
    -		}
    -
    -		private CacheModel GetCacheModel() 
    -		{
    -			CacheModel cache = new CacheModel();
    -			cache.FlushInterval = new FlushInterval();
    -			cache.FlushInterval.Minutes = 5;
    -			cache.Implementation = "IBatisNet.DataMapper.Configuration.Cache.Lru.LruCacheController, IBatisNet.DataMapper";
    -			cache.Initialize();
    -
    -			return cache;
    -		}
    -
    -		#endregion
    -
    -
    -		private class TestCacheThread
    -		{
    -			private ISqlMapper _sqlMap = null;
    -			private Hashtable _results = null;
    -			private string _statementName = string.Empty;
    -
    -			public TestCacheThread(ISqlMapper sqlMap, Hashtable results, string statementName) 
    -			{
    -				_sqlMap = sqlMap;
    -				_results = results;
    -				_statementName = statementName;
    -			}
    -
    -			public void Run() 
    -			{
    -				try 
    -				{
    -					IMappedStatement statement = _sqlMap.GetMappedStatement( _statementName );
    -                    ISqlMapSession session = new SqlMapSession(sqlMap);
    -					session.OpenConnection();
    -					IList list = statement.ExecuteQueryForList(session, null);
    -
    -					//int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -					list = statement.ExecuteQueryForList(session, null);
    -					int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -
    -					_results["id"] = secondId ;
    -					_results["list"] = list;
    -					session.CloseConnection();
    -				} 
    -				catch (Exception e) 
    -				{
    -					throw e;
    -				}
    -			}
    -
    -			public static void StartThread(ISqlMapper sqlMap, Hashtable results, string statementName) 
    -			{
    -				TestCacheThread tct = new TestCacheThread(sqlMap, results, statementName);
    -				Thread thread = new Thread( new ThreadStart(tct.Run) );
    -				thread.Start();
    -				try 
    -				{
    -					thread.Join();
    -				} 
    -				catch (Exception e) 
    -				{
    -					throw e;
    -				}
    -			}
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ComplexTypeTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ComplexTypeTest.cs
    deleted file mode 100644
    index d6ab7f5..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ComplexTypeTest.cs
    +++ /dev/null
    @@ -1,81 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -using System.Configuration;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for ComplexTypeTest.
    -	/// 
    -	[TestFixture] 
    -	public class ComplexTypeTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Complex type tests
    -
    -		/// 
    -		/// Complex type test
    -		/// 
    -		[Test] 
    -		public void TestMapObjMap() 
    -		{
    -			Hashtable map = new Hashtable();
    -			Complex obj = new Complex();
    -			obj.Map = new Hashtable();
    -			obj.Map.Add("Id", 1);
    -			map.Add("obj", obj);
    -		    
    -			int id = (int)sqlMap.QueryForObject("ComplexMap", map);
    -
    -			Assert.AreEqual(id, obj.Map["Id"]);
    -		}
    -
    -		/// 
    -		/// Complex type insert inline default null test
    -		/// 
    -		[Test] 
    -		public void TestInsertMapObjMapAcctInlineDefaultNull() 
    -		{
    -			Hashtable map = new Hashtable();
    -			Account acct = NewAccount6();
    -			Complex obj = new Complex();
    -			obj.Map = new Hashtable();
    -			obj.Map.Add("acct", acct);
    -			map.Add("obj", obj);
    -
    -			sqlMap.Insert("InsertComplexAccountViaInlineDefaultNull", map);
    -
    -			Account account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 6);
    -
    -			AssertAccount6(account);
    -		}
    -
    -		#endregion
    -
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs
    deleted file mode 100644
    index 14766fe..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConfigureTest.cs
    +++ /dev/null
    @@ -1,499 +0,0 @@
    -using System;
    -using System.Configuration;
    -using System.IO;
    -using System.Reflection;
    -using System.Threading;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper; // SqlMap API
    -using IBatisNet.DataMapper.Configuration;
    -using IBatisNet.DataMapper.SessionStore;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -using System.Collections.Specialized;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Description rsume de ConfigureTest.
    -	/// 
    -	[TestFixture] 
    -	public class ConfigureTest : BaseTest 
    -	{
    -		private string _fileName = string.Empty;
    -
    -		#region SetUp
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -#if dotnet2
    -            _fileName = "sqlmap" + "_" + ConfigurationManager.AppSettings["database"] + "_" + ConfigurationManager.AppSettings["providerType"] + ".config";
    -#else
    -			_fileName = "sqlmap" + "_" + ConfigurationSettings.AppSettings["database"] + "_" + ConfigurationSettings.AppSettings["providerType"] + ".config";		
    -#endif
    -
    -        }
    -		#endregion 
    -	    
    -	    /// 
    -        /// Test HybridWebThreadSessionStore
    -        /// 
    -        [Test]
    -        public void HybridWebThreadSessionStoreTest()
    -	    {
    -            sqlMap.SessionStore = new HybridWebThreadSessionStore(sqlMap.Id);
    -	        
    -            Account account = sqlMap.QueryForObject("SelectWithProperty", null) as Account;
    -            AssertAccount1(account);
    -	    }
    -	    
    -
    -		#region Relatives Path tests
    -
    -		/// 
    -		/// Test Configure via relative path
    -		/// 
    -		[Test] 
    -		public void TestConfigureRelativePath()
    -		{
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(_fileName);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test ConfigureAndWatch via relative path
    -		/// 
    -		[Test] 
    -		public void TestConfigureAndWatchRelativePath()
    -		{
    -			ConfigureHandler handler = new ConfigureHandler(Configure);
    -
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via relative path
    -		/// 
    -		[Test] 
    -		public void TestConfigureRelativePathViaBuilder()
    -		{
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(_fileName);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test ConfigureAndWatch via relative path
    -		/// 
    -		[Test] 
    -		public void TestConfigureAndWatchRelativePathViaBuilder()
    -		{
    -			ConfigureHandler handler = new ConfigureHandler(Configure);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -		#endregion 
    -
    -		#region Absolute Paths
    -
    -		/// 
    -		/// Test Configure via absolute path
    -		/// 
    -		[Test] 
    -		public void TestConfigureAbsolutePath()
    -		{
    -			_fileName = Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(_fileName);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path
    -		/// 
    -		[Test] 
    -		public void TestConfigureAbsolutePathViaBuilder()
    -		{
    -			_fileName = Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(_fileName);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path with file suffix
    -		/// 
    -		[Test] 
    -		public void TestConfigureAbsolutePathWithFileSuffix()
    -		{
    -			_fileName = "file://"+Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(_fileName);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path with file suffix
    -		/// 
    -		[Test] 
    -		public void TestConfigureAbsolutePathWithFileSuffixViaBuilder()
    -		{
    -			_fileName = "file://"+Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(_fileName);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path via FileIfno
    -		/// 
    -		[Test] 
    -		public void TestConfigureAbsolutePathViaFileInfo()
    -		{
    -			_fileName = Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -			FileInfo fileInfo = new FileInfo(_fileName);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(fileInfo);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path via Uri
    -		/// 
    -		[Test] 
    -		public void TestConfigureAbsolutePathViaUri()
    -		{
    -			_fileName = Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -			Uri uri = new Uri(_fileName);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(uri);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path
    -		/// 
    -		[Test] 
    -		public void TestConfigureAndWatchAbsolutePath()
    -		{
    -			_fileName = Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -			ConfigureHandler handler = new ConfigureHandler(Configure);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path
    -		/// 
    -		[Test] 
    -		public void TestConfigureAndWatchAbsolutePathViaBuilder()
    -		{
    -			_fileName = Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -			ConfigureHandler handler = new ConfigureHandler(Configure);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path 
    -		/// 
    -		[Test] 
    -		public void TestConfigureAndWatchAbsolutePathWithFileSuffix()
    -		{
    -			_fileName = "file://"+Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -			ConfigureHandler handler = new ConfigureHandler(Configure);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path 
    -		/// 
    -		[Test] 
    -		public void TestConfigureAndWatchAbsolutePathWithFileSuffixViaBuilder()
    -		{
    -			_fileName = "file://"+Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -			ConfigureHandler handler = new ConfigureHandler(Configure);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -
    -		/// 
    -		/// Test Configure via absolute path via FileInfo
    -		/// 
    -		[Test] 
    -		public void TestConfigureAndWatchAbsolutePathViaFileInfo()
    -		{
    -			_fileName = Resources.BaseDirectory+Path.DirectorySeparatorChar+_fileName;
    -			FileInfo fileInfo = new FileInfo(_fileName);
    -
    -			ConfigureHandler handler = new ConfigureHandler(Configure);
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(fileInfo, handler);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -		#endregion 
    -
    -		#region Stream / Embedded 
    -
    -		/// 
    -		/// Test Configure via Stream/embedded
    -		/// 
    -		[Test] 
    -		public void TestConfigureViaStream()
    -		{
    -			// embeddedResource = "bin.Debug.SqlMap_MSSQL_SqlClient.config, IBatisNet.DataMapper.Test";
    -			
    -#if dotnet2
    -            Assembly assembly = Assembly.Load("IBatisNet.DataMapper.Test");
    -#else
    -			Assembly assembly = Assembly.LoadWithPartialName ("IBatisNet.DataMapper.Test");
    -#endif
    -			Stream stream = assembly.GetManifestResourceStream("IBatisNet.DataMapper.Test.bin.Debug.SqlMap_MSSQL_SqlClient.config");
    -
    -			DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.Configure(stream);
    -
    -			Assert.IsNotNull(mapper);
    -		}
    -		#endregion 
    -
    -
    -        private bool _hasChanged = false;
    -
    -        /// 
    -        /// ConfigurationWatcher Test
    -        /// 
    -        [Test]
    -        public void ConfigurationWatcherTestOnSqlMapConfig()
    -        {
    -            //string fileName = @"..\..\Maps\MSSQL\SqlClient\Account.xml";
    -
    -   			ConfigureHandler handler = new ConfigureHandler(MyHandler);
    -
    -            DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -            // test that the mapper was correct build
    -            Assert.IsNotNull(mapper);
    -
    -            FileInfo fi = Resources.GetFileInfo(_fileName);
    -            fi.LastWriteTime = DateTime.Now;
    -
    -            fi.Refresh();
    -
    -            // Let's give a small bit of time for the change to propagate.
    -            // The ConfigWatcherHandler class has a timer which 
    -            // waits for 500 Millis before delivering
    -            // the event notification.
    -            System.Threading.Thread.Sleep(600);
    -
    -            Assert.IsTrue(_hasChanged);
    -            
    -            _hasChanged = false;
    -            
    -        }
    -
    -        /// 
    -        /// ConfigurationWatcher Test
    -        /// 
    -        [Test]
    -        public void ConfigurationWatcherTestOnMappingFile()
    -        {
    -            string fileName = @"..\..\Maps\MSSQL\SqlClient\Account.xml";
    -
    -            ConfigureHandler handler = new ConfigureHandler(MyHandler);
    -
    -            DomSqlMapBuilder builder = new DomSqlMapBuilder();
    -
    -            NameValueCollection properties = new NameValueCollection();
    -            properties.Add("collection2Namespace", "IBatisNet.DataMapper.Test.Domain.LineItemCollection, IBatisNet.DataMapper.Test");
    -            properties.Add("nullableInt", "int");
    -
    -            builder.Properties = properties;
    -
    -            ISqlMapper mapper = builder.ConfigureAndWatch(_fileName, handler);
    -
    -            // test that the mapper was correct build
    -            Assert.IsNotNull(mapper);
    -
    -            FileInfo fi = Resources.GetFileInfo(fileName);
    -            fi.LastWriteTime = DateTime.Now;
    -
    -            fi.Refresh();
    -
    -            // Let's give a small bit of time for the change to propagate.
    -            // The ConfigWatcherHandler class has a timer which 
    -            // waits for 500 Millis before delivering
    -            // the event notification.
    -            System.Threading.Thread.Sleep(600);
    -
    -            Assert.IsTrue(_hasChanged);
    -
    -            _hasChanged = false;
    -
    -        }
    -
    -        protected void MyHandler(object obj)
    -        {
    -            _hasChanged = true;
    -        }
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs
    deleted file mode 100644
    index 38b98b9..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ConstructorTest.cs
    +++ /dev/null
    @@ -1,271 +0,0 @@
    -using System;
    -using System.Collections;
    -using IBatisNet.Common;
    -using IBatisNet.Common.Exceptions;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper.MappedStatements;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for ConstructorTest.
    -	/// 
    -	[TestFixture]
    -	public class ConstructorTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp]
    -		public void Init()
    -		{
    -			InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -			InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -			InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -			InitScript(sqlMap.DataSource, ScriptDirectory + "enumeration-init.sql");
    -			InitScript(sqlMap.DataSource, ScriptDirectory + "other-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "Nullable-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "category-init.sql");
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown]
    -		public void Dispose()
    -		{ /* ... */
    -		}
    -
    -		#endregion
    -
    -		#region Tests
    -
    -		/// 
    -		/// Test account constructor mapping
    -		/// 
    -		[Test]
    -		public void TestPrimitiveArgument()
    -		{
    -			Account account = sqlMap.QueryForObject("SelectAccountConstructor", 1) as Account;
    -			AssertAccount1(account);
    -		}
    -
    -        [Test]
    -        [Category("JIRA")]
    -        [Category("JIRA-260")]
    -        public void TestExtendsConstructor()
    -        {
    -            Account account = sqlMap.QueryForObject("JIRA260", 1) as Account;
    -            AssertAccount1(account);
    -            Assert.IsTrue(account.BannerOption );
    -            Assert.IsFalse(account.CartOption);
    -        }
    -
    -#if dotnet2
    -        /// 
    -        /// Test argument nullable constructor mapping
    -        /// 
    -        [Test]
    -        public void TestNullableArgument()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestBool = true;
    -            clazz.TestByte = 155;
    -            clazz.TestChar = 'a';
    -            DateTime? date = new DateTime?(DateTime.Now);
    -            clazz.TestDateTime = date;
    -            clazz.TestDecimal = 99.53M;
    -            clazz.TestDouble = 99.5125;
    -            Guid? guid = new Guid?(Guid.NewGuid());
    -            clazz.TestGuid = guid;
    -            clazz.TestInt16 = 45;
    -            clazz.TestInt32 = null;
    -            clazz.TestInt64 = 1234567890123456789;
    -            clazz.TestSingle = 4578.46445454112f;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullableConstructor", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsTrue(clazz.TestBool.Value);
    -            Assert.AreEqual(155, clazz.TestByte);
    -            Assert.AreEqual('a', clazz.TestChar);
    -            Assert.AreEqual(date.Value.ToString(), clazz.TestDateTime.Value.ToString());
    -            Assert.AreEqual(99.53M, clazz.TestDecimal);
    -            Assert.AreEqual(99.5125, clazz.TestDouble);
    -            Assert.AreEqual(guid, clazz.TestGuid);
    -            Assert.AreEqual(45, clazz.TestInt16);
    -            Assert.IsNull(clazz.TestInt32);
    -            Assert.AreEqual(1234567890123456789, clazz.TestInt64);
    -            Assert.AreEqual(4578.46445454112f, clazz.TestSingle);
    -        }
    -#endif
    -
    -        /// 
    -        /// Test constructor injection using a resultMapping where
    -        /// - the resultmapping object performs *only* constructor injection.
    -        /// 
    -        [Test]
    -        public void TestJIRA176()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.Empty;
    -
    -            int key = (int)sqlMap.Insert("InsertCategory", category);
    -
    -            ImmutableCategoryPropertyContainer categoryContainerFromDB = (ImmutableCategoryPropertyContainer)sqlMap.QueryForObject("GetImmutableCategoryInContainer", key);
    -            Assert.IsNotNull(categoryContainerFromDB);
    -            Assert.IsNotNull(categoryContainerFromDB.ImmutableCategory);
    -            Assert.AreEqual(category.Name, categoryContainerFromDB.ImmutableCategory.Name);
    -            Assert.AreEqual(key, categoryContainerFromDB.ImmutableCategory.Id);
    -            Assert.AreEqual(category.Guid, categoryContainerFromDB.ImmutableCategory.Guid);
    -        }
    -	    
    -		/// 
    -		/// Test constructor with resultMapping attribute on argument
    -		/// 
    -		[Test]
    -		public void TestArgumentResultMapping()
    -		{
    -			Order order = sqlMap.QueryForObject("GetOrderConstructor1",10) as Order;
    -
    -			Assert.IsNotNull(order.Account);
    -			AssertAccount1(order.Account);
    -
    -			order = sqlMap.QueryForObject("GetOrderConstructor1",11) as Order;
    -
    -			Assert.IsNull(order.Account);
    -		}
    -
    -		/// 
    -		/// Test constructor with an argument using a resultMapping where
    -		/// - the resulMap argument use another constructor
    -		/// - all second constructor arguments are null.
    -		/// 
    -		[Test]
    -		public void TestJIRA173()
    -		{
    -			Order order = sqlMap.QueryForObject("GetOrderConstructor8",11) as Order;
    -
    -			Assert.IsTrue(order.Id == 11);
    -			Assert.IsNull(order.Account);
    -		}
    -
    -		/// 
    -		/// Test resultMap with a result property using another resultMap and where
    -		/// - the result property resultMap use a constructor
    -		/// - all the constructor arguments are null.
    -		/// 
    -		[Test]
    -		public void TestJIRA174()
    -		{
    -			Order order = sqlMap.QueryForObject("GetOrderConstructor9",11) as Order;
    -
    -			Assert.IsTrue(order.Id == 11);
    -			Assert.IsNull(order.Account);
    -		}
    -
    -        /// 
    -        /// Test a constructor argument with select tag.
    -        /// 
    -        [Test]
    -        public void TestJIRA186()
    -        {
    -            Order order = sqlMap.QueryForObject("GetOrderConstructor10", 5) as Order;
    -
    -            Assert.IsTrue(order.Id == 5);
    -            Assert.IsNotNull(order.Account);
    -            Assert.IsNotNull(order.Account.Document);
    -        }
    -	    
    -		/// 
    -		/// Test constructor with select attribute on argument
    -		/// 
    -		[Test]
    -		public void TestArgumentSelectObject()
    -		{
    -			Order order = (Order) sqlMap.QueryForObject("GetOrderConstructor2", 1);
    -			AssertOrder1(order);
    -			AssertAccount1(order.Account);
    -		}
    -
    -		/// 
    -		/// Test constructor with select attribute on IList argument
    -		/// 
    -		[Test]
    -		public void TestArgumentSelectIList()
    -		{
    -			Order order = (Order) sqlMap.QueryForObject("GetOrderConstructor3", 1);
    -			AssertOrder1(order);
    -			AssertAccount1(order.Account);
    -			
    -			Assert.IsNotNull(order.LineItemsIList);
    -			Assert.AreEqual(3, order.LineItemsIList.Count);
    -		}
    -
    -		/// 
    -		/// Test constructor with select attribute on array argument
    -		/// 
    -		[Test]
    -		public void TestArgumentSelectArray()
    -		{
    -			Order order = (Order) sqlMap.QueryForObject("GetOrderConstructor4", 1);
    -			AssertOrder1(order);
    -			AssertAccount1(order.Account);
    -			
    -			Assert.IsNotNull( order.LineItemsArray );
    -			Assert.AreEqual(3, order.LineItemsArray.Length);
    -		}
    -
    -		/// 
    -		/// Test constructor with select attribute on stronly typed collection argument
    -		/// 
    -		[Test]
    -		public void TestArgumentSelectCollection()
    -		{
    -			Order order = (Order) sqlMap.QueryForObject("GetOrderConstructor5", 1);
    -			AssertOrder1(order);
    -			AssertAccount1(order.Account);
    -			
    -			Assert.IsNotNull( order.LineItemsCollection );
    -            Assert.AreEqual(3, order.LineItemsCollection.Count);
    -		}
    -
    -#if dotnet2
    -        /// 
    -        /// Test constructor with select attribute on generic list argument
    -        /// 
    -        [Test]
    -        public void TestArgumentSelectGenericIList()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderConstructor6", 1);
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsGenericList);
    -            Assert.AreEqual(3, order.LineItemsGenericList.Count);
    -        }
    -
    -        /// 
    -        /// Test constructor with select attribute on stronly typed generic collection argument
    -        /// 
    -        [Test]
    -        public void TestArgumentSelectGenericCollection()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderConstructor7", 1);
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsCollection2);
    -            Assert.AreEqual(3, order.LineItemsCollection2.Count);
    -        }
    -#endif
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicPrependTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicPrependTest.cs
    deleted file mode 100644
    index f9318b5..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicPrependTest.cs
    +++ /dev/null
    @@ -1,474 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Configuration;
    -using System.Globalization;
    -using System.Threading;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -    /// 
    -    /// Summary description for DynamicPrependTest.
    -    /// 
    -    [TestFixture]
    -    public class DynamicPrependTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false);
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "category-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "other-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        { /* ... */ }
    -
    -        #endregion
    -
    -        #region Dynamic Prepend tests
    -
    -        /// 
    -        /// Test Dynamic With Prepend (1)
    -        /// 
    -        [Test]
    -        public void TestDynamicJIRA168()
    -        {
    -            Query query = new Query();
    -            Account account = new Account();
    -            account.Id = 1;
    -            query.DataObject = account;
    -
    -            account = (Account)sqlMap.QueryForObject("DynamicJIRA168", query);
    -
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test Iterate With Prepend (1)
    -        /// 
    -        [Test]
    -        public void TestIterateWithPrepend1()
    -        {
    -            IList parameters = new ArrayList();
    -            parameters.Add(1);
    -            parameters.Add(2);
    -            parameters.Add(3);
    -
    -            IList list = sqlMap.QueryForList("DynamicIterateWithPrepend1", parameters);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(3, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Iterate With Prepend (2)
    -        /// 
    -        [Test]
    -        public void TestIterateWithPrepend2()
    -        {
    -            IList parameters = new ArrayList();
    -            parameters.Add(1);
    -            parameters.Add(2);
    -            parameters.Add(3);
    -
    -            IList list = sqlMap.QueryForList("DynamicIterateWithPrepend2", parameters);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(3, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Iterate With Prepend (3)
    -        /// 
    -        [Test]
    -        public void TestIterateWithPrepend3()
    -        {
    -            IList parameters = new ArrayList();
    -            parameters.Add(1);
    -            parameters.Add(2);
    -            parameters.Add(3);
    -
    -            IList list = sqlMap.QueryForList("DynamicIterateWithPrepend3", parameters);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(3, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Dynamic With Prepend (1)
    -        /// 
    -        [Test]
    -        public void TestDynamicWithPrepend1()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -
    -            account = (Account)sqlMap.QueryForObject("DynamicWithPrepend", account);
    -
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test Dynamic With Prepend (2)
    -        /// 
    -        [Test]
    -        public void TestDynamicWithPrepend2()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -            account.FirstName = "Joe";
    -
    -            account = (Account)sqlMap.QueryForObject("DynamicWithPrepend", account);
    -            AssertAccount1(account);
    -
    -        }
    -
    -        /// 
    -        /// Test Dynamic With Prepend (3)
    -        /// 
    -        [Test]
    -        public void TestDynamicWithPrepend3()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -            account.FirstName = "Joe";
    -            account.LastName = "Dalton";
    -
    -            account = (Account)sqlMap.QueryForObject("DynamicWithPrepend", account);
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test Dynamic With Prepend (4)
    -        /// 
    -        [Test]
    -        public void TestDynamicWithPrepend4()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicWithPrepend", null);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Iterate With Two Prepends
    -        /// 
    -        [Test]
    -        public void TestIterateWithTwoPrepends()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -            account.FirstName = "Joe";
    -
    -            account = sqlMap.QueryForObject("DynamicWithPrepend", account) as Account;
    -            Assert.IsNotNull(account);
    -            AssertAccount1(account);
    -
    -            IList list = sqlMap.QueryForList("DynamicWithTwoDynamicElements", account);
    -            AssertAccount1((Account)list[0]);
    -        }
    -
    -        /// 
    -        /// Test Complex Dynamic
    -        /// 
    -        [Test]
    -        public void TestComplexDynamic()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -            account.FirstName = "Joe";
    -            account.LastName = "Dalton";
    -
    -            IList list = sqlMap.QueryForList("ComplexDynamicStatement", account);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test GetAccounts Dynamic
    -        /// 
    -        /// 
    -        /// Bug Fix http://sourceforge.net/forum/message.php?msg_id=2646964
    -        /// 
    -        [Test]
    -        public void TestGetAccountsDynamic()
    -        {
    -            Hashtable map = new Hashtable();
    -            map.Add("MaximumAllowed", 100);
    -
    -            map.Add("FirstName", "Joe");
    -            map.Add("LastName", "Dalton");
    -            map.Add("EmailAddress", "Joe.Dalton@somewhere.com");
    -
    -            IList list = sqlMap.QueryForList("GetAccountsDynamic", map);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsEqual with HashTable
    -        /// 
    -        /// 
    -        /// Bug Fix https://sourceforge.net/forum/message.php?msg_id=2840259
    -        /// 
    -        [Test]
    -        public void TestDynamicSelectByIntLong()
    -        {
    -            Hashtable search = new Hashtable();
    -            search.Add("year", 0);
    -            search.Add("areaid", 0);
    -
    -            IList list = sqlMap.QueryForList("DynamicSelectByIntLong", search);
    -
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(1, (list[0] as Other).Int);
    -            Assert.AreEqual(8888888, (list[0] as Other).Long);
    -            Assert.AreEqual(false, (list[0] as Other).Bool);
    -
    -            Assert.AreEqual(2, (list[1] as Other).Int);
    -            Assert.AreEqual(9999999999, (list[1] as Other).Long);
    -            Assert.AreEqual(true, (list[1] as Other).Bool);
    -
    -            //----------------------
    -            search.Clear();
    -            search.Add("year", 1);
    -            search.Add("areaid", 0);
    -
    -            list = null;
    -            list = sqlMap.QueryForList("DynamicSelectByIntLong", search);
    -
    -            Assert.AreEqual(1, list.Count);
    -            //----------------------
    -            search.Clear();
    -            search.Add("year", 0);
    -            search.Add("areaid", 9999999999);
    -
    -            list = null;
    -            list = sqlMap.QueryForList("DynamicSelectByIntLong", search);
    -
    -            Assert.AreEqual(1, list.Count);
    -            Assert.AreEqual(2, (list[0] as Other).Int);
    -            //----------------------
    -            search.Clear();
    -            search.Add("year", 2);
    -            search.Add("areaid", 9999999999);
    -
    -            list = null;
    -            list = sqlMap.QueryForList("DynamicSelectByIntLong", search);
    -
    -            Assert.AreEqual(1, list.Count);
    -            Assert.AreEqual(2, (list[0] as Other).Int);
    -            Assert.AreEqual(9999999999, (list[0] as Other).Long);
    -            Assert.AreEqual(true, (list[0] as Other).Bool);
    -        }
    -
    -        /// 
    -        /// Test Dynamic With GUID
    -        /// 
    -        [Test]
    -        public void TestDynamicWithGUID()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.Empty;
    -
    -            int key = (int)sqlMap.Insert("InsertCategory", category);
    -
    -            category = new Category();
    -            category.Name = "titi";
    -            category.Guid = Guid.NewGuid();
    -
    -            Category categoryTest = (Category)sqlMap.QueryForObject("DynamicGuid", category);
    -            Assert.IsNull(categoryTest);
    -
    -            category = new Category();
    -            category.Name = "titi";
    -            category.Guid = Guid.Empty;
    -
    -            categoryTest = (Category)sqlMap.QueryForObject("DynamicGuid", category);
    -            Assert.IsNotNull(categoryTest);
    -        }
    -
    -        /// 
    -        /// Test JIRA 11
    -        /// 
    -        /// 
    -        /// To test only for MSSQL with .NET SqlClient provider
    -        /// 
    -        [Test]
    -        [Category("MSSQL")]
    -        public void TestJIRA11()
    -        {
    -            Search search = new Search();
    -            search.NumberSearch = 123;
    -            search.StartDate = new DateTime(2004, 12, 25);
    -            search.Operande = "like";
    -            search.StartDateAnd = true;
    -
    -            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
    -            Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR");
    -
    -            IList list = sqlMap.QueryForList("Jira-IBATISNET-11", search);
    -
    -            Thread.CurrentThread.CurrentCulture = currentCulture;
    -
    -            Assert.AreEqual(0, list.Count);
    -        }
    -
    -        /// 
    -        /// We've been using the stable version of Ibatis for a while and recently
    -        /// upgraded to the latest alpha version 1.1.0.458. The old version was
    -        /// able to handle mapping the .Net bool type to SqlServer's Bit column.
    -        /// When we run sql maps that contain a bool property, we now get an
    -        /// exception.
    -        /// 
    -        /// 
    -        /// No problems !!
    -        /// 
    -        [Test]
    -        public void TestDynamicSelectByBool()
    -        {
    -            Other other = new Other();
    -            other.Bool = true;
    -
    -            Other anOther = sqlMap.QueryForObject("DynamicSelectByBool", other) as Other;
    -
    -            Assert.IsNotNull(anOther);
    -            Assert.AreEqual(2, anOther.Int);
    -            Assert.AreEqual(9999999999, anOther.Long);
    -            Assert.AreEqual(true, anOther.Bool);
    -
    -            other.Bool = false;
    -            anOther = sqlMap.QueryForObject("DynamicSelectByBool", other) as Other;
    -
    -            Assert.IsNotNull(anOther);
    -            Assert.AreEqual(1, anOther.Int);
    -            Assert.AreEqual(8888888, anOther.Long);
    -            Assert.AreEqual(false, anOther.Bool);
    -
    -        }
    -
    -        /// 
    -        /// Test JIRA 29
    -        /// 
    -        [Test]
    -        [Category("MSSQL")]
    -        public void TestJIRA29()
    -        {
    -            Hashtable param = new Hashtable();
    -            param["Foo"] = new DateTime(2003, 2, 17, 8, 15, 0);
    -
    -            Order order = sqlMap.QueryForObject("SelectOrderByDate", param) as Order;
    -
    -            Assert.IsNotNull(order);
    -
    -            Assert.AreEqual(11, order.Id);
    -
    -            CultureInfo currentCulture = Thread.CurrentThread.CurrentCulture;
    -            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US");
    -
    -            order = sqlMap.QueryForObject("SelectOrderByDateDynamic", param) as Order;
    -
    -            Thread.CurrentThread.CurrentCulture = currentCulture;
    -
    -            Assert.IsNotNull(order);
    -
    -            Assert.AreEqual(11, order.Id);
    -        }
    -
    -        /// 
    -        /// Test JIRA 29
    -        /// 
    -        [Test]
    -        public void Test2ForJIRA29()
    -        {
    -            // init
    -            Account account = new Account();
    -
    -            account.Id = 1234;
    -            account.FirstName = "#The Pound Signs#";
    -            account.LastName = "Gilles";
    -            account.EmailAddress = "a.a@somewhere.com";
    -
    -            sqlMap.Insert("InsertAccountViaInlineParameters", account);
    -
    -            // test
    -            Hashtable param = new Hashtable();
    -            param["AccountName"] = "The Pound Signs";
    -
    -            Account testAccount = sqlMap.QueryForObject("SelectAccountJIRA29", param) as Account;
    -
    -            Assert.IsNotNull(testAccount);
    -            Assert.AreEqual(1234, testAccount.Id);
    -            Assert.AreEqual("#The Pound Signs#", testAccount.FirstName);
    -        }
    -
    -        /// 
    -        /// Test JIRA 29
    -        /// 
    -        [Test]
    -        public void Test3ForJIRA29()
    -        {
    -            // init
    -            Account account = new Account();
    -
    -            account.Id = 1234;
    -            account.FirstName = "#The Pound Signs#";
    -            account.LastName = "Gilles";
    -            account.EmailAddress = "a.a@somewhere.com";
    -
    -            sqlMap.Insert("InsertAccountViaInlineParameters", account);
    -
    -            // test
    -            Hashtable param = new Hashtable();
    -            param["Foo"] = "The Pound Signs";
    -
    -            Account testAccount = sqlMap.QueryForObject("SelectAccountJIRA29-2", param) as Account;
    -
    -            Assert.IsNotNull(testAccount);
    -            Assert.AreEqual(1234, testAccount.Id);
    -            Assert.AreEqual("#The Pound Signs#", testAccount.FirstName);
    -        }
    -
    -        [Test]
    -        public void TestSelectKeyWithDynamicSql()
    -        {
    -            Account account = new Account();
    -            account.Id = 99998;
    -            account.FirstName = "R";
    -            account.LastName = "G";
    -
    -            Hashtable param = new Hashtable(2);
    -            param["Account"] = account;
    -            param["AccountsTableName"] = "Accounts";
    -            object selectKeyValue = sqlMap.Insert("SelectKeyWithDynamicSql", param);
    -
    -            Assert.IsNotNull(selectKeyValue);
    -            Assert.AreEqual(99998, Convert.ToInt32(selectKeyValue));
    -
    -            Assert.IsTrue(param.ContainsKey("AccountId"));
    -            Assert.AreEqual(99998, (int)param["AccountId"]);
    -        }
    -        #endregion
    -
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicTest.cs
    deleted file mode 100644
    index c366966..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/DynamicTest.cs
    +++ /dev/null
    @@ -1,456 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Configuration;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -    /// 
    -    /// Summary description for DynamicTest.
    -    /// 
    -    [TestFixture]
    -    public class DynamicTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false);
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        { /* ... */ }
    -
    -        #endregion
    -
    -        #region Dynamic tests
    -
    -        /// 
    -        /// Test Dynamic Sql On Column Selection
    -        /// JIRA IBATISNET-114
    -        /// 
    -        [Test]
    -        public void TestDynamicSqlOnColumnSelection()
    -        {
    -            Account paramAccount = new Account();
    -            Account resultAccount = new Account();
    -            IList list = null;
    -
    -            paramAccount.LastName = "Dalton";
    -            list = sqlMap.QueryForList("DynamicSqlOnColumnSelection", paramAccount);
    -            resultAccount = (Account)list[0];
    -            AssertAccount1(resultAccount);
    -            Assert.AreEqual(5, list.Count);
    -
    -            paramAccount.LastName = "Bayon";
    -            list = sqlMap.QueryForList("DynamicSqlOnColumnSelection", paramAccount);
    -            resultAccount = (Account)list[0];
    -            Assert.IsNull(resultAccount.FirstName);
    -            Assert.IsNull(resultAccount.LastName);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsNotEmpty True
    -        /// 
    -        [Test]
    -        public void TestIsNotEmptyTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsNotEmpty", "Joe");
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsNotEmpty False
    -        /// 
    -        [Test]
    -        public void TestIsNotEmptyFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsNotEmpty", "");
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsEqual true
    -        /// 
    -        [Test]
    -        public void TestIsEqualTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsEqual", "Joe");
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsEqual False
    -        /// 
    -        [Test]
    -        public void TestIsEqualFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsEqual", "BLAH!");
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsGreater true
    -        /// 
    -        [Test]
    -        public void TestIsGreaterTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsGreater", 5);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsGreater false
    -        /// 
    -        [Test]
    -        public void TestIsGreaterFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsGreater", 1);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsGreaterEqual true
    -        /// 
    -        [Test]
    -        public void TestIsGreaterEqualTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsGreaterEqual", 3);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsGreaterEqual false
    -        /// 
    -        [Test]
    -        public void TestIsGreaterEqualFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsGreaterEqual", 1);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsLess true
    -        /// 
    -        [Test]
    -        public void TestIsLessTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsLess", 1);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsLess false
    -        /// 
    -        [Test]
    -        public void TestIsLessFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsLess", 5);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsLessEqual true
    -        /// 
    -        [Test]
    -        public void TestIsLessEqualTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsLessEqual", 3);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsLessEqual false
    -        /// 
    -        [Test]
    -        public void TestIsLessEqualFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsLessEqual", 5);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsNotNull true
    -        /// 
    -        [Test]
    -        public void TestIsNotNullTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsNotNull", "");
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsNotNull false
    -        /// 
    -        [Test]
    -        public void TestIsNotNullFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsNotNull", null);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsPropertyAvailable true
    -        /// 
    -        [Test]
    -        public void TestIsPropertyAvailableTrue()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -
    -            IList list = sqlMap.QueryForList("DynamicIsPropertyAvailable", account);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsPropertyAvailable false
    -        /// 
    -        [Test]
    -        public void TestIsPropertyAvailableFalse()
    -        {
    -            string parameter = "1";
    -
    -            IList list = sqlMap.QueryForList("DynamicIsPropertyAvailable", parameter);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsParameterPresent true
    -        /// 
    -        [Test]
    -        public void TestIsParameterPresentTrue()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsParameterPresent", 1);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test IsParameterPresent false
    -        /// 
    -        [Test]
    -        public void TestIsParameterPresentFalse()
    -        {
    -            IList list = sqlMap.QueryForList("DynamicIsParameterPresent", null);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Iterate 
    -        /// 
    -        [Test]
    -        public void TestIterate()
    -        {
    -            IList parameters = new ArrayList();
    -            parameters.Add(1);
    -            parameters.Add(2);
    -            parameters.Add(3);
    -
    -            IList list = sqlMap.QueryForList("DynamicIterate", parameters);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(3, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Iterate 2
    -        /// 
    -        [Test]
    -        public void TestIterate2()
    -        {
    -            Account account = new Account();
    -            account.Ids = new int[3] { 1, 2, 3 };
    -
    -            IList list = sqlMap.QueryForList("DynamicIterate2", account);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(3, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Empty Parameter Object
    -        /// 
    -        [Test]
    -        public void TestEmptyParameterObject()
    -        {
    -            Account account = new Account();
    -            account.Id = -1;
    -
    -            IList list = sqlMap.QueryForList("DynamicQueryByExample", account);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Dynamic With Extend
    -        /// 
    -        [Test]
    -        public void TestDynamicWithExtend()
    -        {
    -            Account account = new Account();
    -            account.Id = -1;
    -
    -            IList list = sqlMap.QueryForList("DynamicWithExtend", account);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Multiple Iterate
    -        /// 
    -        [Test]
    -        public void TestMultiIterate()
    -        {
    -            IList parameters = new ArrayList();
    -            parameters.Add(1);
    -            parameters.Add(2);
    -            parameters.Add(3);
    -
    -            IList list = sqlMap.QueryForList("MultiDynamicIterate", parameters);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(3, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Array Property Iterate
    -        /// 
    -        [Test]
    -        public void TestArrayPropertyIterate()
    -        {
    -            Account account = new Account();
    -            account.Ids = new int[3] { 1, 2, 3 };
    -
    -            IList list = sqlMap.QueryForList("DynamicQueryByExample", account);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(3, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Complete Statement Substitution
    -        /// 
    -        [Test]
    -        [Ignore("No longer supported.")]
    -        public void TestCompleteStatementSubst()
    -        {
    -            string statement = "select" +
    -            "    Account_ID			as Id," +
    -            "    Account_FirstName	as FirstName," +
    -            "    Account_LastName	as LastName," +
    -            "    Account_Email		as EmailAddress" +
    -            "  from Accounts" +
    -            "  where Account_ID = #id#";
    -            int id = 1;
    -
    -            Hashtable parameters = new Hashtable();
    -            parameters.Add("id", id);
    -            parameters.Add("statement", statement);
    -
    -            IList list = sqlMap.QueryForList("DynamicSubst", parameters);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Query By Example
    -        /// 
    -        [Test]
    -        public void TestQueryByExample()
    -        {
    -            Account account;
    -
    -            account = new Account();
    -
    -            account.Id = 5;
    -            account = sqlMap.QueryForObject("DynamicQueryByExample", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.FirstName = "Gilles";
    -            account = sqlMap.QueryForObject("DynamicQueryByExample", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.LastName = "Bayon";
    -            account = sqlMap.QueryForObject("DynamicQueryByExample", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.EmailAddress = "gilles";
    -            account = (Account)sqlMap.QueryForObject("DynamicQueryByExample", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.Id = 5;
    -            account.FirstName = "Gilles";
    -            account.LastName = "Bayon";
    -            account.EmailAddress = "gilles.bayon@nospam.org";
    -            account = sqlMap.QueryForObject("DynamicQueryByExample", account) as Account;
    -            AssertGilles(account);
    -        }
    -
    -        /// 
    -        /// Test Query By Example via private field
    -        /// 
    -        [Test]
    -        public void TestQueryByExampleViaField()
    -        {
    -            Account account;
    -
    -            account = new Account();
    -
    -            account.Id = 5;
    -            account = sqlMap.QueryForObject("DynamicQueryByExampleViaPrivateField", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.FirstName = "Gilles";
    -            account = sqlMap.QueryForObject("DynamicQueryByExampleViaPrivateField", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.LastName = "Bayon";
    -            account = sqlMap.QueryForObject("DynamicQueryByExampleViaPrivateField", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.EmailAddress = "gilles";
    -            account = (Account)sqlMap.QueryForObject("DynamicQueryByExampleViaPrivateField", account) as Account;
    -            AssertGilles(account);
    -
    -            account = new Account();
    -            account.Id = 5;
    -            account.FirstName = "Gilles";
    -            account.LastName = "Bayon";
    -            account.EmailAddress = "gilles.bayon@nospam.org";
    -            account = sqlMap.QueryForObject("DynamicQueryByExampleViaPrivateField", account) as Account;
    -            AssertGilles(account);
    -        }
    -        #endregion
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/GenericListTests.txt b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/GenericListTests.txt
    deleted file mode 100644
    index 8736f22..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/GenericListTests.txt
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -Tests
    -
    -Interface tests
    -1) IList (Order.LineItemsGenericList) <--- QueryForList
    -2) IList (Order.LineItemsGenericList) <--- QueryForList Lazy load
    -3) IList (Order.LineItemsGenericList) <--- QueryForList with listClass = LineItemCollection2
    -4) IList (Order.LineItemsGenericList) <--- QueryForList with listClass = LineItemCollection2 lazy
    -
    -Strongly typed collection tests
    -5) LineItemCollection2 (Order.LineItemCollection2) <--- QueryForList with listClass = LineItemCollection2
    -6) LineItemCollection2 (Order.LineItemCollection2) <--- QueryForList  with listClass = LineItemCollection2 Lazy load
    -
    -1/
    -
    -
    -	
    -
    -
    -
    -	select * from Orders where Order_ID = #value#
    -
    -
    -2/
    -
    -
    -      
    -
    -
    -
    -
    -	select * from Orders where Order_ID = #value#
    -
    -
    -3/
    -
    -
    -	
    -
    -
    -
    -	select * from Orders where Order_ID = #value#
    -
    -
    -4/
    -    
    -      
    -    
    -
    -   
    -      select * from Orders where Order_ID = #value#
    -    
    -
    -5/
    -
    -	
    -
    -
    - 
    -	select * from Orders where Order_ID = #value#
    -
    -
    -
    -6/
    -    
    -      
    -    
    -    
    -    
    -      select * from Orders where Order_ID = #value#
    -    
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/NullableTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/NullableTest.cs
    deleted file mode 100644
    index ed1d006..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/NullableTest.cs
    +++ /dev/null
    @@ -1,552 +0,0 @@
    -#if dotnet2
    -using System;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Generics
    -{
    -    /// 
    -    /// Summary description for ResultClassTest.
    -    /// 
    -    [TestFixture]
    -    public class NullableTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "Nullable-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        {}
    -
    -        #endregion
    -
    -        #region NullableClass
    -        /// 
    -        ///  Test a NullableClass resultClass
    -        /// 
    -        [Test]
    -        public void TestNullableViaResultClass()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetClassNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsNull(clazz.TestBool);
    -            Assert.IsNull(clazz.TestByte);
    -            Assert.IsNull(clazz.TestChar);
    -            Assert.IsNull(clazz.TestDateTime);
    -            Assert.IsNull(clazz.TestDecimal);
    -            Assert.IsNull(clazz.TestDouble);
    -            Assert.IsNull(clazz.TestGuid);
    -            Assert.IsNull(clazz.TestInt16);
    -            Assert.IsNull(clazz.TestInt32);
    -            Assert.IsNull(clazz.TestInt64);
    -            Assert.IsNull(clazz.TestSingle);
    -        }
    -
    -        /// 
    -        ///  Test a NullableClass resultClass
    -        /// 
    -        [Test]
    -        public void TestNullableViaResultClass2()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestBool = true;
    -            clazz.TestByte = 155;
    -            clazz.TestChar = 'a';
    -            DateTime? date = new DateTime?(DateTime.Now);
    -            clazz.TestDateTime = date;
    -            clazz.TestDecimal = 99.53M;
    -            clazz.TestDouble = 99.5125;
    -            Guid? guid = new Guid?(Guid.NewGuid());
    -            clazz.TestGuid = guid;
    -            clazz.TestInt16 = 45;
    -            clazz.TestInt32 = 99;
    -            clazz.TestInt64 = 1234567890123456789;
    -            clazz.TestSingle = 4578.46445454112f;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetClassNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsTrue(clazz.TestBool.Value);
    -            Assert.AreEqual(155, clazz.TestByte);
    -            Assert.AreEqual('a', clazz.TestChar);
    -            Assert.AreEqual(date.Value.ToString(), clazz.TestDateTime.Value.ToString());
    -            Assert.AreEqual(99.53M, clazz.TestDecimal);
    -            Assert.AreEqual(99.5125, clazz.TestDouble);
    -            Assert.AreEqual(guid, clazz.TestGuid);
    -            Assert.AreEqual(45, clazz.TestInt16);
    -            Assert.AreEqual(99, clazz.TestInt32);
    -            Assert.AreEqual(1234567890123456789, clazz.TestInt64);
    -            Assert.AreEqual(4578.46445454112f, clazz.TestSingle);
    -        } 
    -        #endregion
    -
    -        #region bool
    -
    -        /// 
    -        /// Test nullable bool
    -        /// 
    -        [Test]
    -        public void TestNullableBool()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsNull(clazz.TestBool);
    -        }
    -
    -        /// 
    -        /// Test not nullable bool
    -        /// 
    -        [Test]
    -        public void TestNotNullableBool()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestBool = false;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(false, clazz.TestBool);
    -        } 
    -        #endregion
    -
    -        #region byte
    -        /// 
    -        /// Test nullable byte
    -        /// 
    -        [Test]
    -        public void TestNullableByte()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsNull(clazz.TestByte);
    -        }
    -
    -        /// 
    -        /// Test not nullable byte
    -        /// 
    -        [Test]
    -        public void TestNotNullableByte()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestByte = 155;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(155, clazz.TestByte);
    -        } 
    -        #endregion
    -
    -        #region char
    -        /// 
    -        /// Test nullable char
    -        /// 
    -        [Test]
    -        public void TestNullableChar()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsNull(clazz.TestChar);
    -        }
    -
    -        /// 
    -        /// Test not nullable char
    -        /// 
    -        [Test]
    -        public void TestNotNullableChar()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestChar = 'a';
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual('a', clazz.TestChar);
    -        } 
    -        #endregion
    -
    -        #region datetime
    -        /// 
    -        /// Test nullable datetime
    -        /// 
    -        [Test]
    -        public void TestNullableDateTime()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsNull(clazz.TestDateTime);
    -        }
    -
    -        /// 
    -        /// Test not nullable datetime
    -        /// 
    -        [Test]
    -        public void TestNotNullableDateTime()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            DateTime? date = new DateTime?(DateTime.Now);
    -            clazz.TestDateTime = date;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(date.Value.ToString(), clazz.TestDateTime.Value.ToString());
    -        }
    -        #endregion
    -
    -        #region decimal
    -        /// 
    -        /// Test nullable decimal
    -        /// 
    -        [Test]
    -        public void TestNullableDecimal()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(clazz.Id, 1);
    -            Assert.IsNull(clazz.TestDecimal);
    -        }
    -
    -        /// 
    -        /// Test not nullable decimal
    -        /// 
    -        [Test]
    -        public void TestNotNullableDecimal()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestDecimal = 99.53M;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(99.53M, clazz.TestDecimal);
    -        }
    -        #endregion
    -
    -        #region Double
    -        /// 
    -        /// Test nullable Double
    -        /// 
    -        [Test]
    -        public void TestNullableDouble()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(clazz.Id, 1);
    -            Assert.IsNull(clazz.TestDouble);
    -        }
    -
    -        /// 
    -        /// Test not nullable Double
    -        /// 
    -        [Test]
    -        public void TestNotNullableDouble()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestDouble = 99.5125;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(99.5125, clazz.TestDouble);
    -        }
    -        #endregion
    -
    -        #region Guid
    -        /// 
    -        /// Test nullable Guid
    -        /// 
    -        [Test]
    -        public void TestNullableGuid()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(clazz.Id, 1);
    -            Assert.IsNull(clazz.TestGuid);
    -        }
    -
    -        /// 
    -        /// Test not nullable Guid
    -        /// 
    -        [Test]
    -        public void TestNotNullableGuid()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            Guid? guid = new Guid?(Guid.NewGuid());
    -            clazz.TestGuid = guid;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(guid, clazz.TestGuid);
    -        }
    -        #endregion
    -
    -        #region Int16
    -        /// 
    -        /// Test nullable Int16
    -        /// 
    -        [Test]
    -        public void TestNullableInt16()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(clazz.Id, 1);
    -            Assert.IsNull(clazz.TestInt16);
    -        }
    -
    -        /// 
    -        /// Test not nullable Int16
    -        /// 
    -        [Test]
    -        public void TestNotNullableInt16()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestInt16 = 45;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(45, clazz.TestInt16);
    -        }
    -        #endregion
    -
    -        #region int 32
    -        /// 
    -        /// Test nullable int32
    -        /// 
    -        [Test]
    -        public void TestNullableInt32()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(clazz.Id, 1);
    -            Assert.IsNull(clazz.TestInt32);
    -        }
    -
    -        /// 
    -        /// Test not nullable int32
    -        /// 
    -        [Test]
    -        public void TestNotNullableInt32()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestInt32 = 99;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(99, clazz.TestInt32);
    -        } 
    -        #endregion
    -
    -        #region Int64
    -        /// 
    -        /// Test nullable Int64
    -        /// 
    -        [Test]
    -        public void TestNullableInt64()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(clazz.Id, 1);
    -            Assert.IsNull(clazz.TestInt64);
    -        }
    -
    -        /// 
    -        /// Test not nullable Int64
    -        /// 
    -        [Test]
    -        public void TestNotNullableInt64()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestInt64 = 1234567890123456789;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(1234567890123456789, clazz.TestInt64);
    -        }
    -        #endregion
    -
    -        #region Single
    -        /// 
    -        /// Test nullable Single
    -        /// 
    -        [Test]
    -        public void TestNullableSingle()
    -        {
    -            NullableClass clazz = new NullableClass();
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(clazz.Id, 1);
    -            Assert.IsNull(clazz.TestSingle);
    -        }
    -
    -        /// 
    -        /// Test not nullable Single
    -        /// 
    -        [Test]
    -        public void TestNotNullableSingle()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            clazz.TestSingle = 4578.46445454112f;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(4578.46445454112f, clazz.TestSingle);
    -        }
    -        #endregion
    -
    -        #region timespan
    -        
    -        [Test]
    -        public void TestNullableTimeSpan()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.IsNull(clazz.TestTimeSpan);
    -        }
    -
    -        /// 
    -        /// Test not nullable timespan
    -        /// 
    -        [Test]
    -        public void TestNotNullableTimeSpan()
    -        {
    -            NullableClass clazz = new NullableClass();
    -            TimeSpan? span = new TimeSpan?(new TimeSpan(1, 2, 3, 4, 5));
    -            clazz.TestTimeSpan = span;
    -
    -            sqlMap.Insert("InsertNullable", clazz);
    -            clazz = null;
    -            clazz = sqlMap.QueryForObject("GetNullable", 1);
    -
    -            Assert.IsNotNull(clazz);
    -            Assert.AreEqual(1, clazz.Id);
    -            Assert.AreEqual(span.Value.ToString(), clazz.TestTimeSpan.Value.ToString());
    -        }
    -
    -        #endregion
    -    }
    -}
    -#endif
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultClassTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultClassTest.cs
    deleted file mode 100644
    index c59c0bd..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultClassTest.cs
    +++ /dev/null
    @@ -1,177 +0,0 @@
    -#if dotnet2
    -using System;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Generics
    -{
    -	/// 
    -	/// Summary description for ResultClassTest.
    -	/// 
    -	[TestFixture] 
    -	public class ResultClassTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement test
    -
    -		/// 
    -		///  Test a boolean resultClass
    -		/// 
    -		[Test]
    -		public void TestBoolean() 
    -		{
    -			bool bit = sqlMap.QueryForObject("GetBoolean", 1);
    -
    -			Assert.AreEqual(true, bit);
    -		}
    -
    -		/// 
    -		///  Test a byte resultClass
    -		/// 
    -		[Test] 
    -		public void TestByte() 
    -		{
    -			byte letter = sqlMap.QueryForObject("GetByte", 1);
    -
    -			Assert.AreEqual(155, letter);
    -		}
    -
    -		/// 
    -		///  Test a char resultClass
    -		/// 
    -		[Test] 
    -		public void TestChar() 
    -		{
    -			char letter = sqlMap.QueryForObject("GetChar", 1);
    -
    -			Assert.AreEqual('a', letter);
    -		}
    -        		
    -		/// 
    -		///  Test a DateTime resultClass
    -		/// 
    -		[Test] 
    -		public void TestDateTime() 
    -		{
    -			DateTime orderDate = sqlMap.QueryForObject("GetDate", 1);
    -			System.DateTime date = new DateTime(2003, 2, 15, 8, 15, 00);
    -
    -			Assert.AreEqual(date.ToString(), orderDate.ToString());
    -		}
    -
    -		/// 
    -		///  Test a decimal resultClass
    -		/// 
    -		[Test] 
    -		public void TestDecimal() 
    -		{
    -			decimal price = sqlMap.QueryForObject("GetDecimal", 1);
    -
    -			Assert.AreEqual((decimal)1.56, price);
    -		}
    -
    -		/// 
    -		///  Test a double resultClass
    -		/// 
    -		[Test] 
    -		public void TestDouble() 
    -		{
    -			double price = sqlMap.QueryForObject("GetDouble", 1);
    -
    -			Assert.AreEqual(99.5f, price);
    -		}
    -
    -		/// 
    -		///  IBATISNET-25 Error applying ResultMap when using 'Guid' in resultClass
    -		/// 
    -		[Test] 
    -		public void TestGuid() 
    -		{
    -			Guid newGuid = new Guid("CD5ABF17-4BBC-4C86-92F1-257735414CF4");
    -
    -			Guid guid = sqlMap.QueryForObject("GetGuid", 1);
    -
    -			Assert.AreEqual(newGuid, guid);
    -		}
    -
    -		/// 
    -		///  Test a int16 resultClass
    -		/// 
    -		[Test] 
    -		public void TestInt16() 
    -		{
    -			short integer = sqlMap.QueryForObject("GetInt16", 1);
    -
    -			Assert.AreEqual(32111, integer);
    -		}
    -
    -		/// 
    -		///  Test a int 32 resultClass
    -		/// 
    -		[Test] 
    -
    -		public void TestInt32() 
    -		{
    -			int integer = sqlMap.QueryForObject("GetInt32", 1);
    -
    -			Assert.AreEqual(999999, integer);
    -		}
    -
    -		/// 
    -		///  Test a int64 resultClass
    -		/// 
    -		[Test] 
    -		public void TestInt64() 
    -		{
    -			long bigInt = sqlMap.QueryForObject("GetInt64", 1);
    -
    -			Assert.AreEqual(9223372036854775800, bigInt);
    -		}
    -
    -		/// 
    -		///  Test a single/float resultClass
    -		/// 
    -		[Test] 
    -		public void TestSingle() 
    -		{
    -			float price = sqlMap.QueryForObject("GetSingle", 1);
    -
    -			Assert.AreEqual(92233.5, price);
    -		}
    -
    -		/// 
    -		///  Test a string resultClass
    -		/// 
    -		[Test] 
    -		public void TestString() 
    -		{
    -			string cardType = sqlMap.QueryForObject("GetString", 1);
    -
    -			Assert.AreEqual("VISA", cardType);
    -		}
    -
    -		
    -		#endregion
    -	}
    -}
    -#endif
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultMapTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultMapTest.cs
    deleted file mode 100644
    index f6967ee..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/ResultMapTest.cs
    +++ /dev/null
    @@ -1,202 +0,0 @@
    -using System.Collections.Generic;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Generics
    -{
    -    /// 
    -    /// Tests generic list
    -    /// 
    -    /// Interface tests
    -    /// 1) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt
    -    /// 2) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt Lazy load
    -    /// 3) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt with listClass = LineItemCollection2
    -    /// 4) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt with listClass = LineItemCollection2 lazy
    -
    -    /// Strongly typed collection tests
    -    /// 5) LineItemCollection2 (Order.LineItemCollection2) <--- QueryForList&lgt;LineItem&glt with listClass = LineItemCollection2
    -    /// 6) LineItemCollection2 (Order.LineItemCollection2) <--- QueryForList&lgt;LineItem&glt  with listClass = LineItemCollection2 Lazy load
    -    /// 
    -    [TestFixture] 
    -    public class ResultMapTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "enumeration-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "coupons-init.sql");
    -
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        { /* ... */ }
    -
    -        #endregion
    -
    -        #region Result Map test
    -
    -        /// 
    -        /// Coupons
    -        /// 
    -        [Test]
    -        public void TestJIRA243WithGoupBy()
    -        {
    -            IList coupons = sqlMap.QueryForList("GetCouponBrand", null);
    -
    -            Assert.That(coupons.Count, Is.EqualTo(5));
    -            Assert.That(coupons[0].BrandIds[0], Is.EqualTo(1));
    -            Assert.That(coupons[0].BrandIds[1], Is.EqualTo(2));
    -            Assert.That(coupons[0].BrandIds[2], Is.EqualTo(3));
    -            Assert.That(coupons[1].BrandIds[0], Is.EqualTo(4));
    -            Assert.That(coupons[1].BrandIds[1], Is.EqualTo(5));
    -            Assert.That(coupons[2].BrandIds.Count, Is.EqualTo(0));
    -            Assert.That(coupons[3].BrandIds.Count, Is.EqualTo(0));
    -            Assert.That(coupons[4].BrandIds[0], Is.EqualTo(6));
    -        }
    -
    -        /// 
    -        /// Coupons
    -        /// 
    -        [Test]
    -        public void Test243WithoutGoupBy()
    -        {
    -            IList coupons = sqlMap.QueryForList("GetCoupons", null);
    -
    -            Assert.That(coupons.Count, Is.EqualTo(5));
    -            Assert.That(coupons[0].BrandIds[0], Is.EqualTo(1));
    -            Assert.That(coupons[0].BrandIds[1], Is.EqualTo(2));
    -            Assert.That(coupons[0].BrandIds[2], Is.EqualTo(3));
    -            Assert.That(coupons[1].BrandIds[0], Is.EqualTo(4));
    -            Assert.That(coupons[1].BrandIds[1], Is.EqualTo(5));
    -            Assert.That(coupons[2].BrandIds.Count, Is.EqualTo(0));
    -            Assert.That(coupons[3].BrandIds.Count, Is.EqualTo(0));
    -            Assert.That(coupons[4].BrandIds[0], Is.EqualTo(6));
    -        }
    -
    -        /// 
    -        /// Test generic Ilist  : 
    -        /// 1) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt
    -        /// 
    -        [Test]
    -        public void TestGenericList()
    -        {
    -            Order order = sqlMap.QueryForObject("GetOrderWithGenericListLineItem", 1);
    -
    -            AssertOrder1(order);
    -
    -            // Check generic IList collection
    -            Assert.IsNotNull(order.LineItemsGenericList);
    -            Assert.AreEqual(3, order.LineItemsGenericList.Count);
    -        }
    -
    -        /// 
    -        /// Test generic Ilist with lazy loading : 
    -        /// 2) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt Lazy load
    -        /// 
    -        [Test]
    -        public void TestGenericListLazyLoad()
    -        {
    -            Order order = sqlMap.QueryForObject("GetOrderWithGenericLazyLoad", 1);
    -
    -            AssertOrder1(order);
    -
    -            // Check generic IList collection
    -            Assert.IsNotNull(order.LineItemsGenericList);
    -            Assert.AreEqual(3, order.LineItemsGenericList.Count);
    -        }
    -
    -        /// 
    -        /// Test generic typed generic Collection on generic IList  
    -        /// 3) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt with listClass = LineItemCollection2
    -        /// 
    -        [Test]
    -        public void TestGenericCollectionOnIList()
    -        {
    -            Order order = sqlMap.QueryForObject("GetOrderWithGenericLineItemCollection", 1);
    -
    -            AssertOrder1(order);
    -
    -            // Check generic collection
    -            Assert.IsNotNull(order.LineItemsGenericList);
    -            Assert.AreEqual(3, order.LineItemsGenericList.Count);
    -            LineItemCollection2 lines = (LineItemCollection2)order.LineItemsGenericList;
    -        }
    -
    -        /// 
    -        /// Test generic IList with lazy typed collection 
    -        /// 4) IList&lgt;LineItem&glt (Order.LineItemsGenericList) <--- QueryForList&lgt;LineItem&glt with listClass = LineItemCollection2 lazy
    -        /// 
    -        [Test]
    -        public void TestLazyListGenericMapping()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithGenericLineItemsLazy", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsGenericList);
    -            Assert.AreEqual(3, order.LineItemsGenericList.Count);
    -            LineItemCollection2 lines = (LineItemCollection2)order.LineItemsGenericList;
    -        }
    -
    -        /// 
    -        /// Test generic typed generic Collection on generic typed generic Collection
    -        /// 5) LineItemCollection2 (Order.LineItemCollection2) <--- QueryForList&lgt;LineItem&glt with listClass = LineItemCollection2
    -        /// 
    -        [Test]
    -        public void TestTypedCollectionOnTypedCollection()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithGenericTypedLineItemCollection", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsCollection2);
    -            Assert.AreEqual(3, order.LineItemsCollection2.Count);
    -
    -            IEnumerator e = ((IEnumerable)order.LineItemsCollection2).GetEnumerator();
    -            while (e.MoveNext())
    -            {
    -                LineItem item = e.Current;
    -                Assert.IsNotNull(item);
    -            }
    -        }
    -
    -        /// 
    -        /// Test generic typed generic Collection lazy
    -        /// 6) LineItemCollection2 (Order.LineItemCollection2) <--- QueryForList&lgt;LineItem&glt  with listClass = LineItemCollection2 Lazy load
    -        /// 
    -        [Test]
    -        public void TestTypedCollectionLazy()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithGenericTypedLineItemCollectionLazy", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsCollection2);
    -            Assert.AreEqual(3, order.LineItemsCollection2.Count);
    -
    -            IEnumerator e = ((IEnumerable)order.LineItemsCollection2).GetEnumerator();
    -            while (e.MoveNext())
    -            {
    -                LineItem item = e.Current;
    -                Assert.IsNotNull(item);
    -            }
    -        }
    -
    -        #endregion
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/StatementTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/StatementTest.cs
    deleted file mode 100644
    index a3d85e0..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Generics/StatementTest.cs
    +++ /dev/null
    @@ -1,619 +0,0 @@
    -#region Apache Notice
    -/*****************************************************************************
    - * $Revision: 470514 $
    - * $LastChangedDate: 2006-11-02 13:46:13 -0700 (Thu, 02 Nov 2006) $
    - * $LastChangedBy: gbayon $
    - * 
    - * iBATIS.NET Data Mapper
    - * Copyright (C) 2005, 2006 The Apache Software Foundation
    - *  
    - * 
    - * Licensed under the Apache License, Version 2.0 (the "License");
    - * you may not use this file except in compliance with the License.
    - * You may obtain a copy of the License at
    - * 
    - *      http://www.apache.org/licenses/LICENSE-2.0
    - * 
    - * Unless required by applicable law or agreed to in writing, software
    - * distributed under the License is distributed on an "AS IS" BASIS,
    - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    - * See the License for the specific language governing permissions and
    - * limitations under the License.
    - * 
    - ********************************************************************************/
    -#endregion
    -
    -#if dotnet2
    -
    -using System;
    -using System.Collections;
    -using IBatisNet.Common;
    -using IBatisNet.Common.Exceptions;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper.MappedStatements;
    -using IBatisNet.DataMapper.Test.Domain;
    -using System.Collections.Generic;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Generics
    -{
    -    [TestFixture]
    -    public class StatementTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "enumeration-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "other-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        { /* ... */
    -        }
    -
    -        #endregion
    -
    -        #region Object Query tests
    -
    -        /// 
    -        /// Test Open connection with a connection string
    -        /// 
    -        [Test]
    -        public void TestOpenConnection()
    -        {
    -            sqlMap.OpenConnection(sqlMap.DataSource.ConnectionString);
    -            Account account = sqlMap.QueryForObject("SelectWithProperty", null);
    -            sqlMap.CloseConnection();
    -
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test use a statement with property subtitution
    -        /// (JIRA 22)
    -        /// 
    -        [Test]
    -        public void TestSelectWithProperty()
    -        {
    -            Account account = sqlMap.QueryForObject("SelectWithProperty", null);
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject Via ColumnName
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaColumnName()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1);
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject Via ColumnIndex
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaColumnIndex()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountViaColumnIndex", 1);
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject Via ResultClass
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaResultClass()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountViaResultClass", 1);
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject With simple ResultClass : string
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithSimpleResultClass()
    -        {
    -            string email = sqlMap.QueryForObject("GetEmailAddressViaResultClass", 1);
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", email);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject With simple ResultMap : string
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithSimpleResultMap()
    -        {
    -            string email = sqlMap.QueryForObject("GetEmailAddressViaResultMap", 1);
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", email);
    -        }
    -
    -        /// 
    -        /// Test Primitive ReturnValue : System.DateTime
    -        /// 
    -        [Test]
    -        public void TestPrimitiveReturnValue()
    -        {
    -            DateTime CardExpiry = sqlMap.QueryForObject("GetOrderCardExpiryViaResultClass", 1);
    -            Assert.AreEqual(new DateTime(2003, 02, 15, 8, 15, 00), CardExpiry);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject with result object : Account
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithResultObject()
    -        {
    -            Account account = new Account();
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnName", 1, account);
    -            AssertAccount1(account);
    -            Assert.IsTrue(account == testAccount);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject as Hashtable
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectAsHashtable()
    -        {
    -            Hashtable account = sqlMap.QueryForObject("GetAccountAsHashtable", 1);
    -            AssertAccount1AsHashtable(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject as Hashtable ResultClass
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectAsHashtableResultClass()
    -        {
    -            Hashtable account = sqlMap.QueryForObject("GetAccountAsHashtableResultClass", 1);
    -            AssertAccount1AsHashtableForResultClass(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject via Hashtable
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaHashtable()
    -        {
    -            Hashtable param = new Hashtable();
    -            param.Add("LineItem_ID", 4);
    -            param.Add("Order_ID", 9);
    -
    -            LineItem testItem = sqlMap.QueryForObject("GetSpecificLineItem", param);
    -
    -            Assert.IsNotNull(testItem);
    -            Assert.AreEqual("TSM-12", testItem.Code);
    -        }
    -
    -        /// 
    -        /// Test Query Dynamic Sql Element
    -        /// 
    -        [Test]
    -        public void TestQueryDynamicSqlElement()
    -        {
    -            //IList list = sqlMap.QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_ID");
    -            IList list = sqlMap.QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_ID");
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", list[0]);
    -
    -            //list = sqlMap.QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_FirstName");
    -            list = sqlMap.QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_FirstName");
    -
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", list[0]);
    -
    -        }
    -
    -        /// 
    -        /// Test Execute QueryForList With ResultMap With Dynamic Element
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForListWithResultMapWithDynamicElement()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultMapWithDynamicElement", "LIKE");
    -
    -            AssertAccount1(list[0]);
    -            Assert.AreEqual(4, list.Count);
    -            Assert.AreEqual(1, list[0].Id);
    -            Assert.AreEqual(2, list[1].Id);
    -            Assert.AreEqual(4, list[2].Id);
    -
    -            list = sqlMap.QueryForList("GetAllAccountsViaResultMapWithDynamicElement", "=");
    -
    -            Assert.AreEqual(0, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Simple Dynamic Substitution
    -        /// 
    -        [Test]
    -        [Ignore("No longer supported.")]
    -        public void TestSimpleDynamicSubstitution()
    -        {
    -            string statement = "select" + "    Account_ID          as Id," + "    Account_FirstName   as FirstName," + "    Account_LastName    as LastName," + "    Account_Email       as EmailAddress" + "  from Accounts" + "  WHERE Account_ID = #id#";
    -
    -            Hashtable param = new Hashtable();
    -            param.Add("id", 1);
    -            param.Add("statement", statement);
    -
    -
    -            IList list = sqlMap.QueryForList("SimpleDynamicSubstitution", param);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Get Account Via Inline Parameters
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaInlineParameters()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaInlineParameters", account);
    -
    -            AssertAccount1(testAccount);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQuery For Object With Enum property
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithEnum()
    -        {
    -            Enumeration enumClass = sqlMap.QueryForObject("GetEnumeration", 1);
    -
    -            Assert.AreEqual(enumClass.Day, Days.Sat);
    -            Assert.AreEqual(enumClass.Color, Colors.Red);
    -            Assert.AreEqual(enumClass.Month, Months.August);
    -
    -            enumClass = sqlMap.QueryForObject("GetEnumeration", 3) as Enumeration;
    -
    -            Assert.AreEqual(enumClass.Day, Days.Mon);
    -            Assert.AreEqual(enumClass.Color, Colors.Blue);
    -            Assert.AreEqual(enumClass.Month, Months.September);
    -        }
    -
    -        #endregion
    -
    -        #region  List Query tests
    -
    -        /// 
    -        /// Test QueryForList with Hashtable ResultMap
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithGeneric()
    -        {
    -            List accounts = new List();
    -
    -            sqlMap.QueryForList("GetAllAccountsViaResultMap", null, (System.Collections.IList)accounts);
    -
    -            AssertAccount1(accounts[0]);
    -            Assert.AreEqual(5, accounts.Count);
    -            Assert.AreEqual(1, accounts[0].Id);
    -            Assert.AreEqual(2, accounts[1].Id);
    -            Assert.AreEqual(3, accounts[2].Id);
    -            Assert.AreEqual(4, accounts[3].Id);
    -            Assert.AreEqual(5, accounts[4].Id);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with Hashtable ResultMap
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithHashtableResultMap()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsAsHashMapViaResultMap", null);
    -
    -            AssertAccount1AsHashtable(list[0]);
    -            Assert.AreEqual(5, list.Count);
    -
    -            Assert.AreEqual(1, list[0]["Id"]);
    -            Assert.AreEqual(2, list[1]["Id"]);
    -            Assert.AreEqual(3, list[2]["Id"]);
    -            Assert.AreEqual(4, list[3]["Id"]);
    -            Assert.AreEqual(5, list[4]["Id"]);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with Hashtable ResultClass
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithHashtableResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsAsHashtableViaResultClass", null);
    -
    -            AssertAccount1AsHashtableForResultClass(list[0]);
    -            Assert.AreEqual(5, list.Count);
    -
    -            Assert.AreEqual(1, list[0][BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(2, list[1][BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(3, list[2][BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(4, list[3][BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(5, list[4][BaseTest.ConvertKey("Id")]);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with IList ResultClass
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithIListResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsAsArrayListViaResultClass", null);
    -
    -            IList listAccount = list[0];
    -            Assert.AreEqual(1, listAccount[0]);
    -            Assert.AreEqual("Joe", listAccount[1]);
    -            Assert.AreEqual("Dalton", listAccount[2]);
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", listAccount[3]);
    -
    -            Assert.AreEqual(5, list.Count);
    -
    -            listAccount = (IList)list[0];
    -            Assert.AreEqual(1, listAccount[0]);
    -            listAccount = (IList)list[1];
    -            Assert.AreEqual(2, listAccount[0]);
    -            listAccount = (IList)list[2];
    -            Assert.AreEqual(3, listAccount[0]);
    -            listAccount = (IList)list[3];
    -            Assert.AreEqual(4, listAccount[0]);
    -            listAccount = (IList)list[4];
    -            Assert.AreEqual(5, listAccount[0]);
    -        }
    -
    -        /// 
    -        /// Test QueryForList With ResultMap, result collection as ArrayList
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithResultMap()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultMap", null);
    -
    -            AssertAccount1(list[0]);
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual(1, list[0].Id);
    -            Assert.AreEqual(2, list[1].Id);
    -            Assert.AreEqual(3, list[2].Id);
    -            Assert.AreEqual(4, list[3].Id);
    -            Assert.AreEqual(5, list[4].Id);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with ResultObject : 
    -        /// AccountCollection strongly typed collection
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithResultObject()
    -        {
    -            IList accounts = new List();
    -
    -            sqlMap.QueryForList("GetAllAccountsViaResultMap", null, accounts);
    -
    -            AssertAccount1(accounts[0]);
    -            Assert.AreEqual(5, accounts.Count);
    -            Assert.AreEqual(1, accounts[0].Id);
    -            Assert.AreEqual(2, accounts[1].Id);
    -            Assert.AreEqual(3, accounts[2].Id);
    -            Assert.AreEqual(4, accounts[3].Id);
    -            Assert.AreEqual(5, accounts[4].Id);
    -        }
    -
    -
    -        /// 
    -        /// Test QueryForList with no result.
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithNoResult()
    -        {
    -            IList list = sqlMap.QueryForList("GetNoAccountsViaResultMap", null);
    -
    -            Assert.AreEqual(0, list.Count);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with ResultClass : Account.
    -        /// 
    -        [Test]
    -        public void TestQueryForListResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultClass", null);
    -
    -            AssertAccount1(list[0]);
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual(1, list[0].Id);
    -            Assert.AreEqual(2, list[1].Id);
    -            Assert.AreEqual(3, list[2].Id);
    -            Assert.AreEqual(4, list[3].Id);
    -            Assert.AreEqual(5, list[4].Id);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with simple resultClass : string
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithSimpleResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllEmailAddressesViaResultClass", null);
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", list[0]);
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", list[1]);
    -            Assert.IsNull(list[2]);
    -            Assert.AreEqual("Jack.Dalton@somewhere.com", list[3]);
    -            Assert.AreEqual("gilles.bayon@nospam.org", list[4]);
    -        }
    -
    -        /// 
    -        /// Test  QueryForList with simple ResultMap : string
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithSimpleResultMap()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllEmailAddressesViaResultMap", null);
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", list[0]);
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", list[1]);
    -            Assert.IsNull(list[2]);
    -            Assert.AreEqual("Jack.Dalton@somewhere.com", list[3]);
    -            Assert.AreEqual("gilles.bayon@nospam.org", list[4]);
    -        }
    -
    -        /// 
    -        /// Test QueryForListWithSkipAndMax
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithSkipAndMax()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultMap", null, 2, 2);
    -
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(3, list[0].Id);
    -            Assert.AreEqual(4, list[1].Id);
    -        }
    -
    -
    -        [Test]
    -        public void TestQueryWithRowDelegate()
    -        {
    -            _index = 0;
    -            RowDelegate handler = new RowDelegate(this.RowHandler);
    -
    -            IList list = sqlMap.QueryWithRowDelegate("GetAllAccountsViaResultMap", null, handler);
    -
    -            Assert.AreEqual(5, _index);
    -            Assert.AreEqual(5, list.Count);
    -            AssertAccount1(list[0]);
    -            Assert.AreEqual(1, list[0].Id);
    -            Assert.AreEqual(2, list[1].Id);
    -            Assert.AreEqual(3, list[2].Id);
    -            Assert.AreEqual(4, list[3].Id);
    -            Assert.AreEqual(5, list[4].Id);
    -
    -        }
    -
    -        /// 
    -        /// Test  QueryForList with constructor use on result object
    -        /// 
    -        [Test]
    -        public void TestJIRA172()
    -        {
    -            IList list = sqlMap.QueryForList("GetManyOrderWithConstructor", null);
    -
    -            Assert.IsTrue(list.Count > 0);
    -        }
    -
    -        #endregion
    -
    -        #region Row delegate
    -
    -        private int _index = 0;
    -
    -        public void RowHandler(object obj, object paramterObject, IList list)
    -        {
    -            _index++;
    -
    -            Assert.AreEqual(_index, ((Account)obj).Id);
    -            list.Add(((Account)obj));
    -        }
    -
    -        #endregion
    -
    -        #region QueryForDictionary
    -        /// 
    -        /// Test ExecuteQueryForDictionary 
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForDictionary()
    -        {
    -            IDictionary map = sqlMap.QueryForDictionary("GetAllAccountsViaResultClass", null, "FirstName");
    -
    -            Assert.AreEqual(5, map.Count);
    -            AssertAccount1(map["Joe"]);
    -
    -            Assert.AreEqual(1, map["Joe"].Id);
    -            Assert.AreEqual(2, map["Averel"].Id);
    -            Assert.AreEqual(3, map["William"].Id);
    -            Assert.AreEqual(4, map["Jack"].Id);
    -            Assert.AreEqual(5, map["Gilles"].Id);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForDictionary With Cache.
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryQueryForDictionaryWithCache()
    -        {
    -            IDictionary map = sqlMap.QueryForDictionary("GetAllAccountsCache", null, "FirstName");
    -
    -            int firstId = HashCodeProvider.GetIdentityHashCode(map);
    -
    -            Assert.AreEqual(5, map.Count);
    -            AssertAccount1(map["Joe"]);
    -
    -            Assert.AreEqual(1, map["Joe"].Id);
    -            Assert.AreEqual(2, map["Averel"].Id);
    -            Assert.AreEqual(3, map["William"].Id);
    -            Assert.AreEqual(4, map["Jack"].Id);
    -            Assert.AreEqual(5, map["Gilles"].Id);
    -
    -            map = sqlMap.QueryForDictionary("GetAllAccountsCache", null, "FirstName");
    -
    -            int secondId = HashCodeProvider.GetIdentityHashCode(map);
    -
    -            Assert.AreEqual(firstId, secondId);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForMap : Hashtable.
    -        /// 
    -        /// 
    -        /// If the keyProperty is an integer, you must acces the map
    -        /// by map[integer] and not by map["integer"]
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForDictionary2()
    -        {
    -            IDictionary map = sqlMap.QueryForDictionary("GetAllOrderWithLineItems", null, "PostalCode");
    -
    -            Assert.AreEqual(11, map.Count);
    -            Order order = map["T4H 9G4"];
    -
    -            Assert.AreEqual(2, order.LineItemsIList.Count);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForMap with value property :
    -        /// "FirstName" as key, "EmailAddress" as value
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForDictionaryWithValueProperty()
    -        {
    -            IDictionary map = sqlMap.QueryForDictionary("GetAllAccountsViaResultClass", null, "FirstName", "EmailAddress");
    -
    -            Assert.AreEqual(5, map.Count);
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", map["Joe"]);
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", map["Averel"]);
    -            Assert.IsNull(map["William"]);
    -            Assert.AreEqual("Jack.Dalton@somewhere.com", map["Jack"]);
    -            Assert.AreEqual("gilles.bayon@nospam.org", map["Gilles"]);
    -        }
    -
    -        #endregion
    -    }
    -}
    -
    -#endif
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs
    deleted file mode 100644
    index 7557057..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/GroupByTest.cs
    +++ /dev/null
    @@ -1,275 +0,0 @@
    -
    -using System.Collections;
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -using NUnit.Framework;
    -
    -using Category=IBatisNet.DataMapper.Test.Domain.Petshop.Category;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -    /// 
    -    /// Summary description for GroupByTest.
    -    /// 
    -    [TestFixture]
    -    public class GroupByTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [TestFixtureSetUp]
    -        protected override void SetUpFixture()
    -        {
    -            base.SetUpFixture();
    -
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-drop.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-schema.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "child-parent-init.sql");
    -
    -        }
    -
    -
    -        /// 
    -        /// Dispose the SqlMap
    -        /// 
    -        [TestFixtureTearDown]
    -        protected override void TearDownFixture()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-drop.sql");
    -            base.TearDownFixture();
    -        }
    -        #endregion
    -
    -#if dotnet2
    -        [Test]
    -        public void TestBobHanson ()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "groupby-schema.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "groupby-init.sql");
    -
    -            IList list = sqlMap.QueryForList("GroupByBobHanson", null);
    -            Assert.AreEqual(1, list.Count);
    -            Application application = list[0];
    -
    -            Assert.AreEqual("Admin", application.DefaultRole.Name);
    -            Assert.AreEqual(2, application.Users.Count);
    -            Assert.AreEqual("user1", application.Users[0].UserName);
    -            Assert.IsNull(application.Users[0].Address);
    -            
    -            Assert.AreEqual(1, application.Users[0].Roles.Count);
    -            Assert.AreEqual("User", application.Users[0].Roles[0].Name);
    -
    -            Assert.AreEqual(2, application.Users[1].Roles.Count);
    -            Assert.AreEqual("User", application.Users[1].Roles[1].Name);
    -            Assert.AreEqual("Admin", application.Users[1].Roles[0].Name);
    -
    -        }
    -
    -        [Test]
    -        [Category("JIRA-253")]
    -        public void Issue_When_Using_Sql_Timestamp_Data_Type()
    -        {
    -            IList parents = sqlMap.QueryForList("GetAllParentsNPlus1", null);
    -
    -            Assert.That(parents[0].Children.Count, Is.EqualTo(2));
    -            Assert.That(parents[1].Children.Count, Is.EqualTo(0));
    -        }
    -#endif
    -
    -        [Test]
    -        public void TestGroupByWithNullSon() 
    -        {
    -            IList list = sqlMap.QueryForList("GetCategories", null);
    -            Assert.AreEqual(6, list.Count);
    -        }
    -
    -        [Test]
    -        public void TestGroupBy()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllCategories", null);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -        
    -        [Test]
    -        public void TestGroupByExtended()  
    -        {
    -            IList list = sqlMap.QueryForList("GetAllCategoriesExtended", null);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        [Test]
    -        public void TestNestedProperties()
    -        {
    -            IList list = sqlMap.QueryForList("GetFish", null);
    -            Assert.AreEqual(1, list.Count);
    -
    -            Domain.Petshop.Category cat = (Domain.Petshop.Category)list[0];
    -            Assert.AreEqual("FISH", cat.Id);
    -            Assert.AreEqual("Fish", cat.Name);
    -            Assert.IsNotNull(cat.Products, "Expected product list.");
    -            Assert.AreEqual(4, cat.Products.Count);
    -
    -            Domain.Petshop.Product product = (Domain.Petshop.Product)cat.Products[0];
    -            Assert.AreEqual(2, product.Items.Count);
    -        }
    -
    -        [Test]
    -        public void TestForQueryForObject()
    -        {
    -            Domain.Petshop.Category cat = (Domain.Petshop.Category)sqlMap.QueryForObject("GetFish", null);
    -            Assert.IsNotNull(cat);
    -
    -            Assert.AreEqual("FISH", cat.Id);
    -            Assert.AreEqual("Fish", cat.Name);
    -            Assert.IsNotNull(cat.Products, "Expected product list.");
    -            Assert.AreEqual(4, cat.Products.Count);
    -
    -            Domain.Petshop.Product product = (Domain.Petshop.Product)cat.Products[0];
    -            Assert.AreEqual(2, product.Items.Count);
    -        }
    -
    -#if dotnet2
    -
    -        [Test]
    -        public void TestGenericFish()
    -        {
    -            IList list = sqlMap.QueryForList("GetFishGeneric", null);
    -            Assert.AreEqual(1, list.Count);
    -
    -            Domain.Petshop.Category cat = (Domain.Petshop.Category)list[0];
    -            Assert.AreEqual("FISH", cat.Id);
    -            Assert.AreEqual("Fish", cat.Name);
    -            Assert.IsNotNull(cat.GenericProducts, "Expected product list.");
    -            Assert.AreEqual(4, cat.GenericProducts.Count);
    -
    -            Domain.Petshop.Product product = cat.GenericProducts[0];
    -            Assert.AreEqual(2, product.GenericItems.Count);
    -        }
    -
    -        [Test]
    -        public void TestForQueryForObjectGeneric()
    -        {
    -            Domain.Petshop.Category cat = sqlMap.QueryForObject("GetFishGeneric", null);
    -            Assert.IsNotNull(cat);
    -
    -            Assert.AreEqual("FISH", cat.Id);
    -            Assert.AreEqual("Fish", cat.Name);
    -            Assert.IsNotNull(cat.GenericProducts, "Expected product list.");
    -            Assert.AreEqual(4, cat.GenericProducts.Count);
    -
    -            Domain.Petshop.Product product = cat.GenericProducts[0];
    -            Assert.AreEqual(2, product.GenericItems.Count);
    -        }
    -
    -        [Test]
    -        public void TestJira241()
    -        {
    -            Category myCategory = new Category();
    -
    -            sqlMap.QueryForObject("GetFishGeneric", null, myCategory);
    -            Assert.IsNotNull(myCategory);
    -
    -            Assert.AreEqual("FISH", myCategory.Id);
    -            Assert.AreEqual("Fish", myCategory.Name);
    -            Assert.IsNotNull(myCategory.GenericProducts, "Expected product list.");
    -            Assert.AreEqual(4, myCategory.GenericProducts.Count);
    -
    -            Domain.Petshop.Product product = myCategory.GenericProducts[0];
    -            Assert.AreEqual(2, product.GenericItems.Count);
    -        }
    -
    -        [Test]
    -        public void TestGenericList()
    -        {
    -            IList list = sqlMap.QueryForList("GetFishGeneric", null);
    -            Assert.AreEqual(1, list.Count);
    -
    -            Domain.Petshop.Category cat = list[0];
    -            Assert.AreEqual("FISH", cat.Id);
    -            Assert.AreEqual("Fish", cat.Name);
    -            Assert.IsNotNull(cat.GenericProducts, "Expected product list.");
    -            Assert.AreEqual(4, cat.GenericProducts.Count);
    -
    -            Domain.Petshop.Product product = cat.GenericProducts[0];
    -            Assert.AreEqual(2, product.GenericItems.Count);
    -        }
    -#endif
    -        
    -        [Test]
    -        public void TestGroupByNull()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllProductCategoriesJIRA250", null);
    -            Domain.Petshop.Category cat = (Domain.Petshop.Category)list[0];
    -            Assert.AreEqual(0, cat.Products.Count);
    -        }
    -        
    -        /// 
    -        /// Test Select N+1 on Order/LineItem
    -        /// 
    -        [Test]
    -        public void TestOrderLineItemGroupBy()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-drop.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -
    -            Order order = new Order();
    -            order.Id = 11;
    -            LineItem item = new LineItem();
    -            item.Id = 10;
    -            item.Code = "blah";
    -            item.Price = 44.00m;
    -            item.Quantity = 1;
    -            item.Order = order;
    -
    -            sqlMap.Insert("InsertLineItemPostKey", item);
    -
    -            
    -            IList list = sqlMap.QueryForList("GetOrderLineItem", null);
    -
    -            Assert.AreEqual(11, list.Count);
    -            
    -            order = (Order)list[0];
    -            Assert.AreEqual(3, order.LineItemsIList.Count);
    -            Assert.IsNotNull(order.Account);
    -            AssertAccount1(order.Account);
    -
    -            order = (Order)list[10];
    -            Assert.AreEqual(1, order.LineItemsIList.Count);
    -            Assert.IsNull(order.Account);
    -        }
    -
    -#if dotnet2
    -        /// 
    -        /// Test GroupBy With use of Inheritance
    -        /// 
    -        [Test]
    -        public void GroupByWithInheritance()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-drop.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "documents-init.sql");
    -
    -            IList list = sqlMap.QueryForList("JIRA206", null);
    -            
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual(0, list[0].Documents.Count);
    -            Assert.AreEqual(2, list[1].Documents.Count);
    -            Assert.AreEqual(1, list[2].Documents.Count);
    -            Assert.AreEqual(0, list[3].Documents.Count);
    -            Assert.AreEqual(2, list[4].Documents.Count);
    -
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-drop.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-schema.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "petstore-init.sql");
    -        }
    -#endif
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs
    deleted file mode 100644
    index 5ded773..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/InheritanceTest.cs
    +++ /dev/null
    @@ -1,172 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Configuration;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper; //<-- To access the definition of the deleagte RowDelegate
    -using IBatisNet.DataMapper.MappedStatements; //<-- To access the definition of the PageinatedList
    -using IBatisNet.Common;
    -using IBatisNet.Common.Exceptions;
    -
    -using IBatisNet.DataMapper.Test;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for InheritanceTest.
    -	/// 
    -	[TestFixture] 
    -	public class InheritanceTest: BaseTest
    -	{
    -
    -		#region SetUp & TearDown
    -
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "documents-init.sql" );
    -		}
    -
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Tests
    -
    -		/// 
    -		/// Test All document with no formula
    -		/// 
    -		[Test] 
    -		public void GetAllDocument() 
    -		{
    -			IList list = sqlMap.QueryForList("GetAllDocument", null);
    -
    -			Assert.AreEqual(6, list.Count);
    -			Book book = (Book) list[0];
    -			AssertBook(book, 1, "The World of Null-A", 55);
    -
    -			book = (Book) list[1];
    -			AssertBook(book, 3, "Lord of the Rings", 3587);
    -
    -			Document document = (Document) list[2];
    -			AssertDocument(document, 5, "Le Monde");
    -
    -			document = (Document) list[3];
    -			AssertDocument(document, 6, "Foundation");
    -
    -			Newspaper news = (Newspaper) list[4];
    -			AssertNewspaper(news, 2, "Le Progres de Lyon", "Lyon");
    -
    -			document = (Document) list[5];
    -			AssertDocument(document, 4, "Le Canard enchaine");
    -		}
    -
    -		/// 
    -		/// Test All document in a typed collection
    -		/// 
    -		[Test] 
    -		public void GetTypedCollection() 
    -		{
    -			DocumentCollection list = sqlMap.QueryForList("GetTypedCollection", null) as DocumentCollection;
    -
    -			Assert.AreEqual(6, list.Count);
    -
    -			Book book = (Book) list[0];
    -			AssertBook(book, 1, "The World of Null-A", 55);
    -
    -			book = (Book) list[1];
    -			AssertBook(book, 3, "Lord of the Rings", 3587);
    -
    -			Document document = list[2];
    -			AssertDocument(document, 5, "Le Monde");
    -
    -			document = list[3];
    -			AssertDocument(document, 6, "Foundation");
    -
    -			Newspaper news = (Newspaper) list[4];
    -			AssertNewspaper(news, 2, "Le Progres de Lyon", "Lyon");
    -
    -			document = list[5];
    -			AssertDocument(document, 4, "Le Canard enchaine");
    -		}
    -
    -		/// 
    -		/// Test All document with Custom Type Handler
    -		/// 
    -		[Test] 
    -		public void GetAllDocumentWithCustomTypeHandler() 
    -		{
    -			IList list = sqlMap.QueryForList("GetAllDocumentWithCustomTypeHandler", null);
    -
    -			Assert.AreEqual(6, list.Count);
    -			Book book = (Book) list[0];
    -			AssertBook(book, 1, "The World of Null-A", 55);
    -
    -			book = (Book) list[1];
    -			AssertBook(book, 3, "Lord of the Rings", 3587);
    -
    -			Newspaper news = (Newspaper) list[2];
    -			AssertNewspaper(news, 5, "Le Monde", "Paris");
    -
    -			book = (Book) list[3];
    -			AssertBook(book, 6, "Foundation", 557);
    -
    -			news = (Newspaper) list[4];
    -			AssertNewspaper(news, 2, "Le Progres de Lyon", "Lyon");
    -
    -			news = (Newspaper) list[5];
    -			AssertNewspaper(news, 4, "Le Canard enchaine", "Paris");
    -		}
    -	    
    -	    /// 
    -		/// Test Inheritance On Result Property
    -		/// 
    -        [Test]
    -        public void TestJIRA175()
    -	    {
    -            Account account = sqlMap.QueryForObject("JIRA175", 3) as Account;
    -            Assert.AreEqual(3, account.Id, "account.Id");
    -            Assert.AreEqual("William", account.FirstName, "account.FirstName");
    -	        
    -            Book book = account.Document as Book;
    -            Assert.IsNotNull(book);
    -            AssertBook(book, 3, "Lord of the Rings", 3587);
    -	    }
    -	    
    -		#endregion 
    -
    -		void AssertDocument(Document document, int id, string title)
    -		{
    -			Assert.AreEqual(id, document.Id);
    -			Assert.AreEqual(title, document.Title);
    -		}
    -
    -		void AssertBook(Book book, int id, string title, int pageNumber)
    -		{
    -			Assert.AreEqual(id, book.Id);
    -			Assert.AreEqual(title, book.Title);
    -			Assert.AreEqual(pageNumber, book.PageNumber);
    -		}
    -
    -		void AssertNewspaper(Newspaper news, int id, string title, string city)
    -		{
    -			Assert.AreEqual(id, news.Id);
    -			Assert.AreEqual(title, news.Title);
    -			Assert.AreEqual(city, news.City);
    -		}
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/EmbedParameterTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/EmbedParameterTest.cs
    deleted file mode 100644
    index 272f4c1..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/EmbedParameterTest.cs
    +++ /dev/null
    @@ -1,250 +0,0 @@
    -using System;
    -using System.Data;
    -using System.Data.SqlClient;
    -
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.MSSQL
    -{
    -	/// 
    -	/// Summary description for EmbedParameterTest.
    -	/// Test performance and sql injection using parameter values such as
    -	/// '; shutdown--
    -	/// or
    -	/// 1; shutdown--
    -	/// 
    -	[TestFixture] 
    -	[Category("MSSQL")]
    -	[Category("EmbedParameter")]
    -	public class EmbedParameterTest : BaseTest
    -	{
    -		
    -		#region SetUp & TearDown
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitSqlMap();
    -			//InitScript( sqlMap.DataSource, ScriptDirectory + "embed-param-test-init.sql", false );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific performance and sql injection tests for sql server
    -
    -		/// 
    -		/// Test GetManyRecordsBySequence.
    -		/// 
    -		[Test] 
    -		public void TestQueryBySequence()
    -		{
    -			IList list = sqlMap.QueryForList("GetManyRecordsBySequence", 91);
    -
    -			Assert.AreEqual(91, ((Sample) list[0]).SequenceId);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsBySequenceWithIndex.
    -		/// 
    -		[Test] 
    -		public void TestQueryBySequenceWithIndex()
    -		{
    -			IList list = sqlMap.QueryForList("GetManyRecordsBySequenceWithIndex", 91);
    -
    -			Assert.AreEqual(91, ((Sample) list[0]).SequenceId);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsByDistributed.
    -		/// 
    -		[Test] 
    -		public void TestQueryByDistributed()
    -		{
    -			IList list = sqlMap.QueryForList("GetManyRecordsByDistributed", 91);
    -
    -			Assert.AreEqual(91, ((Sample) list[0]).DistributedId);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsByDistributedWithIndex.
    -		/// 
    -		[Test] 
    -		public void TestQueryByDistributedWithIndex()
    -		{
    -			IList list = sqlMap.QueryForList("GetManyRecordsByDistributedWithIndex", 91);
    -
    -			Assert.AreEqual(91, ((Sample) list[0]).DistributedId);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsByFifth.
    -		/// 
    -		[Test] 
    -		public void TestQueryByFifth()
    -		{
    -			IList list = sqlMap.QueryForList("GetManyRecordsByFifth", 30000);
    -
    -			Assert.AreEqual(30000, ((Sample) list[0]).FifthId);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsByFifthOrSequence.
    -		/// 
    -		[Test] 
    -		public void TestQueryByFifthOrSequence()
    -		{
    -			Hashtable queryParams = new Hashtable();
    -			queryParams.Add("FifthId", 30000);
    -			queryParams.Add("SequenceId",  91);
    -
    -			IList list = sqlMap.QueryForList("GetManyRecordsByFifthOrSequence", queryParams);
    -
    -			Assert.IsNotNull(list);
    -			//Assert.AreEqual(30000, ((Sample) list[0]).FifthId);
    -			//Assert.AreEqual(91, ((Sample) list[0]).SequenceId);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsByDates.
    -		/// 
    -		[Test] 
    -		public void TestQueryByDates()
    -		{
    -			System.DateTime startDate = new System.DateTime(1999,1,1);
    -			System.DateTime endDate = new System.DateTime(1999,1,2);
    -
    -			Hashtable queryParams = new Hashtable();
    -			queryParams.Add("StartDate", startDate);
    -			queryParams.Add("EndDate",  endDate);
    -
    -			IList list = sqlMap.QueryForList("GetManyRecordsByDates", queryParams);
    -
    -			Assert.IsNotNull(list);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsByLikeChar.
    -		/// 
    -		[Test] 
    -		public void TestQueryByLikeChar()
    -		{
    -			IList list = sqlMap.QueryForList("GetManyRecordsByLikeChar", "AAA");
    -
    -			Assert.IsNotNull(list);
    -		}
    -
    -		/// 
    -		/// Test GetManyRecordsByChar.
    -		/// 
    -		[Test] 
    -		public void TestInjectQueryByChar()
    -		{
    -			IList list = sqlMap.QueryForList("GetManyRecordsByChar", "'; shutdown--");
    -
    -			Assert.IsNotNull(list);
    -		}
    -		
    -		#endregion
    -		
    -		[Test] 
    -		public void TestAdoPerformanceWithParameter()
    -		{
    -			string connectionString = sqlMap.DataSource.ConnectionString;
    -
    -			// Embeded Parameters
    -			using (SqlConnection connection = new SqlConnection(connectionString))
    -			{
    -				string commandText = @"SELECT 
    -					[Many_FirstID] AS FirstId, 
    -					[Many_SecondID] AS SecondId, 
    -					[Many_ThirdID] AS ThirdId, 
    -					[Many_FourthID] AS FourthId,  
    -					[Many_FifthID] AS FifthId,  
    -					[Many_SequenceID] AS SequenceId,  
    -					[Many_DistributedID] AS DistributedId, 
    -					[Many_SampleCharValue] AS SampleChar,  
    -					[Many_SampleDecimal] AS SampleDecimal, 
    -					[Many_SampleMoney] AS SampleMoney, 
    -					[Many_SampleDate] AS SampleDate, 
    -					[Many_SequenceDate] AS SequenceDate
    -				FROM 
    -					[ManyRecordsTest]
    -				WHERE 
    -					[Many_SampleDate] BETWEEN '1990/01/01' AND '1992/01/01'";
    -
    -				connection.Open();
    -
    -				using (SqlCommand command = new SqlCommand(commandText, connection))
    -				{
    -					command.CommandType = CommandType.Text;
    -
    -					long startCount = DateTime.Now.Ticks;
    -					for(int i= 0; i<50; i++)
    -					{
    -						command.ExecuteNonQuery();
    -					}
    -					long endCount = DateTime.Now.Ticks;
    -					Console.Write("Embeded Parameters : ");
    -					Console.Write(endCount-startCount);
    -					Console.WriteLine();
    -				}
    -			}
    -
    -			// Using Parameter
    -			using (SqlConnection connection = new SqlConnection(connectionString))
    -			{
    -				string commandText = @"SELECT 
    -					[Many_FirstID] AS FirstId, 
    -					[Many_SecondID] AS SecondId, 
    -					[Many_ThirdID] AS ThirdId, 
    -					[Many_FourthID] AS FourthId,  
    -					[Many_FifthID] AS FifthId,  
    -					[Many_SequenceID] AS SequenceId,  
    -					[Many_DistributedID] AS DistributedId, 
    -					[Many_SampleCharValue] AS SampleChar,  
    -					[Many_SampleDecimal] AS SampleDecimal, 
    -					[Many_SampleMoney] AS SampleMoney, 
    -					[Many_SampleDate] AS SampleDate, 
    -					[Many_SequenceDate] AS SequenceDate
    -				FROM 
    -					[ManyRecordsTest]
    -				WHERE 
    -					[Many_SampleDate] BETWEEN @date1 AND @date2";
    -
    -				connection.Open();
    -
    -				using (SqlCommand command = new SqlCommand(commandText, connection))
    -				{
    -					command.CommandType = CommandType.Text;
    -					command.Parameters.Add ( "@date1", new DateTime(1990,1,1)) ;
    -					command.Parameters.Add ( "@date2", new DateTime(1992,1,1)) ;
    -
    -					long startCount = DateTime.Now.Ticks;
    -					for(int i= 0; i<50; i++)
    -					{
    -						command.ExecuteNonQuery();
    -					}
    -					long endCount = DateTime.Now.Ticks;
    -					Console.Write("Parameter : ");
    -					Console.Write(endCount-startCount);
    -				}
    -			}
    -
    -		}
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/Generics/StatementTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/Generics/StatementTest.cs
    deleted file mode 100644
    index 1cc970d..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/Generics/StatementTest.cs
    +++ /dev/null
    @@ -1,212 +0,0 @@
    -#if dotnet2
    -using System;
    -using System.Collections;
    -using System.Collections.Generic;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.MSSQL.Generics
    -{
    -	/// 
    -	/// Summary description for StatementTest.
    -	/// 
    -	[TestFixture] 
    -	[Category("MSSQL")]
    -	public class StatementTest : BaseTest
    -	{
    -		
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "ps_SelectAccount.sql", false );
    -
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "order-init.sql" );
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "ps_SelectLineItem.sql", false);
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement test for sql server
    -
    -		/// 
    -		/// Test Insert Account via store procedure
    -		/// 
    -		[Test]
    -        public void GenericTestInsertAccountViaStoreProcedure() 
    -		{
    -            try
    -            {
    -                Account account = new Account();
    -
    -                account.Id = 99;
    -                account.FirstName = "Achille";
    -                account.LastName = "Talon";
    -                account.EmailAddress = "Achille.Talon@somewhere.com";
    -
    -                sqlMap.Insert("InsertAccountViaStoreProcedure", account);
    -
    -                Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnName", 99);
    -
    -                Assert.IsNotNull(testAccount);
    -                Assert.AreEqual(99, testAccount.Id);
    -            }
    -            catch (NotSupportedException)
    -            {
    -                Assert.Ignore("Current DbProvider does not support stored procedures");
    -            }
    -		}
    -
    -		/// 
    -		/// Test statement with properties subtitutions
    -		/// (Test for IBATISNET-21 : Property substitutions do not occur inside selectKey statement)
    -		/// 
    -		[Test] 
    -		public void GenericTestInsertCategoryWithProperties()
    -		{
    -			Category category = new Category();
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryWithProperties", category);
    -
    -            Category categoryTest = sqlMap.QueryForObject("GetCategory", key);
    -			Assert.AreEqual(key, categoryTest.Id);
    -			Assert.AreEqual("Film", categoryTest.Name);
    -			Assert.AreEqual(category.Guid, categoryTest.Guid);
    -		}
    -
    -		/// 
    -		/// Test guid column/field.
    -		/// 
    -		[Test]
    -        public void GenericTestGuidColumn()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategory", category);
    -
    -			Category categoryTest = sqlMap.QueryForObject("GetCategory", key);
    -			Assert.AreEqual(key, categoryTest.Id);
    -			Assert.AreEqual(category.Name, categoryTest.Name);
    -			Assert.AreEqual(category.Guid, categoryTest.Guid);
    -		}
    -
    -		/// 
    -		/// Test guid column/field through parameterClass.
    -		/// 
    -		[Test]
    -        public void GenericTestGuidColumnParameterClass()
    -        {
    -			Guid newGuid = Guid.NewGuid();
    -			int key = (int)sqlMap.Insert("InsertCategoryGuidParameterClass", newGuid);
    -
    -			Category categoryTest = sqlMap.QueryForObject("GetCategory", key);
    -			Assert.AreEqual(key, categoryTest.Id);
    -			Assert.AreEqual("toto", categoryTest.Name);
    -			Assert.AreEqual(newGuid, categoryTest.Guid);
    -		}
    -
    -		/// 
    -		/// Test guid column/field through parameterClass without specifiyng dbType
    -		/// 
    -		[Test]
    -        public void GenericTestGuidColumnParameterClassJIRA20() 
    -		{
    -			Guid newGuid = Guid.NewGuid();
    -			int key = (int)sqlMap.Insert("InsertCategoryGuidParameterClassJIRA20", newGuid);
    -
    -			Category categoryTest = sqlMap.QueryForObject("GetCategory", key);
    -			Assert.AreEqual(key, categoryTest.Id);
    -			Assert.AreEqual("toto", categoryTest.Name);
    -			Assert.AreEqual(newGuid, categoryTest.Guid);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test]
    -        public void GenericTestUpdateCategoryWithExtendParameterMap()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryViaParameterMap", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -
    -		/// 
    -		/// Test select via store procedure
    -		/// 
    -		[Test]
    -        public void GenericTestSelect()
    -		{
    -            try
    -            {
    -                Order order = sqlMap.QueryForObject("GetOrderWithAccountViaSP", 1);
    -                AssertOrder1(order);
    -                AssertAccount1(order.Account);
    -            }
    -            catch (NotSupportedException)
    -            {
    -                Assert.Ignore("Current DbProvider does not support stored procedures");
    -            }
    -		}
    -
    -        /// 
    -        /// Test generic Collection via store procedure
    -        /// 
    -        [Test]
    -        public void TestGenericCollectionMappingViaSP()
    -        {
    -            try
    -            {
    -                Order order = sqlMap.QueryForObject("GetOrderWithGenericViaSP", 1);
    -
    -                AssertOrder1(order);
    -
    -                // Check generic collection
    -                Assert.IsNotNull(order.LineItemsCollection);
    -                Assert.AreEqual(3, order.LineItemsCollection.Count);
    -            }
    -            catch (NotSupportedException)
    -            {
    -                Assert.Ignore("Current DbProvider does not support stored procedures");
    -            }
    -        }
    -		#endregion
    -	}
    -}
    -#endif
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/ProcedureTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/ProcedureTest.cs
    deleted file mode 100644
    index 08d82bf..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/ProcedureTest.cs
    +++ /dev/null
    @@ -1,239 +0,0 @@
    -using System;
    -using System.Collections;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.MSSQL
    -{
    -	/// 
    -	/// Summary description for ProcedureTest.
    -	/// 
    -	[TestFixture] 
    -	[Category("MSSQL")]
    -	public class ProcedureTest : BaseTest
    -	{
    -		
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-procedure.sql" );		
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );	
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false );
    -            InitScript( sqlMap.DataSource, ScriptDirectory + "category-procedureWithReturn.sql", false);
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "ps_SelectAccount.sql", false );
    -            InitScript( sqlMap.DataSource, ScriptDirectory + "ps_SelectAllAccount.sql", false);			    
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "swap-procedure.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement store procedure tests for sql server
    -
    -#if dotnet2
    -	    /// 
    -        /// Test an insert with via a store procedure and getting the generatedKey from a t-sql return statement
    -        /// 
    -        [Test]
    -        public void InsertTestIdentityViaProcedureWithReturn ( )
    -        {
    -            Category category = new Category ( );
    -            category.Name = "Mapping object relational";
    -
    -            int categoryID = ( int ) sqlMap.Insert ( "InsertCategoryViaStoreProcedureWithReturn", category );
    -            Assert.That(categoryID, Is.EqualTo(1));
    -            Assert.That(category.Id, Is.EqualTo(1));
    -
    -            Category category2 = new Category ( );
    -            category2.Name = "Nausicaa";
    -
    -            int categoryID2 = ( int ) sqlMap.Insert ( "InsertCategoryViaStoreProcedureWithReturn", category2 );
    -            Assert.That(categoryID2, Is.EqualTo(2));
    -            Assert.That(category2.Id, Is.EqualTo(2));
    -
    -            Category category3 = sqlMap.QueryForObject ( "GetCategory", categoryID2 ) ;
    -            Category category4 = sqlMap.QueryForObject ( "GetCategory", categoryID );
    -            
    -            Assert.AreEqual ( categoryID2, category3.Id );
    -            Assert.AreEqual ( category2.Name, category3.Name );
    -
    -            Assert.AreEqual ( categoryID, category4.Id );
    -            Assert.AreEqual ( category.Name, category4.Name );
    -        }
    -#endif
    -
    -        /// 
    -        /// Test XML parameter.
    -        /// 
    -        [Test]
    -        [Category("MSSQL.2005")]
    -        public void TestXMLParameter()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "ps_SelectByIdList.sql");	
    -
    -            string accountIds = "34";
    -
    -            IList accounts = sqlMap.QueryForList("SelectAccountViaXML", accountIds);
    -            Assert.IsTrue(accounts.Count == 2);
    -        }
    -
    -        /// 
    -        /// Test get an account via a store procedure.
    -        /// 
    -        [Test]
    -        public void GetAllAccountViaProcedure()
    -        {
    -            IList accounts = sqlMap.QueryForList("SelectAllAccountViaSP", null);
    -            Assert.IsTrue( accounts.Count==5);
    -        }
    -	    
    -		/// 
    -		/// Test get an account via a store procedure.
    -		/// 
    -		[Test] 
    -		public void GetAccountViaProcedure0()
    -		{
    -			Account account = sqlMap.QueryForObject("GetAccountViaSP0", 1) as Account;
    -			Assert.AreEqual(1, account.Id );
    -		}
    -		
    -		/// 
    -		/// Test get an account via a store procedure.
    -		/// 
    -		[Test] 
    -		public void GetAccountViaProcedure1()
    -		{
    -			Account account = sqlMap.QueryForObject("GetAccountViaSP1", 1) as Account;
    -			Assert.AreEqual(1, account.Id );
    -		}
    -		
    -		/// 
    -		/// Test get an account via a store procedure.
    -		/// 
    -		[Test] 
    -		public void GetAccountViaProcedure2()
    -		{
    -			Hashtable hash = new Hashtable();
    -			hash.Add("Account_ID",1);
    -			Account account = sqlMap.QueryForObject("GetAccountViaSP2", hash) as Account;
    -			Assert.AreEqual(1, account.Id );
    -		}
    -		
    -		/// 
    -		/// Test an insert with identity key via a store procedure.
    -		/// 
    -		[Test] 
    -		public void InsertTestIdentityViaProcedure()
    -		{
    -			Category category = new Category();
    -			category.Name = "Mapping object relational";
    -
    -			sqlMap.Insert("InsertCategoryViaStoreProcedure", category);
    -			Assert.AreEqual(1, category.Id );
    -
    -			category = new Category();
    -			category.Name = "Nausicaa";
    -
    -			sqlMap.QueryForObject("InsertCategoryViaStoreProcedure", category);
    -			Assert.AreEqual(2, category.Id );
    -		}
    -
    -		/// 
    -		/// Test store procedure with output parameters
    -		/// 
    -		[Test]
    -		public void TestProcedureWithOutputParameters() 
    -		{
    -			string first = "Joe.Dalton@somewhere.com";
    -			string second = "Averel.Dalton@somewhere.com";
    -
    -			Hashtable map = new Hashtable();
    -			map.Add("email1", first);
    -			map.Add("email2", second);
    -
    -			sqlMap.QueryForObject("SwapEmailAddresses", map);
    -
    -			Assert.AreEqual(first, map["email2"]);
    -			Assert.AreEqual(second, map["email1"]);
    -		}
    -
    -		/// 
    -		/// Test store procedure with input parameters
    -		/// passe via Hashtable
    -		/// 
    -		[Test]
    -		public void TestProcedureWithInputParametersViaHashtable() 
    -		{
    -			Hashtable map = new Hashtable();
    -			map.Add("Id", 0);
    -			map.Add("Name", "Toto");
    -			map.Add("Guid", Guid.NewGuid());
    -
    -			sqlMap.Insert("InsertCategoryViaStoreProcedureWithMap", map);
    -			Assert.AreEqual(1, map["Id"] );
    -
    -		}
    -
    -		/// 
    -		/// Test Insert Account via store procedure
    -		/// 
    -		[Test] 
    -		public void TestInsertAccountViaStoreProcedure() {
    -			Account account = new Account();
    -
    -			account.Id = 99;
    -			account.FirstName = "Achille";
    -			account.LastName = "Talon";
    -			account.EmailAddress = "Achille.Talon@somewhere.com";
    -
    -			sqlMap.Insert("InsertAccountViaStoreProcedure", account);
    -
    -			Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnName", 99) as Account;
    -
    -			Assert.IsNotNull(testAccount);
    -			Assert.AreEqual(99, testAccount.Id);
    -		}
    -
    -        /// 
    -        /// Test DBHelperParameterCache in transaction
    -        /// 
    -        [Test]
    -        public void TestDBHelperParameterCache()
    -        {
    -            Account account = new Account();
    -
    -            account.Id = 99;
    -            account.FirstName = "Achille";
    -            account.LastName = "Talon";
    -            account.EmailAddress = "Achille.Talon@somewhere.com";
    -
    -            sqlMap.BeginTransaction();
    -            sqlMap.Insert("InsertAccountViaStoreProcedure", account);
    -
    -            Hashtable map = new Hashtable();
    -            map.Add("Id", 0);
    -            map.Add("Name", "Toto");
    -            map.Add("Guid", Guid.NewGuid());
    -
    -            sqlMap.Insert("InsertCategoryViaStoreProcedureWithMap", map);
    -            Assert.AreEqual(1, map["Id"]);
    -
    -            sqlMap.CommitTransaction();
    -
    -        }
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementGenerate.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementGenerate.cs
    deleted file mode 100644
    index 55e2fe7..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementGenerate.cs
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.MSSQL
    -{
    -	/// 
    -	/// Summary description for StatementGenerate.
    -	/// 
    -	[TestFixture] 
    -	[Category("MSSQL")]
    -	public class StatementGenerate : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement test for sql server
    -
    -		/// 
    -		/// Test an select by key via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectByPK()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			category.Id = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, category.Id);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("SelectByPKCategoryGenerate", category);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -
    -		/// 
    -		/// Test an select all via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectAll()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(2, key);
    -
    -			IList categorieList = sqlMap.QueryForList("SelectAllCategoryGenerate",null) as IList;
    -			Assert.AreEqual(2, categorieList.Count);
    -            Assert.AreEqual("toto", ((Category)categorieList[0]).Name); 
    -		}
    -
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestInsert()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test] 
    -		public void TestUpdate()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -		
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestDelete()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -			Assert.AreEqual(1, category.Id);
    -			
    -			sqlMap.Delete("DeleteCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = sqlMap.QueryForObject("GetCategory", key) as Category;
    -
    -			Assert.IsNull(categoryRead);
    -		}
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementTest.cs
    deleted file mode 100644
    index 999bb07..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MSSQL/StatementTest.cs
    +++ /dev/null
    @@ -1,221 +0,0 @@
    -using System;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.MSSQL
    -{
    -    /// 
    -    /// Summary description for StatementTest.
    -    /// 
    -    [TestFixture]
    -    [Category("MSSQL")]
    -    public class StatementTest : BaseTest
    -    {
    -        #region Setup/Teardown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false);
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "ps_SelectAccount.sql", false);
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "category-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        {
    -            /* ... */
    -        }
    -
    -        #endregion
    -
    -        /// 
    -        /// Test guid column/field.
    -        /// 
    -        [Test]
    -        public void TestGuidColumn()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int) sqlMap.Insert("InsertCategory", category);
    -
    -            Category categoryTest = (Category) sqlMap.QueryForObject("GetCategory", key);
    -            Assert.AreEqual(key, categoryTest.Id);
    -            Assert.AreEqual(category.Name, categoryTest.Name);
    -            Assert.AreEqual(category.Guid, categoryTest.Guid);
    -        }
    -
    -        /// 
    -        /// Test guid column/field through parameterClass.
    -        /// 
    -        [Test]
    -        public void TestGuidColumnParameterClass()
    -        {
    -            Guid newGuid = Guid.NewGuid();
    -            int key = (int) sqlMap.Insert("InsertCategoryGuidParameterClass", newGuid);
    -
    -            Category categoryTest = (Category)sqlMap.QueryForObject("GetCategory", key);
    -            Assert.AreEqual(key, categoryTest.Id);
    -            Assert.AreEqual("toto", categoryTest.Name);
    -            Assert.AreEqual(newGuid, categoryTest.Guid);
    -        }
    -
    -        /// 
    -        /// Test guid column/field through parameterClass without specifiyng dbType
    -        /// 
    -        [Test]
    -        public void TestGuidColumnParameterClassJIRA20()
    -        {
    -            Guid newGuid = Guid.NewGuid();
    -            int key = (int) sqlMap.Insert("InsertCategoryGuidParameterClassJIRA20", newGuid);
    -
    -            Category categoryTest = (Category)sqlMap.QueryForObject("GetCategory", key);
    -            Assert.AreEqual(key, categoryTest.Id);
    -            Assert.AreEqual("toto", categoryTest.Name);
    -            Assert.AreEqual(newGuid, categoryTest.Guid);
    -        }
    -
    -        /// 
    -        /// Test Insert Account via store procedure
    -        /// 
    -        [Test]
    -        public void TestInsertAccountViaStoreProcedure()
    -        {
    -            Account account = new Account();
    -
    -            account.Id = 99;
    -            account.FirstName = "Achille";
    -            account.LastName = "Talon";
    -            account.EmailAddress = "Achille.Talon@somewhere.com";
    -
    -            sqlMap.Insert("InsertAccountViaStoreProcedure", account);
    -
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnName", 99) as Account;
    -
    -            Assert.IsNotNull(testAccount);
    -            Assert.AreEqual(99, testAccount.Id);
    -        }
    -
    -        /// 
    -        /// Test an insert using SCOPE_IDENTITY.
    -        /// 
    -        [Test]
    -        public void TestInsertCategoryScope()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.NewGuid();
    -
    -            sqlMap.QueryForObject("InsertCategoryScope", category, category);
    -            Assert.That(category.Id, Is.EqualTo(1));
    -        }
    -
    -        /// 
    -        /// Test Insert Category Via ParameterMap.
    -        /// 
    -        [Test]
    -        public void TestInsertCategoryViaParameterMap()
    -        {
    -            Category category = new Category();
    -            category.Name = "Cat";
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int) sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -            Assert.AreEqual(1, key);
    -        }
    -
    -        /// 
    -        /// Test statement with properties subtitutions
    -        /// (Test for IBATISNET-21 : Property substitutions do not occur inside selectKey statement)
    -        /// 
    -        [Test]
    -        public void TestInsertCategoryWithProperties()
    -        {
    -            Category category = new Category();
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int) sqlMap.Insert("InsertCategoryWithProperties", category);
    -
    -            Category categoryTest = sqlMap.QueryForObject("GetCategory", key) as Category;
    -            Assert.AreEqual(key, categoryTest.Id);
    -            Assert.AreEqual("Film", categoryTest.Name);
    -            Assert.AreEqual(category.Guid, categoryTest.Guid);
    -        }
    -
    -        /// 
    -        /// Test an insert with identity key.
    -        /// 
    -        [Test]
    -        public void TestInsertIdentityViaInsertQuery()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int)sqlMap.Insert("InsertCategory", category);
    -            Assert.AreEqual(1, key);
    -        }
    -
    -        /// 
    -        /// Test Insert Via Insert Statement.
    -        /// (Test for IBATISNET-21 : Property substitutions do not occur inside selectKey statement)
    -        /// 
    -        [Test]
    -        public void TestInsertViaInsertStatement()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int)sqlMap.Insert("InsertCategoryViaInsertStatement", category);
    -            Assert.AreEqual(1, key);
    -        }
    -
    -        /// 
    -        /// Test select via store procedure
    -        /// 
    -        [Test]
    -        public void TestSelect()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithAccountViaSP", 1);
    -            AssertOrder1(order);
    -            AssertAccount1(order.Account);
    -        }
    -
    -        /// 
    -        /// Test Update Category with Extended ParameterMap
    -        /// 
    -        [Test]
    -        public void TestUpdateCategoryWithExtendParameterMap()
    -        {
    -            Category category = new Category();
    -            category.Name = "Cat";
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -            category.Id = key;
    -
    -            category.Name = "Dog";
    -            category.Guid = Guid.NewGuid();
    -
    -            sqlMap.Update("UpdateCategoryViaParameterMap", category);
    -
    -            Category categoryRead = null;
    -            categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -            Assert.AreEqual(category.Id, categoryRead.Id);
    -            Assert.AreEqual(category.Name, categoryRead.Name);
    -            Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -        }
    -    }
    -}
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ModuleTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ModuleTest.cs
    deleted file mode 100644
    index def0612..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ModuleTest.cs
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -using System.IO;
    -using System.Threading;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper.Configuration.Cache;
    -using IBatisNet.DataMapper.MappedStatements;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for ParameterMapTest.
    -	/// 
    -	[TestFixture] 
    -	public class ModuleTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void SetUp() 
    -		{
    -			InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql" );
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false);
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void TearDown()
    -		{
    -		    string path = ScriptDirectory + "teardown.sql";
    -            // does a teardown exist?
    -            if ((!File.Exists(path)) || (new FileInfo(path).Length == 0))
    -            {
    -                return;
    -            }
    -            InitScript(sqlMap.DataSource, path);
    -        } 
    -
    -		#endregion
    -
    -		#region Test cache
    -
    -        [Test]
    -        public void Module_Selects_With_ResultMap_Should_work()
    -        {
    -            Order order = sqlMap.QueryForObject("GetOrderWithGenericListLineItemViaModule", 1);
    -
    -            AssertOrder1(order);
    -
    -            // Check generic IList collection
    -            Assert.IsNotNull(order.LineItemsGenericList);
    -            Assert.AreEqual(3, order.LineItemsGenericList.Count);
    -        }
    -
    -		#endregion
    -
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MultipleResultTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MultipleResultTest.cs
    deleted file mode 100644
    index 6b27bf8..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MultipleResultTest.cs
    +++ /dev/null
    @@ -1,136 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -#if dotnet2
    -using System.Collections.Generic;
    -#endif
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -    /// 
    -    /// Summary description for ParameterMapTest.
    -    /// 
    -    [TestFixture]
    -    public class MultipleResultTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "category-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "documents-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        { /* ... */
    -        }
    -
    -        #endregion
    -
    -
    -        /// 
    -        /// Test Multiple ResultMaps
    -        /// 
    -        [Test]
    -        public void TestMultipleResultMapsWithInList()
    -        {
    -            IList accounts = new ArrayList();
    -            sqlMap.QueryForList("GetMultipleResultMapAccount", null, accounts);
    -            Assert.AreEqual(2, accounts.Count);
    -        }
    -
    -        /// 
    -        /// Test Multiple ResultMaps
    -        /// 
    -        [Test]
    -        public void TestMultipleAccountResultMap()
    -        {
    -            Assert.AreEqual(2, sqlMap.QueryForList("GetMultipleResultMapAccount", null).Count);
    -        }
    -
    -        /// 
    -        /// Test Multiple ResultMaps
    -        /// 
    -        [Test]
    -        public void TestMultipleResultClassWithInList()
    -        {
    -            IList accounts = new ArrayList();
    -            sqlMap.QueryForList("GetMultipleResultClassAccount", null, accounts);
    -            Assert.AreEqual(2, accounts.Count);
    -        }
    -
    -        /// 
    -        /// Test Multiple Result class
    -        /// 
    -        [Test]
    -        public void TestMultipleAccountResultClass()
    -        {
    -            Assert.AreEqual(2, sqlMap.QueryForList("GetMultipleResultClassAccount", null).Count);
    -        }
    -
    -        /// 
    -        /// Test Multiple ResultMaps
    -        /// 
    -        [Test]
    -        public void TestMultipleResultMap()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int)sqlMap.Insert("InsertCategory", category);
    -            IList list = sqlMap.QueryForList("GetMultipleResultMap", null);
    -            
    -            Assert.AreEqual(2, list.Count);
    -            
    -            Account account = list[0] as Account;
    -            Category saveCategory = list[01] as Category;
    -            AssertAccount1(account);
    -            Assert.AreEqual(key, saveCategory.Id);
    -            Assert.AreEqual(category.Name, saveCategory.Name);
    -            Assert.AreEqual(category.Guid, saveCategory.Guid);
    -        }
    -
    -        /// 
    -        /// Test Multiple Result class
    -        /// 
    -        [Test]
    -        public void TestMultipleResultClass()
    -        {
    -            Category category = new Category();
    -            category.Name = "toto";
    -            category.Guid = Guid.NewGuid();
    -
    -            int key = (int)sqlMap.Insert("InsertCategory", category);
    -
    -            IList list = sqlMap.QueryForList("GetMultipleResultClass", null);
    -            Assert.AreEqual(2, list.Count);
    -        }
    -
    -#if dotnet2
    -        
    -        /// 
    -        /// Test Multiple Document
    -        /// 
    -        [Test]
    -        public void TestMultipleDocument()
    -        {
    -            IList list = sqlMap.QueryForList("GetMultipleDocument", null);
    -
    -            Assert.AreEqual(3, list.Count);
    -        }
    -#endif        
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementGenerate.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementGenerate.cs
    deleted file mode 100644
    index 6712ebe..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementGenerate.cs
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.MySql
    -{
    -	/// 
    -	/// Summary description for StatementGenerate.
    -	/// 
    -	[TestFixture] 
    -	[Category("MySql")]
    -	public class StatementGenerate : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement test for MySql
    -
    -		/// 
    -		/// Test an select by key via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectByPK()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			category.Id = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, category.Id);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("SelectByPKCategoryGenerate", category);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -
    -		/// 
    -		/// Test an select all via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectAll()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(2, key);
    -
    -			IList categorieList = sqlMap.QueryForList("SelectAllCategoryGenerate",null) as IList;
    -			Assert.AreEqual(2, categorieList.Count);
    -
    -		}
    -
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestInsert()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.Empty;
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test] 
    -		public void TestUpdate()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -		
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestDelete()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -			Assert.AreEqual(1, category.Id);
    -			
    -			sqlMap.Delete("DeleteCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = sqlMap.QueryForObject("GetCategory", key) as Category;
    -
    -			Assert.IsNull(categoryRead);
    -		}
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementTest.cs
    deleted file mode 100644
    index fc8dc83..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/MySql/StatementTest.cs
    +++ /dev/null
    @@ -1,130 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.MySql
    -{
    -	/// 
    -	/// Summary description for StatementTest.
    -	/// 
    -	[TestFixture] 
    -	[Category("MySql")]
    -	public class StatementTest : BaseTest
    -	{
    -		
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific tests for MySql
    -
    -		/// 
    -		/// Test an insert with an autonumber key.
    -		/// 
    -		[Test] 
    -		public void TestInsertAutonumberViaInsertQuery()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategory", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Insert Via Insert Statement.
    -		/// 
    -		[Test] 
    -		public void TestInsertViaInsertStatement()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaInsertStatement", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test guid column/field.
    -		/// 
    -		[Test] 
    -		public void TestGuidColumn()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaInsertStatement", category);
    -
    -			Category categoryTest = (Category)sqlMap.QueryForObject("GetCategory", key);
    -			Assert.AreEqual(key, categoryTest.Id);
    -			Assert.AreEqual(category.Name, categoryTest.Name);
    -			Assert.AreEqual(category.Guid, categoryTest.Guid);
    -		}
    -
    -		/// 
    -		/// Test Insert Category Via ParameterMap.
    -		/// 
    -		[Test] 
    -		public void TestInsertCategoryViaParameterMap()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test] 
    -		public void TestUpdateCategoryWithExtendParameterMap()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryViaParameterMap", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -		#endregion
    -
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/ProcedureTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/ProcedureTest.cs
    deleted file mode 100644
    index 2cdbce5..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/ProcedureTest.cs
    +++ /dev/null
    @@ -1,162 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Oracle
    -{
    -	/// 
    -	/// Summary description for ProcedureTest.
    -	/// 
    -	[TestFixture] 
    -	[Category("Oracle")]
    -	public class ProcedureTest : BaseTest
    -	{
    -		
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-procedure.sql", false );		
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );	
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "swap-procedure.sql", false );	
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-refcursor-package-spec.sql", false );	
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-refcursor-package-body.sql", false );	
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement store procedure tests for oracle
    -
    -		/// 
    -		/// Test an insert with sequence key via a store procedure.
    -		/// 
    -		[Test] 
    -		public void InsertTestSequenceViaProcedure()
    -		{
    -			Category category = new Category();
    -			category.Name = "Mapping object relational";
    -
    -			sqlMap.Insert("InsertCategoryViaStoreProcedure", category);
    -			Assert.AreEqual(1, category.Id );
    -
    -			category = new Category();
    -			category.Name = "Nausicaa";
    -
    -			sqlMap.Insert("InsertCategoryViaStoreProcedure", category);
    -			Assert.AreEqual(2, category.Id );
    -		}
    -
    -		/// 
    -		/// Test store procedure with output parameters
    -		/// 
    -		[Test]
    -		public void TestProcedureWithOutputParameters() 
    -		{
    -			string first = "Joe.Dalton@somewhere.com";
    -			string second = "Averel.Dalton@somewhere.com";
    -
    -			Hashtable map = new Hashtable();
    -			map.Add("email1", first);
    -			map.Add("email2", second);
    -
    -			sqlMap.QueryForObject("SwapEmailAddresses", map);
    -
    -			Assert.AreEqual(first, map["email2"].ToString());
    -			Assert.AreEqual(second, map["email1"].ToString());
    -		}
    -
    -		/// 
    -		/// Test store procedure with input parameters
    -		/// passe via Hashtable
    -		/// 
    -		[Test]
    -		public void TestProcedureWithInputParametersViaHashtable() 
    -		{
    -			Hashtable map = new Hashtable();
    -			map.Add("Id", 0);
    -			map.Add("Name", "Toto");
    -			map.Add("GuidString", Guid.NewGuid().ToString());
    -
    -			sqlMap.Insert("InsertCategoryViaStoreProcedure", map);
    -			Assert.AreEqual(1, map["Id"] );
    -
    -		}
    -
    -		/// 
    -		/// Test Insert Account via store procedure
    -		/// 
    -		[Test] 
    -		public void TestInsertAccountViaStoreProcedure() {
    -			Account account = new Account();
    -
    -			account.Id = 99;
    -			account.FirstName = "Achille";
    -			account.LastName = "Talon";
    -			account.EmailAddress = "Achille.Talon@somewhere.com";
    -
    -			sqlMap.Insert("InsertAccountViaStoreProcedure", account);
    -
    -			Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnName", 99) as Account;
    -
    -			Assert.IsNotNull(testAccount);
    -			Assert.AreEqual(99, testAccount.Id);
    -		}
    -
    -		/// 
    -		/// Test QueryForList with Ref Cursor.
    -		/// 
    -		[Test]
    -		public void QueryForListWithRefCursor()
    -		{
    -			Hashtable param = new Hashtable();
    -			param.Add("P_ACCOUNTS",null);
    -
    -			IList list = sqlMap.QueryForList("GetAllAccountsViaStoredProcRefCursor", param);
    -
    -			Assert.AreEqual(5, list.Count);
    -			AssertAccount1((Account) list[0]);
    -			Assert.AreEqual(2, ((Account) list[1]).Id);
    -			Assert.AreEqual("Averel", ((Account) list[1]).FirstName);
    -			Assert.AreEqual(3, ((Account) list[2]).Id);
    -			Assert.AreEqual("William", ((Account) list[2]).FirstName);
    -			Assert.AreEqual(4, ((Account) list[3]).Id);
    -			Assert.AreEqual("Jack", ((Account) list[3]).FirstName);
    -			Assert.AreEqual(5, ((Account) list[4]).Id);
    -			Assert.AreEqual("Gilles", ((Account) list[4]).FirstName);
    -		}
    -
    -		/// 
    -		/// Test QueryForList with Ref Cursor and Input.
    -		/// 
    -		[Test]
    -		public void QueryForListWithRefCursorAndInput()
    -		{
    -			Hashtable param = new Hashtable();
    -			param.Add("P_ACCOUNTS",null);
    -			param.Add("P_ACCOUNT_ID",1);
    -
    -			IList list = sqlMap.QueryForList("GetAccountViaStoredProcRefCursor", param);
    -
    -			Assert.AreEqual(1, list.Count);
    -			AssertAccount1((Account) list[0]);
    -		}		
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementGenerate.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementGenerate.cs
    deleted file mode 100644
    index ca7d276..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementGenerate.cs
    +++ /dev/null
    @@ -1,154 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Oracle
    -{
    -	/// 
    -	/// Summary description for StatementGenerate.
    -	/// 
    -	[TestFixture] 
    -	[Category("Oracle")]
    -	public class StatementGenerate : BaseTest
    -	{
    -		#region SetUp & TearDown
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement test for Oracle
    -
    -		/// 
    -		/// Test a select by key via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectByPK()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			category.Id = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, category.Id);
    -
    -			// Workaround!
    -			// Null out unneeded properties, otherwise those property values will be added
    -			// as command parameters for the auto-generated SELECT query even if
    -			// only 1 parameter for Id is needed.
    -			category.Name = null;
    -			category.Guid = Guid.Empty;
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("SelectByPKCategoryGenerate", category);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -
    -		/// 
    -		/// Test an select all via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectAll()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(2, key);
    -
    -			IList categorieList = sqlMap.QueryForList("SelectAllCategoryGenerate",null) as IList;
    -			Assert.AreEqual(2, categorieList.Count);
    -
    -		}
    -
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestInsert()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.Empty;
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test] 
    -		public void TestUpdate()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -		
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestDelete()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -			Assert.AreEqual(1, category.Id);
    -			
    -			sqlMap.Delete("DeleteCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = sqlMap.QueryForObject("GetCategory", key) as Category;
    -
    -			Assert.IsNull(categoryRead);
    -		}
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementTest.cs
    deleted file mode 100644
    index 478897c..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Oracle/StatementTest.cs
    +++ /dev/null
    @@ -1,129 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Oracle
    -{
    -	/// 
    -	/// Summary description for StatementTest.
    -	/// 
    -	[TestFixture] 
    -	[Category("Oracle")]
    -	public class StatementTest : BaseTest
    -	{
    -		
    -		#region SetUp & TearDown
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific tests for Oracle
    -
    -		/// 
    -		/// Test an insert with sequence key.
    -		/// 
    -		[Test] 
    -		public void TestInsertSequenceViaInsertQuery()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategory", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Insert Via Insert Statement.
    -		/// 
    -		[Test] 
    -		public void TestInsertViaInsertStatement()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaInsertStatement", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test guid column/field.
    -		/// 
    -		[Test] 
    -		public void TestGuidColumn()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaInsertStatement", category);
    -
    -			Category categoryTest = (Category)sqlMap.QueryForObject("GetCategory", key);
    -			Assert.AreEqual(key, categoryTest.Id);
    -			Assert.AreEqual(category.Name, categoryTest.Name);
    -			Assert.AreEqual(category.Guid, categoryTest.Guid);
    -		}
    -
    -		/// 
    -		/// Test Insert Category Via ParameterMap.
    -		/// 
    -		[Test] 
    -		public void TestInsertCategoryViaParameterMap()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test] 
    -		public void TestUpdateCategoryWithExtendParameterMap()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryViaParameterMap", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -		#endregion
    -
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterClass.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterClass.cs
    deleted file mode 100644
    index c2efa5c..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterClass.cs
    +++ /dev/null
    @@ -1,28 +0,0 @@
    -using System;
    -using System.Collections;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for ResultClassTest.
    -	/// 
    -	[TestFixture] 
    -	public class ParameterClass : BaseTest
    -	{
    -		/// 
    -		///  Test passing DBNull.Value to a statement.
    -		/// 
    -		[Test]
    -		public void TestDBNullValue()
    -		{
    -			int accountsWithNullEmail = (int)sqlMap.QueryForObject("GetCountOfAccountsWithNullEmail", null);
    -
    -			Hashtable map = new Hashtable();
    -			map["DBNullValue"] = DBNull.Value;
    -			int rowsAffected = sqlMap.Update("UpdateNullEmailToDBNull", map);
    -
    -			Assert.AreEqual(accountsWithNullEmail, rowsAffected);
    -		}
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterMapTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterMapTest.cs
    deleted file mode 100644
    index 95564f4..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ParameterMapTest.cs
    +++ /dev/null
    @@ -1,372 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Drawing;
    -using System.Drawing.Imaging;
    -using System.IO;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for ParameterMapTest.
    -	/// 
    -	[TestFixture] 
    -	public class ParameterMapTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory+"account-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory+"account-procedure.sql", false );
    -			InitScript( sqlMap.DataSource, ScriptDirectory+"order-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory+"line-item-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory+"category-init.sql" );
    -
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Parameter map tests
    -
    -		/// 
    -		/// Test null replacement in ParameterMap property
    -		/// 
    -		[Test] 
    -		public void TestNullValueReplacement()
    -		{
    -			Account account = NewAccount6();
    -
    -			sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -			account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 6);
    -
    -			AssertAccount6(account);
    -		}
    -
    -
    -		/// 
    -		/// Test Test Null Value Replacement Inline
    -		/// 
    -		[Test] 
    -		public void TestNullValueReplacementInline() 
    -		{
    -			Account account = NewAccount6();
    -
    -			sqlMap.Insert("InsertAccountViaInlineParameters", account);
    -
    -			account = sqlMap.QueryForObject("GetAccountNullableEmail", 6) as Account;
    -
    -			AssertAccount6(account);
    -		}
    -
    -		/// 
    -		/// Test Test Null Value Replacement Inline
    -		/// 
    -		[Test] 
    -		public void TestSpecifiedType()
    -		{
    -			Account account = NewAccount6();
    -			account.EmailAddress = null;
    -
    -			sqlMap.Insert("InsertAccountNullableEmail", account);
    -
    -			account = sqlMap.QueryForObject("GetAccountNullableEmail", 6) as Account;
    -
    -			AssertAccount6(account);
    -		}
    -
    -		/// 
    -		/// Test Test Null Value Replacement Inline
    -		/// 
    -		[Test] 
    -		public void TestUnknownParameterClass()
    -		{
    -			Account account = NewAccount6();
    -			account.EmailAddress = null;
    -
    -			sqlMap.Insert("InsertAccountUknownParameterClass", account);
    -
    -			account = sqlMap.QueryForObject("GetAccountNullableEmail", 6) as Account;
    -
    -			AssertAccount6(account);
    -		}
    -
    -		/// 
    -		/// Test null replacement in ParameterMap property
    -		/// for System.DateTime.MinValue
    -		/// 
    -		[Test] 
    -		public void TestNullValueReplacementForDateTimeMinValue()
    -		{
    -			Account account = NewAccount6();
    -
    -			sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -			Order order = new Order();
    -			order.Id = 99;
    -			order.CardExpiry = "09/11";
    -			order.Account = account;
    -			order.CardNumber = "154564656";
    -			order.CardType = "Visa";
    -			order.City = "Lyon";
    -			order.Date = DateTime.MinValue; //<-- null replacement
    -			order.PostalCode = "69004";
    -			order.Province = "Rhone";
    -			order.Street = "rue Durand";
    - 
    -			sqlMap.Insert("InsertOrderViaParameterMap", order);
    -
    -			Order orderTest = (Order) sqlMap.QueryForObject("GetOrderLiteByColumnName", 99);
    -
    -			Assert.AreEqual(order.City, orderTest.City);
    -		}
    -
    -		/// 
    -		/// Test null replacement in ParameterMap/Hahstable property
    -		/// for System.DateTime.MinValue
    -		/// 
    -		[Test] 
    -		public void TestNullValueReplacementForDateTimeWithHashtable()
    -		{
    -			Account account = NewAccount6();
    -
    -			sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -			Order order = new Order();
    -			order.Id = 99;
    -			order.CardExpiry = "09/11";
    -			order.Account = account;
    -			order.CardNumber = "154564656";
    -			order.CardType = "Visa";
    -			order.City = "Lyon";
    -			order.Date = DateTime.MinValue; //<-- null replacement
    -			order.PostalCode = "69004";
    -			order.Province = "Rhone";
    -			order.Street = "rue Durand";
    - 
    -			sqlMap.Insert("InsertOrderViaParameterMap", order);
    -
    -			Hashtable orderTest = (Hashtable) sqlMap.QueryForObject("GetOrderByHashTable", 99);
    -
    -			Assert.AreEqual(orderTest["Date"], DateTime.MinValue);
    -		}
    -
    -		/// 
    -		/// Test null replacement in ParameterMap property
    -		/// for Guid
    -		/// 
    -		[Test] 
    -		public void TestNullValueReplacementForGuidValue()
    -		{
    -			Category category = new Category();
    -			category.Name = "Toto";
    -			category.Guid = Guid.Empty;
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryNull", category);
    -
    -			Category categoryRead = null;
    -            categoryRead = (Category)sqlMap.QueryForObject("GetCategoryWithNullValueReplacementGuid", key);
    -
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -
    -		/// 
    -		/// Test complex mapping Via hasTable 
    -		/// 
    -		/// 
    -		/// 
    -		/// map.Add("Item", Item);
    -		/// map.Add("Order", Order);
    -		/// 
    -		/// 
    -		/// ... #Item.prop1#...#Order.prop2#
    -		/// 
    -		/// 
    -		/// 
    -		[Test]
    -		public void TestComplexMappingViaHasTable()
    -		{
    -			Hashtable param = new Hashtable();
    -
    -			Account a = new Account();
    -			a.FirstName = "Joe";
    -			param.Add("Account",a);
    -
    -			Order o = new Order();
    -			o.City = "Dalton";
    -			param.Add("Order", o);
    -
    -			Account accountTest = (Account) sqlMap.QueryForObject("GetAccountComplexMapping", param);
    -
    -			AssertAccount1(accountTest);
    -		}
    -
    -		/// 
    -		/// Test ByteArrayTypeHandler via Picture Property
    -		/// 
    -		[Test]
    -		public void TestByteArrayTypeHandler()
    -		{
    -			Account account = NewAccount6();
    -
    -			sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -			Order order = new Order();
    -			order.Id = 99;
    -			order.CardExpiry = "09/11";
    -			order.Account = account;
    -			order.CardNumber = "154564656";
    -			order.CardType = "Visa";
    -			order.City = "Lyon";
    -			order.Date = DateTime.MinValue; 
    -			order.PostalCode = "69004";
    -			order.Province = "Rhone";
    -			order.Street = "rue Durand";
    - 
    -			sqlMap.Insert("InsertOrderViaParameterMap", order);
    -
    -			LineItem item = new LineItem();
    -			item.Id = 99;
    -			item.Code = "test";
    -			item.Price = -99.99m;
    -			item.Quantity = 99;
    -			item.Order = order;
    -			item.Picture = this.GetPicture();
    -
    -			// Check insert
    -			sqlMap.Insert("InsertLineItemWithPicture", item);
    -
    -			// select
    -			item = null;
    -			
    -			Hashtable param = new Hashtable();
    -			param.Add("LineItem_ID", 99);
    -			param.Add("Order_ID",  99);
    -
    -			item = sqlMap.QueryForObject("GetSpecificLineItemWithPicture", param) as LineItem;
    -
    -			Assert.IsNotNull( item );
    -			Assert.IsNotNull( item.Picture );
    -			Assert.AreEqual( GetSize(item.Picture), this.GetSize( this.GetPicture() ));
    -		}
    -
    -
    -        [Test]
    -        [Category("JIRA")]
    -        [Category("JIRA-253")]
    -        public void Null_byte_array_should_return_null()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            Order order = new Order();
    -            order.Id = 99;
    -            order.CardExpiry = "09/11";
    -            order.Account = account;
    -            order.CardNumber = "154564656";
    -            order.CardType = "Visa";
    -            order.City = "Lyon";
    -            order.Date = DateTime.MinValue;
    -            order.PostalCode = "69004";
    -            order.Province = "Rhone";
    -            order.Street = "rue Durand";
    -
    -            sqlMap.Insert("InsertOrderViaParameterMap", order);
    -
    -            LineItem item = new LineItem();
    -            item.Id = 99;
    -            item.Code = "test";
    -            item.Price = -99.99m;
    -            item.Quantity = 99;
    -            item.Order = order;
    -            item.Picture = null;
    -
    -            // Check insert
    -            sqlMap.Insert("InsertLineItemWithPicture", item);
    -
    -            // select
    -            item = null;
    -
    -            Hashtable param = new Hashtable();
    -            param.Add("LineItem_ID", 99);
    -            param.Add("Order_ID", 99);
    -
    -            item = sqlMap.QueryForObject("GetSpecificLineItemWithPicture", param) as LineItem;
    -            Assert.IsNotNull(item);
    -            Assert.IsNull(item.Picture);
    -
    -        }
    -
    -
    -	    /// 
    -		/// Test extend parameter map capacity
    -		/// (Support Requests 1043181)
    -		/// 
    -		[Test] 
    -		public void TestInsertOrderViaExtendParameterMap()
    -		{
    -			Account account = NewAccount6();
    -
    -			sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -			Order order = new Order();
    -			order.Id = 99;
    -			order.CardExpiry = "09/11";
    -			order.Account = account;
    -			order.CardNumber = "154564656";
    -			order.CardType = "Visa";
    -			order.City = "Lyon";
    -			order.Date = DateTime.MinValue; //<-- null replacement
    -			order.PostalCode = "69004";
    -			order.Province = "Rhone";
    -			order.Street = "rue Durand";
    - 
    -			sqlMap.Insert("InsertOrderViaExtendParameterMap", order);
    -
    -			Order orderTest = (Order) sqlMap.QueryForObject("GetOrderLiteByColumnName", 99);
    -
    -			Assert.AreEqual(order.City, orderTest.City);
    -		}
    -
    -		#endregion
    -
    -		#region Picture methods
    -
    -		private Image GetPicture() 
    -		{
    -			Image _picture = null;
    -
    -			// first try without path
    -			_picture = Image.FromFile( Path.Combine(Resources.ApplicationBase, "cool.jpg") );
    -
    -			Assert.IsNotNull( _picture );
    -			return _picture;
    -		}
    -
    -		private int GetSize( Image picture ) 
    -		{
    -			MemoryStream memoryStream = new MemoryStream();
    -			picture.Save (memoryStream, ImageFormat.Jpeg);
    -			return memoryStream.ToArray ().Length;
    -		}
    -
    -		#endregion
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs
    deleted file mode 100644
    index 308d2bf..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/Perf/PerformanceTest.cs
    +++ /dev/null
    @@ -1,521 +0,0 @@
    -using System;
    -using System.ComponentModel;
    -using System.Data;
    -using System.Runtime.InteropServices;
    -using System.Text;
    -using System.Threading;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -using NUnit.Framework;
    -using IBatisNet.DataMapper;
    -using IBatisNet.Common;
    -using CategoryAttribute = NUnit.Framework.CategoryAttribute;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.Perf
    -{
    -    [TestFixture]
    -    [Category("Performance")]
    -    public class PerformanceTest : BaseTest
    -    {
    -
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "simple-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -        #region DataMapper
    -        [Test]
    -        public void IbatisOnly()
    -        {
    -            for (int n = 2; n < 4000; n *= 2)
    -            {
    -                Simple[] simples = new Simple[n];
    -                object[] ids = new object[n];
    -                for (int i = 0; i < n; i++)
    -                {
    -                    simples[i] = new Simple();
    -                    simples[i].Init();
    -                    simples[i].Count = i;
    -                    simples[i].Id = i;
    -                }
    -
    -                //Now do timings
    -				Timer timer = new Timer();
    -				GC.Collect();
    -				GC.WaitForPendingFinalizers();
    -
    -                sqlMap.OpenConnection();
    -                timer.Start();
    -                Ibatis(simples, n, "h1");
    -				timer.Stop();
    -                double ibatis = 1000000 * (timer.Duration / (double)n);
    -                sqlMap.CloseConnection();
    -
    -                sqlMap.OpenConnection();
    -				timer.Start();
    -                Ibatis(simples, n, "h2");
    -				timer.Stop();
    -                ibatis += 1000000 * (timer.Duration / (double)n);
    -                sqlMap.CloseConnection();
    -
    -                sqlMap.OpenConnection();
    -				timer.Start();
    -                Ibatis(simples, n, "h2");
    -				timer.Stop();
    -                ibatis += 1000000 * (timer.Duration / (double)n);
    -                sqlMap.CloseConnection();
    -
    -                System.Console.WriteLine("Objects: " + n + " - iBATIS DataMapper: " + ibatis.ToString("F3"));
    -            }
    -            System.GC.Collect();
    -        }
    -
    -        private void Ibatis(Simple[] simples, int N, string runname)
    -        {
    -            sqlMap.BeginTransaction(false);
    -
    -            for (int i = 0; i < N; i++)
    -            {
    -                sqlMap.Insert("InsertSimple", simples[i]);
    -            }
    -
    -            for (int i = 0; i < N; i++)
    -            {
    -                simples[i].Name = "NH - " + i + N + runname + " - " + System.DateTime.Now.Ticks;
    -                sqlMap.Update("UpdateSimple", simples[i]);
    -            }
    -
    -            for (int i = 0; i < N; i++)
    -            {
    -                sqlMap.Delete("DeleteSimple", simples[i].Id);
    -            }
    -
    -            sqlMap.CommitTransaction(false);
    -        } 
    -        #endregion
    -
    -        #region ADO.NET
    -        [Test]
    -        public void AdoNetOnly()
    -        {
    -            for (int n = 2; n < 4000; n *= 2)
    -            {
    -                Simple[] simples = new Simple[n];
    -                for (int i = 0; i < n; i++)
    -                {
    -                    simples[i] = new Simple();
    -                    simples[i].Init();
    -                    simples[i].Count = i;
    -                    simples[i].Id = i;
    -                }
    -
    -                //Now do timings
    -				Timer timer = new Timer();
    -
    -                IDbConnection _connection = sqlMap.DataSource.DbProvider.CreateConnection();
    -                _connection.ConnectionString = sqlMap.DataSource.ConnectionString;
    -
    -                _connection.Open();
    -
    -                timer.Start();
    -                DirectAdoNet(_connection, simples, n, "j1");
    -                timer.Stop(); 
    -                double adonet = 1000000 * (timer.Duration / (double)n);
    -                _connection.Close();
    -
    -                _connection.Open();
    -                timer.Start();
    -                DirectAdoNet(_connection, simples, n, "j2");
    -				timer.Stop();
    -                adonet += 1000000 * (timer.Duration / (double)n);
    -                _connection.Close();
    -
    -                _connection.Open();
    -                timer.Start();
    -                DirectAdoNet(_connection, simples, n, "j2");
    -				timer.Stop();
    -                adonet += 1000000 * (timer.Duration / (double)n);
    -                _connection.Close();
    -
    -                System.Console.Out.WriteLine("Objects: " + n + " Direct ADO.NET: " + adonet.ToString("F3"));
    -            }
    -            System.GC.Collect();
    -        }
    -
    -        private void DirectAdoNet(IDbConnection c, Simple[] simples, int N, string runname)
    -        {
    -            IDbCommand insert = InsertCommand();
    -            IDbCommand delete = DeleteCommand();
    -            IDbCommand select = SelectCommand();
    -            IDbCommand update = UpdateCommand();
    -
    -            IDbTransaction t = c.BeginTransaction();
    -
    -            insert.Connection = c;
    -            delete.Connection = c;
    -            select.Connection = c;
    -            update.Connection = c;
    -
    -            insert.Transaction = t;
    -            delete.Transaction = t;
    -            select.Transaction = t;
    -            update.Transaction = t;
    -
    -            insert.Prepare();
    -            delete.Prepare();
    -            select.Prepare();
    -            update.Prepare();
    -
    -            for (int i = 0; i < N; i++)
    -            {
    -                ((IDbDataParameter)insert.Parameters[0]).Value = simples[i].Name;
    -                ((IDbDataParameter)insert.Parameters[1]).Value = simples[i].Address;
    -                ((IDbDataParameter)insert.Parameters[2]).Value = simples[i].Count;
    -                ((IDbDataParameter)insert.Parameters[3]).Value = simples[i].Date;
    -                ((IDbDataParameter)insert.Parameters[4]).Value = simples[i].Pay;
    -                ((IDbDataParameter)insert.Parameters[5]).Value = simples[i].Id;
    -
    -                insert.ExecuteNonQuery();
    -            }
    -
    -            for (int i = 0; i < N; i++)
    -            {
    -                ((IDbDataParameter)update.Parameters[0]).Value = "DR - " + i + N + runname + " - " + System.DateTime.Now.Ticks;
    -                ((IDbDataParameter)update.Parameters[1]).Value = simples[i].Address;
    -                ((IDbDataParameter)update.Parameters[2]).Value = simples[i].Count;
    -                ((IDbDataParameter)update.Parameters[3]).Value = simples[i].Date;
    -                ((IDbDataParameter)update.Parameters[4]).Value = simples[i].Pay;
    -                ((IDbDataParameter)update.Parameters[5]).Value = simples[i].Id;
    -
    -                update.ExecuteNonQuery();
    -            }
    -
    -            for (int i = 0; i < N; i++)
    -            {
    -                ((IDbDataParameter)delete.Parameters[0]).Value = simples[i].Id;
    -                delete.ExecuteNonQuery();
    -            }
    -
    -            t.Commit();
    -        }
    -
    -        private IDbCommand DeleteCommand()
    -        {
    -            string sql = "delete from Simples where id = ";
    -            sql += sqlMap.DataSource.DbProvider.FormatNameForSql("id");
    -
    -            IDbCommand cmd = sqlMap.DataSource.DbProvider.CreateCommand();
    -            cmd.CommandText = sql;
    -
    -            IDbDataParameter prm = cmd.CreateParameter();
    -            prm.ParameterName = sqlMap.DataSource.DbProvider.FormatNameForParameter("id");
    -            prm.DbType = DbType.Int32;
    -            cmd.Parameters.Add(prm);
    -
    -            return cmd;
    -        }
    -
    -        private IDbCommand InsertCommand()
    -        {
    -            string sql = "insert into Simples ( name, address, count, date, pay, id ) values (";
    -            for (int i = 0; i < 6; i++)
    -            {
    -                if (i > 0) sql += ", ";
    -                sql += sqlMap.DataSource.DbProvider.FormatNameForSql("param" + i.ToString());
    -            }
    -
    -            sql += ")";
    -
    -            IDbCommand cmd = sqlMap.DataSource.DbProvider.CreateCommand();
    -            cmd.CommandText = sql;
    -            AppendInsertUpdateParams(cmd);
    -
    -            return cmd;
    -        }
    -
    -        private IDbCommand SelectCommand()
    -        {
    -            string sql = "SELECT s.id, s.name, s.address, s.count, s.date, s.pay FROM Simples s";
    -
    -            IDbCommand cmd = sqlMap.DataSource.DbProvider.CreateCommand();
    -            cmd.CommandText = sql;
    -
    -            return cmd;
    -        }
    -
    -        private IDbCommand UpdateCommand()
    -        {
    -            string sql = "update Simples set";
    -            sql += (" name = " + sqlMap.DataSource.DbProvider.FormatNameForSql("param0"));
    -            sql += (", address = " + sqlMap.DataSource.DbProvider.FormatNameForSql("param1"));
    -            sql += (", count = " + sqlMap.DataSource.DbProvider.FormatNameForSql("param2"));
    -            sql += (", date = " + sqlMap.DataSource.DbProvider.FormatNameForSql("param3"));
    -            sql += (", pay = " + sqlMap.DataSource.DbProvider.FormatNameForSql("param4"));
    -            sql += " where id = " + sqlMap.DataSource.DbProvider.FormatNameForSql("param5");
    -
    -            IDbCommand cmd = sqlMap.DataSource.DbProvider.CreateCommand();
    -            cmd.CommandText = sql;
    -
    -            AppendInsertUpdateParams(cmd);
    -
    -            return cmd;
    -        }
    -
    -        private void AppendInsertUpdateParams(IDbCommand cmd)
    -        {
    -            IDbDataParameter[] prm = new IDbDataParameter[6];
    -            for (int j = 0; j < 6; j++)
    -            {
    -                prm[j] = cmd.CreateParameter();
    -                prm[j].ParameterName = sqlMap.DataSource.DbProvider.FormatNameForParameter("param" + j.ToString());
    -                cmd.Parameters.Add(prm[j]);
    -            }
    -
    -            int i = 0;
    -            prm[i].DbType = DbType.String;
    -            prm[i].Size = 255;
    -            i++;
    -
    -            prm[i].DbType = DbType.String;
    -            prm[i].Size = 200;
    -            i++;
    -
    -            prm[i].DbType = DbType.Int32;
    -            i++;
    -
    -            prm[i].DbType = DbType.DateTime;
    -            i++;
    -
    -            prm[i].DbType = DbType.Decimal;
    -            prm[i].Scale = 2;
    -            prm[i].Precision = 5;
    -            i++;
    -
    -            prm[i].DbType = DbType.Int32;
    -            i++;
    -
    -        } 
    -        #endregion
    -
    -        [Test]
    -        public void Many()
    -        {
    -            double ibatis = 0;
    -            double adonet = 0;
    -
    -            for (int n = 0; n < 5; n++)
    -            {
    -                Simple[] simples = new Simple[n];
    -                for (int i = 0; i < n; i++)
    -                {
    -                    simples[i] = new Simple();
    -                    simples[i].Init();
    -                    simples[i].Count = i;
    -                    simples[i].Id = i;
    -                }
    -
    -                sqlMap.OpenConnection();
    -                Ibatis(simples, n, "h0");
    -                sqlMap.CloseConnection();
    -
    -                IDbConnection _connection = sqlMap.DataSource.DbProvider.CreateConnection();
    -                _connection.ConnectionString = sqlMap.DataSource.ConnectionString;
    -
    -                _connection.Open();
    -                DirectAdoNet(_connection, simples, n, "j0");
    -                _connection.Close();
    -
    -                sqlMap.OpenConnection();
    -                Ibatis(simples, n, "h0");
    -                sqlMap.CloseConnection();
    -
    -                _connection.Open();
    -                DirectAdoNet(_connection, simples, n, "j0");
    -                _connection.Close();
    -
    -                // now do timings
    -
    -                int loops = 30;
    -                Timer timer = new Timer();
    -
    -                for (int runIndex = 1; runIndex < 4; runIndex++)
    -                {
    -					GC.Collect();
    -					GC.WaitForPendingFinalizers();
    -
    -					timer.Start();
    -                    for (int i = 0; i < loops; i++)
    -                    {
    -                        sqlMap.OpenConnection();    
    -						Ibatis(simples, n, "h" + runIndex.ToString());
    -                         sqlMap.CloseConnection();
    -                    }
    -					timer.Stop();
    -					ibatis += 1000000 * (timer.Duration / (double)loops);
    -
    -					GC.Collect();
    -					GC.WaitForPendingFinalizers();
    -
    -                    timer.Start();
    -                    for (int i = 0; i < loops; i++)
    -                    {
    -                        _connection.Open();
    -                        DirectAdoNet(_connection, simples, n, "j" + runIndex.ToString());
    -                        _connection.Close();
    -                    }
    -					timer.Stop();
    -                    adonet += 1000000 * (timer.Duration / (double)loops);
    -
    -
    -                }
    -            }
    -            System.Console.Out.WriteLine("iBatis DataMapper : " + ibatis.ToString("F3") + " / Direct ADO.NET: " + adonet.ToString("F3") + " Ratio: " + ((ibatis / adonet)).ToString("F3"));
    -
    -            System.GC.Collect();
    -        }
    -
    -        [Test]
    -        public void Simultaneous()
    -        {
    -            double ibatis = 0;
    -            double adonet = 0;
    -
    -            IDbConnection _connection = sqlMap.DataSource.DbProvider.CreateConnection();
    -            _connection.ConnectionString = sqlMap.DataSource.ConnectionString;
    -
    -            for (int n = 2; n < 4000; n *= 2)
    -            {
    -                Simple[] simples = new Simple[n];
    -                for (int i = 0; i < n; i++)
    -                {
    -                    simples[i] = new Simple();
    -                    simples[i].Init();
    -                    simples[i].Count = i;
    -                    simples[i].Id = i;
    -                }
    -
    -                sqlMap.OpenConnection();
    -                Ibatis(simples, n, "h0");
    -                sqlMap.CloseConnection();
    -
    -
    -                _connection.Open();
    -                DirectAdoNet(_connection, simples, n, "j0");
    -                _connection.Close();
    -
    -                sqlMap.OpenConnection();
    -                Ibatis(simples, n, "h0");
    -                sqlMap.CloseConnection();
    -
    -                _connection.Open();
    -                DirectAdoNet(_connection, simples, n, "j0");
    -                _connection.Close();
    -
    -                //Now do timings
    -				Timer timer = new Timer();
    -
    -				GC.Collect();
    -				GC.WaitForPendingFinalizers();
    -
    -                sqlMap.OpenConnection();
    -                timer.Start();
    -                Ibatis(simples, n, "h1");
    -				timer.Stop();
    -                ibatis = 1000000 * (timer.Duration / (double)n);
    -                sqlMap.CloseConnection();
    -
    -                _connection.Open();
    -                timer.Start();
    -                DirectAdoNet(_connection, simples, n, "j1");
    -				timer.Stop();
    -                adonet = 1000000 * (timer.Duration / (double)n);
    -                _connection.Close();
    -
    -                sqlMap.OpenConnection();
    -                timer.Start();
    -                Ibatis(simples, n, "h2");
    -				timer.Stop();
    -                ibatis += 1000000 * (timer.Duration / (double)n);
    -                sqlMap.CloseConnection();
    -
    -                _connection.Open();
    -                timer.Start();
    -                DirectAdoNet(_connection, simples, n, "j2");
    -				timer.Stop();
    -                adonet += 1000000 * (timer.Duration / (double)n);
    -                _connection.Close();
    -
    -                sqlMap.OpenConnection();
    -                timer.Start();
    -                Ibatis(simples, n, "h2");
    -				timer.Stop();
    -                ibatis += 1000000 * (timer.Duration / (double)n);
    -                sqlMap.CloseConnection();
    -
    -                _connection.Open();
    -                timer.Start();
    -                DirectAdoNet(_connection, simples, n, "j2");
    -				timer.Stop();
    -                adonet += 1000000 * (timer.Duration / (double)n);
    -                _connection.Close();
    -                System.Console.Out.WriteLine("Objects " + n + " iBATIS DataMapper : " + ibatis.ToString("F3") + " / Direct ADO.NET: " + adonet.ToString("F3") + " Ratio: " + ((ibatis / adonet)).ToString("F3"));
    -            }
    -
    -            System.GC.Collect();
    -        }
    -
    -		internal class Timer
    -		{
    -			[DllImport("Kernel32.dll")]
    -			private static extern bool QueryPerformanceCounter(out long lpPerformanceCount);
    -
    -			[DllImport("Kernel32.dll")]
    -			private static extern bool QueryPerformanceFrequency(out long lpFrequency);
    -
    -			private long startTime, stopTime;
    -			private long freq;
    -
    -			public Timer()
    -			{
    -				startTime = 0;
    -				stopTime = 0;
    -
    -				if (QueryPerformanceFrequency(out freq) == false)
    -				{
    -					throw new Win32Exception();
    -				}
    -			}
    -
    -			public void Start()
    -			{
    -				Thread.Sleep(0);
    -				QueryPerformanceCounter(out startTime);
    -			}
    -
    -			public void Stop()
    -			{
    -				QueryPerformanceCounter(out stopTime);
    -			}
    -
    -			public double Duration
    -			{
    -				get { return (double) (stopTime - startTime)/(double) freq; }
    -			}
    -		}
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementGenerate.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementGenerate.cs
    deleted file mode 100644
    index f992b90..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementGenerate.cs
    +++ /dev/null
    @@ -1,148 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.PostgreSQL
    -{
    -	/// 
    -	/// Summary description for StatementGenerate.
    -	/// 
    -	[TestFixture] 
    -	[Category("PostgreSQL")]
    -	public class StatementGenerate : BaseTest
    -	{
    -		#region SetUp & TearDown
    -		
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement test for PostgreSQL
    -
    -		/// 
    -		/// Test an select by key via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectByPK()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			category.Id = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, category.Id);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("SelectByPKCategoryGenerate", category);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -
    -		/// 
    -		/// Test an select all via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestSelectAll()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(2, key);
    -
    -			IList categorieList = sqlMap.QueryForList("SelectAllCategoryGenerate",null) as IList;
    -			Assert.AreEqual(2, categorieList.Count);
    -
    -		}
    -
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestInsert()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.Empty;
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test] 
    -		public void TestUpdate()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -		
    -		/// 
    -		/// Test an insert via generate statement.
    -		/// 
    -		[Test] 
    -		public void TestDelete()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryGenerate", category);
    -			category.Id = key;
    -			Assert.AreEqual(1, category.Id);
    -			
    -			sqlMap.Delete("DeleteCategoryGenerate", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = sqlMap.QueryForObject("GetCategory", key) as Category;
    -
    -			Assert.IsNull(categoryRead);
    -		}
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementTest.cs
    deleted file mode 100644
    index 3da2de5..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/PostgreSQL/StatementTest.cs
    +++ /dev/null
    @@ -1,130 +0,0 @@
    -using System;
    -using System.Collections;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.NUnit;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests.PostgreSQL
    -{
    -	/// 
    -	/// Summary description for StatementTest.
    -	/// 
    -	[TestFixture] 
    -	[Category("PostgreSQL")]
    -	public class StatementTest : BaseTest
    -	{
    -		
    -		#region SetUp & TearDown
    -	
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific tests for PostgreSQL
    -
    -		/// 
    -		/// Test an insert with an autonumber key.
    -		/// 
    -		[Test] 
    -		public void TestInsertAutonumberViaInsertQuery()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategory", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Insert Via Insert Statement.
    -		/// 
    -		[Test] 
    -		public void TestInsertViaInsertStatement()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaInsertStatement", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test guid column/field.
    -		/// 
    -		[Test] 
    -		public void TestGuidColumn()
    -		{
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaInsertStatement", category);
    -
    -			Category categoryTest = (Category)sqlMap.QueryForObject("GetCategory", key);
    -			Assert.AreEqual(key, categoryTest.Id);
    -			Assert.AreEqual(category.Name, categoryTest.Name);
    -			Assert.AreEqual(category.Guid, categoryTest.Guid);
    -		}
    -
    -		/// 
    -		/// Test Insert Category Via ParameterMap.
    -		/// 
    -		[Test] 
    -		public void TestInsertCategoryViaParameterMap()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		/// 
    -		/// Test Update Category with Extended ParameterMap
    -		/// 
    -		[Test] 
    -		public void TestUpdateCategoryWithExtendParameterMap()
    -		{
    -			Category category = new Category();
    -			category.Name = "Cat";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("InsertCategoryViaParameterMap", category);
    -			category.Id = key;
    -
    -			category.Name = "Dog";
    -			category.Guid = Guid.NewGuid();
    -
    -			sqlMap.Update("UpdateCategoryViaParameterMap", category);
    -
    -			Category categoryRead = null;
    -			categoryRead = (Category) sqlMap.QueryForObject("GetCategory", key);
    -
    -			Assert.AreEqual(category.Id, categoryRead.Id);
    -			Assert.AreEqual(category.Name, categoryRead.Name);
    -			Assert.AreEqual(category.Guid.ToString(), categoryRead.Guid.ToString());
    -		}
    -		#endregion
    -
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultClassTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultClassTest.cs
    deleted file mode 100644
    index 9eb6dc1..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultClassTest.cs
    +++ /dev/null
    @@ -1,342 +0,0 @@
    -using System;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for ResultClassTest.
    -	/// 
    -	[TestFixture] 
    -	public class ResultClassTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Specific statement test
    -
    -		/// 
    -		///  Test a boolean resultClass
    -		/// 
    -		[Test]
    -		public void TestBoolean() 
    -		{
    -			bool bit = (bool) sqlMap.QueryForObject("GetBoolean", 1);
    -
    -			Assert.AreEqual(true, bit);
    -		}
    -
    -		/// 
    -		///  Test a boolean implicit resultClass
    -		/// 
    -		[Test]
    -		public void TestBooleanWithoutResultClass() 
    -		{
    -			bool bit = Convert.ToBoolean(sqlMap.QueryForObject("GetBooleanWithoutResultClass", 1));
    -
    -			Assert.AreEqual(true, bit);
    -		}
    -
    -		/// 
    -		///  Test a byte resultClass
    -		/// 
    -		[Test] 
    -		public void TestByte() 
    -		{
    -			byte letter = (byte) sqlMap.QueryForObject("GetByte", 1);
    -
    -			Assert.AreEqual(155, letter);
    -		}
    -
    -		/// 
    -		///  Test a byte implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestByteWithoutResultClass() 
    -		{
    -			byte letter = Convert.ToByte(sqlMap.QueryForObject("GetByteWithoutResultClass", 1));
    -
    -			Assert.AreEqual(155, letter);
    -		}
    -
    -		/// 
    -		///  Test a char resultClass
    -		/// 
    -		[Test] 
    -		public void TestChar() 
    -		{
    -			char letter = (char) sqlMap.QueryForObject("GetChar", 1);
    -
    -			Assert.AreEqual('a', letter);
    -		}
    -
    -		/// 
    -		///  Test a char implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestCharWithoutResultClass() 
    -		{
    -			char letter = Convert.ToChar(sqlMap.QueryForObject("GetCharWithoutResultClass", 1));
    -
    -			Assert.AreEqual('a', letter);
    -		}
    -
    -		/// 
    -		///  Test a DateTime resultClass
    -		/// 
    -		[Test] 
    -		public void TestDateTime() 
    -		{
    -			DateTime orderDate = (DateTime) sqlMap.QueryForObject("GetDate", 1);
    -
    -			System.DateTime date = new DateTime(2003, 2, 15, 8, 15, 00);
    -
    -			Assert.AreEqual(date.ToString(), orderDate.ToString());
    -		}
    -
    -		/// 
    -		///  Test a DateTime implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestDateTimeWithoutResultClass() 
    -		{
    -			DateTime orderDate = Convert.ToDateTime(sqlMap.QueryForObject("GetDateWithoutResultClass", 1));
    -
    -			System.DateTime date = new DateTime(2003, 2, 15, 8, 15, 00);
    -
    -			Assert.AreEqual(date.ToString(), orderDate.ToString());
    -		}
    -
    -		/// 
    -		///  Test a decimal resultClass
    -		/// 
    -		[Test] 
    -		public void TestDecimal() 
    -		{
    -			decimal price = (decimal) sqlMap.QueryForObject("GetDecimal", 1);
    -
    -			Assert.AreEqual((decimal)1.56, price);
    -		}
    -
    -		/// 
    -		///  Test a decimal implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestDecimalWithoutResultClass() 
    -		{
    -			decimal price = Convert.ToDecimal(sqlMap.QueryForObject("GetDecimalWithoutResultClass", 1));
    -
    -			Assert.AreEqual((decimal)1.56, price);
    -		}
    -
    -		/// 
    -		///  Test a double resultClass
    -		/// 
    -		[Test] 
    -		public void TestDouble() 
    -		{
    -			double price = (double) sqlMap.QueryForObject("GetDouble", 1);
    -
    -			Assert.AreEqual(99.5f, price);
    -		}
    -
    -		/// 
    -		///  Test a double implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestDoubleWithoutResultClass() 
    -		{
    -			double price = Convert.ToDouble(sqlMap.QueryForObject("GetDoubleWithoutResultClass", 1));
    -
    -			Assert.AreEqual(99.5f, price);
    -		}
    -
    -		/// 
    -		///  IBATISNET-25 Error applying ResultMap when using 'Guid' in resultClass
    -		/// 
    -		[Test] 
    -		public void TestGuid() 
    -		{
    -			Guid newGuid = new Guid("CD5ABF17-4BBC-4C86-92F1-257735414CF4");
    -
    -			Guid guid = (Guid) sqlMap.QueryForObject("GetGuid", 1);
    -
    -			Assert.AreEqual(newGuid, guid);
    -		}
    -
    -		/// 
    -		/// Test a Guid implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestGuidWithoutResultClass()
    -		{
    -			Guid newGuid = new Guid("CD5ABF17-4BBC-4C86-92F1-257735414CF4");
    -
    -			string guidString = Convert.ToString(sqlMap.QueryForObject("GetGuidWithoutResultClass", 1));
    -
    -			Guid guid = new Guid(guidString);
    -
    -			Assert.AreEqual(newGuid, guid);
    -		}
    -
    -		/// 
    -		///  Test a int16 resultClass
    -		/// 
    -		[Test] 
    -		public void TestInt16() 
    -		{
    -			short integer = (short) sqlMap.QueryForObject("GetInt16", 1);
    -
    -			Assert.AreEqual(32111, integer);
    -		}
    -
    -		/// 
    -		///  Test a int16 implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestInt16WithoutResultClass() 
    -		{
    -			short integer = Convert.ToInt16(sqlMap.QueryForObject("GetInt16WithoutResultClass", 1));
    -
    -			Assert.AreEqual(32111, integer);
    -		}
    -
    -		/// 
    -		///  Test a int 32 resultClass
    -		/// 
    -		[Test] 
    -
    -		public void TestInt32() 
    -		{
    -			int integer = (int) sqlMap.QueryForObject("GetInt32", 1);
    -
    -			Assert.AreEqual(999999, integer);
    -		}
    -
    -		/// 
    -		///  Test a int 32 implicit resultClass
    -		/// 
    -		[Test] 
    -
    -		public void TestInt32WithoutResultClass() 
    -		{
    -			int integer = Convert.ToInt32(sqlMap.QueryForObject("GetInt32WithoutResultClass", 1));
    -
    -			Assert.AreEqual(999999, integer);
    -		}
    -
    -		/// 
    -		///  Test a int64 resultClass
    -		/// 
    -		[Test] 
    -		public void TestInt64() 
    -		{
    -			long bigInt = (long) sqlMap.QueryForObject("GetInt64", 1);
    -
    -			Assert.AreEqual(9223372036854775800, bigInt);
    -		}
    -
    -		/// 
    -		///  Test a int64 implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestInt64WithoutResultClass() 
    -		{
    -			long bigInt = Convert.ToInt64(sqlMap.QueryForObject("GetInt64WithoutResultClass", 1));
    -
    -			Assert.AreEqual(9223372036854775800, bigInt);
    -		}
    -
    -		/// 
    -		///  Test a single/float resultClass
    -		/// 
    -		[Test] 
    -		public void TestSingle() 
    -		{
    -			float price = (float)sqlMap.QueryForObject("GetSingle", 1);
    -
    -			Assert.AreEqual(92233.5, price);
    -		}
    -
    -		/// 
    -		///  Test a single/float implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestSingleWithoutResultClass() 
    -		{
    -			double price = Convert.ToDouble(sqlMap.QueryForObject("GetSingleWithoutResultClass", 1));
    -
    -			Assert.AreEqual(92233.5, price);
    -		}
    -
    -		/// 
    -		///  Test a string resultClass
    -		/// 
    -		[Test] 
    -		public void TestString() 
    -		{
    -			string cardType = sqlMap.QueryForObject("GetString", 1) as string;
    -
    -			Assert.AreEqual("VISA", cardType);
    -		}
    -
    -		/// 
    -		///  Test a string implicit resultClass
    -		/// 
    -		[Test] 
    -		public void TestStringWithoutResultClass() 
    -		{
    -			string cardType = Convert.ToString(sqlMap.QueryForObject("GetStringWithoutResultClass", 1));
    -
    -			Assert.AreEqual("VISA", cardType);
    -		}
    -
    -		/// 
    -		///  Test a TimeSpan resultClass
    -		/// 
    -		[Test] 
    -		[Ignore("To do")]
    -		public void TestTimeSpan() 
    -		{
    -			Guid newGuid = Guid.NewGuid();;
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = newGuid;
    -
    -			int key = (int)sqlMap.Insert("InsertCategory", category);
    -
    -			Guid guid = (Guid)sqlMap.QueryForObject("GetGuid", key);
    -
    -			Assert.AreEqual(newGuid, guid);
    -		}
    -
    -		/// 
    -		///  Test a TimeSpan implicit resultClass
    -		/// 
    -		[Test] 
    -		[Ignore("To do")]
    -		public void TestTimeSpanWithoutResultClass() 
    -		{
    -
    -		}
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultMapTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultMapTest.cs
    deleted file mode 100644
    index b9785e8..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ResultMapTest.cs
    +++ /dev/null
    @@ -1,550 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Configuration;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -    /// 
    -    /// Summary description for ResultMapTest.
    -    /// 
    -    [TestFixture]
    -    public class ResultMapTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-procedure.sql", false);
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "enumeration-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        { /* ... */ }
    -
    -        #endregion
    -
    -        #region Result Map test
    -
    -        /// 
    -        /// Test a Result Map property with map by column name
    -        /// 
    -        [Test]
    -        public void TestColumnsByName()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderLiteByColumnName", 1);
    -            AssertOrder1(order);
    -        }
    -
    -        /// 
    -        /// Test a Result Map property with map by column index
    -        /// 
    -        [Test]
    -        public void TestColumnsByIndex()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderLiteByColumnIndex", 1);
    -            AssertOrder1(order);
    -        }
    -
    -
    -        /// 
    -        /// Test extends attribute in a Result Map
    -        /// 
    -        [Test]
    -        public void TestExtendedResultMap()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItems", 1);
    -
    -            AssertOrder1(order);
    -            Assert.IsNotNull(order.LineItemsIList);
    -            Assert.AreEqual(3, order.LineItemsIList.Count);
    -        }
    -
    -        /// 
    -        /// Test lazyLoad attribute in a Result Map property
    -        /// 
    -        [Test]
    -        public void TestLazyLoad()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItems", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsIList);
    -            Assert.IsTrue(typeof(IList).IsAssignableFrom(order.LineItemsIList.GetType()));
    -
    -            Assert.AreEqual(3, order.LineItemsIList.Count);
    -            // After a call to a method from a proxy object,
    -            // the proxy object is replaced by his real object.
    -            Assert.IsTrue(order.LineItemsIList is ArrayList);
    -        }
    -
    -        /// 
    -        /// Test lazyLoad attribute With an Open Connection
    -        /// 
    -        [Test]
    -        public void TestLazyLoadWithOpenConnection()
    -        {
    -            sqlMap.OpenConnection();
    -
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItems", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsIList);
    -            Assert.IsTrue(typeof(IList).IsAssignableFrom(order.LineItemsIList.GetType()));
    -
    -            Assert.AreEqual(3, order.LineItemsIList.Count);
    -            // After a call to a method from a proxy object,
    -            // the proxy object is replaced by his real object.
    -            Assert.IsTrue(order.LineItemsIList is ArrayList);
    -
    -            sqlMap.CloseConnection();
    -        }
    -
    -        /// 
    -        /// Test collection mapping
    -        /// order.LineItems
    -        /// 
    -        [Test]
    -        public void TestLazyWithStronglyTypedCollectionMapping()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItemCollection", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsCollection);
    -            Assert.AreEqual(3, order.LineItemsCollection.Count);
    -
    -            IEnumerator e = ((IEnumerable)order.LineItemsCollection).GetEnumerator();
    -            while (e.MoveNext())
    -            {
    -                LineItem item = (LineItem)e.Current;
    -                Assert.IsNotNull(item);
    -            }
    -        }
    -
    -        /// 
    -        /// Test null value replacement(on string) in a Result property.
    -        /// 
    -        [Test]
    -        public void TestNullValueReplacementOnString()
    -        {
    -            Account account = (Account)sqlMap.QueryForObject("GetAccountViaColumnName", 3);
    -            Assert.AreEqual("no_email@provided.com", account.EmailAddress);
    -        }
    -
    -        /// 
    -        /// Test null value replacement(on enum class) in a Result property.
    -        /// 
    -        [Test]
    -        public void TestNullValueReplacementOnEnum()
    -        {
    -            Enumeration enumClass = new Enumeration();
    -            enumClass.Id = 99;
    -            enumClass.Day = Days.Thu;
    -            enumClass.Color = Colors.Blue;
    -            enumClass.Month = Months.All;
    -
    -            sqlMap.Insert("InsertEnumViaParameterMap", enumClass);
    -
    -            enumClass = null;
    -            enumClass = sqlMap.QueryForObject("GetEnumerationNullValue", 99) as Enumeration;
    -
    -            Assert.AreEqual(enumClass.Day, Days.Thu);
    -            Assert.AreEqual(enumClass.Color, Colors.Blue);
    -            Assert.AreEqual(enumClass.Month, Months.All);
    -        }
    -
    -        /// 
    -        /// Test usage of dbType in a result map property.
    -        /// 
    -        /// 
    -        [Test]
    -        public void TestTypeSpecified()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithTypes", 1);
    -            AssertOrder1(order);
    -        }
    -
    -
    -        /// 
    -        /// Test a Complex Object Mapping. 
    -        /// Order + Account in Order.Account
    -        /// 
    -        [Test]
    -        public void TestComplexObjectMapping()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithAccount", 1);
    -            AssertOrder1(order);
    -            AssertAccount1(order.Account);
    -        }
    -
    -
    -        /// 
    -        /// Test collection mapping with extends attribute
    -        /// 
    -        [Test]
    -        public void TestCollectionMappingAndExtends()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItemsCollection", 1);
    -
    -            AssertOrder1(order);
    -
    -            // Check strongly typed collection
    -            Assert.IsNotNull(order.LineItemsCollection);
    -            Assert.AreEqual(3, order.LineItemsCollection.Count);
    -        }
    -
    -        /// 
    -        /// Test collection mapping: Ilist collection 
    -        /// order.LineItemsIList 
    -        /// 
    -        [Test]
    -        public void TestListMapping()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItems", 1);
    -
    -            AssertOrder1(order);
    -
    -            // Check IList collection
    -            Assert.IsNotNull(order.LineItemsIList);
    -            Assert.AreEqual(3, order.LineItemsIList.Count);
    -        }
    -
    -        /// 
    -        /// Test Array Mapping
    -        /// 
    -        [Test]
    -        public void TestArrayMapping()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItemArray", 1);
    -
    -            AssertOrder1(order);
    -            Assert.IsNotNull(order.LineItemsArray);
    -            Assert.AreEqual(3, order.LineItemsArray.Length);
    -        }
    -
    -        /// 
    -        /// Test collection mapping
    -        /// order.LineItems
    -        /// 
    -        [Test]
    -        public void TestStronglyTypedCollectionMapping()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItemCollection", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.LineItemsCollection);
    -            Assert.AreEqual(3, order.LineItemsCollection.Count);
    -
    -            IEnumerator e = ((IEnumerable)order.LineItemsCollection).GetEnumerator();
    -            while (e.MoveNext())
    -            {
    -                LineItem item = (LineItem)e.Current;
    -                Assert.IsNotNull(item);
    -            }
    -        }
    -
    -        /// 
    -        /// Test a ResultMap mapping as an Hastable.
    -        /// 
    -        [Test]
    -        public void TestHashtableMapping()
    -        {
    -            Hashtable order = (Hashtable)sqlMap.QueryForObject("GetOrderAsHastable", 1);
    -
    -            AssertOrder1AsHashtable(order);
    -        }
    -
    -        /// 
    -        /// Test nested object.
    -        /// Order + FavouriteLineItem in order.FavouriteLineItem
    -        /// 
    -        [Test]
    -        public void TestNestedObjects()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderJoinedFavourite", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.FavouriteLineItem);
    -            Assert.AreEqual(1, order.FavouriteLineItem.Id, "order.FavouriteLineItem.Id");
    -            Assert.AreEqual("ESM-34", order.FavouriteLineItem.Code);
    -
    -        }
    -
    -        /// 
    -        /// Test nested object.
    -        /// Order + FavouriteLineItem in order.FavouriteLineItem
    -        /// 
    -        [Test]
    -        public void TestNestedObjects2()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderJoinedFavourite2", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.FavouriteLineItem);
    -            Assert.AreEqual(1, order.FavouriteLineItem.Id, "order.FavouriteLineItem.Id");
    -            Assert.AreEqual("ESM-34", order.FavouriteLineItem.Code);
    -        }
    -
    -        /// 
    -        /// Test Implicit Result Maps
    -        /// 
    -        [Test]
    -        public void TestImplicitResultMaps()
    -        {
    -            Order order = (Order)sqlMap.QueryForObject("GetOrderJoinedFavourite3", 1);
    -
    -            AssertOrder1(order);
    -
    -            Assert.IsNotNull(order.FavouriteLineItem);
    -            Assert.AreEqual(1, order.FavouriteLineItem.Id, "order.FavouriteLineItem.Id");
    -            Assert.AreEqual("ESM-34", order.FavouriteLineItem.Code);
    -
    -        }
    -
    -        /// 
    -        /// Test a composite Key Mapping.
    -        /// It must be: property1=column1,property2=column2,...
    -        /// 
    -        [Test]
    -        public void TestCompositeKeyMapping()
    -        {
    -            Order order1 = (Order)sqlMap.QueryForObject("GetOrderWithFavouriteLineItem", 1);
    -            Order order2 = (Order)sqlMap.QueryForObject("GetOrderWithFavouriteLineItem", 2);
    -
    -            Assert.IsNotNull(order1);
    -            Assert.IsNotNull(order1.FavouriteLineItem);
    -            Assert.AreEqual(1, order1.FavouriteLineItem.Id);
    -
    -            Assert.IsNotNull(order2);
    -            Assert.IsNotNull(order2.FavouriteLineItem);
    -            Assert.AreEqual(17, order2.FavouriteLineItem.Id);
    -        }
    -
    -        /// 
    -        /// Test a composite Key Mapping.
    -        /// It must be: key1,key2,... (old syntax)
    -        /// 
    -        [Test]
    -        public void TestCompositeKeyMapping_JIRA_251()
    -        {
    -            Order order1 = (Order)sqlMap.QueryForObject("GetOrderWithFavouriteLineItem-JIRA-251", 1);
    -            Order order2 = (Order)sqlMap.QueryForObject("GetOrderWithFavouriteLineItem-JIRA-251", 2);
    -
    -            Assert.IsNotNull(order1);
    -            Assert.IsNotNull(order1.FavouriteLineItem);
    -            Assert.AreEqual(1, order1.FavouriteLineItem.Id);
    -
    -            Assert.IsNotNull(order2);
    -            Assert.IsNotNull(order2.FavouriteLineItem);
    -            Assert.AreEqual(17, order2.FavouriteLineItem.Id);
    -
    -        }
    -
    -        /// 
    -        /// Test Dynamique Composite Key Mapping
    -        /// 
    -        [Test]
    -        public void TestDynamiqueCompositeKeyMapping()
    -        {
    -
    -            Order order1 = (Order)sqlMap.QueryForObject("GetOrderWithDynFavouriteLineItem", 1);
    -
    -            Assert.IsNotNull(order1);
    -            Assert.IsNotNull(order1.FavouriteLineItem);
    -            Assert.AreEqual(1, order1.FavouriteLineItem.Id);
    -        }
    -
    -        /// 
    -        /// Test a simple type mapping (string)
    -        /// 
    -        [Test]
    -        public void TestSimpleTypeMapping()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllCreditCardNumbersFromOrders", null);
    -
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual("555555555555", list[0]);
    -        }
    -
    -        /// 
    -        /// Test a simple type mapping (decimal)
    -        /// 
    -        [Test]
    -        public void TestDecimalTypeMapping()
    -        {
    -            Hashtable param = new Hashtable();
    -            param.Add("LineItem_ID", 1);
    -            param.Add("Order_ID", 1);
    -            decimal price = (decimal)sqlMap.QueryForObject("GetLineItemPrice", param);
    -            Assert.AreEqual(45.43m, price);
    -        }
    -
    -        /// 
    -        /// Test Byte Array Mapping
    -        /// 
    -        /// Test for request support 1032436 ByteArrayTypeHandler misses the last byte
    -        [Test]
    -        public void TestByteArrayMapping()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            Order order = new Order();
    -            order.Id = 99;
    -            order.CardExpiry = "09/11";
    -            order.Account = account;
    -            order.CardNumber = "154564656";
    -            order.CardType = "Visa";
    -            order.City = "Lyon";
    -            order.Date = System.DateTime.MinValue;
    -            order.PostalCode = "69004";
    -            order.Province = "Rhone";
    -            order.Street = "rue Durand";
    -
    -            sqlMap.Insert("InsertOrderViaParameterMap", order);
    -
    -            LineItem item = new LineItem();
    -            item.Id = 99;
    -            item.Code = "test";
    -            item.Price = -99.99m;
    -            item.Quantity = 99;
    -            item.Order = order;
    -            item.PictureData = new byte[] { 1, 2, 3 };
    -
    -            // Check insert
    -            sqlMap.Insert("InsertLineItemWithPicture", item);
    -
    -            // select
    -            LineItem loadItem = null;
    -
    -            Hashtable param = new Hashtable();
    -            param.Add("LineItem_ID", 99);
    -            param.Add("Order_ID", 99);
    -
    -            loadItem = sqlMap.QueryForObject("GetSpecificLineItemWithPicture", param) as LineItem;
    -
    -            Assert.IsNotNull(loadItem.Id);
    -            Assert.IsNotNull(loadItem.PictureData);
    -            Assert.AreEqual(item.PictureData, loadItem.PictureData);
    -        }
    -
    -        /// 
    -        /// Test null replacement (on decimal) in ResultMap property
    -        /// 
    -        [Test]
    -        public void TestNullValueReplacementOnDecimal()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            Order order = new Order();
    -            order.Id = 99;
    -            order.CardExpiry = "09/11";
    -            order.Account = account;
    -            order.CardNumber = "154564656";
    -            order.CardType = "Visa";
    -            order.City = "Lyon";
    -            order.Date = System.DateTime.MinValue; //<-- null replacement for parameterMAp 
    -            order.PostalCode = "69004";
    -            order.Province = "Rhone";
    -            order.Street = "rue Durand";
    -
    -            sqlMap.Insert("InsertOrderViaParameterMap", order);
    -
    -            LineItem item = new LineItem();
    -            item.Id = 99;
    -            item.Code = "test";
    -            item.Price = -99.99m;//<-- null replacement for parameterMAp 
    -            item.Quantity = 99;
    -            item.Order = order;
    -
    -            sqlMap.Insert("InsertLineItem", item);
    -
    -            // Retrieve LineItem & test null replacement for resultMap 
    -
    -            LineItem testItem = (LineItem)sqlMap.QueryForObject("GetSpecificLineItemWithNullReplacement", 99);
    -
    -            Assert.IsNotNull(testItem);
    -            Assert.AreEqual(-77.77m, testItem.Price);
    -            Assert.AreEqual("test", testItem.Code);
    -        }
    -
    -        /// 
    -        /// Test null replacement (on DateTime) in ResultMap property.
    -        /// 
    -        [Test]
    -        public void TestNullValueReplacementOnDateTime()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            Order order = new Order();
    -            order.Id = 99;
    -            order.CardExpiry = "09/11";
    -            order.Account = account;
    -            order.CardNumber = "154564656";
    -            order.CardType = "Visa";
    -            order.City = "Lyon";
    -            order.Date = System.DateTime.MinValue; //<-- null replacement
    -            order.PostalCode = "69004";
    -            order.Province = "Rhone";
    -            order.Street = "rue Durand";
    -
    -            sqlMap.Insert("InsertOrderViaParameterMap", order);
    -
    -            Order orderTest = (Order)sqlMap.QueryForObject("GetOrderLiteByColumnName", 99);
    -
    -            Assert.AreEqual(System.DateTime.MinValue, orderTest.Date);
    -        }
    -        //#if dotnet2
    -
    -
    -
    -        //        /// 
    -        //        /// Test lazy mapping
    -        //        /// 
    -        //        [Test]
    -        //        public void TestLazyWithGenericStronglyTypedCollection()
    -        //        {
    -        //            Order order = (Order)sqlMap.QueryForObject("GetOrderWithLineItemCollection2", 1);
    -
    -        //            AssertOrder1(order);
    -
    -        //            Assert.IsNotNull(order.LineItemsCollection2);
    -        //            Assert.AreEqual(2, order.LineItemsCollection2.Count);
    -
    -        //            IEnumerator e = ((IEnumerable)order.LineItemsCollection2).GetEnumerator();
    -        //            while (e.MoveNext())
    -        //            {
    -        //                LineItem item = e.Current;
    -        //                Assert.IsNotNull(item);
    -        //            }
    -        //        }
    -        //#endif
    -        #endregion
    -
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementNamespaceTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementNamespaceTest.cs
    deleted file mode 100644
    index 649a2aa..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementNamespaceTest.cs
    +++ /dev/null
    @@ -1,98 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -using System.Threading;
    -using System.Configuration;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.Common;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper;
    -using IBatisNet.DataMapper.MappedStatements;
    -
    -using IBatisNet.DataMapper.Test;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// To test statement namespaces,
    -	/// set your SqlMap config settings attribute 
    -	/// useStatementNamespaces="true" 
    -	/// before running Namespace Tests.
    -	/// 
    -	[TestFixture] 
    -	[Category("StatementNamespaces")]
    -	public class StatementNamespaceTest : BaseTest
    -	{
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "order-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "line-item-init.sql" );
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "category-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Test statement namespaces
    -
    -		/// 
    -		/// Test QueryForObject
    -		/// 
    -		[Test] 
    -		public void TestQueryForObject() {
    -			Account account = sqlMap.QueryForObject("Account.GetAccountViaResultClass", 1) as Account;
    -			AssertAccount1(account);
    -		}
    -
    -		/// 
    -		/// Test collection mapping: Ilist collection 
    -		/// order.LineItemsIList 
    -		/// with statement namespaces enabled
    -		/// 
    -		[Test]
    -		public void TestListMapping() {
    -			Order order = (Order) sqlMap.QueryForObject("Order.GetOrderWithLineItemsUsingStatementNamespaces", 1);
    -
    -			AssertOrder1(order);
    -
    -			// Check IList collection
    -			Assert.IsNotNull(order.LineItemsIList);
    -			Assert.AreEqual(2, order.LineItemsIList.Count);
    -
    -		}
    -
    -		/// 
    -		/// Test Insert Via Insert Statement
    -		/// for support request 1050704:
    -		/// Unable to use selectKey with 
    -		/// useStatementNamespaces=true
    -		/// 
    -		[Test] 
    -		public void TestInsertSelectKey() {
    -			Category category = new Category();
    -			category.Name = "toto";
    -			category.Guid = Guid.NewGuid();
    -
    -			int key = (int)sqlMap.Insert("Category.InsertCategoryViaInsertStatement", category);
    -			Assert.AreEqual(1, key);
    -		}
    -
    -		#endregion
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementTest.cs
    deleted file mode 100644
    index bc2ecf4..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/StatementTest.cs
    +++ /dev/null
    @@ -1,1513 +0,0 @@
    -
    -using System;
    -using System.Collections;
    -using IBatisNet.Common;
    -using IBatisNet.Common.Exceptions;
    -using IBatisNet.Common.Utilities;
    -using IBatisNet.DataMapper.MappedStatements;
    -using IBatisNet.DataMapper.Test.Domain;
    -using NUnit.Framework;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -    /// 
    -    /// Summary description for ParameterMapTest.
    -    /// 
    -    [TestFixture]
    -    public class StatementTest : BaseTest
    -    {
    -        #region SetUp & TearDown
    -
    -        /// 
    -        /// SetUp
    -        /// 
    -        [SetUp]
    -        public void Init()
    -        {
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "account-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "order-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "line-item-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "enumeration-init.sql");
    -            InitScript(sqlMap.DataSource, ScriptDirectory + "other-init.sql");
    -        }
    -
    -        /// 
    -        /// TearDown
    -        /// 
    -        [TearDown]
    -        public void Dispose()
    -        { /* ... */
    -        }
    -
    -        #endregion
    -
    -        #region Object Query tests
    -
    -        /// 
    -        /// Interface mapping
    -        /// 
    -        [Test]
    -        [Category("JIRA")]
    -        [Description("JIRA-283")]
    -        public void TestInterface()
    -        {
    -            BaseAccount account = new BaseAccount();
    -
    -            sqlMap.QueryForObject("GetInterfaceAccount", 1, account);
    -
    -            Assert.AreEqual(1, account.Id, "account.Id");
    -            Assert.AreEqual("Joe", account.FirstName, "account.FirstName");
    -            Assert.AreEqual("Dalton", account.LastName, "account.LastName");
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", account.EmailAddress, "account.EmailAddress");
    -        }
    -
    -        /// 
    -        /// Test Open connection with a connection string
    -        /// 
    -        [Test]
    -        public void TestOpenConnection()
    -        {
    -            sqlMap.OpenConnection(sqlMap.DataSource.ConnectionString);
    -            Account account = sqlMap.QueryForObject("SelectWithProperty", null) as Account;
    -            sqlMap.CloseConnection();
    -
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test use a statement with property subtitution
    -        /// (JIRA 22)
    -        /// 
    -        [Test]
    -        public void TestSelectWithProperty()
    -        {
    -            Account account = sqlMap.QueryForObject("SelectWithProperty", null) as Account;
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject Via ColumnName
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaColumnName()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject Via ColumnIndex
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaColumnIndex()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountViaColumnIndex", 1) as Account;
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject Via ResultClass
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaResultClass()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountViaResultClass", 1) as Account;
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject With simple ResultClass : string
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithSimpleResultClass()
    -        {
    -            string email = sqlMap.QueryForObject("GetEmailAddressViaResultClass", 1) as string;
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", email);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject With simple ResultMap : string
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithSimpleResultMap()
    -        {
    -            string email = sqlMap.QueryForObject("GetEmailAddressViaResultMap", 1) as string;
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", email);
    -        }
    -
    -        /// 
    -        /// Test Primitive ReturnValue : System.DateTime
    -        /// 
    -        [Test]
    -        public void TestPrimitiveReturnValue()
    -        {
    -            DateTime CardExpiry = (DateTime)sqlMap.QueryForObject("GetOrderCardExpiryViaResultClass", 1);
    -            Assert.AreEqual(new DateTime(2003, 02, 15, 8, 15, 00), CardExpiry);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject with result object : Account
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithResultObject()
    -        {
    -            Account account = new Account();
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnName", 1, account) as Account;
    -            AssertAccount1(account);
    -            Assert.IsTrue(account == testAccount);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject as Hashtable
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectAsHashtable()
    -        {
    -            Hashtable account = (Hashtable)sqlMap.QueryForObject("GetAccountAsHashtable", 1);
    -            AssertAccount1AsHashtable(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject as Hashtable ResultClass
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectAsHashtableResultClass()
    -        {
    -            Hashtable account = (Hashtable)sqlMap.QueryForObject("GetAccountAsHashtableResultClass", 1);
    -            AssertAccount1AsHashtableForResultClass(account);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForObject via Hashtable
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaHashtable()
    -        {
    -            Hashtable param = new Hashtable();
    -            param.Add("LineItem_ID", 4);
    -            param.Add("Order_ID", 9);
    -
    -            LineItem testItem = sqlMap.QueryForObject("GetSpecificLineItem", param) as LineItem;
    -
    -            Assert.IsNotNull(testItem);
    -            Assert.AreEqual("TSM-12", testItem.Code);
    -        }
    -
    -        /// 
    -        /// Test Query Dynamic Sql Element
    -        /// 
    -        [Test]
    -        public void TestQueryDynamicSqlElement()
    -        {
    -            IList list = sqlMap.QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_ID");
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", (string)list[0]);
    -
    -            list = sqlMap.QueryForList("GetDynamicOrderedEmailAddressesViaResultMap", "Account_FirstName");
    -
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", (string)list[0]);
    -
    -        }
    -
    -        /// 
    -        /// Test Execute QueryForList With ResultMap With Dynamic Element
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForListWithResultMapWithDynamicElement()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultMapWithDynamicElement", "LIKE");
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(4, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -            Assert.AreEqual(4, ((Account)list[2]).Id);
    -
    -            list = sqlMap.QueryForList("GetAllAccountsViaResultMapWithDynamicElement", "=");
    -
    -            Assert.AreEqual(0, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Simple Dynamic Substitution
    -        /// 
    -        [Test]
    -        [Ignore("No longer supported.")]
    -        public void TestSimpleDynamicSubstitution()
    -        {
    -            string statement = "select" + "    Account_ID          as Id," + "    Account_FirstName   as FirstName," + "    Account_LastName    as LastName," + "    Account_Email       as EmailAddress" + "  from Accounts" + "  WHERE Account_ID = #id#";
    -
    -            Hashtable param = new Hashtable();
    -            param.Add("id", 1);
    -            param.Add("statement", statement);
    -
    -
    -            IList list = sqlMap.QueryForList("SimpleDynamicSubstitution", param);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, list.Count);
    -        }
    -
    -        /// 
    -        /// Test Get Account Via Inline Parameters
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectViaInlineParameters()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaInlineParameters", account) as Account;
    -
    -            AssertAccount1(testAccount);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQuery For Object With Enum property
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForObjectWithEnum()
    -        {
    -            Enumeration enumClass = sqlMap.QueryForObject("GetEnumeration", 1) as Enumeration;
    -
    -            Assert.AreEqual(enumClass.Day, Days.Sat);
    -            Assert.AreEqual(enumClass.Color, Colors.Red);
    -            Assert.AreEqual(enumClass.Month, Months.August);
    -
    -            enumClass = sqlMap.QueryForObject("GetEnumeration", 3) as Enumeration;
    -
    -            Assert.AreEqual(enumClass.Day, Days.Mon);
    -            Assert.AreEqual(enumClass.Color, Colors.Blue);
    -            Assert.AreEqual(enumClass.Month, Months.September);
    -        }
    -
    -        #endregion
    -
    -        #region  List Query tests
    -
    -        /// 
    -        /// Test QueryForList with Hashtable ResultMap
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithHashtableResultMap()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsAsHashMapViaResultMap", null);
    -
    -            AssertAccount1AsHashtable((Hashtable)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -
    -            Assert.AreEqual(1, ((Hashtable)list[0])["Id"]);
    -            Assert.AreEqual(2, ((Hashtable)list[1])["Id"]);
    -            Assert.AreEqual(3, ((Hashtable)list[2])["Id"]);
    -            Assert.AreEqual(4, ((Hashtable)list[3])["Id"]);
    -            Assert.AreEqual(5, ((Hashtable)list[4])["Id"]);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with Hashtable ResultClass
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithHashtableResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsAsHashtableViaResultClass", null);
    -
    -            AssertAccount1AsHashtableForResultClass((Hashtable)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -
    -            Assert.AreEqual(1, ((Hashtable)list[0])[BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(2, ((Hashtable)list[1])[BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(3, ((Hashtable)list[2])[BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(4, ((Hashtable)list[3])[BaseTest.ConvertKey("Id")]);
    -            Assert.AreEqual(5, ((Hashtable)list[4])[BaseTest.ConvertKey("Id")]);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with IList ResultClass
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithIListResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsAsArrayListViaResultClass", null);
    -
    -            IList listAccount = (IList)list[0];
    -            Assert.AreEqual(1, listAccount[0]);
    -            Assert.AreEqual("Joe", listAccount[1]);
    -            Assert.AreEqual("Dalton", listAccount[2]);
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", listAccount[3]);
    -
    -            Assert.AreEqual(5, list.Count);
    -
    -            listAccount = (IList)list[0];
    -            Assert.AreEqual(1, listAccount[0]);
    -            listAccount = (IList)list[1];
    -            Assert.AreEqual(2, listAccount[0]);
    -            listAccount = (IList)list[2];
    -            Assert.AreEqual(3, listAccount[0]);
    -            listAccount = (IList)list[3];
    -            Assert.AreEqual(4, listAccount[0]);
    -            listAccount = (IList)list[4];
    -            Assert.AreEqual(5, listAccount[0]);
    -        }
    -
    -        /// 
    -        /// Test QueryForList With ResultMap, result collection as ArrayList
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithResultMap()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultMap", null);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -            Assert.AreEqual(3, ((Account)list[2]).Id);
    -            Assert.AreEqual(4, ((Account)list[3]).Id);
    -            Assert.AreEqual(5, ((Account)list[4]).Id);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForPaginatedList
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForPaginatedList()
    -        {
    -            // Get List of all 5
    -            PaginatedList list = sqlMap.QueryForPaginatedList("GetAllAccountsViaResultMap", null, 2);
    -
    -            // Test initial state (page 0)
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsTrue(list.IsNextPageAvailable);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -
    -            // Test illegal previous page (no effect, state should be same)
    -            list.PreviousPage();
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsTrue(list.IsNextPageAvailable);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -
    -            // Test next (page 1)
    -            list.NextPage();
    -            Assert.IsTrue(list.IsPreviousPageAvailable);
    -            Assert.IsTrue(list.IsNextPageAvailable);
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(3, ((Account)list[0]).Id);
    -            Assert.AreEqual(4, ((Account)list[1]).Id);
    -
    -            // Test next (page 2 -last)
    -            list.NextPage();
    -            Assert.IsTrue(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(1, list.Count);
    -            Assert.AreEqual(5, ((Account)list[0]).Id);
    -
    -            // Test previous (page 1)
    -            list.PreviousPage();
    -            Assert.IsTrue(list.IsPreviousPageAvailable);
    -            Assert.IsTrue(list.IsNextPageAvailable);
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(3, ((Account)list[0]).Id);
    -            Assert.AreEqual(4, ((Account)list[1]).Id);
    -
    -            // Test previous (page 0 -first)
    -            list.PreviousPage();
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsTrue(list.IsNextPageAvailable);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -
    -            // Test goto (page 0)
    -            list.GotoPage(0);
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsTrue(list.IsNextPageAvailable);
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -
    -            // Test goto (page 1)
    -            list.GotoPage(1);
    -            Assert.IsTrue(list.IsPreviousPageAvailable);
    -            Assert.IsTrue(list.IsNextPageAvailable);
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(3, ((Account)list[0]).Id);
    -            Assert.AreEqual(4, ((Account)list[1]).Id);
    -
    -            // Test goto (page 2)
    -            list.GotoPage(2);
    -            Assert.IsTrue(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(1, list.Count);
    -            Assert.AreEqual(5, ((Account)list[0]).Id);
    -
    -            // Test illegal goto (page 0)
    -            list.GotoPage(3);
    -            Assert.IsTrue(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(0, list.Count);
    -
    -            list = sqlMap.QueryForPaginatedList("GetNoAccountsViaResultMap", null, 2);
    -
    -            // Test empty list
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(0, list.Count);
    -
    -            // Test next
    -            list.NextPage();
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(0, list.Count);
    -
    -            // Test previous
    -            list.PreviousPage();
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(0, list.Count);
    -
    -            // Test previous
    -            list.GotoPage(0);
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(0, list.Count);
    -
    -            list = sqlMap.QueryForPaginatedList("GetFewAccountsViaResultMap", null, 2);
    -
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(1, list.Count);
    -
    -            // Test next
    -            list.NextPage();
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(1, list.Count);
    -
    -            // Test previous
    -            list.PreviousPage();
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(1, list.Count);
    -
    -            // Test previous
    -            list.GotoPage(0);
    -            Assert.IsFalse(list.IsPreviousPageAvailable);
    -            Assert.IsFalse(list.IsNextPageAvailable);
    -            Assert.AreEqual(1, list.Count);
    -
    -            // Test Even - Two Pages
    -            try
    -            {
    -                InitScript(sqlMap.DataSource, ScriptDirectory + "more-account-records.sql");
    -            }
    -            catch (Exception e)
    -            {
    -                Console.WriteLine(e.Message);
    -            }
    -
    -            list = sqlMap.QueryForPaginatedList("GetAllAccountsViaResultMap", null, 5);
    -
    -            Assert.AreEqual(5, list.Count);
    -
    -            list.NextPage();
    -            Assert.AreEqual(5, list.Count);
    -
    -            bool b = list.IsPreviousPageAvailable;
    -            list.PreviousPage();
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with ResultObject : 
    -        /// AccountCollection strongly typed collection
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithResultObject()
    -        {
    -            AccountCollection accounts = new AccountCollection();
    -
    -            sqlMap.QueryForList("GetAllAccountsViaResultMap", null, accounts);
    -
    -            AssertAccount1(accounts[0]);
    -            Assert.AreEqual(5, accounts.Count);
    -            Assert.AreEqual(1, accounts[0].Id);
    -            Assert.AreEqual(2, accounts[1].Id);
    -            Assert.AreEqual(3, accounts[2].Id);
    -            Assert.AreEqual(4, accounts[3].Id);
    -            Assert.AreEqual(5, accounts[4].Id);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with ListClass : LineItemCollection
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithListClass()
    -        {
    -            LineItemCollection linesItem = sqlMap.QueryForList("GetLineItemsForOrderWithListClass", 6) as LineItemCollection;
    -
    -            Assert.IsNotNull(linesItem);
    -            Assert.AreEqual(2, linesItem.Count);
    -            Assert.AreEqual("ASM-45", linesItem[0].Code);
    -            Assert.AreEqual("QSM-39", linesItem[1].Code);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with no result.
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithNoResult()
    -        {
    -            IList list = sqlMap.QueryForList("GetNoAccountsViaResultMap", null);
    -
    -            Assert.AreEqual(0, list.Count);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with ResultClass : Account.
    -        /// 
    -        [Test]
    -        public void TestQueryForListResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultClass", null);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -            Assert.AreEqual(3, ((Account)list[2]).Id);
    -            Assert.AreEqual(4, ((Account)list[3]).Id);
    -            Assert.AreEqual(5, ((Account)list[4]).Id);
    -        }
    -
    -        /// 
    -        /// Test QueryForList with simple resultClass : string
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithSimpleResultClass()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllEmailAddressesViaResultClass", null);
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", (string)list[0]);
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", (string)list[1]);
    -            Assert.IsNull(list[2]);
    -            Assert.AreEqual("Jack.Dalton@somewhere.com", (string)list[3]);
    -            Assert.AreEqual("gilles.bayon@nospam.org", (string)list[4]);
    -        }
    -
    -        /// 
    -        /// Test  QueryForList with simple ResultMap : string
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithSimpleResultMap()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllEmailAddressesViaResultMap", null);
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", (string)list[0]);
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", (string)list[1]);
    -            Assert.IsNull(list[2]);
    -            Assert.AreEqual("Jack.Dalton@somewhere.com", (string)list[3]);
    -            Assert.AreEqual("gilles.bayon@nospam.org", (string)list[4]);
    -        }
    -
    -        /// 
    -        /// Test QueryForListWithSkipAndMax
    -        /// 
    -        [Test]
    -        public void TestQueryForListWithSkipAndMax()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaResultMap", null, 2, 2);
    -
    -            Assert.AreEqual(2, list.Count);
    -            Assert.AreEqual(3, ((Account)list[0]).Id);
    -            Assert.AreEqual(4, ((Account)list[1]).Id);
    -        }
    -
    -
    -        [Test]
    -        public void TestQueryWithRowDelegate()
    -        {
    -            RowDelegate handler = new RowDelegate(this.RowHandler);
    -
    -            IList list = sqlMap.QueryWithRowDelegate("GetAllAccountsViaResultMap", null, handler);
    -
    -            Assert.AreEqual(5, _index);
    -            Assert.AreEqual(5, list.Count);
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -            Assert.AreEqual(3, ((Account)list[2]).Id);
    -            Assert.AreEqual(4, ((Account)list[3]).Id);
    -            Assert.AreEqual(5, ((Account)list[4]).Id);
    -
    -        }
    -
    -        #endregion
    -
    -        #region  Map Tests
    -
    -        /// 
    -        /// Test ExecuteQueryForMap : Hashtable.
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForMap()
    -        {
    -            IDictionary map = sqlMap.QueryForMap("GetAllAccountsViaResultClass", null, "FirstName");
    -
    -            Assert.AreEqual(5, map.Count);
    -            AssertAccount1(((Account)map["Joe"]));
    -
    -            Assert.AreEqual(1, ((Account)map["Joe"]).Id);
    -            Assert.AreEqual(2, ((Account)map["Averel"]).Id);
    -            Assert.AreEqual(3, ((Account)map["William"]).Id);
    -            Assert.AreEqual(4, ((Account)map["Jack"]).Id);
    -            Assert.AreEqual(5, ((Account)map["Gilles"]).Id);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForMap With Cache : Hashtable.
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForMapWithCache()
    -        {
    -            IDictionary map = sqlMap.QueryForMap("GetAllAccountsCache", null, "FirstName");
    -
    -            int firstId = HashCodeProvider.GetIdentityHashCode(map);
    -
    -            Assert.AreEqual(5, map.Count);
    -            AssertAccount1(((Account)map["Joe"]));
    -
    -            Assert.AreEqual(1, ((Account)map["Joe"]).Id);
    -            Assert.AreEqual(2, ((Account)map["Averel"]).Id);
    -            Assert.AreEqual(3, ((Account)map["William"]).Id);
    -            Assert.AreEqual(4, ((Account)map["Jack"]).Id);
    -            Assert.AreEqual(5, ((Account)map["Gilles"]).Id);
    -
    -            map = sqlMap.QueryForMap("GetAllAccountsCache", null, "FirstName");
    -
    -            int secondId = HashCodeProvider.GetIdentityHashCode(map);
    -
    -            Assert.AreEqual(firstId, secondId);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForMap : Hashtable.
    -        /// 
    -        /// 
    -        /// If the keyProperty is an integer, you must acces the map
    -        /// by map[integer] and not by map["integer"]
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForMap2()
    -        {
    -            IDictionary map = sqlMap.QueryForMap("GetAllOrderWithLineItems", null, "PostalCode");
    -
    -            Assert.AreEqual(11, map.Count);
    -            Order order = ((Order)map["T4H 9G4"]);
    -
    -            Assert.AreEqual(2, order.LineItemsIList.Count);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForMap with value property :
    -        /// "FirstName" as key, "EmailAddress" as value
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForMapWithValueProperty()
    -        {
    -            IDictionary map = sqlMap.QueryForMap("GetAllAccountsViaResultClass", null, "FirstName", "EmailAddress");
    -
    -            Assert.AreEqual(5, map.Count);
    -
    -            Assert.AreEqual("Joe.Dalton@somewhere.com", map["Joe"]);
    -            Assert.AreEqual("Averel.Dalton@somewhere.com", map["Averel"]);
    -            Assert.IsNull(map["William"]);
    -            Assert.AreEqual("Jack.Dalton@somewhere.com", map["Jack"]);
    -            Assert.AreEqual("gilles.bayon@nospam.org", map["Gilles"]);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryForWithJoined
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForWithJoined()
    -        {
    -            Order order = sqlMap.QueryForObject("GetOrderJoinWithAccount", 10) as Order;
    -
    -            Assert.IsNotNull(order.Account);
    -
    -            order = sqlMap.QueryForObject("GetOrderJoinWithAccount", 11) as Order;
    -
    -            Assert.IsNull(order.Account);
    -        }
    -
    -        /// 
    -        ///  Better support for nested result maps when using dictionary
    -        /// 
    -        [Test]
    -        [Category("JIRA-254")]
    -        public void Better_Support_For_Nested_Result_Maps_When_Using_Dictionary()
    -        {
    -            IDictionary order = (IDictionary)sqlMap.QueryForObject("JIRA-254", 10);
    -
    -            Assert.IsNotNull(order["Account"]);
    -
    -            order = (IDictionary)sqlMap.QueryForObject("JIRA-254", 11);
    -
    -            Assert.IsNull(order["Account"]);
    -        }
    -
    -        /// 
    -        /// Test ExecuteQueryFor With Complex Joined
    -        /// 
    -        /// 
    -        /// A->B->C
    -        ///  ->E
    -        ///  ->F
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryForWithComplexJoined()
    -        {
    -            A a = sqlMap.QueryForObject("SelectComplexJoined", null) as A;
    -
    -            Assert.IsNotNull(a);
    -            Assert.IsNotNull(a.B);
    -            Assert.IsNotNull(a.B.C);
    -            Assert.IsNull(a.B.D);
    -            Assert.IsNotNull(a.E);
    -            Assert.IsNull(a.F);
    -        }
    -        #endregion
    -
    -        #region Extends statement
    -
    -        /// 
    -        /// Test base Extends statement
    -        /// 
    -        [Test]
    -        public void TestExtendsGetAllAccounts()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccounts", null);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -            Assert.AreEqual(3, ((Account)list[2]).Id);
    -            Assert.AreEqual(4, ((Account)list[3]).Id);
    -            Assert.AreEqual(5, ((Account)list[4]).Id);
    -        }
    -
    -        /// 
    -        /// Test Extends statement GetAllAccountsOrderByName extends GetAllAccounts
    -        /// 
    -        [Test]
    -        public void TestExtendsGetAllAccountsOrderByName()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsOrderByName", null);
    -
    -            AssertAccount1((Account)list[3]);
    -            Assert.AreEqual(5, list.Count);
    -
    -            Assert.AreEqual(2, ((Account)list[0]).Id);
    -            Assert.AreEqual(5, ((Account)list[1]).Id);
    -            Assert.AreEqual(4, ((Account)list[2]).Id);
    -            Assert.AreEqual(1, ((Account)list[3]).Id);
    -            Assert.AreEqual(3, ((Account)list[4]).Id);
    -        }
    -
    -        /// 
    -        /// Test Extends statement GetOneAccount extends GetAllAccounts
    -        /// 
    -        [Test]
    -        public void TestExtendsGetOneAccount()
    -        {
    -            Account account = sqlMap.QueryForObject("GetOneAccount", 1) as Account;
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test Extends statement GetSomeAccount extends GetAllAccounts
    -        /// 
    -        [Test]
    -        public void TestExtendsGetSomeAccount()
    -        {
    -            Hashtable param = new Hashtable();
    -            param.Add("lowID", 2);
    -            param.Add("hightID", 4);
    -
    -            IList list = sqlMap.QueryForList("GetSomeAccount", param);
    -
    -            Assert.AreEqual(3, list.Count);
    -
    -            Assert.AreEqual(2, ((Account)list[0]).Id);
    -            Assert.AreEqual(3, ((Account)list[1]).Id);
    -            Assert.AreEqual(4, ((Account)list[2]).Id);
    -        }
    -
    -        [Test]
    -        public void TestDummy()
    -        {
    -            Hashtable param = new Hashtable();
    -            param.Add("?lowID", 2);
    -            param.Add("?hightID", 4);
    -
    -            IList list = sqlMap.QueryForList("GetDummy", param);
    -
    -            Assert.AreEqual(3, list.Count);
    -
    -            Assert.AreEqual(2, ((Account)list[0]).Id);
    -            Assert.AreEqual(3, ((Account)list[1]).Id);
    -            Assert.AreEqual(4, ((Account)list[2]).Id);
    -        }
    -
    -        #endregion
    -
    -        #region Update tests
    -
    -        /// 
    -        /// Test Insert with post GeneratedKey
    -        /// 
    -        [Test]
    -        public void TestInsertPostKey()
    -        {
    -            LineItem item = new LineItem();
    -
    -            item.Id = 350;
    -            item.Code = "blah";
    -            item.Order = new Order();
    -            item.Order.Id = 9;
    -            item.Price = 44.00m;
    -            item.Quantity = 1;
    -
    -            object key = sqlMap.Insert("InsertLineItemPostKey", item);
    -
    -            Assert.AreEqual(99, key);
    -            Assert.AreEqual(99, item.Id);
    -
    -            Hashtable param = new Hashtable();
    -            param.Add("Order_ID", 9);
    -            param.Add("LineItem_ID", 350);
    -            LineItem testItem = (LineItem)sqlMap.QueryForObject("GetSpecificLineItem", param);
    -            Assert.IsNotNull(testItem);
    -            Assert.AreEqual(350, testItem.Id);
    -        }
    -
    -        /// 
    -        /// Test Insert pre GeneratedKey
    -        /// 
    -        [Test]
    -        public void TestInsertPreKey()
    -        {
    -            LineItem item = new LineItem();
    -
    -            item.Id = 10;
    -            item.Code = "blah";
    -            item.Order = new Order();
    -            item.Order.Id = 9;
    -            item.Price = 44.00m;
    -            item.Quantity = 1;
    -
    -            object key = sqlMap.Insert("InsertLineItemPreKey", item);
    -
    -            Assert.AreEqual(99, key);
    -            Assert.AreEqual(99, item.Id);
    -
    -            Hashtable param = new Hashtable();
    -            param.Add("Order_ID", 9);
    -            param.Add("LineItem_ID", 99);
    -
    -            LineItem testItem = (LineItem)sqlMap.QueryForObject("GetSpecificLineItem", param);
    -
    -            Assert.IsNotNull(testItem);
    -            Assert.AreEqual(99, testItem.Id);
    -        }
    -
    -        /// 
    -        /// Test Test Insert No Key
    -        /// 
    -        [Test]
    -        public void TestInsertNoKey()
    -        {
    -            LineItem item = new LineItem();
    -
    -            item.Id = 100;
    -            item.Code = "blah";
    -            item.Order = new Order();
    -            item.Order.Id = 9;
    -            item.Price = 44.00m;
    -            item.Quantity = 1;
    -
    -            object key = sqlMap.Insert("InsertLineItemNoKey", item);
    -
    -            Assert.IsNull(key);
    -            Assert.AreEqual(100, item.Id);
    -
    -            Hashtable param = new Hashtable();
    -            param.Add("Order_ID", 9);
    -            param.Add("LineItem_ID", 100);
    -
    -            LineItem testItem = (LineItem)sqlMap.QueryForObject("GetSpecificLineItem", param);
    -
    -            Assert.IsNotNull(testItem);
    -            Assert.AreEqual(100, testItem.Id);
    -        }
    -
    -        /// 
    -        /// Test Insert account via public fields
    -        /// 
    -        [Ignore("No more supported")]
    -        public void TestInsertAccountViaPublicFields()
    -        {
    -            AccountBis account = new AccountBis();
    -
    -            account.Id = 10;
    -            account.FirstName = "Luky";
    -            account.LastName = "Luke";
    -            account.EmailAddress = "luly.luke@somewhere.com";
    -
    -            sqlMap.Insert("InsertAccountViaPublicFields", account);
    -
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnName", 10) as Account;
    -
    -            Assert.IsNotNull(testAccount);
    -            Assert.AreEqual(10, testAccount.Id);
    -        }
    -
    -        public void TestInsertOrderViaProperties()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            Order order = new Order();
    -            order.Id = 99;
    -            order.CardExpiry = "09/11";
    -            order.Account = account;
    -            order.CardNumber = "154564656";
    -            order.CardType = "Visa";
    -            order.City = "Lyon";
    -            order.Date = DateTime.Now;
    -            order.PostalCode = "69004";
    -            order.Province = "Rhone";
    -            order.Street = "rue Durand";
    -
    -            sqlMap.Insert("InsertOrderViaPublicFields", order);
    -        }
    -
    -        /// 
    -        /// Test Insert account via public fields
    -        /// 
    -        public void TestInsertDynamic()
    -        {
    -            Account account = new Account();
    -
    -            account.Id = 10;
    -            account.FirstName = "Luky";
    -            account.LastName = "luke";
    -            account.EmailAddress = null;
    -
    -            sqlMap.Insert("InsertAccountDynamic", account);
    -
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnIndex", 10) as Account;
    -
    -            Assert.IsNotNull(testAccount);
    -            Assert.AreEqual(10, testAccount.Id);
    -            Assert.AreEqual("no_email@provided.com", testAccount.EmailAddress);
    -
    -            account.Id = 11;
    -            account.FirstName = "Luky";
    -            account.LastName = "luke";
    -            account.EmailAddress = "luly.luke@somewhere.com";
    -
    -            sqlMap.Insert("InsertAccountDynamic", account);
    -
    -            testAccount = sqlMap.QueryForObject("GetAccountViaColumnIndex", 11) as Account;
    -
    -            Assert.IsNotNull(testAccount);
    -            Assert.AreEqual(11, testAccount.Id);
    -            Assert.AreEqual("luly.luke@somewhere.com", testAccount.EmailAddress);
    -        }
    -
    -        /// 
    -        /// Test Insert account via inline parameters
    -        /// 
    -        [Test]
    -        public void TestInsertAccountViaInlineParameters()
    -        {
    -            Account account = new Account();
    -
    -            account.Id = 10;
    -            account.FirstName = "Luky";
    -            account.LastName = "Luke";
    -            account.EmailAddress = "luly.luke@somewhere.com";
    -
    -            sqlMap.Insert("InsertAccountViaInlineParameters", account);
    -
    -            Account testAccount = sqlMap.QueryForObject("GetAccountViaColumnIndex", 10) as Account;
    -
    -            Assert.IsNotNull(testAccount);
    -            Assert.AreEqual(10, testAccount.Id);
    -        }
    -
    -        /// 
    -        /// Test Insert account via parameterMap
    -        /// 
    -        [Test]
    -        public void TestInsertAccountViaParameterMap()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            account = sqlMap.QueryForObject("GetAccountNullableEmail", 6) as Account;
    -
    -            AssertAccount6(account);
    -        }
    -
    -        /// 
    -        /// Test Insert account via parameterMap
    -        /// 
    -        [Test]
    -        public void TestInsertEnumViaParameterMap()
    -        {
    -            Enumeration enumClass = new Enumeration();
    -            enumClass.Id = 99;
    -            enumClass.Day = Days.Thu;
    -            enumClass.Color = Colors.Blue;
    -            enumClass.Month = Months.May;
    -
    -            sqlMap.Insert("InsertEnumViaParameterMap", enumClass);
    -
    -            enumClass = null;
    -            enumClass = sqlMap.QueryForObject("GetEnumeration", 99) as Enumeration;
    -
    -            Assert.AreEqual(enumClass.Day, Days.Thu);
    -            Assert.AreEqual(enumClass.Color, Colors.Blue);
    -            Assert.AreEqual(enumClass.Month, Months.May);
    -        }
    -
    -        /// 
    -        /// Test Update via parameterMap
    -        /// 
    -        [Test]
    -        public void TestUpdateViaParameterMap()
    -        {
    -            Account account = (Account)sqlMap.QueryForObject("GetAccountViaColumnName", 1);
    -
    -            account.EmailAddress = "new@somewhere.com";
    -            sqlMap.Update("UpdateAccountViaParameterMap", account);
    -
    -            account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
    -
    -            Assert.AreEqual("new@somewhere.com", account.EmailAddress);
    -        }
    -
    -        /// 
    -        /// Test Update via parameterMap V2
    -        /// 
    -        [Test]
    -        public void TestUpdateViaParameterMap2()
    -        {
    -            Account account = (Account)sqlMap.QueryForObject("GetAccountViaColumnName", 1);
    -
    -            account.EmailAddress = "new@somewhere.com";
    -            sqlMap.Update("UpdateAccountViaParameterMap2", account);
    -
    -            account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
    -
    -            Assert.AreEqual("new@somewhere.com", account.EmailAddress);
    -        }
    -
    -        /// 
    -        /// Test Update with inline parameters
    -        /// 
    -        [Test]
    -        public void TestUpdateWithInlineParameters()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
    -
    -            account.EmailAddress = "new@somewhere.com";
    -            sqlMap.Update("UpdateAccountViaInlineParameters", account);
    -
    -            account = (Account)sqlMap.QueryForObject("GetAccountViaColumnName", 1);
    -
    -            Assert.AreEqual("new@somewhere.com", account.EmailAddress);
    -        }
    -
    -        /// 
    -        /// Test Execute Update With Parameter Class
    -        /// 
    -        [Test]
    -        public void TestExecuteUpdateWithParameterClass()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            bool checkForInvalidTypeFailedAppropriately = false;
    -
    -            try
    -            {
    -                sqlMap.Update("DeleteAccount", new object());
    -            }
    -            catch (IBatisNetException e)
    -            {
    -                Console.WriteLine("TestExecuteUpdateWithParameterClass :" + e.Message);
    -                checkForInvalidTypeFailedAppropriately = true;
    -            }
    -
    -            sqlMap.Update("DeleteAccount", account);
    -
    -            account = sqlMap.QueryForObject("GetAccountViaColumnName", 6) as Account;
    -
    -            Assert.IsNull(account);
    -            Assert.IsTrue(checkForInvalidTypeFailedAppropriately);
    -        }
    -
    -        /// 
    -        /// Test Execute Delete
    -        /// 
    -        [Test]
    -        public void TestExecuteDelete()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            account = null;
    -            account = sqlMap.QueryForObject("GetAccountViaColumnName", 6) as Account;
    -
    -            Assert.IsTrue(account.Id == 6);
    -
    -            int rowNumber = sqlMap.Delete("DeleteAccount", account);
    -            Assert.IsTrue(rowNumber == 1);
    -
    -            account = sqlMap.QueryForObject("GetAccountViaColumnName", 6) as Account;
    -
    -            Assert.IsNull(account);
    -        }
    -
    -        /// 
    -        /// Test Execute Delete
    -        /// 
    -        [Test]
    -        public void TestDeleteWithComments()
    -        {
    -            int rowNumber = sqlMap.Delete("DeleteWithComments", null);
    -
    -            Assert.IsTrue(rowNumber == 3);
    -        }
    -
    -        /// 
    -        /// Test Execute delete Via Inline Parameters
    -        /// 
    -        [Test]
    -        public void TestDeleteViaInlineParameters()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -            int rowNumber = sqlMap.Delete("DeleteAccountViaInlineParameters", 6);
    -
    -            Assert.IsTrue(rowNumber == 1);
    -        }
    -
    -        #endregion
    -
    -        #region Row delegate
    -
    -        private int _index = 0;
    -
    -        public void RowHandler(object obj, object paramterObject, IList list)
    -        {
    -            _index++;
    -            Assert.AreEqual(_index, ((Account)obj).Id);
    -            list.Add(obj);
    -        }
    -
    -        #endregion
    -
    -        #region Tests using syntax
    -
    -        /// 
    -        /// Test Test Using syntax on sqlMap.OpenConnection
    -        /// 
    -        [Test]
    -        public void TestUsingConnection()
    -        {
    -            using (IDalSession session = sqlMap.OpenConnection())
    -            {
    -                Account account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
    -                AssertAccount1(account);
    -            } // compiler will call Dispose on SqlMapSession
    -        }
    -
    -        /// 
    -        /// Test Using syntax on sqlMap.BeginTransaction
    -        /// 
    -        [Test]
    -        public void TestUsingTransaction()
    -        {
    -            using (IDalSession session = sqlMap.BeginTransaction())
    -            {
    -                Account account = (Account)sqlMap.QueryForObject("GetAccountViaColumnName", 1);
    -
    -                account.EmailAddress = "new@somewhere.com";
    -                sqlMap.Update("UpdateAccountViaParameterMap", account);
    -
    -                account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
    -
    -                Assert.AreEqual("new@somewhere.com", account.EmailAddress);
    -
    -                session.Complete(); // Commit
    -            } // compiler will call Dispose on SqlMapSession
    -        }
    -
    -        /// 
    -        /// Test Using syntax on sqlMap.BeginTransaction
    -        /// 
    -        [Test]
    -        public void TestUsing()
    -        {
    -            sqlMap.OpenConnection();
    -            sqlMap.BeginTransaction(false);
    -            Account account = (Account)sqlMap.QueryForObject("GetAccountViaColumnName", 1);
    -
    -            account.EmailAddress = "new@somewhere.com";
    -            sqlMap.Update("UpdateAccountViaParameterMap", account);
    -
    -            account = sqlMap.QueryForObject("GetAccountViaColumnName", 1) as Account;
    -
    -            Assert.AreEqual("new@somewhere.com", account.EmailAddress);
    -
    -            sqlMap.CommitTransaction(false);
    -            sqlMap.CloseConnection();
    -        }
    -
    -        #endregion
    -
    -        #region JIRA Tests
    -
    -        /// 
    -        /// Test a constructor argument with select tag.
    -        /// 
    -        [Test]
    -        public void TestJIRA182()
    -        {
    -            Order order = sqlMap.QueryForObject("JIRA182", 5) as Order;
    -
    -            Assert.IsTrue(order.Id == 5);
    -            Assert.IsNotNull(order.Account);
    -            Assert.AreEqual(5, order.Account.Id);
    -        }
    -
    -        /// 
    -        /// QueryForDictionary does not process select property
    -        /// 
    -        [Test]
    -        public void TestJIRA220()
    -        {
    -            IDictionary map = sqlMap.QueryForMap("JIAR220", null, "PostalCode");
    -
    -            Assert.AreEqual(11, map.Count);
    -            Order order = ((Order)map["T4H 9G4"]);
    -
    -            Assert.AreEqual(2, order.LineItemsIList.Count);
    -        }
    -
    -        /// 
    -        /// Test JIRA 30 (repeating property)
    -        /// 
    -        [Test]
    -        public void TestJIRA30()
    -        {
    -            Account account = new Account();
    -            account.Id = 1;
    -            account.FirstName = "Joe";
    -            account.LastName = "Dalton";
    -            account.EmailAddress = "Joe.Dalton@somewhere.com";
    -
    -            Account result = sqlMap.QueryForObject("GetAccountWithRepeatingProperty", account) as Account;
    -
    -            AssertAccount1(result);
    -        }
    -
    -        /// 
    -        /// Test Bit column 
    -        /// 
    -        [Test]
    -        public void TestJIRA42()
    -        {
    -            Other other = new Other();
    -
    -            other.Int = 100;
    -            other.Bool = true;
    -            other.Long = 789456321;
    -
    -            sqlMap.Insert("InsertBool", other);
    -        }
    -
    -        /// 
    -        /// Test for access a result map in a different namespace 
    -        /// 
    -        [Test]
    -        public void TestJIRA45()
    -        {
    -            Account account = sqlMap.QueryForObject("GetAccountJIRA45", 1) as Account;
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test : Whitespace is not maintained properly when CDATA tags are used
    -        /// 
    -        [Test]
    -        public void TestJIRA110()
    -        {
    -            Account account = sqlMap.QueryForObject("Get1Account", null) as Account;
    -            AssertAccount1(account);
    -        }
    -
    -        /// 
    -        /// Test : Whitespace is not maintained properly when CDATA tags are used
    -        /// 
    -        [Test]
    -        public void TestJIRA110Bis()
    -        {
    -            IList list = sqlMap.QueryForList("GetAccounts", null);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -        }
    -
    -        /// 
    -        /// Test for cache stats only being calculated on CachingStatments
    -        /// 
    -        [Test]
    -        public void TestJIRA113()
    -        {
    -            sqlMap.FlushCaches();
    -
    -            // taken from TestFlushDataCache()
    -            // first query is not cached, second query is: 50% cache hit
    -            IList list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -            int firstId = HashCodeProvider.GetIdentityHashCode(list);
    -            list = sqlMap.QueryForList("GetCachedAccountsViaResultMap", null);
    -            int secondId = HashCodeProvider.GetIdentityHashCode(list);
    -            Assert.AreEqual(firstId, secondId);
    -
    -            string cacheStats = sqlMap.GetDataCacheStats();
    -
    -            Assert.IsNotNull(cacheStats);
    -        }
    -
    -        #endregion
    -
    -        #region CustomTypeHandler tests
    -
    -        /// 
    -        /// Test CustomTypeHandler 
    -        /// 
    -        [Test]
    -        public void TestExecuteQueryWithCustomTypeHandler()
    -        {
    -            IList list = sqlMap.QueryForList("GetAllAccountsViaCustomTypeHandler", null);
    -
    -            AssertAccount1((Account)list[0]);
    -            Assert.AreEqual(5, list.Count);
    -            Assert.AreEqual(1, ((Account)list[0]).Id);
    -            Assert.AreEqual(2, ((Account)list[1]).Id);
    -            Assert.AreEqual(3, ((Account)list[2]).Id);
    -            Assert.AreEqual(4, ((Account)list[3]).Id);
    -            Assert.AreEqual(5, ((Account)list[4]).Id);
    -
    -            Assert.IsFalse(((Account)list[0]).CartOption);
    -            Assert.IsFalse(((Account)list[1]).CartOption);
    -            Assert.IsTrue(((Account)list[2]).CartOption);
    -            Assert.IsTrue(((Account)list[3]).CartOption);
    -            Assert.IsTrue(((Account)list[4]).CartOption);
    -
    -            Assert.IsTrue(((Account)list[0]).BannerOption);
    -            Assert.IsTrue(((Account)list[1]).BannerOption);
    -            Assert.IsFalse(((Account)list[2]).BannerOption);
    -            Assert.IsFalse(((Account)list[3]).BannerOption);
    -            Assert.IsTrue(((Account)list[4]).BannerOption);
    -        }
    -
    -        /// 
    -        /// Test CustomTypeHandler Oui/Non
    -        /// 
    -        [Test]
    -        public void TestCustomTypeHandler()
    -        {
    -            Other other = new Other();
    -            other.Int = 99;
    -            other.Long = 1966;
    -            other.Bool = true;
    -            other.Bool2 = false;
    -
    -            sqlMap.Insert("InsertCustomTypeHandler", other);
    -
    -            Other anOther = sqlMap.QueryForObject("SelectByInt", 99) as Other;
    -
    -            Assert.IsNotNull(anOther);
    -            Assert.AreEqual(99, anOther.Int);
    -            Assert.AreEqual(1966, anOther.Long);
    -            Assert.AreEqual(true, anOther.Bool);
    -            Assert.AreEqual(false, anOther.Bool2);
    -        }
    -
    -        /// 
    -        /// Test CustomTypeHandler Oui/Non
    -        /// 
    -        [Test]
    -        public void TestInsertInlineCustomTypeHandlerV1()
    -        {
    -            Other other = new Other();
    -            other.Int = 99;
    -            other.Long = 1966;
    -            other.Bool = true;
    -            other.Bool2 = false;
    -
    -            sqlMap.Insert("InsertInlineCustomTypeHandlerV1", other);
    -
    -            Other anOther = sqlMap.QueryForObject("SelectByInt", 99) as Other;
    -
    -            Assert.IsNotNull(anOther);
    -            Assert.AreEqual(99, anOther.Int);
    -            Assert.AreEqual(1966, anOther.Long);
    -            Assert.AreEqual(true, anOther.Bool);
    -            Assert.AreEqual(false, anOther.Bool2);
    -        }
    -
    -        /// 
    -        /// Test CustomTypeHandler Oui/Non
    -        /// 
    -        [Test]
    -        public void TestInsertInlineCustomTypeHandlerV2()
    -        {
    -            Other other = new Other();
    -            other.Int = 99;
    -            other.Long = 1966;
    -            other.Bool = true;
    -            other.Bool2 = false;
    -
    -            sqlMap.Insert("InsertInlineCustomTypeHandlerV2", other);
    -
    -            Other anOther = sqlMap.QueryForObject("SelectByInt", 99) as Other;
    -
    -            Assert.IsNotNull(anOther);
    -            Assert.AreEqual(99, anOther.Int);
    -            Assert.AreEqual(1966, anOther.Long);
    -            Assert.AreEqual(true, anOther.Bool);
    -            Assert.AreEqual(false, anOther.Bool2);
    -        }
    -        #endregion
    -    }
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ThreadTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ThreadTest.cs
    deleted file mode 100644
    index edfc522..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/ThreadTest.cs
    +++ /dev/null
    @@ -1,151 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Threading;
    -using System.Configuration;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Exceptions;
    -
    -using IBatisNet.DataMapper.Test;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -using log4net;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for TransactionTest.
    -	/// 
    -	[TestFixture] 
    -	public class ThreadTest: BaseTest
    -	{
    -		private static readonly ILog _logger = LogManager.GetLogger( System.Reflection.MethodBase.GetCurrentMethod().DeclaringType );
    -
    -		private static int _numberOfThreads = 10;
    -		private ManualResetEvent  _startEvent = new ManualResetEvent(false);
    -		private ManualResetEvent  _stopEvent = new ManualResetEvent(false);
    -
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp 
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Thread test
    -
    -		[Test]
    -		public void TestCommonUsageMultiThread()
    -		{
    -			const int threadCount = 10;
    -
    -			Thread[] threads = new Thread[threadCount];
    -			
    -			for(int i = 0; i < threadCount; i++)
    -			{
    -				threads[i] = new Thread(new ThreadStart(ExecuteMethodUntilSignal));
    -				threads[i].Start();
    -			}
    -
    -			_startEvent.Set();
    -
    -			Thread.CurrentThread.Join(1 * 2000);
    -
    -			_stopEvent.Set();
    -		}
    -
    -		public void ExecuteMethodUntilSignal()
    -		{
    -			_startEvent.WaitOne(int.MaxValue, false);
    -
    -			while (!_stopEvent.WaitOne(1, false))
    -			{
    -				Assert.IsFalse(sqlMap.IsSessionStarted);
    -
    -				Console.WriteLine("Begin Thread : " + Thread.CurrentThread.GetHashCode());
    -
    -				Account account = (Account) sqlMap.QueryForObject("GetAccountViaColumnIndex", 1);
    -				
    -				Assert.IsFalse(sqlMap.IsSessionStarted);
    -				
    -				Assert.AreEqual(1, account.Id, "account.Id");
    -				Assert.AreEqual("Joe", account.FirstName, "account.FirstName");
    -				Assert.AreEqual("Dalton", account.LastName, "account.LastName");
    -
    -				Console.WriteLine("End Thread : " + Thread.CurrentThread.GetHashCode());
    -			}
    -		}
    -
    -		/// 
    -		/// Test BeginTransaction, CommitTransaction
    -		/// 
    -		[Test] 
    -		public void TestThread() 
    -		{
    -			Account account = NewAccount6();
    -
    -			try 
    -			{
    -				Thread[] threads = new Thread[_numberOfThreads];
    -
    -				AccessTest accessTest = new AccessTest();
    -
    -				for (int i = 0; i < _numberOfThreads; i++) 
    -				{
    -					Thread thread = new Thread(new ThreadStart(accessTest.GetAccount));
    -					threads[i] = thread;
    -				}
    -				for (int i = 0; i < _numberOfThreads; i++) 
    -				{
    -					threads[i].Start();
    -				}
    -			} 
    -			finally 
    -			{
    -			}
    -
    -		}
    -
    -		#endregion
    -
    -		/// 
    -		/// Summary description for AccessTest.
    -		/// 
    -		private class AccessTest
    -		{
    -		
    -			/// 
    -			/// Get an account
    -			/// 
    -			public void GetAccount()
    -			{
    -				Assert.IsFalse(sqlMap.IsSessionStarted);
    -				
    -				Account account = (Account) sqlMap.QueryForObject("GetAccountViaColumnIndex", 1);
    -				
    -				Assert.IsFalse(sqlMap.IsSessionStarted);
    -				
    -				Assert.AreEqual(1, account.Id, "account.Id");
    -				Assert.AreEqual("Joe", account.FirstName, "account.FirstName");
    -				Assert.AreEqual("Dalton", account.LastName, "account.LastName");
    -
    -			}
    -		}	
    -	}
    -
    -
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/TransactionTest.cs b/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/TransactionTest.cs
    deleted file mode 100644
    index 85b7668..0000000
    --- a/src/IBatisNet.DataMapper.Test/NUnit/SqlMapTests/TransactionTest.cs
    +++ /dev/null
    @@ -1,216 +0,0 @@
    -using System;
    -using System.Collections;
    -using System.Configuration;
    -
    -using NUnit.Framework;
    -
    -using IBatisNet.DataMapper.Exceptions;
    -
    -using IBatisNet.DataMapper.Test;
    -using IBatisNet.DataMapper.Test.Domain;
    -
    -namespace IBatisNet.DataMapper.Test.NUnit.SqlMapTests
    -{
    -	/// 
    -	/// Summary description for TransactionTest.
    -	/// 
    -	[TestFixture] 
    -	public class TransactionTest: BaseTest
    -	{
    -
    -		#region SetUp & TearDown
    -
    -		/// 
    -		/// SetUp 
    -		/// 
    -		[SetUp] 
    -		public void Init() 
    -		{
    -			InitScript( sqlMap.DataSource, ScriptDirectory + "account-init.sql" );
    -		}
    -
    -		/// 
    -		/// TearDown
    -		/// 
    -		[TearDown] 
    -		public void Dispose()
    -		{ /* ... */ } 
    -
    -		#endregion
    -
    -		#region Transaction tests
    -
    -        /// 
    -        /// Test IsTransactionStart
    -        /// 
    -        [Test]
    -        public void TestIsTransactionStartProperty()
    -        {
    -            Account account = NewAccount6();
    -
    -            sqlMap.BeginTransaction();
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -            InsertNewAccount();
    -            sqlMap.CommitTransaction();
    -
    -        }
    -
    -        public void InsertNewAccount()
    -        {
    -            Account account = NewAccount6();
    -            account.Id = 7;
    -            bool existingTransaction = (sqlMap.LocalSession != null && !sqlMap.LocalSession.IsTransactionStart);
    -
    -            if (existingTransaction)
    -            {
    -                 sqlMap.BeginTransaction();
    -            }
    -            sqlMap.Insert("InsertAccountViaParameterMap", account);
    -            if (existingTransaction)
    -            {
    -                sqlMap.CommitTransaction();
    -            }
    -        }
    -
    -		/// 
    -		/// Test BeginTransaction, CommitTransaction
    -		/// 
    -		[Test] 
    -		public void TestBeginCommitTransaction() 
    -		{
    -			Account account = NewAccount6();
    -
    -			try 
    -			{
    -				sqlMap.BeginTransaction();
    -				sqlMap.Insert("InsertAccountViaParameterMap", account);
    -				sqlMap.CommitTransaction();
    -			} 
    -			finally 
    -			{
    -			}
    -
    -			// This will use autocommit...
    -			account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 6);
    -
    -			AssertAccount6(account);
    -		}
    -
    -		/// 
    -		/// Test that nested BeginTransaction throw an exception
    -		/// 
    -		[Test] 
    -		public void TestTransactionAlreadyStarted() 
    -		{
    -			Account account = NewAccount6();
    -			bool exceptionThrownAsExpected = false;
    -
    -			try 
    -			{
    -				sqlMap.BeginTransaction();
    -				sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -				try 
    -				{
    -					sqlMap.BeginTransaction(); // transaction already started
    -				} 
    -				catch (DataMapperException e) 
    -				{
    -					exceptionThrownAsExpected = true;
    -					Console.WriteLine ( "Test TransactionAlreadyStarted " + e.Message );
    -				}
    -				sqlMap.CommitTransaction();
    -			} 
    -			finally 
    -			{
    -			}
    -
    -			// This will use autocommit...
    -			account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 6);
    -			AssertAccount6(account);
    -			Assert.IsTrue(exceptionThrownAsExpected);
    -		}
    -
    -		/// 
    -		/// Test that CommitTransaction without BeginTransaction trow an exception
    -		/// 
    -		[Test]
    -		public void TestNoTransactionStarted() 
    -		{
    -			Account account = NewAccount6();
    -			bool exceptionThrownAsExpected = false;
    -
    -			sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -			try 
    -			{
    -				sqlMap.CommitTransaction(); // No transaction started
    -			} 
    -			catch (DataMapperException e) 
    -			{
    -				exceptionThrownAsExpected = true;
    -				Console.WriteLine ( "Test NoTransactionStarted " + e.Message );
    -			}
    -
    -			// This will use autocommit...
    -			Assert.IsTrue(exceptionThrownAsExpected);
    -			account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 6);
    -			AssertAccount6(account);
    -		}
    -
    -		/// 
    -		/// Test a RollBack Transaction.
    -		/// 
    -		[Test] 
    -		public void TestBeginRollbackTransaction() 
    -		{
    -			Account account = NewAccount6();
    -
    -			try 
    -			{
    -				sqlMap.BeginTransaction();
    -				sqlMap.Insert("InsertAccountViaParameterMap", account);
    -			} 
    -			finally 
    -			{
    -				sqlMap.RollBackTransaction();
    -			}
    -
    -			// This will use autocommit...
    -			account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 6);
    -			Assert.IsNull(account);
    -		}
    -
    -		#endregion
    -
    -		#region AutoCommit tests
    -
    -		/// 
    -		/// Test usage of auto commit for an insert
    -		/// 
    -		[Test] 
    -		public void TestAutoCommitInsert() 
    -		{
    -			Account account = NewAccount6();
    -
    -			sqlMap.Insert("InsertAccountViaParameterMap", account);
    -
    -			account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 6);
    -			AssertAccount6(account);
    -		}
    -
    -		/// 
    -		/// Test usage of auto commit for a query
    -		/// 
    -		[Test] 
    -		public void TestAutoCommitQuery() 
    -		{
    -			Account account = (Account) sqlMap.QueryForObject("GetAccountNullableEmail", 1);
    -
    -			AssertAccount1(account);
    -		}
    -
    -		#endregion
    -
    -	}
    -}
    diff --git a/src/IBatisNet.DataMapper.Test/ReadMe.txt b/src/IBatisNet.DataMapper.Test/ReadMe.txt
    deleted file mode 100644
    index 74b446f..0000000
    --- a/src/IBatisNet.DataMapper.Test/ReadMe.txt
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -
    -To pass tests for MS Sql Server
    -------------------------------
    -1/ Create the database with the script 'scripts\(database name)\DBCreation.sql'
    -
    -2/ In 'bin/IBatisNet.Test.dll.config' :
    -		set the database value to the name of database server : MSSQL,Oracle, Acces, MySql
    -		set the providerType key to a provider :
    -			- 'SqlClient' to run test via native .Net provider for Sql Server.
    -			- 'ByteFx' to run test via native .Net provider for MySql.
    -			- 'OracleClient' to run test via native .Net provider for Oracle.
    -			- 'Oledb' to run test via Oledb provider. (Access)
    -			- 'Odbc' to run test via Odbc provider.
    -3/ With the help of the DataBase-Template.config
    -   create a file named DataBase.config with your own value for datasource.
    -   (WARNInG : don't included it in the solution and don't commit it in SVN)
    -   Put it in the bin/debug directory
    -   
    -4/ To test for .NET V2, enabled provider 'sqlServer2.0' and 
    -   set  in SqlMap_MSSQL_SqlClient.config
    -   
    -Remarks :
    -- TestSelectByPK fails for MSSQL with Oledb [it's normal]
    -- TestJIRA11 fails for MSSQL with Oledb/odbc [it's normal]	
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/DataBase.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/DataBase.sql
    deleted file mode 100644
    index 02a1f4b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/DataBase.sql
    +++ /dev/null
    @@ -1,80 +0,0 @@
    -/* Certain queries must be run through ADO since Access does not
    -   recognize some SQL DDL keywords/data types (such as DECIMAL
    -   or DEFAULT) through the Access SQL Query window */ 
    -
    -drop table ACCOUNTS;
    -
    -drop table CATEGORIES;
    -
    -drop table ENUMERATIONS;
    -
    -drop table LINEITEMS;
    -
    -drop table ORDERS;
    -
    -drop table OTHERS;
    -
    -create table ACCOUNTS
    -(
    -   [ACCOUNT_ID]                     long                        not null,
    -   [ACCOUNT_FIRSTNAME]              text(32)                    not null,
    -   [ACCOUNT_LASTNAME]               text(32)                    not null,
    -   [ACCOUNT_EMAIL]                  text(128),
    -   constraint pkAccounts
    -   primary key ([ACCOUNT_ID])
    -);
    -
    -create table CATEGORIES
    -(
    -   [CATEGORY_ID]                    counter                     not null,
    -   [CATEGORY_NAME]                  text(32),
    -   [CATEGORY_GUID]                  guid,
    -   constraint pkCategories
    -   primary key ([CATEGORY_ID])
    -);
    -
    -create table ENUMERATIONS
    -(
    -   [ENUM_ID]                        long                            not null,
    -   [ENUM_DAY]                       long                            not null,
    -   [ENUM_COLOR]                     long                            not null,
    -   [ENUM_MONTH]                     long,
    -   constraint pkEnumerations
    -   primary key ([ENUM_ID])
    -);
    -
    -create table LINEITEMS
    -(
    -   [LINEITEM_ID]                    long                            not null,
    -   [ORDER_ID]                       long                            not null,
    -   [LINEITEM_CODE]                  text(32)                        not null,
    -   [LINEITEM_QUANTITY]              long                            not null,
    -   [LINEITEM_PRICE]                 decimal(18,2),
    -   [LINEITEM_PICTURE]               longbinary,
    -   constraint pkLineItems
    -   primary key ([ORDER_ID], [LINEITEM_ID])
    -);
    -
    -create table ORDERS
    -(
    -   [ORDER_ID]                       long                            not null,
    -   [ACCOUNT_ID]                     long                            not null,
    -   [ORDER_DATE]                     datetime,
    -   [ORDER_CARDTYPE]                 text(32),
    -   [ORDER_CARDNUMBER]               text(32),
    -   [ORDER_CARDEXPIRY]               text(32),
    -   [ORDER_STREET]                   text(32),
    -   [ORDER_CITY]                     text(32),
    -   [ORDER_PROVINCE]                 text(32),
    -   [ORDER_POSTALCODE]               text(32),
    -   [ORDER_FAVOURITELINEITEM]        long,
    -   constraint pkOrders
    -   primary key ([ORDER_ID])
    -);
    -
    -create table OTHERS
    -(
    -   OTHER_INT                       long,
    -   OTHER_LONG                      decimal
    -);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/DataBaseNHibernate.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/DataBaseNHibernate.sql
    deleted file mode 100644
    index cdb212a..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/DataBaseNHibernate.sql
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -/* Certain queries must be run through ADO since Access does not
    -   recognize some SQL DDL keywords/data types (such as DECIMAL
    -   or DEFAULT) through the Access SQL Query window */ 
    -
    -drop table USERS;
    -
    -create table USERS
    -(
    -   [LOGONID]                      text(20)						not null default 0,
    -   [NAME]                         text(40)                      default null,
    -   [PASSWORD]                     text(20)						default null,
    -   [EMAILADDRESS]                 text(40)						default null,
    -   [LASTLOGON]                    datetime						default null,
    -   constraint pkUsers
    -   primary key ([LOGONID])
    -);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/account-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/account-init.sql
    deleted file mode 100644
    index 50e2776..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/account-init.sql
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -drop table ACCOUNTS;
    -
    -create table ACCOUNTS
    -(
    -   [ACCOUNT_ID]                     long                            not null,
    -   [ACCOUNT_FIRSTNAME]              text(32)                    not null,
    -   [ACCOUNT_LASTNAME]               text(32)                    not null,
    -   [ACCOUNT_EMAIL]                  text(128),
    -   constraint pkAccounts
    -   primary key ([ACCOUNT_ID])
    -);
    -
    -INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com');
    -INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com');
    -INSERT INTO Accounts VALUES(3,'William', 'Dalton', null);
    -INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com');
    -INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/account-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/account-procedure.sql
    deleted file mode 100644
    index 12c2522..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/account-procedure.sql
    +++ /dev/null
    @@ -1 +0,0 @@
    -SELECT NULL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/category-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/category-init.sql
    deleted file mode 100644
    index bd3eff2..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/category-init.sql
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -drop table CATEGORIES;
    -
    -create table CATEGORIES
    -(
    -   [CATEGORY_ID]                    counter                     not null,
    -   [CATEGORY_NAME]                  text(32),
    -   [CATEGORY_GUID]                  guid,
    -   constraint pkCategories
    -   primary key ([CATEGORY_ID])
    -);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/category-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/category-procedure.sql
    deleted file mode 100644
    index 12c2522..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/category-procedure.sql
    +++ /dev/null
    @@ -1 +0,0 @@
    -SELECT NULL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/documents-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/documents-init.sql
    deleted file mode 100644
    index b81c6ca..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/documents-init.sql
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -drop table DOCUMENTS;
    -
    -create table DOCUMENTS
    -(
    -   [DOCUMENT_ID]                     long                            not null,
    -   [DOCUMENT_TITLE]                  text(32),
    -   [DOCUMENT_TYPE]                   text(32),
    -   [DOCUMENT_PAGENUMBER]             long,
    -   [DOCUMENT_CITY]                   text(32),
    -   constraint pkAccounts
    -   primary key ([DOCUMENT_ID])
    -);
    -
    -INSERT INTO Documents VALUES (1, 'The World of Null-A', 'Book', 55, null);
    -INSERT INTO Documents VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon');
    -INSERT INTO Documents VALUES (3, 'Lord of the Rings', 'Book', 3587, null);
    -INSERT INTO Documents VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris');
    -INSERT INTO Documents VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris');
    -INSERT INTO Documents VALUES (6, 'Foundation', 'Monograph', 557, null);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/enumeration-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/enumeration-init.sql
    deleted file mode 100644
    index 0e3d8c0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/enumeration-init.sql
    +++ /dev/null
    @@ -1,16 +0,0 @@
    -drop table ENUMERATIONS;
    -
    -create table ENUMERATIONS
    -(
    -   [ENUM_ID]                        long                            not null,
    -   [ENUM_DAY]                       long                            not null,
    -   [ENUM_COLOR]                     long                            not null,
    -   [ENUM_MONTH]                     long,
    -   constraint pkEnumerations
    -   primary key ([ENUM_ID])
    -);
    -
    -INSERT INTO Enumerations VALUES(1, 1, 1, 128);
    -INSERT INTO Enumerations VALUES(2, 2, 2, 2048);
    -INSERT INTO Enumerations VALUES(3, 3, 4, 256);
    -INSERT INTO Enumerations VALUES(4, 4, 8, null);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/line-item-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/line-item-init.sql
    deleted file mode 100644
    index 2214f25..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/line-item-init.sql
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -drop table LINEITEMS;
    -
    -create table LINEITEMS
    -(
    -   [LINEITEM_ID]                    long                            not null,
    -   [ORDER_ID]                       long                            not null,
    -   [LINEITEM_CODE]                  text(32)                        not null,
    -   [LINEITEM_QUANTITY]              long                            not null,
    -   [LINEITEM_PRICE]                 decimal(18,2),
    -   [LINEITEM_PICTURE]               longbinary,
    -   constraint pkLineItems
    -   primary key ([ORDER_ID], [LINEITEM_ID])
    -);
    -
    -INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null);
    -INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null);
    -INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null);
    -INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null);
    -INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null);
    -INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null);
    -INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null);
    -INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null);
    -INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null);
    -INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null);
    -INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null);
    -INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null);
    -INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null);
    -INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null);
    -INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null);
    -INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null);
    -INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null);
    -INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null);
    -INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null);
    -INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/more-account-records.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/more-account-records.sql
    deleted file mode 100644
    index 847bb52..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/more-account-records.sql
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com');
    -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com');
    -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null);
    -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com');
    -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/order-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/order-init.sql
    deleted file mode 100644
    index d540562..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/order-init.sql
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -drop table ORDERS;
    -
    -create table ORDERS
    -(
    -   [ORDER_ID]                       long                            not null,
    -   [ACCOUNT_ID]                     long                            not null,
    -   [ORDER_DATE]                     datetime,
    -   [ORDER_CARDTYPE]                 text(32),
    -   [ORDER_CARDNUMBER]               text(32),
    -   [ORDER_CARDEXPIRY]               text(32),
    -   [ORDER_STREET]                   text(32),
    -   [ORDER_CITY]                     text(32),
    -   [ORDER_PROVINCE]                 text(32),
    -   [ORDER_POSTALCODE]               text(32),
    -   [ORDER_FAVOURITELINEITEM]        long,
    -   constraint pkOrders
    -   primary key ([ORDER_ID])
    -);
    -
    -INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2);
    -INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1);
    -INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2);
    -INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1);
    -INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2);
    -INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1);
    -INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2);
    -INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1);
    -INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2);
    -INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/other-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/other-init.sql
    deleted file mode 100644
    index bc3b3d7..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/other-init.sql
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -drop table OTHERS;
    -
    -create table OTHERS
    -(
    -   OTHER_INT long,
    -   OTHER_LONG decimal,
    -   OTHER_BIT YESNO,
    -   OTHER_STRING text(32)
    -);
    -
    -INSERT INTO Others VALUES(1, 8888888, false, 'Oui');
    -INSERT INTO Others VALUES(2, 9999999999,true, 'Non');
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/swap-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/swap-procedure.sql
    deleted file mode 100644
    index 12c2522..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/swap-procedure.sql
    +++ /dev/null
    @@ -1 +0,0 @@
    -SELECT NULL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/teardown.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/teardown.sql
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Access/user-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Access/user-init.sql
    deleted file mode 100644
    index 00d9f6d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Access/user-init.sql
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -drop table USERS;
    -
    -create table USERS
    -(
    -   [LOGONID]                      text(20)						not null default 0,
    -   [NAME]                         text(40)                      default null,
    -   [PASSWORD]                     text(20)						default null,
    -   [EMAILADDRESS]                 text(40)						default null,
    -   [LASTLOGON]                    datetime						default null,
    -   constraint pkUsers
    -   primary key ([LOGONID])
    -);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DBCreation.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DBCreation.sql
    deleted file mode 100644
    index 91bc690..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DBCreation.sql
    +++ /dev/null
    @@ -1,89 +0,0 @@
    --- MSQL DATABASE
    -
    -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet')
    -	DROP DATABASE [IBatisNet]
    -GO
    -
    -CREATE DATABASE [IBatisNet] 
    - COLLATE Latin1_General_CI_AS
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoclose', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'trunc. log', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'torn page detection', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'read only', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'dbo use', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'single', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoshrink', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true'
    -GO
    -
    -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) )
    -	exec sp_dboption N'IBatisNet', N'db chaining', N'false'
    -GO
    -
    -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -	exec sp_droplogin N'IBatisNet'
    -GO
    -
    -use [IBatisNet]
    -GO
    -
    -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -BEGIN
    -	declare @logindb nvarchar(132),  @loginpass nvarchar(132), @loginlang nvarchar(132) 
    -	select @logindb = N'IBatisNet', @loginpass=N'IbatisNet9Teset!!', @loginlang = N'us_english'
    -	exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang
    -END
    -GO
    -
    -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382)
    -	EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet'
    -GO
    -
    -exec sp_addrolemember N'db_owner', N'IBatisNet'
    -GO
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DataBase.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DataBase.sql
    deleted file mode 100644
    index 75a1f97..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/DataBase.sql
    +++ /dev/null
    @@ -1,179 +0,0 @@
    --- MSQL DATABASE 'IBatisNet'
    -
    -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet')
    -	DROP DATABASE [IBatisNet]
    -GO
    -
    -CREATE DATABASE [IBatisNet] 
    - COLLATE Latin1_General_CI_AS
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoclose', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'trunc. log', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'torn page detection', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'read only', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'dbo use', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'single', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoshrink', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true'
    -GO
    -
    -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) )
    -	exec sp_dboption N'IBatisNet', N'db chaining', N'false'
    -GO
    -
    -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -	exec sp_droplogin N'IBatisNet'
    -GO
    -
    -use [IBatisNet]
    -GO
    -
    -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -BEGIN
    -	declare @logindb nvarchar(132),  @loginpass nvarchar(132), @loginlang nvarchar(132) 
    -	select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english'
    -	exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang
    -END
    -GO
    -
    -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382)
    -	EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet'
    -GO
    -
    -exec sp_addrolemember N'db_owner', N'IBatisNet'
    -GO
    -
    --- MSQL DATABASE 'NHibernate'
    -
    -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'NHibernate')
    -	DROP DATABASE [NHibernate]
    -GO
    -
    -CREATE DATABASE [NHibernate] 
    - COLLATE Latin1_General_CI_AS
    -GO
    -
    -exec sp_dboption N'NHibernate', N'autoclose', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'bulkcopy', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'trunc. log', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'torn page detection', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'read only', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'dbo use', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'single', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'autoshrink', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'ANSI null default', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'recursive triggers', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'ANSI nulls', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'concat null yields null', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'cursor close on commit', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'default to local cursor', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'quoted identifier', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'ANSI warnings', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'auto create statistics', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'auto update statistics', N'true'
    -GO
    -
    -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) )
    -	exec sp_dboption N'NHibernate', N'db chaining', N'false'
    -GO
    -
    -if exists (select * from master.dbo.syslogins where loginname = N'NHibernate')
    -	exec sp_droplogin N'NHibernate'
    -GO
    -
    -use [NHibernate]
    -GO
    -
    -if not exists (select * from master.dbo.syslogins where loginname = N'NHibernate')
    -BEGIN
    -	declare @logindb nvarchar(132),  @loginpass nvarchar(132), @loginlang nvarchar(132) 
    -	select @logindb = N'NHibernate', @loginpass=N'test', @loginlang = N'us_english'
    -	exec sp_addlogin N'NHibernate', @loginpass, @logindb, @loginlang
    -END
    -GO
    -
    -if not exists (select * from dbo.sysusers where name = N'NHibernate' and uid < 16382)
    -	EXEC sp_grantdbaccess N'NHibernate', N'NHibernate'
    -GO
    -
    -exec sp_addrolemember N'db_owner', N'NHibernate'
    -GO
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/Nullable-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/Nullable-init.sql
    deleted file mode 100644
    index d066be5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/Nullable-init.sql
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Nullable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Nullable]
    -END
    -
    -CREATE TABLE [dbo].[Nullable] (
    -	[Id] [int] IDENTITY (1, 1) NOT NULL ,
    -	[TestBool] [Bit] NULL ,
    -	[TestByte] [tinyint] NULL ,
    -	[TestChar] [char] NULL ,
    -	[TestDateTime] [datetime] NULL ,
    -	[TestDecimal] decimal(9,2) NULL ,
    -	[TestDouble] [float] NULL ,
    -	[TestGuid] [UniqueIdentifier] NULL ,
    -	[TestInt16] [SmallInt] NULL ,
    -	[TestInt32] [int] NULL ,
    -	[TestInt64] [bigint] NULL ,
    -	[TestSingle] [real] NULL ,
    -	[TestTimeSpan] [bigint] NULL,
    -	CONSTRAINT [PK_Nullable] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Id]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/README-embed-param.txt b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/README-embed-param.txt
    deleted file mode 100644
    index 639e61a..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/README-embed-param.txt
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -Technique for creating large sample test data from:
    -
    -http://www.sql-server-performance.com/jc_large_data_operations.asp
    -
    -Make sure you have enough space and have either enough processing power or 
    -enough patience to run the Embed Parameters in Statement tests.
    -
    -Run embed-parameters-setup-init.sql prior to running tests.
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-init.sql
    deleted file mode 100644
    index 644f015..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-init.sql
    +++ /dev/null
    @@ -1,52 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Accounts]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Accounts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Accounts
    -
    -	drop table [dbo].[Accounts]
    -END
    -
    -CREATE TABLE [dbo].[Accounts] (
    -	[Account_ID] [int] NOT NULL ,
    -	[Account_FirstName] [varchar] (32)  NOT NULL ,
    -	[Account_LastName] [varchar] (32)  NOT NULL ,
    -	[Account_Email] [varchar] (128)  NULL,
    -	[Account_Banner_Option]  [varchar] (255),
    -	[Account_Cart_Option] [int]
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Accounts] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Account] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Account_ID]
    -	)  ON [PRIMARY] 
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Accounts] VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(3,'William', 'Dalton', null, 'Non', 100);
    -INSERT INTO [dbo].[Accounts] VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100);
    -INSERT INTO [dbo].[Accounts] VALUES(5,'Gilles', 'Bayon', 'gilles.bayon@nospam.org', 'Oui', 100);
    -
    --- Store procedure
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_InsertAccount]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_SelectAccount]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectAllAccount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_SelectAllAccount]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_swap_email_address]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_swap_email_address]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectByIdList]') and 
    -OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_SelectByIdList]
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-procedure.sql
    deleted file mode 100644
    index fdb5c3d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/account-procedure.sql
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -CREATE PROCEDURE dbo.[ps_InsertAccount]
    -@Account_ID  [int], 
    -@Account_FirstName [nvarchar] (40),
    -@Account_LastName [varchar] (32),
    -@Account_Email [varchar] (128),
    -@Account_Banner_Option  [varchar] (255),
    -@Account_Cart_Option [int]
    -AS
    -insert into Accounts  
    -			(Account_ID, Account_FirstName, Account_LastName, Account_Email, Account_Banner_Option, Account_Cart_Option) 
    -values 
    -			(@Account_ID, @Account_FirstName, @Account_LastName, @Account_Email, @Account_Banner_Option, @Account_Cart_Option)
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-init.sql
    deleted file mode 100644
    index b088fd5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-init.sql
    +++ /dev/null
    @@ -1,24 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Categories]
    -
    -CREATE TABLE [dbo].[Categories] (
    -	[Category_Id] [int] IDENTITY (1, 1) NOT NULL ,
    -	[Category_Name] [varchar] (32)  NULL,
    -	[Category_Guid] [uniqueidentifier] NULL ,
    -	CONSTRAINT [PK_Categories] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Category_Id]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    --- Store procedure
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertCategorie]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_InsertCategorie]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_InsertCategorieWithReturnValue]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_InsertCategorieWithReturnValue]
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedure.sql
    deleted file mode 100644
    index bf565e8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedure.sql
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -CREATE PROCEDURE dbo.[ps_InsertCategorie]
    -@Category_Id [int] output,
    -@Category_Name [varchar] (32),
    -@Category_Guid [uniqueidentifier] 
    -AS
    -insert into Categories  
    -			(Category_Name, Category_Guid ) 
    -values 
    -			(@Category_Name, @Category_Guid)
    -SELECT @Category_Id = SCOPE_IDENTITY()
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedureWithReturn.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedureWithReturn.sql
    deleted file mode 100644
    index e9aa54b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/category-procedureWithReturn.sql
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -CREATE PROCEDURE dbo.[ps_InsertCategorieWithReturnValue]
    -@Category_Id [int] output,
    -@Category_Name [varchar] (32),
    -@Category_Guid [uniqueidentifier] 
    -AS
    -insert into Categories  
    -			(Category_Name, Category_Guid ) 
    -values 
    -			(@Category_Name, @Category_Guid)
    -set @Category_Id = SCOPE_IDENTITY()
    -return @Category_Id
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/child-parent-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/child-parent-init.sql
    deleted file mode 100644
    index d6ccbac..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/child-parent-init.sql
    +++ /dev/null
    @@ -1,33 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Child]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -begin
    -drop table [dbo].[Child]
    -end
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Parent]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -begin
    -drop table [dbo].[Parent]
    -end
    -
    -CREATE TABLE [dbo].[Child] (
    -	[Id] [int] IDENTITY (1, 1) NOT NULL ,
    -	[ParentId] [int] NOT NULL ,
    -	[Description] [varchar] (100) NOT NULL ,
    -	[RowVersion] [timestamp] NOT NULL 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[Parent] (
    -	[Id] [int] IDENTITY (1, 1) NOT NULL ,
    -	[Description] [varchar] (100) NOT NULL ,
    -	[RowVersion] [timestamp] NOT NULL 
    -) ON [PRIMARY]
    -
    --- Creating Test Data
    -insert into Parent ([Description]) values ('Parent 1')
    -insert into Parent ([Description]) values ('Parent 2')
    -
    -insert into Child ([ParentId], [Description]) values (1, 'Child 1')
    -insert into Child ([ParentId], [Description]) values (1, 'Child 2')
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/coupons-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/coupons-init.sql
    deleted file mode 100644
    index 9d1ff83..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/coupons-init.sql
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Coupons]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Coupons]
    -END
    -CREATE TABLE [dbo].[Coupons] (
    -	[Coupon_ID] [int] NOT NULL ,
    -	[Coupon_Code] [varchar] (32)  NOT NULL 
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Coupons] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Coupons] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Coupon_ID]
    -	)  ON [PRIMARY] 
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Coupons] VALUES(1,'AAA' );
    -INSERT INTO [dbo].[Coupons] VALUES(2,'BBB');
    -INSERT INTO [dbo].[Coupons] VALUES(3,'CCC');
    -INSERT INTO [dbo].[Coupons] VALUES(4,'DDD');
    -INSERT INTO [dbo].[Coupons] VALUES(5,'EEE');
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Coupons_Brands]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Coupons_Brands]
    -END
    -CREATE TABLE [dbo].[Coupons_Brands] (
    -	[Coupon_ID] [int] NOT NULL ,
    -	[Brand_Id] [int] NOT NULL 
    -) ON [PRIMARY]
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(1,1 );
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(1,2);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(1,3);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(2,4);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(2,5);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(5,6);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql
    deleted file mode 100644
    index 0b1a33e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/documents-init.sql
    +++ /dev/null
    @@ -1,35 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Documents]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders
    -
    -	drop table [dbo].[Documents]
    -END
    -
    -CREATE TABLE [dbo].[Documents] (
    -	[Document_ID] [int] NOT NULL ,
    -	[Document_Title] [varchar] (32) NULL ,
    -	[Document_Type] [varchar] (32)  NULL ,
    -	[Document_PageNumber] [int] NULL  ,
    -	[Document_City] [varchar] (32)  NULL,
    -	[Account_Id] int null
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Documents] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Documents] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Document_ID]
    -	)  ON [PRIMARY] 
    -
    --- Creating Test Data 
    -
    -INSERT INTO [dbo].[Documents] VALUES (1, 'The World of Null-A', 'Book', 55, null, 5);
    -INSERT INTO [dbo].[Documents] VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon', 2);
    -INSERT INTO [dbo].[Documents] VALUES (3, 'Lord of the Rings', 'Book', 3587, null, 3);
    -INSERT INTO [dbo].[Documents] VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris', 2);
    -INSERT INTO [dbo].[Documents] VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris', 5);
    -INSERT INTO [dbo].[Documents] VALUES (6, 'Foundation', 'Monograph', 557, null, 6);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-setup-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-setup-init.sql
    deleted file mode 100644
    index c0bf20e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-setup-init.sql
    +++ /dev/null
    @@ -1,94 +0,0 @@
    --- Technique for creating large sample test data from
    --- http://www.sql-server-performance.com/jc_large_data_operations.asp
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecords]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ManyRecords]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecordsTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ManyRecordsTest]
    -
    -
    -
    --- Create Data Storage Table
    -CREATE TABLE [dbo].[ManyRecords] (
    -	[Many_FirstID] [int] NOT NULL,
    -	[Many_SecondID] [int] NOT NULL,
    -	[Many_ThirdID] [int] NOT NULL,
    -	[Many_FourthID] [int] NOT NULL,
    -	[Many_FifthID] [int] NOT NULL,
    -	[Many_SequenceID] [int] NOT NULL,
    -	[Many_DistributedID] [int] NOT NULL,
    -	[Many_SampleCharValue] [char] (10) NOT NULL,
    -	[Many_SampleDecimal] [decimal] (9,4) NOT NULL,
    -	[Many_SampleMoney] [money] NOT NULL,
    -	[Many_SampleDate] [datetime] NOT NULL,
    -	[Many_SequenceDate] [datetime] NOT NULL )
    -ON [PRIMARY]             
    -
    -
    -
    --- Create Sample Data of 1 million records (increase if needed)
    -BEGIN TRANSACTION
    -	DECLARE @intIndex int, @rowCount int, @seqCount int, @distValue int
    -	SELECT @intIndex = 1, @rowCount = 1000000, @seqCount = 10000
    -	SELECT @distValue = @rowCount/10000
    -
    -	WHILE @intIndex <= @rowCount
    -	BEGIN
    -	INSERT INTO [dbo].[ManyRecords] (
    -		[Many_FirstID], 
    -		[Many_SecondID], 
    -		[Many_ThirdID], 
    -		[Many_FourthID],  
    -		[Many_FifthID],  
    -		[Many_SequenceID],  
    -		[Many_DistributedID], 
    -		[Many_SampleCharValue],  
    -		[Many_SampleDecimal], 
    -		[Many_SampleMoney], 
    -		[Many_SampleDate], 
    -		[Many_SequenceDate] )
    -	VALUES ( 
    -		@intIndex, -- First
    -		@intIndex/2, -- Second
    -		@intIndex/4, -- Third
    -		@intIndex/10, -- Fourth
    -		@intIndex/20, -- Fifth
    -		(@intIndex-1)/@seqCount + 1, -- Sequential value
    -		(@intIndex-1)%(@distValue) + 1,  -- Distributed value
    -		CHAR(65 + 26*rand())+CHAR(65 + 26*rand())+CHAR(65 + 26*rand())+CONVERT(char(6),CONVERT(int,100000*(9.0*rand()+1.0)))+CHAR(65 + 26*rand()), -- Char Value
    -		10000*rand(), -- Decimal value
    -		10000*rand(), -- Money value
    -		DATEADD(hour,100000*rand(),'1990-01-01'), -- Date value
    -		DATEADD(hour,@intIndex/5,'1990-01-01') ) -- Sequential date value
    -
    -	SET @intIndex = @intIndex + 1
    -	END
    -COMMIT TRANSACTION
    -
    -
    -
    --- Create Test table using storage table sample data
    -SELECT 
    -	[Many_FirstID], 
    -	[Many_SecondID], 
    -	[Many_ThirdID], 
    -	[Many_FourthID],  
    -	[Many_FifthID],  
    -	[Many_SequenceID],  
    -	[Many_DistributedID], 
    -	[Many_SampleCharValue],  
    -	[Many_SampleDecimal], 
    -	[Many_SampleMoney], 
    -	[Many_SampleDate], 
    -	[Many_SequenceDate]
    -INTO [dbo].[ManyRecordsTest]
    -FROM [dbo].[ManyRecords]
    -
    -
    -
    --- Create Test table indexes
    -CREATE INDEX [IDX_ManyRecordsTest_Seq] ON [dbo].[ManyRecordsTest] ([Many_SequenceID])  WITH SORT_IN_TEMPDB
    -CREATE INDEX [IDX_ManyRecordsTest_Dist] ON [dbo].[ManyRecordsTest] ([Many_DistributedID]) WITH SORT_IN_TEMPDB
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-test-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-test-init.sql
    deleted file mode 100644
    index f776b15..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/embed-param-test-init.sql
    +++ /dev/null
    @@ -1,32 +0,0 @@
    --- Technique for creating large sample test data from
    --- http://www.sql-server-performance.com/jc_large_data_operations.asp
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecordsTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ManyRecordsTest]
    -
    -
    -
    --- Create Test table using storage table sample data
    -SELECT 
    -	[Many_FirstID], 
    -	[Many_SecondID], 
    -	[Many_ThirdID], 
    -	[Many_FourthID],  
    -	[Many_FifthID],  
    -	[Many_SequenceID],  
    -	[Many_DistributedID], 
    -	[Many_SampleCharValue],  
    -	[Many_SampleDecimal], 
    -	[Many_SampleMoney], 
    -	[Many_SampleDate], 
    -	[Many_SequenceDate]
    -INTO [dbo].[ManyRecordsTest]
    -FROM [dbo].[ManyRecords]
    -
    -
    -
    --- Create Test table indexes
    -CREATE INDEX [IDX_ManyRecordsTest_Seq] ON [dbo].[ManyRecordsTest] ([Many_SequenceID])  WITH SORT_IN_TEMPDB
    -CREATE INDEX [IDX_ManyRecordsTest_Dist] ON [dbo].[ManyRecordsTest] ([Many_DistributedID]) WITH SORT_IN_TEMPDB
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/enumeration-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/enumeration-init.sql
    deleted file mode 100644
    index a38d3af..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/enumeration-init.sql
    +++ /dev/null
    @@ -1,31 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Enumerations]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Enumerations]
    -END
    -
    -CREATE TABLE [dbo].[Enumerations] (
    -	[Enum_ID] [int] NOT NULL ,
    -	[Enum_Day] [int] NOT NULL ,
    -	[Enum_Color] [int] NOT NULL,
    -	[Enum_Month] [int] NULL,
    -	[Enum_SearchProfile] [varchar](1) NULL
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Enumerations] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Enum] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Enum_ID]
    -	)  ON [PRIMARY] 
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Enumerations] VALUES(1, 1, 1, 128, 'T');
    -INSERT INTO [dbo].[Enumerations] VALUES(2, 2, 2, 2048, 'P');
    -INSERT INTO [dbo].[Enumerations] VALUES(3, 3, 4, 256, 'P');
    -INSERT INTO [dbo].[Enumerations] VALUES(4, 4, 8, null, 'P');
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-init.sql
    deleted file mode 100644
    index 65bcee5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-init.sql
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -
    -INSERT INTO [Users]([UserId], [UserName], [AddressId])
    -VALUES(1,'user1',null)
    -INSERT INTO [Users]([UserId], [UserName], [AddressId])
    -VALUES(14,'user14',null)
    -
    -INSERT INTO [Roles ]([RoleId], [RoleName])
    -VALUES(1,'Admin');
    -INSERT INTO [Roles ]([RoleId], [RoleName])
    -VALUES(2,'User');
    -
    -INSERT INTO [Applications]([ApplicationId], [ApplicationName], [DefaultRoleId])
    -VALUES(1, 'Application Manager', 1);
    -
    -INSERT INTO [ApplicationUserRoles]([ApplicationId], [UserId], [RoleId])
    -VALUES(1,1,2);
    -INSERT INTO [ApplicationUserRoles]([ApplicationId], [UserId], [RoleId])
    -VALUES(1,14,1);
    -INSERT INTO [ApplicationUserRoles]([ApplicationId], [UserId], [RoleId])
    -VALUES(1,14,2);
    -
    -INSERT INTO [ApplicationUsers]([ApplicationId], [UserId], [ActiveFlag])
    -VALUES(1,1,1);
    -INSERT INTO [ApplicationUsers]([ApplicationId], [UserId], [ActiveFlag])
    -VALUES(1,14,1);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-schema.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-schema.sql
    deleted file mode 100644
    index 0aa25da..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/groupby-schema.sql
    +++ /dev/null
    @@ -1,174 +0,0 @@
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_User_Address]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[Users] DROP CONSTRAINT FK_User_Address
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUserRoles_Application]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUserRoles] DROP CONSTRAINT FK_ApplicationUserRoles_Application
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUsers_Application]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUsers] DROP CONSTRAINT FK_ApplicationUsers_Application
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Application_Role]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[Applications] DROP CONSTRAINT FK_Application_Role
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUserRoles_Role]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUserRoles] DROP CONSTRAINT FK_ApplicationUserRoles_Role
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUserRoles_User]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUserRoles] DROP CONSTRAINT FK_ApplicationUserRoles_User
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUsers_User]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUsers] DROP CONSTRAINT FK_ApplicationUsers_User
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Addresses]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Addresses]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ApplicationUserRoles]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ApplicationUserRoles]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ApplicationUsers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ApplicationUsers]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Applications]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Applications]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Roles ]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Roles ]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Users]
    -
    -
    -CREATE TABLE [dbo].[Addresses] (
    -	[AddressId] [int] NOT NULL ,
    -	[Street] [varchar] (50) COLLATE Latin1_General_CI_AS NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[ApplicationUserRoles] (
    -	[ApplicationId] [int] NULL ,
    -	[UserId] [int] NULL ,
    -	[RoleId] [int] NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[ApplicationUsers] (
    -	[ApplicationId] [int] NULL ,
    -	[UserId] [int] NULL ,
    -	[ActiveFlag] [bit] NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[Applications] (
    -	[ApplicationId] [int] NOT NULL ,
    -	[ApplicationName] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
    -	[DefaultRoleId] [int] NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[Roles ] (
    -	[RoleId] [int] NOT NULL ,
    -	[RoleName] [varchar] (50) COLLATE Latin1_General_CI_AS NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[Users] (
    -	[UserId] [int] NOT NULL ,
    -	[UserName] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
    -	[AddressId] [int] NULL 
    -) ON [PRIMARY]
    -
    -
    -ALTER TABLE [dbo].[Addresses] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Address] PRIMARY KEY  CLUSTERED 
    -	(
    -		[AddressId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[Applications] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Application] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ApplicationId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[Roles ] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Role] PRIMARY KEY  CLUSTERED 
    -	(
    -		[RoleId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_User] PRIMARY KEY  CLUSTERED 
    -	(
    -		[UserId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[ApplicationUserRoles] ADD 
    -	CONSTRAINT [FK_ApplicationUserRoles_Application] FOREIGN KEY 
    -	(
    -		[ApplicationId]
    -	) REFERENCES [dbo].[Applications] (
    -		[ApplicationId]
    -	),
    -	CONSTRAINT [FK_ApplicationUserRoles_Role] FOREIGN KEY 
    -	(
    -		[RoleId]
    -	) REFERENCES [dbo].[Roles ] (
    -		[RoleId]
    -	),
    -	CONSTRAINT [FK_ApplicationUserRoles_User] FOREIGN KEY 
    -	(
    -		[UserId]
    -	) REFERENCES [dbo].[Users] (
    -		[UserId]
    -	)
    -
    -
    -ALTER TABLE [dbo].[ApplicationUsers] ADD 
    -	CONSTRAINT [FK_ApplicationUsers_Application] FOREIGN KEY 
    -	(
    -		[ApplicationId]
    -	) REFERENCES [dbo].[Applications] (
    -		[ApplicationId]
    -	),
    -	CONSTRAINT [FK_ApplicationUsers_User] FOREIGN KEY 
    -	(
    -		[UserId]
    -	) REFERENCES [dbo].[Users] (
    -		[UserId]
    -	)
    -
    -
    -ALTER TABLE [dbo].[Applications] ADD 
    -	CONSTRAINT [FK_Application_Role] FOREIGN KEY 
    -	(
    -		[DefaultRoleId]
    -	) REFERENCES [dbo].[Roles ] (
    -		[RoleId]
    -	)
    -
    -
    -ALTER TABLE [dbo].[Users] ADD 
    -	CONSTRAINT [FK_User_Address] FOREIGN KEY 
    -	(
    -		[AddressId]
    -	) REFERENCES [dbo].[Addresses] (
    -		[AddressId]
    -	)
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/line-item-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/line-item-init.sql
    deleted file mode 100644
    index a8c40f6..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/line-item-init.sql
    +++ /dev/null
    @@ -1,56 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LineItems]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[LineItems]
    -
    -CREATE TABLE [dbo].[LineItems] (
    -	[LineItem_ID] [int] NOT NULL ,
    -	[Order_ID] [int] NOT NULL ,
    -	[LineItem_Code] [varchar] (32) NOT NULL ,
    -	[LineItem_Quantity] [int] NOT NULL ,
    -	[LineItem_Price] [decimal](18, 2) NULL,
    -	[LineItem_Picture] [image] null
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[LineItems] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_LinesItem] PRIMARY KEY  CLUSTERED 
    -	(
    -		[LineItem_ID],
    -		[Order_ID]
    -	)  ON [PRIMARY] 
    -
    -ALTER TABLE [dbo].[LineItems] ADD 
    -	CONSTRAINT [FK_LineItems_Orders] FOREIGN KEY 
    -	(
    -		[Order_ID]
    -	) REFERENCES [dbo].[Orders] (
    -		[Order_ID]
    -	)
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[LineItems] VALUES (1, 1, 'ESM-34', 1, 45.43, null);
    -INSERT INTO [dbo].[LineItems] VALUES (2, 10, 'QSM-98', 8, 8.40, null);
    -INSERT INTO [dbo].[LineItems] VALUES (3, 9, 'DSM-78', 2, 45.40, null);
    -INSERT INTO [dbo].[LineItems] VALUES (4, 9, 'TSM-12', 2, 32.12, null);
    -INSERT INTO [dbo].[LineItems] VALUES (5, 8, 'DSM-16', 4, 41.30, null);
    -INSERT INTO [dbo].[LineItems] VALUES (6, 8, 'GSM-65', 1, 2.20, null);
    -INSERT INTO [dbo].[LineItems] VALUES (7, 7, 'WSM-27', 7, 52.10, null);
    -INSERT INTO [dbo].[LineItems] VALUES (8, 7, 'ESM-23', 2, 123.34, null);
    -INSERT INTO [dbo].[LineItems] VALUES (9, 6, 'QSM-39', 9, 12.12, null);
    -INSERT INTO [dbo].[LineItems] VALUES (10, 6, 'ASM-45', 6, 78.77, null);
    -INSERT INTO [dbo].[LineItems] VALUES (11, 5, 'ESM-48', 3, 43.87, null);
    -INSERT INTO [dbo].[LineItems] VALUES (12, 5, 'WSM-98', 7, 5.40, null);
    -INSERT INTO [dbo].[LineItems] VALUES (13, 4, 'RSM-57', 2, 78.90, null);
    -INSERT INTO [dbo].[LineItems] VALUES (14, 4, 'XSM-78', 9, 2.34, null);
    -INSERT INTO [dbo].[LineItems] VALUES (15, 3, 'DSM-59', 3, 5.70, null);
    -INSERT INTO [dbo].[LineItems] VALUES (16, 3, 'DSM-53', 3, 98.78, null);
    -INSERT INTO [dbo].[LineItems] VALUES (17, 2, 'DSM-37', 4, 7.80, null);
    -INSERT INTO [dbo].[LineItems] VALUES (18, 2, 'FSM-12', 2, 55.78, null);
    -INSERT INTO [dbo].[LineItems] VALUES (19, 1, 'ESM-48', 8, 87.60, null);
    -INSERT INTO [dbo].[LineItems] VALUES (20, 1, 'ESM-23', 1, 55.40, null);
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ps_SelectLineItem]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
    -drop procedure [dbo].[ps_SelectLineItem]
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/more-account-records.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/more-account-records.sql
    deleted file mode 100644
    index e526309..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/more-account-records.sql
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -
    -
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Accounts] VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(8,'Ming', 'Li Foo', null, 'Non', 100);
    -INSERT INTO [dbo].[Accounts] VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(10,'Robert', 'O''Timmins', null, 'Non', 100);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/order-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/order-init.sql
    deleted file mode 100644
    index 154e0ee..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/order-init.sql
    +++ /dev/null
    @@ -1,54 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders
    -
    -	drop table [dbo].[Orders]
    -END
    -
    -CREATE TABLE [dbo].[Orders] (
    -	[Order_ID] [int] NOT NULL ,
    -	[Account_ID] [int] NULL ,
    -	[Order_Date] [datetime] NULL ,
    -	[Order_CardType] [varchar] (32) NULL ,
    -	[Order_CardNumber] [varchar] (32)  NULL ,
    -	[Order_CardExpiry] [varchar] (32)  NULL ,
    -	[Order_Street] [varchar] (32)  NULL ,
    -	[Order_City] [varchar] (32)  NULL ,
    -	[Order_Province] [varchar] (32)  NULL ,
    -	[Order_PostalCode] [varchar] (32)  NULL ,
    -	[Order_FavouriteLineItem] [int] NULL 
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Orders] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Orders] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Order_ID]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[Orders] ADD 
    -	CONSTRAINT [FK_Orders_Accounts] FOREIGN KEY 
    -	(
    -		[Account_ID]
    -	) REFERENCES [dbo].[Accounts] (
    -		[Account_ID]
    -	)
    --- Creating Test Data -- 2003-02-15 8:15:00/ 2003-02-15 8:15:00
    -
    -INSERT INTO [dbo].[Orders] VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',1);
    -INSERT INTO [dbo].[Orders] VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',17);
    -INSERT INTO [dbo].[Orders] VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2);
    -INSERT INTO [dbo].[Orders] VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1);
    -INSERT INTO [dbo].[Orders] VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2);
    -INSERT INTO [dbo].[Orders] VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1);
    -INSERT INTO [dbo].[Orders] VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2);
    -INSERT INTO [dbo].[Orders] VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1);
    -INSERT INTO [dbo].[Orders] VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2);
    -INSERT INTO [dbo].[Orders] VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1);
    -INSERT INTO [dbo].[Orders] VALUES (11, null, '2003-02-17 8:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY',1);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/other-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/other-init.sql
    deleted file mode 100644
    index 645a6ee..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/other-init.sql
    +++ /dev/null
    @@ -1,145 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Others]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Others]
    -END
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[A]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[B]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[B]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[C]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[C]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[D]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[D]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[E]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[E]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[F]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[F]
    -END
    -
    -
    -CREATE TABLE [dbo].[Others] (
    -	[Other_Int] [int]  NULL ,
    -	[Other_Long] [BigInt] NULL,
    -	[Other_Bit] [Bit] NOT NULL DEFAULT (0), 
    -	[Other_String] [varchar] (32) NOT NULL
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[F] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[F_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_F] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[E] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[E_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_E] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[D] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[D_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_D] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[C] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[C_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_C] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[B] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[C_ID] [varchar] (50) NULL ,
    -	[D_ID] [varchar] (50) NULL ,
    -	[B_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_B] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] ,
    -	CONSTRAINT [FK_B_C] FOREIGN KEY 
    -	(
    -		[C_ID]
    -	) REFERENCES [C] (
    -		[ID]
    -	),
    -	CONSTRAINT [FK_B_D] FOREIGN KEY 
    -	(
    -		[D_ID]
    -	) REFERENCES [D] (
    -		[ID]
    -	)
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[A] (
    -	[Id] [varchar] (50)  NOT NULL ,
    -	[B_ID] [varchar] (50)  NULL ,
    -	[E_ID] [varchar] (50)  NULL ,
    -	[F_ID] [varchar] (50)  NULL ,
    -	[A_Libelle] [varchar] (50)  NULL
    -	CONSTRAINT [PK_A] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Id]
    -	)  ON [PRIMARY] ,
    -	CONSTRAINT [FK_A_B] FOREIGN KEY 
    -	(
    -		[B_ID]
    -	) REFERENCES [B] (
    -		[ID]
    -	),
    -	CONSTRAINT [FK_A_E] FOREIGN KEY 
    -	(
    -		[E_ID]
    -	) REFERENCES [E] (
    -		[ID]
    -	),
    -	CONSTRAINT [FK_A_F] FOREIGN KEY 
    -	(
    -		[F_ID]
    -	) REFERENCES [F] (
    -		[ID]
    -	)
    -) ON [PRIMARY]
    -
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Others] VALUES(1, 8888888, 0, 'Oui');
    -INSERT INTO [dbo].[Others] VALUES(2, 9999999999, 1, 'Non');
    -
    -INSERT INTO [dbo].[F] VALUES('f', 'fff');
    -INSERT INTO [dbo].[E] VALUES('e', 'eee');
    -INSERT INTO [dbo].[D] VALUES('d', 'ddd');
    -INSERT INTO [dbo].[C] VALUES('c', 'ccc');
    -INSERT INTO [dbo].[B] VALUES('b', 'c', null, 'bbb');
    -INSERT INTO [dbo].[A] VALUES('a', 'b', 'e', null, 'aaa');
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-drop.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-drop.sql
    deleted file mode 100644
    index fb57749..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-drop.sql
    +++ /dev/null
    @@ -1,52 +0,0 @@
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Accounts]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Accounts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Accounts
    -
    -	drop table [dbo].[Accounts]
    -END
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Profiles]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Profiles]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SignsOn]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[SignsOn]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders
    -
    -	drop table [dbo].[Orders]
    -END
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Categories]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Inventories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Inventories]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Items]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Items]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LinesItem]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[LinesItem]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Products]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Products]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Suppliers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Suppliers]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Sequences]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Sequences]
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-init.sql
    deleted file mode 100644
    index ffe8757..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-init.sql
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -use [IBatisNet]
    -
    -INSERT INTO [Suppliers] VALUES (1, 'XYZ Pets', 'AC', '600 Avon Way', '', 'Los Angeles', 'CA', '94024', '212-947-0797')
    -INSERT INTO [Suppliers] VALUES (2, 'ABC Pets', 'AC', '700 Abalone Way', '', 'San Francisco', 'CA', '94024', '415-947-0797')
    -
    -INSERT INTO [Categories] VALUES ('FISH', 'Fish', NULL)
    -INSERT INTO [Categories] VALUES ('DOGS', 'Dogs', NULL)
    -INSERT INTO [Categories] VALUES ('REPTILES', 'Reptiles', NULL)
    -INSERT INTO [Categories] VALUES ('CATS', 'Cats', NULL)
    -INSERT INTO [Categories] VALUES ('BIRDS', 'Birds', NULL)
    -INSERT INTO [Categories] VALUES ('DINO', 'Dinos', NULL)
    -
    -INSERT INTO [Products] VALUES ('FI-SW-01', 'FISH', 'Angelfish', 'Saltwater fish from Australia')
    -INSERT INTO [Products] VALUES ('FI-SW-02', 'FISH', 'Tiger Shark', 'Saltwater fish from Australia')
    -INSERT INTO [Products] VALUES ('FI-FW-01', 'FISH', 'Koi', 'Freshwater fish from Japan')
    -INSERT INTO [Products] VALUES ('FI-FW-02', 'FISH', 'Goldfish', 'Freshwater fish from China')
    -INSERT INTO [Products] VALUES ('K9-BD-01', 'DOGS', 'Bulldog', 'Friendly dog from England')
    -INSERT INTO [Products] VALUES ('K9-PO-02', 'DOGS', 'Poodle', 'Cute dog from France')
    -INSERT INTO [Products] VALUES ('K9-DL-01', 'DOGS', 'Dalmation', 'Great dog for a fire station')
    -INSERT INTO [Products] VALUES ('K9-RT-01', 'DOGS', 'Golden Retriever', 'Great family dog')
    -INSERT INTO [Products] VALUES ('K9-RT-02', 'DOGS', 'Labrador Retriever', 'Great hunting dog')
    -INSERT INTO [Products] VALUES ('K9-CW-01', 'DOGS', 'Chihuahua', 'Great companion dog')
    -INSERT INTO [Products] VALUES ('RP-SN-01', 'REPTILES', 'Rattlesnake', 'Doubles as a watch dog')
    -INSERT INTO [Products] VALUES ('RP-LI-02', 'REPTILES', 'Iguana', 'Friendly green friend')
    -INSERT INTO [Products] VALUES ('FL-DSH-01', 'CATS', 'Manx', 'Great for reducing mouse populations')
    -INSERT INTO [Products] VALUES ('FL-DLH-02', 'CATS', 'Persian', 'Friendly house cat, doubles as a princess')
    -INSERT INTO [Products] VALUES ('AV-CB-01', 'BIRDS', 'Amazon Parrot', 'Great companion for up to 75 years')
    -INSERT INTO [Products] VALUES ('AV-SB-02', 'BIRDS', 'Finch', 'Great stress reliever')
    -
    -INSERT INTO [Items] VALUES ('EST-1', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Large', NULL, NULL, NULL, NULL,'fish1.jpg')
    -INSERT INTO [Items] VALUES ('EST-2', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Small', NULL, NULL, NULL, NULL,'fish1.jpg')
    -INSERT INTO [Items] VALUES ('EST-3', 'FI-SW-02', 18.50, 12.00, 1, 'P', 'Toothless', NULL, NULL, NULL, NULL,'fish2.jpg')
    -INSERT INTO [Items] VALUES ('EST-4', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotted', NULL, NULL, NULL, NULL,'fish3.jpg')
    -INSERT INTO [Items] VALUES ('EST-5', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotless', NULL, NULL, NULL, NULL,'fish3.jpg')
    -INSERT INTO [Items] VALUES ('EST-6', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Male Adult', NULL, NULL, NULL, NULL,'dog1.jpg')
    -INSERT INTO [Items] VALUES ('EST-7', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Female Puppy', NULL, NULL, NULL, NULL,'dog1.jpg')
    -INSERT INTO [Items] VALUES ('EST-8', 'K9-PO-02', 18.50, 12.00, 1, 'P', 'Male Puppy', NULL, NULL, NULL, NULL,'dog2.jpg')
    -INSERT INTO [Items] VALUES ('EST-9', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotless Male Puppy', NULL, NULL, NULL, NULL,'dog3.jpg')
    -INSERT INTO [Items] VALUES ('EST-10', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotted Adult Female', NULL, NULL, NULL, NULL,'dog3.jpg')
    -INSERT INTO [Items] VALUES ('EST-11', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Venomless', NULL, NULL, NULL, NULL,'reptile1.jpg')
    -INSERT INTO [Items] VALUES ('EST-12', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Rattleless', NULL, NULL, NULL, NULL,'reptile1.jpg')
    -INSERT INTO [Items] VALUES ('EST-13', 'RP-LI-02', 18.50, 12.00, 1, 'P', 'Green Adult', NULL, NULL, NULL, NULL,'reptile2.jpg')
    -INSERT INTO [Items] VALUES ('EST-14', 'FL-DSH-01', 58.50, 12.00, 1, 'P', 'Tailless', NULL, NULL, NULL, NULL,'cat1.jpg')
    -INSERT INTO [Items] VALUES ('EST-15', 'FL-DSH-01', 23.50, 12.00, 1, 'P', 'Tailed', NULL, NULL, NULL, NULL,'cat1.jpg')
    -INSERT INTO [Items] VALUES ('EST-16', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'cat2.jpg')
    -INSERT INTO [Items] VALUES ('EST-17', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'cat2.jpg')
    -INSERT INTO [Items] VALUES ('EST-18', 'AV-CB-01', 193.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird1.jpg')
    -INSERT INTO [Items] VALUES ('EST-19', 'AV-SB-02', 15.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird2.jpg')
    -INSERT INTO [Items] VALUES ('EST-20', 'FI-FW-02', 5.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'fish4.jpg')
    -INSERT INTO [Items] VALUES ('EST-21', 'FI-FW-02', 5.29, 1.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'fish4.jpg')
    -INSERT INTO [Items] VALUES ('EST-22', 'K9-RT-02', 135.50, 100.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-23', 'K9-RT-02', 145.49, 100.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-24', 'K9-RT-02', 255.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-25', 'K9-RT-02', 325.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-26', 'K9-CW-01', 125.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog6.jpg')
    -INSERT INTO [Items] VALUES ('EST-27', 'K9-CW-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog6.jpg')
    -INSERT INTO [Items] VALUES ('EST-28', 'K9-RT-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog4.jpg')
    -
    -INSERT INTO [Inventories] VALUES ('EST-1', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-2', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-3', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-4', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-5', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-6', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-7', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-8', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-9', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-10', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-11', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-12', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-13', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-14', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-15', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-16', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-17', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-18', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-19', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-20', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-21', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-22', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-23', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-24', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-25', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-26', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-27', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-28', 10000)
    -
    -INSERT INTO [Sequences] (Sequence_Name, Sequence_NextId) VALUES ('OrderNum', 0)
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-schema.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-schema.sql
    deleted file mode 100644
    index db24088..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/petstore-schema.sql
    +++ /dev/null
    @@ -1,159 +0,0 @@
    -use [IBatisNet]
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Categories]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Categories] (
    -	[Category_Id] [varchar] (10) NOT NULL ,
    -	[Category_Name] [varchar] (80) NULL ,
    -	[Category_Description] [varchar] (255) NULL 
    -) ON [PRIMARY]
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Products]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Products] (
    -	[Product_Id] [varchar] (10) NOT NULL ,
    -	[Category_Id] [varchar] (10) NOT NULL ,
    -	[Product_Name] [varchar] (80) NULL ,
    -	[Product_Description] [varchar] (255) NULL 
    -) ON [PRIMARY]
    -
    -
    --- --------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Suppliers]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Suppliers] (
    -	[Supplier_Id] int PRIMARY KEY,
    -	[Supplier_Name] varchar(80) NULL,
    -	[Supplier_Status] varchar(2) NOT NULL,
    -	[Supplier_Addr1] varchar(80) NULL,
    -	[Supplier_Addr2] varchar(80) NULL,
    -	[Supplier_City] varchar(80) NULL,
    -	[Supplier_State] varchar(80) NULL,
    -	[Supplier_Zip] varchar(5) NULL,
    -	[Supplier_Phone] varchar(40) NULL 
    -)
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Items] 
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Items] (
    -	[Item_Id] varchar(10) PRIMARY KEY,
    -	[Product_Id] varchar(10) NOT NULL,
    -	[Item_ListPrice] decimal(10, 2) NULL,
    -	[Item_UnitCost] decimal(10, 2) NULL,
    -	[Supplier_Id] int NULL,
    -	[Item_Status] varchar(2) NULL,
    -	[Item_Attr1] varchar(80) NULL,
    -	[Item_Attr2] varchar(80) NULL,
    -	[Item_Attr3] varchar(80) NULL,
    -	[Item_Attr4] varchar(80) NULL,
    -	[Item_Attr5] varchar(80) NULL,
    -	[Item_Photo] varchar(80) NULL
    -)
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Inventories] 
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Inventories] (
    -	[Item_Id] [varchar] (10) NOT NULL,
    -	[Inventory_Quantity] [int] NOT NULL 
    -) ON [PRIMARY]
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Accounts]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Accounts] (
    -	[Account_Id] varchar(20) PRIMARY KEY,
    -	[Account_Email] varchar(80) NOT NULL,
    -	[Account_FirstName] varchar(80) NOT NULL,
    -	[Account_LastName] varchar(80) NOT NULL,
    -	[Account_Status] varchar(2) NULL,
    -	[Account_Addr1] varchar(80) NOT NULL,
    -	[Account_Addr2] varchar(80) NULL,
    -	[Account_City] varchar(80) NOT NULL,
    -	[Account_State] varchar(80) NOT NULL,
    -	[Account_Zip] varchar(20) NOT NULL,
    -	[Account_Country] varchar(20) NOT NULL,
    -	[Account_Phone] varchar(20) NOT NULL
    -)
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Profiles]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Profiles] (
    -	[Account_Id] varchar(20) PRIMARY KEY,
    -	[Profile_LangPref] varchar(80) NOT NULL,
    -	[Profile_FavCategory] varchar(10) NULL,
    -	[Profile_MyListOpt] bit NULL,
    -	[Profile_BannerOpt] bit NULL
    -)
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [SignsOn]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[SignsOn] (
    -	[Account_Id] varchar(20) PRIMARY KEY,
    -	[SignOn_Password] varchar(20) NOT NULL
    -)
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Orders]
    --- -------------------------------------------------------------------------------------------------*/
    -CREATE TABLE [dbo].[Orders] (
    -	[Order_Id] [int] NOT NULL ,
    -	[Account_ID] varchar(20) NOT NULL ,
    -	[Order_Date] datetime NOT NULL ,
    -	[Order_ShipToFirstName] varchar(80) NOT NULL ,
    -	[Order_ShipToLastName] varchar(80) NOT NULL ,
    -	[Order_ShipAddr1] varchar(80) NOT NULL ,
    -	[Order_ShipAddr2] varchar(80) NULL ,
    -	[Order_ShipCity] varchar(80) NOT NULL ,
    -	[Order_ShipState] varchar(80) NOT NULL ,
    -	[Order_ShipZip] varchar(20) NOT NULL ,
    -	[Order_ShipCountry] varchar(20) NOT NULL ,
    -	[Order_BillToFirstName] varchar(80) NOT NULL ,
    -	[Order_BillToLastName] varchar(80) NOT NULL ,
    -	[Order_BillAddr1] varchar(80) NOT NULL ,
    -	[Order_BillAddr2] varchar(80) NULL ,
    -	[Order_BillCity] varchar(80) NOT NULL ,
    -	[Order_BillState] varchar(80) NOT NULL ,
    -	[Order_BillZip] varchar(20) NOT NULL ,
    -	[Order_BillCountry] varchar(20) NOT NULL ,
    -	[Order_TotalPrice] decimal(10, 2) NOT NULL ,
    -	[Order_CreditCard] varchar(20) NOT NULL ,
    -	[Order_ExprDate] varchar(7) NOT NULL ,
    -	[Order_CardType] varchar(40) NOT NULL 
    -) ON [PRIMARY]
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [LinesItem]
    --- -------------------------------------------------------------------------------------------------
    -CREATE TABLE [dbo].[LinesItem] (
    -	[Order_Id] int NOT NULL ,
    -	[LineItem_LineNum] int NOT NULL ,
    -	[Item_Id] varchar(10) NOT NULL ,
    -	[LineItem_Quantity] int NOT NULL ,
    -	[LineItem_UnitPrice] decimal(10, 2) NOT NULL 
    -) ON [PRIMARY]
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Sequences]
    --- -------------------------------------------------------------------------------------------------
    -CREATE TABLE [dbo].[Sequences] (
    -	[Sequence_Name] [varchar] (30) NOT NULL ,
    -	[Sequence_NextId] [int] NOT NULL 
    -) ON [PRIMARY]
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAccount.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAccount.sql
    deleted file mode 100644
    index bf3ae13..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAccount.sql
    +++ /dev/null
    @@ -1,10 +0,0 @@
    -CREATE PROCEDURE dbo.[ps_SelectAccount]
    -@Account_ID  [int]
    -AS
    -select
    -	Account_ID as Id,
    -	Account_FirstName as FirstName,
    -	Account_LastName as LastName,
    -	Account_Email as EmailAddress
    -from Accounts
    -where Account_ID = @Account_ID
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAllAccount.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAllAccount.sql
    deleted file mode 100644
    index 2de5568..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectAllAccount.sql
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -CREATE PROCEDURE dbo.[ps_SelectAllAccount]
    -AS
    -select
    -	Account_ID as Id,
    -	Account_FirstName as FirstName,
    -	Account_LastName as LastName,
    -	Account_Email as EmailAddress
    -from Accounts
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectByIdList.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectByIdList.sql
    deleted file mode 100644
    index f3f0b16..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectByIdList.sql
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -
    -
    -CREATE PROCEDURE ps_SelectByIdList(@AccountIds xml) AS
    -
    -DECLARE @Ids TABLE (ID int) 
    -
    -INSERT INTO @Ids (ID) SELECT ParamValues.ID.value('.','int')
    -FROM @AccountIds.nodes('/Accounts/id') as ParamValues(ID) 
    -
    -SELECT 
    -	Account_ID as Id,
    -	Account_FirstName as FirstName,
    -	Account_LastName as LastName,
    -	Account_Email as EmailAddress
    -FROM 
    -    Accounts
    -INNER JOIN 
    -    @Ids p
    -ON    Accounts.Account_ID = p.ID
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectLineItem.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectLineItem.sql
    deleted file mode 100644
    index cb37ef9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/ps_SelectLineItem.sql
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -CREATE PROCEDURE dbo.[ps_SelectLineItem]
    -@Order_ID  [int]
    -AS
    -select
    -	LineItem_ID as Id,
    -	LineItem_Code as Code,
    -	LineItem_Quantity as Quantity,
    -	LineItem_Price as Price
    -from LineItems where Order_ID = @Order_ID
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/simple-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/simple-init.sql
    deleted file mode 100644
    index 0374c6c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/simple-init.sql
    +++ /dev/null
    @@ -1,18 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Simples]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Simples]
    -END
    -
    -CREATE TABLE [dbo].[Simples] (
    -	[ID] [int] NOT NULL ,
    -	[Name] [varchar] (64) NULL ,
    -	[Address] [varchar] (64) NULL ,
    -	[Count] [int] NULL ,
    -	[Date] [datetime] NULL ,
    -	[Pay] [decimal](18, 2) NULL,
    -  PRIMARY KEY  (ID)
    -)
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/swap-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/swap-procedure.sql
    deleted file mode 100644
    index 981ffc5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/swap-procedure.sql
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -CREATE   PROCEDURE dbo.[ps_swap_email_address]
    -@First_Email  [nvarchar] (64) output, 
    -@Second_Email [nvarchar] (64) output
    -AS
    -
    -Declare @ID1 int
    -Declare @ID2 int
    -
    -Declare @Email1  [nvarchar] (64)
    -Declare @Email2  [nvarchar] (64)
    -
    -  SELECT @ID1 = Account_ID, @Email1 = Account_Email
    -  from Accounts
    -  where Account_Email = @First_Email
    -
    -  SELECT @ID2 = Account_ID, @Email2 = Account_Email
    -  from Accounts
    -  where Account_Email = @Second_Email
    -
    -  UPDATE Accounts
    -  set Account_Email = @Email2
    -  where Account_ID = @ID1
    -
    -  UPDATE Accounts
    -  set Account_Email = @Email1
    -  where Account_ID = @ID2
    -
    -  SELECT @First_Email = Account_Email
    -  from Accounts
    -  where Account_ID = @ID1
    -
    -  SELECT @Second_Email = Account_Email
    -  from Accounts
    -  where Account_ID = @ID2
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/teardown.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/teardown.sql
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql
    deleted file mode 100644
    index 3e2ac77..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MSSQL/user-init.sql
    +++ /dev/null
    @@ -1,23 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Users]
    -END
    -
    -CREATE TABLE [dbo].[Users] (
    -  [User_ID] [int] NOT NULL ,
    -  [Name] [varchar] (32)  NOT NULL
    -  PRIMARY KEY  (User_ID)
    -)
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Users] VALUES(1,'Joe');
    -INSERT INTO [dbo].[Users] VALUES(2,'Averel');
    -INSERT INTO [dbo].[Users] VALUES(3,'William');
    -INSERT INTO [dbo].[Users] VALUES(4,'Jack');
    -INSERT INTO [dbo].[Users] VALUES(5,'Gilles');
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/DataBase.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/DataBase.sql
    deleted file mode 100644
    index 92c6231..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/DataBase.sql
    +++ /dev/null
    @@ -1,214 +0,0 @@
    -use mysql;
    -
    -drop database IBatisNet;
    -create database IBatisNet;
    -
    -drop database NHibernate;
    -create database NHibernate;
    -
    -grant all privileges on IBatisNet.* to IBatisNet@'%' identified by 'test';
    -grant all privileges on IBatisNet.* to IBatisNet@localhost identified by 'test';
    -grant all privileges on IBatisNet.* to IBatisNet@localhost.localdomain identified by 'test';
    -
    -grant all privileges on NHibernate.* to NHibernate@'%' identified by 'test';
    -grant all privileges on NHibernate.* to NHibernate@localhost identified by 'test';
    -grant all privileges on NHibernate.* to NHibernate@localhost.localdomain identified by 'test';
    -
    -
    -/*==============================================================*/
    -/* Nom de la base :  MYSQL                                      */
    -/* Nom de SGBD :  MySQL 3.23                                    */
    -/* Date de cration :  27/05/2004 20:51:40                      */
    -/*==============================================================*/
    -
    -use IBatisNet;
    -
    -drop table if exists Accounts;
    -
    -drop table if exists Categories;
    -
    -drop table if exists Enumerations;
    -
    -drop table if exists LineItems;
    -
    -drop table if exists Orders;
    -
    -drop table if exists Others;
    -
    -drop table if exists Documents;
    -
    -/*==============================================================*/
    -/* Table : Accounts                                             */
    -/*==============================================================*/
    -create table Accounts
    -(
    -   Account_Id                     int                            not null,
    -   Account_FirstName              varchar(32)                    not null,
    -   Account_LastName               varchar(32)                    not null,
    -   Account_Email                  varchar(128),
    -   Account_Banner_Option		  varchar(255),
    -   Account_Cart_Option			  int,
    -   primary key (Account_Id)
    -) TYPE=INNODB;
    -
    -/*==============================================================*/
    -/* Table : Categories                                           */
    -/*==============================================================*/
    -create table Categories
    -(
    -   Category_Id                    int                            not null AUTO_INCREMENT,
    -   Category_Name                  varchar(32),
    -   Category_Guid                  varchar(36),
    -   primary key (Category_Id)
    -) TYPE=INNODB;
    -
    -/*==============================================================*/
    -/* Table : Enumerations                                         */
    -/*==============================================================*/
    -create table Enumerations
    -(
    -   Enum_Id                        int                            not null,
    -   Enum_Day                       int                            not null,
    -   Enum_Color                     int                            not null,
    -   Enum_Month                     int,
    -   primary key (Enum_Id)
    -) TYPE=INNODB;
    -
    -/*==============================================================*/
    -/* Table : LineItems                                            */
    -/*==============================================================*/
    -create table LineItems
    -(
    -   LineItem_Id                    int                            not null,
    -   Order_Id                       int                            not null,
    -   LineItem_Code                  varchar(32)                    not null,
    -   LineItem_Quantity              int                            not null,
    -   LineItem_Price                 decimal(18,2),
    -   LineItem_Picture					blob,
    -   primary key (Order_Id, LineItem_Id)
    -) TYPE=INNODB;
    -
    -/*==============================================================*/
    -/* Table : Orders                                               */
    -/*==============================================================*/
    -create table Orders
    -(
    -   Order_Id                       int                            not null,
    -   Account_Id                     int                            null,
    -   Order_Date                     datetime,
    -   Order_CardType                 varchar(32),
    -   Order_CardNumber               varchar(32),
    -   Order_CardExpiry               varchar(32),
    -   Order_Street                   varchar(32),
    -   Order_City                     varchar(32),
    -   Order_Province                 varchar(32),
    -   Order_PostalCode               varchar(32),
    -   Order_FavouriteLineItem        int,
    -   primary key (Order_Id)
    -) TYPE=INNODB;
    -
    -/*==============================================================*/
    -/* Table : Others                                               */
    -/*==============================================================*/
    -create table Others
    -(
    -   Other_Int                       int,
    -   Other_Long                     bigint,
    -   Other_Bit		            bit not null default 0,
    -   Other_String		              varchar(32) not null   
    -) TYPE=INNODB;
    -
    -CREATE TABLE F (
    -	ID							varchar(50) NOT NULL ,
    -	F_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -CREATE TABLE E (
    -	ID							varchar(50) NOT NULL ,
    -	E_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -CREATE TABLE D (
    -	ID							varchar(50) NOT NULL ,
    -	D_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -CREATE TABLE C (
    -	ID							varchar(50) NOT NULL ,
    -	C_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -
    -CREATE TABLE B (
    -	ID							varchar(50) NOT NULL ,
    -	C_ID						varchar(50) NULL ,
    -	D_ID						varchar(50) NULL ,
    -	B_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -ALTER TABLE B ADD CONSTRAINT FK_B_C FOREIGN KEY FK_B_C (C_ID)
    -    REFERENCES C (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT,
    - ADD CONSTRAINT FK_B_D FOREIGN KEY FK_B_D (D_ID)
    -    REFERENCES D (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT;
    -
    -CREATE TABLE A (
    -	ID							varchar(50) NOT NULL ,
    -	B_ID						varchar(50)  NULL ,
    -	E_ID						varchar(50)  NULL ,
    -	F_ID						varchar(50)  NULL ,
    -	A_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -ALTER TABLE A ADD CONSTRAINT FK_A_B FOREIGN KEY FK_A_B (B_ID)
    -    REFERENCES B (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT,
    - ADD CONSTRAINT FK_A_E FOREIGN KEY FK_A_E (E_ID)
    -    REFERENCES E (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT,
    - ADD CONSTRAINT FK_A_F FOREIGN KEY FK_A_F (F_ID)
    -    REFERENCES F (ID)
    -    ON DELETE RESTRICT;
    -
    -/*==============================================================*/
    -/* Table : Documents                                            */
    -/*==============================================================*/
    -create table Documents
    -(
    -   Document_Id                    int                            not null,
    -   Document_Title                  varchar(32),
    -   Document_Type                  varchar(32),
    -   Document_PageNumber				int,
    -   Document_City					varchar(32),
    -   primary key (DOCUMENT_ID)
    -) TYPE=INNODB;
    -
    -
    -
    -use NHibernate;
    -
    -drop table if exists Users;
    -
    -/*==============================================================*/
    -/* Table : Users                                                */
    -/*==============================================================*/
    -create table Users
    -(
    -   LogonId                      varchar(20)						not null default '0',
    -   Name							varchar(40)                     default null,
    -   Password                     varchar(20)						default null,
    -   EmailAddress                 varchar(40)						default null,
    -   LastLogon					datetime						default null,
    -   primary key (LogonId)
    -) TYPE=INNODB;
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/account-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/account-init.sql
    deleted file mode 100644
    index 18f76bd..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/account-init.sql
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -use IBatisNet;
    -
    -drop table if exists Accounts;
    -
    -create table Accounts
    -(
    -   Account_Id                     int                            not null,
    -   Account_FirstName              varchar(32)                    not null,
    -   Account_LastName               varchar(32)                    not null,
    -   Account_Email                  varchar(128),
    -   Account_Banner_Option		  varchar(255),
    -   Account_Cart_Option			  int,
    -   primary key (Account_Id)
    -) TYPE=INNODB;
    -
    -INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(3,'William', 'Dalton', null, 'Non', 100);
    -INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100);
    -INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null, 'Oui', 100);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/account-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/account-procedure.sql
    deleted file mode 100644
    index 7cca9e6..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/account-procedure.sql
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -
    -use IBatisNet;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/category-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/category-init.sql
    deleted file mode 100644
    index 2f7bbf5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/category-init.sql
    +++ /dev/null
    @@ -1,12 +0,0 @@
    -
    -use IBatisNet;
    -
    -drop table if exists Categories;
    -
    -create table Categories
    -(
    -   Category_Id                    int                            not null AUTO_INCREMENT,
    -   Category_Name                  varchar(32),
    -   Category_Guid                  varchar(36),
    -   primary key (Category_Id)
    -) TYPE=INNODB;
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/category-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/category-procedure.sql
    deleted file mode 100644
    index 7cca9e6..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/category-procedure.sql
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -
    -use IBatisNet;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/documents-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/documents-init.sql
    deleted file mode 100644
    index d27e592..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/documents-init.sql
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -use IBatisNet;
    -
    -drop table if exists Documents;
    -
    -create table Documents
    -(
    -   Document_Id                    int                            not null,
    -   Document_Title                  varchar(32),
    -   Document_Type                  varchar(32),
    -   Document_PageNumber				int,
    -   Document_City					varchar(32),
    -   primary key (DOCUMENT_ID)
    -) TYPE=INNODB;
    -
    -INSERT INTO Documents VALUES (1, 'The World of Null-A', 'Book', 55, null);
    -INSERT INTO Documents VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon');
    -INSERT INTO Documents VALUES (3, 'Lord of the Rings', 'Book', 3587, null);
    -INSERT INTO Documents VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris');
    -INSERT INTO Documents VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris');
    -INSERT INTO Documents VALUES (6, 'Foundation', 'Monograph', 557, null);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/enumeration-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/enumeration-init.sql
    deleted file mode 100644
    index 2cb420c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/enumeration-init.sql
    +++ /dev/null
    @@ -1,18 +0,0 @@
    -
    -use IBatisNet;
    -
    -drop table if exists Enumerations;
    -
    -create table Enumerations
    -(
    -   Enum_Id                        int                            not null,
    -   Enum_Day                       int                            not null,
    -   Enum_Color                     int                            not null,
    -   Enum_Month                     int,
    -   primary key (Enum_Id)
    -) TYPE=INNODB;
    -
    -INSERT INTO Enumerations VALUES(1, 1, 1, 128);
    -INSERT INTO Enumerations VALUES(2, 2, 2, 2048);
    -INSERT INTO Enumerations VALUES(3, 3, 4, 256);
    -INSERT INTO Enumerations VALUES(4, 4, 8, null);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/line-item-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/line-item-init.sql
    deleted file mode 100644
    index 8e20fde..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/line-item-init.sql
    +++ /dev/null
    @@ -1,37 +0,0 @@
    -
    -use IBatisNet;
    -
    -drop table if exists LineItems;
    -
    -create table LineItems
    -(
    -   LineItem_Id                    int                            not null,
    -   Order_Id                       int                            not null,
    -   LineItem_Code                  varchar(32)                    not null,
    -   LineItem_Quantity              int                            not null,
    -   LineItem_Price                 decimal(18,2),
    -   LineItem_Picture					blob,
    -   primary key (Order_Id, LineItem_Id)
    -) TYPE=INNODB;
    -
    -INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null);
    -INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null);
    -INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null);
    -INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null);
    -INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null);
    -INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null);
    -INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null);
    -INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null);
    -INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null);
    -INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null);
    -INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null);
    -INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null);
    -INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null);
    -INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null);
    -INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null);
    -INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null);
    -INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null);
    -INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null);
    -INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null);
    -INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/more-account-records.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/more-account-records.sql
    deleted file mode 100644
    index de33a25..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/more-account-records.sql
    +++ /dev/null
    @@ -1,7 +0,0 @@
    -
    -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null, 'Non', 100);
    -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null, 'Non', 100);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/order-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/order-init.sql
    deleted file mode 100644
    index c3194a7..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/order-init.sql
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -drop table if exists Orders;
    -
    -create table Orders
    -(
    -   Order_Id                       int                            not null,
    -   Account_Id                     int                            null,
    -   Order_Date                     datetime,
    -   Order_CardType                 varchar(32),
    -   Order_CardNumber               varchar(32),
    -   Order_CardExpiry               varchar(32),
    -   Order_Street                   varchar(32),
    -   Order_City                     varchar(32),
    -   Order_Province                 varchar(32),
    -   Order_PostalCode               varchar(32),
    -   Order_FavouriteLineItem        int,
    -   primary key (Order_Id)
    -) TYPE=INNODB;
    -
    -INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2);
    -INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1);
    -INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2);
    -INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1);
    -INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2);
    -INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1);
    -INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2);
    -INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1);
    -INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2);
    -INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1);
    -INSERT INTO Orders VALUES (11, null, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY',1);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/other-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/other-init.sql
    deleted file mode 100644
    index f4fccb1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/other-init.sql
    +++ /dev/null
    @@ -1,91 +0,0 @@
    -
    -use IBatisNet;
    -
    -drop table if exists Others;
    -drop table if exists A;
    -drop table if exists B;
    -drop table if exists C;
    -drop table if exists D;
    -drop table if exists E;
    -drop table if exists F;
    -
    -create table Others
    -(
    -   Other_Int                      int,
    -   Other_Long                     bigint,
    -   Other_Bit					  bit not null default 0,
    -   Other_String		              varchar(32) not null
    -) TYPE=INNODB;
    -
    -CREATE TABLE F (
    -	ID							varchar(50) NOT NULL ,
    -	F_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -CREATE TABLE E (
    -	ID							varchar(50) NOT NULL ,
    -	E_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -CREATE TABLE D (
    -	ID							varchar(50) NOT NULL ,
    -	D_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -CREATE TABLE C (
    -	ID							varchar(50) NOT NULL ,
    -	C_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -
    -CREATE TABLE B (
    -	ID							varchar(50) NOT NULL ,
    -	C_ID						varchar(50) NULL ,
    -	D_ID						varchar(50) NULL ,
    -	B_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -ALTER TABLE B ADD CONSTRAINT FK_B_C FOREIGN KEY FK_B_C (C_ID)
    -    REFERENCES C (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT,
    - ADD CONSTRAINT FK_B_D FOREIGN KEY FK_B_D (D_ID)
    -    REFERENCES D (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT;
    -
    -CREATE TABLE A (
    -	ID							varchar(50) NOT NULL ,
    -	B_ID						varchar(50)  NULL ,
    -	E_ID						varchar(50)  NULL ,
    -	F_ID						varchar(50)  NULL ,
    -	A_Libelle					varchar(50) NULL ,
    -   primary key (ID)
    -) TYPE=INNODB;
    -
    -ALTER TABLE A ADD CONSTRAINT FK_A_B FOREIGN KEY FK_A_B (B_ID)
    -    REFERENCES B (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT,
    - ADD CONSTRAINT FK_A_E FOREIGN KEY FK_A_E (E_ID)
    -    REFERENCES E (ID)
    -    ON DELETE RESTRICT
    -    ON UPDATE RESTRICT,
    - ADD CONSTRAINT FK_A_F FOREIGN KEY FK_A_F (F_ID)
    -    REFERENCES F (ID)
    -    ON DELETE RESTRICT;
    -
    -INSERT INTO Others VALUES(1, 8888888, 0, 'Oui');
    -INSERT INTO Others VALUES(2, 9999999999, 1, 'Non');
    -
    -INSERT INTO F VALUES('f', 'fff');
    -INSERT INTO E VALUES('e', 'eee');
    -INSERT INTO D VALUES('d', 'ddd');
    -INSERT INTO C VALUES('c', 'ccc');
    -INSERT INTO B VALUES('b', 'c', null, 'bbb');
    -INSERT INTO A VALUES('a', 'b', 'e', null, 'aaa');
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/simple-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/simple-init.sql
    deleted file mode 100644
    index 09d76af..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/simple-init.sql
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -use IBatisNet;
    -
    -drop table if exists Simples;
    -
    -create table Simples
    -(
    -   ID int not null,
    -   Name varchar(64) NULL,
    -   Address varchar(64) NULL,
    -   Count int NULL,
    -   Date datetime NULL,
    -   Pay decimal(18,2) NULL,   
    -   primary key (ID)
    -) TYPE=INNODB;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/swap-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/swap-procedure.sql
    deleted file mode 100644
    index 7cca9e6..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/swap-procedure.sql
    +++ /dev/null
    @@ -1,2 +0,0 @@
    -
    -use IBatisNet;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/teardown.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/teardown.sql
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/MySql/user-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/MySql/user-init.sql
    deleted file mode 100644
    index 501c755..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/MySql/user-init.sql
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -
    -use NHibernate;
    -
    -drop table if exists Users;
    -
    -create table Users
    -(
    -   LogonId                      varchar(20)						not null default '0',
    -   Name							varchar(40)                     default null,
    -   Password                     varchar(20)						default null,
    -   EmailAddress                 varchar(40)						default null,
    -   LastLogon					datetime						default null,
    -   primary key (LogonId)
    -) TYPE=INNODB;
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBase.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBase.sql
    deleted file mode 100644
    index d26aef0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBase.sql
    +++ /dev/null
    @@ -1,305 +0,0 @@
    -/*==============================================================*/
    -/* Nom de la base :  ORACLE                                     */
    -/* Nom de SGBD :  ORACLE Version 9i                             */
    -/* Date de cration :  27/05/2004 20:55:37                      */
    -/*==============================================================*/
    -
    -
    -DROP TABLE ACCOUNTS CASCADE CONSTRAINTS;
    -
    -DROP TABLE CATEGORIES CASCADE CONSTRAINTS;
    -
    -DROP TABLE ENUMERATIONS CASCADE CONSTRAINTS;
    -
    -DROP TABLE LINEITEMS CASCADE CONSTRAINTS;
    -
    -DROP TABLE ORDERS CASCADE CONSTRAINTS;
    -
    -DROP TABLE OTHERS CASCADE CONSTRAINTS;
    -
    -DROP TABLE A CASCADE CONSTRAINTS;
    -
    -DROP TABLE B CASCADE CONSTRAINTS;
    -
    -DROP TABLE C CASCADE CONSTRAINTS;
    -
    -DROP TABLE D CASCADE CONSTRAINTS;
    -
    -DROP TABLE E CASCADE CONSTRAINTS;
    -
    -DROP TABLE F CASCADE CONSTRAINTS;
    -
    -DROP TABLE DOCUMENTS CASCADE CONSTRAINTS;
    -
    -DROP TABLE SIMPLES CASCADE CONSTRAINTS;
    -
    -DROP TABLE NULLABLE CASCADE CONSTRAINTS;
    -
    -DROP SEQUENCE S_CATEGORIES;
    -
    -DROP SEQUENCE S_NULLABLE;
    -
    -CREATE SEQUENCE S_CATEGORIES
    -  START WITH 1
    -  MAXVALUE 1E27
    -  MINVALUE 1
    -  NOCYCLE
    -  CACHE 20
    -  NOORDER;
    -
    -CREATE SEQUENCE S_NULLABLE
    -  START WITH 1
    -  MAXVALUE 1E27
    -  MINVALUE 1
    -  NOCYCLE
    -  CACHE 20
    -  NOORDER;
    -
    -/*==============================================================*/
    -/* Table : ACCOUNTS                                             */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE ACCOUNTS  (
    -   ACCOUNT_ID				INTEGER                          NOT NULL,
    -   ACCOUNT_FIRSTNAME		VARCHAR2(32)                     NOT NULL,
    -   ACCOUNT_LASTNAME			VARCHAR2(32)                     NOT NULL,
    -   ACCOUNT_EMAIL			VARCHAR2(128),
    -   ACCOUNT_BANNER_OPTION	VARCHAR2(255),
    -   ACCOUNT_CART_OPTION		INTEGER,   
    -   CONSTRAINT PK_ACCOUNTS PRIMARY KEY (ACCOUNT_ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -/*==============================================================*/
    -/* Table : CATEGORIES                                           */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE CATEGORIES  (
    -   CATEGORY_ID          NUMBER(6)                        NOT NULL,
    -   CATEGORY_NAME        VARCHAR2(32),
    -   CATEGORY_GUID        VARCHAR2(36)
    -)
    -NOLOGGING
    -NOCACHE
    -NOPARALLEL;
    -
    -/*==============================================================*/
    -/* Table : ENUMERATIONS                                         */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE ENUMERATIONS  (
    -   ENUM_ID              INTEGER                          NOT NULL,
    -   ENUM_DAY             INTEGER                          NOT NULL,
    -   ENUM_COLOR           INTEGER                          NOT NULL,
    -   ENUM_MONTH           INTEGER,
    -   CONSTRAINT PK_ENUMERATIONS PRIMARY KEY (ENUM_ID)
    -)
    -NOLOGGING
    -NOCACHE
    -NOPARALLEL;
    -
    -/*==============================================================*/
    -/* Table : LINEITEMS                                            */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE LINEITEMS  (
    -   LINEITEM_ID          INTEGER                          NOT NULL,
    -   ORDER_ID             INTEGER                          NOT NULL,
    -   LINEITEM_CODE        VARCHAR2(32)                     NOT NULL,
    -   LINEITEM_QUANTITY    INTEGER                          NOT NULL,
    -   LINEITEM_PRICE       NUMBER(18,2),
    -   LINEITEM_PICTURE		BLOB,
    -   CONSTRAINT PK_LINEITEMS PRIMARY KEY (ORDER_ID, LINEITEM_ID)
    -)
    -NOLOGGING
    -NOCACHE
    -NOPARALLEL;
    -
    -/*==============================================================*/
    -/* Table : ORDERS                                               */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE ORDERS  (
    -   ORDER_ID             INTEGER                          NOT NULL,
    -   ACCOUNT_ID           INTEGER                          NULL,
    -   ORDER_DATE           DATE,
    -   ORDER_CARDTYPE       VARCHAR2(32),
    -   ORDER_CARDNUMBER     VARCHAR2(32),
    -   ORDER_CARDEXPIRY     VARCHAR2(32),
    -   ORDER_STREET         VARCHAR2(32),
    -   ORDER_CITY           VARCHAR2(32),
    -   ORDER_PROVINCE       VARCHAR2(32),
    -   ORDER_POSTALCODE     VARCHAR2(32),
    -   ORDER_FAVOURITELINEITEM INTEGER,
    -   CONSTRAINT PK_ORDERS PRIMARY KEY (ORDER_ID)
    -)
    -NOLOGGING
    -NOCACHE
    -NOPARALLEL;
    -
    -/*==============================================================*/
    -/* Table : OTHERS                                               */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE OTHERS (
    -	OTHER_INT INT NULL ,
    -	OTHER_LONG INT NULL ,
    -	OTHER_BIT SMALLINT DEFAULT 0 NOT NULL,
    -	OTHER_STRING VARCHAR2(32) NOT NULL 	
    -)
    -NOLOGGING
    -NOCACHE
    -NOPARALLEL;
    -
    -CREATE TABLE F (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	F_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_F PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE E (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	E_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_E PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE D (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	D_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_D PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE C (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	C_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_C PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE B (
    -	ID VARCHAR2(50) NOT NULL ,
    -	C_ID VARCHAR2(50) NULL ,
    -	D_ID VARCHAR2(50) NULL ,
    -	B_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_B PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -ALTER TABLE B
    -  ADD CONSTRAINT FK_B_C
    -    FOREIGN KEY (C_ID)
    -    REFERENCES C (ID);
    -
    -ALTER TABLE B
    -  ADD CONSTRAINT FK_B_D
    -    FOREIGN KEY (D_ID)
    -    REFERENCES D (ID);    
    -    
    -CREATE TABLE A (
    -	ID VARCHAR2(50) NOT NULL ,
    -	B_ID VARCHAR2(50)  NULL ,
    -	E_ID VARCHAR2(50)  NULL ,
    -	F_ID VARCHAR2(50)  NULL ,
    -	A_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_A PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -ALTER TABLE A
    -  ADD CONSTRAINT FK_A_B
    -    FOREIGN KEY (B_ID)
    -    REFERENCES B (ID);
    -
    -ALTER TABLE A
    -  ADD CONSTRAINT FK_A_E
    -    FOREIGN KEY (E_ID)
    -    REFERENCES E (ID);    
    -
    -ALTER TABLE A
    -  ADD CONSTRAINT FK_A_F
    -    FOREIGN KEY (F_ID)
    -    REFERENCES F (ID);    
    -
    -
    -/*==============================================================*/
    -/* Table : DOCUMENTS                                            */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE DOCUMENTS  (
    -   DOCUMENT_ID           INTEGER                          NOT NULL,
    -   DOCUMENT_TITLE        VARCHAR2(32),
    -   DOCUMENT_TYPE         VARCHAR2(32),
    -   DOCUMENT_PAGENUMBER   INTEGER,
    -   DOCUMENT_CITY         VARCHAR2(32),
    -   CONSTRAINT PK_DOCUMENTS PRIMARY KEY (DOCUMENT_ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -
    -/*==============================================================*/
    -/* Table : SIMPLES                                              */
    -/*==============================================================*/
    -
    -
    -CREATE TABLE SIMPLES (
    -   ID INTEGER NOT NULL,
    -   NAME VARCHAR(64) NULL ,
    -   ADDRESS VARCHAR(64) NULL ,
    -   COUNT INTEGER NULL ,
    -   "DATE" DATE NULL,
    -   PAY DECIMAL(18,2) NULL,
    -   CONSTRAINT PK_SIMPLES PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -
    -/*==============================================================*/
    -/* Table : NULLABLE                                             */
    -/*==============================================================*/
    -
    -CREATE TABLE NULLABLE (
    -   ID INTEGER NOT NULL,
    -   TESTBOOL SMALLINT NULL ,
    -   TESTBYTE SMALLINT NULL ,
    -   TESTCHAR CHAR(1) NULL ,
    -   TESTDATETIME DATE NULL ,
    -   TESTDECIMAL DECIMAL(9,2) NULL ,
    -   TESTDOUBLE FLOAT NULL ,
    -   TESTGUID VARCHAR2(36) NULL ,
    -   TESTINT16 SMALLINT NULL ,
    -   TESTINT32 INTEGER NULL ,
    -   TESTINT64 NUMBER NULL ,
    -   TESTSINGLE REAL NULL ,
    -   CONSTRAINT PK_NULLABLE PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBaseNHibernate.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBaseNHibernate.sql
    deleted file mode 100644
    index 966675b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/DataBaseNHibernate.sql
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -DROP TABLE USERS;
    -
    -/*==============================================================*/
    -/* Table : USERS                                                */
    -/*==============================================================*/
    -
    -CREATE TABLE USERS (
    -  LOGONID 	 	   NVARCHAR2(20) 				DEFAULT '0',
    -  NAME 			   NVARCHAR2(40) 				DEFAULT NULL,
    -  PASSWORD 		   NVARCHAR2(20) 				DEFAULT NULL,
    -  EMAILADDRESS 	   NVARCHAR2(40) 				DEFAULT NULL,
    -  LASTLOGON 	   DATE 					DEFAULT NULL,
    -  CONSTRAINT PK_USERS PRIMARY KEY (LOGONID)
    -)
    -NOLOGGING
    -NOCACHE
    -NOPARALLEL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/Nullable-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/Nullable-init.sql
    deleted file mode 100644
    index fb6a77d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/Nullable-init.sql
    +++ /dev/null
    @@ -1,30 +0,0 @@
    -DROP TABLE NULLABLE CASCADE CONSTRAINTS;
    -
    -DROP SEQUENCE S_NULLABLE;
    -
    -CREATE SEQUENCE S_NULLABLE
    -  START WITH 1
    -  MAXVALUE 1E27
    -  MINVALUE 1
    -  NOCYCLE
    -  CACHE 20
    -  NOORDER;
    -
    -CREATE TABLE NULLABLE (
    -   ID INTEGER NOT NULL,
    -   TESTBOOL SMALLINT NULL ,
    -   TESTBYTE SMALLINT NULL ,
    -   TESTCHAR CHAR(1) NULL ,
    -   TESTDATETIME DATE NULL ,
    -   TESTDECIMAL DECIMAL(9,2) NULL ,
    -   TESTDOUBLE FLOAT NULL ,
    -   TESTGUID VARCHAR2(36) NULL ,
    -   TESTINT16 SMALLINT NULL ,
    -   TESTINT32 INTEGER NULL ,
    -   TESTINT64 NUMBER NULL ,
    -   TESTSINGLE REAL NULL ,
    -   CONSTRAINT PK_NULLABLE PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-init.sql
    deleted file mode 100644
    index 04377e0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-init.sql
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -DROP TABLE ACCOUNTS CASCADE CONSTRAINTS;
    -
    -CREATE TABLE ACCOUNTS  (
    -   ACCOUNT_ID				INTEGER                          NOT NULL,
    -   ACCOUNT_FIRSTNAME		VARCHAR2(32)                     NOT NULL,
    -   ACCOUNT_LASTNAME			VARCHAR2(32)                     NOT NULL,
    -   ACCOUNT_EMAIL			VARCHAR2(128),
    -   ACCOUNT_BANNER_OPTION	VARCHAR2(255),
    -   ACCOUNT_CART_OPTION		INTEGER,   
    -   CONSTRAINT PK_ACCOUNTS PRIMARY KEY (ACCOUNT_ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -INSERT INTO ACCOUNTS VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO ACCOUNTS VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO ACCOUNTS VALUES(3,'William', 'Dalton', null, 'Non', 100);
    -INSERT INTO ACCOUNTS VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100);
    -INSERT INTO ACCOUNTS VALUES(5,'Gilles', 'Bayon', null, 'Oui', 100);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-procedure.sql
    deleted file mode 100644
    index 925c0b5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-procedure.sql
    +++ /dev/null
    @@ -1,24 +0,0 @@
    -CREATE OR REPLACE PROCEDURE prc_InsertAccount (	
    -	p_Account_ID IN INTEGER, 
    -	p_Account_FirstName IN VARCHAR2, 
    -	p_Account_LastName IN VARCHAR2, 
    -	p_Account_Email IN VARCHAR2,
    -	p_Account_Banner_Option IN VARCHAR2,
    -	p_Account_Cart_Option IN INTEGER ) 
    -IS 
    -BEGIN 
    -	INSERT INTO Accounts (	
    -		Account_ID, 
    -		Account_FirstName, 
    -		Account_LastName, 
    -		Account_Email,
    -		Account_Banner_Option,
    -		Account_Cart_Option ) 
    -	VALUES ( 
    -		p_Account_ID, 
    -		p_Account_FirstName, 
    -		p_Account_LastName, 
    -		p_Account_Email,
    -		p_Account_Banner_Option,
    -		p_Account_Cart_Option ); 
    -END;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-body.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-body.sql
    deleted file mode 100644
    index b3ff55f..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-body.sql
    +++ /dev/null
    @@ -1,48 +0,0 @@
    -CREATE OR REPLACE PACKAGE BODY REF_CURSOR_TEST IS
    -
    -	FUNCTION GET_ACCOUNTS_FUNCTION RETURN T_ACCOUNTS_CURSOR 
    -	IS
    -	C_ACCOUNTS T_ACCOUNTS_CURSOR;
    -	BEGIN
    -		OPEN C_ACCOUNTS FOR
    -			SELECT
    -				Account_ID as Id,
    -				Account_FirstName as FirstName,
    -				Account_LastName as LastName,
    -				Account_Email as EmailAddress
    -			FROM Accounts
    -			ORDER BY Account_ID;
    -		RETURN C_ACCOUNTS;
    -	END GET_ACCOUNTS_FUNCTION;
    -
    -	PROCEDURE GET_ACCOUNTS_PROCEDURE (
    -			P_ACCOUNTS OUT T_ACCOUNTS_CURSOR
    -	) AS
    -	BEGIN
    -	OPEN P_ACCOUNTS FOR 
    -			SELECT
    -				Account_ID as Id,
    -				Account_FirstName as FirstName,
    -				Account_LastName as LastName,
    -				Account_Email as EmailAddress
    -			FROM Accounts
    -			ORDER BY Account_ID;
    -	END GET_ACCOUNTS_PROCEDURE;
    -	
    -	PROCEDURE GET_ACCOUNT_PROCEDURE (
    -		P_ACCOUNTS OUT T_ACCOUNTS_CURSOR, 
    -		P_ACCOUNT_ID IN INTEGER
    -	) AS
    -	BEGIN
    -	OPEN P_ACCOUNTS FOR 
    -			SELECT
    -				Account_ID as Id,
    -				Account_FirstName as FirstName,
    -				Account_LastName as LastName,
    -				Account_Email as EmailAddress
    -			FROM Accounts
    -			WHERE Account_ID = P_ACCOUNT_ID
    -			ORDER BY Account_ID;
    -	END GET_ACCOUNT_PROCEDURE;
    -
    -END REF_CURSOR_TEST;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-spec.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-spec.sql
    deleted file mode 100644
    index 08b7cb0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/account-refcursor-package-spec.sql
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -CREATE OR REPLACE PACKAGE REF_CURSOR_TEST IS
    -
    -	TYPE T_ACCOUNTS_CURSOR IS REF CURSOR;
    -	FUNCTION GET_ACCOUNTS_FUNCTION RETURN T_ACCOUNTS_CURSOR;
    -	PROCEDURE GET_ACCOUNTS_PROCEDURE (P_ACCOUNTS OUT T_ACCOUNTS_CURSOR);
    -	PROCEDURE GET_ACCOUNT_PROCEDURE (P_ACCOUNTS OUT T_ACCOUNTS_CURSOR, P_ACCOUNT_ID IN INTEGER);
    -
    -END REF_CURSOR_TEST;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-init.sql
    deleted file mode 100644
    index d689165..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-init.sql
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -DROP TABLE CATEGORIES CASCADE CONSTRAINTS;
    -
    -DROP SEQUENCE S_CATEGORIES;
    -
    -CREATE SEQUENCE S_CATEGORIES
    -  START WITH 1
    -  MAXVALUE 1E27
    -  MINVALUE 1
    -  NOCYCLE
    -  CACHE 20
    -  NOORDER;
    -
    -CREATE TABLE CATEGORIES  (
    -   CATEGORY_ID          NUMBER(6)                        NOT NULL,
    -   CATEGORY_NAME        VARCHAR2(32),
    -   CATEGORY_GUID        VARCHAR2(36)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-procedure.sql
    deleted file mode 100644
    index b31d742..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/category-procedure.sql
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -CREATE OR REPLACE PROCEDURE prc_InsertCategory ( 
    -	p_Category_Name IN VARCHAR2, 
    -	p_Category_Guid IN VARCHAR2, 
    -	p_Category_Id OUT INT ) 
    -IS 
    -BEGIN 
    -	SELECT S_CATEGORIES.nextval 
    -	INTO p_Category_Id 
    -	FROM DUAL; 
    -	
    -	INSERT INTO Categories ( 
    -		Category_Id,	
    -		Category_Name, 
    -		Category_Guid ) 
    -	VALUES (	
    -		p_Category_Id, 
    -		p_Category_Name, 
    -		p_Category_Guid ); 
    -END;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/documents-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/documents-init.sql
    deleted file mode 100644
    index 8233330..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/documents-init.sql
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -DROP TABLE DOCUMENTS CASCADE CONSTRAINTS;
    -
    -CREATE TABLE DOCUMENTS  (
    -   DOCUMENT_ID           INTEGER                          NOT NULL,
    -   DOCUMENT_TITLE        VARCHAR2(32),
    -   DOCUMENT_TYPE         VARCHAR2(32),
    -   DOCUMENT_PAGENUMBER   INTEGER,
    -   DOCUMENT_CITY         VARCHAR2(32),
    -   CONSTRAINT PK_DOCUMENTS PRIMARY KEY (DOCUMENT_ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -INSERT INTO DOCUMENTS VALUES (1, 'The World of Null-A', 'Book', 55, null);
    -INSERT INTO DOCUMENTS VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon');
    -INSERT INTO DOCUMENTS VALUES (3, 'Lord of the Rings', 'Book', 3587, null);
    -INSERT INTO DOCUMENTS VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris');
    -INSERT INTO DOCUMENTS VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris');
    -INSERT INTO DOCUMENTS VALUES (6, 'Foundation', 'Monograph', 557, null);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/enumeration-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/enumeration-init.sql
    deleted file mode 100644
    index 20c8d58..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/enumeration-init.sql
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -DROP TABLE ENUMERATIONS CASCADE CONSTRAINTS;
    -
    -CREATE TABLE ENUMERATIONS  (
    -   ENUM_ID              INTEGER                          NOT NULL,
    -   ENUM_DAY             INTEGER                          NOT NULL,
    -   ENUM_COLOR           INTEGER                          NOT NULL,
    -   ENUM_MONTH           INTEGER,
    -   CONSTRAINT PK_ENUMERATIONS PRIMARY KEY (ENUM_ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -INSERT INTO ENUMERATIONS VALUES(1, 1, 1, 128);
    -INSERT INTO ENUMERATIONS VALUES(2, 2, 2, 2048);
    -INSERT INTO ENUMERATIONS VALUES(3, 3, 4, 256);
    -INSERT INTO ENUMERATIONS VALUES(4, 4, 8, NULL);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/line-item-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/line-item-init.sql
    deleted file mode 100644
    index 961af88..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/line-item-init.sql
    +++ /dev/null
    @@ -1,35 +0,0 @@
    -DROP TABLE LINEITEMS CASCADE CONSTRAINTS;
    -
    -CREATE TABLE LINEITEMS  (
    -   LINEITEM_ID          INTEGER                          NOT NULL,
    -   ORDER_ID             INTEGER                          NOT NULL,
    -   LINEITEM_CODE        VARCHAR2(32)                     NOT NULL,
    -   LINEITEM_QUANTITY    INTEGER                          NOT NULL,
    -   LINEITEM_PRICE       NUMBER(18,2),
    -   LINEITEM_PICTURE		BLOB,
    -   CONSTRAINT PK_LINEITEMS PRIMARY KEY (ORDER_ID, LINEITEM_ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -INSERT INTO LINEITEMS VALUES (1, 10, 'ESM-34', 1, 45.43, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 10, 'QSM-98', 8, 8.40, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 9, 'DSM-78', 2, 45.40, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 9, 'TSM-12', 2, 32.12, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 8, 'DSM-16', 4, 41.30, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 8, 'GSM-65', 1, 2.20, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 7, 'WSM-27', 7, 52.10, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 7, 'ESM-23', 2, 123.34, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 6, 'QSM-39', 9, 12.12, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 6, 'ASM-45', 6, 78.77, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 5, 'ESM-48', 3, 43.87, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 5, 'WSM-98', 7, 5.40, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 4, 'RSM-57', 2, 78.90, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 4, 'XSM-78', 9, 2.34, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 3, 'DSM-59', 3, 5.70, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 3, 'DSM-53', 3, 98.78, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 2, 'DSM-37', 4, 7.80, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 2, 'FSM-12', 2, 55.78, NULL);
    -INSERT INTO LINEITEMS VALUES (1, 1, 'ESM-48', 8, 87.60, NULL);
    -INSERT INTO LINEITEMS VALUES (2, 1, 'ESM-23', 1, 55.40, NULL);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/more-account-records.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/more-account-records.sql
    deleted file mode 100644
    index 7dedce8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/more-account-records.sql
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null, 'Non', 100);
    -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null, 'Non', 100);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/order-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/order-init.sql
    deleted file mode 100644
    index 62d0812..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/order-init.sql
    +++ /dev/null
    @@ -1,31 +0,0 @@
    -DROP TABLE ORDERS CASCADE CONSTRAINTS;
    -
    -CREATE TABLE ORDERS  (
    -   ORDER_ID             INTEGER                          NOT NULL,
    -   ACCOUNT_ID           INTEGER                          NULL,
    -   ORDER_DATE           DATE,
    -   ORDER_CARDTYPE       VARCHAR2(32),
    -   ORDER_CARDNUMBER     VARCHAR2(32),
    -   ORDER_CARDEXPIRY     VARCHAR2(32),
    -   ORDER_STREET         VARCHAR2(32),
    -   ORDER_CITY           VARCHAR2(32),
    -   ORDER_PROVINCE       VARCHAR2(32),
    -   ORDER_POSTALCODE     VARCHAR2(32),
    -   ORDER_FAVOURITELINEITEM INTEGER,
    -   CONSTRAINT PK_ORDERS PRIMARY KEY (ORDER_ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -INSERT INTO ORDERS VALUES (1, 1, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2);
    -INSERT INTO ORDERS VALUES (2, 4, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1);
    -INSERT INTO ORDERS VALUES (3, 3, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2);
    -INSERT INTO ORDERS VALUES (4, 2, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1);
    -INSERT INTO ORDERS VALUES (5, 5, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2);
    -INSERT INTO ORDERS VALUES (6, 5, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1);
    -INSERT INTO ORDERS VALUES (7, 4, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2);
    -INSERT INTO ORDERS VALUES (8, 3, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1);
    -INSERT INTO ORDERS VALUES (9, 2, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2);
    -INSERT INTO ORDERS VALUES (10, 1, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1);
    -INSERT INTO ORDERS VALUES (11, null, TO_DATE('2003-02-15 8:15:00','yyyy-mm-dd hh:mi:ss'), 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY',1);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/other-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/other-init.sql
    deleted file mode 100644
    index 551a44a..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/other-init.sql
    +++ /dev/null
    @@ -1,111 +0,0 @@
    -DROP TABLE OTHERS;
    -DROP TABLE A CASCADE CONSTRAINTS;
    -DROP TABLE B CASCADE CONSTRAINTS;
    -DROP TABLE C CASCADE CONSTRAINTS;
    -DROP TABLE D CASCADE CONSTRAINTS;
    -DROP TABLE E CASCADE CONSTRAINTS;
    -DROP TABLE F CASCADE CONSTRAINTS;
    -
    -CREATE TABLE OTHERS (
    -	OTHER_INT INT NULL ,
    -	OTHER_LONG NUMBER NULL ,
    -	OTHER_BIT SMALLINT DEFAULT 0 NOT NULL,
    -	OTHER_STRING VARCHAR2(32) NOT NULL
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE F (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	F_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_F PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE E (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	E_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_E PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE D (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	D_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_D PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE C (
    -	ID	VARCHAR2(50) NOT NULL ,
    -	C_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_C PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -CREATE TABLE B (
    -	ID VARCHAR2(50) NOT NULL ,
    -	C_ID VARCHAR2(50) NULL ,
    -	D_ID VARCHAR2(50) NULL ,
    -	B_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_B PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -ALTER TABLE B
    -  ADD CONSTRAINT FK_B_C
    -    FOREIGN KEY (C_ID)
    -    REFERENCES C (ID);
    -
    -ALTER TABLE B
    -  ADD CONSTRAINT FK_B_D
    -    FOREIGN KEY (D_ID)
    -    REFERENCES D (ID);    
    -    
    -CREATE TABLE A (
    -	ID VARCHAR2(50) NOT NULL ,
    -	B_ID VARCHAR2(50)  NULL ,
    -	E_ID VARCHAR2(50)  NULL ,
    -	F_ID VARCHAR2(50)  NULL ,
    -	A_LIBELLE VARCHAR2(50) NULL ,
    -	CONSTRAINT PK_A PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    -
    -ALTER TABLE A
    -  ADD CONSTRAINT FK_A_B
    -    FOREIGN KEY (B_ID)
    -    REFERENCES B (ID);
    -
    -ALTER TABLE A
    -  ADD CONSTRAINT FK_A_E
    -    FOREIGN KEY (E_ID)
    -    REFERENCES E (ID);    
    -
    -ALTER TABLE A
    -  ADD CONSTRAINT FK_A_F
    -    FOREIGN KEY (F_ID)
    -    REFERENCES F (ID);    
    -
    -INSERT INTO OTHERS VALUES(1, 8888888, 0, 'Oui');
    -INSERT INTO OTHERS VALUES(2, 9999999999, 1, 'Non');
    -
    -INSERT INTO F VALUES('f', 'fff');
    -INSERT INTO E VALUES('e', 'eee');
    -INSERT INTO D VALUES('d', 'ddd');
    -INSERT INTO C VALUES('c', 'ccc');
    -INSERT INTO B VALUES('b', 'c', NULL, 'bbb');
    -INSERT INTO A VALUES('a', 'b', 'e', NULL, 'aaa');
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/simple-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/simple-init.sql
    deleted file mode 100644
    index 9d87871..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/simple-init.sql
    +++ /dev/null
    @@ -1,14 +0,0 @@
    -DROP TABLE SIMPLES CASCADE CONSTRAINTS;
    -
    -CREATE TABLE SIMPLES (
    -   ID INTEGER NOT NULL,
    -   NAME VARCHAR(64) NULL ,
    -   ADDRESS VARCHAR(64) NULL ,
    -   COUNT INTEGER NULL ,
    -   "DATE" DATE NULL,
    -   PAY DECIMAL(18,2) NULL,
    -   CONSTRAINT PK_SIMPLES PRIMARY KEY (ID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/swap-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/swap-procedure.sql
    deleted file mode 100644
    index b9b2e34..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/swap-procedure.sql
    +++ /dev/null
    @@ -1,62 +0,0 @@
    -CREATE OR REPLACE PROCEDURE prc_SWAP_EMAIL_ADDRESS ( 
    -	p_first IN OUT VARCHAR2, 
    -	p_second IN OUT VARCHAR2 ) 
    -IS 
    -	v_id1 NUMBER (5,0); 
    -	v_id2 NUMBER (5,0); 
    -	v_email1 VARCHAR2 (255); 
    -	v_email2 VARCHAR2 (255); 
    -BEGIN 
    -	SELECT 
    -		ACCOUNT_ID, 
    -		ACCOUNT_EMAIL 
    -	INTO v_id1, 
    -		v_email1 
    -	FROM 
    -		ACCOUNTS 
    -	WHERE 
    -		ACCOUNT_EMAIL = p_first; 
    -		
    -	SELECT 
    -		ACCOUNT_ID, 
    -		ACCOUNT_EMAIL 
    -	INTO 
    -		v_id2, 
    -		v_email2 
    -	FROM 
    -		ACCOUNTS 
    -	WHERE 
    -		ACCOUNT_EMAIL = p_second; 
    -		
    -	UPDATE 
    -		ACCOUNTS 
    -	SET 
    -		ACCOUNT_EMAIL = v_email2 
    -	WHERE 
    -		ACCOUNT_ID = v_id1; 
    -		
    -	UPDATE 
    -		ACCOUNTS 
    -	SET 
    -		ACCOUNT_EMAIL = v_email1 
    -	WHERE 
    -		ACCOUNT_ID = v_id2; 
    -		
    -	SELECT 
    -		ACCOUNT_EMAIL 
    -	INTO 
    -		p_first 
    -	FROM 
    -		ACCOUNTS 
    -	WHERE 
    -		ACCOUNT_ID = v_id1; 
    -		
    -	SELECT 
    -		ACCOUNT_EMAIL 
    -	INTO 
    -		p_second 
    -	FROM 
    -		ACCOUNTS 
    -	WHERE 
    -		ACCOUNT_ID = v_id2; 
    -END;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/teardown.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/teardown.sql
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/user-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/Oracle/user-init.sql
    deleted file mode 100644
    index c1b1a79..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/Oracle/user-init.sql
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -DROP TABLE USERS;
    -
    -CREATE TABLE USERS (
    -  LOGONID 	 	   NVARCHAR2(20) 				DEFAULT '0',
    -  NAME 			   NVARCHAR2(40) 				DEFAULT NULL,
    -  PASSWORD 		   NVARCHAR2(20) 				DEFAULT NULL,
    -  EMAILADDRESS 	   NVARCHAR2(40) 				DEFAULT NULL,
    -  LASTLOGON 	   DATE 						DEFAULT NULL,
    -  CONSTRAINT PK_USERS PRIMARY KEY (LOGONID)
    -)
    -NOLOGGING 
    -NOCACHE 
    -NOPARALLEL;
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/DataBase.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/DataBase.sql
    deleted file mode 100644
    index c2127a4..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/DataBase.sql
    +++ /dev/null
    @@ -1,195 +0,0 @@
    -DROP database "IBatisNet";
    -DROP database "NHibernate";
    -
    --- User: "IBatisNet"
    -
    -DROP USER "IBatisNet";
    -
    -CREATE USER "IBatisNet" PASSWORD 'test'
    -  CREATEDB CREATEUSER
    -   VALID UNTIL 'infinity';
    -
    --- User: "NHibernate"
    -  
    -DROP USER "NHibernate";
    -
    -CREATE USER "NHibernate" PASSWORD 'test'
    -  CREATEDB CREATEUSER
    -   VALID UNTIL 'infinity';
    -
    -
    --- Database: "IBatisNet"
    -
    -CREATE DATABASE "IBatisNet"
    -WITH ENCODING='UNICODE'
    -     OWNER="IBatisNet";
    -
    --- Database: "NHibernate"
    -
    -CREATE DATABASE "NHibernate"
    -  WITH ENCODING='UNICODE'
    -       OWNER="NHibernate";
    -
    -
    -
    -
    -\connect "IBatisNet" "IBatisNet" using test;
    -
    --- DROP TABLE Accounts;
    -
    --- DROP TABLE Categories;
    -
    --- DROP TABLE Enumerations;
    -
    --- DROP TABLE LineItems;
    -
    --- DROP TABLE Orders;
    -
    --- DROP TABLE Others;
    -
    --- DROP TABLE Documents;
    -
    -
    -
    --- Sequence: S_Categories
    -
    --- DROP SEQUENCE S_Categories;
    -
    -/*
    -CREATE SEQUENCE S_Categories
    -  INCREMENT 1
    -  MINVALUE 1
    -  MAXVALUE 9223372036854775807
    -  START 1
    -  CACHE 20;
    -ALTER TABLE S_Categories OWNER TO "IBatisNet";
    -*/
    -
    -/*==============================================================*/
    -/* Table : Accounts                                             */
    -/*==============================================================*/
    -CREATE TABLE Accounts
    -(
    -   Account_Id int4 NOT NULL, 
    -   Account_FirstName varchar(32) NOT NULL, 
    -   Account_LastName varchar(32) NOT NULL, 
    -   Account_Email varchar(128),
    -   Account_Banner_Option varchar(255),
    -   Account_Cart_Option int4,   
    -   CONSTRAINT PK_Accounts PRIMARY KEY (Account_Id)   
    -) WITHOUT OIDS;
    -ALTER TABLE Accounts OWNER TO "IBatisNet";
    -
    -/*==============================================================*/
    -/* Table : Categories                                           */
    -/*==============================================================*/
    -CREATE TABLE Categories
    -(
    -  Category_Id serial,
    -  Category_Name varchar(32),
    -  Category_Guid varchar(36),
    -  CONSTRAINT PK_Categories PRIMARY KEY (Category_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Categories OWNER TO "IBatisNet";
    -
    -/*==============================================================*/
    -/* Table : Enumerations                                         */
    -/*==============================================================*/
    -CREATE TABLE Enumerations
    -(
    -  Enum_Id int4 NOT NULL,
    -  Enum_Day int4 NOT NULL,
    -  Enum_Color int4 NOT NULL,
    -  Enum_Month int4,
    -  CONSTRAINT PK_Enumerations PRIMARY KEY (Enum_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Enumerations OWNER TO "IBatisNet";
    -
    -/*==============================================================*/
    -/* Table : LineItems                                            */
    -/*==============================================================*/
    -CREATE TABLE LineItems
    -(
    -  LineItem_Id int4 NOT NULL,
    -  Order_Id int4 NOT NULL,
    -  LineItem_Code varchar(32) NOT NULL,
    -  LineItem_Quantity int4 NOT NULL,
    -  LineItem_Price numeric(18,2),
    -  LineItem_Picture bytea,
    -  CONSTRAINT PK_LineItems PRIMARY KEY (LineItem_Id, Order_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE LineItems OWNER TO "IBatisNet";
    -
    -/*==============================================================*/
    -/* Table : Orders                                               */
    -/*==============================================================*/
    -CREATE TABLE Orders
    -(
    -  Order_Id int4 NOT NULL,
    -  Account_Id int4 NOT NULL,
    -  Order_Date timestamp,
    -  Order_CardType varchar(32),
    -  Order_CardNumber varchar(32),
    -  Order_CardExpiry varchar(32),
    -  Order_Street varchar(32),
    -  Order_City varchar(32),
    -  Order_Province varchar(32),
    -  Order_PostalCode varchar(32),
    -  Order_FavouriteLineItem int4,
    -  CONSTRAINT PK_Orders PRIMARY KEY (Order_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Orders OWNER TO "IBatisNet";
    -
    -/*==============================================================*/
    -/* Table : Others                                               */
    -/*==============================================================*/
    -CREATE TABLE Others
    -(
    -  Other_Int int4,
    -  Other_Long int8,
    -  Other_Bit bool NOT NULL DEFAULT false,
    -  Other_String varchar(32) NOT NULL
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Others OWNER TO "IBatisNet";
    -
    -/*==============================================================*/
    -/* Table : Documents                                            */
    -/*==============================================================*/
    -CREATE TABLE Documents
    -(
    -  Document_Id int4 NOT NULL,
    -  Document_Title varchar(32),
    -  Document_Type varchar(32),
    -  Document_PageNumber int4,
    -  Document_City varchar(32),
    -  CONSTRAINT PK_Documents PRIMARY KEY (Document_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Documents OWNER TO "IBatisNet";
    -
    -
    -
    -
    -\connect "NHibernate" "NHibernate" using test;
    -
    --- DROP TABLE Users;
    -
    -/*==============================================================*/
    -/* Table : Users                                                */
    -/*==============================================================*/
    -CREATE TABLE Users
    -(
    -  LogonId varchar(20) NOT NULL DEFAULT '0'::character varying,
    -  Name varchar(40),
    -  Password varchar(20),
    -  EmailAddress varchar(40),
    -  LastLogon date,
    -  CONSTRAINT PK_Users PRIMARY KEY (LogonId)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Users OWNER TO "NHibernate";
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-init.sql
    deleted file mode 100644
    index 7a9ea25..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-init.sql
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -DROP TABLE Accounts;
    -
    -CREATE TABLE Accounts
    -(
    -   Account_Id int4 NOT NULL, 
    -   Account_FirstName varchar(32) NOT NULL, 
    -   Account_LastName varchar(32) NOT NULL, 
    -   Account_Email varchar(128),
    -   Account_Banner_Option varchar(255),
    -   Account_Cart_Option int4,   
    -   CONSTRAINT PK_Accounts PRIMARY KEY (Account_Id)   
    -) WITHOUT OIDS;
    -ALTER TABLE Accounts OWNER TO "IBatisNet";
    -
    -INSERT INTO Accounts VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(3,'William', 'Dalton', null, 'Non', 100);
    -INSERT INTO Accounts VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100);
    -INSERT INTO Accounts VALUES(5,'Gilles', 'Bayon', null, 'Oui', 100);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-procedure.sql
    deleted file mode 100644
    index 7489acc..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/account-procedure.sql
    +++ /dev/null
    @@ -1 +0,0 @@
    ---
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-init.sql
    deleted file mode 100644
    index 7b5146c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-init.sql
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -DROP TABLE Categories;
    -
    -CREATE TABLE Categories
    -(
    -  Category_Id serial,
    -  Category_Name varchar(32),
    -  Category_Guid varchar(36),
    -  CONSTRAINT PK_Categories PRIMARY KEY (Category_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Categories OWNER TO "IBatisNet";
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-procedure.sql
    deleted file mode 100644
    index 7489acc..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/category-procedure.sql
    +++ /dev/null
    @@ -1 +0,0 @@
    ---
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/documents-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/documents-init.sql
    deleted file mode 100644
    index dcee640..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/documents-init.sql
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -DROP TABLE Documents;
    -
    -CREATE TABLE Documents
    -(
    -  Document_Id int4 NOT NULL,
    -  Document_Title varchar(32),
    -  Document_Type varchar(32),
    -  Document_PageNumber int4,
    -  Document_City varchar(32),
    -  CONSTRAINT PK_Documents PRIMARY KEY (Document_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Documents OWNER TO "IBatisNet";
    -
    -INSERT INTO Documents VALUES (1, 'The World of Null-A', 'Book', 55, null);
    -INSERT INTO Documents VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon');
    -INSERT INTO Documents VALUES (3, 'Lord of the Rings', 'Book', 3587, null);
    -INSERT INTO Documents VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris');
    -INSERT INTO Documents VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris');
    -INSERT INTO Documents VALUES (6, 'Foundation', 'Monograph', 557, null);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/enumeration-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/enumeration-init.sql
    deleted file mode 100644
    index 3a67e73..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/enumeration-init.sql
    +++ /dev/null
    @@ -1,17 +0,0 @@
    -DROP TABLE Enumerations;
    -
    -CREATE TABLE Enumerations
    -(
    -  Enum_Id int4 NOT NULL,
    -  Enum_Day int4 NOT NULL,
    -  Enum_Color int4 NOT NULL,
    -  Enum_Month int4,
    -  CONSTRAINT PK_Enumerations PRIMARY KEY (Enum_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Enumerations OWNER TO "IBatisNet";
    -
    -INSERT INTO Enumerations VALUES(1, 1, 1, 128);
    -INSERT INTO Enumerations VALUES(2, 2, 2, 2048);
    -INSERT INTO Enumerations VALUES(3, 3, 4, 256);
    -INSERT INTO Enumerations VALUES(4, 4, 8, null);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/line-item-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/line-item-init.sql
    deleted file mode 100644
    index 8ca7cec..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/line-item-init.sql
    +++ /dev/null
    @@ -1,36 +0,0 @@
    -DROP TABLE LineItems;
    -
    -CREATE TABLE LineItems
    -(
    -  LineItem_Id int4 NOT NULL,
    -  Order_Id int4 NOT NULL,
    -  LineItem_Code varchar(32) NOT NULL,
    -  LineItem_Quantity int4 NOT NULL,
    -  LineItem_Price numeric(18,2),
    -  LineItem_Picture bytea,
    -  CONSTRAINT PK_LineItems PRIMARY KEY (LineItem_Id, Order_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE LineItems OWNER TO "IBatisNet";
    -
    -INSERT INTO LineItems VALUES (1, 10, 'ESM-34', 1, 45.43, null);
    -INSERT INTO LineItems VALUES (2, 10, 'QSM-98', 8, 8.40, null);
    -INSERT INTO LineItems VALUES (1, 9, 'DSM-78', 2, 45.40, null);
    -INSERT INTO LineItems VALUES (2, 9, 'TSM-12', 2, 32.12, null);
    -INSERT INTO LineItems VALUES (1, 8, 'DSM-16', 4, 41.30, null);
    -INSERT INTO LineItems VALUES (2, 8, 'GSM-65', 1, 2.20, null);
    -INSERT INTO LineItems VALUES (1, 7, 'WSM-27', 7, 52.10, null);
    -INSERT INTO LineItems VALUES (2, 7, 'ESM-23', 2, 123.34, null);
    -INSERT INTO LineItems VALUES (1, 6, 'QSM-39', 9, 12.12, null);
    -INSERT INTO LineItems VALUES (2, 6, 'ASM-45', 6, 78.77, null);
    -INSERT INTO LineItems VALUES (1, 5, 'ESM-48', 3, 43.87, null);
    -INSERT INTO LineItems VALUES (2, 5, 'WSM-98', 7, 5.40, null);
    -INSERT INTO LineItems VALUES (1, 4, 'RSM-57', 2, 78.90, null);
    -INSERT INTO LineItems VALUES (2, 4, 'XSM-78', 9, 2.34, null);
    -INSERT INTO LineItems VALUES (1, 3, 'DSM-59', 3, 5.70, null);
    -INSERT INTO LineItems VALUES (2, 3, 'DSM-53', 3, 98.78, null);
    -INSERT INTO LineItems VALUES (1, 2, 'DSM-37', 4, 7.80, null);
    -INSERT INTO LineItems VALUES (2, 2, 'FSM-12', 2, 55.78, null);
    -INSERT INTO LineItems VALUES (1, 1, 'ESM-48', 8, 87.60, null);
    -INSERT INTO LineItems VALUES (2, 1, 'ESM-23', 1, 55.40, null);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/more-account-records.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/more-account-records.sql
    deleted file mode 100644
    index 35e4dac..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/more-account-records.sql
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -INSERT INTO Accounts VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(8,'Ming', 'Li Foo', null), 'Non', 100;
    -INSERT INTO Accounts VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com', 'Oui', 200);
    -INSERT INTO Accounts VALUES(10,'Robert', 'O''Timmins', null, 'Non', 100);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/nullable-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/nullable-init.sql
    deleted file mode 100644
    index 2aff83b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/nullable-init.sql
    +++ /dev/null
    @@ -1,20 +0,0 @@
    -
    -DROP TABLE Nullable;
    -
    -CREATE TABLE Nullable
    -(
    -  Id serial NOT NULL,
    -  TestBool bool,
    -  TestByte int4,
    -  TestChar char(1),
    -  TestDateTime timestamp(0),
    -  TestDecimal numeric(9,2),
    -  TestDouble float8,
    -  TestGuid char(16),
    -  TestInt16 int2,
    -  TestInt32 int4,
    -  TestInt64 int8,
    -  TestSingle float4,
    -  CONSTRAINT PK_Nullable PRIMARY KEY (Id)
    -) WITHOUT OIDS;
    -ALTER TABLE Nullable OWNER TO "IBatisNet";
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/order-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/order-init.sql
    deleted file mode 100644
    index e1df1b8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/order-init.sql
    +++ /dev/null
    @@ -1,32 +0,0 @@
    -DROP TABLE Orders;
    -
    -CREATE TABLE Orders
    -(
    -  Order_Id int4 NOT NULL,
    -  Account_Id int4 NULL,
    -  Order_Date timestamp,
    -  Order_CardType varchar(32),
    -  Order_CardNumber varchar(32),
    -  Order_CardExpiry varchar(32),
    -  Order_Street varchar(32),
    -  Order_City varchar(32),
    -  Order_Province varchar(32),
    -  Order_PostalCode varchar(32),
    -  Order_FavouriteLineItem int4,
    -  CONSTRAINT PK_Orders PRIMARY KEY (Order_Id)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Orders OWNER TO "IBatisNet";
    -
    -INSERT INTO Orders VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',2);
    -INSERT INTO Orders VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',1);
    -INSERT INTO Orders VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2);
    -INSERT INTO Orders VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1);
    -INSERT INTO Orders VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2);
    -INSERT INTO Orders VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1);
    -INSERT INTO Orders VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2);
    -INSERT INTO Orders VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1);
    -INSERT INTO Orders VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2);
    -INSERT INTO Orders VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1);
    -INSERT INTO Orders VALUES (11, null, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY',1);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/other-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/other-init.sql
    deleted file mode 100644
    index dae1352..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/other-init.sql
    +++ /dev/null
    @@ -1,69 +0,0 @@
    -DROP TABLE Others;
    -drop table A;
    -drop table B;
    -drop table C;
    -drop table D;
    -drop table E;
    -drop table F;
    -
    -CREATE TABLE Others
    -(
    -  Other_Int int4,
    -  Other_Long int8,
    -  Other_Bit bool NOT NULL DEFAULT false,
    -  Other_String varchar(32) NOT NULL
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Others OWNER TO "IBatisNet";
    -
    -CREATE TABLE F (
    -	ID varchar(50) NOT NULL ,
    -	F_Libelle varchar(50) NULL
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE F OWNER TO "IBatisNet";
    -
    -CREATE TABLE E (
    -	ID varchar(50) NOT NULL ,
    -	E_Libelle varchar(50) NULL 
    -) WITHOUT OIDS;
    -ALTER TABLE E OWNER TO "IBatisNet";
    -
    -CREATE TABLE D (
    -	ID varchar(50) NOT NULL ,
    -	D_Libelle varchar(50) NULL 
    -) WITHOUT OIDS;
    -ALTER TABLE D OWNER TO "IBatisNet";
    -
    -CREATE TABLE C (
    -	ID varchar(50) NOT NULL ,
    -	C_Libelle varchar(50) NULL 
    -) WITHOUT OIDS;
    -ALTER TABLE C OWNER TO "IBatisNet";
    -
    -CREATE TABLE B (
    -	ID varchar(50) NOT NULL ,
    -	C_ID varchar(50) NULL ,
    -	D_ID varchar(50) NULL ,
    -	B_Libelle varchar(50) NULL
    -) WITHOUT OIDS;
    -ALTER TABLE B OWNER TO "IBatisNet";
    -
    -CREATE TABLE A (
    -	Id varchar(50)  NOT NULL ,
    -	B_ID varchar(50)  NULL ,
    -	E_ID varchar(50)  NULL ,
    -	F_ID varchar(50)  NULL ,
    -	A_Libelle varchar(50)  NULL
    -) WITHOUT OIDS;
    -ALTER TABLE A OWNER TO "IBatisNet";
    -
    -INSERT INTO Others VALUES(1, 8888888, false, 'Oui');
    -INSERT INTO Others VALUES(2, 9999999999, true, 'Non');
    -
    -INSERT INTO F VALUES('f', 'fff');
    -INSERT INTO E VALUES('e', 'eee');
    -INSERT INTO D VALUES('d', 'ddd');
    -INSERT INTO C VALUES('c', 'ccc');
    -INSERT INTO B VALUES('b', 'c', null, 'bbb');
    -INSERT INTO A VALUES('a', 'b', 'e', null, 'aaa');
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/simple-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/simple-init.sql
    deleted file mode 100644
    index c592eb1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/simple-init.sql
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -drop table Simples;
    -
    -create table Simples
    -(
    -   ID int4 not null,
    -   Name varchar(64) NULL,
    -   Address varchar(64) NULL,
    -   Count int4 NULL,
    -   Date timestamp NULL,
    -   Pay numeric(18,2) NULL,   
    -  CONSTRAINT PK_Simples PRIMARY KEY (ID)
    -) WITHOUT OIDS;
    -ALTER TABLE Simples OWNER TO "IBatisNet";
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/swap-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/swap-procedure.sql
    deleted file mode 100644
    index 7489acc..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/swap-procedure.sql
    +++ /dev/null
    @@ -1 +0,0 @@
    ---
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/teardown.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/teardown.sql
    deleted file mode 100644
    index e69de29..0000000
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/user-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/user-init.sql
    deleted file mode 100644
    index f34772c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/PostgreSQL/user-init.sql
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -DROP TABLE Users;
    -
    -CREATE TABLE Users
    -(
    -  LogonId varchar(20) NOT NULL DEFAULT '0'::character varying,
    -  Name varchar(40),
    -  Password varchar(20),
    -  EmailAddress varchar(40),
    -  LastLogon date,
    -  CONSTRAINT PK_Users PRIMARY KEY (LogonId)
    -) 
    -WITHOUT OIDS;
    -ALTER TABLE Users OWNER TO "NHibernate";
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DBCreation.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DBCreation.sql
    deleted file mode 100644
    index c5ed951..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DBCreation.sql
    +++ /dev/null
    @@ -1,89 +0,0 @@
    --- MSQL DATABASE
    -
    -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet')
    -	DROP DATABASE [IBatisNet]
    -GO
    -
    -CREATE DATABASE [IBatisNet] 
    - COLLATE Latin1_General_CI_AS
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoclose', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'trunc. log', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'torn page detection', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'read only', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'dbo use', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'single', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoshrink', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true'
    -GO
    -
    -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) )
    -	exec sp_dboption N'IBatisNet', N'db chaining', N'false'
    -GO
    -
    -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -	exec sp_droplogin N'IBatisNet'
    -GO
    -
    -use [IBatisNet]
    -GO
    -
    -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -BEGIN
    -	declare @logindb nvarchar(132),  @loginpass nvarchar(132), @loginlang nvarchar(132) 
    -	select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english'
    -	exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang
    -END
    -GO
    -
    -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382)
    -	EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet'
    -GO
    -
    -exec sp_addrolemember N'db_owner', N'IBatisNet'
    -GO
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DataBase.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DataBase.sql
    deleted file mode 100644
    index 733e2f9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/DataBase.sql
    +++ /dev/null
    @@ -1,179 +0,0 @@
    --- MSQL DATABASE 'IBatisNet'
    -
    -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'IBatisNet')
    -	DROP DATABASE [IBatisNet]
    -GO
    -
    -CREATE DATABASE [IBatisNet] 
    - COLLATE Latin1_General_CI_AS
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoclose', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'bulkcopy', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'trunc. log', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'torn page detection', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'read only', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'dbo use', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'single', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'autoshrink', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI null default', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'recursive triggers', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI nulls', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'concat null yields null', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'cursor close on commit', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'default to local cursor', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'quoted identifier', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'ANSI warnings', N'false'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto create statistics', N'true'
    -GO
    -
    -exec sp_dboption N'IBatisNet', N'auto update statistics', N'true'
    -GO
    -
    -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) )
    -	exec sp_dboption N'IBatisNet', N'db chaining', N'false'
    -GO
    -
    -if exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -	exec sp_droplogin N'IBatisNet'
    -GO
    -
    -use [IBatisNet]
    -GO
    -
    -if not exists (select * from master.dbo.syslogins where loginname = N'IBatisNet')
    -BEGIN
    -	declare @logindb nvarchar(132),  @loginpass nvarchar(132), @loginlang nvarchar(132) 
    -	select @logindb = N'IBatisNet', @loginpass=N'test', @loginlang = N'us_english'
    -	exec sp_addlogin N'IBatisNet', @loginpass, @logindb, @loginlang
    -END
    -GO
    -
    -if not exists (select * from dbo.sysusers where name = N'IBatisNet' and uid < 16382)
    -	EXEC sp_grantdbaccess N'IBatisNet', N'IBatisNet'
    -GO
    -
    -exec sp_addrolemember N'db_owner', N'IBatisNet'
    -GO
    -
    --- MSQL DATABASE 'NHibernate'
    -
    -IF EXISTS (SELECT name FROM master.dbo.sysdatabases WHERE name = N'NHibernate')
    -	DROP DATABASE [NHibernate]
    -GO
    -
    -CREATE DATABASE [NHibernate] 
    - COLLATE Latin1_General_CI_AS
    -GO
    -
    -exec sp_dboption N'NHibernate', N'autoclose', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'bulkcopy', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'trunc. log', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'torn page detection', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'read only', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'dbo use', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'single', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'autoshrink', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'ANSI null default', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'recursive triggers', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'ANSI nulls', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'concat null yields null', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'cursor close on commit', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'default to local cursor', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'quoted identifier', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'ANSI warnings', N'false'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'auto create statistics', N'true'
    -GO
    -
    -exec sp_dboption N'NHibernate', N'auto update statistics', N'true'
    -GO
    -
    -if( ( (@@microsoftversion / power(2, 24) = 8) and (@@microsoftversion & 0xffff >= 724) ) or ( (@@microsoftversion / power(2, 24) = 7) and (@@microsoftversion & 0xffff >= 1082) ) )
    -	exec sp_dboption N'NHibernate', N'db chaining', N'false'
    -GO
    -
    -if exists (select * from master.dbo.syslogins where loginname = N'NHibernate')
    -	exec sp_droplogin N'NHibernate'
    -GO
    -
    -use [NHibernate]
    -GO
    -
    -if not exists (select * from master.dbo.syslogins where loginname = N'NHibernate')
    -BEGIN
    -	declare @logindb nvarchar(132),  @loginpass nvarchar(132), @loginlang nvarchar(132) 
    -	select @logindb = N'NHibernate', @loginpass=N'test', @loginlang = N'us_english'
    -	exec sp_addlogin N'NHibernate', @loginpass, @logindb, @loginlang
    -END
    -GO
    -
    -if not exists (select * from dbo.sysusers where name = N'NHibernate' and uid < 16382)
    -	EXEC sp_grantdbaccess N'NHibernate', N'NHibernate'
    -GO
    -
    -exec sp_addrolemember N'db_owner', N'NHibernate'
    -GO
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/Nullable-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/Nullable-init.sql
    deleted file mode 100644
    index 6e083de..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/Nullable-init.sql
    +++ /dev/null
    @@ -1,26 +0,0 @@
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Nullable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Nullable]
    -END
    -
    -CREATE TABLE [dbo].[Nullable] (
    -	[Id] [int] IDENTITY (1, 1) NOT NULL ,
    -	[TestBool] [Bit] NULL ,
    -	[TestByte] [tinyint] NULL ,
    -	[TestChar] [char] NULL ,
    -	[TestDateTime] [datetime] NULL ,
    -	[TestDecimal] decimal(9,2) NULL ,
    -	[TestDouble] [float] NULL ,
    -	[TestGuid] [UniqueIdentifier] NULL ,
    -	[TestInt16] [SmallInt] NULL ,
    -	[TestInt32] [int] NULL ,
    -	[TestInt64] [bigint] NULL ,
    -	[TestSingle] [real] NULL ,
    -	[TestTimeSpan] [bigint] NULL,
    -	CONSTRAINT [PK_Nullable] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Id]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/README-embed-param.txt b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/README-embed-param.txt
    deleted file mode 100644
    index 355ebf4..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/README-embed-param.txt
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -Technique for creating large sample test data from:
    -
    -http://www.sql-server-performance.com/jc_large_data_operations.asp
    -
    -Make sure you have enough space and have either enough processing power or 
    -enough patience to run the Embed Parameters in Statement tests.
    -
    -Run embed-parameters-setup-init.sql prior to running tests.
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-init.sql
    deleted file mode 100644
    index 28f8df9..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-init.sql
    +++ /dev/null
    @@ -1,13 +0,0 @@
    -CREATE TABLE IF NOT EXISTS Accounts(
    -	[Account_ID] [int] NOT NULL ,
    -	[Account_FirstName] [varchar] (32)  NOT NULL ,
    -	[Account_LastName] [varchar] (32)  NOT NULL ,
    -	[Account_Email] [varchar] (128)  NULL,
    -	[Account_Banner_Option]  [varchar] (255),
    -	[Account_Cart_Option] [int]);
    -
    -INSERT INTO [Accounts] VALUES(1,'Joe', 'Dalton', 'Joe.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO [Accounts] VALUES(2,'Averel', 'Dalton', 'Averel.Dalton@somewhere.com', 'Oui', 200);
    -INSERT INTO [Accounts] VALUES(3,'William', 'Dalton', null, 'Non', 100);
    -INSERT INTO [Accounts] VALUES(4,'Jack', 'Dalton', 'Jack.Dalton@somewhere.com', 'Non', 100);
    -INSERT INTO [Accounts] VALUES(5,'Gilles', 'Bayon', 'gilles.bayon@nospam.org', 'Oui', 100);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-procedure.sql
    deleted file mode 100644
    index fb06a0a..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/account-procedure.sql
    +++ /dev/null
    @@ -1 +0,0 @@
    ---do nothing for sqlite3
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-init.sql
    deleted file mode 100644
    index 0bc278b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-init.sql
    +++ /dev/null
    @@ -1,6 +0,0 @@
    -DROP TABLE Categories;
    -
    -CREATE TABLE IF NOT EXISTS Categories(
    -	[Category_Id] INTEGER PRIMARY KEY NOT NULL,
    -	[Category_Name] [varchar] (32)  NULL,
    -	[Category_Guid] [uniqueidentifier] NULL);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedure.sql
    deleted file mode 100644
    index 778d92e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedure.sql
    +++ /dev/null
    @@ -1,10 +0,0 @@
    ---CREATE PROCEDURE dbo.[ps_InsertCategorie]
    ---@Category_Id [int] output,
    ---@Category_Name [varchar] (32),
    ---@Category_Guid [uniqueidentifier] 
    ---AS
    ---insert into Categories  
    ---			(Category_Name, Category_Guid ) 
    ---values 
    ---			(@Category_Name, @Category_Guid)
    ---SELECT @Category_Id = SCOPE_IDENTITY()
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedureWithReturn.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedureWithReturn.sql
    deleted file mode 100644
    index bb1852e..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/category-procedureWithReturn.sql
    +++ /dev/null
    @@ -1,12 +0,0 @@
    ---CREATE PROCEDURE dbo.[ps_InsertCategorieWithReturnValue]
    ---@Category_Id [int] output,
    ---@Category_Name [varchar] (32),
    ---@Category_Guid [uniqueidentifier] 
    ---AS
    ---insert into Categories  
    ---			(Category_Name, Category_Guid ) 
    ---values 
    ---			(@Category_Name, @Category_Guid)
    ---set @Category_Id = SCOPE_IDENTITY()
    ---return @Category_Id
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/child-parent-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/child-parent-init.sql
    deleted file mode 100644
    index 53b0ca5..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/child-parent-init.sql
    +++ /dev/null
    @@ -1,33 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Child]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -begin
    -drop table [dbo].[Child]
    -end
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Parent]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -begin
    -drop table [dbo].[Parent]
    -end
    -
    -CREATE TABLE [dbo].[Child] (
    -	[Id] [int] IDENTITY (1, 1) NOT NULL ,
    -	[ParentId] [int] NOT NULL ,
    -	[Description] [varchar] (100) NOT NULL ,
    -	[RowVersion] [timestamp] NOT NULL 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[Parent] (
    -	[Id] [int] IDENTITY (1, 1) NOT NULL ,
    -	[Description] [varchar] (100) NOT NULL ,
    -	[RowVersion] [timestamp] NOT NULL 
    -) ON [PRIMARY]
    -
    --- Creating Test Data
    -insert into Parent ([Description]) values ('Parent 1')
    -insert into Parent ([Description]) values ('Parent 2')
    -
    -insert into Child ([ParentId], [Description]) values (1, 'Child 1')
    -insert into Child ([ParentId], [Description]) values (1, 'Child 2')
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/coupons-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/coupons-init.sql
    deleted file mode 100644
    index 8ac95c1..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/coupons-init.sql
    +++ /dev/null
    @@ -1,42 +0,0 @@
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Coupons]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Coupons]
    -END
    -CREATE TABLE [dbo].[Coupons] (
    -	[Coupon_ID] [int] NOT NULL ,
    -	[Coupon_Code] [varchar] (32)  NOT NULL 
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Coupons] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Coupons] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Coupon_ID]
    -	)  ON [PRIMARY] 
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Coupons] VALUES(1,'AAA' );
    -INSERT INTO [dbo].[Coupons] VALUES(2,'BBB');
    -INSERT INTO [dbo].[Coupons] VALUES(3,'CCC');
    -INSERT INTO [dbo].[Coupons] VALUES(4,'DDD');
    -INSERT INTO [dbo].[Coupons] VALUES(5,'EEE');
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Coupons_Brands]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Coupons_Brands]
    -END
    -CREATE TABLE [dbo].[Coupons_Brands] (
    -	[Coupon_ID] [int] NOT NULL ,
    -	[Brand_Id] [int] NOT NULL 
    -) ON [PRIMARY]
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(1,1 );
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(1,2);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(1,3);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(2,4);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(2,5);
    -INSERT INTO [dbo].[Coupons_Brands] VALUES(5,6);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/documents-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/documents-init.sql
    deleted file mode 100644
    index e01aaa0..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/documents-init.sql
    +++ /dev/null
    @@ -1,35 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Documents]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders
    -
    -	drop table [dbo].[Documents]
    -END
    -
    -CREATE TABLE [dbo].[Documents] (
    -	[Document_ID] [int] NOT NULL ,
    -	[Document_Title] [varchar] (32) NULL ,
    -	[Document_Type] [varchar] (32)  NULL ,
    -	[Document_PageNumber] [int] NULL  ,
    -	[Document_City] [varchar] (32)  NULL,
    -	[Account_Id] int null
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Documents] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Documents] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Document_ID]
    -	)  ON [PRIMARY] 
    -
    --- Creating Test Data 
    -
    -INSERT INTO [dbo].[Documents] VALUES (1, 'The World of Null-A', 'Book', 55, null, 5);
    -INSERT INTO [dbo].[Documents] VALUES (2, 'Le Progres de Lyon', 'Newspaper', null , 'Lyon', 2);
    -INSERT INTO [dbo].[Documents] VALUES (3, 'Lord of the Rings', 'Book', 3587, null, 3);
    -INSERT INTO [dbo].[Documents] VALUES (4, 'Le Canard enchaine', 'Tabloid', null , 'Paris', 2);
    -INSERT INTO [dbo].[Documents] VALUES (5, 'Le Monde', 'Broadsheet', null , 'Paris', 5);
    -INSERT INTO [dbo].[Documents] VALUES (6, 'Foundation', 'Monograph', 557, null, 6);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-setup-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-setup-init.sql
    deleted file mode 100644
    index de2c3f7..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-setup-init.sql
    +++ /dev/null
    @@ -1,94 +0,0 @@
    --- Technique for creating large sample test data from
    --- http://www.sql-server-performance.com/jc_large_data_operations.asp
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecords]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ManyRecords]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecordsTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ManyRecordsTest]
    -
    -
    -
    --- Create Data Storage Table
    -CREATE TABLE [dbo].[ManyRecords] (
    -	[Many_FirstID] [int] NOT NULL,
    -	[Many_SecondID] [int] NOT NULL,
    -	[Many_ThirdID] [int] NOT NULL,
    -	[Many_FourthID] [int] NOT NULL,
    -	[Many_FifthID] [int] NOT NULL,
    -	[Many_SequenceID] [int] NOT NULL,
    -	[Many_DistributedID] [int] NOT NULL,
    -	[Many_SampleCharValue] [char] (10) NOT NULL,
    -	[Many_SampleDecimal] [decimal] (9,4) NOT NULL,
    -	[Many_SampleMoney] [money] NOT NULL,
    -	[Many_SampleDate] [datetime] NOT NULL,
    -	[Many_SequenceDate] [datetime] NOT NULL )
    -ON [PRIMARY]             
    -
    -
    -
    --- Create Sample Data of 1 million records (increase if needed)
    -BEGIN TRANSACTION
    -	DECLARE @intIndex int, @rowCount int, @seqCount int, @distValue int
    -	SELECT @intIndex = 1, @rowCount = 1000000, @seqCount = 10000
    -	SELECT @distValue = @rowCount/10000
    -
    -	WHILE @intIndex <= @rowCount
    -	BEGIN
    -	INSERT INTO [dbo].[ManyRecords] (
    -		[Many_FirstID], 
    -		[Many_SecondID], 
    -		[Many_ThirdID], 
    -		[Many_FourthID],  
    -		[Many_FifthID],  
    -		[Many_SequenceID],  
    -		[Many_DistributedID], 
    -		[Many_SampleCharValue],  
    -		[Many_SampleDecimal], 
    -		[Many_SampleMoney], 
    -		[Many_SampleDate], 
    -		[Many_SequenceDate] )
    -	VALUES ( 
    -		@intIndex, -- First
    -		@intIndex/2, -- Second
    -		@intIndex/4, -- Third
    -		@intIndex/10, -- Fourth
    -		@intIndex/20, -- Fifth
    -		(@intIndex-1)/@seqCount + 1, -- Sequential value
    -		(@intIndex-1)%(@distValue) + 1,  -- Distributed value
    -		CHAR(65 + 26*rand())+CHAR(65 + 26*rand())+CHAR(65 + 26*rand())+CONVERT(char(6),CONVERT(int,100000*(9.0*rand()+1.0)))+CHAR(65 + 26*rand()), -- Char Value
    -		10000*rand(), -- Decimal value
    -		10000*rand(), -- Money value
    -		DATEADD(hour,100000*rand(),'1990-01-01'), -- Date value
    -		DATEADD(hour,@intIndex/5,'1990-01-01') ) -- Sequential date value
    -
    -	SET @intIndex = @intIndex + 1
    -	END
    -COMMIT TRANSACTION
    -
    -
    -
    --- Create Test table using storage table sample data
    -SELECT 
    -	[Many_FirstID], 
    -	[Many_SecondID], 
    -	[Many_ThirdID], 
    -	[Many_FourthID],  
    -	[Many_FifthID],  
    -	[Many_SequenceID],  
    -	[Many_DistributedID], 
    -	[Many_SampleCharValue],  
    -	[Many_SampleDecimal], 
    -	[Many_SampleMoney], 
    -	[Many_SampleDate], 
    -	[Many_SequenceDate]
    -INTO [dbo].[ManyRecordsTest]
    -FROM [dbo].[ManyRecords]
    -
    -
    -
    --- Create Test table indexes
    -CREATE INDEX [IDX_ManyRecordsTest_Seq] ON [dbo].[ManyRecordsTest] ([Many_SequenceID])  WITH SORT_IN_TEMPDB
    -CREATE INDEX [IDX_ManyRecordsTest_Dist] ON [dbo].[ManyRecordsTest] ([Many_DistributedID]) WITH SORT_IN_TEMPDB
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-test-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-test-init.sql
    deleted file mode 100644
    index 17affd8..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/embed-param-test-init.sql
    +++ /dev/null
    @@ -1,32 +0,0 @@
    --- Technique for creating large sample test data from
    --- http://www.sql-server-performance.com/jc_large_data_operations.asp
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ManyRecordsTest]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ManyRecordsTest]
    -
    -
    -
    --- Create Test table using storage table sample data
    -SELECT 
    -	[Many_FirstID], 
    -	[Many_SecondID], 
    -	[Many_ThirdID], 
    -	[Many_FourthID],  
    -	[Many_FifthID],  
    -	[Many_SequenceID],  
    -	[Many_DistributedID], 
    -	[Many_SampleCharValue],  
    -	[Many_SampleDecimal], 
    -	[Many_SampleMoney], 
    -	[Many_SampleDate], 
    -	[Many_SequenceDate]
    -INTO [dbo].[ManyRecordsTest]
    -FROM [dbo].[ManyRecords]
    -
    -
    -
    --- Create Test table indexes
    -CREATE INDEX [IDX_ManyRecordsTest_Seq] ON [dbo].[ManyRecordsTest] ([Many_SequenceID])  WITH SORT_IN_TEMPDB
    -CREATE INDEX [IDX_ManyRecordsTest_Dist] ON [dbo].[ManyRecordsTest] ([Many_DistributedID]) WITH SORT_IN_TEMPDB
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/enumeration-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/enumeration-init.sql
    deleted file mode 100644
    index 96f4ac7..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/enumeration-init.sql
    +++ /dev/null
    @@ -1,31 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Enumerations]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Enumerations]
    -END
    -
    -CREATE TABLE [dbo].[Enumerations] (
    -	[Enum_ID] [int] NOT NULL ,
    -	[Enum_Day] [int] NOT NULL ,
    -	[Enum_Color] [int] NOT NULL,
    -	[Enum_Month] [int] NULL,
    -	[Enum_SearchProfile] [varchar](1) NULL
    -) ON [PRIMARY]
    -
    -ALTER TABLE [dbo].[Enumerations] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Enum] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Enum_ID]
    -	)  ON [PRIMARY] 
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Enumerations] VALUES(1, 1, 1, 128, 'T');
    -INSERT INTO [dbo].[Enumerations] VALUES(2, 2, 2, 2048, 'P');
    -INSERT INTO [dbo].[Enumerations] VALUES(3, 3, 4, 256, 'P');
    -INSERT INTO [dbo].[Enumerations] VALUES(4, 4, 8, null, 'P');
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-init.sql
    deleted file mode 100644
    index 83ec22c..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-init.sql
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -
    -INSERT INTO [Users]([UserId], [UserName], [AddressId])
    -VALUES(1,'user1',null)
    -INSERT INTO [Users]([UserId], [UserName], [AddressId])
    -VALUES(14,'user14',null)
    -
    -INSERT INTO [Roles ]([RoleId], [RoleName])
    -VALUES(1,'Admin');
    -INSERT INTO [Roles ]([RoleId], [RoleName])
    -VALUES(2,'User');
    -
    -INSERT INTO [Applications]([ApplicationId], [ApplicationName], [DefaultRoleId])
    -VALUES(1, 'Application Manager', 1);
    -
    -INSERT INTO [ApplicationUserRoles]([ApplicationId], [UserId], [RoleId])
    -VALUES(1,1,2);
    -INSERT INTO [ApplicationUserRoles]([ApplicationId], [UserId], [RoleId])
    -VALUES(1,14,1);
    -INSERT INTO [ApplicationUserRoles]([ApplicationId], [UserId], [RoleId])
    -VALUES(1,14,2);
    -
    -INSERT INTO [ApplicationUsers]([ApplicationId], [UserId], [ActiveFlag])
    -VALUES(1,1,1);
    -INSERT INTO [ApplicationUsers]([ApplicationId], [UserId], [ActiveFlag])
    -VALUES(1,14,1);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-schema.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-schema.sql
    deleted file mode 100644
    index dcbc354..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/groupby-schema.sql
    +++ /dev/null
    @@ -1,174 +0,0 @@
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_User_Address]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[Users] DROP CONSTRAINT FK_User_Address
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUserRoles_Application]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUserRoles] DROP CONSTRAINT FK_ApplicationUserRoles_Application
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUsers_Application]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUsers] DROP CONSTRAINT FK_ApplicationUsers_Application
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Application_Role]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[Applications] DROP CONSTRAINT FK_Application_Role
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUserRoles_Role]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUserRoles] DROP CONSTRAINT FK_ApplicationUserRoles_Role
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUserRoles_User]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUserRoles] DROP CONSTRAINT FK_ApplicationUserRoles_User
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_ApplicationUsers_User]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -ALTER TABLE [dbo].[ApplicationUsers] DROP CONSTRAINT FK_ApplicationUsers_User
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Addresses]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Addresses]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ApplicationUserRoles]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ApplicationUserRoles]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[ApplicationUsers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[ApplicationUsers]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Applications]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Applications]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Roles ]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Roles ]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Users]
    -
    -
    -CREATE TABLE [dbo].[Addresses] (
    -	[AddressId] [int] NOT NULL ,
    -	[Street] [varchar] (50) COLLATE Latin1_General_CI_AS NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[ApplicationUserRoles] (
    -	[ApplicationId] [int] NULL ,
    -	[UserId] [int] NULL ,
    -	[RoleId] [int] NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[ApplicationUsers] (
    -	[ApplicationId] [int] NULL ,
    -	[UserId] [int] NULL ,
    -	[ActiveFlag] [bit] NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[Applications] (
    -	[ApplicationId] [int] NOT NULL ,
    -	[ApplicationName] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
    -	[DefaultRoleId] [int] NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[Roles ] (
    -	[RoleId] [int] NOT NULL ,
    -	[RoleName] [varchar] (50) COLLATE Latin1_General_CI_AS NULL 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[Users] (
    -	[UserId] [int] NOT NULL ,
    -	[UserName] [varchar] (50) COLLATE Latin1_General_CI_AS NULL ,
    -	[AddressId] [int] NULL 
    -) ON [PRIMARY]
    -
    -
    -ALTER TABLE [dbo].[Addresses] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Address] PRIMARY KEY  CLUSTERED 
    -	(
    -		[AddressId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[Applications] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Application] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ApplicationId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[Roles ] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_Role] PRIMARY KEY  CLUSTERED 
    -	(
    -		[RoleId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[Users] WITH NOCHECK ADD 
    -	CONSTRAINT [PK_User] PRIMARY KEY  CLUSTERED 
    -	(
    -		[UserId]
    -	)  ON [PRIMARY] 
    -
    -
    -ALTER TABLE [dbo].[ApplicationUserRoles] ADD 
    -	CONSTRAINT [FK_ApplicationUserRoles_Application] FOREIGN KEY 
    -	(
    -		[ApplicationId]
    -	) REFERENCES [dbo].[Applications] (
    -		[ApplicationId]
    -	),
    -	CONSTRAINT [FK_ApplicationUserRoles_Role] FOREIGN KEY 
    -	(
    -		[RoleId]
    -	) REFERENCES [dbo].[Roles ] (
    -		[RoleId]
    -	),
    -	CONSTRAINT [FK_ApplicationUserRoles_User] FOREIGN KEY 
    -	(
    -		[UserId]
    -	) REFERENCES [dbo].[Users] (
    -		[UserId]
    -	)
    -
    -
    -ALTER TABLE [dbo].[ApplicationUsers] ADD 
    -	CONSTRAINT [FK_ApplicationUsers_Application] FOREIGN KEY 
    -	(
    -		[ApplicationId]
    -	) REFERENCES [dbo].[Applications] (
    -		[ApplicationId]
    -	),
    -	CONSTRAINT [FK_ApplicationUsers_User] FOREIGN KEY 
    -	(
    -		[UserId]
    -	) REFERENCES [dbo].[Users] (
    -		[UserId]
    -	)
    -
    -
    -ALTER TABLE [dbo].[Applications] ADD 
    -	CONSTRAINT [FK_Application_Role] FOREIGN KEY 
    -	(
    -		[DefaultRoleId]
    -	) REFERENCES [dbo].[Roles ] (
    -		[RoleId]
    -	)
    -
    -
    -ALTER TABLE [dbo].[Users] ADD 
    -	CONSTRAINT [FK_User_Address] FOREIGN KEY 
    -	(
    -		[AddressId]
    -	) REFERENCES [dbo].[Addresses] (
    -		[AddressId]
    -	)
    -
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/line-item-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/line-item-init.sql
    deleted file mode 100644
    index 62d7db6..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/line-item-init.sql
    +++ /dev/null
    @@ -1,29 +0,0 @@
    -CREATE TABLE IF NOT EXISTS LineItems(
    -[LineItem_ID] [int] NOT NULL ,
    -	[Order_ID] [int] NOT NULL ,
    -	[LineItem_Code] [varchar] (32) NOT NULL ,
    -	[LineItem_Quantity] [int] NOT NULL ,
    -	[LineItem_Price] [decimal](18, 2) NULL,
    -	[LineItem_Picture] [image] null
    -);
    -
    -INSERT INTO [LineItems] VALUES (1, 1, 'ESM-34', 1, 45.43, null);
    -INSERT INTO [LineItems] VALUES (2, 10, 'QSM-98', 8, 8.40, null);
    -INSERT INTO [LineItems] VALUES (3, 9, 'DSM-78', 2, 45.40, null);
    -INSERT INTO [LineItems] VALUES (4, 9, 'TSM-12', 2, 32.12, null);
    -INSERT INTO [LineItems] VALUES (5, 8, 'DSM-16', 4, 41.30, null);
    -INSERT INTO [LineItems] VALUES (6, 8, 'GSM-65', 1, 2.20, null);
    -INSERT INTO [LineItems] VALUES (7, 7, 'WSM-27', 7, 52.10, null);
    -INSERT INTO [LineItems] VALUES (8, 7, 'ESM-23', 2, 123.34, null);
    -INSERT INTO [LineItems] VALUES (9, 6, 'QSM-39', 9, 12.12, null);
    -INSERT INTO [LineItems] VALUES (10, 6, 'ASM-45', 6, 78.77, null);
    -INSERT INTO [LineItems] VALUES (11, 5, 'ESM-48', 3, 43.87, null);
    -INSERT INTO [LineItems] VALUES (12, 5, 'WSM-98', 7, 5.40, null);
    -INSERT INTO [LineItems] VALUES (13, 4, 'RSM-57', 2, 78.90, null);
    -INSERT INTO [LineItems] VALUES (14, 4, 'XSM-78', 9, 2.34, null);
    -INSERT INTO [LineItems] VALUES (15, 3, 'DSM-59', 3, 5.70, null);
    -INSERT INTO [LineItems] VALUES (16, 3, 'DSM-53', 3, 98.78, null);
    -INSERT INTO [LineItems] VALUES (17, 2, 'DSM-37', 4, 7.80, null);
    -INSERT INTO [LineItems] VALUES (18, 2, 'FSM-12', 2, 55.78, null);
    -INSERT INTO [LineItems] VALUES (19, 1, 'ESM-48', 8, 87.60, null);
    -INSERT INTO [LineItems] VALUES (20, 1, 'ESM-23', 1, 55.40, null);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/more-account-records.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/more-account-records.sql
    deleted file mode 100644
    index d4b2199..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/more-account-records.sql
    +++ /dev/null
    @@ -1,11 +0,0 @@
    -
    -
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Accounts] VALUES(6,'Jane', 'Calamity', 'Jane.Calamity@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(7,'Lucky', 'Luke', 'Lucky.Luke@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(8,'Ming', 'Li Foo', null, 'Non', 100);
    -INSERT INTO [dbo].[Accounts] VALUES(9,'O''Hara', 'Steve', 'Jack.OHara@somewhere.com', 'Oui', 200);
    -INSERT INTO [dbo].[Accounts] VALUES(10,'Robert', 'O''Timmins', null, 'Non', 100);
    -
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/order-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/order-init.sql
    deleted file mode 100644
    index 72f0846..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/order-init.sql
    +++ /dev/null
    @@ -1,25 +0,0 @@
    -CREATE TABLE IF NOT EXISTS Orders(
    -	[Order_ID] [int] NOT NULL ,
    -	[Account_ID] [int] NULL ,
    -	[Order_Date] [datetime] NULL ,
    -	[Order_CardType] [varchar] (32) NULL ,
    -	[Order_CardNumber] [varchar] (32)  NULL ,
    -	[Order_CardExpiry] [varchar] (32)  NULL ,
    -	[Order_Street] [varchar] (32)  NULL ,
    -	[Order_City] [varchar] (32)  NULL ,
    -	[Order_Province] [varchar] (32)  NULL ,
    -	[Order_PostalCode] [varchar] (32)  NULL ,
    -	[Order_FavouriteLineItem] [int] NULL
    -);
    -
    -INSERT INTO [Orders] VALUES (1, 1, '2003-02-15 8:15:00', 'VISA', '999999999999', '05/03', '11 This Street', 'Victoria', 'BC', 'C4B 4F4',1);
    -INSERT INTO [Orders] VALUES (2, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '06/03', '222 That Street', 'Edmonton', 'AB', 'X4K 5Y4',17);
    -INSERT INTO [Orders] VALUES (3, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '07/03', '333 Other Street', 'Regina', 'SK', 'Z4U 6Y4',2);
    -INSERT INTO [Orders] VALUES (4, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '08/03', '444 His Street', 'Toronto', 'ON', 'K4U 3S4',1);
    -INSERT INTO [Orders] VALUES (5, 5, '2003-02-15 8:15:00', 'VISA', '555555555555', '09/03', '555 Her Street', 'Calgary', 'AB', 'J4J 7S4',2);
    -INSERT INTO [Orders] VALUES (6, 5, '2003-02-15 8:15:00', 'VISA', '999999999999', '10/03', '6 Their Street', 'Victoria', 'BC', 'T4H 9G4',1);
    -INSERT INTO [Orders] VALUES (7, 4, '2003-02-15 8:15:00', 'MC', '888888888888', '11/03', '77 Lucky Street', 'Edmonton', 'AB', 'R4A 0Z4',2);
    -INSERT INTO [Orders] VALUES (8, 3, '2003-02-15 8:15:00', 'AMEX', '777777777777', '12/03', '888 Our Street', 'Regina', 'SK', 'S4S 7G4',1);
    -INSERT INTO [Orders] VALUES (9, 2, '2003-02-15 8:15:00', 'MC', '666666666666', '01/04', '999 Your Street', 'Toronto', 'ON', 'G4D 9F4',2);
    -INSERT INTO [Orders] VALUES (10, 1, '2003-02-15 8:15:00', 'VISA', '555555555555', '02/04', '99 Some Street', 'Calgary', 'AB', 'W4G 7A4',1);
    -INSERT INTO [Orders] VALUES (11, null, '2003-02-17 8:15:00', 'VISA', '555555555555', '02/04', 'Null order', 'Calgary', 'ZZ', 'XXX YYY',1);
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/other-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/other-init.sql
    deleted file mode 100644
    index 93ad520..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/other-init.sql
    +++ /dev/null
    @@ -1,145 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Others]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Others]
    -END
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[A]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[A]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[B]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[B]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[C]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[C]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[D]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[D]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[E]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[E]
    -END
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[F]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[F]
    -END
    -
    -
    -CREATE TABLE [dbo].[Others] (
    -	[Other_Int] [int]  NULL ,
    -	[Other_Long] [BigInt] NULL,
    -	[Other_Bit] [Bit] NOT NULL DEFAULT (0), 
    -	[Other_String] [varchar] (32) NOT NULL
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[F] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[F_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_F] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[E] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[E_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_E] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[D] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[D_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_D] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -CREATE TABLE [dbo].[C] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[C_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_C] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] 
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[B] (
    -	[ID] [varchar] (50) NOT NULL ,
    -	[C_ID] [varchar] (50) NULL ,
    -	[D_ID] [varchar] (50) NULL ,
    -	[B_Libelle] [varchar] (50) NULL ,
    -	CONSTRAINT [PK_B] PRIMARY KEY  CLUSTERED 
    -	(
    -		[ID]
    -	)  ON [PRIMARY] ,
    -	CONSTRAINT [FK_B_C] FOREIGN KEY 
    -	(
    -		[C_ID]
    -	) REFERENCES [C] (
    -		[ID]
    -	),
    -	CONSTRAINT [FK_B_D] FOREIGN KEY 
    -	(
    -		[D_ID]
    -	) REFERENCES [D] (
    -		[ID]
    -	)
    -) ON [PRIMARY]
    -
    -
    -CREATE TABLE [dbo].[A] (
    -	[Id] [varchar] (50)  NOT NULL ,
    -	[B_ID] [varchar] (50)  NULL ,
    -	[E_ID] [varchar] (50)  NULL ,
    -	[F_ID] [varchar] (50)  NULL ,
    -	[A_Libelle] [varchar] (50)  NULL
    -	CONSTRAINT [PK_A] PRIMARY KEY  CLUSTERED 
    -	(
    -		[Id]
    -	)  ON [PRIMARY] ,
    -	CONSTRAINT [FK_A_B] FOREIGN KEY 
    -	(
    -		[B_ID]
    -	) REFERENCES [B] (
    -		[ID]
    -	),
    -	CONSTRAINT [FK_A_E] FOREIGN KEY 
    -	(
    -		[E_ID]
    -	) REFERENCES [E] (
    -		[ID]
    -	),
    -	CONSTRAINT [FK_A_F] FOREIGN KEY 
    -	(
    -		[F_ID]
    -	) REFERENCES [F] (
    -		[ID]
    -	)
    -) ON [PRIMARY]
    -
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Others] VALUES(1, 8888888, 0, 'Oui');
    -INSERT INTO [dbo].[Others] VALUES(2, 9999999999, 1, 'Non');
    -
    -INSERT INTO [dbo].[F] VALUES('f', 'fff');
    -INSERT INTO [dbo].[E] VALUES('e', 'eee');
    -INSERT INTO [dbo].[D] VALUES('d', 'ddd');
    -INSERT INTO [dbo].[C] VALUES('c', 'ccc');
    -INSERT INTO [dbo].[B] VALUES('b', 'c', null, 'bbb');
    -INSERT INTO [dbo].[A] VALUES('a', 'b', 'e', null, 'aaa');
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-drop.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-drop.sql
    deleted file mode 100644
    index 8ae27df..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-drop.sql
    +++ /dev/null
    @@ -1,52 +0,0 @@
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Accounts]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_Orders_Accounts]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[Orders] DROP CONSTRAINT FK_Orders_Accounts
    -
    -	drop table [dbo].[Accounts]
    -END
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Profiles]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Profiles]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[SignsOn]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[SignsOn]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Orders]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[FK_LineItems_Orders]') and OBJECTPROPERTY(id, N'IsForeignKey') = 1)
    -	ALTER TABLE [dbo].[LineItems] DROP CONSTRAINT FK_LineItems_Orders
    -
    -	drop table [dbo].[Orders]
    -END
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Categories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Categories]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Inventories]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Inventories]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Items]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Items]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LinesItem]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[LinesItem]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Products]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Products]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Suppliers]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Suppliers]
    -
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Sequences]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -drop table [dbo].[Sequences]
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-init.sql
    deleted file mode 100644
    index 1686f3d..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-init.sql
    +++ /dev/null
    @@ -1,88 +0,0 @@
    -use [IBatisNet]
    -
    -INSERT INTO [Suppliers] VALUES (1, 'XYZ Pets', 'AC', '600 Avon Way', '', 'Los Angeles', 'CA', '94024', '212-947-0797')
    -INSERT INTO [Suppliers] VALUES (2, 'ABC Pets', 'AC', '700 Abalone Way', '', 'San Francisco', 'CA', '94024', '415-947-0797')
    -
    -INSERT INTO [Categories] VALUES ('FISH', 'Fish', NULL)
    -INSERT INTO [Categories] VALUES ('DOGS', 'Dogs', NULL)
    -INSERT INTO [Categories] VALUES ('REPTILES', 'Reptiles', NULL)
    -INSERT INTO [Categories] VALUES ('CATS', 'Cats', NULL)
    -INSERT INTO [Categories] VALUES ('BIRDS', 'Birds', NULL)
    -INSERT INTO [Categories] VALUES ('DINO', 'Dinos', NULL)
    -
    -INSERT INTO [Products] VALUES ('FI-SW-01', 'FISH', 'Angelfish', 'Saltwater fish from Australia')
    -INSERT INTO [Products] VALUES ('FI-SW-02', 'FISH', 'Tiger Shark', 'Saltwater fish from Australia')
    -INSERT INTO [Products] VALUES ('FI-FW-01', 'FISH', 'Koi', 'Freshwater fish from Japan')
    -INSERT INTO [Products] VALUES ('FI-FW-02', 'FISH', 'Goldfish', 'Freshwater fish from China')
    -INSERT INTO [Products] VALUES ('K9-BD-01', 'DOGS', 'Bulldog', 'Friendly dog from England')
    -INSERT INTO [Products] VALUES ('K9-PO-02', 'DOGS', 'Poodle', 'Cute dog from France')
    -INSERT INTO [Products] VALUES ('K9-DL-01', 'DOGS', 'Dalmation', 'Great dog for a fire station')
    -INSERT INTO [Products] VALUES ('K9-RT-01', 'DOGS', 'Golden Retriever', 'Great family dog')
    -INSERT INTO [Products] VALUES ('K9-RT-02', 'DOGS', 'Labrador Retriever', 'Great hunting dog')
    -INSERT INTO [Products] VALUES ('K9-CW-01', 'DOGS', 'Chihuahua', 'Great companion dog')
    -INSERT INTO [Products] VALUES ('RP-SN-01', 'REPTILES', 'Rattlesnake', 'Doubles as a watch dog')
    -INSERT INTO [Products] VALUES ('RP-LI-02', 'REPTILES', 'Iguana', 'Friendly green friend')
    -INSERT INTO [Products] VALUES ('FL-DSH-01', 'CATS', 'Manx', 'Great for reducing mouse populations')
    -INSERT INTO [Products] VALUES ('FL-DLH-02', 'CATS', 'Persian', 'Friendly house cat, doubles as a princess')
    -INSERT INTO [Products] VALUES ('AV-CB-01', 'BIRDS', 'Amazon Parrot', 'Great companion for up to 75 years')
    -INSERT INTO [Products] VALUES ('AV-SB-02', 'BIRDS', 'Finch', 'Great stress reliever')
    -
    -INSERT INTO [Items] VALUES ('EST-1', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Large', NULL, NULL, NULL, NULL,'fish1.jpg')
    -INSERT INTO [Items] VALUES ('EST-2', 'FI-SW-01', 16.50, 10.00, 1, 'P', 'Small', NULL, NULL, NULL, NULL,'fish1.jpg')
    -INSERT INTO [Items] VALUES ('EST-3', 'FI-SW-02', 18.50, 12.00, 1, 'P', 'Toothless', NULL, NULL, NULL, NULL,'fish2.jpg')
    -INSERT INTO [Items] VALUES ('EST-4', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotted', NULL, NULL, NULL, NULL,'fish3.jpg')
    -INSERT INTO [Items] VALUES ('EST-5', 'FI-FW-01', 18.50, 12.00, 1, 'P', 'Spotless', NULL, NULL, NULL, NULL,'fish3.jpg')
    -INSERT INTO [Items] VALUES ('EST-6', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Male Adult', NULL, NULL, NULL, NULL,'dog1.jpg')
    -INSERT INTO [Items] VALUES ('EST-7', 'K9-BD-01', 18.50, 12.00, 1, 'P', 'Female Puppy', NULL, NULL, NULL, NULL,'dog1.jpg')
    -INSERT INTO [Items] VALUES ('EST-8', 'K9-PO-02', 18.50, 12.00, 1, 'P', 'Male Puppy', NULL, NULL, NULL, NULL,'dog2.jpg')
    -INSERT INTO [Items] VALUES ('EST-9', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotless Male Puppy', NULL, NULL, NULL, NULL,'dog3.jpg')
    -INSERT INTO [Items] VALUES ('EST-10', 'K9-DL-01', 18.50, 12.00, 1, 'P', 'Spotted Adult Female', NULL, NULL, NULL, NULL,'dog3.jpg')
    -INSERT INTO [Items] VALUES ('EST-11', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Venomless', NULL, NULL, NULL, NULL,'reptile1.jpg')
    -INSERT INTO [Items] VALUES ('EST-12', 'RP-SN-01', 18.50, 12.00, 1, 'P', 'Rattleless', NULL, NULL, NULL, NULL,'reptile1.jpg')
    -INSERT INTO [Items] VALUES ('EST-13', 'RP-LI-02', 18.50, 12.00, 1, 'P', 'Green Adult', NULL, NULL, NULL, NULL,'reptile2.jpg')
    -INSERT INTO [Items] VALUES ('EST-14', 'FL-DSH-01', 58.50, 12.00, 1, 'P', 'Tailless', NULL, NULL, NULL, NULL,'cat1.jpg')
    -INSERT INTO [Items] VALUES ('EST-15', 'FL-DSH-01', 23.50, 12.00, 1, 'P', 'Tailed', NULL, NULL, NULL, NULL,'cat1.jpg')
    -INSERT INTO [Items] VALUES ('EST-16', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'cat2.jpg')
    -INSERT INTO [Items] VALUES ('EST-17', 'FL-DLH-02', 93.50, 12.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'cat2.jpg')
    -INSERT INTO [Items] VALUES ('EST-18', 'AV-CB-01', 193.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird1.jpg')
    -INSERT INTO [Items] VALUES ('EST-19', 'AV-SB-02', 15.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'bird2.jpg')
    -INSERT INTO [Items] VALUES ('EST-20', 'FI-FW-02', 5.50, 2.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'fish4.jpg')
    -INSERT INTO [Items] VALUES ('EST-21', 'FI-FW-02', 5.29, 1.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'fish4.jpg')
    -INSERT INTO [Items] VALUES ('EST-22', 'K9-RT-02', 135.50, 100.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-23', 'K9-RT-02', 145.49, 100.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-24', 'K9-RT-02', 255.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-25', 'K9-RT-02', 325.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog5.jpg')
    -INSERT INTO [Items] VALUES ('EST-26', 'K9-CW-01', 125.50, 92.00, 1, 'P', 'Adult Male', NULL, NULL, NULL, NULL,'dog6.jpg')
    -INSERT INTO [Items] VALUES ('EST-27', 'K9-CW-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog6.jpg')
    -INSERT INTO [Items] VALUES ('EST-28', 'K9-RT-01', 155.29, 90.00, 1, 'P', 'Adult Female', NULL, NULL, NULL, NULL,'dog4.jpg')
    -
    -INSERT INTO [Inventories] VALUES ('EST-1', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-2', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-3', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-4', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-5', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-6', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-7', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-8', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-9', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-10', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-11', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-12', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-13', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-14', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-15', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-16', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-17', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-18', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-19', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-20', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-21', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-22', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-23', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-24', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-25', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-26', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-27', 10000)
    -INSERT INTO [Inventories] VALUES ('EST-28', 10000)
    -
    -INSERT INTO [Sequences] (Sequence_Name, Sequence_NextId) VALUES ('OrderNum', 0)
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-schema.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-schema.sql
    deleted file mode 100644
    index 28e1833..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/petstore-schema.sql
    +++ /dev/null
    @@ -1,159 +0,0 @@
    -use [IBatisNet]
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Categories]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Categories] (
    -	[Category_Id] [varchar] (10) NOT NULL ,
    -	[Category_Name] [varchar] (80) NULL ,
    -	[Category_Description] [varchar] (255) NULL 
    -) ON [PRIMARY]
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Products]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Products] (
    -	[Product_Id] [varchar] (10) NOT NULL ,
    -	[Category_Id] [varchar] (10) NOT NULL ,
    -	[Product_Name] [varchar] (80) NULL ,
    -	[Product_Description] [varchar] (255) NULL 
    -) ON [PRIMARY]
    -
    -
    --- --------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Suppliers]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Suppliers] (
    -	[Supplier_Id] int PRIMARY KEY,
    -	[Supplier_Name] varchar(80) NULL,
    -	[Supplier_Status] varchar(2) NOT NULL,
    -	[Supplier_Addr1] varchar(80) NULL,
    -	[Supplier_Addr2] varchar(80) NULL,
    -	[Supplier_City] varchar(80) NULL,
    -	[Supplier_State] varchar(80) NULL,
    -	[Supplier_Zip] varchar(5) NULL,
    -	[Supplier_Phone] varchar(40) NULL 
    -)
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Items] 
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Items] (
    -	[Item_Id] varchar(10) PRIMARY KEY,
    -	[Product_Id] varchar(10) NOT NULL,
    -	[Item_ListPrice] decimal(10, 2) NULL,
    -	[Item_UnitCost] decimal(10, 2) NULL,
    -	[Supplier_Id] int NULL,
    -	[Item_Status] varchar(2) NULL,
    -	[Item_Attr1] varchar(80) NULL,
    -	[Item_Attr2] varchar(80) NULL,
    -	[Item_Attr3] varchar(80) NULL,
    -	[Item_Attr4] varchar(80) NULL,
    -	[Item_Attr5] varchar(80) NULL,
    -	[Item_Photo] varchar(80) NULL
    -)
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Inventories] 
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Inventories] (
    -	[Item_Id] [varchar] (10) NOT NULL,
    -	[Inventory_Quantity] [int] NOT NULL 
    -) ON [PRIMARY]
    -
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Accounts]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Accounts] (
    -	[Account_Id] varchar(20) PRIMARY KEY,
    -	[Account_Email] varchar(80) NOT NULL,
    -	[Account_FirstName] varchar(80) NOT NULL,
    -	[Account_LastName] varchar(80) NOT NULL,
    -	[Account_Status] varchar(2) NULL,
    -	[Account_Addr1] varchar(80) NOT NULL,
    -	[Account_Addr2] varchar(80) NULL,
    -	[Account_City] varchar(80) NOT NULL,
    -	[Account_State] varchar(80) NOT NULL,
    -	[Account_Zip] varchar(20) NOT NULL,
    -	[Account_Country] varchar(20) NOT NULL,
    -	[Account_Phone] varchar(20) NOT NULL
    -)
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Profiles]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[Profiles] (
    -	[Account_Id] varchar(20) PRIMARY KEY,
    -	[Profile_LangPref] varchar(80) NOT NULL,
    -	[Profile_FavCategory] varchar(10) NULL,
    -	[Profile_MyListOpt] bit NULL,
    -	[Profile_BannerOpt] bit NULL
    -)
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [SignsOn]
    --- -------------------------------------------------------------------------------------------------*/
    -
    -CREATE TABLE [dbo].[SignsOn] (
    -	[Account_Id] varchar(20) PRIMARY KEY,
    -	[SignOn_Password] varchar(20) NOT NULL
    -)
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Orders]
    --- -------------------------------------------------------------------------------------------------*/
    -CREATE TABLE [dbo].[Orders] (
    -	[Order_Id] [int] NOT NULL ,
    -	[Account_ID] varchar(20) NOT NULL ,
    -	[Order_Date] datetime NOT NULL ,
    -	[Order_ShipToFirstName] varchar(80) NOT NULL ,
    -	[Order_ShipToLastName] varchar(80) NOT NULL ,
    -	[Order_ShipAddr1] varchar(80) NOT NULL ,
    -	[Order_ShipAddr2] varchar(80) NULL ,
    -	[Order_ShipCity] varchar(80) NOT NULL ,
    -	[Order_ShipState] varchar(80) NOT NULL ,
    -	[Order_ShipZip] varchar(20) NOT NULL ,
    -	[Order_ShipCountry] varchar(20) NOT NULL ,
    -	[Order_BillToFirstName] varchar(80) NOT NULL ,
    -	[Order_BillToLastName] varchar(80) NOT NULL ,
    -	[Order_BillAddr1] varchar(80) NOT NULL ,
    -	[Order_BillAddr2] varchar(80) NULL ,
    -	[Order_BillCity] varchar(80) NOT NULL ,
    -	[Order_BillState] varchar(80) NOT NULL ,
    -	[Order_BillZip] varchar(20) NOT NULL ,
    -	[Order_BillCountry] varchar(20) NOT NULL ,
    -	[Order_TotalPrice] decimal(10, 2) NOT NULL ,
    -	[Order_CreditCard] varchar(20) NOT NULL ,
    -	[Order_ExprDate] varchar(7) NOT NULL ,
    -	[Order_CardType] varchar(40) NOT NULL 
    -) ON [PRIMARY]
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [LinesItem]
    --- -------------------------------------------------------------------------------------------------
    -CREATE TABLE [dbo].[LinesItem] (
    -	[Order_Id] int NOT NULL ,
    -	[LineItem_LineNum] int NOT NULL ,
    -	[Item_Id] varchar(10) NOT NULL ,
    -	[LineItem_Quantity] int NOT NULL ,
    -	[LineItem_UnitPrice] decimal(10, 2) NOT NULL 
    -) ON [PRIMARY]
    -
    --- ---------------------------------------------------------------------------------------------------
    --- CREATE TABLE [Sequences]
    --- -------------------------------------------------------------------------------------------------
    -CREATE TABLE [dbo].[Sequences] (
    -	[Sequence_Name] [varchar] (30) NOT NULL ,
    -	[Sequence_NextId] [int] NOT NULL 
    -) ON [PRIMARY]
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAccount.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAccount.sql
    deleted file mode 100644
    index 790108b..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAccount.sql
    +++ /dev/null
    @@ -1,10 +0,0 @@
    ---CREATE PROCEDURE dbo.[ps_SelectAccount]
    ---@Account_ID  [int]
    ---AS
    ---select
    ---	Account_ID as Id,
    ---	Account_FirstName as FirstName,
    ---	Account_LastName as LastName,
    ---	Account_Email as EmailAddress
    ---from Accounts
    ---where Account_ID = @Account_ID
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAllAccount.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAllAccount.sql
    deleted file mode 100644
    index 50792dd..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectAllAccount.sql
    +++ /dev/null
    @@ -1,8 +0,0 @@
    -CREATE PROCEDURE dbo.[ps_SelectAllAccount]
    -AS
    -select
    -	Account_ID as Id,
    -	Account_FirstName as FirstName,
    -	Account_LastName as LastName,
    -	Account_Email as EmailAddress
    -from Accounts
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectByIdList.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectByIdList.sql
    deleted file mode 100644
    index fb457d3..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectByIdList.sql
    +++ /dev/null
    @@ -1,19 +0,0 @@
    -
    -
    -CREATE PROCEDURE ps_SelectByIdList(@AccountIds xml) AS
    -
    -DECLARE @Ids TABLE (ID int) 
    -
    -INSERT INTO @Ids (ID) SELECT ParamValues.ID.value('.','int')
    -FROM @AccountIds.nodes('/Accounts/id') as ParamValues(ID) 
    -
    -SELECT 
    -	Account_ID as Id,
    -	Account_FirstName as FirstName,
    -	Account_LastName as LastName,
    -	Account_Email as EmailAddress
    -FROM 
    -    Accounts
    -INNER JOIN 
    -    @Ids p
    -ON    Accounts.Account_ID = p.ID
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectLineItem.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectLineItem.sql
    deleted file mode 100644
    index 66cf9e4..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/ps_SelectLineItem.sql
    +++ /dev/null
    @@ -1,9 +0,0 @@
    ---CREATE PROCEDURE dbo.[ps_SelectLineItem]
    ---@Order_ID  [int]
    ---AS
    ---select
    ---	LineItem_ID as Id,
    ---	LineItem_Code as Code,
    ---	LineItem_Quantity as Quantity,
    ---	LineItem_Price as Price
    ---from LineItems where Order_ID = @Order_ID
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/simple-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/simple-init.sql
    deleted file mode 100644
    index 2703797..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/simple-init.sql
    +++ /dev/null
    @@ -1,9 +0,0 @@
    -CREATE TABLE IF NOT EXISTS [Simples] (
    -	[ID] [int] NOT NULL ,
    -	[Name] [varchar] (64) NULL ,
    -	[Address] [varchar] (64) NULL ,
    -	[Count] [int] NULL ,
    -	[Date] [datetime] NULL ,
    -	[Pay] [decimal](18, 2) NULL,
    -  PRIMARY KEY  (ID)
    -);
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/swap-procedure.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/swap-procedure.sql
    deleted file mode 100644
    index 203ab60..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/swap-procedure.sql
    +++ /dev/null
    @@ -1,34 +0,0 @@
    -CREATE   PROCEDURE dbo.[ps_swap_email_address]
    -@First_Email  [nvarchar] (64) output, 
    -@Second_Email [nvarchar] (64) output
    -AS
    -
    -Declare @ID1 int
    -Declare @ID2 int
    -
    -Declare @Email1  [nvarchar] (64)
    -Declare @Email2  [nvarchar] (64)
    -
    -  SELECT @ID1 = Account_ID, @Email1 = Account_Email
    -  from Accounts
    -  where Account_Email = @First_Email
    -
    -  SELECT @ID2 = Account_ID, @Email2 = Account_Email
    -  from Accounts
    -  where Account_Email = @Second_Email
    -
    -  UPDATE Accounts
    -  set Account_Email = @Email2
    -  where Account_ID = @ID1
    -
    -  UPDATE Accounts
    -  set Account_Email = @Email1
    -  where Account_ID = @ID2
    -
    -  SELECT @First_Email = Account_Email
    -  from Accounts
    -  where Account_ID = @ID1
    -
    -  SELECT @Second_Email = Account_Email
    -  from Accounts
    -  where Account_ID = @ID2
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/teardown.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/teardown.sql
    deleted file mode 100644
    index ccbf235..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/teardown.sql
    +++ /dev/null
    @@ -1,5 +0,0 @@
    -DROP TABLE IF EXISTS Accounts;
    -
    -DROP TABLE IF EXISTS Orders;
    -
    -DROP TABLE IF EXISTS LineItems;
    \ No newline at end of file
    diff --git a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/user-init.sql b/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/user-init.sql
    deleted file mode 100644
    index 59e2443..0000000
    --- a/src/IBatisNet.DataMapper.Test/Scripts/SQLite3/user-init.sql
    +++ /dev/null
    @@ -1,23 +0,0 @@
    --- Creating Table
    -
    -use [IBatisNet]
    -
    -if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Users]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
    -BEGIN
    -	drop table [dbo].[Users]
    -END
    -
    -CREATE TABLE [dbo].[Users] (
    -  [User_ID] [int] NOT NULL ,
    -  [Name] [varchar] (32)  NOT NULL
    -  PRIMARY KEY  (User_ID)
    -)
    -
    --- Creating Test Data
    -
    -INSERT INTO [dbo].[Users] VALUES(1,'Joe');
    -INSERT INTO [dbo].[Users] VALUES(2,'Averel');
    -INSERT INTO [dbo].[Users] VALUES(3,'William');
    -INSERT INTO [dbo].[Users] VALUES(4,'Jack');
    -INSERT INTO [dbo].[Users] VALUES(5,'Gilles');
    -
    diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/IBatisNet.DataMapper.Test.dll.config b/src/IBatisNet.DataMapper.Test/bin/Debug/IBatisNet.DataMapper.Test.dll.config
    deleted file mode 100644
    index 5e294cc..0000000
    --- a/src/IBatisNet.DataMapper.Test/bin/Debug/IBatisNet.DataMapper.Test.dll.config
    +++ /dev/null
    @@ -1,126 +0,0 @@
    -
    -
    -	
    -	
    -		
    -			
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Access_OleDb.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Access_OleDb.config deleted file mode 100644 index bb40e8c..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Access_OleDb.config +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_Odbc.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_Odbc.config deleted file mode 100644 index 1aea3b6..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_Odbc.config +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_OleDb.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_OleDb.config deleted file mode 100644 index 861cdb0..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_OleDb.config +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config deleted file mode 100644 index 565d522..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MSSQL_SqlClient.config +++ /dev/null @@ -1,69 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_ByteFx.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_ByteFx.config deleted file mode 100644 index e3a8fb3..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_ByteFx.config +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_MySql.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_MySql.config deleted file mode 100644 index 3d53216..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_MySql_MySql.config +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_ODP.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_ODP.config deleted file mode 100644 index 38d3f91..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_ODP.config +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_OracleClient.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_OracleClient.config deleted file mode 100644 index c724277..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_Oracle_OracleClient.config +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_PostgreSQL_Npgsql.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_PostgreSQL_Npgsql.config deleted file mode 100644 index d4ee557..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_PostgreSQL_Npgsql.config +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_SQLite3_SQLite3.config b/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_SQLite3_SQLite3.config deleted file mode 100644 index 01ddc72..0000000 --- a/src/IBatisNet.DataMapper.Test/bin/Debug/SqlMap_SQLite3_SQLite3.config +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/cool.jpg b/src/IBatisNet.DataMapper.Test/bin/Debug/cool.jpg deleted file mode 100644 index 6bfaf12aa4ff9a2873445216732d804adeda0afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1139 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<gTWM0TY@5u?V53ptdXHXalWy7)oG zIH{I3zSIJR&kGIVCkMJtH%#xTLhK zyrQzIxuvzOy`!^h(&Q;qr%j(RbJn88OO`HMzGCI7O`ErD-L`$l&RvHNA31vL_=%IJ zE?vHI_1g6tH*Yuqec!9r-=(U9^_Ou4*DRPRCJL`OvU7(>PL{* zz&<0+V@+iF4DK<6ziu(`Ff#%pk6Dnxp5aTrK*d$Hrq})#Q}%iv-LbV#`*wBdEOk#F zzc*``S1@TBPiK(%I7g;Ps&Btt?<0*G_Z6?qj%5fcu%(KvFV2_tQFU0lS*N{f1B1I{ zzGj=l(UN}_A8u~A^ffozv+3gGQ?uTEI`?p9(!?V^Qa&0#PsT}^{fv0HX$@zdx1ZFM zsw2zYFK?Bex$fwxPC02Oy}EP%f=|6kb5~6*Z17rlcxym%!KdfmlHr1Db|&o3uFe1S z`EQlzM}x(_8qV|l{)PRKujS8bs#ur%cphg^L~6jtlhSPAK}H+7epZkXVmJ!4+QrYBRUKj~>Zv`nHWC45F)#r1#>eQnpbDF{`gxz*zMigd5#HhEX)C*M?W(w<$ZFi&NgWXO_F(-)57KKN&QhOv*JonRgeg8#%ffTdZ{?Pm65yt| zsXYqCYSck3^nsul~Shj=E%J5 zejncVsC~4XTD$hu$9?mc@7es5t>Ss6YQ` - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IBatisNet.DataMapper.Test/bin/Debug/test.config b/src/IBatisNet.DataMapper.Test/bin/Debug/test.config deleted file mode 100644 index e69de29..0000000 diff --git a/src/IBatisNet.DataMapper.Test/cool.jpg b/src/IBatisNet.DataMapper.Test/cool.jpg deleted file mode 100644 index 6bfaf12aa4ff9a2873445216732d804adeda0afc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1139 zcmex=^(PF6}rMnOeST|r4lSw=>~TvNxu(8R<gTWM0TY@5u?V53ptdXHXalWy7)oG zIH{I3zSIJR&kGIVCkMJtH%#xTLhK zyrQzIxuvzOy`!^h(&Q;qr%j(RbJn88OO`HMzGCI7O`ErD-L`$l&RvHNA31vL_=%IJ zE?vHI_1g6tH*Yuqec!9r-=(U9^_Ou4*DRPRCJL`OvU7(>PL{* zz&<0+V@+iF4DK<6ziu(`Ff#%pk6Dnxp5aTrK*d$Hrq})#Q}%iv-LbV#`*wBdEOk#F zzc*``S1@TBPiK(%I7g;Ps&Btt?<0*G_Z6?qj%5fcu%(KvFV2_tQFU0lS*N{f1B1I{ zzGj=l(UN}_A8u~A^ffozv+3gGQ?uTEI`?p9(!?V^Qa&0#PsT}^{fv0HX$@zdx1ZFM zsw2zYFK?Bex$fwxPC02Oy}EP%f=|6kb5~6*Z17rlcxym%!KdfmlHr1Db|&o3uFe1S z`EQlzM}x(_8qV|l{)PRKujS8bs#ur%cphg^L~6jtlhSPAK}H+7epZkXVmJ!4+QrYBRUKj~>Zv`nHWC45F)#r1#>eQnpbDF{`gxz*zMigd5#HhEX)C*M?W(w<$ZFi&NgWXO_F(-)57KKN&QhOv*JonRgeg8#%ffTdZ{?Pm65yt| zsXYqCYSck3^nsul~Shj=E%J5 zejncVsC~4XTD$hu$9?mc@7es5t>Ss6YQ`iijqooOKaG1MCTef*Nn_P*W=m9E1I5lC%Ueh#krN_=m zXsJ*BQ(&U#a(|w9tVu#Zlqz?xorz+kmLqQSCxdUdpYNM)TGaC;y|s|2w*sW|&elbC zJ$2XWQL^1WRIl}`Y%2#JYJEQ)B#m`>mEzb9;?{@eTdQk1(la%bUc788JCGs()e$JD0bJOyPk)kh7*d%uHa}8Iwp#~PKN|2sGiKjz-#dLsgIYhmTDjT43f>RzLm@)%<|Jpm2QfD=JIJ-%4=QL8v5LCngTUe+a5q>J^ z-bNmPPt>aQdAWMeA#e+{btwK8%kcnN2&4CmVU*)8fFn_n($&dlbJ#O+op_N^GY=nZ z>A6hS*9uWS3m$X5X1})yK2vD$OYBI6N1VDo<&k5}+;rNRbRX)r&-U{xBALw4VorU` z)MVXeTS!|0&~Xb@Bx)^Q5E$VCrL0Np;3bnB8t{ tag in sql map files. -- IBATISNET-104 : QueryForXXX do not check cache before opening/closing connection - - -Improvements/Changes -- IBATISNET-199 : Add support for QueryForObject and GroupBy -- IBATISNET-196 : Improved stored procedure parameters analysis -- IBATISNET-192 : Add support for IDictionary QueryForDictionary(...) -- IBATISNET-185 : Allow custom ISessionStore -- IBATISNET-181 : Allow mapping of multiple resulSet -- IBATISNET-180 : Extends use of ISqlMapper in DataMapper + allow use of a custom ISqlMapper - -- Remove obsoletes methods on SqlMapper : Configure(XmlDocument document), Configure(), Configure(string resource), - ConfigureAndWatch(ConfigureHandler configureDelegate), ConfigureAndWatch(string resource, ConfigureHandler configureDelegate) -- Mark QueryForPaginatedList as Obsolete on SqlMapper - ------------------------------- -1.5.1 - 10/08/2006 GA ------------------------------- -Issues -- IBATISNET-176 : Issue with resultMapping & constructor injection -- IBATISNET-175 : Support discriminators when used via the "resultMapping" attribute -- IBATISNET-174 : Issue with a result map constructor in a result property -- IBATISNET-173 : Issue with constructor tag where an argument use another constructor tag -- IBATISNET-172 : Issue with QueryForList with constructor resultMap and select argument -- IBATISNET-170 : auto-result-map Bug -- IBATISNET-169 : SqlMap.xsd Correction -- IBATISNET-168 : The parameter class reflection does not work anymore - -Improvements/Changes -- IBATISNET-167 : Update nunit to last stable version 2.2.8 - ------------------------------- -1.5 - 05/07/2006 BETA ------------------------------- -Issues -- IBATISNET-163 : Missing datatype can throw null pointer exception -- IBATISNET-158 : Add support for generic type in TypeAssemblyInfo -- IBATISNET-151 : Pre-load stored procedure parameters should use the already-open connection -- IBATISNET-145 : Make NoOpLoggerFA the default logger when logging config is missing or malformed. Allow FactoryAdapter to be set by the application -- IBATISNET-143 : Allow selectKey node to process dynamic sql -- IBATISNET-141 : DataMapper Developer Guide document bug -- IBATISNET-139 : DBNull.Value as parameter object raises NullReferenceException in UnknownTypeHandler -- IBATISNET-138 : QueryForMap with cache Bug/Regression -- IBATISNET-137 : TypeHandlers for "System.Nullable(Of" fails with custom types - -Improvements/Changes -- IBATISNET-165 : Getting return value generatedKeys from stored procedures in inserts -- IBATISNET-162 : Ability to override the default result object creation mechanism -- IBATISNET-161 : Update log4net to last stable version 1.2.10 -- IBATISNET-156 : Added support for MARS - Added allowMARS attribute on provider tag (used by SqlServer 2005, PostgreSQL). -- IBATISNET-155 Allow Constructor Initialization on resultMap - use - - -- IBATISNET-153 Supporting private field accessor -- IBATISNET-147 : Emitted types for populating and instantiating result - Added useReflectionOptimizer attribut setting in SqlMap.config -- IBATISNET-105 : Added Lazy load support for Strong typed collections -- Added ISqlMapper interface to simplify mock or stub -- Added support for readOnly & serialize attribut on CacheModel -- Added class attribute to parameterMap tags [it is recommended !] -- Added Support for nullable type in .NET V2 -- Added Support for .NET V2 and Generic - - public T QueryForObject(string statementName, object parameterObject); - public T QueryForObject(string statementName, object parameterObject, T instanceObject); - - public IList QueryForList(string statementName, object parameterObject); - public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults); - public void QueryForList(string statementName, object parameterObject, IList resultObject); - - public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate); - - [also support object with generic list propertie Order{public IList LineItemsGenericList{...}};] - ------------------------------- -1.3 - 15/12/2005 ------------------------------- -- - Added support for Implicit Result Maps as - - -
    - -
    - - - - - - - - - - ... - - -- Removes use of Xml serilization for loading config, boost init -- Improved caching process & performance -- Corrected issue with flushOnExecute statements being from other namespaces -- Allow CacheModels, ResultMaps, and ParameterMaps to be in their own seperate files -- Fixed IBATISNET-58 Allow all attributes in SqlMap.config file to be aware of ${xyz} properties -- Fixed IBATISNET-97 Improved support for caching null results -- Fixed IBATISNET-96 Added Informix .NET Provider 2.81 support (Anderson Gomes) -- Fixed IBATISNET-94 Issue with DaoManager init -- Fixed IBATISNET-92 Check selectKey's property attribute for writeability during mapper initialization -- Fixed IBATISNET-91 Added Cache flush on ExecuteQueryForObject -- Fixed IBATISNET-82 Added DomDaoManagerBuilder.Configure(XmlDocument document) -- Fixed IBATISNET-77 Allow Intellisense in Visual Studio 2003 for SqlMap/SqlMap.config files -- Updated schemas header - SqlMap.config - - Mapping files - - Providers.config - - ------------------------------- -1.2.1 - 10/07/2005 ------------------------------- -- Added new DomSqlMapBuilder constructor DomSqlMapBuilder(bool validateSqlMapConfig) -- Exchange order of settings and properties tag in config file -- Add new API to DomSqlMapBuilder.Configure(...)[old API SqlMapper.Configure(...) are marked as obsolete] -- Re-Add providers tag (optional) in SqlMap.Config -- Updated to Castle.DynamicProxy V1.1.0.0 -- Impoved logging JIRA-35 -- Added support to validate SqlMap.config (automatic) and mapping file (manual) via setting tag () -- Fixed grammar typo (JIRA-36, JIRA-40, JIRA-41, JIRA-44, JIRA-61, JIRA-64) -- Added support for custom type handler -- Added typeHandler attribute to result-property and parameter-property tags -- Added and tags for class inheritance support -- Added nunit category 'NHibernate' -- Fixed Oracle issues (JIRA-27, JIRA-54, JIRA-56, JIRA-57) -- Improvement JIRA-75/63 - - - - ( To resolve IBATISNET-63 ) - - -- Fixed JIRA-70 Passed inner exception when re-throwing when init provider -- Fixed JIRA-69 Added support for global setting in ressource and url attribute -- Fixed JIRA-68 Improved logging message fpr TypeHandler Configuration -- Fixed JIRA-66 #value# moniker not recognized when called something else like #ProductId# -- Fixed JIRA-60 QueryForMap not calling session.CloseConnection() correctly -- Fixed JIRA-51 If a has a "cacheModel" attribute set and cacheModelsEnabled="false" in SqlMap.config, an DataMapperException is thrown -- Fixed JIRA-49 Exceptions such as NotSupportedException not handled gracefully in CreateParametersForStatementText() -- Fixed JIRA-47/48/49 providers.config Assumes Types Are In The Same Assembly -- Fixed JIRA-45 Unable to reference result maps defined in other xml files when useStatementNamespaces is set to true -- Fixed JIRA-43 IBatisNet.sln contains a reference to a non-existant project: "IBatisNet.Test" -- Fixed JIRA-42 Build 1.1.458.0 doesn't automatically map .Net's bool to Sql Server 2000's Bit column type like previous builds did. -- Fixed JIRA-38 ParseGlobalProperties raises NullReferenceException if optional "properties" element is missing from sqlmap config file -- Fixed JIRA-37 An exception is thrown when a file watch is applied to an embedded resource -- Fixed JIRA-34 SqlMapSession's OpenConnection writes log message in "if" statement but not in "else if" statement -- Fixed JIRA-33 SqlMapSession's OpenConnection writes log message in "if" statement but not in "else if" statement -- Fixed JIRA-32 Improve how CloseConnection() tests for closeable connection -- Fixed JIRA-30 bug in when referencing a parameter more than once -- Fixed JIRA-29 Pound signs not handled correctly -- Fixed JIRA-26 Unhandled NullReference parsing non-existent properties. -- Fixed JIAR-25 Error applying ResultMap when using 'Guid' in resultClass -- Fixed JIRA-24 GUID TypeResolving misconfigured -- Fixed JIRA-23 Add ability to preserve newlines within statement bodies. -- Fixed JIRA-22 statements containing undefined global properties silently fail -- Fixed JIRA-21 Property substitutions do not occur inside statement -- Fixed JIRA-20 Type problems when applying parameters. - ------------------------------- -1.1.458 Alpha- 12-jan-2005 ------------------------------- -- Added type (a CLR type) attribut in result and parameterMap element. -- Patch from Luke Yang -- Updated schema. -- Added explicit open/close connection for DataAccess framework. -- Added support for NHibernate in DataAccess framework -- Added optional tag 'daoSessionHandlers' in dao.config to support new session handler (NHibernate) -- Changed 'name' attribut on 'context' tag to 'id' (dao.config) -- Changed 'name' attribut on 'daoSessionHandler' tag to 'id' (dao.config) -- Fixed JIRA IBATISNET-13 -- Used Castle.DynamicProxy 1.0.3 for proxy. -- Fixed JIRA IBATISNET-12 -- Added Unit Test for multiple/nested DAO Manager -- Added Xml Comment -- Fixed possible issue in ApplyParameterMap (https://sourceforge.net/forum/message.php?msg_id=2841897) -- Added support for C# using syntax in DataAccess/DataMapper - * using ( SqlMapSession session = daoManager.OpenConnection() ) - { - ...db operations... - } - * using ( SqlMapSession session = daoManager.BeginTransaction() ) - { - ...db operations... - session.Complete(); // Commit - } - * using ( SqlMapSession session = sqlMap.OpenConnection() ) - { - ...db operations... - } - * using ( SqlMapSession session = sqlMap.BeginTransaction() ) - { - ...db operations... - session.Complete(); // Commit - } -- Added support for Distributed Transaction la Indigo with TransactionScope object - in iBATIS.Common.Transaction (see Unit test in CommonTests.Transaction for usage) - using (TransactionScope tx = new TransactionScope()) - { - // Open connection to database 1 - // Transaction will be automatically enlist into it - // Execute update in database 1 - - // Open connection to database 2 - // Transaction will be automatically enlist into it - // Execute update in database 2 - - // Open a MessageQueue - // Transaction will be automatically enlist into it - // Post message - - // the following code will be executed only if no exception - // occured in the above code; since we got here ok, let's vote for commit; - // in most if not all of the cases, this last line will be the same as below - tx.Complete(); - } - // when using call Dispose on the transaction scope at the end - // of the using code block, the "ambient" transaction will be commited only and only if - // the Complete method have been called. - - - Only supported in - - XP SP2 (or higher) - - Windows Server 2003 - - XP SP1 + Hotfix 828741 - and only in .Net 1.1. - It CAN'T be used on Windows 2000. - - Don't support nested TransactionScope. -- Fixed bug for dynamic element isNotEqual (detected by Anders) -- Fixed possible issue in SessionContainer -- Refactoring of DaoSession -- Removed 'static' usage in DomDaoManagerBuilder -- Added support for embedded resource : only tag - - and tag - - will support it. Syntax for embedded attribut - 'file name, the name of the assembly which contains the embedded resource' -- Removed 'assembly' attribut on element of Dao.Config - the implementation structure attribut of element become the namespace-qualified name of the class is specified, followed by a comma, followed by (at a bare minimum) the name of the assembly that contains the class. -- Removed 'static' usage in DomSqlMapBuilder -- Moved Alias management to IBatisNet.Common.Utilities -- Fixed request support 1032436, ByteArrayTypeHandler misses the last byte -- Fixed support request 1050704, Unable to use with useStatementNamespaces=true -- Added 'extends' attribute on statement, see Unit tests TestExtends* -- Improved configuration building -- Fixed issue on cache initialization - ------------------------------- -1.0.1 Alpha- 18/10/2004 ------------------------------- -- Used Apache.Avalon.DynamicProxy.dll for proxy. -- Fixed support request 1045775, Connection management : ThreadStatic under asp.net -- Marked property 'assembly' on typeAlias XML element as obsolete, the type attribut structure become the namespace-qualified name of the class is specified, followed by a comma, followed by (at a bare minimum) the name of the assembly that contains the class. - Exemple : type="IBatisNet.Test.Domain.Order, IBatisNet.Test" -- Cleaning code, added comments -- Fixed support request 1043181, NUNit test TestInsertOrderViaExtendParameterMap -- TypeAlias refactoring, added a cache (improved perf from near 15%) -- Used NUnit 2.2 to test -- Removed signing on assembly - ------------------------------- -1.0.0 Alpha- 07/10/2004 ------------------------------- -- dao.config, sqlMap.config, providers.config must be place in the base directory of the application domain (same dir as app.config or web.config) -- removed tag 'providers' from config file. -- Rethink 'url', 'resource' notion (resource are loaded from the root directory of the application (relative path), url are valid path file:///c:/config/my.properties) -- Fixed Support Request 1032436 (ByteArrayTypeHandler misses the last byte) -- Fixed Support Requests 1007388 (SelectKey ignores namespace) -- Added 'url', 'resource' notion as in iBatis Java -- Changed 'file' attribute from tag to 'resource' name. -- Added tag in statement tag , , , node - // insert.SelectKey.Initialize( _configScope ); - // insert.SelectKey.Id = insert.Id + DOT + "SelectKey"; - - ProcessSqlStatement(insert.SelectKey); - - // Build MappedStatement - mappedStatement = new MappedStatement( _configScope.SqlMapper, insert.SelectKey); - - _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion - } - #endregion - - #region Update tag - Update update; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_UPDATE), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading update tag"; - _configScope.NodeContext = xmlNode; // A update tag - - MappedStatement mappedStatement; - - update = UpdateDeSerializer.Deserialize(xmlNode, _configScope); - update.CacheModelName = _configScope.ApplyNamespace(update.CacheModelName); - update.ParameterMapName = _configScope.ApplyNamespace(update.ParameterMapName); - //update.ResultMapName = ApplyNamespace( update.ResultMapName ); - - if (_configScope.UseStatementNamespaces) - { - update.Id = _configScope.ApplyNamespace(update.Id); - } - _configScope.ErrorContext.ObjectId = update.Id; - update.Initialize( _configScope ); - - // Build ISql (analyse sql statement) - if (update.Generate != null) - { - GenerateCommandText(_configScope, update); - } - else - { - // Build ISql (analyse sql statement) - ProcessSqlStatement(update); - } - - // Build MappedStatement - mappedStatement = new UpdateMappedStatement( _configScope.SqlMapper, update); - - _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion - - #region Delete tag - Delete delete; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_DELETE), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading delete tag"; - _configScope.NodeContext = xmlNode; // A delete tag - MappedStatement mappedStatement; - - delete = DeleteDeSerializer.Deserialize(xmlNode, _configScope); - delete.CacheModelName = _configScope.ApplyNamespace(delete.CacheModelName); - delete.ParameterMapName = _configScope.ApplyNamespace(delete.ParameterMapName); - //delete.ResultMapName = ApplyNamespace( delete.ResultMapName ); - - if (_configScope.UseStatementNamespaces) - { - delete.Id = _configScope.ApplyNamespace(delete.Id); - } - _configScope.ErrorContext.ObjectId = delete.Id; - delete.Initialize( _configScope ); - - // Build ISql (analyse sql statement) - if (delete.Generate != null) - { - GenerateCommandText(_configScope, delete); - } - else - { - // Build ISql (analyse sql statement) - ProcessSqlStatement(delete); - } - - // Build MappedStatement - mappedStatement = new DeleteMappedStatement( _configScope.SqlMapper, delete); - - _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion - - #region Procedure tag - Procedure procedure; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_PROCEDURE), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading procedure tag"; - _configScope.NodeContext = xmlNode; // A procedure tag - - procedure = ProcedureDeSerializer.Deserialize(xmlNode, _configScope); - procedure.CacheModelName = _configScope.ApplyNamespace(procedure.CacheModelName); - procedure.ParameterMapName = _configScope.ApplyNamespace(procedure.ParameterMapName); - //procedure.ResultMapName = ApplyNamespace( procedure.ResultMapName ); - - if (_configScope.UseStatementNamespaces) - { - procedure.Id = _configScope.ApplyNamespace(procedure.Id); - } - _configScope.ErrorContext.ObjectId = procedure.Id; - procedure.Initialize( _configScope ); - - // Build ISql (analyse sql command text) - ProcessSqlStatement( procedure ); - - // Build MappedStatement - MappedStatement mappedStatement = new MappedStatement(_configScope.SqlMapper, procedure); - IMappedStatement mapStatement = mappedStatement; - if (procedure.CacheModelName != null && procedure.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) - { - mapStatement = new CachingStatement(mappedStatement); - } - - _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); - } - #endregion - - #endregion - - #region Load CacheModels - - if (_configScope.IsCacheModelsEnabled) - { - CacheModel cacheModel; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes( ApplyMappingNamespacePrefix(XML_CACHE_MODEL), _configScope.XmlNamespaceManager)) - { - cacheModel = CacheModelDeSerializer.Deserialize(xmlNode, _configScope); - cacheModel.Id = _configScope.ApplyNamespace(cacheModel.Id); - - // Attach ExecuteEventHandler - foreach(XmlNode flushOn in xmlNode.SelectNodes( ApplyMappingNamespacePrefix(XML_FLUSH_ON_EXECUTE), _configScope.XmlNamespaceManager )) - { - string statementName = flushOn.Attributes["statement"].Value; - if (_configScope.UseStatementNamespaces) - { - statementName = _configScope.ApplyNamespace(statementName); - } - - // delay registering statements to cache model until all sqlMap files have been processed - IList statementNames = (IList)_configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id]; - if (statementNames == null) - { - statementNames = new ArrayList(); - } - statementNames.Add(statementName); - _configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id] = statementNames; - } - - // Get Properties - foreach(XmlNode propertie in xmlNode.SelectNodes( ApplyMappingNamespacePrefix(XML_PROPERTY), _configScope.XmlNamespaceManager)) - { - string name = propertie.Attributes["name"].Value; - string value = propertie.Attributes["value"].Value; - - cacheModel.AddProperty(name, value); - } - - cacheModel.Initialize(); - - _configScope.SqlMapper.AddCache( cacheModel ); - } - } - - #endregion - - _configScope.ErrorContext.Reset(); - } - - - /// - /// Process the Sql Statement - /// - /// - private void ProcessSqlStatement( IStatement statement ) - { - bool isDynamic = false; - XmlNode commandTextNode = _configScope.NodeContext; - DynamicSql dynamic = new DynamicSql( _configScope, statement ); - StringBuilder sqlBuffer = new StringBuilder(); - - if (statement.Id=="DynamicJIRA") - { - Console.Write("tt"); - } - - _configScope.ErrorContext.MoreInfo = "process the Sql statement"; - - // Resolve "extend" attribute on Statement - if (statement.ExtendStatement.Length >0) - { - // Find 'super' statement - XmlNode supperStatementNode = _configScope.SqlMapDocument.SelectSingleNode( ApplyMappingNamespacePrefix(XML_SEARCH_STATEMENT)+"/child::*[@id='"+statement.ExtendStatement+"']",_configScope.XmlNamespaceManager ); - if (supperStatementNode!=null) - { - commandTextNode.InnerXml = supperStatementNode.InnerXml + commandTextNode.InnerXml; - } - else - { - throw new ConfigurationException("Unable to find extend statement named '"+statement.ExtendStatement+"' on statement '"+statement.Id+"'.'"); - } - } - - _configScope.ErrorContext.MoreInfo = "parse dynamic tags on sql statement"; - - isDynamic = ParseDynamicTags( commandTextNode, dynamic, sqlBuffer, isDynamic, false, statement); - - if (isDynamic) - { - statement.Sql = dynamic; - } - else - { - string sqlText = sqlBuffer.ToString(); - ApplyInlineParemeterMap( statement, sqlText); - } - } - - - /// - /// Parse dynamic tags - /// - /// - /// - /// - /// - /// - /// - /// - private bool ParseDynamicTags( XmlNode commandTextNode, IDynamicParent dynamic, - StringBuilder sqlBuffer, bool isDynamic, bool postParseRequired, IStatement statement) - { - XmlNodeList children = commandTextNode.ChildNodes; - int count = children.Count; - for (int i = 0; i < count; i++) - { - XmlNode child = children[i]; - if ( (child.NodeType == XmlNodeType.CDATA) || (child.NodeType == XmlNodeType.Text) ) - { - string data = child.InnerText.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' '); //?? - - data = NodeUtils.ParsePropertyTokens(data, _configScope.Properties); - - SqlText sqlText; - if (postParseRequired) - { - sqlText = new SqlText(); - sqlText.Text = data.ToString(); - } - else - { - sqlText = _paramParser.ParseInlineParameterMap(_configScope, null, data ); - } - - dynamic.AddChild(sqlText); - sqlBuffer.Append(data); - } - else if (child.Name == "include") - { - NameValueCollection prop = NodeUtils.ParseAttributes(child, _configScope.Properties); - string refid = NodeUtils.GetStringAttribute(prop, "refid"); - XmlNode includeNode = (XmlNode)_configScope.SqlIncludes[refid]; - - if (includeNode == null) - { - String nsrefid = _configScope.ApplyNamespace(refid); - includeNode = (XmlNode)_configScope.SqlIncludes[nsrefid]; - if (includeNode == null) - { - throw new ConfigurationException("Could not find SQL tag to include with refid '" + refid + "'"); - } - } - isDynamic = ParseDynamicTags(includeNode, dynamic, sqlBuffer, isDynamic, false, statement); - } - else - { - string nodeName = child.Name; - IDeSerializer serializer = _deSerializerFactory.GetDeSerializer(nodeName); - - if (serializer != null) - { - isDynamic = true; - SqlTag tag; - - tag = serializer.Deserialize(child); - - dynamic.AddChild(tag); - - if (child.HasChildNodes) - { - isDynamic = ParseDynamicTags( child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement ); - } - } - } - } - - return isDynamic; - } - - - #region Inline Parameter parsing - - /// - /// Apply inline paremeterMap - /// - /// - /// - private void ApplyInlineParemeterMap( IStatement statement, string sqlStatement) - { - string newSql = sqlStatement; - - _configScope.ErrorContext.MoreInfo = "apply inline parameterMap"; - - // Check the inline parameter - if (statement.ParameterMap == null) - { - // Build a Parametermap with the inline parameters. - // if they exist. Then delete inline infos from sqltext. - - SqlText sqlText = _paramParser.ParseInlineParameterMap(_configScope, statement, newSql ); - - if (sqlText.Parameters.Length > 0) - { - ParameterMap map = new ParameterMap(_configScope.DataExchangeFactory); - map.Id = statement.Id + "-InLineParameterMap"; - if (statement.ParameterClass!=null) - { - map.Class = statement.ParameterClass; - } - map.Initialize(_configScope.DataSource.DbProvider.UsePositionalParameters,_configScope); - if (statement.ParameterClass==null && - sqlText.Parameters.Length==1 && sqlText.Parameters[0].PropertyName=="value")//#value# parameter with no parameterClass attribut - { - map.DataExchange = _configScope.DataExchangeFactory.GetDataExchangeForClass( typeof(int) );//Get the primitiveDataExchange - } - statement.ParameterMap = map; - - int lenght = sqlText.Parameters.Length; - for(int index=0;index - /// Initialize the list of variables defined in the - /// properties file. - ///
    - private void ParseGlobalProperties() - { - XmlNode nodeProperties = _configScope.NodeContext.SelectSingleNode( ApplyDataMapperNamespacePrefix(XML_PROPERTIES), _configScope.XmlNamespaceManager); - _configScope.ErrorContext.Activity = "loading global properties"; - - if (nodeProperties != null) - { - if (nodeProperties.HasChildNodes) - { - foreach (XmlNode propertyNode in nodeProperties.SelectNodes( ApplyDataMapperNamespacePrefix(XML_PROPERTY), _configScope.XmlNamespaceManager)) - { - XmlAttribute keyAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB]; - XmlAttribute valueAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB]; - - if ( keyAttrib != null && valueAttrib!=null) - { - _configScope.Properties.Add( keyAttrib.Value, valueAttrib.Value); - - if (_logger.IsDebugEnabled) - { - _logger.Debug( string.Format("Add property \"{0}\" value \"{1}\"",keyAttrib.Value,valueAttrib.Value) ); - } - } - else - { - // Load the file defined by the attribute - XmlDocument propertiesConfig = Resources.GetAsXmlDocument(propertyNode, _configScope.Properties); - - foreach (XmlNode node in propertiesConfig.SelectNodes( XML_GLOBAL_PROPERTIES, _configScope.XmlNamespaceManager)) - { - _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; - - if (_logger.IsDebugEnabled) - { - _logger.Debug( string.Format("Add property \"{0}\" value \"{1}\"",node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value,node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value) ); - } - } - } - } - } - else - { - // JIRA-38 Fix - // element's InnerXml is currently an empty string anyway - // since are in properties file - - _configScope.ErrorContext.Resource = nodeProperties.OuterXml.ToString(); - - // Load the file defined by the attribute - XmlDocument propertiesConfig = Resources.GetAsXmlDocument(nodeProperties, _configScope.Properties); - - foreach (XmlNode node in propertiesConfig.SelectNodes( XML_SETTINGS_ADD ) ) - { - _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; - - if (_logger.IsDebugEnabled) - { - _logger.Debug( string.Format("Add property \"{0}\" value \"{1}\"",node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value,node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value) ); - } - } - } - } - _configScope.ErrorContext.Reset(); - } - - - - /// - /// Generate the command text for CRUD operation - /// - /// - /// - private void GenerateCommandText(ConfigurationScope configScope, IStatement statement) - { - string generatedSQL; - - //------ Build SQL CommandText - generatedSQL = SqlGenerator.BuildQuery(statement); - - ISql sql = new StaticSql(configScope, statement); - ISqlMapSession session = new SqlMapSession(configScope.SqlMapper); - - ((StaticSql)sql).BuildPreparedStatement( session, generatedSQL ); - statement.Sql = sql; - } - - - /// - /// Build a ParameterMap - /// - private void BuildParameterMap() - { - ParameterMap parameterMap; - XmlNode parameterMapNode = _configScope.NodeContext; - - _configScope.ErrorContext.MoreInfo = "build ParameterMap"; - - // Get the parameterMap id - string id = _configScope.ApplyNamespace((parameterMapNode.Attributes.GetNamedItem("id")).Value); - _configScope.ErrorContext.ObjectId = id; - - // Did we already process it ? - if (_configScope.SqlMapper.ParameterMaps.Contains( id ) == false) - { - parameterMap = ParameterMapDeSerializer.Deserialize(parameterMapNode, _configScope); - - parameterMap.Id = _configScope.ApplyNamespace(parameterMap.Id); - string attributeExtendMap = parameterMap.ExtendMap; - parameterMap.ExtendMap = _configScope.ApplyNamespace(parameterMap.ExtendMap); - - if (parameterMap.ExtendMap.Length >0) - { - ParameterMap superMap; - // Did we already build Extend ParameterMap ? - if (_configScope.SqlMapper.ParameterMaps.Contains( parameterMap.ExtendMap ) == false) - { - XmlNode superNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_PARAMETER) + attributeExtendMap + "']", _configScope.XmlNamespaceManager); - - if (superNode != null) - { - _configScope.ErrorContext.MoreInfo = "Build parent ParameterMap"; - _configScope.NodeContext = superNode; - BuildParameterMap(); - superMap = _configScope.SqlMapper.GetParameterMap( parameterMap.ExtendMap ); - } - else - { - throw new ConfigurationException("In mapping file '"+ _configScope.SqlMapNamespace +"' the parameterMap '"+parameterMap.Id+"' can not resolve extends attribute '"+parameterMap.ExtendMap+"'"); - } - } - else - { - superMap = _configScope.SqlMapper.GetParameterMap( parameterMap.ExtendMap ); - } - // Add extends property - int index = 0; - - foreach(string propertyName in superMap.GetPropertyNameArray()) - { - ParameterProperty property = superMap.GetProperty(propertyName).Clone(); - property.Initialize(_configScope, parameterMap.Class); - parameterMap.InsertParameterProperty(index, property); - index++; - } - } - _configScope.SqlMapper.AddParameterMap( parameterMap ); - } - } - - - /// - /// Build a ResultMap - /// - private void BuildResultMap() - { - ResultMap resultMap; - XmlNode resultMapNode = _configScope.NodeContext; - - _configScope.ErrorContext.MoreInfo = "build ResultMap"; - - string id = _configScope.ApplyNamespace((resultMapNode.Attributes.GetNamedItem("id")).Value); - _configScope.ErrorContext.ObjectId = id; - - // Did we alredy process it - if (_configScope.SqlMapper.ResultMaps.Contains( id ) == false) - { - resultMap = ResultMapDeSerializer.Deserialize( resultMapNode, _configScope ); - - string attributeExtendMap = resultMap.ExtendMap; - resultMap.ExtendMap = _configScope.ApplyNamespace(resultMap.ExtendMap); - - if (resultMap.ExtendMap!=null && resultMap.ExtendMap.Length >0) - { - IResultMap superMap = null; - // Did we already build Extend ResultMap? - if (_configScope.SqlMapper.ResultMaps.Contains( resultMap.ExtendMap ) == false) - { - XmlNode superNode = _configScope.SqlMapDocument.SelectSingleNode( ApplyMappingNamespacePrefix(XML_SEARCH_RESULTMAP)+ attributeExtendMap +"']", _configScope.XmlNamespaceManager); - - if (superNode != null) - { - _configScope.ErrorContext.MoreInfo = "Build parent ResultMap"; - _configScope.NodeContext = superNode; - BuildResultMap(); - superMap = _configScope.SqlMapper.GetResultMap( resultMap.ExtendMap ); - } - else - { - throw new ConfigurationException("In mapping file '"+_configScope.SqlMapNamespace+"' the resultMap '"+resultMap.Id+"' can not resolve extends attribute '"+resultMap.ExtendMap+"'" ); - } - } - else - { - superMap = _configScope.SqlMapper.GetResultMap( resultMap.ExtendMap ); - } - - // Add parent property - for(int index=0; index< superMap.Properties.Count; index++) - { - ResultProperty property = superMap.Properties[index].Clone(); - property.Initialize(_configScope, resultMap.Class); - resultMap.Properties.Add(property); - } - // Add groupBy properties - if (resultMap.GroupByPropertyNames.Count == 0) - { - for(int i=0; i0) - { - resultMap.SetObjectFactory(_configScope); - } - } - - - // Verify that that each groupBy element correspond to a class member - // of one of result property - for (int i = 0; i < resultMap.GroupByPropertyNames.Count; i++) - { - string memberName = resultMap.GroupByPropertyNames[i]; - if (!resultMap.Properties.Contains(memberName)) - { - throw new ConfigurationException( - string.Format( - "Could not configure ResultMap named \"{0}\". Check the groupBy attribute. Cause: there's no result property named \"{1}\".", - resultMap.Id, memberName)); - } - } - } - resultMap.InitializeGroupByProperties(); - _configScope.SqlMapper.AddResultMap( resultMap ); - } - } - - - /// - /// Gets a resource stream. - /// - /// The schema resource key. - /// A resource stream. - public Stream GetStream( string schemaResourceKey ) - { - return Assembly.GetExecutingAssembly().GetManifestResourceStream("IBatisNet.DataMapper." + schemaResourceKey); - } - - - /// - /// Apply the dataMapper namespace prefix - /// - /// - /// - public string ApplyDataMapperNamespacePrefix( string elementName ) - { - return DATAMAPPER_NAMESPACE_PREFIX+ ":" + elementName. - Replace("/","/"+DATAMAPPER_NAMESPACE_PREFIX+":"); - } - - /// - /// Apply the provider namespace prefix - /// - /// - /// - public string ApplyProviderNamespacePrefix( string elementName ) - { - return PROVIDERS_NAMESPACE_PREFIX+ ":" + elementName. - Replace("/","/"+PROVIDERS_NAMESPACE_PREFIX+":"); - } - - /// - /// Apply the module namespace prefix - /// - /// - /// - public static string ApplyModuleNamespacePrefix( string elementName ) - { - return MODULE_NAMESPACE_PREFIX+ ":" + elementName. - Replace("/", "/" + MODULE_NAMESPACE_PREFIX + ":"); - } - /// - /// Apply the module namespace prefix - /// - /// - /// - public static string ApplyMappingNamespacePrefix(string elementName) - { - return MAPPING_NAMESPACE_PREFIX + ":" + elementName. - Replace("/", "/" + MAPPING_NAMESPACE_PREFIX + ":"); - } - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/InlineParameterMapParser.cs b/src/IBatisNet.DataMapper/Configuration/ParameterMapping/InlineParameterMapParser.cs deleted file mode 100644 index 8f890cc..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/InlineParameterMapParser.cs +++ /dev/null @@ -1,379 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408099 $ - * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.Text; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping -{ - /// - /// Summary description for InlineParameterMapParser. - /// - internal class InlineParameterMapParser - { - - #region Fields - - private const string PARAMETER_TOKEN = "#"; - private const string PARAM_DELIM = ":"; - - #endregion - - #region Constructors - - /// - /// Constructor - /// - public InlineParameterMapParser() - { - } - #endregion - - /// - /// Parse Inline ParameterMap - /// - /// - /// - /// A new sql command text. - /// - public SqlText ParseInlineParameterMap(IScope scope, IStatement statement, string sqlStatement) - { - string newSql = sqlStatement; - ArrayList mappingList = new ArrayList(); - Type parameterClassType = null; - - if (statement != null) - { - parameterClassType = statement.ParameterClass; - } - - StringTokenizer parser = new StringTokenizer(sqlStatement, PARAMETER_TOKEN, true); - StringBuilder newSqlBuffer = new StringBuilder(); - - string token = null; - string lastToken = null; - - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - - if (PARAMETER_TOKEN.Equals(lastToken)) - { - if (PARAMETER_TOKEN.Equals(token)) - { - newSqlBuffer.Append(PARAMETER_TOKEN); - token = null; - } - else - { - ParameterProperty mapping = null; - if (token.IndexOf(PARAM_DELIM) > -1) - { - mapping = OldParseMapping(token, parameterClassType, scope); - } - else - { - mapping = NewParseMapping(token, parameterClassType, scope); - } - - mappingList.Add(mapping); - newSqlBuffer.Append("? "); - - enumerator.MoveNext(); - token = (string)enumerator.Current; - if (!PARAMETER_TOKEN.Equals(token)) - { - throw new DataMapperException("Unterminated inline parameter in mapped statement (" + statement.Id + ")."); - } - token = null; - } - } - else - { - if (!PARAMETER_TOKEN.Equals(token)) - { - newSqlBuffer.Append(token); - } - } - - lastToken = token; - } - - newSql = newSqlBuffer.ToString(); - - ParameterProperty[] mappingArray = (ParameterProperty[]) mappingList.ToArray(typeof(ParameterProperty)); - - SqlText sqlText = new SqlText(); - sqlText.Text = newSql; - sqlText.Parameters = mappingArray; - - return sqlText; - } - - - /// - /// Parse inline parameter with syntax as - /// #propertyName,type=string,dbype=Varchar,direction=Input,nullValue=N/A,handler=string# - /// - /// - /// - /// - /// - private ParameterProperty NewParseMapping(string token, Type parameterClassType, IScope scope) - { - ParameterProperty mapping = new ParameterProperty(); - - StringTokenizer paramParser = new StringTokenizer(token, "=,", false); - IEnumerator enumeratorParam = paramParser.GetEnumerator(); - - enumeratorParam.MoveNext(); - - mapping.PropertyName = ((string)enumeratorParam.Current).Trim(); - - while (enumeratorParam.MoveNext()) - { - string field = (string)enumeratorParam.Current; - if (enumeratorParam.MoveNext()) - { - string value = (string)enumeratorParam.Current; - if ("type".Equals(field)) - { - mapping.CLRType = value; - } - else if ("dbType".Equals(field)) - { - mapping.DbType = value; - } - else if ("direction".Equals(field)) - { - mapping.DirectionAttribute = value; - } - else if ("nullValue".Equals(field)) - { - mapping.NullValue = value; - } - else if ("handler".Equals(field)) - { - mapping.CallBackName = value; - } - else - { - throw new DataMapperException("Unrecognized parameter mapping field: '" + field + "' in " + token); - } - } - else - { - throw new DataMapperException("Incorrect inline parameter map format (missmatched name=value pairs): " + token); - } - } - - if (mapping.CallBackName.Length >0) - { - mapping.Initialize( scope, parameterClassType ); - } - else - { - ITypeHandler handler = null; - if (parameterClassType == null) - { - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else - { - handler = ResolveTypeHandler( scope.DataExchangeFactory.TypeHandlerFactory, - parameterClassType, mapping.PropertyName, - mapping.CLRType, mapping.DbType ); - } - mapping.TypeHandler = handler; - mapping.Initialize( scope, parameterClassType ); - } - - return mapping; - } - - - /// - /// Parse inline parameter with syntax as - /// #propertyName:dbType:nullValue# - /// - /// - /// - /// - /// - private ParameterProperty OldParseMapping(string token, Type parameterClassType, IScope scope) - { - ParameterProperty mapping = new ParameterProperty(); - - if (token.IndexOf(PARAM_DELIM) > -1) - { - StringTokenizer paramParser = new StringTokenizer(token, PARAM_DELIM, true); - IEnumerator enumeratorParam = paramParser.GetEnumerator(); - - int n1 = paramParser.TokenNumber; - if (n1 == 3) - { - enumeratorParam.MoveNext(); - string propertyName = ((string)enumeratorParam.Current).Trim(); - mapping.PropertyName = propertyName; - - enumeratorParam.MoveNext(); - enumeratorParam.MoveNext(); //ignore ":" - string dBType = ((string)enumeratorParam.Current).Trim(); - mapping.DbType = dBType; - - ITypeHandler handler = null; - if (parameterClassType == null) - { - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else - { - handler = ResolveTypeHandler(scope.DataExchangeFactory.TypeHandlerFactory, parameterClassType, propertyName, null, dBType); - } - mapping.TypeHandler = handler; - mapping.Initialize( scope, parameterClassType ); - } - else if (n1 >= 5) - { - enumeratorParam.MoveNext(); - string propertyName = ((string)enumeratorParam.Current).Trim(); - enumeratorParam.MoveNext(); - enumeratorParam.MoveNext(); //ignore ":" - string dBType = ((string)enumeratorParam.Current).Trim(); - enumeratorParam.MoveNext(); - enumeratorParam.MoveNext(); //ignore ":" - string nullValue = ((string)enumeratorParam.Current).Trim(); - while (enumeratorParam.MoveNext()) - { - nullValue = nullValue + ((string)enumeratorParam.Current).Trim(); - } - - mapping.PropertyName = propertyName; - mapping.DbType = dBType; - mapping.NullValue = nullValue; - ITypeHandler handler = null; - if (parameterClassType == null) - { - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else - { - handler = ResolveTypeHandler(scope.DataExchangeFactory.TypeHandlerFactory, parameterClassType, propertyName, null, dBType); - } - mapping.TypeHandler = handler; - mapping.Initialize( scope, parameterClassType ); - } - else - { - throw new ConfigurationException("Incorrect inline parameter map format: " + token); - } - } - else - { - mapping.PropertyName = token; - ITypeHandler handler = null; - if (parameterClassType == null) - { - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else - { - handler = ResolveTypeHandler(scope.DataExchangeFactory.TypeHandlerFactory, parameterClassType, token, null, null); - } - mapping.TypeHandler = handler; - mapping.Initialize( scope, parameterClassType ); - } - return mapping; - } - - - /// - /// Resolve TypeHandler - /// - /// - /// - /// - /// - /// - /// - private ITypeHandler ResolveTypeHandler(TypeHandlerFactory typeHandlerFactory, - Type parameterClassType, string propertyName, - string propertyType, string dbType) - { - ITypeHandler handler = null; - - if (parameterClassType == null) - { - handler = typeHandlerFactory.GetUnkownTypeHandler(); - } - else if (typeof(IDictionary).IsAssignableFrom(parameterClassType)) - { - if (propertyType == null || propertyType.Length==0) - { - handler = typeHandlerFactory.GetUnkownTypeHandler(); - } - else - { - try - { - Type typeClass = TypeUtils.ResolveType(propertyType); - handler = typeHandlerFactory.GetTypeHandler(typeClass, dbType); - } - catch (Exception e) - { - throw new ConfigurationException("Error. Could not set TypeHandler. Cause: " + e.Message, e); - } - } - } - else if (typeHandlerFactory.GetTypeHandler(parameterClassType, dbType) != null) - { - handler = typeHandlerFactory.GetTypeHandler(parameterClassType, dbType); - } - else - { - Type typeClass = ObjectProbe.GetMemberTypeForGetter(parameterClassType, propertyName); - handler = typeHandlerFactory.GetTypeHandler(typeClass, dbType); - } - - return handler; - } - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterMap.cs b/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterMap.cs deleted file mode 100644 index 1484521..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterMap.cs +++ /dev/null @@ -1,364 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 575902 $ - * $Date: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.Data; -using System.Reflection; -using System.Xml; -using System.Xml.Serialization; -using IBatisNet.Common.Logging; -using IBatisNet.DataMapper.Configuration.Serializers; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping -{ - /// - /// Summary description for ParameterMap. - /// - [Serializable] - [XmlRoot("parameterMap", Namespace="http://ibatis.apache.org/mapping")] - public class ParameterMap - { - /// - /// Token for xml path to parameter elements. - /// - private const string XML_PARAMATER = "parameter"; - - #region private - private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - - [NonSerialized] - private string _id = string.Empty; - [NonSerialized] - // Properties list - private ParameterPropertyCollection _properties = new ParameterPropertyCollection(); - // Same list as _properties but without doubled (Test UpdateAccountViaParameterMap2) - [NonSerialized] - private ParameterPropertyCollection _propertiesList = new ParameterPropertyCollection(); - //(property Name, property) - [NonSerialized] - private Hashtable _propertiesMap = new Hashtable(); // Corrected ?? Support Request 1043181, move to HashTable - [NonSerialized] - private string _extendMap = string.Empty; - [NonSerialized] - private bool _usePositionalParameters =false; - [NonSerialized] - private string _className = string.Empty; - [NonSerialized] - private Type _parameterClass = null; - [NonSerialized] - private DataExchangeFactory _dataExchangeFactory = null; - [NonSerialized] - private IDataExchange _dataExchange = null; - #endregion - - #region Properties - /// - /// The parameter class name. - /// - [XmlAttribute("class")] - public string ClassName - { - get { return _className; } - set - { - if (_logger.IsInfoEnabled) - { - if ((value == null) || (value.Length < 1)) - { - _logger.Info("The class attribute is recommended for better performance in a ParameterMap tag '"+_id+"'."); - } - } - - - _className = value; - } - } - - /// - /// The parameter type class. - /// - [XmlIgnore] - public Type Class - { - set { _parameterClass = value; } - get { return _parameterClass; } - } - - /// - /// Identifier used to identify the ParameterMap amongst the others. - /// - [XmlAttribute("id")] - public string Id - { - get { return _id; } - set - { - if ((value == null) || (value.Length < 1)) - throw new ArgumentNullException("The id attribute is mandatory in a ParameterMap tag."); - - _id = value; - } - } - - - /// - /// The collection of ParameterProperty - /// - [XmlIgnore] - public ParameterPropertyCollection Properties - { - get { return _properties; } - } - - /// - /// - /// - [XmlIgnore] - public ParameterPropertyCollection PropertiesList - { - get { return _propertiesList; } - } - - /// - /// Extend Parametermap attribute - /// - /// The id of a ParameterMap - [XmlAttribute("extends")] - public string ExtendMap - { - get { return _extendMap; } - set { _extendMap = value; } - } - - /// - /// Sets the IDataExchange - /// - [XmlIgnore] - public IDataExchange DataExchange - { - set { _dataExchange = value; } - } - #endregion - - #region Constructor (s) / Destructor - - /// - /// Do not use direclty, only for serialization. - /// - /// - public ParameterMap(DataExchangeFactory dataExchangeFactory) - { - _dataExchangeFactory = dataExchangeFactory; - } - - #endregion - - #region Methods - /// - /// Get the ParameterProperty at index. - /// - /// Index - /// A ParameterProperty - public ParameterProperty GetProperty(int index) - { - if (_usePositionalParameters) //obdc/oledb - { - return _properties[index]; - } - else - { - return _propertiesList[index]; - } - } - - /// - /// Get a ParameterProperty by his name. - /// - /// The name of the ParameterProperty - /// A ParameterProperty - public ParameterProperty GetProperty(string name) - { - return (ParameterProperty)_propertiesMap[name]; - } - - - /// - /// Add a ParameterProperty to the ParameterProperty list. - /// - /// - public void AddParameterProperty(ParameterProperty property) - { - // These mappings will replace any mappings that this map - // had for any of the keys currently in the specified map. - _propertiesMap[property.PropertyName] = property; - _properties.Add( property ); - - if (_propertiesList.Contains(property) == false) - { - _propertiesList.Add( property ); - } - } - - /// - /// Insert a ParameterProperty ine the ParameterProperty list at the specified index.. - /// - /// - /// The zero-based index at which ParameterProperty should be inserted. - /// - /// The ParameterProperty to insert. - public void InsertParameterProperty(int index, ParameterProperty property) - { - // These mappings will replace any mappings that this map - // had for any of the keys currently in the specified map. - _propertiesMap[property.PropertyName] = property; - _properties.Insert( index, property ); - - if (_propertiesList.Contains(property) == false) - { - _propertiesList.Insert( index, property ); - } - } - - /// - /// Retrieve the index for array property - /// - /// - /// - public int GetParameterIndex(string propertyName) - { - int idx = -1; - //idx = (Integer) parameterMappingIndex.get(propertyName); - idx = Convert.ToInt32(propertyName.Replace("[","").Replace("]","")); - return idx; - } - - - /// - /// Get all Parameter Property Name - /// - /// A string array - public string[] GetPropertyNameArray() - { - string[] propertyNameArray = new string[_propertiesMap.Count]; - - for (int index=0;index<_propertiesList.Count;index++) - { - propertyNameArray[index] = _propertiesList[index].PropertyName; - } - return propertyNameArray; - } - - - /// - /// Set parameter value, replace the null value if any. - /// - /// - /// - /// - public void SetParameter(ParameterProperty mapping, IDataParameter dataParameter, object parameterValue) - { - object value = _dataExchange.GetData(mapping, parameterValue); - - ITypeHandler typeHandler = mapping.TypeHandler; - - // Apply Null Value - if (mapping.HasNullValue) - { - if (typeHandler.Equals(value, mapping.NullValue)) - { - value = null; - } - } - - typeHandler.SetParameter(dataParameter, value, mapping.DbType); - } - - /// - /// Set output parameter value. - /// - /// - /// - /// - public void SetOutputParameter(ref object target, ParameterProperty mapping, object dataBaseValue ) - { - _dataExchange.SetData(ref target, mapping, dataBaseValue); - } - - #region Configuration - - /// - /// Initialize the parameter properties child. - /// - /// - /// - public void Initialize(bool usePositionalParameters, IScope scope) - { - _usePositionalParameters = usePositionalParameters; - if (_className.Length>0 ) - { - _parameterClass = _dataExchangeFactory.TypeHandlerFactory.GetType(_className); - _dataExchange = _dataExchangeFactory.GetDataExchangeForClass(_parameterClass); - } - else - { - // Get the ComplexDataExchange - _dataExchange = _dataExchangeFactory.GetDataExchangeForClass(null); - } - } - - - /// - /// Get the parameter properties child for the xmlNode parameter. - /// - /// - public void BuildProperties(ConfigurationScope configScope) - { - ParameterProperty property = null; - - foreach (XmlNode parameterNode in configScope.NodeContext.SelectNodes(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_PARAMATER), configScope.XmlNamespaceManager)) - { - property = ParameterPropertyDeSerializer.Deserialize(parameterNode, configScope); - - property.Initialize(configScope, _parameterClass); - - AddParameterProperty(property); - } - } - - #endregion - - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterProperty.cs b/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterProperty.cs deleted file mode 100644 index 1b315c2..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterProperty.cs +++ /dev/null @@ -1,408 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 575902 $ - * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.Data; -using System.Reflection; -using System.Xml.Serialization; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping -{ - /// - /// Summary description for ParameterProperty. - /// - [Serializable] - [XmlRoot("parameter", Namespace="http://ibatis.apache.org/mapping")] - public class ParameterProperty - { - - #region Fields - [NonSerialized] - private string _nullValue = null;//string.Empty;//null; - [NonSerialized] - private string _propertyName = string.Empty; - [NonSerialized] - private ParameterDirection _direction = ParameterDirection.Input; - [NonSerialized] - private string _directionAttribute = string.Empty; - [NonSerialized] - private string _dbType = null; - [NonSerialized] - private int _size = -1; - [NonSerialized] - private byte _scale= 0; - [NonSerialized] - private byte _precision = 0; - [NonSerialized] - private string _columnName = string.Empty; // used only for store procedure - [NonSerialized] - private ITypeHandler _typeHandler = null; - [NonSerialized] - private string _clrType = string.Empty; - [NonSerialized] - private string _callBackName= string.Empty; - [NonSerialized] - private IGetAccessor _getAccessor = null; - [NonSerialized] - private bool _isComplexMemberName = false; - - #endregion - - #region Properties - - /// - /// Indicate if we have a complex member name as [avouriteLineItem.Id] - /// - public bool IsComplexMemberName - { - get { return _isComplexMemberName; } - } - - /// - /// Specify the custom type handlers to used. - /// - /// Will be an alias to a class wchic implement ITypeHandlerCallback - [XmlAttribute("typeHandler")] - public string CallBackName - { - get { return _callBackName; } - set { _callBackName = value; } - } - - /// - /// Specify the CLR type of the parameter. - /// - /// - /// The type attribute is used to explicitly specify the property type to be read. - /// Normally this can be derived from a property through reflection, but certain mappings such as - /// HashTable cannot provide the type to the framework. - /// - [XmlAttribute("type")] - public string CLRType - { - get { return _clrType; } - set { _clrType = value; } - } - - /// - /// The typeHandler used to work with the parameter. - /// - [XmlIgnore] - public ITypeHandler TypeHandler - { - get { return _typeHandler; } - set { _typeHandler = value; } - } - - /// - /// Column Name for output parameter - /// in store proccedure. - /// - [XmlAttribute("column")] - public string ColumnName - { - get { return _columnName; } - set { _columnName = value; } - } - - /// - /// Column size. - /// - [XmlAttribute("size")] - public int Size - { - get { return _size; } - set { _size = value; } - } - - /// - /// Column Scale. - /// - [XmlAttribute("scale")] - public byte Scale - { - get { return _scale; } - set { _scale = value; } - } - - /// - /// Column Precision. - /// - [XmlAttribute("precision")] - public byte Precision - { - get { return _precision; } - set { _precision = value; } - } - /// - /// Give an entry in the 'DbType' enumeration - /// - /// - /// For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... - ///
    - /// For Oracle, give an OracleType Enumeration : Byte, Int16, Number... - ///
    - [XmlAttribute("dbType")] - public string DbType - { - get { return _dbType; } - set { _dbType = value; } - } - - /// - /// The direction attribute of the XML parameter. - /// - /// Input, Output, InputOutput - [XmlAttribute("direction")] - public string DirectionAttribute - { - get { return _directionAttribute; } - set { _directionAttribute = value; } - } - - /// - /// Indicate the direction of the parameter. - /// - /// Input, Output, InputOutput - [XmlIgnore] - public ParameterDirection Direction - { - get { return _direction; } - set - { - _direction = value; - _directionAttribute = _direction.ToString(); - } - } - - /// - /// Property name used to identify the property amongst the others. - /// - /// EmailAddress - [XmlAttribute("property")] - public string PropertyName - { - get { return _propertyName; } - set - { - if ((value == null) || (value.Length < 1)) - throw new ArgumentNullException("The property attribute is mandatory in a paremeter property."); - - _propertyName = value; - if (_propertyName.IndexOf('.')<0) - { - _isComplexMemberName = false; - } - else // complex member name FavouriteLineItem.Id - { - _isComplexMemberName = true; - } - } - } - - /// - /// Tell if a nullValue is defined._nullValue!=null - /// - [XmlIgnore] - public bool HasNullValue - { - get { return (_nullValue!=null); } - } - - /// - /// Null value replacement. - /// - /// "no_email@provided.com" - [XmlAttribute("nullValue")] - public string NullValue - { - get { return _nullValue; } - set { _nullValue = value; } - } - - /// - /// Defines a field/property get accessor - /// - [XmlIgnore] - public IGetAccessor GetAccessor - { - get { return _getAccessor; } - } - - #endregion - - #region Methods - - /// - /// Initializes the parameter property - /// - /// The scope. - /// The parameter class. - public void Initialize(IScope scope, Type parameterClass) - { - - if(_directionAttribute.Length >0) - { - _direction = (ParameterDirection)Enum.Parse( typeof(ParameterDirection), _directionAttribute, true ); - } - - if (!typeof(IDictionary).IsAssignableFrom(parameterClass) // Hashtable parameter map - && parameterClass !=null // value property - && !scope.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(parameterClass) ) // value property - { - if (!_isComplexMemberName) - { - IGetAccessorFactory getAccessorFactory = scope.DataExchangeFactory.AccessorFactory.GetAccessorFactory; - _getAccessor = getAccessorFactory.CreateGetAccessor(parameterClass, _propertyName); - } - else // complex member name FavouriteLineItem.Id - { - string memberName = _propertyName.Substring( _propertyName.LastIndexOf('.')+1); - string parentName = _propertyName.Substring(0,_propertyName.LastIndexOf('.')); - Type parentType = ObjectProbe.GetMemberTypeForGetter(parameterClass, parentName); - - IGetAccessorFactory getAccessorFactory = scope.DataExchangeFactory.AccessorFactory.GetAccessorFactory; - _getAccessor = getAccessorFactory.CreateGetAccessor(parentType, memberName); - } - } - - scope.ErrorContext.MoreInfo = "Check the parameter mapping typeHandler attribute '" + this.CallBackName + "' (must be a ITypeHandlerCallback implementation)."; - if (this.CallBackName.Length >0) - { - try - { - Type type = scope.DataExchangeFactory.TypeHandlerFactory.GetType(this.CallBackName); - ITypeHandlerCallback typeHandlerCallback = (ITypeHandlerCallback) Activator.CreateInstance( type ); - _typeHandler = new CustomTypeHandler(typeHandlerCallback); - } - catch (Exception e) - { - throw new ConfigurationException("Error occurred during custom type handler configuration. Cause: " + e.Message, e); - } - } - else - { - if (this.CLRType.Length == 0 ) // Unknown - { - if (_getAccessor!= null && - scope.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(_getAccessor.MemberType)) - { - // Primitive - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(_getAccessor.MemberType, _dbType); - } - else - { - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - } - else // If we specify a CLR type, use it - { - Type type = TypeUtils.ResolveType(this.CLRType); - - if (scope.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(type)) - { - // Primitive - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, _dbType); - } - else - { - // .NET object - type = ObjectProbe.GetMemberTypeForGetter(type, this.PropertyName); - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, _dbType); - } - } - } - } - - - - - /// - /// Determines whether the specified is equal to the current . - /// - /// The to compare with the current . - /// - /// true if the specified is equal to the current ; otherwise, false. - /// - public override bool Equals(object obj) - { - //Check for null and compare run-time types. - if (obj == null || GetType() != obj.GetType()) return false; - ParameterProperty p = (ParameterProperty)obj; - return (this.PropertyName == p.PropertyName); - } - - - /// - /// Serves as a hash function for a particular type. is suitable for use in hashing algorithms and data structures like a hash table. - /// - /// - /// A hash code for the current . - /// - public override int GetHashCode() - { - return _propertyName.GetHashCode(); - } - #endregion - - #region ICloneable Members - - /// - /// Clones this instance. - /// - /// An - public ParameterProperty Clone() - { - ParameterProperty property = new ParameterProperty(); - - property.CallBackName = this.CallBackName; - property.CLRType = this.CLRType; - property.ColumnName = this.ColumnName; - property.DbType = this.DbType; - property.DirectionAttribute = this.DirectionAttribute; - property.NullValue = this.NullValue; - property.PropertyName = this.PropertyName; - property.Precision = this.Precision; - property.Scale = this.Scale; - property.Size = this.Size; - - return property; - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterPropertyCollection.cs b/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterPropertyCollection.cs deleted file mode 100644 index 03b12bf..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ParameterMapping/ParameterPropertyCollection.cs +++ /dev/null @@ -1,252 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping -{ - /// - /// A ParameterProperty Collection. - /// - public class ParameterPropertyCollection - { - private const int DEFAULT_CAPACITY = 4; - private const int CAPACITY_MULTIPLIER = 2; - private int _count = 0; - private ParameterProperty[] _innerList = null; - - - /// - /// Read-only property describing how many elements are in the Collection. - /// - public int Count - { - get { return _count; } - } - - - /// - /// Constructs a ParameterProperty collection. The list is initially empty and has a capacity - /// of zero. Upon adding the first element to the list the capacity is - /// increased to 8, and then increased in multiples of two as required. - /// - public ParameterPropertyCollection() - { - _innerList = new ParameterProperty[DEFAULT_CAPACITY]; - _count = 0; - } - - /// - /// Constructs a ParameterPropertyCollection with a given initial capacity. - /// The list is initially empty, but will have room for the given number of elements - /// before any reallocations are required. - /// - /// The initial capacity of the list - public ParameterPropertyCollection(int capacity) - { - if (capacity < 0) - { - throw new ArgumentOutOfRangeException("Capacity", "The size of the list must be >0."); - } - _innerList = new ParameterProperty[capacity]; - } - - /// - /// Length of the collection - /// - public int Length - { - get{ return _innerList.Length; } - } - - - /// - /// Sets or Gets the ParameterProperty at the given index. - /// - public ParameterProperty this[int index] - { - get - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - return _innerList[index]; - } - set - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - _innerList[index] = value; - } - } - - - /// - /// Add an ParameterProperty - /// - /// - /// Index - public int Add(ParameterProperty value) - { - Resize(_count + 1); - int index = _count++; - _innerList[index] = value; - - return index; - } - - - /// - /// Add a list of ParameterProperty to the collection - /// - /// - public void AddRange(ParameterProperty[] value) - { - for (int i = 0; i < value.Length; i++) - { - Add(value[i]); - } - } - - - /// - /// Add a list of ParameterProperty to the collection - /// - /// - public void AddRange(ParameterPropertyCollection value) - { - for (int i = 0; i < value.Count; i++) - { - Add(value[i]); - } - } - - - /// - /// Indicate if a ParameterProperty is in the collection - /// - /// A ParameterProperty - /// True fi is in - public bool Contains(ParameterProperty value) - { - for (int i = 0; i < _count; i++) - { - if(_innerList[i].PropertyName==value.PropertyName) - { - return true; - } - } - return false; - } - - - /// - /// Insert a ParameterProperty in the collection. - /// - /// Index where to insert. - /// A ParameterProperty - public void Insert(int index, ParameterProperty value) - { - if (index < 0 || index > _count) - { - throw new ArgumentOutOfRangeException("index"); - } - - Resize(_count + 1); - Array.Copy(_innerList, index, _innerList, index + 1, _count - index); - _innerList[index] = value; - _count++; - } - - - /// - /// Remove a ParameterProperty of the collection. - /// - public void Remove(ParameterProperty value) - { - for(int i = 0; i < _count; i++) - { - if(_innerList[i].PropertyName==value.PropertyName) - { - RemoveAt(i); - return; - } - } - - } - - /// - /// Removes a ParameterProperty at the given index. The size of the list is - /// decreased by one. - /// - /// - public void RemoveAt(int index) - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - - int remaining = _count - index - 1; - - if (remaining > 0) - { - Array.Copy(_innerList, index + 1, _innerList, index, remaining); - } - - _count--; - _innerList[_count] = null; - } - - /// - /// Ensures that the capacity of this collection is at least the given minimum - /// value. If the currect capacity of the list is less than min, the - /// capacity is increased to twice the current capacity. - /// - /// - private void Resize(int minSize) - { - int oldSize = _innerList.Length; - - if (minSize > oldSize) - { - ParameterProperty[] oldEntries = _innerList; - int newSize = oldEntries.Length * CAPACITY_MULTIPLIER; - - if (newSize < minSize) - { - newSize = minSize; - } - _innerList = new ParameterProperty[newSize]; - Array.Copy(oldEntries, 0, _innerList, 0, _count); - } - } - } - -} - diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ArgumentProperty.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/ArgumentProperty.cs deleted file mode 100644 index c9bf07a..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ArgumentProperty.cs +++ /dev/null @@ -1,244 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -#if dotnet2 -using System.Configuration; -#endif -using System.Reflection; -using System.Xml.Serialization; - -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; - -#endregion - - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Summary description for ArgumentProperty. - /// - [Serializable] - [XmlRoot("argument", Namespace="http://ibatis.apache.org/mapping")] - public class ArgumentProperty : ResultProperty - { - - #region Fields - [NonSerialized] - private string _argumentName = string.Empty; - [NonSerialized] - private Type _argumentType = null; - [NonSerialized] - private IArgumentStrategy _argumentStrategy = null; - #endregion - - #region Properties - - /// - /// Sets or gets the used to fill the object property. - /// - [XmlIgnore] - public override IArgumentStrategy ArgumentStrategy - { - set { _argumentStrategy = value ; } - get { return _argumentStrategy ; } - } - - /// - /// Specify the constructor argument name. - /// - [XmlAttribute("argumentName")] - public string ArgumentName - { - get { return _argumentName; } - set - { - if ((value == null) || (value.Length < 1)) - { - throw new ArgumentNullException("The name attribute is mandatory in a argument tag."); - } - _argumentName = value; - } - } - - /// - /// Tell us if we must lazy load this property.. - /// - [XmlAttribute("lazyLoad")] - public override bool IsLazyLoad - { - get { return false; } - set { throw new InvalidOperationException("Argument property cannot be lazy load."); } - } - - /// - /// Get the argument type - /// - [XmlIgnore] - public override Type MemberType - { - get { return _argumentType; } - } - - #endregion - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public ArgumentProperty() - { - } - #endregion - - #region Methods - - /// - /// Initialize the argument property. - /// - /// - /// - public void Initialize( ConfigurationScope configScope, ConstructorInfo constructorInfo ) - { - // Search argument by his name to set his type - ParameterInfo[] parameters = constructorInfo.GetParameters(); - - bool found = false; - for(int i =0; i< parameters.Length; i++) - { - found = (parameters[ i ].Name == _argumentName); - if( found ) - { - _argumentType = parameters[ i ].ParameterType; - break; - } - } - if (this.CallBackName!=null && this.CallBackName.Length >0) - { - configScope.ErrorContext.MoreInfo = "Argument property ("+_argumentName+"), check the typeHandler attribute '" + this.CallBackName + "' (must be a ITypeHandlerCallback implementation)."; - try - { - Type type = configScope.SqlMapper.TypeHandlerFactory.GetType(this.CallBackName); - ITypeHandlerCallback typeHandlerCallback = (ITypeHandlerCallback) Activator.CreateInstance( type ); - this.TypeHandler = new CustomTypeHandler(typeHandlerCallback); - } - catch (Exception e) - { -#if dotnet2 - throw new ConfigurationErrorsException("Error occurred during custom type handler configuration. Cause: " + e.Message, e); -#else - throw new ConfigurationException("Error occurred during custom type handler configuration. Cause: " + e.Message, e); -#endif - } - } - else - { - configScope.ErrorContext.MoreInfo = "Argument property ("+_argumentName+") set the typeHandler attribute."; - this.TypeHandler = this.ResolveTypeHandler(configScope, _argumentType, this.CLRType, this.DbType); - } - } - - /// - /// - /// - /// - /// The argument type - /// - /// - /// - public ITypeHandler ResolveTypeHandler(ConfigurationScope configScope, Type argumenType, string clrType, string dbType) - { - ITypeHandler handler = null; - if (argumenType==null) - { - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else if (typeof(IDictionary).IsAssignableFrom(argumenType)) - { - // IDictionary - if (clrType ==null ||clrType.Length == 0) - { - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else - { - try - { - Type type = TypeUtils.ResolveType(clrType); - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); - } - catch (Exception e) - { -#if dotnet2 - throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); -#else - throw new ConfigurationException("Error. Could not set TypeHandler. Cause: " + e.Message, e); -#endif - } - } - } - else if (configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(argumenType, dbType) != null) - { - // Primitive - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(argumenType, dbType); - } - else - { - // .NET object - if (clrType ==null || clrType.Length == 0) - { - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else - { - try - { - Type type = TypeUtils.ResolveType(clrType); - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); - } - catch (Exception e) - { -#if dotnet2 - throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); -#else - throw new ConfigurationException("Error. Could not set TypeHandler. Cause: " + e.Message, e); -#endif - } - } - } - - return handler; - } - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/AutoResultMap.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/AutoResultMap.cs deleted file mode 100644 index 6dce52e..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/AutoResultMap.cs +++ /dev/null @@ -1,245 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 450157 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections.Specialized; -using System.Data; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.Common.Utilities; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Implementation of interface for auto mapping - /// - public class AutoResultMap : IResultMap - { - [NonSerialized] - private bool _isInitalized = false; - [NonSerialized] - private Type _resultClass = null; - [NonSerialized] - private IFactory _resultClassFactory = null; - [NonSerialized] - private ResultPropertyCollection _properties = new ResultPropertyCollection(); - - [NonSerialized] - private IDataExchange _dataExchange = null; - - /// - /// Initializes a new instance of the class. - /// - /// The result class. - /// The result class factory. - /// The data exchange. - public AutoResultMap(Type resultClass, IFactory resultClassFactory, IDataExchange dataExchange) - { - _resultClass = resultClass; - _resultClassFactory = resultClassFactory; - _dataExchange = dataExchange; - } - - #region IResultMap Members - - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - public StringCollection GroupByPropertyNames - { - get { throw new NotImplementedException("The property 'GroupByPropertyNames' is not implemented."); } - } - - /// - /// The collection of ResultProperty. - /// - [XmlIgnore] - public ResultPropertyCollection Properties - { - get { return _properties; } - } - - /// - /// The GroupBy Properties. - /// - /// - public ResultPropertyCollection GroupByProperties - { - get { throw new NotImplementedException("The property 'GroupByProperties' is not implemented."); } - } - - /// - /// The collection of constructor parameters. - /// - [XmlIgnore] - public ResultPropertyCollection Parameters - { - get { throw new NotImplementedException("The property 'Parameters' is not implemented."); } - } - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - public bool IsInitalized - { - get { return _isInitalized; } - set { _isInitalized = value; } - } - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// - /// GetProduct - public string Id - { - get { return _resultClass.Name; } - } - - - /// - /// The output type class of the resultMap. - /// - /// - public Type Class - { - get { return _resultClass; } - } - - - /// - /// Sets the IDataExchange - /// - /// - public IDataExchange DataExchange - { - set { _dataExchange = value; } - } - - - /// - /// Create an instance Of result. - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// An object. - public object CreateInstanceOfResult(object[] parameters) - { - return CreateInstanceOfResultClass(); - } - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) - { - _dataExchange.SetData(ref target, property, dataBaseValue); - } - - /// - /// - /// - /// - public IResultMap ResolveSubMap(IDataReader dataReader) - { - return this; - } - - #endregion - - /// - /// Clones this instance. - /// - /// - public AutoResultMap Clone() - { - return new AutoResultMap(_resultClass, _resultClassFactory, _dataExchange); - } - - /// - /// Create an instance of result class. - /// - /// An object. - public object CreateInstanceOfResultClass() - { - if (_resultClass.IsPrimitive || _resultClass == typeof(string)) - { - TypeCode typeCode = Type.GetTypeCode(_resultClass); - return TypeUtils.InstantiatePrimitiveType(typeCode); - } - else - { - if (_resultClass.IsValueType) - { - if (_resultClass == typeof(DateTime)) - { - return new DateTime(); - } - else if (_resultClass == typeof(Decimal)) - { - return new Decimal(); - } - else if (_resultClass == typeof(Guid)) - { - return Guid.Empty; - } - else if (_resultClass == typeof(TimeSpan)) - { - return new TimeSpan(0); - } -#if dotnet2 - else if (_resultClass.IsGenericType && typeof(Nullable<>).IsAssignableFrom(_resultClass.GetGenericTypeDefinition())) - { - return TypeUtils.InstantiateNullableType(_resultClass); - } -#endif - else - { - throw new NotImplementedException("Unable to instanciate value type"); - } - - } - else - { - return _resultClassFactory.CreateInstance(null); - } - } - } - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/Discriminator.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/Discriminator.cs deleted file mode 100644 index b27e3d1..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/Discriminator.cs +++ /dev/null @@ -1,231 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * Author : Gilles Bayon - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Apache Fondation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Xml.Serialization; -using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Summary description for Discriminator. - /// - [Serializable] - [XmlRoot("discriminator", Namespace="http://ibatis.apache.org/mapping")] - public class Discriminator - { - - #region Fields - [NonSerialized] - private ResultProperty _mapping = null; - /// - /// (discriminatorValue (string), ResultMap) - /// - [NonSerialized] - private HybridDictionary _resultMaps = null; - /// - /// The subMaps name who used this discriminator - /// - [NonSerialized] - private ArrayList _subMaps = null; - - [NonSerialized] - private string _nullValue = string.Empty; - [NonSerialized] - private string _columnName = string.Empty; - [NonSerialized] - private int _columnIndex = ResultProperty.UNKNOWN_COLUMN_INDEX; - [NonSerialized] - private string _dbType = string.Empty; - [NonSerialized] - private string _clrType = string.Empty; - [NonSerialized] - private string _callBackName= string.Empty; - #endregion - - #region Properties - - /// - /// Specify the custom type handlers to used. - /// - /// Will be an alias to a class wchic implement ITypeHandlerCallback - [XmlAttribute("typeHandler")] - public string CallBackName - { - get { return _callBackName; } - set { _callBackName = value; } - } - - /// - /// Give an entry in the 'DbType' enumeration - /// - /// - /// For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... - ///
    - /// For Oracle, give an OracleType Enumeration : Byte, Int16, Number... - ///
    - [XmlAttribute("dbType")] - public string DbType - { - get { return _dbType; } - set { _dbType = value; } - } - - /// - /// Specify the CLR type of the result. - /// - /// - /// The type attribute is used to explicitly specify the property type of the property to be set. - /// Normally this can be derived from a property through reflection, but certain mappings such as - /// HashTable cannot provide the type to the framework. - /// - [XmlAttribute("type")] - public string CLRType - { - get { return _clrType; } - set { _clrType = value; } - } - - /// - /// Column Index - /// - [XmlAttribute("columnIndex")] - public int ColumnIndex - { - get { return _columnIndex; } - set { _columnIndex = value; } - } - - /// - /// Column Name - /// - [XmlAttribute("column")] - public string ColumnName - { - get { return _columnName; } - set { _columnName = value; } - } - - /// - /// Null value replacement. - /// - /// "no_email@provided.com" - [XmlAttribute("nullValue")] - public string NullValue - { - get { return _nullValue; } - set { _nullValue = value; } - } - - /// - /// Th underlying ResultProperty - /// - [XmlIgnore] - public ResultProperty ResultProperty - { - get { return _mapping; } - } - #endregion - - #region Constructor - - /// - /// Constructor - /// - public Discriminator() - { - _resultMaps = new HybridDictionary(); - _subMaps = new ArrayList(); - } - #endregion - - #region Methods - - /// - /// Initilaize the underlying mapping - /// - /// - /// - public void SetMapping(ConfigurationScope configScope, Type resultClass) - { - configScope.ErrorContext.MoreInfo = "Initialize discriminator mapping"; - _mapping = new ResultProperty(); - _mapping.ColumnName = _columnName; - _mapping.ColumnIndex = _columnIndex; - _mapping.CLRType = _clrType; - _mapping.CallBackName = _callBackName; - _mapping.DbType = _dbType; - _mapping.NullValue = _nullValue; - - _mapping.Initialize( configScope, resultClass ); - } - - /// - /// Initialize the Discriminator - /// - /// - public void Initialize(ConfigurationScope configScope) - { - // Set the ResultMaps - int count = _subMaps.Count; - for(int index=0; index - /// Add a subMap that the discrimator must treat - ///
    - /// A subMap - public void Add(SubMap subMap) - { - _subMaps.Add(subMap); - } - - /// - /// Find the SubMap to use. - /// - /// the discriminator value - /// The find ResultMap - public IResultMap GetSubMap(string discriminatorValue) - { - return _resultMaps[discriminatorValue] as ResultMap; - } - - #endregion - - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/DynamicResultMap.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/DynamicResultMap.cs deleted file mode 100644 index a6939e5..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/DynamicResultMap.cs +++ /dev/null @@ -1,203 +0,0 @@ - -//#region Apache Notice -///***************************************************************************** -// * $Revision: 450157 $ -// * $LastChangedDate: 2013-05-31 $ -// * $LastChangedBy: mmccurrey $ -// * -// * MyBATIS.NET Data Mapper -// * -// * -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// * -// ********************************************************************************/ -//#endregion - -//#region Using - -//using System; -//using System.Collections.Specialized; -//using System.Data; -//using System.Dynamic; -//using System.Xml.Serialization; -//using IBatisNet.Common.Utilities.Objects; -//using IBatisNet.DataMapper.DataExchange; -//using IBatisNet.Common.Utilities; - -//#endregion - -//namespace IBatisNet.DataMapper.Configuration.ResultMapping -//{ -// /// -// /// Implementation of interface for auto mapping -// /// -// public class DynamicResultMap : IResultMap -// { -// [NonSerialized] -// private bool _isInitalized = false; - -// [NonSerialized] -// private IFactory _resultClassFactory = null; -// [NonSerialized] -// private readonly ResultPropertyCollection _properties = new ResultPropertyCollection(); - -// [NonSerialized] -// private IDataExchange _dataExchange = null; - -// /// -// /// Initializes a new instance of the class. -// /// -// /// The result class. -// /// The result class factory. -// /// The data exchange. -// public DynamicResultMap(IFactory resultClassFactory, IDataExchange dataExchange) -// { -// _resultClassFactory = resultClassFactory; -// _dataExchange = dataExchange; -// } - -// #region IResultMap Members - -// /// -// /// The GroupBy Properties. -// /// -// [XmlIgnore] -// public StringCollection GroupByPropertyNames -// { -// get { throw new NotImplementedException("The property 'GroupByPropertyNames' is not implemented."); } -// } - -// /// -// /// The collection of ResultProperty. -// /// -// [XmlIgnore] -// public ResultPropertyCollection Properties -// { -// get { return _properties; } -// } - -// /// -// /// The GroupBy Properties. -// /// -// /// -// public ResultPropertyCollection GroupByProperties -// { -// get { throw new NotImplementedException("The property 'GroupByProperties' is not implemented."); } -// } - -// /// -// /// The collection of constructor parameters. -// /// -// [XmlIgnore] -// public ResultPropertyCollection Parameters -// { -// get { throw new NotImplementedException("The property 'Parameters' is not implemented."); } -// } - -// /// -// /// Gets or sets a value indicating whether this instance is initalized. -// /// -// /// -// /// true if this instance is initalized; otherwise, false. -// /// -// public bool IsInitalized -// { -// get { return _isInitalized; } -// set { _isInitalized = value; } -// } - -// /// -// /// Identifier used to identify the resultMap amongst the others. -// /// -// /// -// /// GetProduct -// public string Id -// { -// get { return "DynamicObject"; } -// } - - -// /// -// /// The output type class of the resultMap. -// /// -// /// -// public Type Class -// { -// get { return typeof(dynamic); } -// } - - -// /// -// /// Sets the IDataExchange -// /// -// /// -// public IDataExchange DataExchange -// { -// set { _dataExchange = value; } -// } - - -// /// -// /// Create an instance Of result. -// /// -// /// An array of values that matches the number, order and type -// /// of the parameters for this constructor. -// /// An object. -// public object CreateInstanceOfResult(object[] parameters) -// { -// return CreateInstanceOfResultClass(); -// } - -// /// -// /// Set the value of an object property. -// /// -// /// The object to set the property. -// /// The result property to use. -// /// The database value to set. -// public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) -// { -// _dataExchange.SetData(ref target, property, dataBaseValue); -// } - -// /// -// /// -// /// -// /// -// public IResultMap ResolveSubMap(IDataReader dataReader) -// { -// return this; -// } - -// #endregion - -// /// -// /// Clones this instance. -// /// -// /// -// public DynamicResultMap Clone() -// { -// return new DynamicResultMap(_resultClassFactory, _dataExchange); -// } - -// /// -// /// Create an instance of result class. -// /// -// /// An object. -// public object CreateInstanceOfResultClass() -// { -// return new ExpandoObject(); -// } - -// } -//} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/IColumn.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/IColumn.cs deleted file mode 100644 index 3aa1ea4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/IColumn.cs +++ /dev/null @@ -1,55 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-26 14:05:17 -0600 (Wed, 26 Apr 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Summary description for IColumn. - /// - public interface IColumn - { - /// - /// Column Index - /// - [XmlAttribute("columnIndex")] - int ColumnIndex { get; set; } - - /// - /// Column Name - /// - [XmlAttribute("column")] - string ColumnName { get; set; } - - - /// - /// Defines a field/property accessor - /// - [XmlIgnore] - IMemberAccessor MemberAccessor{ get; } - } -} \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/IResultMap.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/IResultMap.cs deleted file mode 100644 index ccbc304..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/IResultMap.cs +++ /dev/null @@ -1,121 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 450157 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections.Specialized; -using System.Data; -using System.Xml.Serialization; -using IBatisNet.DataMapper.DataExchange; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// This is a grouping of ResultMapping objects used to map results back to objects - /// - public interface IResultMap - { - /// - /// The collection of constructor parameters. - /// - [XmlIgnore] - ResultPropertyCollection Parameters { get; } - - /// - /// The collection of ResultProperty. - /// - [XmlIgnore] - ResultPropertyCollection Properties { get; } - - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - ResultPropertyCollection GroupByProperties { get; } - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// GetProduct - [XmlAttribute("id")] - string Id { get; } - - /// - /// The GroupBy Properties name. - /// - [XmlIgnore] - StringCollection GroupByPropertyNames { get; } - - /// - /// The output type class of the resultMap. - /// - [XmlIgnore] - Type Class { get; } - - /// - /// Sets the IDataExchange - /// - [XmlIgnore] - IDataExchange DataExchange { set; } - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - [XmlIgnore] - bool IsInitalized { get; set; } - - - /// - /// Create an instance Of result. - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// An object. - object CreateInstanceOfResult(object[] parameters); - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue); - - /// - /// - /// - /// - /// - IResultMap ResolveSubMap(IDataReader dataReader); - } -} \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/NullResultMap.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/NullResultMap.cs deleted file mode 100644 index 6bc68a4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/NullResultMap.cs +++ /dev/null @@ -1,173 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections.Specialized; -using IBatisNet.DataMapper.DataExchange; - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// - /// - public class NullResultMap : IResultMap - { - - #region Fields - [NonSerialized] - private StringCollection _groupByPropertyNames = new StringCollection(); - [NonSerialized] - private ResultPropertyCollection _properties = new ResultPropertyCollection(); - [NonSerialized] - private ResultPropertyCollection _parameters = new ResultPropertyCollection(); - [NonSerialized] - private ResultPropertyCollection _groupByProperties = new ResultPropertyCollection(); - - #endregion - - #region Properties - - /// - /// The GroupBy Properties. - /// - public StringCollection GroupByPropertyNames - { - get { return _groupByPropertyNames; } - } - - /// - /// The GroupBy Properties. - /// - public ResultPropertyCollection GroupByProperties - { - get { return _groupByProperties; } - } - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - public bool IsInitalized - { - get { throw new Exception("The method or operation is not implemented."); } - set { throw new Exception("The method or operation is not implemented."); } - } - - /// - /// The discriminator used to choose the good SubMap - /// - public Discriminator Discriminator - { - get { throw new Exception("The method or operation is not implemented."); } - set { throw new Exception("The method or operation is not implemented."); } - } - - /// - /// The collection of ResultProperty. - /// - public ResultPropertyCollection Properties - { - get { return _properties; } - } - - /// - /// The collection of constructor parameters. - /// - public ResultPropertyCollection Parameters - { - get { return _parameters; } - } - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// GetProduct - public string Id - { - get { return "NullResultMap.Id"; } - } - - /// - /// Extend ResultMap attribute - /// - public string ExtendMap - { - get { throw new Exception("The method or operation is not implemented."); } - set { throw new Exception("The method or operation is not implemented."); } - } - - /// - /// The output type class of the resultMap. - /// - public Type Class - { - get { throw new Exception("The method or operation is not implemented."); } - } - - - /// - /// Sets the IDataExchange - /// - public IDataExchange DataExchange - { - set { throw new Exception("The method or operation is not implemented."); } - } - #endregion - - /// - /// Create an instance Of result. - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// An object. - public object CreateInstanceOfResult(object[] parameters) - { - return null; - } - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) - { - throw new Exception("The method or operation is not implemented."); - } - - /// - /// - /// - /// - public IResultMap ResolveSubMap(System.Data.IDataReader dataReader) - { - throw new Exception("The method or operation is not implemented."); - } - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs deleted file mode 100644 index 6691ab0..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMap.cs +++ /dev/null @@ -1,522 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 638539 $ - * $LastChangedDate: 2008-03-18 13:53:02 -0600 (Tue, 18 Mar 2008) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections.Specialized; -using System.Data; -using System.Reflection; -using System.Xml; -using System.Xml.Serialization; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.Serializers; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; -using IBatisNet.Common.Utilities; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Main implementation of ResultMap interface - /// - [Serializable] - [XmlRoot("resultMap", Namespace="http://ibatis.apache.org/mapping")] - public class ResultMap : IResultMap - { - /// - /// Token for xml path to argument constructor elements. - /// - public static BindingFlags ANY_VISIBILITY_INSTANCE = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - - /// - /// Token for xml path to result elements. - /// - private const string XML_RESULT = "result"; - - /// - /// Token for xml path to result elements. - /// - private const string XML_CONSTRUCTOR_ARGUMENT = "constructor/argument"; - - /// - /// Token for xml path to discriminator elements. - /// - private const string XML_DISCRIMNATOR = "discriminator"; - - /// - /// Token for xml path to subMap elements. - /// - private const string XML_SUBMAP = "subMap"; - - private static IResultMap _nullResultMap = null; - - #region Fields - [NonSerialized] - private bool _isInitalized = true; - [NonSerialized] - private string _id = string.Empty; - [NonSerialized] - private string _className = string.Empty; - [NonSerialized] - private string _extendMap = string.Empty; - [NonSerialized] - private Type _class = null; - [NonSerialized] - private StringCollection _groupByPropertyNames = new StringCollection(); - - [NonSerialized] - private ResultPropertyCollection _properties = new ResultPropertyCollection(); - [NonSerialized] - private ResultPropertyCollection _groupByProperties = new ResultPropertyCollection(); - - [NonSerialized] - private ResultPropertyCollection _parameters = new ResultPropertyCollection(); - - [NonSerialized] - private Discriminator _discriminator = null; - [NonSerialized] - private string _sqlMapNameSpace = string.Empty; - [NonSerialized] - private IFactory _objectFactory = null; - [NonSerialized] - private DataExchangeFactory _dataExchangeFactory = null; - [NonSerialized] - private IDataExchange _dataExchange = null; - #endregion - - #region Properties - - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - public StringCollection GroupByPropertyNames - { - get { return _groupByPropertyNames; } - } - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - public bool IsInitalized - { - get { return true; } - set { _isInitalized = value; } - } - - /// - /// The discriminator used to choose the good SubMap - /// - [XmlIgnore] - public Discriminator Discriminator - { - get { return _discriminator; } - set { _discriminator = value; } - } - - /// - /// The collection of ResultProperty. - /// - [XmlIgnore] - public ResultPropertyCollection Properties - { - get { return _properties; } - } - - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - public ResultPropertyCollection GroupByProperties - { - get { return _groupByProperties; } - } - - /// - /// The collection of constructor parameters. - /// - [XmlIgnore] - public ResultPropertyCollection Parameters - { - get { return _parameters; } - } - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// GetProduct - [XmlAttribute("id")] - public string Id - { - get { return _id; } - } - - /// - /// Extend ResultMap attribute - /// - [XmlAttribute("extends")] - public string ExtendMap - { - get { return _extendMap; } - set { _extendMap = value; } - } - - /// - /// The output type class of the resultMap. - /// - [XmlIgnore] - public Type Class - { - get { return _class; } - } - - - /// - /// Sets the IDataExchange - /// - [XmlIgnore] - public IDataExchange DataExchange - { - set { _dataExchange = value; } - } - #endregion - - #region Constructor (s) / Destructor - - /// - /// Initializes a new instance of the class. - /// - /// The config scope. - /// The output class name of the resultMap. - /// The extend result map bame. - /// Identifier used to identify the resultMap amongst the others. - /// The groupBy properties - public ResultMap(ConfigurationScope configScope, string id, string className, string extendMap, string groupBy) - { - _nullResultMap = new NullResultMap(); - - _dataExchangeFactory = configScope.DataExchangeFactory; - _sqlMapNameSpace = configScope.SqlMapNamespace; - if ((id == null) || (id.Length < 1)) - { - throw new ArgumentNullException("The id attribute is mandatory in a ResultMap tag."); - } - _id = configScope.ApplyNamespace(id); - if ((className == null) || (className.Length < 1)) - { - throw new ArgumentNullException("The class attribute is mandatory in the ResultMap tag id:"+_id); - } - _className = className; - _extendMap = extendMap; - if (groupBy != null && groupBy.Length>0) - { - string[] groupByProperties = groupBy.Split(','); - for (int i = 0; i < groupByProperties.Length; i++) - { - string memberName = groupByProperties[i].Trim(); - _groupByPropertyNames.Add(memberName); - } - } - - } - #endregion - - #region Methods - - #region Configuration - - /// - /// Initialize the resultMap from an xmlNode.. - /// - /// - public void Initialize( ConfigurationScope configScope ) - { - try - { - _class = configScope.SqlMapper.TypeHandlerFactory.GetType(_className); - _dataExchange = _dataExchangeFactory.GetDataExchangeForClass(_class); - - // Load the child node - GetChildNode(configScope); - - // Verify that that each groupBy element correspond to a class member - // of one of result property - for (int i = 0; i < _groupByProperties.Count; i++) - { - string memberName = GroupByPropertyNames[i]; - if (!_properties.Contains(memberName)) - { - throw new ConfigurationException( - string.Format( - "Could not configure ResultMap named \"{0}\". Check the groupBy attribute. Cause: there's no result property named \"{1}\".", - _id, memberName)); - } - } - } - catch(Exception e) - { - throw new ConfigurationException( - string.Format("Could not configure ResultMap named \"{0}\", Cause: {1}", _id, e.Message) - , e); - } - } - - /// - /// Initializes the groupBy properties. - /// - public void InitializeGroupByProperties() - { - for (int i = 0; i < GroupByPropertyNames.Count; i++) - { - ResultProperty resultProperty = Properties.FindByPropertyName(this.GroupByPropertyNames[i]); - this.GroupByProperties.Add(resultProperty); - } - } - - - /// - /// Get the result properties and the subMap properties. - /// - /// - private void GetChildNode(ConfigurationScope configScope) - { - ResultProperty mapping = null; - SubMap subMap = null; - - #region Load the parameters constructor - XmlNodeList nodeList = configScope.NodeContext.SelectNodes( DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_CONSTRUCTOR_ARGUMENT), configScope.XmlNamespaceManager); - if (nodeList.Count>0) - { - Type[] parametersType= new Type[nodeList.Count]; - string[] parametersName = new string[nodeList.Count]; - for( int i =0; i0 && this.Discriminator==null) - { - throw new ConfigurationException("The discriminator is null, but somehow a subMap was reached. This is a bug."); - } - foreach ( XmlNode resultNode in configScope.NodeContext.SelectNodes(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_SUBMAP), configScope.XmlNamespaceManager) ) - { - configScope.ErrorContext.MoreInfo = "initialize subMap"; - subMap = SubMapDeSerializer.Deserialize(resultNode, configScope); - - this.Discriminator.Add( subMap ); - } - #endregion - } - - /// - /// Sets the object factory. - /// - public void SetObjectFactory(ConfigurationScope configScope) - { - Type[] parametersType = new Type[_parameters.Count]; - for (int i = 0; i < _parameters.Count; i++) - { - ArgumentProperty argumentMapping = (ArgumentProperty)_parameters[i]; - parametersType[i] = argumentMapping.MemberType; - } - // Init the object factory - _objectFactory = configScope.SqlMapper.ObjectFactory.CreateFactory(_class, parametersType); - } - - /// - /// Finds the constructor that takes the parameters. - /// - /// The to find the constructor in. - /// The parameters name to use to find the appropriate constructor. - /// - /// An that can be used to create the type with - /// the specified parameters. - /// - /// - /// Thrown when no constructor with the correct signature can be found. - /// - private ConstructorInfo GetConstructor(Type type, string[] parametersName ) - { - ConstructorInfo[] candidates = type.GetConstructors(ANY_VISIBILITY_INSTANCE); - foreach( ConstructorInfo constructor in candidates ) - { - ParameterInfo[] parameters = constructor.GetParameters(); - - if( parameters.Length == parametersName.Length ) - { - bool found = true; - - for( int j = 0; j < parameters.Length; j++ ) - { - bool ok = (parameters[ j ].Name == parametersName[ j ]); - if( !ok ) - { - found = false; - break; - } - } - - if( found ) - { - return constructor; - } - } - } - throw new DataMapperException( "Cannot find an appropriate constructor which map parameters in class: "+ type.Name ); - } - - #endregion - - /// - /// Create an instance Of result. - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// An object. - public object CreateInstanceOfResult(object[] parameters) - { - TypeCode typeCode = Type.GetTypeCode(_class); - - if (typeCode == TypeCode.Object) - { - return _objectFactory.CreateInstance(parameters); - } - else - { - return TypeUtils.InstantiatePrimitiveType(typeCode); - } - } - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - public void SetValueOfProperty( ref object target, ResultProperty property, object dataBaseValue ) - { - _dataExchange.SetData(ref target, property, dataBaseValue); - } - - /// - /// - /// - /// - /// - public IResultMap ResolveSubMap(IDataReader dataReader) - { - IResultMap subMap = this; - if (_discriminator != null) - { - ResultProperty mapping = _discriminator.ResultProperty; - object dataBaseValue = mapping.GetDataBaseValue( dataReader ); - - if (dataBaseValue!=null) - { - subMap = _discriminator.GetSubMap( dataBaseValue.ToString() ); - - if (subMap == null) - { - subMap = this; - } - else if (subMap != this) - { - subMap = subMap.ResolveSubMap(dataReader); - } - } - else - { - subMap = _nullResultMap; - } - } - return subMap; - } - - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMapCollection.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMapCollection.cs deleted file mode 100644 index 5860f9e..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultMapCollection.cs +++ /dev/null @@ -1,263 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 450157 $ - * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Collection of - /// - public class ResultMapCollection - { - private const int DEFAULT_CAPACITY = 2; - private const int CAPACITY_MULTIPLIER = 2; - private int _count = 0; - private IResultMap[] _innerList = null; - - - /// - /// Read-only property describing how many elements are in the Collection. - /// - public int Count - { - get { return _count; } - } - - - /// - /// Constructs a ResultMapCollection. The list is initially empty and has a capacity - /// of zero. Upon adding the first element to the list the capacity is - /// increased to 8, and then increased in multiples of two as required. - /// - public ResultMapCollection() - { - this.Clear(); - } - - /// - /// Removes all items from the collection. - /// - public void Clear() - { - _innerList = new IResultMap[DEFAULT_CAPACITY]; - _count = 0; - } - - /// - /// Constructs a ResultMapCollection with a given initial capacity. - /// The list is initially empty, but will have room for the given number of elements - /// before any reallocations are required. - /// - /// The initial capacity of the list - public ResultMapCollection(int capacity) - { - if (capacity < 0) - { - throw new ArgumentOutOfRangeException("Capacity", "The size of the list must be >0."); - } - _innerList = new IResultMap[capacity]; - } - - /// - /// Length of the collection - /// - public int Length - { - get { return _innerList.Length; } - } - - - /// - /// Sets or Gets the ResultMap at the given index. - /// - public IResultMap this[int index] - { - get - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - return _innerList[index]; - } - set - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - _innerList[index] = value; - } - } - - - /// - /// Add an ResultMap - /// - /// - /// Index - public int Add(IResultMap value) - { - Resize(_count + 1); - int index = _count++; - _innerList[index] = value; - - return index; - } - - - /// - /// Add a list of ResultMap to the collection - /// - /// - public void AddRange(IResultMap[] value) - { - for (int i = 0; i < value.Length; i++) - { - Add(value[i]); - } - } - - - /// - /// Add a list of ResultMap to the collection - /// - /// - public void AddRange(ResultMapCollection value) - { - for (int i = 0; i < value.Count; i++) - { - Add(value[i]); - } - } - - - /// - /// Indicate if a ResultMap is in the collection - /// - /// A ResultMap - /// True fi is in - public bool Contains(IResultMap value) - { - for (int i = 0; i < _count; i++) - { - if (_innerList[i].Id == value.Id) - { - return true; - } - } - return false; - } - - - /// - /// Insert a ResultMap in the collection. - /// - /// Index where to insert. - /// A ResultMap - public void Insert(int index, IResultMap value) - { - if (index < 0 || index > _count) - { - throw new ArgumentOutOfRangeException("index"); - } - - Resize(_count + 1); - Array.Copy(_innerList, index, _innerList, index + 1, _count - index); - _innerList[index] = value; - _count++; - } - - - /// - /// Remove a ResultMap of the collection. - /// - public void Remove(IResultMap value) - { - for (int i = 0; i < _count; i++) - { - if (_innerList[i].Id == value.Id) - { - RemoveAt(i); - return; - } - } - - } - - /// - /// Removes a ResultMap at the given index. The size of the list is - /// decreased by one. - /// - /// - public void RemoveAt(int index) - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - - int remaining = _count - index - 1; - - if (remaining > 0) - { - Array.Copy(_innerList, index + 1, _innerList, index, remaining); - } - - _count--; - _innerList[_count] = null; - } - - /// - /// Ensures that the capacity of this collection is at least the given minimum - /// value. If the currect capacity of the list is less than min, the - /// capacity is increased to twice the current capacity. - /// - /// - private void Resize(int minSize) - { - int oldSize = _innerList.Length; - - if (minSize > oldSize) - { - IResultMap[] oldEntries = _innerList; - int newSize = oldEntries.Length * CAPACITY_MULTIPLIER; - - if (newSize < minSize) - { - newSize = minSize; - } - _innerList = new IResultMap[newSize]; - Array.Copy(oldEntries, 0, _innerList, 0, _count); - } - } - } -} - diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultProperty.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultProperty.cs deleted file mode 100644 index 24a5021..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultProperty.cs +++ /dev/null @@ -1,619 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 609139 $ - * $LastChangedDate: 2008-01-05 06:47:58 -0700 (Sat, 05 Jan 2008) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -#if dotnet2 -using System.Collections.Generic; -#endif -using System.Data; -using System.Globalization; -using System.Reflection; -using System.Xml.Serialization; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; -using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; -using IBatisNet.DataMapper.Proxy; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Summary description for ResultProperty. - /// - [Serializable] - [XmlRoot("result", Namespace="http://ibatis.apache.org/mapping")] - public class ResultProperty - { - #region Const - - /// - /// - /// - public const int UNKNOWN_COLUMN_INDEX = -999999; - - #endregion - - #region Fields - [NonSerialized] - private ISetAccessor _setAccessor = null; - [NonSerialized] - private string _nullValue = null; - [NonSerialized] - private string _propertyName = string.Empty; - [NonSerialized] - private string _columnName = string.Empty; - [NonSerialized] - private int _columnIndex = UNKNOWN_COLUMN_INDEX; - [NonSerialized] - private string _select = string.Empty; - [NonSerialized] - private string _nestedResultMapName = string.Empty; - [NonSerialized] - private IResultMap _nestedResultMap = null; - [NonSerialized] - private string _dbType = null; - [NonSerialized] - private string _clrType = string.Empty; - [NonSerialized] - private bool _isLazyLoad = false; - [NonSerialized] - private ITypeHandler _typeHandler = null; - [NonSerialized] - private string _callBackName= string.Empty; - [NonSerialized] - private bool _isComplexMemberName = false; - [NonSerialized] - private IPropertyStrategy _propertyStrategy = null; - [NonSerialized] - private ILazyFactory _lazyFactory = null; - [NonSerialized] - private bool _isIList = false; - [NonSerialized] - private bool _isGenericIList = false; - [NonSerialized] - private IFactory _listFactory = null; - [NonSerialized] - private static readonly IFactory _arrayListFactory = new ArrayListFactory(); - - #endregion - - #region Properties - - /// - /// Tell us if the member type implement generic Ilist interface. - /// - [XmlIgnore] - public bool IsGenericIList - { - get { return _isGenericIList; } - } - - /// - /// Tell us if the member type implement Ilist interface. - /// - [XmlIgnore] - public bool IsIList - { - get { return _isIList; } - } - /// - /// List factory for property - /// - /// Used by N+1 Select solution - [XmlIgnore] - public IFactory ListFactory - { - get { return _listFactory; } - } - - /// - /// The lazy loader factory - /// - [XmlIgnore] - public ILazyFactory LazyFactory - { - get { return _lazyFactory; } - } - - /// - /// Sets or gets the used to fill the object property. - /// - [XmlIgnore] - public virtual IArgumentStrategy ArgumentStrategy - { - set { throw new NotImplementedException("Valid on ArgumentProperty") ; } - get { throw new NotImplementedException("Valid on ArgumentProperty") ; } - } - - /// - /// Sets or gets the used to fill the object property. - /// - [XmlIgnore] - public IPropertyStrategy PropertyStrategy - { - set { _propertyStrategy = value ; } - get { return _propertyStrategy; } - } - - /// - /// Specify the custom type handlers to used. - /// - /// Will be an alias to a class wchic implement ITypeHandlerCallback - [XmlAttribute("typeHandler")] - public string CallBackName - { - get { return _callBackName; } - set { _callBackName = value; } - } - - /// - /// Tell us if we must lazy load this property.. - /// - [XmlAttribute("lazyLoad")] - public virtual bool IsLazyLoad - { - get { return _isLazyLoad; } - set { _isLazyLoad = value; } - } - - /// - /// The typeHandler used to work with the result property. - /// - [XmlIgnore] - public ITypeHandler TypeHandler - { - get - { - if (_typeHandler == null) - { - throw new DataMapperException( - String.Format("Error on Result property {0}, type handler for {1} is not registered.", PropertyName , MemberType.Name)); - } - return _typeHandler; - } - set { _typeHandler = value; } - } - - /// - /// Give an entry in the 'DbType' enumeration - /// - /// - /// For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... - ///
    - /// For Oracle, give an OracleType Enumeration : Byte, Int16, Number... - ///
    - [XmlAttribute("dbType")] - public string DbType - { - get { return _dbType; } - set { _dbType = value; } - } - - - /// - /// Specify the CLR type of the result. - /// - /// - /// The type attribute is used to explicitly specify the property type of the property to be set. - /// Normally this can be derived from a property through reflection, but certain mappings such as - /// HashTable cannot provide the type to the framework. - /// - [XmlAttribute("type")] - public string CLRType - { - get { return _clrType; } - set { _clrType = value; } - } - - - /// - /// The name of the statement to retrieve the property - /// - [XmlAttribute("select")] - public string Select - { - get { return _select; } - set { _select = value; } - } - - /// - /// The name of a nested ResultMap to set the property - /// - [XmlAttribute("resultMapping")] - public string NestedResultMapName - { - get { return _nestedResultMapName; } - set { _nestedResultMapName = value; } - } - - /// - /// The property name used to identify the property amongst the others. - /// - [XmlAttribute("property")] - public string PropertyName - { - get { return _propertyName; } - set - { - _propertyName = value; - if (_propertyName.IndexOf('.')<0) - { - _isComplexMemberName = false; - } - else // complex member name FavouriteLineItem.Id - { - _isComplexMemberName = true; - } - } - } - - /// - /// Defines a field/property - /// - [XmlIgnore] - public ISetAccessor SetAccessor - { - get { return _setAccessor; } - } - - /// - /// Get the field/property type - /// - [XmlIgnore] - public virtual Type MemberType - { - get - { - if (_setAccessor != null) - { - return _setAccessor.MemberType; - } - else if (_nestedResultMap != null) - { - return _nestedResultMap.Class; - } - else - { - throw new IBatisNetException( - String.Format(CultureInfo.InvariantCulture, - "Could not resolve member type for result property '{0}'. Neither nested result map nor typed setter was provided.", - _propertyName)); - } - } - } - - /// - /// Tell if a nullValue is defined. - /// - [XmlIgnore] - public bool HasNullValue - { - get { return (_nullValue!=null); } - } - - /// - /// Null value replacement. - /// - /// "no_email@provided.com" - [XmlAttribute("nullValue")] - public string NullValue - { - get { return _nullValue; } - set { _nullValue = value; } - } - - /// - /// A nested ResultMap use to set a property - /// - [XmlIgnore] - public IResultMap NestedResultMap - { - get { return _nestedResultMap; } - set { _nestedResultMap = value; } - } - - /// - /// Indicate if we have a complex member name as [FavouriteLineItem.Id] - /// - public bool IsComplexMemberName - { - get { return _isComplexMemberName; } - } - - /// - /// Column Index - /// - [XmlAttribute("columnIndex")] - public int ColumnIndex - { - get { return _columnIndex; } - set { _columnIndex = value; } - } - - /// - /// Column Name - /// - [XmlAttribute("column")] - public string ColumnName - { - get { return _columnName; } - set { _columnName = value; } - } - - #endregion - - #region Methods - - /// - /// Initialize the PropertyInfo of the result property. - /// - /// - /// - public void Initialize( ConfigurationScope configScope, Type resultClass ) - { - if ( _propertyName.Length>0 && - _propertyName != "value" && - !typeof(IDictionary).IsAssignableFrom(resultClass) ) - { - if (!_isComplexMemberName) - { - _setAccessor = configScope.DataExchangeFactory.AccessorFactory.SetAccessorFactory.CreateSetAccessor(resultClass, _propertyName); - } - else // complex member name FavouriteLineItem.Id - { - MemberInfo propertyInfo = ObjectProbe.GetMemberInfoForSetter(resultClass, _propertyName); - string memberName = _propertyName.Substring( _propertyName.LastIndexOf('.')+1); - _setAccessor = configScope.DataExchangeFactory.AccessorFactory.SetAccessorFactory.CreateSetAccessor(propertyInfo.ReflectedType, memberName); - } - -#if dotnet2 - _isGenericIList = TypeUtils.IsImplementGenericIListInterface(MemberType); -#endif - _isIList = typeof(IList).IsAssignableFrom(MemberType); - - // set the list factory -#if dotnet2 - if (_isGenericIList) - { - if (MemberType.IsArray) - { - _listFactory = _arrayListFactory; - } - else - { - Type[] typeArgs = MemberType.GetGenericArguments(); - - if (typeArgs.Length == 0)// Custom collection which derive from List - { - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory(MemberType, Type.EmptyTypes); - } - else - { - Type genericIList = typeof(IList<>); - Type interfaceListType = genericIList.MakeGenericType(typeArgs); - - Type genericList = typeof(List<>); - Type listType = genericList.MakeGenericType(typeArgs); - - if ((interfaceListType == MemberType) || (listType == MemberType)) - { - Type constructedType = genericList.MakeGenericType(typeArgs); - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory( - constructedType, - Type.EmptyTypes); - } - else // Custom collection which derive from List - { - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory(MemberType, Type.EmptyTypes); - } - } - } - } - else -#endif - if (_isIList) - { - if (MemberType.IsArray) - { - _listFactory = _arrayListFactory; - } - else - { - if (MemberType == typeof(IList)) - { - _listFactory = _arrayListFactory; - } - else // custom collection - { - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory(MemberType, Type.EmptyTypes); - } - } - } - } - - if (CallBackName!=null && CallBackName.Length >0) - { - configScope.ErrorContext.MoreInfo = "Result property '"+_propertyName+"' check the typeHandler attribute '" + CallBackName + "' (must be a ITypeHandlerCallback implementation)."; - try - { - Type type = configScope.SqlMapper.TypeHandlerFactory.GetType(CallBackName); - ITypeHandlerCallback typeHandlerCallback = (ITypeHandlerCallback) Activator.CreateInstance( type ); - _typeHandler = new CustomTypeHandler(typeHandlerCallback); - } - catch (Exception e) - { - throw new ConfigurationException("Error occurred during custom type handler configuration. Cause: " + e.Message, e); - } - } - else - { - configScope.ErrorContext.MoreInfo = "Result property '"+_propertyName+"' set the typeHandler attribute."; - _typeHandler = configScope.ResolveTypeHandler( resultClass, _propertyName, _clrType, _dbType, true); - } - - if (IsLazyLoad) - { - throw new InvalidOperationException("lazy not supported until we fix session"); - _lazyFactory = new LazyFactoryBuilder().GetLazyFactory(_setAccessor.MemberType); - } - } - - /// - /// Initialize a the result property - /// for AutoMapper - /// - /// An . - /// - internal void Initialize(TypeHandlerFactory typeHandlerFactory, ISetAccessor setAccessor ) - { - _setAccessor = setAccessor; - _typeHandler = typeHandlerFactory.GetTypeHandler(setAccessor.MemberType); - } - - /// - /// - /// - /// - /// - public object GetDataBaseValue(IDataReader dataReader) - { - object value = null; - - if (_columnIndex == UNKNOWN_COLUMN_INDEX) - { - value = TypeHandler.GetValueByName(this, dataReader); - } - else - { - value = TypeHandler.GetValueByIndex(this, dataReader); - } - - bool wasNull = (value == DBNull.Value); - if (wasNull) - { - if (HasNullValue) - { - if (_setAccessor != null) - { - value = TypeHandler.ValueOf(_setAccessor.MemberType, _nullValue); - } - else - { - value = TypeHandler.ValueOf(null, _nullValue); - } - } - else - { - value = TypeHandler.NullValue; - } - } - - return value; - } - - /// - /// - /// - /// - /// - public object TranslateValue(object value) - { - if (value == null) - { - return TypeHandler.NullValue; - } - else - { - return value; - } - } - - #endregion - - #region ICloneable Members - - /// - /// Clones this instance. - /// - /// An - public ResultProperty Clone() - { - ResultProperty resultProperty = new ResultProperty(); - - resultProperty.CLRType = CLRType; - resultProperty.CallBackName = CallBackName; - resultProperty.ColumnIndex = ColumnIndex; - resultProperty.ColumnName = ColumnName; - resultProperty.DbType = DbType; - resultProperty.IsLazyLoad = IsLazyLoad; - resultProperty.NestedResultMapName = NestedResultMapName; - resultProperty.NullValue = NullValue; - resultProperty.PropertyName = PropertyName; - resultProperty.Select = Select; - - return resultProperty; - } - - #endregion - - /// - /// that constructs instance - /// - private class ArrayListFactory : IFactory - { - - #region IFactory Members - - /// - /// Create a new instance with the specified parameters - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// A new instance - /// - /// If you call a constructor with no parameters, pass null. - /// Anyway, what you pass will be ignore. - /// - public object CreateInstance(object[] parameters) - { - return new ArrayList(); - } - - #endregion - } - } - -} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultPropertyCollection.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultPropertyCollection.cs deleted file mode 100644 index eacedfc..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/ResultPropertyCollection.cs +++ /dev/null @@ -1,286 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// A ResultProperty Collection. - /// - public class ResultPropertyCollection - { - private const int DEFAULT_CAPACITY = 4; - private const int CAPACITY_MULTIPLIER = 2; - private int _count = 0; - private ResultProperty[] _innerList = null; - - - /// - /// Read-only property describing how many elements are in the Collection. - /// - public int Count - { - get { return _count; } - } - - - /// - /// Constructs a ResultPropertyCollection. The list is initially empty and has a capacity - /// of zero. Upon adding the first element to the list the capacity is - /// increased to 8, and then increased in multiples of two as required. - /// - public ResultPropertyCollection() - { - this.Clear(); - } - - /// - /// Removes all items from the collection. - /// - public void Clear() - { - _innerList = new ResultProperty[DEFAULT_CAPACITY]; - _count = 0; - } - - /// - /// Constructs a ResultPropertyCollection with a given initial capacity. - /// The list is initially empty, but will have room for the given number of elements - /// before any reallocations are required. - /// - /// The initial capacity of the list - public ResultPropertyCollection(int capacity) - { - if (capacity < 0) - { - throw new ArgumentOutOfRangeException("Capacity", "The size of the list must be >0."); - } - _innerList = new ResultProperty[capacity]; - } - - /// - /// Length of the collection - /// - public int Length - { - get{ return _innerList.Length; } - } - - - /// - /// Sets or Gets the ResultProperty at the given index. - /// - public ResultProperty this[int index] - { - get - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - return _innerList[index]; - } - set - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - _innerList[index] = value; - } - } - - /// - /// Finds a property by his name. - /// - /// Name of the property. - /// - public ResultProperty FindByPropertyName(string propertyName) - { - ResultProperty resultProperty = null; - for (int i = 0; i < _count; i++) - { - if (_innerList[i].PropertyName == propertyName) - { - resultProperty = _innerList[i]; - break; - } - } - return resultProperty; - } - - - /// - /// Add an ResultProperty - /// - /// - /// Index - public int Add(ResultProperty value) - { - Resize(_count + 1); - int index = _count++; - _innerList[index] = value; - - return index; - } - - - /// - /// Add a list of ResultProperty to the collection - /// - /// - public void AddRange(ResultProperty[] value) - { - for (int i = 0; i < value.Length; i++) - { - Add(value[i]); - } - } - - - /// - /// Add a list of ResultProperty to the collection - /// - /// - public void AddRange(ResultPropertyCollection value) - { - for (int i = 0; i < value.Count; i++) - { - Add(value[i]); - } - } - - - /// - /// Indicate if a ResultProperty is in the collection - /// - /// A ResultProperty - /// True fi is in - public bool Contains(ResultProperty value) - { - return Contains(value.PropertyName); - } - - /// - /// Indicate if a ResultProperty is in the collection - /// - /// A property name - /// True fi is in - public bool Contains(string propertyName) - { - for (int i = 0; i < _count; i++) - { - if (_innerList[i].PropertyName == propertyName) - { - return true; - } - } - return false; - } - - /// - /// Insert a ResultProperty in the collection. - /// - /// Index where to insert. - /// A ResultProperty - public void Insert(int index, ResultProperty value) - { - if (index < 0 || index > _count) - { - throw new ArgumentOutOfRangeException("index"); - } - - Resize(_count + 1); - Array.Copy(_innerList, index, _innerList, index + 1, _count - index); - _innerList[index] = value; - _count++; - } - - - /// - /// Remove a ResultProperty of the collection. - /// - public void Remove(ResultProperty value) - { - for(int i = 0; i < _count; i++) - { - if(_innerList[i].PropertyName==value.PropertyName) - { - RemoveAt(i); - return; - } - } - - } - - /// - /// Removes a ResultProperty at the given index. The size of the list is - /// decreased by one. - /// - /// - public void RemoveAt(int index) - { - if (index < 0 || index >= _count) - { - throw new ArgumentOutOfRangeException("index"); - } - - int remaining = _count - index - 1; - - if (remaining > 0) - { - Array.Copy(_innerList, index + 1, _innerList, index, remaining); - } - - _count--; - _innerList[_count] = null; - } - - /// - /// Ensures that the capacity of this collection is at least the given minimum - /// value. If the currect capacity of the list is less than min, the - /// capacity is increased to twice the current capacity. - /// - /// - private void Resize(int minSize) - { - int oldSize = _innerList.Length; - - if (minSize > oldSize) - { - ResultProperty[] oldEntries = _innerList; - int newSize = oldEntries.Length * CAPACITY_MULTIPLIER; - - if (newSize < minSize) - { - newSize = minSize; - } - _innerList = new ResultProperty[newSize]; - Array.Copy(oldEntries, 0, _innerList, 0, _count); - } - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/ResultMapping/SubMap.cs b/src/IBatisNet.DataMapper/Configuration/ResultMapping/SubMap.cs deleted file mode 100644 index 6487b98..0000000 --- a/src/IBatisNet.DataMapper/Configuration/ResultMapping/SubMap.cs +++ /dev/null @@ -1,116 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 576082 $ - * $Date: 2007-09-16 06:04:01 -0600 (Sun, 16 Sep 2007) $ - * Author : Gilles Bayon - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Apache Fondation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Xml.Serialization; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping -{ - /// - /// Summary description for SubMap. - /// - [Serializable] - [XmlRoot("subMap", Namespace="http://ibatis.apache.org/mapping")] - public class SubMap - { - // - // - // - // - // -- attribute column (not used if discriminator use a custom formula) - // -- attribute formula (not required will used the DefaultFormula) calculate the discriminator value (DefaultFormula is default), else used an aliasType wich implement IDiscriminatorFormula), - // - // - // - // - // ... - // - - #region Fields - [NonSerialized] - private string _discriminatorValue = string.Empty; - [NonSerialized] - private string _resultMapName = string.Empty; - [NonSerialized] - private IResultMap _resultMap = null; - #endregion - - #region Properties - - /// - /// Discriminator value - /// - [XmlAttribute("value")] - public string DiscriminatorValue - { - get { return _discriminatorValue; } - } - - /// - /// The name of the ResultMap used if the column value is = to the Discriminator Value - /// - [XmlAttribute("resultMapping")] - public string ResultMapName - { - get { return _resultMapName; } - } - - /// - /// The resultMap used if the column value is = to the Discriminator Value - /// - [XmlIgnore] - public IResultMap ResultMap - { - get { return _resultMap; } - set { _resultMap = value; } - } - - #endregion - - #region Constructor - - /// - /// Initializes a new instance of the class. - /// - /// The discriminator value. - /// Name of the result map. - public SubMap(string discriminatorValue, string resultMapName) - { - _discriminatorValue = discriminatorValue; - _resultMapName = resultMapName; - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/ArgumentPropertyDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/ArgumentPropertyDeSerializer.cs deleted file mode 100644 index a19238f..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/ArgumentPropertyDeSerializer.cs +++ /dev/null @@ -1,66 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for ArgumentPropertyDeSerializer. - /// - public sealed class ArgumentPropertyDeSerializer - { - /// - /// Deserialize a ResultProperty object - /// - /// - /// - /// - public static ArgumentProperty Deserialize(XmlNode node, ConfigurationScope configScope) - { - ArgumentProperty argumentProperty = new ArgumentProperty(); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - argumentProperty.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - argumentProperty.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - argumentProperty.ColumnIndex = NodeUtils.GetIntAttribute( prop, "columnIndex", ResultProperty.UNKNOWN_COLUMN_INDEX ); - argumentProperty.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - argumentProperty.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - argumentProperty.NestedResultMapName = NodeUtils.GetStringAttribute(prop, "resultMapping"); - argumentProperty.NullValue = prop["nullValue"]; - argumentProperty.ArgumentName = NodeUtils.GetStringAttribute(prop, "argumentName"); - argumentProperty.Select = NodeUtils.GetStringAttribute(prop, "select"); - - return argumentProperty; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs deleted file mode 100644 index bf5ce67..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/CacheModelDeSerializer.cs +++ /dev/null @@ -1,79 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 707150 $ - * $Date: 2008-10-22 11:54:18 -0600 (Wed, 22 Oct 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Cache; -using IBatisNet.DataMapper.Scope; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for CacheModelDeSerializer. - /// - public sealed class CacheModelDeSerializer - { - /// - /// Deserialize a CacheModel object - /// - /// - /// - /// - public static CacheModel Deserialize(XmlNode node, ConfigurationScope configScope) - { - CacheModel model = new CacheModel(); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - model.Id = NodeUtils.GetStringAttribute(prop, "id"); - model.Implementation = NodeUtils.GetStringAttribute(prop, "implementation"); - model.Implementation = configScope.SqlMapper.TypeHandlerFactory.GetTypeAlias(model.Implementation).Class.AssemblyQualifiedName; - model.IsReadOnly = NodeUtils.GetBooleanAttribute(prop, "readOnly", true); - model.IsSerializable = NodeUtils.GetBooleanAttribute(prop, "serialize", false); - - int count = node.ChildNodes.Count; - for(int i=0;i - /// Summary description for DeSerializerFactory. - ///
    - public class DeSerializerFactory - { - private IDictionary _serializerMap = new HybridDictionary(); - - /// - /// Constructor - /// - /// - public DeSerializerFactory(ConfigurationScope configScope) - { - _serializerMap.Add("dynamic", new DynamicDeSerializer(configScope)); - _serializerMap.Add("isEqual", new IsEqualDeSerializer(configScope)); - _serializerMap.Add("isNotEqual", new IsNotEqualDeSerializer(configScope)); - _serializerMap.Add("isGreaterEqual", new IsGreaterEqualDeSerializer(configScope)); - _serializerMap.Add("isGreaterThan", new IsGreaterThanDeSerializer(configScope)); - _serializerMap.Add("isLessEqual", new IsLessEqualDeSerializer(configScope)); - _serializerMap.Add("isLessThan", new IsLessThanDeSerializer(configScope)); - _serializerMap.Add("isNotEmpty", new IsNotEmptyDeSerializer(configScope)); - _serializerMap.Add("isEmpty", new IsEmptyDeSerializer(configScope)); - _serializerMap.Add("isNotNull", new IsNotNullDeSerializer(configScope)); - _serializerMap.Add("isNotParameterPresent", new IsNotParameterPresentDeSerializer(configScope)); - _serializerMap.Add("isNotPropertyAvailable", new IsNotPropertyAvailableDeSerializer(configScope)); - _serializerMap.Add("isNull", new IsNullDeSerializer(configScope)); - _serializerMap.Add("isParameterPresent", new IsParameterPresentDeSerializer(configScope)); - _serializerMap.Add("isPropertyAvailable", new IsPropertyAvailableDeSerializer(configScope)); - _serializerMap.Add("iterate", new IterateSerializer(configScope)); - } - - /// - /// - /// - /// - /// - public IDeSerializer GetDeSerializer(string name) - { - return (IDeSerializer) _serializerMap[name]; - } - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/DeleteDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/DeleteDeSerializer.cs deleted file mode 100644 index 681a7fc..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/DeleteDeSerializer.cs +++ /dev/null @@ -1,81 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for DeleteDeSerializer. - /// - public sealed class DeleteDeSerializer - { - /// - /// Deserialize a TypeHandler object - /// - /// - /// - /// - public static Delete Deserialize(XmlNode node, ConfigurationScope configScope) - { - Delete delete = new Delete(); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - delete.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - delete.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - delete.Id = NodeUtils.GetStringAttribute(prop, "id"); - delete.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - delete.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - delete.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - delete.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - delete.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - delete.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - int count = node.ChildNodes.Count; - for(int i=0;i - /// Summary description for DiscriminatorDeSerializer. - ///
    - public sealed class DiscriminatorDeSerializer - { - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static Discriminator Deserialize(XmlNode node, ConfigurationScope configScope) - { - Discriminator discriminator = new Discriminator(); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - discriminator.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - discriminator.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - discriminator.ColumnIndex = NodeUtils.GetIntAttribute( prop, "columnIndex", ResultProperty.UNKNOWN_COLUMN_INDEX ); - discriminator.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - discriminator.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - discriminator.NullValue = prop["nullValue"]; - - return discriminator; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/DynamicDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/DynamicDeSerializer.cs deleted file mode 100644 index 7cf1ecc..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/DynamicDeSerializer.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for DynamicDeSerializer. - /// - public sealed class DynamicDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// Constructor - /// - /// - public DynamicDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - Dynamic dynamic = new Dynamic(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - dynamic.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - - return dynamic; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IDeSerializer.cs deleted file mode 100644 index 1b3fd3a..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IDeSerializer.cs +++ /dev/null @@ -1,46 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IDeSerializer. - /// - public interface IDeSerializer - { - /// - /// - /// - /// - /// - SqlTag Deserialize(XmlNode node); - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/InsertDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/InsertDeSerializer.cs deleted file mode 100644 index d166635..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/InsertDeSerializer.cs +++ /dev/null @@ -1,101 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for InsertDeSerializer. - /// - public sealed class InsertDeSerializer - { - /// - /// Deserialize a TypeHandler object - /// - /// - /// - /// - public static Insert Deserialize(XmlNode node, ConfigurationScope configScope) - { - Insert insert = new Insert(); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - insert.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - insert.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - insert.Id = NodeUtils.GetStringAttribute(prop, "id"); - insert.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - insert.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - insert.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - insert.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - insert.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - int count = node.ChildNodes.Count; - for(int i=0;i - /// Summary description for IsEmptyDeSerializer. - ///
    - public sealed class IsEmptyDeSerializer : IDeSerializer - { - - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsEmptyDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a IsNotNull object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsEmpty isEmpty = new IsEmpty(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isEmpty.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isEmpty.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isEmpty; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsEqualDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsEqualDeSerializer.cs deleted file mode 100644 index 2e4817c..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsEqualDeSerializer.cs +++ /dev/null @@ -1,79 +0,0 @@ -#region Apache Notice - -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 05:27:09 -0700 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ - -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsEqualDeSerializer. - /// - public sealed class IsEqualDeSerializer : IDeSerializer - { - private readonly ConfigurationScope _configScope; - - /// - /// - /// - /// - public IsEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isEqual = new IsEqual(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isEqual.Literal = NodeUtils.GetStringAttribute(prop, "literal"); - isEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isEqual; - } - - #endregion - } -} \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterEqualDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterEqualDeSerializer.cs deleted file mode 100644 index 1831801..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterEqualDeSerializer.cs +++ /dev/null @@ -1,76 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsGreaterEqualDeSerializer. - /// - public sealed class IsGreaterEqualDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsGreaterEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsGreaterEqual isGreaterEqual = new IsGreaterEqual(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isGreaterEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isGreaterEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isGreaterEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isGreaterEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isGreaterEqual; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterThanDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterThanDeSerializer.cs deleted file mode 100644 index d83e24f..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsGreaterThanDeSerializer.cs +++ /dev/null @@ -1,76 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsGreaterThanDeSerializer. - /// - public sealed class IsGreaterThanDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsGreaterThanDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsGreaterThan isGreaterThan = new IsGreaterThan(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isGreaterThan.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isGreaterThan.Property = NodeUtils.GetStringAttribute(prop, "property"); - isGreaterThan.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isGreaterThan.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isGreaterThan; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsLessEqualDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsLessEqualDeSerializer.cs deleted file mode 100644 index 70b2b31..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsLessEqualDeSerializer.cs +++ /dev/null @@ -1,75 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsLessEqualDeSerializer. - /// - public sealed class IsLessEqualDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsLessEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsLessEqual isLessEqual = new IsLessEqual(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isLessEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isLessEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isLessEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isLessEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isLessEqual; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsLessThanDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsLessThanDeSerializer.cs deleted file mode 100644 index ba3a50e..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsLessThanDeSerializer.cs +++ /dev/null @@ -1,77 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsLessThanDeSerializer. - /// - public sealed class IsLessThanDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsLessThanDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsLessThan isLessThan = new IsLessThan(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isLessThan.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isLessThan.Property = NodeUtils.GetStringAttribute(prop, "property"); - isLessThan.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isLessThan.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isLessThan; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEmptyDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEmptyDeSerializer.cs deleted file mode 100644 index cb88d1a..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEmptyDeSerializer.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsNotEmptyDeSerializer. - /// - public sealed class IsNotEmptyDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsNotEmptyDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a IsNotEmpty object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsNotEmpty isNotEmpty = new IsNotEmpty(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotEmpty.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotEmpty.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNotEmpty; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEqualDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEqualDeSerializer.cs deleted file mode 100644 index a24ad1f..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotEqualDeSerializer.cs +++ /dev/null @@ -1,79 +0,0 @@ -#region Apache Notice - -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 05:27:09 -0700 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ - -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsNotEqualDeSerializer. - /// - public sealed class IsNotEqualDeSerializer : IDeSerializer - { - private readonly ConfigurationScope _configScope; - - /// - /// - /// - /// - public IsNotEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isNotEqual = new IsNotEqual(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotEqual.Literal = NodeUtils.GetStringAttribute(prop, "literal"); - isNotEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isNotEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isNotEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isNotEqual; - } - - #endregion - } -} \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotNullDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotNullDeSerializer.cs deleted file mode 100644 index b9b2779..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotNullDeSerializer.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsNotNullDeSerializer. - /// - public sealed class IsNotNullDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsNotNullDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a IsNotNull object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsNotNull isNotNull = new IsNotNull(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotNull.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotNull.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNotNull; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs deleted file mode 100644 index 78e6277..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsNotParameterPresentDeSerializer. - /// - public sealed class IsNotParameterPresentDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsNotParameterPresentDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsNotParameterPresent isNotParameterPresent = new IsNotParameterPresent(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotParameterPresent.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - - return isNotParameterPresent; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs deleted file mode 100644 index 88feceb..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsNotPropertyAvailableDeSerializer. - /// - public sealed class IsNotPropertyAvailableDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsNotPropertyAvailableDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a IsNotEmpty object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsNotPropertyAvailable isNotPropertyAvailable = new IsNotPropertyAvailable(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotPropertyAvailable.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotPropertyAvailable.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNotPropertyAvailable; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNullDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsNullDeSerializer.cs deleted file mode 100644 index 8f57619..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsNullDeSerializer.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsNullDeSerializer. - /// - public sealed class IsNullDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsNullDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsNull isNull = new IsNull(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNull.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNull.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNull; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsParameterPresentDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsParameterPresentDeSerializer.cs deleted file mode 100644 index 96296cd..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsParameterPresentDeSerializer.cs +++ /dev/null @@ -1,73 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsParameterPresentDeSerializer. - /// - public sealed class IsParameterPresentDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsParameterPresentDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsParameterPresent isParameterPresent = new IsParameterPresent(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isParameterPresent.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - - return isParameterPresent; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs deleted file mode 100644 index 933a25a..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs +++ /dev/null @@ -1,75 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IsPropertyAvailableDeSerializer. - /// - public sealed class IsPropertyAvailableDeSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IsPropertyAvailableDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a IsNotEmpty object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - IsPropertyAvailable isPropertyAvailable = new IsPropertyAvailable(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isPropertyAvailable.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isPropertyAvailable.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isPropertyAvailable; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/IterateSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/IterateSerializer.cs deleted file mode 100644 index 7c6d924..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/IterateSerializer.cs +++ /dev/null @@ -1,78 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; - -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for IterateSerializer. - /// - public sealed class IterateSerializer : IDeSerializer - { - private ConfigurationScope _configScope = null; - - /// - /// - /// - /// - public IterateSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - - /// - /// Deserialize a Iterate object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - Iterate iterate = new Iterate(_configScope.DataExchangeFactory.AccessorFactory); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - iterate.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - iterate.Property = NodeUtils.GetStringAttribute(prop, "property"); - iterate.Close = NodeUtils.GetStringAttribute(prop, "close"); - iterate.Conjunction = NodeUtils.GetStringAttribute(prop, "conjunction"); - iterate.Open = NodeUtils.GetStringAttribute(prop, "open"); - - return iterate; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/ParameterMapDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/ParameterMapDeSerializer.cs deleted file mode 100644 index 38f1061..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/ParameterMapDeSerializer.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 410610 $ - * $Date: 2006-05-31 11:40:07 -0600 (Wed, 31 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for ParameterMapDeSerializer. - /// - public sealed class ParameterMapDeSerializer - { - /// - /// Deserialize a ParameterMap object - /// - /// - /// - /// - public static ParameterMap Deserialize(XmlNode node, ConfigurationScope configScope) - { - ParameterMap parameterMap = new ParameterMap(configScope.DataExchangeFactory); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - configScope.ErrorContext.MoreInfo = "ParameterMap DeSerializer"; - - parameterMap.ExtendMap = NodeUtils.GetStringAttribute(prop, "extends"); - parameterMap.Id = NodeUtils.GetStringAttribute(prop, "id"); - parameterMap.ClassName = NodeUtils.GetStringAttribute(prop, "class"); - - configScope.ErrorContext.MoreInfo = "Initialize ParameterMap"; - configScope.NodeContext = node; - parameterMap.Initialize( configScope.DataSource.DbProvider.UsePositionalParameters, configScope ); - parameterMap.BuildProperties(configScope); - configScope.ErrorContext.MoreInfo = string.Empty; - - return parameterMap; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/ParameterPropertyDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/ParameterPropertyDeSerializer.cs deleted file mode 100644 index e7bf4b9..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/ParameterPropertyDeSerializer.cs +++ /dev/null @@ -1,69 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 512878 $ - * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for ParameterPropertyDeSerializer. - /// - public sealed class ParameterPropertyDeSerializer - { - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static ParameterProperty Deserialize(XmlNode node, ConfigurationScope configScope) - { - ParameterProperty property = new ParameterProperty(); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - configScope.ErrorContext.MoreInfo = "ParameterPropertyDeSerializer"; - - property.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - property.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - property.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - property.DbType = NodeUtils.GetStringAttribute(prop, "dbType", null); - property.DirectionAttribute = NodeUtils.GetStringAttribute(prop, "direction"); - property.NullValue = prop["nullValue"]; - property.PropertyName = NodeUtils.GetStringAttribute(prop, "property"); - property.Precision = NodeUtils.GetByteAttribute(prop, "precision", 0); - property.Scale = NodeUtils.GetByteAttribute(prop, "scale", 0); - property.Size = NodeUtils.GetIntAttribute(prop, "size", -1); - - return property; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs deleted file mode 100644 index f591151..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/ProcedureDeSerializer.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 475842 $ - * $Date: 2006-11-16 11:07:55 -0700 (Thu, 16 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for ProcedureDeSerializer. - /// - public sealed class ProcedureDeSerializer - { - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Procedure Deserialize(XmlNode node, ConfigurationScope configScope) - { - Procedure procedure = new Procedure(); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - procedure.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - procedure.Id = NodeUtils.GetStringAttribute(prop, "id"); - procedure.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - procedure.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - procedure.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - procedure.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - procedure.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - - return procedure; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/ResultMapDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/ResultMapDeSerializer.cs deleted file mode 100644 index 62adbc2..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/ResultMapDeSerializer.cs +++ /dev/null @@ -1,60 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 470514 $ - * $Date: 2006-11-02 13:46:13 -0700 (Thu, 02 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for ResultMapDeSerializer. - /// - public sealed class ResultMapDeSerializer - { - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static ResultMap Deserialize(XmlNode node, ConfigurationScope configScope) - { - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - ResultMap resultMap = new ResultMap(configScope, prop["id"], prop["class"], prop["extends"], prop["groupBy"]); - - configScope.ErrorContext.MoreInfo = "initialize ResultMap"; - - resultMap.Initialize( configScope ); - - return resultMap; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/ResultPropertyDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/ResultPropertyDeSerializer.cs deleted file mode 100644 index d398e67..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/ResultPropertyDeSerializer.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for ResultPropertyDeSerializer. - /// - public sealed class ResultPropertyDeSerializer - { - /// - /// Deserialize a ResultProperty object - /// - /// - /// - /// - public static ResultProperty Deserialize(XmlNode node, ConfigurationScope configScope) - { - ResultProperty resultProperty = new ResultProperty(); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - resultProperty.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - resultProperty.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - resultProperty.ColumnIndex = NodeUtils.GetIntAttribute( prop, "columnIndex", ResultProperty.UNKNOWN_COLUMN_INDEX ); - resultProperty.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - resultProperty.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - resultProperty.IsLazyLoad = NodeUtils.GetBooleanAttribute( prop, "lazyLoad", false); - resultProperty.NestedResultMapName = NodeUtils.GetStringAttribute(prop, "resultMapping"); - resultProperty.NullValue = prop["nullValue"]; - resultProperty.PropertyName = NodeUtils.GetStringAttribute(prop, "property"); - resultProperty.Select = NodeUtils.GetStringAttribute(prop, "select"); - - return resultProperty; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/SelectDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/SelectDeSerializer.cs deleted file mode 100644 index 6049db1..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/SelectDeSerializer.cs +++ /dev/null @@ -1,81 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for SelectDeSerializer. - /// - public sealed class SelectDeSerializer - { - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Select Deserialize(XmlNode node, ConfigurationScope configScope) - { - Select select = new Select(); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - select.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - select.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - select.Id = NodeUtils.GetStringAttribute(prop, "id"); - select.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - select.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - select.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - select.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - select.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - select.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - int count = node.ChildNodes.Count; - for(int i=0;i - /// Summary description for ArgumentPropertyDeSerializer. - ///
    - public sealed class SqlDeSerializer - { - /// - /// Deserialize a sql tag - /// - /// - /// - /// - public static void Deserialize(XmlNode node, ConfigurationScope configScope) - { - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - string id = NodeUtils.GetStringAttribute(prop, "id"); - - if (configScope.UseStatementNamespaces) - { - id = configScope.ApplyNamespace(id); - } - if (configScope.SqlIncludes.Contains(id)) - { - throw new ConfigurationException("Duplicate -include '" + id + "' found."); - } - else - { - configScope.SqlIncludes.Add(id, node); - } - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/StatementDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/StatementDeSerializer.cs deleted file mode 100644 index af5b8d4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/StatementDeSerializer.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for StatementDeSerializer. - /// - public sealed class StatementDeSerializer - { - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Statement Deserialize(XmlNode node, ConfigurationScope configScope) - { - Statement statement = new Statement(); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - statement.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - statement.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - statement.Id = NodeUtils.GetStringAttribute(prop, "id"); - statement.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - statement.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - statement.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - statement.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - statement.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - statement.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - return statement; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/SubMapDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/SubMapDeSerializer.cs deleted file mode 100644 index c194dc4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/SubMapDeSerializer.cs +++ /dev/null @@ -1,58 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 576082 $ - * $Date: 2007-09-16 06:04:01 -0600 (Sun, 16 Sep 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for SubMapDeSerializer. - /// - public sealed class SubMapDeSerializer - { - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static SubMap Deserialize(XmlNode node, ConfigurationScope configScope) - { - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - string discriminatorValue = NodeUtils.GetStringAttribute(prop, "value"); - string resultMapName = configScope.ApplyNamespace(NodeUtils.GetStringAttribute(prop, "resultMapping")); - - return new SubMap(discriminatorValue, resultMapName); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/TypeAliasDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/TypeAliasDeSerializer.cs deleted file mode 100644 index 48ff85b..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/TypeAliasDeSerializer.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Alias; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for TypeAliasDeSerializer. - /// - public sealed class TypeAliasDeSerializer - { - /// - /// Deserialize a TypeAlias object - /// - /// - /// - /// - public static void Deserialize(XmlNode node, ConfigurationScope configScope) - { - TypeAlias typeAlias = new TypeAlias(); - configScope.ErrorContext.MoreInfo = "loading type alias"; - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - typeAlias.Name = NodeUtils.GetStringAttribute(prop,"alias"); - typeAlias.ClassName = NodeUtils.GetStringAttribute(prop, "type"); - - configScope.ErrorContext.ObjectId = typeAlias.ClassName; - configScope.ErrorContext.MoreInfo = "initialize type alias"; - - typeAlias.Initialize(); - - configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias( typeAlias.Name, typeAlias ); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/TypeHandlerDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/TypeHandlerDeSerializer.cs deleted file mode 100644 index 1ed8516..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/TypeHandlerDeSerializer.cs +++ /dev/null @@ -1,93 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Alias; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for TypeHandlerDeSerializer. - /// - public sealed class TypeHandlerDeSerializer - { - /// - /// Deserialize a TypeHandler object - /// - /// - /// - /// - public static void Deserialize(XmlNode node, ConfigurationScope configScope) - { - TypeHandler handler = new TypeHandler(); - - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - handler.CallBackName = NodeUtils.GetStringAttribute(prop, "callback"); - handler.ClassName = NodeUtils.GetStringAttribute(prop, "type"); - handler.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - - handler.Initialize(); - - configScope.ErrorContext.MoreInfo = "Check the callback attribute '" + handler.CallBackName + "' (must be a classname)."; - ITypeHandler typeHandler = null; - Type type = configScope.SqlMapper.TypeHandlerFactory.GetType(handler.CallBackName); - object impl = Activator.CreateInstance( type ); - if (impl is ITypeHandlerCallback) - { - typeHandler = new CustomTypeHandler((ITypeHandlerCallback) impl); - } - else if (impl is ITypeHandler) - { - typeHandler = (ITypeHandler) impl; - } - else - { - throw new ConfigurationException("The callBack type is not a valid implementation of ITypeHandler or ITypeHandlerCallback"); - } - - // - configScope.ErrorContext.MoreInfo = "Check the type attribute '" + handler.ClassName + "' (must be a class name) or the dbType '" + handler.DbType + "' (must be a DbType type name)."; - if (handler.DbType!= null && handler.DbType.Length > 0) - { - configScope.DataExchangeFactory.TypeHandlerFactory.Register(TypeUtils.ResolveType(handler.ClassName), handler.DbType, typeHandler); - } - else - { - configScope.DataExchangeFactory.TypeHandlerFactory.Register(TypeUtils.ResolveType(handler.ClassName), typeHandler); - } - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Serializers/UpdateDeSerializer.cs b/src/IBatisNet.DataMapper/Configuration/Serializers/UpdateDeSerializer.cs deleted file mode 100644 index 60e7077..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Serializers/UpdateDeSerializer.cs +++ /dev/null @@ -1,80 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Xml; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; - -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers -{ - /// - /// Summary description for UpdateDeSerializer. - /// - public sealed class UpdateDeSerializer - { - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Update Deserialize(XmlNode node, ConfigurationScope configScope) - { - Update update = new Update(); - NameValueCollection prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - update.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - update.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - update.Id = NodeUtils.GetStringAttribute(prop, "id"); - update.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - update.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - update.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - int count = node.ChildNodes.Count; - for(int i=0;i - /// DynamicSql represent the root element of a dynamic sql statement - ///
    - /// - /// ... - /// - internal sealed class DynamicSql : ISql, IDynamicParent - { - - #region Fields - - private IList _children = new ArrayList(); - private IStatement _statement = null ; - private bool _usePositionalParameters = false; - private InlineParameterMapParser _paramParser = null; - private DataExchangeFactory _dataExchangeFactory = null; - - #endregion - - #region Constructor (s) / Destructor - - - /// - /// Initializes a new instance of the class. - /// - /// The config scope. - /// The statement. - internal DynamicSql(ConfigurationScope configScope, IStatement statement) - { - _statement = statement; - - _usePositionalParameters = configScope.DataSource.DbProvider.UsePositionalParameters; - _dataExchangeFactory = configScope.DataExchangeFactory; - } - #endregion - - #region Methods - - #region ISql IDynamicParent - - /// - /// - /// - /// - public void AddChild(ISqlChild child) - { - _children.Add(child); - } - - #endregion - - #region ISql Members - - - /// - /// Builds a new and the text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - RequestScope request = new RequestScope( _dataExchangeFactory, session, _statement); - - _paramParser = new InlineParameterMapParser(); - - string sqlStatement = Process(request, parameterObject); - request.PreparedStatement = BuildPreparedStatement(session, request, sqlStatement); - request.MappedStatement = mappedStatement; - - return request; - } - - - #endregion - - /// - /// - /// - /// - /// - /// - private string Process(RequestScope request, object parameterObject) - { - SqlTagContext ctx = new SqlTagContext(); - IList localChildren = _children; - - ProcessBodyChildren(request, ctx, parameterObject, localChildren); - - // Builds a 'dynamic' ParameterMap - ParameterMap map = new ParameterMap(request.DataExchangeFactory); - map.Id = _statement.Id + "-InlineParameterMap"; - map.Initialize(_usePositionalParameters, request); - map.Class = _statement.ParameterClass; - - // Adds 'dynamic' ParameterProperty - IList parameters = ctx.GetParameterMappings(); - int count = parameters.Count; - for(int i=0;i - /// - ///
    - /// - /// - /// - /// - private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, - object parameterObject, IList localChildren) - { - StringBuilder buffer = ctx.GetWriter(); - ProcessBodyChildren(request, ctx, parameterObject, localChildren.GetEnumerator(), buffer); - } - - - /// - /// - /// - /// - /// - /// - /// - /// - private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, - object parameterObject, IEnumerator localChildren, StringBuilder buffer) - { - while (localChildren.MoveNext()) - { - ISqlChild child = (ISqlChild) localChildren.Current; - - if (child is SqlText) - { - SqlText sqlText = (SqlText) child; - string sqlStatement = sqlText.Text; - if (sqlText.IsWhiteSpace) - { - buffer.Append(sqlStatement); - } - else - { -// if (SimpleDynamicSql.IsSimpleDynamicSql(sqlStatement)) -// { -// sqlStatement = new SimpleDynamicSql(sqlStatement, _statement).GetSql(parameterObject); -// SqlText newSqlText = _paramParser.ParseInlineParameterMap( null, sqlStatement ); -// sqlStatement = newSqlText.Text; -// ParameterProperty[] mappings = newSqlText.Parameters; -// if (mappings != null) -// { -// for (int i = 0; i < mappings.Length; i++) -// { -// ctx.AddParameterMapping(mappings[i]); -// } -// } -// } - // BODY OUT - buffer.Append(" "); - buffer.Append(sqlStatement); - - ParameterProperty[] parameters = sqlText.Parameters; - if (parameters != null) - { - int length = parameters.Length; - for (int i = 0; i< length; i++) - { - ctx.AddParameterMapping(parameters[i]); - } - } - } - } - else if (child is SqlTag) - { - SqlTag tag = (SqlTag) child; - ISqlTagHandler handler = tag.Handler; - int response = BaseTagHandler.INCLUDE_BODY; - - do - { - StringBuilder body = new StringBuilder(); - - response = handler.DoStartFragment(ctx, tag, parameterObject); - if (response != BaseTagHandler.SKIP_BODY) - { - if (ctx.IsOverridePrepend - && ctx.FirstNonDynamicTagWithPrepend == null - && tag.IsPrependAvailable - && !(tag.Handler is DynamicTagHandler)) - { - ctx.FirstNonDynamicTagWithPrepend = tag; - } - - ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), body); - - response = handler.DoEndFragment(ctx, tag, parameterObject, body); - handler.DoPrepend(ctx, tag, parameterObject, body); - if (response != BaseTagHandler.SKIP_BODY) - { - if (body.Length > 0) - { - // BODY OUT - - if (handler.IsPostParseRequired) - { - SqlText sqlText = _paramParser.ParseInlineParameterMap(request, null, body.ToString() ); - buffer.Append(sqlText.Text); - ParameterProperty[] mappings = sqlText.Parameters; - if (mappings != null) - { - int length = mappings.Length; - for (int i = 0; i< length; i++) - { - ctx.AddParameterMapping(mappings[i]); - } - } - } - else - { - buffer.Append(" "); - buffer.Append(body.ToString()); - } - if (tag.IsPrependAvailable && tag == ctx.FirstNonDynamicTagWithPrepend) - { - ctx.IsOverridePrepend = false; - } - } - } - } - } - while (response == BaseTagHandler.REPEAT_BODY); - } - } - } - - - /// - /// - /// - /// - /// - /// - /// - private PreparedStatement BuildPreparedStatement(ISqlMapSession session, RequestScope request, string sqlStatement) - { - PreparedStatementFactory factory = new PreparedStatementFactory( session, request, _statement, sqlStatement); - return factory.Prepare(); - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/BaseTag.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/BaseTag.cs deleted file mode 100644 index 96e5788..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/BaseTag.cs +++ /dev/null @@ -1,72 +0,0 @@ -#region Apache Notice - -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 14:11:57 -0700 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ - -#endregion - -#region Imports - -using System; -using System.Xml.Serialization; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Summary description for BaseTag. - /// - [Serializable] - public abstract class BaseTag : SqlTag - { - #region Fields - - [NonSerialized] - private string _property = string.Empty; - [NonSerialized] - private string _literal = string.Empty; - - #endregion - - /// - /// Property attribute - /// - [XmlAttribute("property")] - public string Property - { - get { return _property; } - set { _property = value; } - } - - /// - /// Property attribute - /// - [XmlAttribute("literal")] - public string Literal - { - get { return _literal; } - set { _literal = value; } - } - } -} \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Conditional.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Conditional.cs deleted file mode 100644 index 4339bed..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Conditional.cs +++ /dev/null @@ -1,86 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Xml.Serialization; - -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Summary description for Conditional. - /// - [Serializable] - public abstract class Conditional : BaseTag - { - - #region Fields - - [NonSerialized] - private string _compareValue = string.Empty; - [NonSerialized] - private string _compareProperty = string.Empty; - - #endregion - - /// - /// CompareProperty attribute - /// - [XmlAttribute("compareProperty")] - public string CompareProperty - { - get - { - return _compareProperty; - } - set - { - _compareProperty = value; - } - } - - - /// - /// CompareValue attribute - /// - [XmlAttribute("compareValue")] - public string CompareValue - { - get - { - return _compareValue; - } - set - { - _compareValue = value; - } - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Dynamic.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Dynamic.cs deleted file mode 100644 index 844cf33..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Dynamic.cs +++ /dev/null @@ -1,54 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Summary description for DynamicTag. - /// - [Serializable] - [XmlRoot("dynamic", Namespace="http://ibatis.apache.org/mapping")] - public sealed class Dynamic : SqlTag - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public Dynamic(AccessorFactory accessorFactory) - { - this.Handler = new DynamicTagHandler(accessorFactory); - } - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs deleted file mode 100644 index 95cc8c9..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs +++ /dev/null @@ -1,46 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; - -using IBatisNet.DataMapper.Configuration.Sql; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Summary description for DynamicParent. - /// - public interface IDynamicParent - { - - /// - /// - /// - /// - void AddChild(ISqlChild child); - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEmpty.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEmpty.cs deleted file mode 100644 index dd7999e..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEmpty.cs +++ /dev/null @@ -1,54 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using IBatisNet.DataMapper.Scope; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isEmpty sql tag element. - /// - [Serializable] - [XmlRoot("isEmpty", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsEmpty : BaseTag - { - - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEmpty(AccessorFactory accessorFactory) - { - this.Handler = new IsEmptyTagHandler(accessorFactory); - } - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEqual.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEqual.cs deleted file mode 100644 index a96ab8e..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsEqual.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isEqual sql tag element. - /// - [Serializable] - [XmlRoot("isEqual", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsEqual : Conditional - { - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEqual(AccessorFactory accessorFactory) - { - this.Handler = new IsEqualTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs deleted file mode 100644 index 09e85aa..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isGreaterEqual sql tag element. - /// - [Serializable] - [XmlRoot("isGreaterEqual", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsGreaterEqual : Conditional - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterEqual(AccessorFactory accessorFactory) - { - this.Handler = new IsGreaterEqualTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs deleted file mode 100644 index 6072037..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isGreaterThan sql tag element. - /// - [Serializable] - [XmlRoot("isGreaterThan", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsGreaterThan : Conditional - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterThan(AccessorFactory accessorFactory) - { - this.Handler = new IsGreaterThanTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs deleted file mode 100644 index be27911..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isLessEqual sql tag element. - /// - [Serializable] - [XmlRoot("isLessEqual", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsLessEqual : Conditional - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessEqual(AccessorFactory accessorFactory) - { - this.Handler = new IsLessEqualTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessThan.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessThan.cs deleted file mode 100644 index 798ef0e..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsLessThan.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isLessThan sql tag element. - /// - [Serializable] - [XmlRoot("isLessThan", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsLessThan : Conditional - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessThan(AccessorFactory accessorFactory) - { - this.Handler = new IsLessThanTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs deleted file mode 100644 index bc08fb4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs +++ /dev/null @@ -1,52 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isNotEmpty sql tag element. - /// - [Serializable] - [XmlRoot("isNotEmpty", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsNotEmpty : BaseTag - { - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEmpty(AccessorFactory accessorFactory) - { - this.Handler = new IsNotEmptyTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs deleted file mode 100644 index cf4414d..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs +++ /dev/null @@ -1,52 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isNotEqual sql tag element. - /// - [Serializable] - [XmlRoot("isNotEqual", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsNotEqual: Conditional - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEqual(AccessorFactory accessorFactory) - { - this.Handler = new IsNotEqualTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotNull.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotNull.cs deleted file mode 100644 index b808bc7..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotNull.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isNotNull sql tag element. - /// - [Serializable] - [XmlRoot("isNotNull", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsNotNull : BaseTag - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotNull(AccessorFactory accessorFactory) - { - this.Handler = new IsNotNullTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs deleted file mode 100644 index 29989b1..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isNotParameterPresent sql tag element. - /// - [Serializable] - [XmlRoot("isNotParameterPresent", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsNotParameterPresent : SqlTag - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotParameterPresent(AccessorFactory accessorFactory) - { - this.Handler = new IsNotParameterPresentTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs deleted file mode 100644 index 16af2c8..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isEmpty sql tag element. - /// - [Serializable] - [XmlRoot("isNotPropertyAvailable", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsNotPropertyAvailable : BaseTag - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotPropertyAvailable(AccessorFactory accessorFactory) - { - this.Handler = new IsNotPropertyAvailableTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNull.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNull.cs deleted file mode 100644 index bcd2766..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsNull.cs +++ /dev/null @@ -1,49 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isNull sql tag element. - /// - [Serializable] - [XmlRoot("isNull", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsNull : BaseTag - { - /// - /// - /// - public IsNull(AccessorFactory accessorFactory) - { - this.Handler = new IsNullTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs deleted file mode 100644 index d1d19f4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isParameterPresent sql tag element. - /// - [Serializable] - [XmlRoot("isParameterPresent", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsParameterPresent : SqlTag - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsParameterPresent(AccessorFactory accessorFactory) - { - this.Handler = new IsParameterPresentTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs deleted file mode 100644 index 73bc9b2..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs +++ /dev/null @@ -1,51 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an isPropertyAvailable sql tag element. - /// - [Serializable] - [XmlRoot("isPropertyAvailable", Namespace="http://ibatis.apache.org/mapping")] - public sealed class IsPropertyAvailable : BaseTag - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsPropertyAvailable(AccessorFactory accessorFactory) - { - this.Handler = new IsPropertyAvailableTagHandler(accessorFactory); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Iterate.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Iterate.cs deleted file mode 100644 index e7c46a0..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/Iterate.cs +++ /dev/null @@ -1,116 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// Represent an iterate sql tag element. - /// - [Serializable] - [XmlRoot("iterate", Namespace="http://ibatis.apache.org/mapping")] - public sealed class Iterate : BaseTag - { - - #region Fields - - [NonSerialized] - private string _open = string.Empty; - [NonSerialized] - private string _close = string.Empty; - [NonSerialized] - private string _conjunction = string.Empty; - - #endregion - - - /// - /// Conjonction attribute - /// - [XmlAttribute("conjunction")] - public string Conjunction - { - get - { - return _conjunction; - } - set - { - _conjunction = value; - } - } - - - /// - /// Close attribute - /// - [XmlAttribute("close")] - public string Close - { - get - { - return _close; - } - set - { - _close = value; - } - } - - - /// - /// Open attribute - /// - [XmlAttribute("open")] - public string Open - { - get - { - return _open; - } - set - { - _open = value; - } - } - - - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public Iterate(AccessorFactory accessorFactory) - { - this.Handler = new IterateTagHandler(accessorFactory); - } - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/SqlTag.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/SqlTag.cs deleted file mode 100644 index 3de0052..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Elements/SqlTag.cs +++ /dev/null @@ -1,145 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Collections; -using System.Xml.Serialization; - -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements -{ - /// - /// SqlTag is a children element of dynamic Sql element. - /// SqlTag represent any binary unary/conditional element (like isEmpty, isNull, iEquall...) - /// or other element as isParameterPresent, isNotParameterPresent, iterate. - /// - [Serializable] - public abstract class SqlTag : ISqlChild, IDynamicParent - { - - #region Fields - - [NonSerialized] - private string _prepend = string.Empty; - [NonSerialized] - private ISqlTagHandler _handler = null; - [NonSerialized] - private SqlTag _parent = null; - [NonSerialized] - private IList _children = new ArrayList(); - - #endregion - - /// - /// Parent tag element - /// - [XmlIgnoreAttribute] - public SqlTag Parent - { - get - { - return _parent; - } - set - { - _parent = value; - } - } - - - /// - /// Prepend attribute - /// - [XmlAttribute("prepend")] - public string Prepend - { - get - { - return _prepend; - } - set - { - _prepend = value; - } - } - - - /// - /// Handler for this sql tag - /// - [XmlIgnoreAttribute] - public ISqlTagHandler Handler - { - - get - { - return _handler; - } - set - { - _handler = value; - } - } - - /// - /// - /// - public bool IsPrependAvailable - { - get - { - return (_prepend != null && _prepend.Length > 0); - } - } - - /// - /// - /// - /// - public IEnumerator GetChildrenEnumerator() - { - return _children.GetEnumerator(); - } - - #region IDynamicParent Members - - /// - /// - /// - /// - public void AddChild(ISqlChild child) - { - if (child is SqlTag) - { - ((SqlTag) child).Parent = this; - } - _children.Add(child); - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs deleted file mode 100644 index 8c84754..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs +++ /dev/null @@ -1,153 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using System.Text; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Description rsume de BaseTagHandler. - /// - public abstract class BaseTagHandler : ISqlTagHandler - { - - #region Const - /// - /// BODY TAG - /// - public const int SKIP_BODY = 0; - /// - /// - /// - public const int INCLUDE_BODY = 1; - /// - /// - /// - public const int REPEAT_BODY = 2; - #endregion - - private AccessorFactory _accessorFactory = null; - - /// - /// The factory which build - /// - public AccessorFactory AccessorFactory - { - get { return _accessorFactory; } - } - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public BaseTagHandler(AccessorFactory accessorFactory) - { - _accessorFactory = accessorFactory; - } - - #region Methods - /// - /// - /// - /// - /// - /// - /// - public virtual int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return BaseTagHandler.INCLUDE_BODY; - } - - /// - /// - /// - /// - /// - /// - /// - /// - public virtual int DoEndFragment(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) - { - return BaseTagHandler.INCLUDE_BODY; - } - - /// - /// - /// - /// - /// - /// - /// - public virtual void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) - { - if (tag.IsPrependAvailable) - { - if (bodyContent.ToString().Trim().Length > 0) - { - if (ctx.IsOverridePrepend && tag == ctx.FirstNonDynamicTagWithPrepend) - { - ctx.IsOverridePrepend = false; - } - else - { - bodyContent.Insert(0, tag.Prepend); - } - } - else - { - if (ctx.FirstNonDynamicTagWithPrepend != null) - { - ctx.FirstNonDynamicTagWithPrepend = null; - ctx.IsOverridePrepend =true; - } - } - } - } - - - #region ISqlTagHandler Menbers - - /// - /// - /// - public virtual bool IsPostParseRequired - { - get - { - return false; - } - } - - - #endregion - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs deleted file mode 100644 index 6d937ac..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs +++ /dev/null @@ -1,281 +0,0 @@ -#region Apache Notice - -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 06:21:44 -0700 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ - -#endregion - -#region Imports - -using System; -using System.Text; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Exceptions; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Description rsume de ConditionalTagHandler. - /// - public abstract class ConditionalTagHandler : BaseTagHandler - { - #region Const - - /// - /// - /// - public const long NOT_COMPARABLE = long.MinValue; - - #endregion - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public ConditionalTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - #region Methods - - /// - /// - /// - /// - /// - /// - /// - public abstract bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject); - - /// - /// - /// - /// - /// - /// - /// - public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject) - { - if (IsCondition(ctx, tag, parameterObject)) - { - return INCLUDE_BODY; - } - else - { - return SKIP_BODY; - } - } - - /// - /// - /// - /// - /// - /// - /// - /// - public override int DoEndFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject, - StringBuilder bodyContent) - { - return INCLUDE_BODY; - } - - /// - /// - /// - /// - /// - /// - /// - protected long Compare(SqlTagContext ctx, SqlTag sqlTag, object parameterObject) - { - var tag = (Conditional)sqlTag; - string propertyName = tag.Property; - string literal = tag.Literal; - string comparePropertyName = tag.CompareProperty; - string compareValue = tag.CompareValue; - - object value1 = null; - Type type = null; - if (propertyName != null && propertyName.Length > 0) - { - IterateContext iterate = ctx.PeekIterateContext(); - - if (iterate != null) - propertyName = propertyName.Replace("[]", "[" + (iterate.Index + 1) + "]"); - - value1 = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory); - type = value1.GetType(); - } - else if (!String.IsNullOrEmpty(literal)) - { - value1 = literal; - type = value1.GetType(); - } - else - { - value1 = parameterObject; - if (value1 != null) - { - type = parameterObject.GetType(); - } - else - { - type = typeof(object); - } - } - if (comparePropertyName != null && comparePropertyName.Length > 0) - { - object value2 = ObjectProbe.GetMemberValue(parameterObject, comparePropertyName, AccessorFactory); - return CompareValues(type, value1, value2); - } - else if (!String.IsNullOrEmpty(compareValue)) - { - return CompareValues(type, value1, compareValue); - } - else - { - throw new DataMapperException("Error comparing in conditional fragment. Uknown 'compare to' values."); - } - } - - /// - /// - /// - /// - /// - /// - /// - protected long CompareValues(Type type, object value1, object value2) - { - long result = NOT_COMPARABLE; - - if (value1 == null || value2 == null) - { - result = value1 == value2 ? 0 : NOT_COMPARABLE; - } - else - { - if (value2.GetType() != type) - { - value2 = ConvertValue(type, value2.ToString()); - } - if (value2 is string && type != typeof(string)) - { - value1 = value1.ToString(); - } - if (!(value1 is IComparable && value2 is IComparable)) - { - value1 = value1.ToString(); - value2 = value2.ToString(); - } - result = ((IComparable)value1).CompareTo(value2); - } - - return result; - } - - /// - /// - /// - /// - /// - /// - protected object ConvertValue(Type type, string value) - { - if (type == typeof(String)) - { - return value; - } - else if (type == typeof(bool)) - { - return Convert.ToBoolean(value); - } - else if (type == typeof(Byte)) - { - return Convert.ToByte(value); - } - else if (type == typeof(Char)) - { - return Convert.ToChar(value.Substring(0, 1)); //new Character(value.charAt(0)); - } - else if (type == typeof(DateTime)) - { - try - { - return Convert.ToDateTime(value); - } - catch (Exception e) - { - throw new DataMapperException("Error parsing date. Cause: " + e.Message, e); - } - } - else if (type == typeof(Decimal)) - { - return Convert.ToDecimal(value); - } - else if (type == typeof(Double)) - { - return Convert.ToDouble(value); - } - else if (type == typeof(Int16)) - { - return Convert.ToInt16(value); - } - else if (type == typeof(Int32)) - { - return Convert.ToInt32(value); - } - else if (type == typeof(Int64)) - { - return Convert.ToInt64(value); - } - else if (type == typeof(Single)) - { - return Convert.ToSingle(value); - } - else if (type.IsEnum) - { - try - { - return Enum.Parse(type, value); - } - catch - { - return value; - } - } - else - { - return value; - } - } - - #endregion - } -} \ No newline at end of file diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs deleted file mode 100644 index b71bb7a..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs +++ /dev/null @@ -1,70 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for DynamicTagHandler. - /// - public sealed class DynamicTagHandler : BaseTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public DynamicTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - #region Methods - /// - /// - /// - /// - /// - /// - /// - public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, Object parameterObject) - { - ctx.FirstNonDynamicTagWithPrepend = null ; - if (tag.IsPrependAvailable) - { - ctx.IsOverridePrepend = true; - } - return BaseTagHandler.INCLUDE_BODY; - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs deleted file mode 100644 index 7dd08e0..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs +++ /dev/null @@ -1,79 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Text; - -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for ISqlTagHandler. - /// - public interface ISqlTagHandler - { - - /// - /// - /// - /// - /// - /// - /// - int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject); - - /// - /// - /// - /// - /// - /// - /// - /// - int DoEndFragment(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent); - - /// - /// - /// - /// - /// - /// - /// - void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent); - - /// - /// - /// - bool IsPostParseRequired - { - get; - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs deleted file mode 100644 index b17b738..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs +++ /dev/null @@ -1,97 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Collections; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.Common.Utilities.Objects; - -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// IsEmptyTagHandler represent a isEmpty tag element in a dynamic mapped statement. - /// - public class IsEmptyTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEmptyTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - #region Methods - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - if (parameterObject == null) - { - return true; - } - else - { - string propertyName = ((BaseTag)tag).Property; - object value = null; - if (propertyName != null && propertyName.Length>0) - { - value = ObjectProbe.GetMemberValue(parameterObject, propertyName, this.AccessorFactory); - } - else - { - value = parameterObject; - } - if (value is ICollection) - { - return ((value == null) || (((ICollection) value).Count< 1)); - } - else if (value != null && typeof(Array).IsAssignableFrom(value.GetType())) //value.GetType().IsArray - { - return ((Array) value).GetLength(0) == 0; - } - else - { - return ((value == null) || (System.Convert.ToString(value).Equals(""))); - } - } - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs deleted file mode 100644 index 1306be8..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs +++ /dev/null @@ -1,66 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsEqualTagHandler. - /// - public class IsEqualTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - #region Methods - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return (this.Compare(ctx, tag, parameterObject) == 0); - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs deleted file mode 100644 index 80b7b7b..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs +++ /dev/null @@ -1,68 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - - /// - /// Summary description for IsGreaterEqualTagHandler. - /// - public sealed class IsGreaterEqualTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - #region Methods - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - long x = this.Compare(ctx, tag, parameterObject); - return ((x >= 0) && (x != ConditionalTagHandler.NOT_COMPARABLE)); - } - #endregion - } - -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs deleted file mode 100644 index d657003..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs +++ /dev/null @@ -1,61 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsGreaterThanTagHandler. - /// - public sealed class IsGreaterThanTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterThanTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - long x = this.Compare(ctx, tag, parameterObject); - return ((x > 0) && x != (ConditionalTagHandler.NOT_COMPARABLE)); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs deleted file mode 100644 index 5291436..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs +++ /dev/null @@ -1,62 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsLessEqualTagHandler. - /// - public sealed class IsLessEqualTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - long x = this.Compare(ctx, tag, parameterObject); - return ((x <= 0) && (x != ConditionalTagHandler.NOT_COMPARABLE)); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs deleted file mode 100644 index 89f5e02..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs +++ /dev/null @@ -1,62 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsLessThanTagHandler. - /// - public sealed class IsLessThanTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessThanTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - long x = this.Compare(ctx, tag, parameterObject); - return ((x < 0) && (x != ConditionalTagHandler.NOT_COMPARABLE)); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs deleted file mode 100644 index 3f9819d..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs +++ /dev/null @@ -1,60 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsNotEmptyTagHandler. - /// - public sealed class IsNotEmptyTagHandler : IsEmptyTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEmptyTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs deleted file mode 100644 index d5e5165..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs +++ /dev/null @@ -1,60 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsNotEqualTagHandler. - /// - public sealed class IsNotEqualTagHandler : IsEqualTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs deleted file mode 100644 index 1e81b85..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs +++ /dev/null @@ -1,61 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsNotNullTagHandler. - /// - public sealed class IsNotNullTagHandler : IsNullTagHandler - { - - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotNullTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs deleted file mode 100644 index c008580..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs +++ /dev/null @@ -1,61 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsNotParameterPresentTagHandler. - /// - public sealed class IsNotParameterPresentTagHandler : IsParameterPresentTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotParameterPresentTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs deleted file mode 100644 index 2312181..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs +++ /dev/null @@ -1,61 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsNotPropertyAvailableTagHandler. - /// - public class IsNotPropertyAvailableTagHandler : IsPropertyAvailableTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotPropertyAvailableTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs deleted file mode 100644 index c419d35..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs +++ /dev/null @@ -1,77 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsNullTagHandler. - /// - public class IsNullTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNullTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - if (parameterObject == null) - { - return true; - } - else - { - string propertyName = ((BaseTag)tag).Property; - object value; - if (propertyName != null && propertyName.Length>0 ) - { - value = ObjectProbe.GetMemberValue(parameterObject, propertyName, this.AccessorFactory); - } - else - { - value = parameterObject; - } - return (value == null); - } - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs deleted file mode 100644 index 08a70ae..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs +++ /dev/null @@ -1,61 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsParameterPresentTagHandler. - /// - public class IsParameterPresentTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsParameterPresentTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return (parameterObject != null); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs deleted file mode 100644 index a36a29e..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs +++ /dev/null @@ -1,71 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.Common.Utilities.Objects; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IsPropertyAvailableTagHandler. - /// - public class IsPropertyAvailableTagHandler : ConditionalTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsPropertyAvailableTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - if (parameterObject == null) - { - return false; - } - else - { - return ObjectProbe.HasReadableProperty(parameterObject, ((BaseTag)tag).Property); - } - } - } - -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateContext.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateContext.cs deleted file mode 100644 index 6d7ffe8..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateContext.cs +++ /dev/null @@ -1,199 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Collections; - -using IBatisNet.DataMapper.Exceptions; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IterateContext. - /// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp01212002.asp - /// http://www.microsoft.com/mspress/books/sampchap/6173.asp - /// http://www.dur.ac.uk/barry.cornelius/java/a.taste.of.csharp/onefile/ - /// - public sealed class IterateContext : IEnumerator - { - #region Fields - private ICollection _collection; - private ArrayList _items = new ArrayList(); - int _index = -1; - #endregion - - - /// - /// Constructor - /// - /// - public IterateContext(object collection) - { - if (collection is ICollection) - { - _collection = (ICollection)collection; - } - else if (collection.GetType().IsArray) - { - object[] array = (object[])collection; - ArrayList list = new ArrayList(); - int lenght = array.Length; - for(int i=0;i - /// Sets the enumerator to its initial position, - /// which is before the first element in the collection. - ///
    - public void Reset() - { - _index = -1; - } - - /// - /// Advances the enumerator to the next element of the collection. - /// - /// - /// True if the enumerator was successfully advanced to the next element; - /// False if the enumerator has passed the end of the collection. - /// - public bool MoveNext() - { - _index++; - if (_index == _items.Count) - return false; - - return true; - } - - /// - /// Gets the current element in the collection. - /// - public object Current - { - get - { - return _items[_index]; - } - } - - /// - /// Gets the index of the current element in the collection. - /// - public int Index - { - get - { - return _index; - } - } - - /// - /// Return true if the current element is the first. - /// - public bool IsFirst - { - get - { - return (_index == 0); - } - } - - /// - /// Return true if the current element is the last. - /// - public bool IsLast - { - get - { - return (_index == (_items.Count-1)); - } - } - - /// - /// Removes from the underlying collection the last element returned by the iterator. - /// - public void Remove() - { - if (_collection is IList) - { - ((IList)_collection).Remove(this.Current); - } - else if (_collection is IDictionary) - { - ((IDictionary)_collection).Remove(this.Current); - } - } - - /// - /// Returns true if the iteration has more elements. (In other words, returns true - /// if next would return an element rather than throwing an exception.) - /// - public bool HasNext - { - get - { - if ( (_index >=-1) && (_index <(_items.Count-1))) - { - return true; - } - else - { - return false; - } - } - } - - } - - -} - diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs deleted file mode 100644 index 2fe952c..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs +++ /dev/null @@ -1,197 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region using - -using System.Text; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.Common.Utilities.Objects; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for IterateTagHandler. - /// - public sealed class IterateTagHandler : BaseTagHandler - { - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IterateTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) - { - } - - /// - /// - /// - /// - /// - /// - /// - public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - IterateContext iterate = (IterateContext) ctx.GetAttribute(tag); - if (iterate == null) - { - string propertyName = ((BaseTag)tag).Property; - object collection; - if (propertyName != null && propertyName.Length>0) - { - collection = ObjectProbe.GetMemberValue(parameterObject, propertyName, this.AccessorFactory); - } - else - { - collection = parameterObject; - } - iterate = new IterateContext(collection); - ctx.AddAttribute(tag, iterate); - - ctx.PushIterateContext(iterate); - } - if (iterate != null && iterate.HasNext) - { - return BaseTagHandler.INCLUDE_BODY; - } - else - { - return BaseTagHandler.SKIP_BODY; - } - } - - - /// - /// - /// - /// - /// - /// - /// - public override void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) - { - IterateContext iterate = (IterateContext) ctx.GetAttribute(tag); - if (iterate.IsFirst) - { - base.DoPrepend(ctx, tag, parameterObject, bodyContent); - } - } - - /// - /// - /// - /// - /// - /// - /// - /// - public override int DoEndFragment(SqlTagContext ctx, SqlTag tag, - object parameterObject, StringBuilder bodyContent) - { - IterateContext iterate = (IterateContext) ctx.GetAttribute(tag); - - if (iterate.MoveNext()) - { - string propertyName = ((BaseTag)tag).Property; - if (propertyName == null) - { - propertyName = ""; - } - - string find = propertyName + "[]"; - string replace = propertyName + "[" + iterate.Index + "]";//Parameter-index-Dynamic - Replace(bodyContent, find, replace); - - if (iterate.IsFirst) - { - string open = ((Iterate)tag).Open; - if (open != null) - { - bodyContent.Insert(0,open); - bodyContent.Insert(0,' '); - } - } - if (!iterate.IsLast) - { - string conjunction = ((Iterate)tag).Conjunction; - if (conjunction != null) - { - bodyContent.Append(conjunction); - bodyContent.Append(' '); - } - } - if (iterate.IsLast) - { - string close = ((Iterate)tag).Close; - if (close != null) - { - bodyContent.Append(close); - } - } - - return BaseTagHandler.REPEAT_BODY; - } - else - { - ctx.PopIterateContext(); - - return BaseTagHandler.INCLUDE_BODY; - } - } - - /// - /// - /// - /// - /// - /// - private static void Replace(StringBuilder buffer, string find, string replace) - { - int start = buffer.ToString().IndexOf(find); - int length = find.Length; - while (start > -1) - { - buffer = buffer.Replace(find, replace, start, length); - start = buffer.ToString().IndexOf(find); - } - } - - /// - /// - /// - public override bool IsPostParseRequired - { - get - { - return true; - } - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs deleted file mode 100644 index a6f04ea..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs +++ /dev/null @@ -1,169 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports - -using System.Collections; -using System.Text; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using System.Collections.Generic; - -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers -{ - /// - /// Summary description for SqlTagContext. - /// - public sealed class SqlTagContext - { - #region Fields - private Hashtable _attributes = new Hashtable(); - private bool _overridePrepend = false; - private SqlTag _firstNonDynamicTagWithPrepend = null; - private ArrayList _parameterMappings = new ArrayList(); - private StringBuilder buffer = new StringBuilder(); - Stack _iterates = new Stack(); - #endregion - - /// - /// - /// - public SqlTagContext() - { - _overridePrepend = false; - } - - /// - /// - /// - /// - public StringBuilder GetWriter() - { - return buffer; - } - - /// - /// - /// - public string BodyText - { - get - { - return buffer.ToString().Trim(); - } - } - - /// - /// - /// - public bool IsOverridePrepend - { - set - { - _overridePrepend = value; - } - get - { - return _overridePrepend; - } - } - - /// - /// - /// - public SqlTag FirstNonDynamicTagWithPrepend - { - get - { - return _firstNonDynamicTagWithPrepend; - } - set - { - _firstNonDynamicTagWithPrepend = value; - } - } - - - /// - /// - /// - /// - /// - public void AddAttribute(object key, object value) - { - _attributes.Add(key, value); - } - - /// - /// - /// - /// - /// - public object GetAttribute(object key) - { - return _attributes[key]; - } - - /// - /// - /// - /// - public void AddParameterMapping(ParameterProperty mapping) - { - _parameterMappings.Add(mapping); - } - - /// - /// - /// - /// - public IList GetParameterMappings() - { - return _parameterMappings; - } - - public void PushIterateContext(IterateContext iterate) - { - _iterates.Push(iterate); - } - - public IterateContext PeekIterateContext() - { - if (_iterates.Count > 0) - return _iterates.Peek(); - else - return null; - } - - public IterateContext PopIterateContext() - { - return _iterates.Pop(); - } - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/ISqlChild.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/ISqlChild.cs deleted file mode 100644 index 8a85ceb..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/ISqlChild.cs +++ /dev/null @@ -1,40 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic -{ - /// - /// Summary description for ISqlChild. - /// - public interface ISqlChild - { - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/SqlText.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/SqlText.cs deleted file mode 100644 index 12e31d4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Dynamic/SqlText.cs +++ /dev/null @@ -1,96 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using System; - -using IBatisNet.Common; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic -{ - /// - /// Summary description for SqlText. - /// - public sealed class SqlText : ISqlChild - { - - #region Fields - - private string _text = string.Empty; - private bool _isWhiteSpace = false; - private ParameterProperty[] _parameters = null; - - #endregion - - #region Properties - /// - /// - /// - public string Text - { - get - { - return _text; - } - set - { - _text = value; - _isWhiteSpace = (_text.Trim().Length == 0); - } - } - - /// - /// - /// - public bool IsWhiteSpace - { - get - { - return _isWhiteSpace; - } - } - - /// - /// - /// - public ParameterProperty[] Parameters - { - get - { - return _parameters; - } - set - { - _parameters = value; - } - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/ISql.cs b/src/IBatisNet.DataMapper/Configuration/Sql/ISql.cs deleted file mode 100644 index 8457880..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/ISql.cs +++ /dev/null @@ -1,54 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 476843 $ - * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System.Data; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; - -namespace IBatisNet.DataMapper.Configuration.Sql -{ - /// - /// Summary description for ISql. - /// - public interface ISql - { - - #region Methods - /// - /// Builds a new and the text to execute. - /// - /// - /// The parameter object (used by DynamicSql/SimpleDynamicSql). - /// Use to complete the sql statement. - /// - /// The current session - /// The . - /// A new . - RequestScope GetRequestScope(IMappedStatement mappedStatement, object parameterObject, ISqlMapSession session); - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs b/src/IBatisNet.DataMapper/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs deleted file mode 100644 index 7bf8778..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs +++ /dev/null @@ -1,212 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 476843 $ - * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports - -using System.Collections; -using System.Text; - -using IBatisNet.DataMapper.Configuration.Sql; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.SimpleDynamic -{ - /// - /// Summary description for SimpleDynamicSql. - /// - internal sealed class SimpleDynamicSql : ISql - { - - #region private - - private const string ELEMENT_TOKEN = "$"; - - private string _simpleSqlStatement = string.Empty; - private IStatement _statement = null ; - private DataExchangeFactory _dataExchangeFactory = null; - - #endregion - - #region Constructor (s) / Destructor - - /// - /// Initializes a new instance of the class. - /// - /// The scope. - /// The SQL statement. - /// The statement. - internal SimpleDynamicSql(IScope scope, - string sqlStatement, - IStatement statement) - { - _simpleSqlStatement = sqlStatement; - _statement = statement; - - _dataExchangeFactory = scope.DataExchangeFactory; - } - #endregion - - #region Methods - /// - /// - /// - /// - /// - public string GetSql(object parameterObject) - { - return ProcessDynamicElements(parameterObject); - } - - /// - /// - /// - /// - /// - public static bool IsSimpleDynamicSql(string sqlStatement) - { - return ( (sqlStatement != null) && (sqlStatement.IndexOf(ELEMENT_TOKEN) > -1) ); - } - - /// - /// - /// - /// - /// - private string ProcessDynamicElements(object parameterObject) - { - // define which character is seperating fields - - StringTokenizer parser = new StringTokenizer(_simpleSqlStatement, ELEMENT_TOKEN, true); - - StringBuilder newSql = new StringBuilder(); - - string token = null; - string lastToken = null; - - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = ((string)enumerator.Current); - - if (ELEMENT_TOKEN.Equals(lastToken)) - { - if (ELEMENT_TOKEN.Equals(token)) - { - newSql.Append(ELEMENT_TOKEN); - token = null; - } - else - { - object value = null; - if (parameterObject != null) - { - if ( _dataExchangeFactory.TypeHandlerFactory.IsSimpleType( parameterObject.GetType() ) == true) - { - value = parameterObject; - } - else - { - value = ObjectProbe.GetMemberValue(parameterObject, token, _dataExchangeFactory.AccessorFactory); - } - } - if (value != null) - { - newSql.Append(value.ToString()); - } - - enumerator.MoveNext(); - token = ((string)enumerator.Current); - - if (!ELEMENT_TOKEN.Equals(token)) - { - throw new DataMapperException("Unterminated dynamic element in sql (" + _simpleSqlStatement + ")."); - } - token = null; - } - } - else - { - if (!ELEMENT_TOKEN.Equals(token)) - { - newSql.Append(token); - } - } - - lastToken = token; - } - - return newSql.ToString(); - } - - - #region ISql Members - - /// - /// Builds a new and the sql command text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - string sqlStatement = ProcessDynamicElements(parameterObject); - - RequestScope request = new RequestScope( _dataExchangeFactory, session, _statement); - - request.PreparedStatement = BuildPreparedStatement(session, request, sqlStatement); - request.MappedStatement = mappedStatement; - - return request; - } - - /// - /// Build the PreparedStatement - /// - /// - /// - /// - private PreparedStatement BuildPreparedStatement(ISqlMapSession session, RequestScope request, string sqlStatement) - { - PreparedStatementFactory factory = new PreparedStatementFactory( session, request, _statement, sqlStatement); - return factory.Prepare(); - } - #endregion - - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Static/ProcedureSql.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Static/ProcedureSql.cs deleted file mode 100644 index 9e7dd5b..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Static/ProcedureSql.cs +++ /dev/null @@ -1,112 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 476843 $ - * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using System; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Static -{ - /// - /// Summary description for ProcedureSql. - /// - public sealed class ProcedureSql : ISql - { - #region Fields - - private IStatement _statement = null ; - private PreparedStatement _preparedStatement = null ; - private string _sqlStatement = string.Empty; - private object _synRoot = new Object(); - private DataExchangeFactory _dataExchangeFactory = null; - - #endregion - - #region Constructor (s) / Destructor - /// - /// Constructor - /// - /// The statement. - /// - /// - public ProcedureSql(IScope scope, string sqlStatement, IStatement statement) - { - _sqlStatement = sqlStatement; - _statement = statement; - - _dataExchangeFactory = scope.DataExchangeFactory; - } - #endregion - - #region ISql Members - - /// - /// Builds a new and the sql command text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - RequestScope request = new RequestScope(_dataExchangeFactory, session, _statement); - - request.PreparedStatement = BuildPreparedStatement(session, request, _sqlStatement); - request.MappedStatement = mappedStatement; - - return request; - } - - /// - /// Build the PreparedStatement - /// - /// - /// - /// - public PreparedStatement BuildPreparedStatement(ISqlMapSession session, RequestScope request, string commandText) - { - if ( _preparedStatement == null ) - { - lock(_synRoot) - { - if (_preparedStatement==null) - { - PreparedStatementFactory factory = new PreparedStatementFactory( session, request, _statement, commandText); - _preparedStatement = factory.Prepare(); - } - } - } - return _preparedStatement; - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Sql/Static/StaticSql.cs b/src/IBatisNet.DataMapper/Configuration/Sql/Static/StaticSql.cs deleted file mode 100644 index cea0cd6..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Sql/Static/StaticSql.cs +++ /dev/null @@ -1,101 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 476843 $ - * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports - -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Static -{ - /// - /// Summary description for StaticSql. - /// - public sealed class StaticSql : ISql - { - - #region Fields - - private IStatement _statement = null ; - private PreparedStatement _preparedStatement = null ; - private DataExchangeFactory _dataExchangeFactory = null; - - #endregion - - #region Constructor (s) / Destructor - /// - /// Constructor - /// - /// The statement. - /// - public StaticSql(IScope scope, IStatement statement) - { - _statement = statement; - - _dataExchangeFactory = scope.DataExchangeFactory; - } - #endregion - - #region ISql Members - - /// - /// Builds a new and the sql command text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - RequestScope request = new RequestScope(_dataExchangeFactory, session, _statement); - - request.PreparedStatement = _preparedStatement; - request.MappedStatement = mappedStatement; - - return request; - } - - /// - /// Build the PreparedStatement - /// - /// - /// - public void BuildPreparedStatement(ISqlMapSession session, string sqlStatement) - { - RequestScope request = new RequestScope( _dataExchangeFactory, session, _statement); - - PreparedStatementFactory factory = new PreparedStatementFactory( session, request, _statement, sqlStatement); - _preparedStatement = factory.Prepare(); - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/Delete.cs b/src/IBatisNet.DataMapper/Configuration/Statements/Delete.cs deleted file mode 100644 index b9bc0bc..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/Delete.cs +++ /dev/null @@ -1,67 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Data; -using System.Xml.Serialization; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Summary description for delete. - /// - [Serializable] - [XmlRoot("delete", Namespace="http://ibatis.apache.org/mapping")] - public class Delete : Statement - { - - #region Fields - [NonSerialized] - private Generate _generate = null; - #endregion - - /// - /// The Generate tag used by a generated delete statement. - /// (CRUD operation) - /// - [XmlElement("generate",typeof(Generate))] - public Generate Generate - { - get { return _generate; } - set { _generate = value; } - } - - /// - /// Do not use direclty, only for serialization. - /// - public Delete():base() - {} - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/Generate.cs b/src/IBatisNet.DataMapper/Configuration/Statements/Generate.cs deleted file mode 100644 index 96626b1..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/Generate.cs +++ /dev/null @@ -1,104 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Represent a generate tag element. - /// The generation would happen at the point where the - /// SqlMapClient instance is built. - /// - [Serializable] - [XmlRoot("generate", Namespace="http://ibatis.apache.org/mapping")] - public class Generate : Statement - { - #region Fields - - [NonSerialized] - private string _table = string.Empty; - [NonSerialized] - private string _by = string.Empty; - [NonSerialized] - private string _rowVersion = string.Empty; - - #endregion - - /// - /// The table name used to build the SQL query. - /// - /// - /// Will be used to get the metadata to build the SQL if needed. - /// - [XmlAttribute("table")] - public string Table - { - get { return _table; } - set { _table = value; } - } - - /// - /// The by attribute is used to generate the where clause. - /// - /// The by="" attribute can support multiple colums. - /// - /// < delete ...> - /// <generate table="EMPLOYEE" by="EMPLOYEE_ID, LAST_MOD_DATE" /> - /// </delete> - /// - [XmlAttribute("by")] - public string By - { - get { return _by; } - set { _by = value; } - } - - /// - /// The row version column used to generate the where clause. - /// - /// Only used for updates. Value in updated entity is assumed to have the value after update, so where will be current value - 1. - /// - /// < delete ...> - /// <generate table="EMPLOYEE" by="EMPLOYEE_ID, LAST_MOD_DATE" /> - /// </delete> - /// - [XmlAttribute("rowversion")] - public string RowVersion - { - get { return _rowVersion; } - set { _rowVersion = value; } - } - - /// - /// Do not use direclty, only for serialization. - /// - public Generate():base(){} - - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/IStatement.cs b/src/IBatisNet.DataMapper/Configuration/Statements/IStatement.cs deleted file mode 100644 index 41639c4..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/IStatement.cs +++ /dev/null @@ -1,175 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Revision: 469233 $ - * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -#if dotnet2 -using System.Collections.Generic; -#endif - -using System.Data; - -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Configuration.Cache; -using IBatisNet.DataMapper.Configuration.Sql; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Summary description for ISql. - /// - public interface IStatement - { - - #region Properties - - /// - /// Allow remapping of dynamic SQL - /// - bool AllowRemapping - { - get; - set; - } - - /// - /// Identifier used to identify the statement amongst the others. - /// - string Id - { - get; - set; - } - - /// - /// The type of the statement (text or procedure). - /// - CommandType CommandType - { - get; - } - - /// - /// Extend statement attribute - /// - string ExtendStatement - { - get; - set; - } - - /// - /// The sql statement to execute. - /// - ISql Sql - { - get; - set; - } - - /// - /// The ResultMaps used by the statement. - /// - ResultMapCollection ResultsMap - { - get; - } - - - /// - /// The parameterMap used by the statement. - /// - ParameterMap ParameterMap - { - get; - set; - } - - /// - /// The CacheModel used by this statement. - /// - CacheModel CacheModel - { - get; - set; - } - - /// - /// The CacheModel name to use. - /// - string CacheModelName - { - get; - set; - } - - /// - /// The list class type to use for strongly typed collection. - /// - Type ListClass - { - get; - } - - /// - /// The result class type to used. - /// - Type ResultClass - { - get; - } - - /// - /// The parameter class type to used. - /// - Type ParameterClass - { - get; - } - #endregion - - #region Methods - - /// - /// Create an instance of 'IList' class. - /// - /// An object which implement IList. - IList CreateInstanceOfListClass(); -#if dotnet2 - /// - /// Create an instance of a generic 'IList' class. - /// - /// An object which implement IList. - IList CreateInstanceOfGenericListClass(); -#endif - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/Insert.cs b/src/IBatisNet.DataMapper/Configuration/Statements/Insert.cs deleted file mode 100644 index 4105597..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/Insert.cs +++ /dev/null @@ -1,94 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System; -using System.Xml.Serialization; - -using IBatisNet.DataMapper.Exceptions; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Represent an insert statement. - /// - [Serializable] - [XmlRoot("insert", Namespace="http://ibatis.apache.org/mapping")] - public class Insert : Statement - { - #region Fields - [NonSerialized] - private SelectKey _selectKey = null; - [NonSerialized] - private Generate _generate = null; - #endregion - - #region Properties - /// - /// Extend statement attribute - /// - [XmlIgnoreAttribute] - public override string ExtendStatement - { - get { return string.Empty; } - set { } - } - - /// - /// The selectKey statement used by an insert statement. - /// - [XmlElement("selectKey",typeof(SelectKey))] - public SelectKey SelectKey - { - get { return _selectKey; } - set { _selectKey = value; } - } - - /// - /// The Generate tag used by a generated insert statement. - /// (CRUD operation) - /// - [XmlElement("generate",typeof(Generate))] - public Generate Generate - { - get { return _generate; } - set { _generate = value; } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public Insert():base() - { - } - #endregion - - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatement.cs b/src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatement.cs deleted file mode 100644 index c4321dc..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatement.cs +++ /dev/null @@ -1,81 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 477815 $ - * $Date: 2006-11-21 11:46:52 -0700 (Tue, 21 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System.Collections.Specialized; -using System.Data; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Construct the list of IDataParameters for the statement - /// and prepare the sql - /// - public class PreparedStatement - { - #region Fields - - private string _preparedSsql = string.Empty; - private StringCollection _dbParametersName = new StringCollection (); - private IDbDataParameter[] _dbParameters = null; - - #endregion - - #region Properties - - - /// - /// The list of IDataParameter name used by the PreparedSql. - /// - public StringCollection DbParametersName - { - get { return _dbParametersName; } - } - - /// - /// The list of IDataParameter to use for the PreparedSql. - /// - public IDbDataParameter[] DbParameters - { - get { return _dbParameters;} - set { _dbParameters =value;} - } - - /// - /// The prepared statement. - /// - public string PreparedSql - { - get { return _preparedSsql; } - set {_preparedSsql = value;} - } - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatementFactory.cs b/src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatementFactory.cs deleted file mode 100644 index a8a361d..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/PreparedStatementFactory.cs +++ /dev/null @@ -1,540 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 591621 $ - * $Date: 2007-11-03 07:44:57 -0600 (Sat, 03 Nov 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using - -using System; -using System.Collections; -using System.Collections.Specialized; -using System.Data; -using System.Reflection; -using System.Text; -using IBatisNet.Common.Logging; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Summary description for PreparedStatementFactory. - /// - public class PreparedStatementFactory - { - - #region Fields - - private PreparedStatement _preparedStatement = null; - - private string _parameterPrefix = string.Empty; - private IStatement _statement = null; - private ISqlMapSession _session = null; - private string _commandText = string.Empty; - private RequestScope _request = null; - // (property, DbParameter) - private HybridDictionary _propertyDbParameterMap = new HybridDictionary(); - - private static readonly ILog _logger = LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType ); - - #endregion - - /// - /// Constructor - /// - /// - /// - /// - /// - public PreparedStatementFactory(ISqlMapSession session, RequestScope request, IStatement statement, string commandText) - { - _session = session; - _request = request; - _statement = statement; - _commandText = commandText; - } - - - /// - /// Create a list of IDataParameter for the statement and build the sql string. - /// - public PreparedStatement Prepare() - { - _preparedStatement = new PreparedStatement(); - _parameterPrefix = _session.DataSource.DbProvider.ParameterPrefix; - - _preparedStatement.PreparedSql = _commandText; - - if (_statement.CommandType == CommandType.Text) - { - if (_request.ParameterMap != null) - { - CreateParametersForTextCommand(); - EvaluateParameterMap(); - } - } - else if (_statement.CommandType == CommandType.StoredProcedure) // StoredProcedure - { - if (_request.ParameterMap == null) // No parameterMap --> error - { - throw new DataMapperException("A procedure statement tag must have a parameterMap attribute, which is not the case for the procedure '"+_statement.Id+"."); - } - else // use the parameterMap - { - if (_session.DataSource.DbProvider.UseDeriveParameters) - { - DiscoverParameter(_session); - } - else - { - CreateParametersForProcedureCommand(); - } - } - - #region Fix for Odbc - // Although executing a parameterized stored procedure using the ODBC .NET Provider - // is slightly different from executing the same procedure using the SQL or - // the OLE DB Provider, there is one important difference - // -- the stored procedure must be called using the ODBC CALL syntax rather than - // the name of the stored procedure. - // For additional information on this CALL syntax, - // see the page entitled "Procedure Calls" in the ODBC Programmer's Reference - // in the MSDN Library. - //http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q309486 - - if ( _session.DataSource.DbProvider.IsObdc == true ) - { - StringBuilder commandTextBuilder = new StringBuilder("{ call "); - commandTextBuilder.Append( _commandText ); - - if (_preparedStatement.DbParameters.Length >0) - { - commandTextBuilder.Append(" ("); - int supIndex = _preparedStatement.DbParameters.Length-1; - for(int i=0;i - /// For store procedure, auto discover IDataParameters for stored procedures at run-time. - ///
    - /// The current session. - private void DiscoverParameter(ISqlMapSession session) - { - // pull the parameters for this stored procedure from the parameter cache - // (or discover them & populate the cache) - IDataParameter[] commandParameters = session.SqlMapper.DBHelperParameterCache.GetSpParameterSet(session, _commandText); - - _preparedStatement.DbParameters = new IDbDataParameter[commandParameters.Length]; - - int start = session.DataSource.DbProvider.ParameterPrefix.Length; - for(int i=0; i< commandParameters.Length;i++) - { - IDbDataParameter dataParameter = (IDbDataParameter)commandParameters[i]; - - if (session.DataSource.DbProvider.UseParameterPrefixInParameter == false) - { - if (dataParameter.ParameterName.StartsWith(session.DataSource.DbProvider.ParameterPrefix)) - { - dataParameter.ParameterName = dataParameter.ParameterName.Substring(start); - } - } - _preparedStatement.DbParametersName.Add( dataParameter.ParameterName ); - _preparedStatement.DbParameters[i] = dataParameter; - } - - // Re-sort DbParameters to match order used in the parameterMap - IDbDataParameter[] sortedDbParameters = new IDbDataParameter[commandParameters.Length]; - for (int i = 0; i < _statement.ParameterMap.Properties.Count; i++) - { - sortedDbParameters[i] = Search(session, _preparedStatement.DbParameters, _statement.ParameterMap.Properties[i], i); - } - _preparedStatement.DbParameters = sortedDbParameters; - } - - private IDbDataParameter Search(ISqlMapSession session,IDbDataParameter[] parameters, ParameterProperty property, int index) - { - if (property.ColumnName.Length>0) - { - for (int i = 0; i < parameters.Length; i++) - { - string parameterName = parameters[i].ParameterName; - if (session.DataSource.DbProvider.UseParameterPrefixInParameter) - { - if (parameterName.StartsWith(session.DataSource.DbProvider.ParameterPrefix)) - { - int prefixLength = session.DataSource.DbProvider.ParameterPrefix.Length; - parameterName = parameterName.Substring(prefixLength); - } - } - if (property.ColumnName.Equals(parameterName)) - { - return parameters[i]; - } - } - throw new IndexOutOfRangeException("The parameter '" + property.ColumnName + "' does not exist in the stored procedure '" +_statement.Id+"'. Check your parameterMap."); - } - else - { - return parameters[index]; - } - - } - - - /// - /// Create IDataParameters for command text statement. - /// - private void CreateParametersForTextCommand() - { - string sqlParamName = string.Empty; - string dbTypePropertyName = _session.DataSource.DbProvider.ParameterDbTypeProperty; - Type enumDbType = _session.DataSource.DbProvider.ParameterDbType; - ParameterPropertyCollection list = null; - - if (_session.DataSource.DbProvider.UsePositionalParameters) //obdc/oledb - { - list = _request.ParameterMap.Properties; - } - else - { - list = _request.ParameterMap.PropertiesList; - } - - _preparedStatement.DbParameters = new IDbDataParameter[list.Count]; - - for(int i =0; i0) - { - try - { - // Exemple : Enum.parse(System.Data.SqlDbType, 'VarChar') - object dbType = Enum.Parse(enumDbType, property.DbType, true); - - // Exemple : ObjectHelper.SetProperty(sqlparameter, 'SqlDbType', SqlDbType.Int); - ObjectProbe.SetMemberValue(dataParameter, dbTypePropertyName, dbType, - _request.DataExchangeFactory.ObjectFactory, - _request.DataExchangeFactory.AccessorFactory); - } - catch (System.ArgumentException exception) - { - //TODO: - string message = exception.Message; - } - } - - // Set IDbDataParameter - // JIRA-49 Fixes (size, precision, and scale) - if (_session.DataSource.DbProvider.SetDbParameterSize) - { - if (property.Size != -1) - { - dataParameter.Size = property.Size; - } - } - - if (_session.DataSource.DbProvider.SetDbParameterPrecision) - { - dataParameter.Precision = property.Precision; - } - - if (_session.DataSource.DbProvider.SetDbParameterScale) - { - dataParameter.Scale = property.Scale; - } - - // Set as direction parameter - dataParameter.Direction = property.Direction; - - dataParameter.ParameterName = sqlParamName; - - _preparedStatement.DbParametersName.Add( property.PropertyName ); - _preparedStatement.DbParameters[i] = dataParameter ; - - if ( _session.DataSource.DbProvider.UsePositionalParameters == false) - { - _propertyDbParameterMap.Add(property, dataParameter); - } - } - } - - - /// - /// Create IDataParameters for procedure statement. - /// - private void CreateParametersForProcedureCommand() - { - string sqlParamName = string.Empty; - string dbTypePropertyName = _session.DataSource.DbProvider.ParameterDbTypeProperty; - Type enumDbType = _session.DataSource.DbProvider.ParameterDbType; - ParameterPropertyCollection list = null; - - if (_session.DataSource.DbProvider.UsePositionalParameters) //obdc/oledb - { - list = _request.ParameterMap.Properties; - } - else - { - list = _request.ParameterMap.PropertiesList; - } - - _preparedStatement.DbParameters = new IDbDataParameter[list.Count]; - - // ParemeterMap are required for procedure and we tested existance in Prepare() method - // so we don't have to test existence here. - // A ParameterMap used in CreateParametersForProcedureText must - // have property and column attributes set. - // The column attribute is the name of a procedure parameter. - for(int i =0; i0) - { - // Exemple : Enum.parse(System.Data.SqlDbType, 'VarChar') - object dbType = Enum.Parse( enumDbType, property.DbType, true ); - - // Exemple : ObjectHelper.SetProperty(sqlparameter, 'SqlDbType', SqlDbType.Int); - ObjectProbe.SetMemberValue(dataParameter, dbTypePropertyName, dbType, - _request.DataExchangeFactory.ObjectFactory, - _request.DataExchangeFactory.AccessorFactory); - } - - // Set IDbDataParameter - // JIRA-49 Fixes (size, precision, and scale) - if (_session.DataSource.DbProvider.SetDbParameterSize) - { - if (property.Size != -1) - { - dataParameter.Size = property.Size; - } - } - - if (_session.DataSource.DbProvider.SetDbParameterPrecision) - { - dataParameter.Precision = property.Precision; - } - - if (_session.DataSource.DbProvider.SetDbParameterScale) - { - dataParameter.Scale = property.Scale; - } - - // Set as direction parameter - dataParameter.Direction = property.Direction; - - dataParameter.ParameterName = sqlParamName; - - _preparedStatement.DbParametersName.Add( property.PropertyName ); - _preparedStatement.DbParameters[i] = dataParameter; - - if ( _session.DataSource.DbProvider.UsePositionalParameters == false) - { - _propertyDbParameterMap.Add(property, dataParameter); - } - } - - } - - - /// - /// Parse sql command text. - /// - private void EvaluateParameterMap() - { - string delimiter = "?"; - string token = null; - int index = 0; - string sqlParamName = string.Empty; - StringTokenizer parser = new StringTokenizer(_commandText, delimiter, true); - StringBuilder newCommandTextBuffer = new StringBuilder(); - - IEnumerator enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - - if (delimiter.Equals(token)) // ? - { - ParameterProperty property = _request.ParameterMap.Properties[index]; - IDataParameter dataParameter = null; - - if (_session.DataSource.DbProvider.UsePositionalParameters) - { - // TODO Refactor? - if (_parameterPrefix.Equals(":")) - { - // ODP.NET uses positional parameters by default - // but uses ":0" or ":1" instead of "?" - sqlParamName = ":" + index; - } - else - { - // OLEDB/OBDC doesn't support named parameters !!! - sqlParamName = "?"; - } - - } - else - { - dataParameter = (IDataParameter) _propertyDbParameterMap[property]; - - // 5 May 2004 - // Need to check UseParameterPrefixInParameter here - // since CreateParametersForStatementText now does - // a check for UseParameterPrefixInParameter before - // creating the parameter name! - if (_session.DataSource.DbProvider.UseParameterPrefixInParameter) - { - // Fix ByteFX.Data.MySqlClient.MySqlParameter - // who strip prefix in Parameter Name ?! - if (_session.DataSource.DbProvider.Name.IndexOf("ByteFx")>=0) - { - sqlParamName = _parameterPrefix+dataParameter.ParameterName; - } - else - { - sqlParamName = dataParameter.ParameterName; - } - } - else - { - sqlParamName = _parameterPrefix+dataParameter.ParameterName; - } - } - - newCommandTextBuffer.Append(" "); - newCommandTextBuffer.Append(sqlParamName); - - sqlParamName = string.Empty; - index ++; - } - else - { - int startPos = token.IndexOf('#'); - int endPos = token.LastIndexOf('#'); - - if (startPos != endPos) - { - string name = token.Substring(startPos + 1, endPos - startPos - 1); - - if (_session.DataSource.DbProvider.UsePositionalParameters) - throw new InvalidOperationException("Can't use parameter name reference with positional parameters."); - - ParameterProperty property = _request.ParameterMap.GetProperty(name); - IDataParameter dataParameter = dataParameter = (IDataParameter)_propertyDbParameterMap[property]; - - // 5 May 2004 - // Need to check UseParameterPrefixInParameter here - // since CreateParametersForStatementText now does - // a check for UseParameterPrefixInParameter before - // creating the parameter name! - if (_session.DataSource.DbProvider.UseParameterPrefixInParameter) - { - // Fix ByteFX.Data.MySqlClient.MySqlParameter - // who strip prefix in Parameter Name ?! - if (_session.DataSource.DbProvider.Name.IndexOf("ByteFx") >= 0) - { - sqlParamName = _parameterPrefix + dataParameter.ParameterName; - } - else - { - sqlParamName = dataParameter.ParameterName; - } - } - else - { - sqlParamName = _parameterPrefix + dataParameter.ParameterName; - } - - token = token.Replace("#" + name + "#", sqlParamName); - - sqlParamName = string.Empty; - } - - newCommandTextBuffer.Append(token); - } - } - - _preparedStatement.PreparedSql = newCommandTextBuffer.ToString(); - } - - - #endregion - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/Procedure.cs b/src/IBatisNet.DataMapper/Configuration/Statements/Procedure.cs deleted file mode 100644 index ee74d86..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/Procedure.cs +++ /dev/null @@ -1,95 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 443064 $ - * $Date: 2006-09-13 12:38:29 -0600 (Wed, 13 Sep 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using System; -using System.Data; -using System.Xml.Serialization; - -using IBatisNet.Common.Exceptions; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Represent a store Procedure. - /// - [Serializable] - [XmlRoot("procedure", Namespace="http://ibatis.apache.org/mapping")] - public class Procedure : Statement - { - - #region Properties - /// - /// The type of the statement StoredProcedure. - /// - [XmlIgnoreAttribute] - public override CommandType CommandType - { - get { return CommandType.StoredProcedure; } - } - - /// - /// Extend statement attribute - /// - [XmlIgnoreAttribute] - public override string ExtendStatement - { - get { return string.Empty; } - set { } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public Procedure():base() - { - } - #endregion - - #region Methods - /// - /// - /// - /// The scope of the configuration - override internal void Initialize(ConfigurationScope configurationScope) - { - base.Initialize( configurationScope ); - if (this.ParameterMap == null) - { - //throw new ConfigurationException("The parameterMap attribute is required in the procedure tag named '"+ this.Id +"'."); - this.ParameterMap = configurationScope.SqlMapper.GetParameterMap(ConfigurationScope.EMPTY_PARAMETER_MAP); - } - } - #endregion - - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/Select.cs b/src/IBatisNet.DataMapper/Configuration/Statements/Select.cs deleted file mode 100644 index 544c597..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/Select.cs +++ /dev/null @@ -1,62 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System; -using System.Data; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Summary description for Select. - /// - [Serializable] - [XmlRoot("select", Namespace="http://ibatis.apache.org/mapping")] - public class Select : Statement - { - #region Fields - [NonSerialized] - private Generate _generate = null; - #endregion - - /// - /// The Generate tag used by a generated select statement. - /// (CRUD operation) - /// - [XmlElement("generate",typeof(Generate))] - public Generate Generate - { - get { return _generate; } - set { _generate = value; } - } - - /// - /// Do not use direclty, only for serialization. - /// - public Select():base() - {} - } -} diff --git a/src/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs b/src/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs deleted file mode 100644 index 28fcfcd..0000000 --- a/src/IBatisNet.DataMapper/Configuration/Statements/SelectKey.cs +++ /dev/null @@ -1,144 +0,0 @@ - -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports - -using System; -using System.Xml.Serialization; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; - -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements -{ - /// - /// Represent a SelectKey tag element. - /// - [Serializable] - [XmlRoot("selectKey", Namespace="http://ibatis.apache.org/mapping")] - public class SelectKey : Statement - { - - #region Fields - - [NonSerialized] - private SelectKeyType _selectKeyType = SelectKeyType.post; - [NonSerialized] - private string _property = string.Empty; - - #endregion - - #region Properties - /// - /// Extend statement attribute - /// - [XmlIgnore] - public override string ExtendStatement - { - get { return string.Empty; } - set { } - } - - /// - /// The property name object to fill with the key. - /// - [XmlAttribute("property")] - public string PropertyName - { - get { return _property; } - set { _property = value; } - } - - /// - /// The type of the selectKey tag : 'Pre' or 'Post' - /// - [XmlAttribute("type")] - public SelectKeyType SelectKeyType - { - get { return _selectKeyType; } - set { _selectKeyType = value; } - } - - - /// - /// True if it is a post-generated key. - /// - [XmlIgnore] - public bool isAfter - { - get { return _selectKeyType == SelectKeyType.post; } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public SelectKey():base() - { - } - #endregion - - #region Methods - /// - /// - /// - /// The scope of the configuration - override internal void Initialize(ConfigurationScope configurationScope) - { - // the propertyName attribute on the selectKey node is optional - if (PropertyName.Length > 0) - { - // Id is equal to the parent + select * from Holiday + + + Id = #value# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatis.Test.Common/Config/Providers.config b/ORBatis.Test.Common/Config/Providers.config new file mode 100644 index 0000000..bb36683 --- /dev/null +++ b/ORBatis.Test.Common/Config/Providers.config @@ -0,0 +1,23 @@ + + + + + diff --git a/ORBatis.Test.Common/Infrastructure/ConnectionAdapter.cs b/ORBatis.Test.Common/Infrastructure/ConnectionAdapter.cs new file mode 100644 index 0000000..66b9adc --- /dev/null +++ b/ORBatis.Test.Common/Infrastructure/ConnectionAdapter.cs @@ -0,0 +1,9 @@ +using System.Data; +using IBatisNet.Common; + +namespace ORBatis.Test.Common.Infrastructure; + +public class ConnectionAdapter : IConnectionAdapter +{ + public IDbConnection Adapt(IDbConnection cn) => cn; +} \ No newline at end of file diff --git a/ORBatis.Test.Common/Models/GenericHoliday.cs b/ORBatis.Test.Common/Models/GenericHoliday.cs new file mode 100644 index 0000000..cd1d4f3 --- /dev/null +++ b/ORBatis.Test.Common/Models/GenericHoliday.cs @@ -0,0 +1,15 @@ +using System; + +namespace ORBatis.Test.Common.Models +{ + public class GenericHoliday + { + public int Id { get; set; } + + public int HolidayId { get; set; } + + public string Name { get; set; } + + public DateTime Date { get; set; } + } +} diff --git a/ORBatis.Test.Common/Models/Holiday.cs b/ORBatis.Test.Common/Models/Holiday.cs new file mode 100644 index 0000000..193edd7 --- /dev/null +++ b/ORBatis.Test.Common/Models/Holiday.cs @@ -0,0 +1,24 @@ +using System; + +namespace ORBatis.Test.Common.Models; + +public class Holiday +{ + public Holiday() + { + AllowAllProperties = true; + Active = true; + } + + public int Id { get; set; } + public int UserId { get; set; } + public string Name { get; set; } + public bool AllowAllProperties { get; set; } + public bool Active { get; set; } + public DateTime CreatedUtc { get; set; } + public int CreatedUserId { get; set; } + public DateTime? UpdatedUtc { get; set; } + public int UpdatedUserId { get; set; } + public DateTime? DeletedUtc { get; set; } + public int DeletedUserId { get; set; } +} \ No newline at end of file diff --git a/ORBatis.Test.Common/ORBatis.Test.Common.csproj b/ORBatis.Test.Common/ORBatis.Test.Common.csproj new file mode 100644 index 0000000..096cb58 --- /dev/null +++ b/ORBatis.Test.Common/ORBatis.Test.Common.csproj @@ -0,0 +1,17 @@ + + + + netstandard2.0 + 13 + + + + + + + + + + + + diff --git a/ORBatis.sln b/ORBatis.sln index 7deb9fb..1d26f62 100644 --- a/ORBatis.sln +++ b/ORBatis.sln @@ -8,6 +8,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Framework", "ORBati EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Framework.Test", "ORBatis.Framework.Test\ORBatis.Framework.Test.csproj", "{36A67F1E-0B71-4D66-9293-69EC2DAA0C25}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Common", "ORBatis.Test.Common\ORBatis.Test.Common.csproj", "{CD6BE8B9-AEF0-4D00-8B58-125A15F328C8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Core.Test", "ORBatis.Core.Test\ORBatis.Core.Test.csproj", "{3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -30,5 +34,13 @@ Global {36A67F1E-0B71-4D66-9293-69EC2DAA0C25}.Debug|Any CPU.Build.0 = Debug|Any CPU {36A67F1E-0B71-4D66-9293-69EC2DAA0C25}.Release|Any CPU.ActiveCfg = Release|Any CPU {36A67F1E-0B71-4D66-9293-69EC2DAA0C25}.Release|Any CPU.Build.0 = Release|Any CPU + {CD6BE8B9-AEF0-4D00-8B58-125A15F328C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CD6BE8B9-AEF0-4D00-8B58-125A15F328C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD6BE8B9-AEF0-4D00-8B58-125A15F328C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CD6BE8B9-AEF0-4D00-8B58-125A15F328C8}.Release|Any CPU.Build.0 = Release|Any CPU + {3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection EndGlobal From dd2248de23c66649d2fa3e70ae80c104c17ca8a1 Mon Sep 17 00:00:00 2001 From: NLilley Date: Wed, 23 Jul 2025 15:17:44 +0300 Subject: [PATCH 06/16] Fix irritating ip6 issues --- ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs | 2 +- ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs b/ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs index 3633cf3..0922c59 100644 --- a/ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs @@ -12,7 +12,7 @@ public class Tests public void Basic_AbleToSelectHolidays() { var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Core.Test.Config.SqlMap.config, ORBatis.Core.Test"); - var defaultConnectionString = "server=localhost;pwd=38wk1dr28t34r7d82dir9;uid=ownerrez_dev;database=ownerrez_dev;charset=utf8mb4;ConnectionReset=true"; + var defaultConnectionString = "server=127.0.0.1;pwd=38wk1dr28t34r7d82dir9;uid=ownerrez_dev;database=ownerrez_dev;charset=utf8mb4;ConnectionReset=true"; var builder = new DomSqlMapBuilder() { Properties = new NameValueCollection() diff --git a/ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs b/ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs index ede3434..a47c2f7 100644 --- a/ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs @@ -13,8 +13,7 @@ public class Tests public void Basic_AbleToSelectHolidays() { var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Framework.Test.Config.SqlMap.config, ORBatis.Framework.Test"); - - var defaultConnectionString = "server=localhost;pwd=38wk1dr28t34r7d82dir9;uid=ownerrez_dev;database=ownerrez_dev;charset=utf8mb4;ConnectionReset=true"; + var defaultConnectionString = "server=127.0.0.1;pwd=38wk1dr28t34r7d82dir9;uid=ownerrez_dev;database=ownerrez_dev;charset=utf8mb4;ConnectionReset=true"; var builder = new DomSqlMapBuilder() { Properties = new NameValueCollection() From 99467d5f0b0453cf67d1df26b76f44c171e52992 Mon Sep 17 00:00:00 2001 From: NLilley Date: Wed, 23 Jul 2025 16:14:10 +0300 Subject: [PATCH 07/16] Rename the test projects to make them a little more manageable. --- ORBatis.Common/ORBatis.Common.csproj | 4 + .../Tests/BasicFunctionalityFacts.cs | 37 -------- ORBatis.Core/ISqlMapper.cs | 91 ------------------- .../Tests/BasicFunctionalityFacts.cs | 38 -------- ORBatis.Framework/ISqlMapper.cs | 91 ------------------- ORBatis.Test.Common/Constants.cs | 6 ++ .../App.config | 0 .../Config/SqlMap.config | 4 +- .../ORBatis.Framework.Test.csproj | 0 .../ORBatis.Test.Core.csproj | 0 .../Tests/BasicFunctionalityFacts.cs | 36 ++++++++ .../TypeHandlers/GuidByteArray.cs | 2 +- .../packages.config | 0 .../App.config | 0 .../Config/SqlMap.config | 4 +- .../ORBatis.Test.Framework.csproj | 4 +- .../Properties/AssemblyInfo.cs | 4 +- .../Tests/BasicFunctionalityFacts.cs | 37 ++++++++ .../TypeHandlers/GuidByteArray.cs | 2 +- .../packages.config | 0 ORBatis.sln | 4 +- 21 files changed, 95 insertions(+), 269 deletions(-) delete mode 100644 ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs delete mode 100644 ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs create mode 100644 ORBatis.Test.Common/Constants.cs rename {ORBatis.Core.Test => ORBatis.Test.Core}/App.config (100%) rename {ORBatis.Core.Test => ORBatis.Test.Core}/Config/SqlMap.config (84%) rename {ORBatis.Core.Test => ORBatis.Test.Core}/ORBatis.Framework.Test.csproj (100%) rename ORBatis.Core.Test/ORBatis.Core.Test.csproj => ORBatis.Test.Core/ORBatis.Test.Core.csproj (100%) create mode 100644 ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs rename {ORBatis.Core.Test => ORBatis.Test.Core}/TypeHandlers/GuidByteArray.cs (95%) rename {ORBatis.Core.Test => ORBatis.Test.Core}/packages.config (100%) rename {ORBatis.Framework.Test => ORBatis.Test.Framework}/App.config (100%) rename {ORBatis.Framework.Test => ORBatis.Test.Framework}/Config/SqlMap.config (82%) rename ORBatis.Framework.Test/ORBatis.Framework.Test.csproj => ORBatis.Test.Framework/ORBatis.Test.Framework.csproj (98%) rename {ORBatis.Framework.Test => ORBatis.Test.Framework}/Properties/AssemblyInfo.cs (92%) create mode 100644 ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs rename {ORBatis.Framework.Test => ORBatis.Test.Framework}/TypeHandlers/GuidByteArray.cs (95%) rename {ORBatis.Framework.Test => ORBatis.Test.Framework}/packages.config (100%) diff --git a/ORBatis.Common/ORBatis.Common.csproj b/ORBatis.Common/ORBatis.Common.csproj index 252726f..b825f6b 100644 --- a/ORBatis.Common/ORBatis.Common.csproj +++ b/ORBatis.Common/ORBatis.Common.csproj @@ -4,4 +4,8 @@ netstandard2.0 IBatisNet.Common + + + + diff --git a/ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs b/ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs deleted file mode 100644 index 0922c59..0000000 --- a/ORBatis.Core.Test/Tests/BasicFunctionalityFacts.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections; -using System.Collections.Specialized; -using System.Configuration; -using IBatisNet.DataMapper.Configuration; -using ORBatis.Test.Common.Models; - -namespace ORBatis.Core.Test.Tests; - -public class Tests -{ - [Fact] - public void Basic_AbleToSelectHolidays() - { - var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Core.Test.Config.SqlMap.config, ORBatis.Core.Test"); - var defaultConnectionString = "server=127.0.0.1;pwd=38wk1dr28t34r7d82dir9;uid=ownerrez_dev;database=ownerrez_dev;charset=utf8mb4;ConnectionReset=true"; - var builder = new DomSqlMapBuilder() - { - Properties = new NameValueCollection() - { - { "ConnectionString", defaultConnectionString } - } - }; - - var mapper = builder.Configure(sqlMapConfig); - var context = mapper.CreateSqlMapSession(); - - var holidays = mapper.QueryForList( - "Holiday.SelectAll", - new Hashtable - { - { "active", true }, - { "userId", 347317427 } - }, - context - ); - } -} \ No newline at end of file diff --git a/ORBatis.Core/ISqlMapper.cs b/ORBatis.Core/ISqlMapper.cs index bfd1b90..1e28c32 100644 --- a/ORBatis.Core/ISqlMapper.cs +++ b/ORBatis.Core/ISqlMapper.cs @@ -54,29 +54,6 @@ public interface ISqlMapper ///
    string Id { get; } - /// - /// Allow to set a custom session store like the - /// - /// Set it after the configuration and before use of the - /// - /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); - /// - //ISessionStore SessionStore { set; } - - /// - /// Gets a value indicating whether this instance is session started. - /// - /// - /// true if this instance is session started; otherwise, false. - /// - //bool IsSessionStarted { get; } - - /// - /// Returns the DalSession instance - /// currently being used by the SqlMap. - /// - //ISqlMapSession LocalSession { get; } - /// /// Gets the DB helper parameter cache. /// @@ -124,74 +101,6 @@ public interface ISqlMapper ///
    HybridDictionary MappedStatements { get; } - ///// - ///// Begins the transaction. - ///// - ///// - //ISqlMapSession BeginTransaction(); - - ///// - ///// Begins the transaction. - ///// - ///// if set to true [open connection]. - ///// - //ISqlMapSession BeginTransaction(bool openConnection); - - ///// - ///// Begins the transaction. - ///// - ///// The connection string. - ///// - //ISqlMapSession BeginTransaction(string connectionString); - - ///// - ///// Begins the transaction. - ///// - ///// if set to true [open new connection]. - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel); - - ///// - ///// Begins the transaction. - ///// - ///// The connection string. - ///// if set to true [open new connection]. - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel); - - ///// - ///// Begins the transaction. - ///// - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(IsolationLevel isolationLevel); - - ///// - ///// Begins the transaction. - ///// - ///// The connection string. - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel); - - ///// - ///// Closes the connection. - ///// - //void CloseConnection(); - - ///// - ///// Commits the transaction. - ///// - ///// if set to true [close connection]. - //void CommitTransaction(bool closeConnection); - - ///// - ///// Commits the transaction. - ///// - //void CommitTransaction(); - /// /// Gets or sets the data source. /// diff --git a/ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs b/ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs deleted file mode 100644 index a47c2f7..0000000 --- a/ORBatis.Framework.Test/Tests/BasicFunctionalityFacts.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System.Collections; -using System.Collections.Specialized; -using System.Configuration; -using IBatisNet.DataMapper.Configuration; -using ORBatis.Test.Common.Models; -using Xunit; - -namespace ORBatis.Framework.Test.Tests; - -public class Tests -{ - [Fact] - public void Basic_AbleToSelectHolidays() - { - var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Framework.Test.Config.SqlMap.config, ORBatis.Framework.Test"); - var defaultConnectionString = "server=127.0.0.1;pwd=38wk1dr28t34r7d82dir9;uid=ownerrez_dev;database=ownerrez_dev;charset=utf8mb4;ConnectionReset=true"; - var builder = new DomSqlMapBuilder() - { - Properties = new NameValueCollection() - { - { "ConnectionString", defaultConnectionString } - } - }; - - var mapper = builder.Configure(sqlMapConfig); - var context = mapper.CreateSqlMapSession(); - - var holidays = mapper.QueryForList( - "Holiday.SelectAll", - new Hashtable - { - { "active", true }, - { "userId", 347317427 } - }, - context - ); - } -} \ No newline at end of file diff --git a/ORBatis.Framework/ISqlMapper.cs b/ORBatis.Framework/ISqlMapper.cs index 9b78f6f..ffba8b3 100644 --- a/ORBatis.Framework/ISqlMapper.cs +++ b/ORBatis.Framework/ISqlMapper.cs @@ -56,29 +56,6 @@ public interface ISqlMapper ///
    string Id { get; } - /// - /// Allow to set a custom session store like the - /// - /// Set it after the configuration and before use of the - /// - /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); - /// - //ISessionStore SessionStore { set; } - - /// - /// Gets a value indicating whether this instance is session started. - /// - /// - /// true if this instance is session started; otherwise, false. - /// - //bool IsSessionStarted { get; } - - /// - /// Returns the DalSession instance - /// currently being used by the SqlMap. - /// - //ISqlMapSession LocalSession { get; } - /// /// Gets the DB helper parameter cache. /// @@ -126,74 +103,6 @@ public interface ISqlMapper ///
    HybridDictionary MappedStatements { get; } - ///// - ///// Begins the transaction. - ///// - ///// - //ISqlMapSession BeginTransaction(); - - ///// - ///// Begins the transaction. - ///// - ///// if set to true [open connection]. - ///// - //ISqlMapSession BeginTransaction(bool openConnection); - - ///// - ///// Begins the transaction. - ///// - ///// The connection string. - ///// - //ISqlMapSession BeginTransaction(string connectionString); - - ///// - ///// Begins the transaction. - ///// - ///// if set to true [open new connection]. - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel); - - ///// - ///// Begins the transaction. - ///// - ///// The connection string. - ///// if set to true [open new connection]. - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel); - - ///// - ///// Begins the transaction. - ///// - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(IsolationLevel isolationLevel); - - ///// - ///// Begins the transaction. - ///// - ///// The connection string. - ///// The isolation level. - ///// - //ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel); - - ///// - ///// Closes the connection. - ///// - //void CloseConnection(); - - ///// - ///// Commits the transaction. - ///// - ///// if set to true [close connection]. - //void CommitTransaction(bool closeConnection); - - ///// - ///// Commits the transaction. - ///// - //void CommitTransaction(); - /// /// Gets or sets the data source. /// diff --git a/ORBatis.Test.Common/Constants.cs b/ORBatis.Test.Common/Constants.cs new file mode 100644 index 0000000..82c8f08 --- /dev/null +++ b/ORBatis.Test.Common/Constants.cs @@ -0,0 +1,6 @@ +namespace ORBatis.Test.Common; + +public static class Constants +{ + public const string ConnectionString = "server=127.0.0.1;pwd=38wk1dr28t34r7d82dir9;uid=ownerrez_dev;database=ownerrez_dev;charset=utf8mb4;ConnectionReset=true"; +} \ No newline at end of file diff --git a/ORBatis.Core.Test/App.config b/ORBatis.Test.Core/App.config similarity index 100% rename from ORBatis.Core.Test/App.config rename to ORBatis.Test.Core/App.config diff --git a/ORBatis.Core.Test/Config/SqlMap.config b/ORBatis.Test.Core/Config/SqlMap.config similarity index 84% rename from ORBatis.Core.Test/Config/SqlMap.config rename to ORBatis.Test.Core/Config/SqlMap.config index cb30bdc..6f46fda 100644 --- a/ORBatis.Core.Test/Config/SqlMap.config +++ b/ORBatis.Test.Core/Config/SqlMap.config @@ -14,8 +14,8 @@ - - + + diff --git a/ORBatis.Core.Test/ORBatis.Framework.Test.csproj b/ORBatis.Test.Core/ORBatis.Framework.Test.csproj similarity index 100% rename from ORBatis.Core.Test/ORBatis.Framework.Test.csproj rename to ORBatis.Test.Core/ORBatis.Framework.Test.csproj diff --git a/ORBatis.Core.Test/ORBatis.Core.Test.csproj b/ORBatis.Test.Core/ORBatis.Test.Core.csproj similarity index 100% rename from ORBatis.Core.Test/ORBatis.Core.Test.csproj rename to ORBatis.Test.Core/ORBatis.Test.Core.csproj diff --git a/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs new file mode 100644 index 0000000..25c1104 --- /dev/null +++ b/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs @@ -0,0 +1,36 @@ +using System.Collections; +using System.Collections.Specialized; +using IBatisNet.DataMapper.Configuration; +using ORBatis.Test.Common; +using ORBatis.Test.Common.Models; + +namespace ORBatis.Test.Core.Tests; + +public class Tests +{ + [Fact] + public void Basic_AbleToSelectHolidays() + { + var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Test.Core.Config.SqlMap.config, ORBatis.Test.Core"); + var builder = new DomSqlMapBuilder() + { + Properties = new NameValueCollection() + { + { "ConnectionString", Constants.ConnectionString } + } + }; + + var mapper = builder.Configure(sqlMapConfig); + var context = mapper.CreateSqlMapSession(); + + Hashtable parameters = new Hashtable + { + { "active", true }, + { "userId", 347317427 } + }; + var holidays = mapper.QueryForList( "Holiday.SelectAll", parameters, context ); + + Assert.NotNull(holidays); + } +} + \ No newline at end of file diff --git a/ORBatis.Core.Test/TypeHandlers/GuidByteArray.cs b/ORBatis.Test.Core/TypeHandlers/GuidByteArray.cs similarity index 95% rename from ORBatis.Core.Test/TypeHandlers/GuidByteArray.cs rename to ORBatis.Test.Core/TypeHandlers/GuidByteArray.cs index 0b9e2bd..f6680ad 100644 --- a/ORBatis.Core.Test/TypeHandlers/GuidByteArray.cs +++ b/ORBatis.Test.Core/TypeHandlers/GuidByteArray.cs @@ -2,7 +2,7 @@ using IBatisNet.DataMapper.TypeHandlers; -namespace ORBatis.Core.Test.TypeHandlers; +namespace ORBatis.Test.Core.TypeHandlers; public class GuidByteArray : ITypeHandlerCallback { diff --git a/ORBatis.Core.Test/packages.config b/ORBatis.Test.Core/packages.config similarity index 100% rename from ORBatis.Core.Test/packages.config rename to ORBatis.Test.Core/packages.config diff --git a/ORBatis.Framework.Test/App.config b/ORBatis.Test.Framework/App.config similarity index 100% rename from ORBatis.Framework.Test/App.config rename to ORBatis.Test.Framework/App.config diff --git a/ORBatis.Framework.Test/Config/SqlMap.config b/ORBatis.Test.Framework/Config/SqlMap.config similarity index 82% rename from ORBatis.Framework.Test/Config/SqlMap.config rename to ORBatis.Test.Framework/Config/SqlMap.config index bd14678..2f32229 100644 --- a/ORBatis.Framework.Test/Config/SqlMap.config +++ b/ORBatis.Test.Framework/Config/SqlMap.config @@ -14,8 +14,8 @@ - - + + diff --git a/ORBatis.Framework.Test/ORBatis.Framework.Test.csproj b/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj similarity index 98% rename from ORBatis.Framework.Test/ORBatis.Framework.Test.csproj rename to ORBatis.Test.Framework/ORBatis.Test.Framework.csproj index 18aff3a..75d40bb 100644 --- a/ORBatis.Framework.Test/ORBatis.Framework.Test.csproj +++ b/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj @@ -9,8 +9,8 @@ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Library Properties - ORBatis.Framework.Test - ORBatis.Framework.Test + ORBatis.Test.Framework + ORBatis.Test.Framework v4.8 512 13 diff --git a/ORBatis.Framework.Test/Properties/AssemblyInfo.cs b/ORBatis.Test.Framework/Properties/AssemblyInfo.cs similarity index 92% rename from ORBatis.Framework.Test/Properties/AssemblyInfo.cs rename to ORBatis.Test.Framework/Properties/AssemblyInfo.cs index fb989e5..e853f5a 100644 --- a/ORBatis.Framework.Test/Properties/AssemblyInfo.cs +++ b/ORBatis.Test.Framework/Properties/AssemblyInfo.cs @@ -4,11 +4,11 @@ // General Information about an assembly is controlled through the following // set of attributes. Change these attribute values to modify the information // associated with an assembly. -[assembly: AssemblyTitle("ORBatis.Framework.Test")] +[assembly: AssemblyTitle("ORBatis.Test.Framework")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ORBatis.Framework.Test")] +[assembly: AssemblyProduct("ORBatis.Test.Framework")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs new file mode 100644 index 0000000..79da3c1 --- /dev/null +++ b/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs @@ -0,0 +1,37 @@ +using System.Collections; +using System.Collections.Specialized; +using System.Configuration; +using IBatisNet.DataMapper.Configuration; +using ORBatis.Test.Common; +using ORBatis.Test.Common.Models; +using Xunit; + +namespace ORBatis.Test.Framewor.Tests; + +public class Tests +{ + [Fact] + public void Basic_AbleToSelectHolidays() + { + var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Test.Framework.Config.SqlMap.config, ORBatis.Test.Framework"); + var builder = new DomSqlMapBuilder() + { + Properties = new NameValueCollection() + { + { "ConnectionString", Constants.ConnectionString } + } + }; + + var mapper = builder.Configure(sqlMapConfig); + var context = mapper.CreateSqlMapSession(); + + Hashtable parameters = new Hashtable + { + { "active", true }, + { "userId", 347317427 } + }; + var holidays = mapper.QueryForList( "Holiday.SelectAll", parameters, context ); + + Assert.NotNull(holidays); + } +} \ No newline at end of file diff --git a/ORBatis.Framework.Test/TypeHandlers/GuidByteArray.cs b/ORBatis.Test.Framework/TypeHandlers/GuidByteArray.cs similarity index 95% rename from ORBatis.Framework.Test/TypeHandlers/GuidByteArray.cs rename to ORBatis.Test.Framework/TypeHandlers/GuidByteArray.cs index 5b9b1a0..c637c08 100644 --- a/ORBatis.Framework.Test/TypeHandlers/GuidByteArray.cs +++ b/ORBatis.Test.Framework/TypeHandlers/GuidByteArray.cs @@ -2,7 +2,7 @@ using IBatisNet.DataMapper.TypeHandlers; -namespace ORBatis.Framework.Test.TypeHandlers; +namespace ORBatis.Test.Framework.TypeHandlers; public class GuidByteArray : ITypeHandlerCallback { diff --git a/ORBatis.Framework.Test/packages.config b/ORBatis.Test.Framework/packages.config similarity index 100% rename from ORBatis.Framework.Test/packages.config rename to ORBatis.Test.Framework/packages.config diff --git a/ORBatis.sln b/ORBatis.sln index 1d26f62..4bf8b8f 100644 --- a/ORBatis.sln +++ b/ORBatis.sln @@ -6,11 +6,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Common", "ORBatis.C EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Framework", "ORBatis.Framework\ORBatis.Framework.csproj", "{3C780CE6-4AAC-4439-8334-8DFE3B091CA3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Framework.Test", "ORBatis.Framework.Test\ORBatis.Framework.Test.csproj", "{36A67F1E-0B71-4D66-9293-69EC2DAA0C25}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Framework", "ORBatis.Test.Framework\ORBatis.Test.Framework.csproj", "{36A67F1E-0B71-4D66-9293-69EC2DAA0C25}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Common", "ORBatis.Test.Common\ORBatis.Test.Common.csproj", "{CD6BE8B9-AEF0-4D00-8B58-125A15F328C8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Core.Test", "ORBatis.Core.Test\ORBatis.Core.Test.csproj", "{3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Core", "ORBatis.Test.Core\ORBatis.Test.Core.csproj", "{3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution From 75488ea8eface9e6c79b314a72e22eb5fde29e0d Mon Sep 17 00:00:00 2001 From: NLilley Date: Thu, 24 Jul 2025 16:34:33 +0300 Subject: [PATCH 08/16] Many tweaks to support lazy loading. --- .../Configuration/DomSqlMapBuilder.cs | 2850 +++++++++-------- ORBatis.Core/ISqlMapper.cs | 943 +++--- ORBatis.Core/SqlMapper.cs | 2047 ++++++------ .../Configuration/DomSqlMapBuilder.cs | 372 ++- .../Serializers/TypeAliasDeSerializer.cs | 2 +- ORBatis.Framework/ISqlMapper.cs | 10 + ORBatis.Framework/SqlMapper.cs | 71 +- .../Config/Definitions/CannedQuery.xml | 94 + .../Config/Definitions/Global.xml | 8 + ORBatis.Test.Common/Models/CannedQuery.cs | 60 + ORBatis.Test.Common/Models/EntityType.cs | 6 + .../Models/GirdCannedQueryForOverview.cs | 8 + .../ORBatis.Test.Common.csproj | 3 + .../Tests/BasicFunctionalityFacts.cs | 25 +- .../TypeHandlers/NullableEnum.cs | 36 + ORBatis.Test.Framework/Config/SqlMap.config | 5 + .../ORBatis.Test.Framework.csproj | 1 + .../Tests/BasicFunctionalityFacts.cs | 23 +- .../TypeHandlers/NullableEnum.cs | 36 + ORBatis.sln | 5 + README.md | 37 + 21 files changed, 3617 insertions(+), 3025 deletions(-) create mode 100644 ORBatis.Test.Common/Config/Definitions/CannedQuery.xml create mode 100644 ORBatis.Test.Common/Config/Definitions/Global.xml create mode 100644 ORBatis.Test.Common/Models/CannedQuery.cs create mode 100644 ORBatis.Test.Common/Models/EntityType.cs create mode 100644 ORBatis.Test.Common/Models/GirdCannedQueryForOverview.cs create mode 100644 ORBatis.Test.Core/TypeHandlers/NullableEnum.cs create mode 100644 ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs create mode 100644 README.md diff --git a/ORBatis.Core/Configuration/DomSqlMapBuilder.cs b/ORBatis.Core/Configuration/DomSqlMapBuilder.cs index 03e6ff2..3ab06ee 100644 --- a/ORBatis.Core/Configuration/DomSqlMapBuilder.cs +++ b/ORBatis.Core/Configuration/DomSqlMapBuilder.cs @@ -50,1737 +50,1787 @@ using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; using IBatisNet.DataMapper.Scope; using IBatisNet.DataMapper.TypeHandlers; +using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; +using System.IO; using System.Reflection; using System.Text; +using System.Threading; +using System.Threading.Tasks; using System.Xml; using System.Xml.Schema; #endregion -namespace IBatisNet.DataMapper.Configuration; - -/// -/// Builds an ISqlMapper instance from the supplied resources (e.g. XML configuration files). -/// -public class DomSqlMapBuilder +namespace IBatisNet.DataMapper.Configuration { - #region Constructor /// - /// Constructs a DomSqlMapBuilder. + /// Builds an ISqlMapper instance from the supplied resources (e.g. XML configuration files). /// - public DomSqlMapBuilder() + public class DomSqlMapBuilder { - _configScope = new ConfigurationScope(); - _paramParser = new InlineParameterMapParser(); - _deSerializerFactory = new DeSerializerFactory(_configScope); - } - #endregion - #region Embedded resource - // Which files must we allow to be used as Embedded Resources ? - // - slqMap.config [Yes] - // - providers.config [Yes] - // - sqlMap files [Yes] - // - properties file (like Database.config) [Yes] - // see contribution, NHibernate usage, - // see http://www.codeproject.com/csharp/EmbeddedResourceStrings.asp - // see http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=75 - #endregion - - #region Constant - private const string PROPERTY_ELEMENT_KEY_ATTRIB = "key"; - private const string PROPERTY_ELEMENT_VALUE_ATTRIB = "value"; - - /// - /// - private const string DATAMAPPER_NAMESPACE_PREFIX = "mapper"; - - private const string PROVIDERS_NAMESPACE_PREFIX = "provider"; - private const string MAPPING_NAMESPACE_PREFIX = "mapping"; - private const string MODULE_NAMESPACE_PREFIX = "module"; - private const string DATAMAPPER_XML_NAMESPACE = "http://ibatis.apache.org/dataMapper"; - private const string PROVIDER_XML_NAMESPACE = "http://ibatis.apache.org/providers"; - private const string MAPPING_XML_NAMESPACE = "http://ibatis.apache.org/mapping"; - private const string MODULE_XML_NAMESPACE = "http://ibatis.apache.org/module"; - - /// - /// Default filename of main configuration file. - /// - public const string DEFAULT_FILE_CONFIG_NAME = "SqlMap.config"; - - /// - /// Default provider name - /// - private const string DEFAULT_PROVIDER_NAME = "_DEFAULT_PROVIDER_NAME"; - - /// - /// Dot representation. - /// - public const string DOT = "."; - - /// - /// Token for SqlMapConfig xml root element. - /// - private const string XML_DATAMAPPER_CONFIG_ROOT = "sqlMapConfig"; - - /// - /// Token for xml path to SqlMapConfig settings element. - /// - private const string XML_CONFIG_SETTINGS = "sqlMapConfig/settings/setting"; - - /// - /// Token for default providers config file name. - /// - private const string PROVIDERS_FILE_NAME = "providers.config"; - - /// - /// Token for xml path to SqlMapConfig providers element. - /// - private const string XML_CONFIG_PROVIDERS = "sqlMapConfig/providers"; - - /// - /// Token for xml path to properties elements. - /// - private const string XML_PROPERTIES = "properties"; - - /// - /// Token for xml path to property elements. - /// - private const string XML_PROPERTY = "property"; - - /// - /// Token for xml path to settings add elements. - /// - private const string XML_SETTINGS_ADD = "/*/add"; - - /// - /// Token for xml path to global properties elements. - /// - private const string XML_GLOBAL_PROPERTIES = "*/add"; - - /// - /// Token for xml path to provider elements. - /// - private const string XML_PROVIDER = "providers/provider"; - - /// - /// Token for xml path to database provider elements. - /// - private const string XML_DATABASE_PROVIDER = "sqlMapConfig/database/provider"; - - /// - /// Token for xml path to database source elements. - /// - private const string XML_DATABASE_DATASOURCE = "sqlMapConfig/database/dataSource"; - - /// - /// Token for xml path to global type alias elements. - /// - private const string XML_GLOBAL_TYPEALIAS = "sqlMapConfig/alias/typeAlias"; - - /// - /// Token for xml path to global type alias elements. - /// - private const string XML_GLOBAL_TYPEHANDLER = "sqlMapConfig/typeHandlers/typeHandler"; - - /// - /// Token for xml path to global type alias elements. - /// - private const string XML_GLOBAL_MAPMODULE = "sqlMapConfig/sqlMapModules/sqlMapModule"; - - /// - /// Token for xml path to sqlMap elements. - /// - private const string XML_SQLMAP = "sqlMapConfig/sqlMaps/sqlMap"; - - /// - /// Token for xml path to module sqlMap elements. - /// - private const string XML_MODULE_MAP = "sqlMapModule/sqlMaps/sqlMap"; - - /// - /// Token for mapping xml root. - /// - private const string XML_MAPPING_ROOT = "sqlMap"; - - /// - /// Token for xml path to type alias elements. - /// - private const string XML_TYPEALIAS = "sqlMap/alias/typeAlias"; - - /// - /// Token for xml path to resultMap elements. - /// - private const string XML_RESULTMAP = "sqlMap/resultMaps/resultMap"; - - /// - /// Token for xml path to parameterMap elements. - /// - private const string XML_PARAMETERMAP = "sqlMap/parameterMaps/parameterMap"; - - /// - /// Token for xml path to sql elements. - /// - private const string SQL_STATEMENT = "sqlMap/statements/sql"; - - /// - /// Token for xml path to statement elements. - /// - private const string XML_STATEMENT = "sqlMap/statements/statement"; - - /// - /// Token for xml path to select elements. - /// - private const string XML_SELECT = "sqlMap/statements/select"; + #region Constructor + /// + /// Constructs a DomSqlMapBuilder. + /// + public DomSqlMapBuilder() + { + _configScope = new ConfigurationScope(); + _paramParser = new InlineParameterMapParser(); + _deSerializerFactory = new DeSerializerFactory(_configScope); + } + #endregion + #region Embedded resource + // Which files must we allow to be used as Embedded Resources ? + // - slqMap.config [Yes] + // - providers.config [Yes] + // - sqlMap files [Yes] + // - properties file (like Database.config) [Yes] + // see contribution, NHibernate usage, + // see http://www.codeproject.com/csharp/EmbeddedResourceStrings.asp + // see http://www.devhood.com/tutorials/tutorial_details.aspx?tutorial_id=75 + #endregion - /// - /// Token for xml path to insert elements. - /// - private const string XML_INSERT = "sqlMap/statements/insert"; + #region Constant + private const string PROPERTY_ELEMENT_KEY_ATTRIB = "key"; + private const string PROPERTY_ELEMENT_VALUE_ATTRIB = "value"; + + /// + /// + private const string DATAMAPPER_NAMESPACE_PREFIX = "mapper"; + + private const string PROVIDERS_NAMESPACE_PREFIX = "provider"; + private const string MAPPING_NAMESPACE_PREFIX = "mapping"; + private const string MODULE_NAMESPACE_PREFIX = "module"; + private const string DATAMAPPER_XML_NAMESPACE = "http://ibatis.apache.org/dataMapper"; + private const string PROVIDER_XML_NAMESPACE = "http://ibatis.apache.org/providers"; + private const string MAPPING_XML_NAMESPACE = "http://ibatis.apache.org/mapping"; + private const string MODULE_XML_NAMESPACE = "http://ibatis.apache.org/module"; + + /// + /// Default filename of main configuration file. + /// + public const string DEFAULT_FILE_CONFIG_NAME = "SqlMap.config"; + + /// + /// Default provider name + /// + private const string DEFAULT_PROVIDER_NAME = "_DEFAULT_PROVIDER_NAME"; + + /// + /// Dot representation. + /// + public const string DOT = "."; + + /// + /// Token for SqlMapConfig xml root element. + /// + private const string XML_DATAMAPPER_CONFIG_ROOT = "sqlMapConfig"; + + /// + /// Token for xml path to SqlMapConfig settings element. + /// + private const string XML_CONFIG_SETTINGS = "sqlMapConfig/settings/setting"; + + /// + /// Token for default providers config file name. + /// + private const string PROVIDERS_FILE_NAME = "providers.config"; + + /// + /// Token for xml path to SqlMapConfig providers element. + /// + private const string XML_CONFIG_PROVIDERS = "sqlMapConfig/providers"; + + /// + /// Token for xml path to properties elements. + /// + private const string XML_PROPERTIES = "properties"; + + /// + /// Token for xml path to property elements. + /// + private const string XML_PROPERTY = "property"; + + /// + /// Token for xml path to settings add elements. + /// + private const string XML_SETTINGS_ADD = "/*/add"; + + /// + /// Token for xml path to global properties elements. + /// + private const string XML_GLOBAL_PROPERTIES = "*/add"; + + /// + /// Token for xml path to provider elements. + /// + private const string XML_PROVIDER = "providers/provider"; + + /// + /// Token for xml path to database provider elements. + /// + private const string XML_DATABASE_PROVIDER = "sqlMapConfig/database/provider"; + + /// + /// Token for xml path to database source elements. + /// + private const string XML_DATABASE_DATASOURCE = "sqlMapConfig/database/dataSource"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_TYPEALIAS = "sqlMapConfig/alias/typeAlias"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_TYPEHANDLER = "sqlMapConfig/typeHandlers/typeHandler"; + + /// + /// Token for xml path to global type alias elements. + /// + private const string XML_GLOBAL_MAPMODULE = "sqlMapConfig/sqlMapModules/sqlMapModule"; + + /// + /// Token for xml path to sqlMap elements. + /// + private const string XML_SQLMAP = "sqlMapConfig/sqlMaps/sqlMap"; + + /// + /// Token for xml path to module sqlMap elements. + /// + private const string XML_MODULE_MAP = "sqlMapModule/sqlMaps/sqlMap"; + + /// + /// Token for mapping xml root. + /// + private const string XML_MAPPING_ROOT = "sqlMap"; + + /// + /// Token for xml path to type alias elements. + /// + private const string XML_TYPEALIAS = "sqlMap/alias/typeAlias"; + + /// + /// Token for xml path to resultMap elements. + /// + private const string XML_RESULTMAP = "sqlMap/resultMaps/resultMap"; + + /// + /// Token for xml path to parameterMap elements. + /// + private const string XML_PARAMETERMAP = "sqlMap/parameterMaps/parameterMap"; + + /// + /// Token for xml path to sql elements. + /// + private const string SQL_STATEMENT = "sqlMap/statements/sql"; + + /// + /// Token for xml path to statement elements. + /// + private const string XML_STATEMENT = "sqlMap/statements/statement"; + + /// + /// Token for xml path to select elements. + /// + private const string XML_SELECT = "sqlMap/statements/select"; + + /// + /// Token for xml path to insert elements. + /// + private const string XML_INSERT = "sqlMap/statements/insert"; + + /// + /// Token for xml path to selectKey elements. + /// + private const string XML_SELECTKEY = "selectKey"; + + /// + /// Token for xml path to update elements. + /// + private const string XML_UPDATE = "sqlMap/statements/update"; + + /// + /// Token for xml path to delete elements. + /// + private const string XML_DELETE = "sqlMap/statements/delete"; + + /// + /// Token for xml path to procedure elements. + /// + private const string XML_PROCEDURE = "sqlMap/statements/procedure"; + + /// + /// Token for xml path to cacheModel elements. + /// + private const string XML_CACHE_MODEL = "sqlMap/cacheModels/cacheModel"; + + /// + /// Token for xml path to flushOnExecute elements. + /// + private const string XML_FLUSH_ON_EXECUTE = "flushOnExecute"; + + /// + /// Token for xml path to search statement elements. + /// + private const string XML_SEARCH_STATEMENT = "sqlMap/statements"; + + /// + /// Token for xml path to search parameterMap elements. + /// + private const string XML_SEARCH_PARAMETER = "sqlMap/parameterMaps/parameterMap[@id='"; + + /// + /// Token for xml path to search resultMap elements. + /// + private const string XML_SEARCH_RESULTMAP = "sqlMap/resultMaps/resultMap[@id='"; + + /// + /// Token for useStatementNamespaces attribute. + /// + private const string ATR_USE_STATEMENT_NAMESPACES = "useStatementNamespaces"; + + /// + /// Token for cacheModelsEnabled attribute. + /// + private const string ATR_CACHE_MODELS_ENABLED = "cacheModelsEnabled"; + + /// + /// Token for validateSqlMap attribute. + /// + private const string ATR_VALIDATE_SQLMAP = "validateSqlMap"; + + /// + /// Token for useReflectionOptimizer attribute. + /// + private const string ATR_USE_REFLECTION_OPTIMIZER = "useReflectionOptimizer"; + #endregion - /// - /// Token for xml path to selectKey elements. - /// - private const string XML_SELECTKEY = "selectKey"; + #region Fields + private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); + + private readonly ConfigurationScope _configScope; + private readonly DeSerializerFactory _deSerializerFactory; + private readonly InlineParameterMapParser _paramParser; + private IObjectFactory _objectFactory; + private ISetAccessorFactory _setAccessorFactory; + private IGetAccessorFactory _getAccessorFactory; + private ISqlMapper _sqlMapper; + private bool _validateSqlMapConfig = true; + #endregion - /// - /// Token for xml path to update elements. - /// - private const string XML_UPDATE = "sqlMap/statements/update"; + #region Properties + /// + /// Allow properties to be set before configuration. + /// + public NameValueCollection Properties + { + set => _configScope.Properties.Add(value); + } - /// - /// Token for xml path to delete elements. - /// - private const string XML_DELETE = "sqlMap/statements/delete"; + /// + /// Allow a custom to be set before configuration. + /// + public ISetAccessorFactory SetAccessorFactory + { + set => _setAccessorFactory = value; + } - /// - /// Token for xml path to procedure elements. - /// - private const string XML_PROCEDURE = "sqlMap/statements/procedure"; + /// + /// Allow a custom to be set before configuration. + /// + public IGetAccessorFactory GetAccessorFactory + { + set => _getAccessorFactory = value; + } - /// - /// Token for xml path to cacheModel elements. - /// - private const string XML_CACHE_MODEL = "sqlMap/cacheModels/cacheModel"; + /// + /// Allow a custom to be set before configuration. + /// + public IObjectFactory ObjectFactory + { + set => _objectFactory = value; + } - /// - /// Token for xml path to flushOnExecute elements. - /// - private const string XML_FLUSH_ON_EXECUTE = "flushOnExecute"; + /// + /// Allow a custom to be set before configuration. + /// + public ISqlMapper SqlMapper + { + set => _sqlMapper = value; + } - /// - /// Token for xml path to search statement elements. - /// - private const string XML_SEARCH_STATEMENT = "sqlMap/statements"; + /// + /// Enable validation of SqlMap document. This property must be set before configuration. + /// + public bool ValidateSqlMapConfig + { + set => _validateSqlMapConfig = value; + } + #endregion - /// - /// Token for xml path to search parameterMap elements. - /// - private const string XML_SEARCH_PARAMETER = "sqlMap/parameterMaps/parameterMap[@id='"; + #region Configure + /// + /// Configure a SqlMapper from default resource file named 'SqlMap.config'. + /// + /// An ISqlMapper instance. + /// + /// The file path is relative to the application root. For ASP.Net applications + /// this would be the same directory as the Web.config file. For other .Net + /// applications the SqlMap.config file should be placed in the same folder + /// as the executable. + /// + public ISqlMapper Configure() + { + return Configure(Resources.GetConfigAsXmlDocument(DEFAULT_FILE_CONFIG_NAME)); + } - /// - /// Token for xml path to search resultMap elements. - /// - private const string XML_SEARCH_RESULTMAP = "sqlMap/resultMaps/resultMap[@id='"; + /// + /// Configure and returns an ISqlMapper instance. + /// + /// An xml sql map configuration document. + /// An ISqlMapper instance. + public ISqlMapper Configure(XmlDocument document) + { + return Build(document, false); + } - /// - /// Token for useStatementNamespaces attribute. - /// - private const string ATR_USE_STATEMENT_NAMESPACES = "useStatementNamespaces"; - /// - /// Token for cacheModelsEnabled attribute. - /// - private const string ATR_CACHE_MODELS_ENABLED = "cacheModelsEnabled"; + /// + /// Configure an ISqlMapper object from a file path. + /// + /// + /// A relative ressource path from your Application root + /// or a absolue file path file:\\c:\dir\a.config + /// + /// An ISqlMapper instance. + public ISqlMapper Configure(string resource) + { + XmlDocument document; + if (resource.StartsWith("file://")) + document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); + else + document = Resources.GetResourceAsXmlDocument(resource); + return Build(document, false); + } - /// - /// Token for validateSqlMap attribute. - /// - private const string ATR_VALIDATE_SQLMAP = "validateSqlMap"; + /// + /// Configure an ISqlMapper object from a stream. + /// + /// A Stream resource. + /// An SqlMap + public ISqlMapper Configure(Stream resource) + { + var document = Resources.GetStreamAsXmlDocument(resource); + return Build(document, false); + } - /// - /// Token for useReflectionOptimizer attribute. - /// - private const string ATR_USE_REFLECTION_OPTIMIZER = "useReflectionOptimizer"; - #endregion - - #region Fields - private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - private readonly ConfigurationScope _configScope; - private readonly DeSerializerFactory _deSerializerFactory; - private readonly InlineParameterMapParser _paramParser; - private IObjectFactory _objectFactory; - private ISetAccessorFactory _setAccessorFactory; - private IGetAccessorFactory _getAccessorFactory; - private ISqlMapper _sqlMapper; - private bool _validateSqlMapConfig = true; - #endregion - - #region Properties - /// - /// Allow properties to be set before configuration. - /// - public NameValueCollection Properties - { - set => _configScope.Properties.Add(value); - } + /// + /// Configure an ISqlMapper object from a FileInfo. + /// + /// A FileInfo resource. + /// An ISqlMapper instance. + public ISqlMapper Configure(FileInfo resource) + { + var document = Resources.GetFileInfoAsXmlDocument(resource); + return Build(document, false); + } - /// - /// Allow a custom to be set before configuration. - /// - public ISetAccessorFactory SetAccessorFactory - { - set => _setAccessorFactory = value; - } + /// + /// Configure an ISqlMapper object from an Uri. + /// + /// A Uri resource. + /// An ISqlMapper instance. + public ISqlMapper Configure(Uri resource) + { + var document = Resources.GetUriAsXmlDocument(resource); + return Build(document, false); + } - /// - /// Allow a custom to be set before configuration. - /// - public IGetAccessorFactory GetAccessorFactory - { - set => _getAccessorFactory = value; - } + /// + /// Configure and monitor the default configuration file (SqlMap.config) for modifications + /// and automatically reconfigure SqlMap. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(ConfigureHandler configureDelegate) + { + return ConfigureAndWatch(DEFAULT_FILE_CONFIG_NAME, configureDelegate); + } - /// - /// Allow a custom to be set before configuration. - /// - public IObjectFactory ObjectFactory - { - set => _objectFactory = value; - } + /// + /// Configure and monitor the configuration file for modifications + /// and automatically reconfigure the ISqlMapper instance. + /// + /// + /// A relative ressource path from your Application root + /// or an absolue file path file:\\c:\dir\a.config + /// + /// + /// Delegate called when the file has changed. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(string resource, ConfigureHandler configureDelegate) + { + XmlDocument document = null; + if (resource.StartsWith("file://")) + document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); + else + document = Resources.GetResourceAsXmlDocument(resource); - /// - /// Allow a custom to be set before configuration. - /// - public ISqlMapper SqlMapper - { - set => _sqlMapper = value; - } + ConfigWatcherHandler.ClearFilesMonitored(); + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(resource)); - /// - /// Enable validation of SqlMap document. This property must be set before configuration. - /// - public bool ValidateSqlMapConfig - { - set => _validateSqlMapConfig = value; - } - #endregion + var callBakDelegate = new TimerCallback(OnConfigFileChange); - #region Configure - /// - /// Configure a SqlMapper from default resource file named 'SqlMap.config'. - /// - /// An ISqlMapper instance. - /// - /// The file path is relative to the application root. For ASP.Net applications - /// this would be the same directory as the Web.config file. For other .Net - /// applications the SqlMap.config file should be placed in the same folder - /// as the executable. - /// - public ISqlMapper Configure() - { - return Configure(Resources.GetConfigAsXmlDocument(DEFAULT_FILE_CONFIG_NAME)); - } + var state = new StateConfig(); + state.FileName = resource; + state.ConfigureHandler = configureDelegate; - /// - /// Configure and returns an ISqlMapper instance. - /// - /// An xml sql map configuration document. - /// An ISqlMapper instance. - public ISqlMapper Configure(XmlDocument document) - { - return Build(document, false); - } + var sqlMapper = Build(document, true); + new ConfigWatcherHandler(callBakDelegate, state); - /// - /// Configure an ISqlMapper object from a file path. - /// - /// - /// A relative ressource path from your Application root - /// or a absolue file path file:\\c:\dir\a.config - /// - /// An ISqlMapper instance. - public ISqlMapper Configure(string resource) - { - XmlDocument document; - if (resource.StartsWith("file://")) - document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); - else - document = Resources.GetResourceAsXmlDocument(resource); - return Build(document, false); - } + return sqlMapper; + } - /// - /// Configure an ISqlMapper object from a stream. - /// - /// A Stream resource. - /// An SqlMap - public ISqlMapper Configure(Stream resource) - { - var document = Resources.GetStreamAsXmlDocument(resource); - return Build(document, false); - } + /// + /// Configure and monitor the configuration file for modifications + /// and automatically reconfigure the ISqlMapper instance. + /// + /// + /// A FileInfo to a SqlMap.config file. + /// + /// + /// Delegate called when the file has changed. + /// + /// An ISqlMapper instance. + public ISqlMapper ConfigureAndWatch(FileInfo resource, ConfigureHandler configureDelegate) + { + var document = Resources.GetFileInfoAsXmlDocument(resource); - /// - /// Configure an ISqlMapper object from a FileInfo. - /// - /// A FileInfo resource. - /// An ISqlMapper instance. - public ISqlMapper Configure(FileInfo resource) - { - var document = Resources.GetFileInfoAsXmlDocument(resource); - return Build(document, false); - } + ConfigWatcherHandler.ClearFilesMonitored(); + ConfigWatcherHandler.AddFileToWatch(resource); - /// - /// Configure an ISqlMapper object from an Uri. - /// - /// A Uri resource. - /// An ISqlMapper instance. - public ISqlMapper Configure(Uri resource) - { - var document = Resources.GetUriAsXmlDocument(resource); - return Build(document, false); - } + var callBakDelegate = new TimerCallback(OnConfigFileChange); - /// - /// Configure and monitor the default configuration file (SqlMap.config) for modifications - /// and automatically reconfigure SqlMap. - /// - /// An ISqlMapper instance. - public ISqlMapper ConfigureAndWatch(ConfigureHandler configureDelegate) - { - return ConfigureAndWatch(DEFAULT_FILE_CONFIG_NAME, configureDelegate); - } + var state = new StateConfig(); + state.FileName = resource.FullName; + state.ConfigureHandler = configureDelegate; - /// - /// Configure and monitor the configuration file for modifications - /// and automatically reconfigure the ISqlMapper instance. - /// - /// - /// A relative ressource path from your Application root - /// or an absolue file path file:\\c:\dir\a.config - /// - /// - /// Delegate called when the file has changed. - /// - /// An ISqlMapper instance. - public ISqlMapper ConfigureAndWatch(string resource, ConfigureHandler configureDelegate) - { - XmlDocument document = null; - if (resource.StartsWith("file://")) - document = Resources.GetUrlAsXmlDocument(resource.Remove(0, 7)); - else - document = Resources.GetResourceAsXmlDocument(resource); + var sqlMapper = Build(document, true); - ConfigWatcherHandler.ClearFilesMonitored(); - ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(resource)); + new ConfigWatcherHandler(callBakDelegate, state); - var callBakDelegate = new TimerCallback(OnConfigFileChange); + return sqlMapper; + } - var state = new StateConfig(); - state.FileName = resource; - state.ConfigureHandler = configureDelegate; + /// + /// Callback called when the SqlMap.config file has changed. + /// + /// The object. + public static void OnConfigFileChange(object obj) + { + var state = (StateConfig)obj; + state.ConfigureHandler(null); + } + #endregion - var sqlMapper = Build(document, true); + #region Methods + /// + /// Build an ISqlMapper instance. + /// + /// An xml configuration document. + /// A data source. + /// + /// + /// Returns an ISqlMapper instance. + private ISqlMapper Build(XmlDocument document, DataSource dataSource, + bool useConfigFileWatcher, bool isCallFromDao) + { + _configScope.SqlMapConfigDocument = document; + _configScope.DataSource = dataSource; + _configScope.IsCallFromDao = isCallFromDao; + _configScope.UseConfigFileWatcher = useConfigFileWatcher; - new ConfigWatcherHandler(callBakDelegate, state); + _configScope.XmlNamespaceManager = new XmlNamespaceManager(_configScope.SqlMapConfigDocument.NameTable); + _configScope.XmlNamespaceManager.AddNamespace(DATAMAPPER_NAMESPACE_PREFIX, DATAMAPPER_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(PROVIDERS_NAMESPACE_PREFIX, PROVIDER_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(MAPPING_NAMESPACE_PREFIX, MAPPING_XML_NAMESPACE); + _configScope.XmlNamespaceManager.AddNamespace(MODULE_NAMESPACE_PREFIX, MODULE_XML_NAMESPACE); - return sqlMapper; - } + try + { + if (_validateSqlMapConfig) ValidateSchema(document.ChildNodes[1], "SqlMapConfig.xsd"); + Initialize(); + return _configScope.SqlMapper; + } + catch (Exception e) + { + throw new ConfigurationException(_configScope.ErrorContext.ToString(), e); + } + } - /// - /// Configure and monitor the configuration file for modifications - /// and automatically reconfigure the ISqlMapper instance. - /// - /// - /// A FileInfo to a SqlMap.config file. - /// - /// - /// Delegate called when the file has changed. - /// - /// An ISqlMapper instance. - public ISqlMapper ConfigureAndWatch(FileInfo resource, ConfigureHandler configureDelegate) - { - var document = Resources.GetFileInfoAsXmlDocument(resource); + /// + /// Validates an XmlNode against a schema file. + /// + /// The doc to validate. + /// Schema file name. + private void ValidateSchema(XmlNode section, string schemaFileName) + { + XmlReader validatingReader = null; + Stream xsdFile = null; - ConfigWatcherHandler.ClearFilesMonitored(); - ConfigWatcherHandler.AddFileToWatch(resource); + _configScope.ErrorContext.Activity = "Validate SqlMap config"; + try + { + //Validate the document using a schema + xsdFile = GetStream(schemaFileName); - var callBakDelegate = new TimerCallback(OnConfigFileChange); + if (xsdFile == null) + // TODO: avoid using hard-coded value "IBatisNet.DataMapper" + throw new ConfigurationException("Unable to locate embedded resource [IBatisNet.DataMapper." + schemaFileName + "]. If you are building from source, verfiy the file is marked as an embedded resource."); - var state = new StateConfig(); - state.FileName = resource.FullName; - state.ConfigureHandler = configureDelegate; + var schema = XmlSchema.Read(xsdFile, ValidationCallBack); - var sqlMapper = Build(document, true); + var settings = new XmlReaderSettings(); + settings.ValidationType = ValidationType.Schema; - new ConfigWatcherHandler(callBakDelegate, state); + // Create the XmlSchemaSet class. + var schemas = new XmlSchemaSet(); + schemas.Add(schema); - return sqlMapper; - } + settings.Schemas = schemas; + validatingReader = XmlReader.Create(new XmlNodeReader(section), settings); - /// - /// Callback called when the SqlMap.config file has changed. - /// - /// The object. - public static void OnConfigFileChange(object obj) - { - var state = (StateConfig)obj; - state.ConfigureHandler(null); - } - #endregion + // Wire up the call back. The ValidationEvent is fired when the + // XmlValidatingReader hits an issue validating a section of the xml + settings.ValidationEventHandler += ValidationCallBack; + // Validate the document + while (validatingReader.Read()) { } - #region Methods - /// - /// Build an ISqlMapper instance. - /// - /// An xml configuration document. - /// A data source. - /// - /// - /// Returns an ISqlMapper instance. - private ISqlMapper Build(XmlDocument document, DataSource dataSource, - bool useConfigFileWatcher, bool isCallFromDao) - { - _configScope.SqlMapConfigDocument = document; - _configScope.DataSource = dataSource; - _configScope.IsCallFromDao = isCallFromDao; - _configScope.UseConfigFileWatcher = useConfigFileWatcher; - - _configScope.XmlNamespaceManager = new XmlNamespaceManager(_configScope.SqlMapConfigDocument.NameTable); - _configScope.XmlNamespaceManager.AddNamespace(DATAMAPPER_NAMESPACE_PREFIX, DATAMAPPER_XML_NAMESPACE); - _configScope.XmlNamespaceManager.AddNamespace(PROVIDERS_NAMESPACE_PREFIX, PROVIDER_XML_NAMESPACE); - _configScope.XmlNamespaceManager.AddNamespace(MAPPING_NAMESPACE_PREFIX, MAPPING_XML_NAMESPACE); - _configScope.XmlNamespaceManager.AddNamespace(MODULE_NAMESPACE_PREFIX, MODULE_XML_NAMESPACE); - - try - { - if (_validateSqlMapConfig) ValidateSchema(document.ChildNodes[1], "SqlMapConfig.xsd"); - Initialize(); - return _configScope.SqlMapper; - } - catch (Exception e) - { - throw new ConfigurationException(_configScope.ErrorContext.ToString(), e); + if (!_configScope.IsXmlValid) throw new ConfigurationException("Invalid SqlMap.config document. cause :" + _configScope.ErrorContext.Resource); + } + finally + { + if (validatingReader != null) validatingReader.Close(); + if (xsdFile != null) xsdFile.Close(); + } } - } - /// - /// Validates an XmlNode against a schema file. - /// - /// The doc to validate. - /// Schema file name. - private void ValidateSchema(XmlNode section, string schemaFileName) - { - XmlReader validatingReader = null; - Stream xsdFile = null; - - _configScope.ErrorContext.Activity = "Validate SqlMap config"; - try + private void ValidationCallBack(object sender, ValidationEventArgs args) { - //Validate the document using a schema - xsdFile = GetStream(schemaFileName); - - if (xsdFile == null) - // TODO: avoid using hard-coded value "IBatisNet.DataMapper" - throw new ConfigurationException("Unable to locate embedded resource [IBatisNet.DataMapper." + schemaFileName + "]. If you are building from source, verfiy the file is marked as an embedded resource."); - - var schema = XmlSchema.Read(xsdFile, ValidationCallBack); - - var settings = new XmlReaderSettings(); - settings.ValidationType = ValidationType.Schema; - - // Create the XmlSchemaSet class. - var schemas = new XmlSchemaSet(); - schemas.Add(schema); - - settings.Schemas = schemas; - validatingReader = XmlReader.Create(new XmlNodeReader(section), settings); - - // Wire up the call back. The ValidationEvent is fired when the - // XmlValidatingReader hits an issue validating a section of the xml - settings.ValidationEventHandler += ValidationCallBack; - // Validate the document - while (validatingReader.Read()) { } - - if (!_configScope.IsXmlValid) throw new ConfigurationException("Invalid SqlMap.config document. cause :" + _configScope.ErrorContext.Resource); + _configScope.IsXmlValid = false; + _configScope.ErrorContext.Resource += args.Message + Environment.NewLine; } - finally + + /// + /// Load statements (select, insert, update, delete), parameters, and resultMaps. + /// + /// + /// + /// + /// + /// + /// Used by Dao + public ISqlMapper Build(XmlDocument document, DataSource dataSource, bool useConfigFileWatcher, NameValueCollection properties) { - if (validatingReader != null) validatingReader.Close(); - if (xsdFile != null) xsdFile.Close(); + _configScope.Properties.Add(properties); + return Build(document, dataSource, useConfigFileWatcher, true); } - } - - private void ValidationCallBack(object sender, ValidationEventArgs args) - { - _configScope.IsXmlValid = false; - _configScope.ErrorContext.Resource += args.Message + Environment.NewLine; - } - - /// - /// Load statements (select, insert, update, delete), parameters, and resultMaps. - /// - /// - /// - /// - /// - /// - /// Used by Dao - public ISqlMapper Build(XmlDocument document, DataSource dataSource, bool useConfigFileWatcher, NameValueCollection properties) - { - _configScope.Properties.Add(properties); - return Build(document, dataSource, useConfigFileWatcher, true); - } - - /// - /// Load SqlMap configuration from - /// from the XmlDocument passed in parameter. - /// - /// The xml sql map configuration. - /// - public ISqlMapper Build(XmlDocument document, bool useConfigFileWatcher) - { - return Build(document, null, useConfigFileWatcher, false); - } - - /// - /// Reset PreparedStatements cache - /// - private void Reset() { } - /// - /// Intialize the internal ISqlMapper instance. - /// - private void Initialize() - { - Reset(); - - #region Load Global Properties - if (_configScope.IsCallFromDao == false) + /// + /// Load SqlMap configuration from + /// from the XmlDocument passed in parameter. + /// + /// The xml sql map configuration. + /// + public ISqlMapper Build(XmlDocument document, bool useConfigFileWatcher) { - _configScope.NodeContext = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATAMAPPER_CONFIG_ROOT), _configScope.XmlNamespaceManager); - - ParseGlobalProperties(); + return Build(document, null, useConfigFileWatcher, false); } - #endregion - #region Load settings - _configScope.ErrorContext.Activity = "loading global settings"; + /// + /// Reset PreparedStatements cache + /// + private void Reset() { } - var settings = _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_CONFIG_SETTINGS), _configScope.XmlNamespaceManager); + /// + /// Intialize the internal ISqlMapper instance. + /// + private void Initialize() + { + Reset(); - if (settings != null) - foreach (XmlNode setting in settings) + #region Load Global Properties + if (_configScope.IsCallFromDao == false) { - if (setting.Attributes[ATR_USE_STATEMENT_NAMESPACES] != null) - { - var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_STATEMENT_NAMESPACES].Value, _configScope.Properties); - _configScope.UseStatementNamespaces = Convert.ToBoolean(value); - } + _configScope.NodeContext = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATAMAPPER_CONFIG_ROOT), _configScope.XmlNamespaceManager); - if (setting.Attributes[ATR_CACHE_MODELS_ENABLED] != null) - { - var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_CACHE_MODELS_ENABLED].Value, _configScope.Properties); - _configScope.IsCacheModelsEnabled = Convert.ToBoolean(value); - } + ParseGlobalProperties(); + } + #endregion - if (setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER] != null) - { - var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER].Value, _configScope.Properties); - _configScope.UseReflectionOptimizer = Convert.ToBoolean(value); - } + #region Load settings + _configScope.ErrorContext.Activity = "loading global settings"; - if (setting.Attributes[ATR_VALIDATE_SQLMAP] != null) + var settings = _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_CONFIG_SETTINGS), _configScope.XmlNamespaceManager); + + if (settings != null) + foreach (XmlNode setting in settings) { - var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_VALIDATE_SQLMAP].Value, _configScope.Properties); - _configScope.ValidateSqlMap = Convert.ToBoolean(value); - } - } - #endregion + if (setting.Attributes[ATR_USE_STATEMENT_NAMESPACES] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_STATEMENT_NAMESPACES].Value, _configScope.Properties); + _configScope.UseStatementNamespaces = Convert.ToBoolean(value); + } - if (_objectFactory == null) _objectFactory = new ObjectFactory(_configScope.UseReflectionOptimizer); - if (_setAccessorFactory == null) _setAccessorFactory = new SetAccessorFactory(_configScope.UseReflectionOptimizer); - if (_getAccessorFactory == null) _getAccessorFactory = new GetAccessorFactory(_configScope.UseReflectionOptimizer); - if (_sqlMapper == null) - { - var accessorFactory = new AccessorFactory(_setAccessorFactory, _getAccessorFactory); - _configScope.SqlMapper = new SqlMapper(_objectFactory, accessorFactory); - } - else - { - _configScope.SqlMapper = _sqlMapper; - } + if (setting.Attributes[ATR_CACHE_MODELS_ENABLED] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_CACHE_MODELS_ENABLED].Value, _configScope.Properties); + _configScope.IsCacheModelsEnabled = Convert.ToBoolean(value); + } - var emptyParameterMap = new ParameterMap(_configScope.DataExchangeFactory); - emptyParameterMap.Id = ConfigurationScope.EMPTY_PARAMETER_MAP; - _configScope.SqlMapper.AddParameterMap(emptyParameterMap); - - _configScope.SqlMapper.IsCacheModelsEnabled = _configScope.IsCacheModelsEnabled; - - #region Cache Alias - var cacheAlias = new TypeAlias(typeof(MemoryCacheControler)); - cacheAlias.Name = "MEMORY"; - _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); - cacheAlias = new TypeAlias(typeof(LruCacheController)); - cacheAlias.Name = "LRU"; - _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); - cacheAlias = new TypeAlias(typeof(FifoCacheController)); - cacheAlias.Name = "FIFO"; - _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); - cacheAlias = new TypeAlias(typeof(AnsiStringTypeHandler)); - cacheAlias.Name = "AnsiStringTypeHandler"; - _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); - #endregion + if (setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_USE_REFLECTION_OPTIMIZER].Value, _configScope.Properties); + _configScope.UseReflectionOptimizer = Convert.ToBoolean(value); + } - #region Load providers - if (_configScope.IsCallFromDao == false) GetProviders(); - #endregion + if (setting.Attributes[ATR_VALIDATE_SQLMAP] != null) + { + var value = NodeUtils.ParsePropertyTokens(setting.Attributes[ATR_VALIDATE_SQLMAP].Value, _configScope.Properties); + _configScope.ValidateSqlMap = Convert.ToBoolean(value); + } + } + #endregion - #region Load DataBase - #region Choose the provider - IDbProvider provider = null; - if (_configScope.IsCallFromDao == false) - { - provider = ParseProvider(); - _configScope.ErrorContext.Reset(); - } - #endregion + if (_objectFactory == null) _objectFactory = new ObjectFactory(_configScope.UseReflectionOptimizer); + if (_setAccessorFactory == null) _setAccessorFactory = new SetAccessorFactory(_configScope.UseReflectionOptimizer); + if (_getAccessorFactory == null) _getAccessorFactory = new GetAccessorFactory(_configScope.UseReflectionOptimizer); + if (_sqlMapper == null) + { + var accessorFactory = new AccessorFactory(_setAccessorFactory, _getAccessorFactory); + _configScope.SqlMapper = new SqlMapper(_objectFactory, accessorFactory); + } + else + { + _configScope.SqlMapper = _sqlMapper; + } - #region Load the DataSources - _configScope.ErrorContext.Activity = "loading Database DataSource"; - var nodeDataSource = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_DATASOURCE), _configScope.XmlNamespaceManager); + var emptyParameterMap = new ParameterMap(_configScope.DataExchangeFactory); + emptyParameterMap.Id = ConfigurationScope.EMPTY_PARAMETER_MAP; + _configScope.SqlMapper.AddParameterMap(emptyParameterMap); + + _configScope.SqlMapper.IsCacheModelsEnabled = _configScope.IsCacheModelsEnabled; + + #region Cache Alias + var cacheAlias = new TypeAlias(typeof(MemoryCacheControler)); + cacheAlias.Name = "MEMORY"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(LruCacheController)); + cacheAlias.Name = "LRU"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(FifoCacheController)); + cacheAlias.Name = "FIFO"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + cacheAlias = new TypeAlias(typeof(AnsiStringTypeHandler)); + cacheAlias.Name = "AnsiStringTypeHandler"; + _configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(cacheAlias.Name, cacheAlias); + #endregion - if (nodeDataSource == null) - { - if (_configScope.IsCallFromDao == false) throw new ConfigurationException("There's no dataSource tag in SqlMap.config."); + #region Load providers + if (_configScope.IsCallFromDao == false) GetProviders(); + #endregion - // patch from Luke Yang - _configScope.SqlMapper.DataSource = _configScope.DataSource; - } - else - { + #region Load DataBase + #region Choose the provider + IDbProvider provider = null; if (_configScope.IsCallFromDao == false) { - _configScope.ErrorContext.Resource = nodeDataSource.OuterXml; - _configScope.ErrorContext.MoreInfo = "parse DataSource"; + provider = ParseProvider(); + _configScope.ErrorContext.Reset(); + } + #endregion - var dataSource = DataSourceDeSerializer.Deserialize(nodeDataSource); + #region Load the DataSources + _configScope.ErrorContext.Activity = "loading Database DataSource"; + var nodeDataSource = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_DATASOURCE), _configScope.XmlNamespaceManager); - dataSource.DbProvider = provider; - dataSource.ConnectionString = NodeUtils.ParsePropertyTokens(dataSource.ConnectionString, _configScope.Properties); + if (nodeDataSource == null) + { + if (_configScope.IsCallFromDao == false) throw new ConfigurationException("There's no dataSource tag in SqlMap.config."); - _configScope.DataSource = dataSource; + // patch from Luke Yang _configScope.SqlMapper.DataSource = _configScope.DataSource; } else { - _configScope.SqlMapper.DataSource = _configScope.DataSource; - } + if (_configScope.IsCallFromDao == false) + { + _configScope.ErrorContext.Resource = nodeDataSource.OuterXml; + _configScope.ErrorContext.MoreInfo = "parse DataSource"; - _configScope.ErrorContext.Reset(); - } - #endregion - #endregion + var dataSource = DataSourceDeSerializer.Deserialize(nodeDataSource); - #region Load Global TypeAlias - foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEALIAS), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.Activity = "loading global Type alias"; - TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); - } + dataSource.DbProvider = provider; + dataSource.ConnectionString = NodeUtils.ParsePropertyTokens(dataSource.ConnectionString, _configScope.Properties); - _configScope.ErrorContext.Reset(); - #endregion + _configScope.DataSource = dataSource; + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } + else + { + _configScope.SqlMapper.DataSource = _configScope.DataSource; + } - #region Load TypeHandlers - foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEHANDLER), _configScope.XmlNamespaceManager)) - try - { - _configScope.ErrorContext.Activity = "loading typeHandler"; - TypeHandlerDeSerializer.Deserialize(xmlNode, _configScope); + _configScope.ErrorContext.Reset(); } - catch (Exception e) - { - var prop = NodeUtils.ParseAttributes(xmlNode, _configScope.Properties); + #endregion + #endregion - throw new ConfigurationException( - string.Format("Error registering TypeHandler class \"{0}\" for handling .Net type \"{1}\" and dbType \"{2}\". Cause: {3}", - NodeUtils.GetStringAttribute(prop, "callback"), - NodeUtils.GetStringAttribute(prop, "type"), - NodeUtils.GetStringAttribute(prop, "dbType"), - e.Message), e); + #region Load Global TypeAlias + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEALIAS), _configScope.XmlNamespaceManager)) + { + _configScope.ErrorContext.Activity = "loading global Type alias"; + TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); } - _configScope.ErrorContext.Reset(); - #endregion - - #region Load sqlMap mapping files - foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager)) - { - _configScope.NodeContext = xmlNode; - ConfigureSqlMap(); - } - #endregion + _configScope.ErrorContext.Reset(); + #endregion - #region Load sqlMap Modules - foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_MAPMODULE), _configScope.XmlNamespaceManager)) - { - _configScope.NodeContext = xmlNode; - ConfigureSqlMapModule(); - } + #region Load TypeHandlers + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_TYPEHANDLER), _configScope.XmlNamespaceManager)) + try + { + _configScope.ErrorContext.Activity = "loading typeHandler"; + TypeHandlerDeSerializer.Deserialize(xmlNode, _configScope); + } + catch (Exception e) + { + var prop = NodeUtils.ParseAttributes(xmlNode, _configScope.Properties); + + throw new ConfigurationException( + string.Format("Error registering TypeHandler class \"{0}\" for handling .Net type \"{1}\" and dbType \"{2}\". Cause: {3}", + NodeUtils.GetStringAttribute(prop, "callback"), + NodeUtils.GetStringAttribute(prop, "type"), + NodeUtils.GetStringAttribute(prop, "dbType"), + e.Message), e); + } - _configScope.ErrorContext.Reset(); - #endregion + _configScope.ErrorContext.Reset(); + #endregion - #region Attach CacheModel to statement - if (_configScope.IsCacheModelsEnabled) - foreach (DictionaryEntry entry in _configScope.SqlMapper.MappedStatements) + #region Load sqlMap mapping files + var toProcessLazily = new List(); + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.Activity = "Set CacheModel to statement"; - - var mappedStatement = (IMappedStatement)entry.Value; - if (mappedStatement.Statement.CacheModelName.Length > 0) + var shouldLazyLoad = false; + + var isEmbedded = xmlNode.Attributes["embedded"] != null; + if (isEmbedded) { - _configScope.ErrorContext.MoreInfo = "statement : " + mappedStatement.Statement.Id; - _configScope.ErrorContext.Resource = "cacheModel : " + mappedStatement.Statement.CacheModelName; - mappedStatement.Statement.CacheModel = _configScope.SqlMapper.GetCache(mappedStatement.Statement.CacheModelName); + var embeddedPath = xmlNode.Attributes["embedded"].Value; + + // This is a special result used in many other sqlMaps. + if (!embeddedPath.ToLower().Contains(".global.xml,")) + { + var parts = embeddedPath.Split('.'); + for (var i = 1; i < parts.Length; i++) + { + var part = parts[i]; + if (!part.ToLower().StartsWith("xml,")) + continue; + + // TODO: Can we recursively load types? Probably not? + + var entityName = parts[i - 1]; + // TODO: Extract out configuration logic to make sure it doesn't depend on _configScope! + var configScope = _configScope; + var currentNode = xmlNode; + configScope.SqlMapper.RegisterEntityToMap(entityName, () => + { + ConfigureSqlMap(currentNode, configScope, true); + }); + shouldLazyLoad = true; + toProcessLazily.Add(entityName); + } + } } + + if(!shouldLazyLoad) + ConfigureSqlMap(xmlNode, _configScope); } + #endregion - _configScope.ErrorContext.Reset(); - #endregion + #region Load sqlMap Modules + foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_MAPMODULE), _configScope.XmlNamespaceManager)) + ConfigureSqlMapModule(xmlNode); - #region Register Trigger Statements for Cache Models - foreach (DictionaryEntry entry in _configScope.CacheModelFlushOnExecuteStatements) - { - var cacheModelId = (string)entry.Key; - var statementsToRegister = (IList)entry.Value; + _configScope.ErrorContext.Reset(); + #endregion - if (statementsToRegister != null && statementsToRegister.Count > 0) - foreach (string statementName in statementsToRegister) + #region Attach CacheModel to statement + if (_configScope.IsCacheModelsEnabled) + foreach (DictionaryEntry entry in _configScope.SqlMapper.MappedStatements) { - var mappedStatement = _configScope.SqlMapper.MappedStatements[statementName] as IMappedStatement; + _configScope.ErrorContext.Activity = "Set CacheModel to statement"; - if (mappedStatement != null) + var mappedStatement = (IMappedStatement)entry.Value; + if (mappedStatement.Statement.CacheModelName.Length > 0) { - var cacheModel = _configScope.SqlMapper.GetCache(cacheModelId); + _configScope.ErrorContext.MoreInfo = "statement : " + mappedStatement.Statement.Id; + _configScope.ErrorContext.Resource = "cacheModel : " + mappedStatement.Statement.CacheModelName; + mappedStatement.Statement.CacheModel = _configScope.SqlMapper.GetCache(mappedStatement.Statement.CacheModelName); + } + } - if (_logger.IsDebugEnabled) _logger.Debug("Registering trigger statement [" + mappedStatement.Id + "] to cache model [" + cacheModel.Id + "]"); + _configScope.ErrorContext.Reset(); + #endregion - cacheModel.RegisterTriggerStatement(mappedStatement); - } - else + #region Register Trigger Statements for Cache Models + foreach (DictionaryEntry entry in _configScope.CacheModelFlushOnExecuteStatements) + { + var cacheModelId = (string)entry.Key; + var statementsToRegister = (IList)entry.Value; + + if (statementsToRegister != null && statementsToRegister.Count > 0) + foreach (string statementName in statementsToRegister) { - if (_logger.IsWarnEnabled) _logger.Warn("Unable to register trigger statement [" + statementName + "] to cache model [" + cacheModelId + "]. Statement does not exist."); + var mappedStatement = _configScope.SqlMapper.MappedStatements[statementName] as IMappedStatement; + + if (mappedStatement != null) + { + var cacheModel = _configScope.SqlMapper.GetCache(cacheModelId); + + if (_logger.IsDebugEnabled) _logger.Debug("Registering trigger statement [" + mappedStatement.Id + "] to cache model [" + cacheModel.Id + "]"); + + cacheModel.RegisterTriggerStatement(mappedStatement); + } + else + { + if (_logger.IsWarnEnabled) _logger.Warn("Unable to register trigger statement [" + statementName + "] to cache model [" + cacheModelId + "]. Statement does not exist."); + } } - } + } + #endregion + + #region Resolve resultMap / Discriminator / PropertyStategy attributes on Result/Argument Property + foreach (DictionaryEntry entry in _configScope.SqlMapper.ResultMaps) + { + _configScope.ErrorContext.Activity = "Resolve 'resultMap' attribute on Result Property"; + + var resultMap = (ResultMap)entry.Value; + PostProcessResultMap(resultMap, _configScope); + } + + _configScope.ErrorContext.Reset(); + #endregion + + // Kick-Start the Lazy-Load process + // Note: Given we re-use the SQLMapConfig for many mappers, I'm not sure that this is a win. + // Task.Run(() => + // { + // foreach (var entity in toProcessLazily) + // { + // _configScope.SqlMapper.LazyLoadMappedStatement($"{entity}.LazyInitialization"); + // } + // }); } - #endregion - #region Resolve resultMap / Discriminator / PropertyStategy attributes on Result/Argument Property - foreach (DictionaryEntry entry in _configScope.SqlMapper.ResultMaps) + private void PostProcessResultMap(ResultMap resultMap, ConfigurationScope configScope) { - _configScope.ErrorContext.Activity = "Resolve 'resultMap' attribute on Result Property"; - - var resultMap = (ResultMap)entry.Value; for (var index = 0; index < resultMap.Properties.Count; index++) { var result = resultMap.Properties[index]; - if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); result.PropertyStrategy = PropertyStrategyFactory.Get(result); } for (var index = 0; index < resultMap.Parameters.Count; index++) { var result = resultMap.Parameters[index]; - if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); result.ArgumentStrategy = ArgumentStrategyFactory.Get((ArgumentProperty)result); } - if (resultMap.Discriminator != null) resultMap.Discriminator.Initialize(_configScope); + if (resultMap.Discriminator != null) + resultMap.Discriminator.Initialize(configScope); } - _configScope.ErrorContext.Reset(); - #endregion - } - - /// - /// Load and initialize providers from specified file. - /// - private void GetProviders() - { - IDbProvider provider; - XmlDocument xmlProviders; - - _configScope.ErrorContext.Activity = "loading Providers"; + /// + /// Load and initialize providers from specified file. + /// + private void GetProviders() + { + IDbProvider provider; + XmlDocument xmlProviders; - XmlNode providersNode; - providersNode = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_CONFIG_PROVIDERS), _configScope.XmlNamespaceManager); + _configScope.ErrorContext.Activity = "loading Providers"; - if (providersNode != null) - xmlProviders = Resources.GetAsXmlDocument(providersNode, _configScope.Properties); - else - xmlProviders = Resources.GetConfigAsXmlDocument(PROVIDERS_FILE_NAME); + XmlNode providersNode; + providersNode = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_CONFIG_PROVIDERS), _configScope.XmlNamespaceManager); - foreach (XmlNode node in xmlProviders.SelectNodes(ApplyProviderNamespacePrefix(XML_PROVIDER), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.Resource = node.InnerXml; - provider = ProviderDeSerializer.Deserialize(node); + if (providersNode != null) + xmlProviders = Resources.GetAsXmlDocument(providersNode, _configScope.Properties); + else + xmlProviders = Resources.GetConfigAsXmlDocument(PROVIDERS_FILE_NAME); - if (provider.IsEnabled) + foreach (XmlNode node in xmlProviders.SelectNodes(ApplyProviderNamespacePrefix(XML_PROVIDER), _configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.ObjectId = provider.Name; - _configScope.ErrorContext.MoreInfo = "initialize provider"; - - provider.Initialize(); - _configScope.Providers.Add(provider.Name, provider); + _configScope.ErrorContext.Resource = node.InnerXml; + provider = ProviderDeSerializer.Deserialize(node); - if (provider.IsDefault) + if (provider.IsEnabled) { - if (_configScope.Providers[DEFAULT_PROVIDER_NAME] == null) - _configScope.Providers.Add(DEFAULT_PROVIDER_NAME, provider); - else - throw new ConfigurationException( - string.Format("Error while configuring the Provider named \"{0}\" There can be only one default Provider.", provider.Name)); + _configScope.ErrorContext.ObjectId = provider.Name; + _configScope.ErrorContext.MoreInfo = "initialize provider"; + + provider.Initialize(); + _configScope.Providers.Add(provider.Name, provider); + + if (provider.IsDefault) + { + if (_configScope.Providers[DEFAULT_PROVIDER_NAME] == null) + _configScope.Providers.Add(DEFAULT_PROVIDER_NAME, provider); + else + throw new ConfigurationException( + string.Format("Error while configuring the Provider named \"{0}\" There can be only one default Provider.", provider.Name)); + } } } + + _configScope.ErrorContext.Reset(); } - _configScope.ErrorContext.Reset(); - } + /// + /// Parse the provider tag. + /// + /// A provider object. + private IDbProvider ParseProvider() + { + _configScope.ErrorContext.Activity = "load DataBase Provider"; + var node = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_PROVIDER), _configScope.XmlNamespaceManager); - /// - /// Parse the provider tag. - /// - /// A provider object. - private IDbProvider ParseProvider() - { - _configScope.ErrorContext.Activity = "load DataBase Provider"; - var node = _configScope.SqlMapConfigDocument.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_DATABASE_PROVIDER), _configScope.XmlNamespaceManager); + if (node != null) + { + _configScope.ErrorContext.Resource = node.OuterXml; + var providerName = NodeUtils.ParsePropertyTokens(node.Attributes["name"].Value, _configScope.Properties); - if (node != null) - { - _configScope.ErrorContext.Resource = node.OuterXml; - var providerName = NodeUtils.ParsePropertyTokens(node.Attributes["name"].Value, _configScope.Properties); + _configScope.ErrorContext.ObjectId = providerName; - _configScope.ErrorContext.ObjectId = providerName; + if (_configScope.Providers.Contains(providerName)) return (IDbProvider)_configScope.Providers[providerName]; - if (_configScope.Providers.Contains(providerName)) return (IDbProvider)_configScope.Providers[providerName]; + throw new ConfigurationException( + string.Format("Error while configuring the Provider named \"{0}\". Cause : The provider is not in 'providers.config' or is not enabled.", + providerName)); + } + + if (_configScope.Providers.Contains(DEFAULT_PROVIDER_NAME)) return (IDbProvider)_configScope.Providers[DEFAULT_PROVIDER_NAME]; throw new ConfigurationException( - string.Format("Error while configuring the Provider named \"{0}\". Cause : The provider is not in 'providers.config' or is not enabled.", - providerName)); + "Error while configuring the SqlMap. There is no provider marked default in 'providers.config' file."); } - if (_configScope.Providers.Contains(DEFAULT_PROVIDER_NAME)) return (IDbProvider)_configScope.Providers[DEFAULT_PROVIDER_NAME]; + private void ConfigureSqlMapModule(XmlNode sqlModuleNode) + { + _configScope.ErrorContext.Activity = "loading SqlMap Module"; + _configScope.ErrorContext.Resource = sqlModuleNode.OuterXml; + if (_configScope.UseConfigFileWatcher) + if (sqlModuleNode.Attributes["resource"] != null || sqlModuleNode.Attributes["url"] != null) + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlModuleNode, _configScope.Properties))); - throw new ConfigurationException( - "Error while configuring the SqlMap. There is no provider marked default in 'providers.config' file."); - } + _configScope.SqlMapModuleDocument = Resources.GetAsXmlDocument(sqlModuleNode, _configScope.Properties); - private void ConfigureSqlMapModule() - { - var sqlModuleNode = _configScope.NodeContext; + if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapModuleDocument.ChildNodes[1], "SqlMapModule.xsd"); + foreach (XmlNode xmlNode in _configScope.SqlMapModuleDocument.SelectNodes(ApplyModuleNamespacePrefix(XML_MODULE_MAP), _configScope.XmlNamespaceManager)) + { + _configScope.NodeContext = xmlNode; + ConfigureSqlMap(xmlNode, _configScope); + _configScope.NodeContext = sqlModuleNode; + } + } - _configScope.ErrorContext.Activity = "loading SqlMap Module"; - _configScope.ErrorContext.Resource = sqlModuleNode.OuterXml; - if (_configScope.UseConfigFileWatcher) - if (sqlModuleNode.Attributes["resource"] != null || sqlModuleNode.Attributes["url"] != null) - ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlModuleNode, _configScope.Properties))); + /// + /// Load sqlMap statement. + /// + private void ConfigureSqlMap(XmlNode sqlMapNode, ConfigurationScope configScope, bool isLazy = false) + { + configScope.NodeContext = sqlMapNode; + configScope.ErrorContext.Activity = "loading SqlMap"; + configScope.ErrorContext.Resource = sqlMapNode.OuterXml; - _configScope.SqlMapModuleDocument = Resources.GetAsXmlDocument(sqlModuleNode, _configScope.Properties); + if (configScope.UseConfigFileWatcher) + if (sqlMapNode.Attributes["resource"] != null || sqlMapNode.Attributes["url"] != null) + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlMapNode, configScope.Properties))); - if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapModuleDocument.ChildNodes[1], "SqlMapModule.xsd"); - foreach (XmlNode xmlNode in _configScope.SqlMapModuleDocument.SelectNodes(ApplyModuleNamespacePrefix(XML_MODULE_MAP), _configScope.XmlNamespaceManager)) - { - _configScope.NodeContext = xmlNode; - ConfigureSqlMap(); - _configScope.NodeContext = sqlModuleNode; - } - } + // Load the file + configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, configScope.Properties); - /// - /// Load sqlMap statement. - /// - private void ConfigureSqlMap() - { - var sqlMapNode = _configScope.NodeContext; + if (configScope.ValidateSqlMap) ValidateSchema(configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); - _configScope.ErrorContext.Activity = "loading SqlMap"; - _configScope.ErrorContext.Resource = sqlMapNode.OuterXml; + configScope.SqlMapNamespace = configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), configScope.XmlNamespaceManager).Attributes["namespace"].Value; - if (_configScope.UseConfigFileWatcher) - if (sqlMapNode.Attributes["resource"] != null || sqlMapNode.Attributes["url"] != null) - ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlMapNode, _configScope.Properties))); + #region Load TypeAlias + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), configScope.XmlNamespaceManager)) TypeAliasDeSerializer.Deserialize(xmlNode, configScope); + configScope.ErrorContext.MoreInfo = string.Empty; + configScope.ErrorContext.ObjectId = string.Empty; + #endregion - // Load the file - _configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, _configScope.Properties); + #region Load resultMap + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_RESULTMAP), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading ResultMap tag"; + var resultMap = BuildResultMap(xmlNode, configScope); + if(isLazy) + PostProcessResultMap(resultMap, configScope); + } + #endregion - if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); + #region Load parameterMaps + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PARAMETERMAP), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading ParameterMap tag"; + configScope.NodeContext = xmlNode; // A ParameterMap node - _configScope.SqlMapNamespace = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), _configScope.XmlNamespaceManager).Attributes["namespace"].Value; + BuildParameterMap(); + } + #endregion - #region Load TypeAlias - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), _configScope.XmlNamespaceManager)) TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); - _configScope.ErrorContext.MoreInfo = string.Empty; - _configScope.ErrorContext.ObjectId = string.Empty; - #endregion + #region Load statements + #region Sql tag + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(SQL_STATEMENT), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading sql tag"; + configScope.NodeContext = xmlNode; // A sql tag - #region Load resultMap - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_RESULTMAP), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading ResultMap tag"; - _configScope.NodeContext = xmlNode; // A ResultMap node + SqlDeSerializer.Deserialize(xmlNode, configScope); + } + #endregion - BuildResultMap(); - } - #endregion + #region Statement tag + Statement statement; + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_STATEMENT), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading statement tag"; + configScope.NodeContext = xmlNode; // A statement tag - #region Load parameterMaps - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PARAMETERMAP), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading ParameterMap tag"; - _configScope.NodeContext = xmlNode; // A ParameterMap node + statement = StatementDeSerializer.Deserialize(xmlNode, configScope); + statement.CacheModelName = configScope.ApplyNamespace(statement.CacheModelName); + statement.ParameterMapName = configScope.ApplyNamespace(statement.ParameterMapName); + //statement.ResultMapName = ApplyNamespace( statement.ResultMapName ); - BuildParameterMap(); - } - #endregion + if (configScope.UseStatementNamespaces) statement.Id = configScope.ApplyNamespace(statement.Id); + configScope.ErrorContext.ObjectId = statement.Id; + statement.Initialize(configScope); - #region Load statements - #region Sql tag - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(SQL_STATEMENT), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading sql tag"; - _configScope.NodeContext = xmlNode; // A sql tag + // Build ISql (analyse sql statement) + ProcessSqlStatement(statement); - SqlDeSerializer.Deserialize(xmlNode, _configScope); - } - #endregion + // Build MappedStatement + var mappedStatement = new MappedStatement(configScope.SqlMapper, statement); + IMappedStatement mapStatement = mappedStatement; + if (statement.CacheModelName != null && statement.CacheModelName.Length > 0 && configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); - #region Statement tag - Statement statement; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_STATEMENT), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading statement tag"; - _configScope.NodeContext = xmlNode; // A statement tag + configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + } + #endregion + + #region Select tag + Select select; + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_SELECT), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading select tag"; + configScope.NodeContext = xmlNode; // A select node - statement = StatementDeSerializer.Deserialize(xmlNode, _configScope); - statement.CacheModelName = _configScope.ApplyNamespace(statement.CacheModelName); - statement.ParameterMapName = _configScope.ApplyNamespace(statement.ParameterMapName); - //statement.ResultMapName = ApplyNamespace( statement.ResultMapName ); + select = SelectDeSerializer.Deserialize(xmlNode, configScope); + select.CacheModelName = configScope.ApplyNamespace(select.CacheModelName); + select.ParameterMapName = configScope.ApplyNamespace(select.ParameterMapName); + //select.ResultMapName = ApplyNamespace( select.ResultMapName ); - if (_configScope.UseStatementNamespaces) statement.Id = _configScope.ApplyNamespace(statement.Id); - _configScope.ErrorContext.ObjectId = statement.Id; - statement.Initialize(_configScope); + if (configScope.UseStatementNamespaces) select.Id = configScope.ApplyNamespace(select.Id); + configScope.ErrorContext.ObjectId = select.Id; - // Build ISql (analyse sql statement) - ProcessSqlStatement(statement); + select.Initialize(configScope); - // Build MappedStatement - var mappedStatement = new MappedStatement(_configScope.SqlMapper, statement); - IMappedStatement mapStatement = mappedStatement; - if (statement.CacheModelName != null && statement.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + if (select.Generate != null) + GenerateCommandText(configScope, select); + else + // Build ISql (analyse sql statement) + ProcessSqlStatement(select); - _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); - } - #endregion + // Build MappedStatement + MappedStatement mappedStatement = new SelectMappedStatement(configScope.SqlMapper, select); + IMappedStatement mapStatement = mappedStatement; + if (select.CacheModelName != null && select.CacheModelName.Length > 0 && configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); - #region Select tag - Select select; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_SELECT), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading select tag"; - _configScope.NodeContext = xmlNode; // A select node + configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + } + #endregion - select = SelectDeSerializer.Deserialize(xmlNode, _configScope); - select.CacheModelName = _configScope.ApplyNamespace(select.CacheModelName); - select.ParameterMapName = _configScope.ApplyNamespace(select.ParameterMapName); - //select.ResultMapName = ApplyNamespace( select.ResultMapName ); + #region Insert tag + Insert insert; + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_INSERT), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading insert tag"; + configScope.NodeContext = xmlNode; // A insert tag - if (_configScope.UseStatementNamespaces) select.Id = _configScope.ApplyNamespace(select.Id); - _configScope.ErrorContext.ObjectId = select.Id; + MappedStatement mappedStatement; - select.Initialize(_configScope); + insert = InsertDeSerializer.Deserialize(xmlNode, configScope); + insert.CacheModelName = configScope.ApplyNamespace(insert.CacheModelName); + insert.ParameterMapName = configScope.ApplyNamespace(insert.ParameterMapName); + //insert.ResultMapName = ApplyNamespace( insert.ResultMapName ); - if (select.Generate != null) - GenerateCommandText(_configScope, select); - else - // Build ISql (analyse sql statement) - ProcessSqlStatement(select); + if (configScope.UseStatementNamespaces) insert.Id = configScope.ApplyNamespace(insert.Id); + configScope.ErrorContext.ObjectId = insert.Id; + insert.Initialize(configScope); - // Build MappedStatement - MappedStatement mappedStatement = new SelectMappedStatement(_configScope.SqlMapper, select); - IMappedStatement mapStatement = mappedStatement; - if (select.CacheModelName != null && select.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + // Build ISql (analyse sql command text) + if (insert.Generate != null) + GenerateCommandText(configScope, insert); + else + ProcessSqlStatement(insert); - _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); - } - #endregion + // Build MappedStatement + mappedStatement = new InsertMappedStatement(configScope.SqlMapper, insert); - #region Insert tag - Insert insert; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_INSERT), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading insert tag"; - _configScope.NodeContext = xmlNode; // A insert tag + configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - MappedStatement mappedStatement; + #region statement SelectKey + // Set sql statement SelectKey + if (insert.SelectKey != null) + { + configScope.ErrorContext.MoreInfo = "loading selectKey tag"; + configScope.NodeContext = xmlNode.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SELECTKEY), configScope.XmlNamespaceManager); - insert = InsertDeSerializer.Deserialize(xmlNode, _configScope); - insert.CacheModelName = _configScope.ApplyNamespace(insert.CacheModelName); - insert.ParameterMapName = _configScope.ApplyNamespace(insert.ParameterMapName); - //insert.ResultMapName = ApplyNamespace( insert.ResultMapName ); + insert.SelectKey.Id = insert.Id; + insert.SelectKey.Initialize(configScope); + insert.SelectKey.Id += DOT + "SelectKey"; - if (_configScope.UseStatementNamespaces) insert.Id = _configScope.ApplyNamespace(insert.Id); - _configScope.ErrorContext.ObjectId = insert.Id; - insert.Initialize(_configScope); + // Initialize can also use configScope.ErrorContext.ObjectId to get the id + // of the parent node - // insert.SelectKey.Initialize( _configScope ); - // insert.SelectKey.Id = insert.Id + DOT + "SelectKey"; + update = UpdateDeSerializer.Deserialize(xmlNode, configScope); + update.CacheModelName = configScope.ApplyNamespace(update.CacheModelName); + update.ParameterMapName = configScope.ApplyNamespace(update.ParameterMapName); + //update.ResultMapName = ApplyNamespace( update.ResultMapName ); - ProcessSqlStatement(insert.SelectKey); + if (configScope.UseStatementNamespaces) update.Id = configScope.ApplyNamespace(update.Id); + configScope.ErrorContext.ObjectId = update.Id; + update.Initialize(configScope); + + // Build ISql (analyse sql statement) + if (update.Generate != null) + GenerateCommandText(configScope, update); + else + // Build ISql (analyse sql statement) + ProcessSqlStatement(update); // Build MappedStatement - mappedStatement = new MappedStatement(_configScope.SqlMapper, insert.SelectKey); + mappedStatement = new UpdateMappedStatement(configScope.SqlMapper, update); - _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); + configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); } #endregion - } - #endregion - #region Update tag - Update update; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_UPDATE), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading update tag"; - _configScope.NodeContext = xmlNode; // A update tag + #region Delete tag + Delete delete; + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_DELETE), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading delete tag"; + configScope.NodeContext = xmlNode; // A delete tag + MappedStatement mappedStatement; + + delete = DeleteDeSerializer.Deserialize(xmlNode, configScope); + delete.CacheModelName = configScope.ApplyNamespace(delete.CacheModelName); + delete.ParameterMapName = configScope.ApplyNamespace(delete.ParameterMapName); + //delete.ResultMapName = ApplyNamespace( delete.ResultMapName ); + + if (configScope.UseStatementNamespaces) delete.Id = configScope.ApplyNamespace(delete.Id); + configScope.ErrorContext.ObjectId = delete.Id; + delete.Initialize(configScope); + + // Build ISql (analyse sql statement) + if (delete.Generate != null) + GenerateCommandText(configScope, delete); + else + // Build ISql (analyse sql statement) + ProcessSqlStatement(delete); - MappedStatement mappedStatement; + // Build MappedStatement + mappedStatement = new DeleteMappedStatement(configScope.SqlMapper, delete); - update = UpdateDeSerializer.Deserialize(xmlNode, _configScope); - update.CacheModelName = _configScope.ApplyNamespace(update.CacheModelName); - update.ParameterMapName = _configScope.ApplyNamespace(update.ParameterMapName); - //update.ResultMapName = ApplyNamespace( update.ResultMapName ); + configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); + } + #endregion - if (_configScope.UseStatementNamespaces) update.Id = _configScope.ApplyNamespace(update.Id); - _configScope.ErrorContext.ObjectId = update.Id; - update.Initialize(_configScope); + #region Procedure tag + Procedure procedure; + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PROCEDURE), configScope.XmlNamespaceManager)) + { + configScope.ErrorContext.MoreInfo = "loading procedure tag"; + configScope.NodeContext = xmlNode; // A procedure tag - // Build ISql (analyse sql statement) - if (update.Generate != null) - GenerateCommandText(_configScope, update); - else - // Build ISql (analyse sql statement) - ProcessSqlStatement(update); + procedure = ProcedureDeSerializer.Deserialize(xmlNode, configScope); + procedure.CacheModelName = configScope.ApplyNamespace(procedure.CacheModelName); + procedure.ParameterMapName = configScope.ApplyNamespace(procedure.ParameterMapName); + //procedure.ResultMapName = ApplyNamespace( procedure.ResultMapName ); - // Build MappedStatement - mappedStatement = new UpdateMappedStatement(_configScope.SqlMapper, update); + if (configScope.UseStatementNamespaces) procedure.Id = configScope.ApplyNamespace(procedure.Id); + configScope.ErrorContext.ObjectId = procedure.Id; + procedure.Initialize(configScope); - _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion + // Build ISql (analyse sql command text) + ProcessSqlStatement(procedure); - #region Delete tag - Delete delete; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_DELETE), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading delete tag"; - _configScope.NodeContext = xmlNode; // A delete tag - MappedStatement mappedStatement; - - delete = DeleteDeSerializer.Deserialize(xmlNode, _configScope); - delete.CacheModelName = _configScope.ApplyNamespace(delete.CacheModelName); - delete.ParameterMapName = _configScope.ApplyNamespace(delete.ParameterMapName); - //delete.ResultMapName = ApplyNamespace( delete.ResultMapName ); - - if (_configScope.UseStatementNamespaces) delete.Id = _configScope.ApplyNamespace(delete.Id); - _configScope.ErrorContext.ObjectId = delete.Id; - delete.Initialize(_configScope); - - // Build ISql (analyse sql statement) - if (delete.Generate != null) - GenerateCommandText(_configScope, delete); - else - // Build ISql (analyse sql statement) - ProcessSqlStatement(delete); + // Build MappedStatement + var mappedStatement = new MappedStatement(configScope.SqlMapper, procedure); + IMappedStatement mapStatement = mappedStatement; + if (procedure.CacheModelName != null && procedure.CacheModelName.Length > 0 && configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); - // Build MappedStatement - mappedStatement = new DeleteMappedStatement(_configScope.SqlMapper, delete); + configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + } + #endregion + #endregion - _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion + #region Load CacheModels + if (configScope.IsCacheModelsEnabled) + { + CacheModel cacheModel; + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_CACHE_MODEL), configScope.XmlNamespaceManager)) + { + cacheModel = CacheModelDeSerializer.Deserialize(xmlNode, configScope); + cacheModel.Id = configScope.ApplyNamespace(cacheModel.Id); - #region Procedure tag - Procedure procedure; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PROCEDURE), _configScope.XmlNamespaceManager)) - { - _configScope.ErrorContext.MoreInfo = "loading procedure tag"; - _configScope.NodeContext = xmlNode; // A procedure tag + // Attach ExecuteEventHandler + foreach (XmlNode flushOn in xmlNode.SelectNodes(ApplyMappingNamespacePrefix(XML_FLUSH_ON_EXECUTE), configScope.XmlNamespaceManager)) + { + var statementName = flushOn.Attributes["statement"].Value; + if (configScope.UseStatementNamespaces) statementName = configScope.ApplyNamespace(statementName); + + // delay registering statements to cache model until all sqlMap files have been processed + var statementNames = (IList)configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id]; + if (statementNames == null) statementNames = new ArrayList(); + statementNames.Add(statementName); + configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id] = statementNames; + } - procedure = ProcedureDeSerializer.Deserialize(xmlNode, _configScope); - procedure.CacheModelName = _configScope.ApplyNamespace(procedure.CacheModelName); - procedure.ParameterMapName = _configScope.ApplyNamespace(procedure.ParameterMapName); - //procedure.ResultMapName = ApplyNamespace( procedure.ResultMapName ); + // Get Properties + foreach (XmlNode propertie in xmlNode.SelectNodes(ApplyMappingNamespacePrefix(XML_PROPERTY), configScope.XmlNamespaceManager)) + { + var name = propertie.Attributes["name"].Value; + var value = propertie.Attributes["value"].Value; - if (_configScope.UseStatementNamespaces) procedure.Id = _configScope.ApplyNamespace(procedure.Id); - _configScope.ErrorContext.ObjectId = procedure.Id; - procedure.Initialize(_configScope); + cacheModel.AddProperty(name, value); + } - // Build ISql (analyse sql command text) - ProcessSqlStatement(procedure); + cacheModel.Initialize(); - // Build MappedStatement - var mappedStatement = new MappedStatement(_configScope.SqlMapper, procedure); - IMappedStatement mapStatement = mappedStatement; - if (procedure.CacheModelName != null && procedure.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + configScope.SqlMapper.AddCache(cacheModel); + } + } + #endregion - _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + configScope.ErrorContext.Reset(); } - #endregion - #endregion - #region Load CacheModels - if (_configScope.IsCacheModelsEnabled) - { - CacheModel cacheModel; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_CACHE_MODEL), _configScope.XmlNamespaceManager)) - { - cacheModel = CacheModelDeSerializer.Deserialize(xmlNode, _configScope); - cacheModel.Id = _configScope.ApplyNamespace(cacheModel.Id); - - // Attach ExecuteEventHandler - foreach (XmlNode flushOn in xmlNode.SelectNodes(ApplyMappingNamespacePrefix(XML_FLUSH_ON_EXECUTE), _configScope.XmlNamespaceManager)) - { - var statementName = flushOn.Attributes["statement"].Value; - if (_configScope.UseStatementNamespaces) statementName = _configScope.ApplyNamespace(statementName); - - // delay registering statements to cache model until all sqlMap files have been processed - var statementNames = (IList)_configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id]; - if (statementNames == null) statementNames = new ArrayList(); - statementNames.Add(statementName); - _configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id] = statementNames; - } - // Get Properties - foreach (XmlNode propertie in xmlNode.SelectNodes(ApplyMappingNamespacePrefix(XML_PROPERTY), _configScope.XmlNamespaceManager)) - { - var name = propertie.Attributes["name"].Value; - var value = propertie.Attributes["value"].Value; + /// + /// Process the Sql Statement + /// + /// + private void ProcessSqlStatement(IStatement statement) + { + var isDynamic = false; + var commandTextNode = _configScope.NodeContext; + var dynamic = new DynamicSql(_configScope, statement); + var sqlBuffer = new StringBuilder(); - cacheModel.AddProperty(name, value); - } + if (statement.Id == "DynamicJIRA") Console.Write("tt"); - cacheModel.Initialize(); + _configScope.ErrorContext.MoreInfo = "process the Sql statement"; - _configScope.SqlMapper.AddCache(cacheModel); + // Resolve "extend" attribute on Statement + if (statement.ExtendStatement.Length > 0) + { + // Find 'super' statement + var supperStatementNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_STATEMENT) + "/child::*[@id='" + statement.ExtendStatement + "']", _configScope.XmlNamespaceManager); + if (supperStatementNode != null) + commandTextNode.InnerXml = supperStatementNode.InnerXml + commandTextNode.InnerXml; + else + throw new ConfigurationException("Unable to find extend statement named '" + statement.ExtendStatement + "' on statement '" + statement.Id + "'.'"); } - } - #endregion - - _configScope.ErrorContext.Reset(); - } - - - /// - /// Process the Sql Statement - /// - /// - private void ProcessSqlStatement(IStatement statement) - { - var isDynamic = false; - var commandTextNode = _configScope.NodeContext; - var dynamic = new DynamicSql(_configScope, statement); - var sqlBuffer = new StringBuilder(); - if (statement.Id == "DynamicJIRA") Console.Write("tt"); + _configScope.ErrorContext.MoreInfo = "parse dynamic tags on sql statement"; - _configScope.ErrorContext.MoreInfo = "process the Sql statement"; + isDynamic = ParseDynamicTags(commandTextNode, dynamic, sqlBuffer, isDynamic, false, statement); - // Resolve "extend" attribute on Statement - if (statement.ExtendStatement.Length > 0) - { - // Find 'super' statement - var supperStatementNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_STATEMENT) + "/child::*[@id='" + statement.ExtendStatement + "']", _configScope.XmlNamespaceManager); - if (supperStatementNode != null) - commandTextNode.InnerXml = supperStatementNode.InnerXml + commandTextNode.InnerXml; + if (isDynamic) + { + statement.Sql = dynamic; + } else - throw new ConfigurationException("Unable to find extend statement named '" + statement.ExtendStatement + "' on statement '" + statement.Id + "'.'"); - } - - _configScope.ErrorContext.MoreInfo = "parse dynamic tags on sql statement"; - - isDynamic = ParseDynamicTags(commandTextNode, dynamic, sqlBuffer, isDynamic, false, statement); - - if (isDynamic) - { - statement.Sql = dynamic; - } - else - { - var sqlText = sqlBuffer.ToString(); - ApplyInlineParemeterMap(statement, sqlText); + { + var sqlText = sqlBuffer.ToString(); + ApplyInlineParemeterMap(statement, sqlText); + } } - } - /// - /// Parse dynamic tags - /// - /// - /// - /// - /// - /// - /// - /// - private bool ParseDynamicTags(XmlNode commandTextNode, IDynamicParent dynamic, - StringBuilder sqlBuffer, bool isDynamic, bool postParseRequired, IStatement statement) - { - var children = commandTextNode.ChildNodes; - var count = children.Count; - for (var i = 0; i < count; i++) + /// + /// Parse dynamic tags + /// + /// + /// + /// + /// + /// + /// + /// + private bool ParseDynamicTags(XmlNode commandTextNode, IDynamicParent dynamic, + StringBuilder sqlBuffer, bool isDynamic, bool postParseRequired, IStatement statement) { - var child = children[i]; - if (child.NodeType == XmlNodeType.CDATA || child.NodeType == XmlNodeType.Text) + var children = commandTextNode.ChildNodes; + var count = children.Count; + for (var i = 0; i < count; i++) { - var data = child.InnerText.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' '); //?? + var child = children[i]; + if (child.NodeType == XmlNodeType.CDATA || child.NodeType == XmlNodeType.Text) + { + var data = child.InnerText.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' '); //?? - data = NodeUtils.ParsePropertyTokens(data, _configScope.Properties); + data = NodeUtils.ParsePropertyTokens(data, _configScope.Properties); - SqlText sqlText; - if (postParseRequired) - { - sqlText = new SqlText(); - sqlText.Text = data; + SqlText sqlText; + if (postParseRequired) + { + sqlText = new SqlText(); + sqlText.Text = data; + } + else + { + sqlText = _paramParser.ParseInlineParameterMap(_configScope, null, data); + } + + dynamic.AddChild(sqlText); + sqlBuffer.Append(data); } - else + else if (child.Name == "include") { - sqlText = _paramParser.ParseInlineParameterMap(_configScope, null, data); - } + var prop = NodeUtils.ParseAttributes(child, _configScope.Properties); + var refid = NodeUtils.GetStringAttribute(prop, "refid"); + var includeNode = (XmlNode)_configScope.SqlIncludes[refid]; - dynamic.AddChild(sqlText); - sqlBuffer.Append(data); - } - else if (child.Name == "include") - { - var prop = NodeUtils.ParseAttributes(child, _configScope.Properties); - var refid = NodeUtils.GetStringAttribute(prop, "refid"); - var includeNode = (XmlNode)_configScope.SqlIncludes[refid]; + if (includeNode == null) + { + var nsrefid = _configScope.ApplyNamespace(refid); + includeNode = (XmlNode)_configScope.SqlIncludes[nsrefid]; + if (includeNode == null) throw new ConfigurationException("Could not find SQL tag to include with refid '" + refid + "'"); + } - if (includeNode == null) - { - var nsrefid = _configScope.ApplyNamespace(refid); - includeNode = (XmlNode)_configScope.SqlIncludes[nsrefid]; - if (includeNode == null) throw new ConfigurationException("Could not find SQL tag to include with refid '" + refid + "'"); + isDynamic = ParseDynamicTags(includeNode, dynamic, sqlBuffer, isDynamic, false, statement); } - - isDynamic = ParseDynamicTags(includeNode, dynamic, sqlBuffer, isDynamic, false, statement); - } - else - { - var nodeName = child.Name; - var serializer = _deSerializerFactory.GetDeSerializer(nodeName); - - if (serializer != null) + else { - isDynamic = true; - SqlTag tag; + var nodeName = child.Name; + var serializer = _deSerializerFactory.GetDeSerializer(nodeName); - tag = serializer.Deserialize(child); + if (serializer != null) + { + isDynamic = true; + SqlTag tag; + + tag = serializer.Deserialize(child); - dynamic.AddChild(tag); + dynamic.AddChild(tag); - if (child.HasChildNodes) isDynamic = ParseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement); + if (child.HasChildNodes) isDynamic = ParseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement); + } } } + + return isDynamic; } - return isDynamic; - } + #region Inline Parameter parsing + /// + /// Apply inline paremeterMap + /// + /// + /// + private void ApplyInlineParemeterMap(IStatement statement, string sqlStatement) + { + var newSql = sqlStatement; - #region Inline Parameter parsing - /// - /// Apply inline paremeterMap - /// - /// - /// - private void ApplyInlineParemeterMap(IStatement statement, string sqlStatement) - { - var newSql = sqlStatement; + _configScope.ErrorContext.MoreInfo = "apply inline parameterMap"; - _configScope.ErrorContext.MoreInfo = "apply inline parameterMap"; + // Check the inline parameter + if (statement.ParameterMap == null) + { + // Build a Parametermap with the inline parameters. + // if they exist. Then delete inline infos from sqltext. - // Check the inline parameter - if (statement.ParameterMap == null) - { - // Build a Parametermap with the inline parameters. - // if they exist. Then delete inline infos from sqltext. + var sqlText = _paramParser.ParseInlineParameterMap(_configScope, statement, newSql); - var sqlText = _paramParser.ParseInlineParameterMap(_configScope, statement, newSql); + if (sqlText.Parameters.Length > 0) + { + var map = new ParameterMap(_configScope.DataExchangeFactory); + map.Id = statement.Id + "-InLineParameterMap"; + if (statement.ParameterClass != null) map.Class = statement.ParameterClass; + map.Initialize(_configScope.DataSource.DbProvider.UsePositionalParameters, _configScope); + if (statement.ParameterClass == null && + sqlText.Parameters.Length == 1 && sqlText.Parameters[0].PropertyName == "value") //#value# parameter with no parameterClass attribut + map.DataExchange = _configScope.DataExchangeFactory.GetDataExchangeForClass(typeof(int)); //Get the primitiveDataExchange + statement.ParameterMap = map; + + var lenght = sqlText.Parameters.Length; + for (var index = 0; index < lenght; index++) map.AddParameterProperty(sqlText.Parameters[index]); + } - if (sqlText.Parameters.Length > 0) - { - var map = new ParameterMap(_configScope.DataExchangeFactory); - map.Id = statement.Id + "-InLineParameterMap"; - if (statement.ParameterClass != null) map.Class = statement.ParameterClass; - map.Initialize(_configScope.DataSource.DbProvider.UsePositionalParameters, _configScope); - if (statement.ParameterClass == null && - sqlText.Parameters.Length == 1 && sqlText.Parameters[0].PropertyName == "value") //#value# parameter with no parameterClass attribut - map.DataExchange = _configScope.DataExchangeFactory.GetDataExchangeForClass(typeof(int)); //Get the primitiveDataExchange - statement.ParameterMap = map; - - var lenght = sqlText.Parameters.Length; - for (var index = 0; index < lenght; index++) map.AddParameterProperty(sqlText.Parameters[index]); + newSql = sqlText.Text; } - newSql = sqlText.Text; - } - - ISql sql = null; + ISql sql = null; - newSql = newSql.Trim(); + newSql = newSql.Trim(); - if (SimpleDynamicSql.IsSimpleDynamicSql(newSql)) - { - sql = new SimpleDynamicSql(_configScope, newSql, statement); - } - else - { - if (statement is Procedure) + if (SimpleDynamicSql.IsSimpleDynamicSql(newSql)) { - sql = new ProcedureSql(_configScope, newSql, statement); - // Could not call BuildPreparedStatement for procedure because when NUnit Test - // the database is not here (but in theory procedure must be prepared like statement) - // It's even better as we can then switch DataSource. + sql = new SimpleDynamicSql(_configScope, newSql, statement); } - else if (statement is Statement) + else { - sql = new StaticSql(_configScope, statement); - ISqlMapSession session = new SqlMapSession(_configScope.SqlMapper); + if (statement is Procedure) + { + sql = new ProcedureSql(_configScope, newSql, statement); + // Could not call BuildPreparedStatement for procedure because when NUnit Test + // the database is not here (but in theory procedure must be prepared like statement) + // It's even better as we can then switch DataSource. + } + else if (statement is Statement) + { + sql = new StaticSql(_configScope, statement); + ISqlMapSession session = new SqlMapSession(_configScope.SqlMapper); - ((StaticSql)sql).BuildPreparedStatement(session, newSql); + ((StaticSql)sql).BuildPreparedStatement(session, newSql); + } } - } - - statement.Sql = sql; - } - #endregion + statement.Sql = sql; + } + #endregion - /// - /// Initialize the list of variables defined in the - /// properties file. - /// - private void ParseGlobalProperties() - { - var nodeProperties = _configScope.NodeContext.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_PROPERTIES), _configScope.XmlNamespaceManager); - _configScope.ErrorContext.Activity = "loading global properties"; - if (nodeProperties != null) + /// + /// Initialize the list of variables defined in the + /// properties file. + /// + private void ParseGlobalProperties() { - if (nodeProperties.HasChildNodes) + var nodeProperties = _configScope.NodeContext.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_PROPERTIES), _configScope.XmlNamespaceManager); + _configScope.ErrorContext.Activity = "loading global properties"; + + if (nodeProperties != null) { - foreach (XmlNode propertyNode in nodeProperties.SelectNodes(ApplyDataMapperNamespacePrefix(XML_PROPERTY), _configScope.XmlNamespaceManager)) + if (nodeProperties.HasChildNodes) { - var keyAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB]; - var valueAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB]; - - if (keyAttrib != null && valueAttrib != null) + foreach (XmlNode propertyNode in nodeProperties.SelectNodes(ApplyDataMapperNamespacePrefix(XML_PROPERTY), _configScope.XmlNamespaceManager)) { - _configScope.Properties.Add(keyAttrib.Value, valueAttrib.Value); + var keyAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB]; + var valueAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB]; - if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", keyAttrib.Value, valueAttrib.Value)); - } - else - { - // Load the file defined by the attribute - var propertiesConfig = Resources.GetAsXmlDocument(propertyNode, _configScope.Properties); + if (keyAttrib != null && valueAttrib != null) + { + _configScope.Properties.Add(keyAttrib.Value, valueAttrib.Value); - foreach (XmlNode node in propertiesConfig.SelectNodes(XML_GLOBAL_PROPERTIES, _configScope.XmlNamespaceManager)) + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", keyAttrib.Value, valueAttrib.Value)); + } + else { - _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; + // Load the file defined by the attribute + var propertiesConfig = Resources.GetAsXmlDocument(propertyNode, _configScope.Properties); + + foreach (XmlNode node in propertiesConfig.SelectNodes(XML_GLOBAL_PROPERTIES, _configScope.XmlNamespaceManager)) + { + _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; - if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value, node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value)); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value, node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value)); + } } } } - } - else - { - // JIRA-38 Fix - // element's InnerXml is currently an empty string anyway - // since are in properties file + else + { + // JIRA-38 Fix + // element's InnerXml is currently an empty string anyway + // since are in properties file - _configScope.ErrorContext.Resource = nodeProperties.OuterXml; + _configScope.ErrorContext.Resource = nodeProperties.OuterXml; - // Load the file defined by the attribute - var propertiesConfig = Resources.GetAsXmlDocument(nodeProperties, _configScope.Properties); + // Load the file defined by the attribute + var propertiesConfig = Resources.GetAsXmlDocument(nodeProperties, _configScope.Properties); - foreach (XmlNode node in propertiesConfig.SelectNodes(XML_SETTINGS_ADD)) - { - _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; + foreach (XmlNode node in propertiesConfig.SelectNodes(XML_SETTINGS_ADD)) + { + _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; - if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value, node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value)); + if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value, node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value)); + } } } - } - _configScope.ErrorContext.Reset(); - } + _configScope.ErrorContext.Reset(); + } - /// - /// Generate the command text for CRUD operation - /// - /// - /// - private void GenerateCommandText(ConfigurationScope configScope, IStatement statement) - { - string generatedSQL; + /// + /// Generate the command text for CRUD operation + /// + /// + /// + private void GenerateCommandText(ConfigurationScope configScope, IStatement statement) + { + string generatedSQL; - //------ Build SQL CommandText - generatedSQL = SqlGenerator.BuildQuery(statement); + //------ Build SQL CommandText + generatedSQL = SqlGenerator.BuildQuery(statement); - ISql sql = new StaticSql(configScope, statement); - ISqlMapSession session = new SqlMapSession(configScope.SqlMapper); + ISql sql = new StaticSql(configScope, statement); + ISqlMapSession session = new SqlMapSession(configScope.SqlMapper); - ((StaticSql)sql).BuildPreparedStatement(session, generatedSQL); - statement.Sql = sql; - } + ((StaticSql)sql).BuildPreparedStatement(session, generatedSQL); + statement.Sql = sql; + } - /// - /// Build a ParameterMap - /// - private void BuildParameterMap() - { - ParameterMap parameterMap; - var parameterMapNode = _configScope.NodeContext; + /// + /// Build a ParameterMap + /// + private void BuildParameterMap() + { + ParameterMap parameterMap; + var parameterMapNode = _configScope.NodeContext; - _configScope.ErrorContext.MoreInfo = "build ParameterMap"; + _configScope.ErrorContext.MoreInfo = "build ParameterMap"; - // Get the parameterMap id - var id = _configScope.ApplyNamespace(parameterMapNode.Attributes.GetNamedItem("id").Value); - _configScope.ErrorContext.ObjectId = id; + // Get the parameterMap id + var id = _configScope.ApplyNamespace(parameterMapNode.Attributes.GetNamedItem("id").Value); + _configScope.ErrorContext.ObjectId = id; - // Did we already process it ? - if (_configScope.SqlMapper.ParameterMaps.Contains(id) == false) - { - parameterMap = ParameterMapDeSerializer.Deserialize(parameterMapNode, _configScope); + // Did we already process it ? + if (_configScope.SqlMapper.ParameterMaps.Contains(id) == false) + { + parameterMap = ParameterMapDeSerializer.Deserialize(parameterMapNode, _configScope); - parameterMap.Id = _configScope.ApplyNamespace(parameterMap.Id); - var attributeExtendMap = parameterMap.ExtendMap; - parameterMap.ExtendMap = _configScope.ApplyNamespace(parameterMap.ExtendMap); + parameterMap.Id = _configScope.ApplyNamespace(parameterMap.Id); + var attributeExtendMap = parameterMap.ExtendMap; + parameterMap.ExtendMap = _configScope.ApplyNamespace(parameterMap.ExtendMap); - if (parameterMap.ExtendMap.Length > 0) - { - ParameterMap superMap; - // Did we already build Extend ParameterMap ? - if (_configScope.SqlMapper.ParameterMaps.Contains(parameterMap.ExtendMap) == false) + if (parameterMap.ExtendMap.Length > 0) { - var superNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_PARAMETER) + attributeExtendMap + "']", _configScope.XmlNamespaceManager); - - if (superNode != null) + ParameterMap superMap; + // Did we already build Extend ParameterMap ? + if (_configScope.SqlMapper.ParameterMaps.Contains(parameterMap.ExtendMap) == false) { - _configScope.ErrorContext.MoreInfo = "Build parent ParameterMap"; - _configScope.NodeContext = superNode; - BuildParameterMap(); - superMap = _configScope.SqlMapper.GetParameterMap(parameterMap.ExtendMap); + var superNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_PARAMETER) + attributeExtendMap + "']", _configScope.XmlNamespaceManager); + + if (superNode != null) + { + _configScope.ErrorContext.MoreInfo = "Build parent ParameterMap"; + _configScope.NodeContext = superNode; + BuildParameterMap(); + superMap = _configScope.SqlMapper.GetParameterMap(parameterMap.ExtendMap); + } + else + { + throw new ConfigurationException("In mapping file '" + _configScope.SqlMapNamespace + "' the parameterMap '" + parameterMap.Id + "' can not resolve extends attribute '" + parameterMap.ExtendMap + "'"); + } } else { - throw new ConfigurationException("In mapping file '" + _configScope.SqlMapNamespace + "' the parameterMap '" + parameterMap.Id + "' can not resolve extends attribute '" + parameterMap.ExtendMap + "'"); + superMap = _configScope.SqlMapper.GetParameterMap(parameterMap.ExtendMap); } - } - else - { - superMap = _configScope.SqlMapper.GetParameterMap(parameterMap.ExtendMap); - } - // Add extends property - var index = 0; + // Add extends property + var index = 0; - foreach (var propertyName in superMap.GetPropertyNameArray()) - { - var property = superMap.GetProperty(propertyName).Clone(); - property.Initialize(_configScope, parameterMap.Class); - parameterMap.InsertParameterProperty(index, property); - index++; + foreach (var propertyName in superMap.GetPropertyNameArray()) + { + var property = superMap.GetProperty(propertyName).Clone(); + property.Initialize(_configScope, parameterMap.Class); + parameterMap.InsertParameterProperty(index, property); + index++; + } } - } - _configScope.SqlMapper.AddParameterMap(parameterMap); + _configScope.SqlMapper.AddParameterMap(parameterMap); + } } - } - - - /// - /// Build a ResultMap - /// - private void BuildResultMap() - { - ResultMap resultMap; - var resultMapNode = _configScope.NodeContext; - _configScope.ErrorContext.MoreInfo = "build ResultMap"; - var id = _configScope.ApplyNamespace(resultMapNode.Attributes.GetNamedItem("id").Value); - _configScope.ErrorContext.ObjectId = id; - - // Did we alredy process it - if (_configScope.SqlMapper.ResultMaps.Contains(id) == false) + /// + /// Build a ResultMap + /// + private ResultMap BuildResultMap(XmlNode resultMapNode, ConfigurationScope configScope) { - resultMap = ResultMapDeSerializer.Deserialize(resultMapNode, _configScope); + configScope.NodeContext = resultMapNode; + ResultMap resultMap = null; + configScope.ErrorContext.MoreInfo = "build ResultMap"; - var attributeExtendMap = resultMap.ExtendMap; - resultMap.ExtendMap = _configScope.ApplyNamespace(resultMap.ExtendMap); + var id = configScope.ApplyNamespace(resultMapNode.Attributes.GetNamedItem("id").Value); + configScope.ErrorContext.ObjectId = id; - if (resultMap.ExtendMap != null && resultMap.ExtendMap.Length > 0) + // Did we already process it? + if (configScope.SqlMapper.ResultMaps.Contains(id) == false) { - IResultMap superMap = null; - // Did we already build Extend ResultMap? - if (_configScope.SqlMapper.ResultMaps.Contains(resultMap.ExtendMap) == false) - { - var superNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_RESULTMAP) + attributeExtendMap + "']", _configScope.XmlNamespaceManager); + resultMap = ResultMapDeSerializer.Deserialize(resultMapNode, configScope); - if (superNode != null) + var attributeExtendMap = resultMap.ExtendMap; + resultMap.ExtendMap = configScope.ApplyNamespace(resultMap.ExtendMap); + + if (resultMap.ExtendMap != null && resultMap.ExtendMap.Length > 0) + { + IResultMap superMap = null; + // Did we already build Extend ResultMap? + if (configScope.SqlMapper.ResultMaps.Contains(resultMap.ExtendMap) == false) { - _configScope.ErrorContext.MoreInfo = "Build parent ResultMap"; - _configScope.NodeContext = superNode; - BuildResultMap(); - superMap = _configScope.SqlMapper.GetResultMap(resultMap.ExtendMap); + var superNode = configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_RESULTMAP) + attributeExtendMap + "']", configScope.XmlNamespaceManager); + + if (superNode != null) + { + configScope.ErrorContext.MoreInfo = "Build parent ResultMap"; + BuildResultMap(superNode, configScope); + superMap = configScope.SqlMapper.GetResultMap(resultMap.ExtendMap); + } + else + { + throw new ConfigurationException("In mapping file '" + configScope.SqlMapNamespace + "' the resultMap '" + resultMap.Id + "' can not resolve extends attribute '" + resultMap.ExtendMap + "'"); + } } else { - throw new ConfigurationException("In mapping file '" + _configScope.SqlMapNamespace + "' the resultMap '" + resultMap.Id + "' can not resolve extends attribute '" + resultMap.ExtendMap + "'"); + superMap = configScope.SqlMapper.GetResultMap(resultMap.ExtendMap); } - } - else - { - superMap = _configScope.SqlMapper.GetResultMap(resultMap.ExtendMap); - } - // Add parent property - for (var index = 0; index < superMap.Properties.Count; index++) - { - var property = superMap.Properties[index].Clone(); - property.Initialize(_configScope, resultMap.Class); - resultMap.Properties.Add(property); - } + // Add parent property + for (var index = 0; index < superMap.Properties.Count; index++) + { + var property = superMap.Properties[index].Clone(); + property.Initialize(configScope, resultMap.Class); + resultMap.Properties.Add(property); + } - // Add groupBy properties - if (resultMap.GroupByPropertyNames.Count == 0) - for (var i = 0; i < superMap.GroupByPropertyNames.Count; i++) - resultMap.GroupByPropertyNames.Add(superMap.GroupByPropertyNames[i]); + // Add groupBy properties + if (resultMap.GroupByPropertyNames.Count == 0) + for (var i = 0; i < superMap.GroupByPropertyNames.Count; i++) + resultMap.GroupByPropertyNames.Add(superMap.GroupByPropertyNames[i]); - // Add constructor arguments - if (resultMap.Parameters.Count == 0) - { - for (var i = 0; i < superMap.Parameters.Count; i++) resultMap.Parameters.Add(superMap.Parameters[i]); - if (resultMap.Parameters.Count > 0) resultMap.SetObjectFactory(_configScope); - } + // Add constructor arguments + if (resultMap.Parameters.Count == 0) + { + for (var i = 0; i < superMap.Parameters.Count; i++) resultMap.Parameters.Add(superMap.Parameters[i]); + if (resultMap.Parameters.Count > 0) resultMap.SetObjectFactory(configScope); + } - // Verify that that each groupBy element correspond to a class member - // of one of result property - for (var i = 0; i < resultMap.GroupByPropertyNames.Count; i++) - { - var memberName = resultMap.GroupByPropertyNames[i]; - if (!resultMap.Properties.Contains(memberName)) - throw new ConfigurationException( - string.Format( - "Could not configure ResultMap named \"{0}\". Check the groupBy attribute. Cause: there's no result property named \"{1}\".", - resultMap.Id, memberName)); + // Verify that that each groupBy element correspond to a class member + // of one of result property + for (var i = 0; i < resultMap.GroupByPropertyNames.Count; i++) + { + var memberName = resultMap.GroupByPropertyNames[i]; + if (!resultMap.Properties.Contains(memberName)) + throw new ConfigurationException( + string.Format( + "Could not configure ResultMap named \"{0}\". Check the groupBy attribute. Cause: there's no result property named \"{1}\".", + resultMap.Id, memberName)); + } } + + resultMap.InitializeGroupByProperties(); + configScope.SqlMapper.AddResultMap(resultMap); } - resultMap.InitializeGroupByProperties(); - _configScope.SqlMapper.AddResultMap(resultMap); + return resultMap; } - } - /// - /// Gets a resource stream. - /// - /// The schema resource key. - /// A resource stream. - public Stream GetStream(string schemaResourceKey) - { - return Assembly.GetExecutingAssembly().GetManifestResourceStream("IBatisNet.DataMapper." + schemaResourceKey); - } + /// + /// Gets a resource stream. + /// + /// The schema resource key. + /// A resource stream. + public Stream GetStream(string schemaResourceKey) + { + return Assembly.GetExecutingAssembly().GetManifestResourceStream("IBatisNet.DataMapper." + schemaResourceKey); + } - /// - /// Apply the dataMapper namespace prefix - /// - /// - /// - public string ApplyDataMapperNamespacePrefix(string elementName) - { - return DATAMAPPER_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + DATAMAPPER_NAMESPACE_PREFIX + ":"); - } + /// + /// Apply the dataMapper namespace prefix + /// + /// + /// + public string ApplyDataMapperNamespacePrefix(string elementName) + { + return DATAMAPPER_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + DATAMAPPER_NAMESPACE_PREFIX + ":"); + } - /// - /// Apply the provider namespace prefix - /// - /// - /// - public string ApplyProviderNamespacePrefix(string elementName) - { - return PROVIDERS_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + PROVIDERS_NAMESPACE_PREFIX + ":"); - } + /// + /// Apply the provider namespace prefix + /// + /// + /// + public string ApplyProviderNamespacePrefix(string elementName) + { + return PROVIDERS_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + PROVIDERS_NAMESPACE_PREFIX + ":"); + } - /// - /// Apply the module namespace prefix - /// - /// - /// - public static string ApplyModuleNamespacePrefix(string elementName) - { - return MODULE_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + MODULE_NAMESPACE_PREFIX + ":"); - } + /// + /// Apply the module namespace prefix + /// + /// + /// + public static string ApplyModuleNamespacePrefix(string elementName) + { + return MODULE_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + MODULE_NAMESPACE_PREFIX + ":"); + } - /// - /// Apply the module namespace prefix - /// - /// - /// - public static string ApplyMappingNamespacePrefix(string elementName) - { - return MAPPING_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + MAPPING_NAMESPACE_PREFIX + ":"); + /// + /// Apply the module namespace prefix + /// + /// + /// + public static string ApplyMappingNamespacePrefix(string elementName) + { + return MAPPING_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + MAPPING_NAMESPACE_PREFIX + ":"); + } + #endregion } - #endregion } \ No newline at end of file diff --git a/ORBatis.Core/ISqlMapper.cs b/ORBatis.Core/ISqlMapper.cs index 1e28c32..09dc319 100644 --- a/ORBatis.Core/ISqlMapper.cs +++ b/ORBatis.Core/ISqlMapper.cs @@ -35,478 +35,491 @@ using IBatisNet.DataMapper.Exceptions; using IBatisNet.DataMapper.MappedStatements; using IBatisNet.DataMapper.TypeHandlers; +using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; using System.Data; //using IBatisNet.DataMapper.SessionStore; #endregion -namespace IBatisNet.DataMapper; - -/// -/// Contract for an -/// -public interface ISqlMapper +namespace IBatisNet.DataMapper { /// - /// Name used to identify the the - /// - string Id { get; } - - /// - /// Gets the DB helper parameter cache. - /// - /// The DB helper parameter cache. - DBHelperParameterCache DBHelperParameterCache { get; } - - /// - /// A flag that determines whether cache models were enabled - /// when this SqlMap was built. - /// - bool IsCacheModelsEnabled { get; set; } - - /// - /// Factory for DataExchange objects - /// - DataExchangeFactory DataExchangeFactory { get; } - - /// - /// The TypeHandlerFactory - /// - TypeHandlerFactory TypeHandlerFactory { get; } - - /// - /// The meta factory for object factory - /// - IObjectFactory ObjectFactory { get; } - - /// - /// The factory which build - /// - AccessorFactory AccessorFactory { get; } - - /// - /// The ParameterMap collection - /// - HybridDictionary ParameterMaps { get; } - - /// - /// The ResultMap collection - /// - HybridDictionary ResultMaps { get; } - - /// - /// The MappedStatements collection - /// - HybridDictionary MappedStatements { get; } - - /// - /// Gets or sets the data source. - /// - /// The data source. - IDataSource DataSource { get; set; } - - /// - /// Creates a new SqlMapSession that will be used to query the data source. - /// - /// A new session - ISqlMapSession CreateSqlMapSession(); - - /// - /// Get a ParameterMap by name - /// - /// The name of the ParameterMap - /// The ParameterMap - ParameterMap GetParameterMap(string name); - - /// - /// Adds a (named) ParameterMap. - /// - /// the ParameterMap to add - void AddParameterMap(ParameterMap parameterMap); - - /// - /// Gets a ResultMap by name - /// - /// The name of the result map - /// The ResultMap - IResultMap GetResultMap(string name); - - /// - /// Adds a (named) ResultMap - /// - /// The ResultMap to add - void AddResultMap(IResultMap resultMap); - - /// - /// Gets a cache by name - /// - /// The name of the cache to get - /// The cache object - CacheModel GetCache(string name); - - /// - /// Adds a (named) cache. - /// - /// The cache to add - void AddCache(CacheModel cache); - - /// - /// Adds a (named) MappedStatement. - /// - /// The key name - /// The statement to add - void AddMappedStatement(string key, IMappedStatement mappedStatement); - - /// - /// Executes a Sql DELETE statement. - /// Delete returns the number of rows effected. - /// - /// The name of the statement to execute. - /// The parameter object. - /// The number of rows effected. - int Delete(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Flushes all cached objects that belong to this SqlMap - /// - void FlushCaches(); - - /// - /// Gets the data cache stats. - /// - /// - string GetDataCacheStats(); - - /// - /// Gets a MappedStatement by name - /// - /// The id of the statement - /// The MappedStatement - IMappedStatement GetMappedStatement(string id); - - /// - /// Executes a Sql INSERT statement. - /// Insert is a bit different from other update methods, as it - /// provides facilities for returning the primary key of the - /// newly inserted row (rather than the effected rows). This - /// functionality is of course optional. - ///

    - /// The parameter object is generally used to supply the input - /// data for the INSERT values. - ///

    - /// The name of the statement to execute. - /// The parameter object. - /// - /// The primary key of the newly inserted row. - /// This might be automatically generated by the RDBMS, - /// or selected from a sequence table or other source. - /// - object Insert(string statementName, object parameterObject, ISqlMapSession session); - - ///// - ///// Opens the connection. - ///// - ///// - //ISqlMapSession OpenConnection(); - - ///// - ///// Opens the connection. - ///// - ///// The connection string. - ///// - //ISqlMapSession OpenConnection(string connectionString); - - /// - /// Alias to QueryForMap, .NET spirit. - /// Feature idea by Ted Husted. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); - - /// - /// Alias to QueryForMap, .NET spirit. - /// Feature idea by Ted Husted. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An Ilist object used to hold the objects. - /// A List of result objects. - void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The number of rows to skip over. - /// The maximum number of rows to return. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); - - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the entire result object. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the value of the property specified - /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); - - /// - /// Runs a query with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns a single object of the type of the - /// resultObject parameter. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An object of the type to be returned. - /// The single result object populated with the result set data. - object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns that returns data - /// to populate a single object instance. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The single result object populated with the result set data. - object QueryForObject(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to - /// automatically scroll through results from a database table. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL - /// The maximum number of objects to store in each page - /// A PaginatedList of beans containing the rows - [Obsolete("This method will be remove in future version.", false)] - PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session); - - /// - /// Runs a query for list with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// - /// A List of result objects. - IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); - - ///// - ///// Rolls the back transaction. - ///// - //void RollBackTransaction(); - - ///// - ///// Rolls the back transaction. - ///// - ///// if set to true [close connection]. - //void RollBackTransaction(bool closeConnection); - - /// - /// Executes a Sql UPDATE statement. - /// Update can also be used for any other update statement type, - /// such as inserts and deletes. Update returns the number of - /// rows effected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the UPDATE values as well as the WHERE clause parameter(s). - ///

    - /// The name of the statement to execute. - /// The parameter object. - /// The number of rows effected. - int Update(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the value of the property specified - /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); - - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the entire result object. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary of object containing the rows keyed by keyProperty. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); - - /// - /// Runs a query with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A delegate called once per row in the QueryForDictionary method> - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns a single object of the type of the - /// resultObject parameter. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An object of the type to be returned. - /// The single result object populated with the result set data. - T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns that returns data - /// to populate a single object instance. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The single result object populated with the result set data. - T QueryForObject(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An Ilist object used to hold the objects. - void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The number of rows to skip over. - /// The maximum number of rows to return. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); - - /// - /// Runs a query for list with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// - /// A List of result objects. - IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected. - ///

    - ///

    - /// Name of the statement. - /// The parameter object. - /// - DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session); + /// Contract for an + /// + public interface ISqlMapper + { + /// + /// Name used to identify the the + /// + string Id { get; } + + /// + /// Gets the DB helper parameter cache. + /// + /// The DB helper parameter cache. + DBHelperParameterCache DBHelperParameterCache { get; } + + /// + /// A flag that determines whether cache models were enabled + /// when this SqlMap was built. + /// + bool IsCacheModelsEnabled { get; set; } + + /// + /// Factory for DataExchange objects + /// + DataExchangeFactory DataExchangeFactory { get; } + + /// + /// The TypeHandlerFactory + /// + TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The meta factory for object factory + /// + IObjectFactory ObjectFactory { get; } + + /// + /// The factory which build + /// + AccessorFactory AccessorFactory { get; } + + /// + /// The ParameterMap collection + /// + HybridDictionary ParameterMaps { get; } + + /// + /// The ResultMap collection + /// + HybridDictionary ResultMaps { get; } + + /// + /// The MappedStatements collection + /// + HybridDictionary MappedStatements { get; } + + /// + /// Gets or sets the data source. + /// + /// The data source. + IDataSource DataSource { get; set; } + + /// + /// Creates a new SqlMapSession that will be used to query the data source. + /// + /// A new session + ISqlMapSession CreateSqlMapSession(); + + /// + /// Get a ParameterMap by name + /// + /// The name of the ParameterMap + /// The ParameterMap + ParameterMap GetParameterMap(string name); + + /// + /// Adds a (named) ParameterMap. + /// + /// the ParameterMap to add + void AddParameterMap(ParameterMap parameterMap); + + /// + /// Gets a ResultMap by name + /// + /// The name of the result map + /// The ResultMap + IResultMap GetResultMap(string name); + + /// + /// Adds a (named) ResultMap + /// + /// The ResultMap to add + void AddResultMap(IResultMap resultMap); + + /// + /// Gets a cache by name + /// + /// The name of the cache to get + /// The cache object + CacheModel GetCache(string name); + + /// + /// Adds a (named) cache. + /// + /// The cache to add + void AddCache(CacheModel cache); + + void RegisterEntityToMap(string entityName, Action configure); + + + /// + /// Adds a (named) MappedStatement. + /// + /// The key name + /// The statement to add + void AddMappedStatement(string key, IMappedStatement mappedStatement); + + /// + /// Executes a Sql DELETE statement. + /// Delete returns the number of rows effected. + /// + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + int Delete(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Flushes all cached objects that belong to this SqlMap + /// + void FlushCaches(); + + /// + /// Gets the data cache stats. + /// + /// + string GetDataCacheStats(); + + /// + /// Gets a MappedStatement by name + /// + /// The id of the statement + /// The MappedStatement + IMappedStatement GetMappedStatement(string id); + + /// + /// Trigger the LazyLoad procedure for a given entity. + /// + /// + /// + bool LazyLoadMappedStatement(string id); + + /// + /// Executes a Sql INSERT statement. + /// Insert is a bit different from other update methods, as it + /// provides facilities for returning the primary key of the + /// newly inserted row (rather than the effected rows). This + /// functionality is of course optional. + ///

    + /// The parameter object is generally used to supply the input + /// data for the INSERT values. + ///

    + /// The name of the statement to execute. + /// The parameter object. + /// + /// The primary key of the newly inserted row. + /// This might be automatically generated by the RDBMS, + /// or selected from a sequence table or other source. + /// + object Insert(string statementName, object parameterObject, ISqlMapSession session); + + ///// + ///// Opens the connection. + ///// + ///// + //ISqlMapSession OpenConnection(); + + ///// + ///// Opens the connection. + ///// + ///// The connection string. + ///// + //ISqlMapSession OpenConnection(string connectionString); + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + /// A List of result objects. + void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + object QueryForObject(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to + /// automatically scroll through results from a database table. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL + /// The maximum number of objects to store in each page + /// A PaginatedList of beans containing the rows + [Obsolete("This method will be remove in future version.", false)] + PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session); + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); + + ///// + ///// Rolls the back transaction. + ///// + //void RollBackTransaction(); + + ///// + ///// Rolls the back transaction. + ///// + ///// if set to true [close connection]. + //void RollBackTransaction(bool closeConnection); + + /// + /// Executes a Sql UPDATE statement. + /// Update can also be used for any other update statement type, + /// such as inserts and deletes. Update returns the number of + /// rows effected. + ///

    + /// The parameter object is generally used to supply the input + /// data for the UPDATE values as well as the WHERE clause parameter(s). + ///

    + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + int Update(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); + + + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary of object containing the rows keyed by keyProperty. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); + + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method> + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + T QueryForObject(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); + + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); + + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); + + /// + /// Executes the SQL and retuns all rows selected. + ///

    + ///

    + /// Name of the statement. + /// The parameter object. + /// + DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session); + } } \ No newline at end of file diff --git a/ORBatis.Core/SqlMapper.cs b/ORBatis.Core/SqlMapper.cs index 5f201e2..d31b44a 100644 --- a/ORBatis.Core/SqlMapper.cs +++ b/ORBatis.Core/SqlMapper.cs @@ -35,1081 +35,1152 @@ using IBatisNet.DataMapper.Exceptions; using IBatisNet.DataMapper.MappedStatements; using IBatisNet.DataMapper.TypeHandlers; +using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; using System.Data; using System.Text; +using System.Threading.Tasks; //using IBatisNet.DataMapper.SessionStore; #endregion -namespace IBatisNet.DataMapper; - -/// -/// Summary description for SqlMap. -/// -public class SqlMapper : ISqlMapper +namespace IBatisNet.DataMapper { - #region Constructor (s) / Destructor - /// - /// Initializes a new instance of the class. - /// - /// The object factory. - /// The accessor factory. - public SqlMapper(IObjectFactory objectFactory, - AccessorFactory accessorFactory) - { - TypeHandlerFactory = new TypeHandlerFactory(); - DBHelperParameterCache = new DBHelperParameterCache(); - _objectFactory = objectFactory; - AccessorFactory = accessorFactory; - - DataExchangeFactory = new DataExchangeFactory(TypeHandlerFactory, _objectFactory, accessorFactory); - Id = HashCodeProvider.GetIdentityHashCode(this).ToString(); - //_sessionStore = SessionStoreFactory.GetSessionStore(_id); - } - #endregion - - #region QueryForDataTable /// - /// Executes the SQL and retuns all rows selected. - ///

    + /// Summary description for SqlMap. ///

    - /// Name of the statement. - /// The parameter object. - /// - public DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session) + public class SqlMapper : ISqlMapper { - var statement = GetMappedStatement(statementName); - var dataTable = new DataTable(statementName); - var request = statement.Statement.Sql.GetRequestScope(statement, parameterObject, session); - statement.PreparedCommand.Create(request, session, statement.Statement, parameterObject); - - using (request.IDbCommand) + #region Constructor (s) / Destructor + /// + /// Initializes a new instance of the class. + /// + /// The object factory. + /// The accessor factory. + public SqlMapper(IObjectFactory objectFactory, + AccessorFactory accessorFactory) { - dataTable.Load(request.IDbCommand.ExecuteReader()); + TypeHandlerFactory = new TypeHandlerFactory(); + DBHelperParameterCache = new DBHelperParameterCache(); + _objectFactory = objectFactory; + AccessorFactory = accessorFactory; + + DataExchangeFactory = new DataExchangeFactory(TypeHandlerFactory, _objectFactory, accessorFactory); + Id = HashCodeProvider.GetIdentityHashCode(this).ToString(); + //_sessionStore = SessionStoreFactory.GetSessionStore(_id); } + #endregion + + #region QueryForDataTable + /// + /// Executes the SQL and retuns all rows selected. + ///

    + ///

    + /// Name of the statement. + /// The parameter object. + /// + public DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var dataTable = new DataTable(statementName); + var request = statement.Statement.Sql.GetRequestScope(statement, parameterObject, session); + statement.PreparedCommand.Create(request, session, statement.Statement, parameterObject); + using (request.IDbCommand) + { + dataTable.Load(request.IDbCommand.ExecuteReader()); + } - return dataTable; - } - #endregion - #region QueryForPaginatedList - /// - /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to - /// automatically scroll through results from a database table. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL - /// The maximum number of objects to store in each page - /// A PaginatedList of beans containing the rows - [Obsolete("This method will be remove in future version.", false)] - public PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - return new PaginatedList(statement, parameterObject, pageSize, session); - } - #endregion - - - /// - /// Creates a new SqlMapSession that will be used to query the data source. - /// - /// A new session - public ISqlMapSession CreateSqlMapSession() - { - ISqlMapSession session = new SqlMapSession(this); - session.CreateConnection(); - - return session; - } - - - /// - /// Creates the SQL map session. - /// - /// The connection string. - /// A new session - public ISqlMapSession CreateSqlMapSession(string connectionString) - { - ISqlMapSession session = new SqlMapSession(this); - session.CreateConnection(connectionString); - - return session; - } - - #region Fields - //(MappedStatement Name, MappedStatement) - //(ResultMap name, ResultMap) - //(ParameterMap name, ParameterMap) - // DataSource - //(CacheModel name, cache)) - private readonly HybridDictionary _cacheMaps = new(); - - // An identifiant - - /// - /// Container session unique for each thread. - /// - //private ISessionStore _sessionStore = null; - private readonly IObjectFactory _objectFactory; - #endregion - - #region Properties - /// - /// Name used to identify the the - /// - public string Id { get; } = string.Empty; - - /// - /// Allow to set a custom session store like the - /// - /// Set it after the configuration and before use of the - /// - /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); - /// - //public ISessionStore SessionStore - //{ - // set { _sessionStore = value; } - //} - - /// - /// Returns the DalSession instance - /// currently being used by the SqlMap. - /// - //public ISqlMapSession LocalSession - //{ - // get { return _sessionStore.LocalSession; } - //} - - // /// - // /// Gets a value indicating whether this instance is session started. - // /// - // /// - // /// true if this instance is session started; otherwise, false. - // /// - //public bool IsSessionStarted - //{ - // get { return (_sessionStore.LocalSession != null); } - //} - - /// - /// Gets the DB helper parameter cache. - /// - /// The DB helper parameter cache. - public DBHelperParameterCache DBHelperParameterCache { get; } - - /// - /// Factory for DataExchange objects - /// - public DataExchangeFactory DataExchangeFactory { get; } - - /// - /// The TypeHandlerFactory - /// - public TypeHandlerFactory TypeHandlerFactory { get; } - /// - /// The meta factory for object factory - /// - public IObjectFactory ObjectFactory => _objectFactory; + return dataTable; + } + #endregion + #region QueryForPaginatedList + /// + /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to + /// automatically scroll through results from a database table. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL + /// The maximum number of objects to store in each page + /// A PaginatedList of beans containing the rows + [Obsolete("This method will be remove in future version.", false)] + public PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + return new PaginatedList(statement, parameterObject, pageSize, session); + } + #endregion - /// - /// The factory which build - /// - public AccessorFactory AccessorFactory { get; } - /// - /// A flag that determines whether cache models were enabled - /// when this SqlMap was built. - /// - public bool IsCacheModelsEnabled { set; get; } - #endregion - - #region Methods - #region Manage Connection, Transaction - ///// - ///// Open a connection - ///// - ///// - //public ISqlMapSession OpenConnection() - //{ - // if (_sessionStore.LocalSession != null) - // { - // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); - // } - // ISqlMapSession session = CreateSqlMapSession(); - // _sessionStore.Store(session); - // return session; - //} - - ///// - ///// Open a connection, on the specified connection string. - ///// - ///// The connection string - //public ISqlMapSession OpenConnection(string connectionString) - //{ - // if (_sessionStore.LocalSession != null) - // { - // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); - // } - // ISqlMapSession session = CreateSqlMapSession(connectionString); - // _sessionStore.Store(session); - // return session; - //} - - ///// - ///// Open a connection - ///// - //public void CloseConnection() - //{ - // if (_sessionStore.LocalSession == null) - // { - // throw new DataMapperException("SqlMap could not invoke CloseConnection(). No connection was started. Call OpenConnection() first."); - // } - // try - // { - // ISqlMapSession session = _sessionStore.LocalSession; - // session.CloseConnection(); - // } - // catch(Exception ex) - // { - // throw new DataMapperException("SqlMapper could not CloseConnection(). Cause :"+ex.Message, ex); - // } - // finally - // { - // _sessionStore.Dispose(); - // } - //} - - - ///// - ///// Begins a database transaction. - ///// - //public ISqlMapSession BeginTransaction() - //{ - // if (_sessionStore.LocalSession != null) - // { - // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); - // } - // ISqlMapSession session = CreateSqlMapSession(); - // _sessionStore.Store(session); - // session.BeginTransaction(); - // return session ; - //} - - ///// - ///// Open a connection and begin a transaction on the specified connection string. - ///// - ///// The connection string - //public ISqlMapSession BeginTransaction(string connectionString) - //{ - // if (_sessionStore.LocalSession != null) - // { - // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); - // } - // ISqlMapSession session = CreateSqlMapSession(connectionString); - // _sessionStore.Store(session); - // session.BeginTransaction( connectionString ); - // return session ; - //} - - ///// - ///// Begins a database transaction on the currect session - ///// - ///// Open a connection. - //public ISqlMapSession BeginTransaction(bool openConnection) - //{ - // ISqlMapSession session = null; - - // if (openConnection) - // { - // session = this.BeginTransaction(); - // } - // else - // { - // session = _sessionStore.LocalSession; - // if (session == null) - // { - // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); - // } - // session.BeginTransaction(openConnection); - // } - - // return session; - //} - - ///// - ///// Begins a database transaction with the specified isolation level. - ///// - ///// - ///// The isolation level under which the transaction should run. - ///// - //public ISqlMapSession BeginTransaction(IsolationLevel isolationLevel) - //{ - // if (_sessionStore.LocalSession != null) - // { - // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); - // } - // ISqlMapSession session = CreateSqlMapSession(); - // _sessionStore.Store(session); - // session.BeginTransaction(isolationLevel); - // return session; - //} - - ///// - ///// Open a connection and begin a transaction on the specified connection string. - ///// - ///// The connection string - ///// The transaction isolation level for this connection. - //public ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel) - //{ - // if (_sessionStore.LocalSession != null) - // { - // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); - // } - // ISqlMapSession session = CreateSqlMapSession(connectionString); - // _sessionStore.Store(session); - // session.BeginTransaction( connectionString, isolationLevel); - // return session; - //} - - ///// - ///// Start a database transaction on the current session - ///// with the specified isolation level. - ///// - ///// Open a connection. - ///// - ///// The isolation level under which the transaction should run. - ///// - //public ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel) - //{ - // ISqlMapSession session = null; - - // if (openNewConnection) - // { - // session = this.BeginTransaction(isolationLevel); - // } - // else - // { - // session = _sessionStore.LocalSession; - // if (session == null) - // { - // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); - // } - // session.BeginTransaction(openNewConnection, isolationLevel); - // } - // return session; - //} - - ///// - ///// Begins a transaction on the current connection - ///// with the specified IsolationLevel value. - ///// - ///// The transaction isolation level for this connection. - ///// The connection string - ///// Open a connection. - //public ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel) - //{ - // ISqlMapSession session = null; - - // if (openNewConnection) - // { - // session = this.BeginTransaction(connectionString, isolationLevel); - // } - // else - // { - // session = _sessionStore.LocalSession; - // if (session == null) - // { - // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); - // } - // session.BeginTransaction(connectionString, openNewConnection, isolationLevel); - // } - // return session; - //} - - ///// - ///// Commits the database transaction. - ///// - ///// - ///// Will close the connection. - ///// - //public void CommitTransaction() - //{ - // if (_sessionStore.LocalSession == null) - // { - // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); - // } - // try - // { - // ISqlMapSession session = _sessionStore.LocalSession; - // session.CommitTransaction(); - // } - // finally - // { - // _sessionStore.Dispose(); - // } - //} - - ///// - ///// Commits the database transaction. - ///// - ///// Close the connection - //public void CommitTransaction(bool closeConnection) - //{ - // if (_sessionStore.LocalSession == null) - // { - // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); - // } - // try - // { - // ISqlMapSession session = _sessionStore.LocalSession; - // session.CommitTransaction(closeConnection); - // } - // finally - // { - // if (closeConnection) - // { - // _sessionStore.Dispose(); - // } - // } - //} - - ///// - ///// Rolls back a transaction from a pending state. - ///// - ///// - ///// Will close the connection. - ///// - //public void RollBackTransaction() - //{ - // if (_sessionStore.LocalSession == null) - // { - // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); - // } - // try - // { - // ISqlMapSession session = _sessionStore.LocalSession; - // session.RollBackTransaction(); - // } - // finally - // { - // _sessionStore.Dispose(); - // } - //} - - ///// - ///// Rolls back a transaction from a pending state. - ///// - ///// Close the connection - //public void RollBackTransaction(bool closeConnection) - //{ - // if (_sessionStore.LocalSession == null) - // { - // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); - // } - // try - // { - // ISqlMapSession session = _sessionStore.LocalSession; - // session.RollBackTransaction(closeConnection); - // } - // finally - // { - // if (closeConnection) - // { - // _sessionStore.Dispose(); - // } - // } - //} - #endregion - - #region QueryForObject - /// - /// Executes a Sql SELECT statement that returns that returns data - /// to populate a single object instance. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The single result object populated with the result set data. - public object QueryForObject(string statementName, object parameterObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var result = statement.ExecuteQueryForObject(session, parameterObject); - return result; - } + /// + /// Creates a new SqlMapSession that will be used to query the data source. + /// + /// A new session + public ISqlMapSession CreateSqlMapSession() + { + ISqlMapSession session = new SqlMapSession(this); + session.CreateConnection(); - /// - /// Executes a Sql SELECT statement that returns a single object of the type of the - /// resultObject parameter. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An object of the type to be returned. - /// The single result object populated with the result set data. - public object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var result = statement.ExecuteQueryForObject(session, parameterObject, resultObject); + return session; + } - return result; - } - #endregion - #endregion - #region QueryForObject .NET 2.0 - /// - /// Executes a Sql SELECT statement that returns that returns data - /// to populate a single object instance. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The single result object populated with the result set data. - public T QueryForObject(string statementName, object parameterObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var result = statement.ExecuteQueryForObject(session, parameterObject); - return result; - } + /// + /// Creates the SQL map session. + /// + /// The connection string. + /// A new session + public ISqlMapSession CreateSqlMapSession(string connectionString) + { + ISqlMapSession session = new SqlMapSession(this); + session.CreateConnection(connectionString); - /// - /// Executes a Sql SELECT statement that returns a single object of the type of the - /// resultObject parameter. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An object of the type to be returned. - /// The single result object populated with the result set data. - public T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var result = statement.ExecuteQueryForObject(session, parameterObject, instanceObject); + return session; + } - return result; - } - #endregion + #region Fields + //(MappedStatement Name, MappedStatement) + //(ResultMap name, ResultMap) + //(ParameterMap name, ParameterMap) + // DataSource + //(CacheModel name, cache)) + private readonly HybridDictionary _cacheMaps = new HybridDictionary(); + + // An identifiant + + /// + /// Container session unique for each thread. + /// + //private ISessionStore _sessionStore = null; + private readonly IObjectFactory _objectFactory; + #endregion + + #region Properties + /// + /// Name used to identify the the + /// + public string Id { get; } = string.Empty; + + /// + /// Allow to set a custom session store like the + /// + /// Set it after the configuration and before use of the + /// + /// sqlMapper.SessionStore = new HybridWebThreadSessionStore( sqlMapper.Id ); + /// + //public ISessionStore SessionStore + //{ + // set { _sessionStore = value; } + //} + + /// + /// Returns the DalSession instance + /// currently being used by the SqlMap. + /// + //public ISqlMapSession LocalSession + //{ + // get { return _sessionStore.LocalSession; } + //} + + // /// + // /// Gets a value indicating whether this instance is session started. + // /// + // /// + // /// true if this instance is session started; otherwise, false. + // /// + //public bool IsSessionStarted + //{ + // get { return (_sessionStore.LocalSession != null); } + //} + + /// + /// Gets the DB helper parameter cache. + /// + /// The DB helper parameter cache. + public DBHelperParameterCache DBHelperParameterCache { get; } + + /// + /// Factory for DataExchange objects + /// + public DataExchangeFactory DataExchangeFactory { get; } + + /// + /// The TypeHandlerFactory + /// + public TypeHandlerFactory TypeHandlerFactory { get; } + + /// + /// The meta factory for object factory + /// + public IObjectFactory ObjectFactory => _objectFactory; + + /// + /// The factory which build + /// + public AccessorFactory AccessorFactory { get; } + + /// + /// A flag that determines whether cache models were enabled + /// when this SqlMap was built. + /// + public bool IsCacheModelsEnabled { set; get; } + #endregion + + #region Methods + #region Manage Connection, Transaction + ///// + ///// Open a connection + ///// + ///// + //public ISqlMapSession OpenConnection() + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // return session; + //} + + ///// + ///// Open a connection, on the specified connection string. + ///// + ///// The connection string + //public ISqlMapSession OpenConnection(string connectionString) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke OpenConnection(). A connection is already started. Call CloseConnection first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // return session; + //} + + ///// + ///// Open a connection + ///// + //public void CloseConnection() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CloseConnection(). No connection was started. Call OpenConnection() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CloseConnection(); + // } + // catch(Exception ex) + // { + // throw new DataMapperException("SqlMapper could not CloseConnection(). Cause :"+ex.Message, ex); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + + ///// + ///// Begins a database transaction. + ///// + //public ISqlMapSession BeginTransaction() + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // session.BeginTransaction(); + // return session ; + //} + + ///// + ///// Open a connection and begin a transaction on the specified connection string. + ///// + ///// The connection string + //public ISqlMapSession BeginTransaction(string connectionString) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // session.BeginTransaction( connectionString ); + // return session ; + //} + + ///// + ///// Begins a database transaction on the currect session + ///// + ///// Open a connection. + //public ISqlMapSession BeginTransaction(bool openConnection) + //{ + // ISqlMapSession session = null; + + // if (openConnection) + // { + // session = this.BeginTransaction(); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(openConnection); + // } + + // return session; + //} + + ///// + ///// Begins a database transaction with the specified isolation level. + ///// + ///// + ///// The isolation level under which the transaction should run. + ///// + //public ISqlMapSession BeginTransaction(IsolationLevel isolationLevel) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(); + // _sessionStore.Store(session); + // session.BeginTransaction(isolationLevel); + // return session; + //} + + ///// + ///// Open a connection and begin a transaction on the specified connection string. + ///// + ///// The connection string + ///// The transaction isolation level for this connection. + //public ISqlMapSession BeginTransaction(string connectionString, IsolationLevel isolationLevel) + //{ + // if (_sessionStore.LocalSession != null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A Transaction is already started. Call CommitTransaction() or RollbackTransaction first."); + // } + // ISqlMapSession session = CreateSqlMapSession(connectionString); + // _sessionStore.Store(session); + // session.BeginTransaction( connectionString, isolationLevel); + // return session; + //} + + ///// + ///// Start a database transaction on the current session + ///// with the specified isolation level. + ///// + ///// Open a connection. + ///// + ///// The isolation level under which the transaction should run. + ///// + //public ISqlMapSession BeginTransaction(bool openNewConnection, IsolationLevel isolationLevel) + //{ + // ISqlMapSession session = null; + + // if (openNewConnection) + // { + // session = this.BeginTransaction(isolationLevel); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(openNewConnection, isolationLevel); + // } + // return session; + //} + + ///// + ///// Begins a transaction on the current connection + ///// with the specified IsolationLevel value. + ///// + ///// The transaction isolation level for this connection. + ///// The connection string + ///// Open a connection. + //public ISqlMapSession BeginTransaction(string connectionString, bool openNewConnection, IsolationLevel isolationLevel) + //{ + // ISqlMapSession session = null; + + // if (openNewConnection) + // { + // session = this.BeginTransaction(connectionString, isolationLevel); + // } + // else + // { + // session = _sessionStore.LocalSession; + // if (session == null) + // { + // throw new DataMapperException("SqlMap could not invoke BeginTransaction(). A session must be Open. Call OpenConnection() first."); + // } + // session.BeginTransaction(connectionString, openNewConnection, isolationLevel); + // } + // return session; + //} + + ///// + ///// Commits the database transaction. + ///// + ///// + ///// Will close the connection. + ///// + //public void CommitTransaction() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CommitTransaction(); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + ///// + ///// Commits the database transaction. + ///// + ///// Close the connection + //public void CommitTransaction(bool closeConnection) + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke CommitTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.CommitTransaction(closeConnection); + // } + // finally + // { + // if (closeConnection) + // { + // _sessionStore.Dispose(); + // } + // } + //} + + ///// + ///// Rolls back a transaction from a pending state. + ///// + ///// + ///// Will close the connection. + ///// + //public void RollBackTransaction() + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.RollBackTransaction(); + // } + // finally + // { + // _sessionStore.Dispose(); + // } + //} + + ///// + ///// Rolls back a transaction from a pending state. + ///// + ///// Close the connection + //public void RollBackTransaction(bool closeConnection) + //{ + // if (_sessionStore.LocalSession == null) + // { + // throw new DataMapperException("SqlMap could not invoke RollBackTransaction(). No Transaction was started. Call BeginTransaction() first."); + // } + // try + // { + // ISqlMapSession session = _sessionStore.LocalSession; + // session.RollBackTransaction(closeConnection); + // } + // finally + // { + // if (closeConnection) + // { + // _sessionStore.Dispose(); + // } + // } + //} + #endregion + + #region QueryForObject + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + public object QueryForObject(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject); + return result; + } - #region QueryForMap, QueryForDictionary - /// - /// Alias to QueryForMap, .NET spirit. - /// Feature idea by Ted Husted. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) - { - return QueryForMap(statementName, parameterObject, keyProperty, session); - } + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + public object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject, resultObject); - /// - /// Alias to QueryForMap, .NET spirit. - /// Feature idea by Ted Husted. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) - { - return QueryForMap(statementName, parameterObject, keyProperty, valueProperty, session); - } + return result; + } + #endregion + #endregion + #region QueryForObject .NET 2.0 + /// + /// Executes a Sql SELECT statement that returns that returns data + /// to populate a single object instance. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The single result object populated with the result set data. + public T QueryForObject(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject); - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the entire result object. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) - { - return QueryForMap(statementName, parameterObject, keyProperty, null, session); - } + return result; + } - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the value of the property specified - /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var map = statement.ExecuteQueryForMap(session, parameterObject, keyProperty, valueProperty); + /// + /// Executes a Sql SELECT statement that returns a single object of the type of the + /// resultObject parameter. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An object of the type to be returned. + /// The single result object populated with the result set data. + public T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var result = statement.ExecuteQueryForObject(session, parameterObject, instanceObject); - return map; - } - #endregion + return result; + } + #endregion + + #region QueryForMap, QueryForDictionary + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, session); + } - #region QueryForList - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// A List of result objects. - public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var list = statement.ExecuteQueryForList(session, parameterObject); + /// + /// Alias to QueryForMap, .NET spirit. + /// Feature idea by Ted Husted. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, valueProperty, session); + } - return list; - } + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForMap(statementName, parameterObject, keyProperty, null, session); + } - /// - /// Executes the SQL and retuns all rows selected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The number of rows to skip over. - /// The maximum number of rows to return. - /// A List of result objects. - public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForMap(session, parameterObject, keyProperty, valueProperty); - return list; - } + return map; + } + #endregion + + #region QueryForList + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject); + return list; + } - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An Ilist object used to hold the objects. - /// A List of result objects. - public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - statement.ExecuteQueryForList(session, parameterObject, resultObject); - } - #endregion + /// + /// Executes the SQL and retuns all rows selected. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); - #region QueryForList .NET 2.0 - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the value of the property specified - /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty); + return list; + } - return map; - } + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + /// A List of result objects. + public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + statement.ExecuteQueryForList(session, parameterObject, resultObject); + } + #endregion + + #region QueryForList .NET 2.0 + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the value of the property specified + /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A IDictionary of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty); - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the entire result object. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary of object containing the rows keyed by keyProperty. - public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) - { - return QueryForDictionary(statementName, parameterObject, keyProperty, null); - } - /// - /// Runs a query with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A delegate called once per row in the QueryForDictionary method> - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty, rowDelegate); + return map; + } + /// + /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named + /// in the keyProperty parameter. The value at each key will be the entire result object. + /// + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// A IDictionary of object containing the rows keyed by keyProperty. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session) + { + return QueryForDictionary(statementName, parameterObject, keyProperty, null); + } - return map; - } + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// A delegate called once per row in the QueryForDictionary method> + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForDictionary(session, parameterObject, keyProperty, valueProperty, rowDelegate); - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// A List of result objects. - public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var list = statement.ExecuteQueryForList(session, parameterObject); + return map; + } - return list; - } - /// - /// Executes the SQL and retuns all rows selected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The number of rows to skip over. - /// The maximum number of rows to return. - /// A List of result objects. - public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject); - return list; - } + return list; + } + /// + /// Executes the SQL and retuns all rows selected. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The number of rows to skip over. + /// The maximum number of rows to return. + /// A List of result objects. + public IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForList(session, parameterObject, skipResults, maxResults); - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An Ilist object used to hold the objects. - public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - statement.ExecuteQueryForList(session, parameterObject, resultObject); - } - #endregion + return list; + } - #region QueryWithRowDelegate - /// - /// Runs a query for list with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// - /// A List of result objects. - public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); - return list; - } + /// + /// Executes a Sql SELECT statement that returns data to populate + /// a number of result objects. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// An Ilist object used to hold the objects. + public void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + statement.ExecuteQueryForList(session, parameterObject, resultObject); + } + #endregion + + #region QueryWithRowDelegate + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); - /// - /// Runs a query for list with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// - /// A List of result objects. - public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); + return list; + } - return list; - } + /// + /// Runs a query for list with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// + /// A List of result objects. + public IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var list = statement.ExecuteQueryForRowDelegate(session, parameterObject, rowDelegate); - /// - /// Runs a query with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - public IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var map = statement.ExecuteQueryForMapWithRowDelegate(session, parameterObject, keyProperty, valueProperty, rowDelegate); + return list; + } - return map; - } - #endregion + /// + /// Runs a query with a custom object that gets a chance to deal + /// with each row as it is processed. + ///

    + /// The parameter object is generally used to supply the input + /// data for the WHERE clause parameter(s) of the SELECT statement. + ///

    + /// The name of the sql statement to execute. + /// The object used to set the parameters in the SQL. + /// The property of the result object to be used as the key. + /// The property of the result object to be used as the value (or null) + /// + /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. + /// If a transaction is not in progress, or the database throws an exception. + public IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var map = statement.ExecuteQueryForMapWithRowDelegate(session, parameterObject, keyProperty, valueProperty, rowDelegate); - #region Query Insert, Update, Delete - /// - /// Executes a Sql INSERT statement. - /// Insert is a bit different from other update methods, as it - /// provides facilities for returning the primary key of the - /// newly inserted row (rather than the effected rows). This - /// functionality is of course optional. - ///

    - /// The parameter object is generally used to supply the input - /// data for the INSERT values. - ///

    - /// The name of the statement to execute. - /// The parameter object. - /// - /// The primary key of the newly inserted row. - /// This might be automatically generated by the RDBMS, - /// or selected from a sequence table or other source. - /// - public object Insert(string statementName, object parameterObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var generatedKey = statement.ExecuteInsert(session, parameterObject); + return map; + } + #endregion + + #region Query Insert, Update, Delete + /// + /// Executes a Sql INSERT statement. + /// Insert is a bit different from other update methods, as it + /// provides facilities for returning the primary key of the + /// newly inserted row (rather than the effected rows). This + /// functionality is of course optional. + ///

    + /// The parameter object is generally used to supply the input + /// data for the INSERT values. + ///

    + /// The name of the statement to execute. + /// The parameter object. + /// + /// The primary key of the newly inserted row. + /// This might be automatically generated by the RDBMS, + /// or selected from a sequence table or other source. + /// + public object Insert(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var generatedKey = statement.ExecuteInsert(session, parameterObject); - return generatedKey; - } + return generatedKey; + } - /// - /// Executes a Sql UPDATE statement. - /// Update can also be used for any other update statement type, - /// such as inserts and deletes. Update returns the number of - /// rows effected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the UPDATE values as well as the WHERE clause parameter(s). - ///

    - /// The name of the statement to execute. - /// The parameter object. - /// The number of rows effected. - public int Update(string statementName, object parameterObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var rows = statement.ExecuteUpdate(session, parameterObject); + /// + /// Executes a Sql UPDATE statement. + /// Update can also be used for any other update statement type, + /// such as inserts and deletes. Update returns the number of + /// rows effected. + ///

    + /// The parameter object is generally used to supply the input + /// data for the UPDATE values as well as the WHERE clause parameter(s). + ///

    + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + public int Update(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var rows = statement.ExecuteUpdate(session, parameterObject); - return rows; - } + return rows; + } - /// - /// Executes a Sql DELETE statement. - /// Delete returns the number of rows effected. - /// - /// The name of the statement to execute. - /// The parameter object. - /// The number of rows effected. - public int Delete(string statementName, object parameterObject, ISqlMapSession session) - { - var statement = GetMappedStatement(statementName); - var rows = statement.ExecuteUpdate(session, parameterObject); + /// + /// Executes a Sql DELETE statement. + /// Delete returns the number of rows effected. + /// + /// The name of the statement to execute. + /// The parameter object. + /// The number of rows effected. + public int Delete(string statementName, object parameterObject, ISqlMapSession session) + { + var statement = GetMappedStatement(statementName); + var rows = statement.ExecuteUpdate(session, parameterObject); - return rows; - } - #endregion + return rows; + } + #endregion + + #region Get/Add ParemeterMap, ResultMap, MappedStatement, TypeAlias, DataSource, CacheModel + private Dictionary EntityToMap = new Dictionary(); + public void RegisterEntityToMap(string entityName, Action configure) => EntityToMap[entityName] = configure; + private Dictionary SqlMapFileProcessed = new Dictionary(); + + /// + /// Gets a MappedStatement by name + /// + /// The id of the statement + /// The MappedStatement + public IMappedStatement GetMappedStatement(string id) + { + // In the original iBatis, a missing ID would cause the application to throw immediately. + // Now we lazy load the configuration maps, and so we need to double check that the map has actually been loaded. + if (MappedStatements.Contains(id) == false) + { + var didLazyLoad = LazyLoadMappedStatement(id); + if (!didLazyLoad) + throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); + } - #region Get/Add ParemeterMap, ResultMap, MappedStatement, TypeAlias, DataSource, CacheModel - /// - /// Gets a MappedStatement by name - /// - /// The id of the statement - /// The MappedStatement - public IMappedStatement GetMappedStatement(string id) - { - if (MappedStatements.Contains(id) == false) throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); - return (IMappedStatement)MappedStatements[id]; - } + return (IMappedStatement)MappedStatements[id]; + } - /// - /// Adds a (named) MappedStatement. - /// - /// The key name - /// The statement to add - public void AddMappedStatement(string key, IMappedStatement mappedStatement) - { - if (MappedStatements.Contains(key)) throw new DataMapperException("This SQL map already contains a MappedStatement named " + mappedStatement.Id); - MappedStatements.Add(key, mappedStatement); - } + public bool LazyLoadMappedStatement(string id) + { + var parts = id.Split('.'); + if (parts.Length < 2) + return false; - /// - /// The MappedStatements collection - /// - public HybridDictionary MappedStatements { get; } = new(); + // Root will be the name of the .sql file. i.e. Holiday -> Holiday.xml + var root = parts[0]; + if (!EntityToMap.TryGetValue(root, out var configurationAction)) + return false; - /// - /// Get a ParameterMap by name - /// - /// The name of the ParameterMap - /// The ParameterMap - public ParameterMap GetParameterMap(string name) - { - if (!ParameterMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an ParameterMap named " + name + ". "); - return (ParameterMap)ParameterMaps[name]; - } + if (!SqlMapFileProcessed.TryGetValue(root, out var task)) + { + // Looks like this thread might need to perform the lazy load. + // Lock the dictionary to prevent duplicate loads + var didWriteTask = false; + var taskCompletionSource = new TaskCompletionSource(); + lock (SqlMapFileProcessed) + { + if (!SqlMapFileProcessed.TryGetValue(root, out task)) + { + SqlMapFileProcessed.Add(root, taskCompletionSource.Task); + didWriteTask = true; + } + } - /// - /// Adds a (named) ParameterMap. - /// - /// the ParameterMap to add - public void AddParameterMap(ParameterMap parameterMap) - { - if (ParameterMaps.Contains(parameterMap.Id)) throw new DataMapperException("This SQL map already contains an ParameterMap named " + parameterMap.Id); - ParameterMaps.Add(parameterMap.Id, parameterMap); - } + if (!didWriteTask) + task.Wait(); // Someone else beat us to it + else + { + // Call the configuration method + + try + { + configurationAction(); + taskCompletionSource.SetResult(null); + } + catch + { + // This is bad! Really the app should die, but at least setting result will let other threads complete. + taskCompletionSource.SetResult(null); + throw; + } + } + } + else + { + // Another caller is already processing the map. + // Wait until the task finishes + task.Wait(); + } - /// - /// Gets a ResultMap by name - /// - /// The name of the result map - /// The ResultMap - public IResultMap GetResultMap(string name) - { - if (ResultMaps.Contains(name) == false) throw new DataMapperException("This SQL map does not contain an ResultMap named " + name); - return (ResultMap)ResultMaps[name]; - } + return true; + } - /// - /// Adds a (named) ResultMap - /// - /// The ResultMap to add - public void AddResultMap(IResultMap resultMap) - { - if (ResultMaps.Contains(resultMap.Id)) throw new DataMapperException("This SQL map already contains an ResultMap named " + resultMap.Id); - ResultMaps.Add(resultMap.Id, resultMap); - } + /// + /// Adds a (named) MappedStatement. + /// + /// The key name + /// The statement to add + public void AddMappedStatement(string key, IMappedStatement mappedStatement) + { + if (MappedStatements.Contains(key)) throw new DataMapperException("This SQL map already contains a MappedStatement named " + mappedStatement.Id); + MappedStatements.Add(key, mappedStatement); + } - /// - /// The ParameterMap collection - /// - public HybridDictionary ParameterMaps { get; } = new(); + /// + /// The MappedStatements collection + /// + public HybridDictionary MappedStatements { get; } = new HybridDictionary(); + + /// + /// Get a ParameterMap by name + /// + /// The name of the ParameterMap + /// The ParameterMap + public ParameterMap GetParameterMap(string name) + { + if (!ParameterMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an ParameterMap named " + name + ". "); + return (ParameterMap)ParameterMaps[name]; + } - /// - /// The ResultMap collection - /// - public HybridDictionary ResultMaps { get; } = new(); + /// + /// Adds a (named) ParameterMap. + /// + /// the ParameterMap to add + public void AddParameterMap(ParameterMap parameterMap) + { + if (ParameterMaps.Contains(parameterMap.Id)) throw new DataMapperException("This SQL map already contains an ParameterMap named " + parameterMap.Id); + ParameterMaps.Add(parameterMap.Id, parameterMap); + } - /// - /// The DataSource - /// - public IDataSource DataSource { get; set; } + /// + /// Gets a ResultMap by name + /// + /// The name of the result map + /// The ResultMap + public IResultMap GetResultMap(string name) + { + if (ResultMaps.Contains(name) == false) throw new DataMapperException("This SQL map does not contain an ResultMap named " + name); + return (ResultMap)ResultMaps[name]; + } - /// - /// Flushes all cached objects that belong to this SqlMap - /// - public void FlushCaches() - { - var enumerator = _cacheMaps.GetEnumerator(); - while (enumerator.MoveNext()) ((CacheModel)enumerator.Value).Flush(); - } + /// + /// Adds a (named) ResultMap + /// + /// The ResultMap to add + public void AddResultMap(IResultMap resultMap) + { + if (ResultMaps.Contains(resultMap.Id)) throw new DataMapperException("This SQL map already contains an ResultMap named " + resultMap.Id); + ResultMaps.Add(resultMap.Id, resultMap); + } - /// - /// Adds a (named) cache. - /// - /// The cache to add - public void AddCache(CacheModel cache) - { - if (_cacheMaps.Contains(cache.Id)) throw new DataMapperException("This SQL map already contains an Cache named " + cache.Id); - _cacheMaps.Add(cache.Id, cache); - } + /// + /// The ParameterMap collection + /// + public HybridDictionary ParameterMaps { get; } = new HybridDictionary(); + + /// + /// The ResultMap collection + /// + public HybridDictionary ResultMaps { get; } = new HybridDictionary(); + + /// + /// The DataSource + /// + public IDataSource DataSource { get; set; } + + /// + /// Flushes all cached objects that belong to this SqlMap + /// + public void FlushCaches() + { + var enumerator = _cacheMaps.GetEnumerator(); + while (enumerator.MoveNext()) ((CacheModel)enumerator.Value).Flush(); + } - /// - /// Gets a cache by name - /// - /// The name of the cache to get - /// The cache object - public CacheModel GetCache(string name) - { - if (!_cacheMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an Cache named " + name); - return (CacheModel)_cacheMaps[name]; - } + /// + /// Adds a (named) cache. + /// + /// The cache to add + public void AddCache(CacheModel cache) + { + if (_cacheMaps.Contains(cache.Id)) throw new DataMapperException("This SQL map already contains an Cache named " + cache.Id); + _cacheMaps.Add(cache.Id, cache); + } - /// - /// - /// - public string GetDataCacheStats() - { - var buffer = new StringBuilder(); - buffer.Append(Environment.NewLine); - buffer.Append("Cache Data Statistics"); - buffer.Append(Environment.NewLine); - buffer.Append("====================="); - buffer.Append(Environment.NewLine); - - var enumerator = MappedStatements.GetEnumerator(); - while (enumerator.MoveNext()) + /// + /// Gets a cache by name + /// + /// The name of the cache to get + /// The cache object + public CacheModel GetCache(string name) { - var mappedStatement = (IMappedStatement)enumerator.Value; + if (!_cacheMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an Cache named " + name); + return (CacheModel)_cacheMaps[name]; + } - buffer.Append(mappedStatement.Id); - buffer.Append(": "); + /// + /// + /// + public string GetDataCacheStats() + { + var buffer = new StringBuilder(); + buffer.Append(Environment.NewLine); + buffer.Append("Cache Data Statistics"); + buffer.Append(Environment.NewLine); + buffer.Append("====================="); + buffer.Append(Environment.NewLine); - if (mappedStatement is CachingStatement) + var enumerator = MappedStatements.GetEnumerator(); + while (enumerator.MoveNext()) { - var hitRatio = ((CachingStatement)mappedStatement).GetDataCacheHitRatio(); - if (hitRatio != -1) + var mappedStatement = (IMappedStatement)enumerator.Value; + + buffer.Append(mappedStatement.Id); + buffer.Append(": "); + + if (mappedStatement is CachingStatement) { - buffer.Append(Math.Round(hitRatio * 100)); - buffer.Append("%"); + var hitRatio = ((CachingStatement)mappedStatement).GetDataCacheHitRatio(); + if (hitRatio != -1) + { + buffer.Append(Math.Round(hitRatio * 100)); + buffer.Append("%"); + } + else + { + // this statement has a cache but it hasn't been accessed yet + // buffer.Append("Cache has not been accessed."); ??? + buffer.Append("No Cache."); + } } else { - // this statement has a cache but it hasn't been accessed yet - // buffer.Append("Cache has not been accessed."); ??? buffer.Append("No Cache."); } - } - else - { - buffer.Append("No Cache."); + + buffer.Append(Environment.NewLine); } - buffer.Append(Environment.NewLine); + return buffer.ToString(); } - - return buffer.ToString(); + #endregion } - #endregion } \ No newline at end of file diff --git a/ORBatis.Framework/Configuration/DomSqlMapBuilder.cs b/ORBatis.Framework/Configuration/DomSqlMapBuilder.cs index 4045c38..3ab06ee 100644 --- a/ORBatis.Framework/Configuration/DomSqlMapBuilder.cs +++ b/ORBatis.Framework/Configuration/DomSqlMapBuilder.cs @@ -52,11 +52,13 @@ using IBatisNet.DataMapper.TypeHandlers; using System; using System.Collections; +using System.Collections.Generic; using System.Collections.Specialized; using System.IO; using System.Reflection; using System.Text; using System.Threading; +using System.Threading.Tasks; using System.Xml; using System.Xml.Schema; #endregion @@ -822,19 +824,50 @@ private void Initialize() #endregion #region Load sqlMap mapping files + var toProcessLazily = new List(); foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager)) { - _configScope.NodeContext = xmlNode; - ConfigureSqlMap(); + var shouldLazyLoad = false; + + var isEmbedded = xmlNode.Attributes["embedded"] != null; + if (isEmbedded) + { + var embeddedPath = xmlNode.Attributes["embedded"].Value; + + // This is a special result used in many other sqlMaps. + if (!embeddedPath.ToLower().Contains(".global.xml,")) + { + var parts = embeddedPath.Split('.'); + for (var i = 1; i < parts.Length; i++) + { + var part = parts[i]; + if (!part.ToLower().StartsWith("xml,")) + continue; + + // TODO: Can we recursively load types? Probably not? + + var entityName = parts[i - 1]; + // TODO: Extract out configuration logic to make sure it doesn't depend on _configScope! + var configScope = _configScope; + var currentNode = xmlNode; + configScope.SqlMapper.RegisterEntityToMap(entityName, () => + { + ConfigureSqlMap(currentNode, configScope, true); + }); + shouldLazyLoad = true; + toProcessLazily.Add(entityName); + } + } + } + + if(!shouldLazyLoad) + ConfigureSqlMap(xmlNode, _configScope); } #endregion #region Load sqlMap Modules foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_GLOBAL_MAPMODULE), _configScope.XmlNamespaceManager)) - { - _configScope.NodeContext = xmlNode; - ConfigureSqlMapModule(); - } + ConfigureSqlMapModule(xmlNode); _configScope.ErrorContext.Reset(); #endregion @@ -890,25 +923,41 @@ private void Initialize() _configScope.ErrorContext.Activity = "Resolve 'resultMap' attribute on Result Property"; var resultMap = (ResultMap)entry.Value; - for (var index = 0; index < resultMap.Properties.Count; index++) - { - var result = resultMap.Properties[index]; - if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); - result.PropertyStrategy = PropertyStrategyFactory.Get(result); - } - - for (var index = 0; index < resultMap.Parameters.Count; index++) - { - var result = resultMap.Parameters[index]; - if (result.NestedResultMapName.Length > 0) result.NestedResultMap = _configScope.SqlMapper.GetResultMap(result.NestedResultMapName); - result.ArgumentStrategy = ArgumentStrategyFactory.Get((ArgumentProperty)result); - } - - if (resultMap.Discriminator != null) resultMap.Discriminator.Initialize(_configScope); + PostProcessResultMap(resultMap, _configScope); } _configScope.ErrorContext.Reset(); #endregion + + // Kick-Start the Lazy-Load process + // Note: Given we re-use the SQLMapConfig for many mappers, I'm not sure that this is a win. + // Task.Run(() => + // { + // foreach (var entity in toProcessLazily) + // { + // _configScope.SqlMapper.LazyLoadMappedStatement($"{entity}.LazyInitialization"); + // } + // }); + } + + private void PostProcessResultMap(ResultMap resultMap, ConfigurationScope configScope) + { + for (var index = 0; index < resultMap.Properties.Count; index++) + { + var result = resultMap.Properties[index]; + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + result.PropertyStrategy = PropertyStrategyFactory.Get(result); + } + + for (var index = 0; index < resultMap.Parameters.Count; index++) + { + var result = resultMap.Parameters[index]; + if (result.NestedResultMapName.Length > 0) result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + result.ArgumentStrategy = ArgumentStrategyFactory.Get((ArgumentProperty)result); + } + + if (resultMap.Discriminator != null) + resultMap.Discriminator.Initialize(configScope); } /// @@ -986,10 +1035,8 @@ private IDbProvider ParseProvider() "Error while configuring the SqlMap. There is no provider marked default in 'providers.config' file."); } - private void ConfigureSqlMapModule() + private void ConfigureSqlMapModule(XmlNode sqlModuleNode) { - var sqlModuleNode = _configScope.NodeContext; - _configScope.ErrorContext.Activity = "loading SqlMap Module"; _configScope.ErrorContext.Resource = sqlModuleNode.OuterXml; if (_configScope.UseConfigFileWatcher) @@ -1002,7 +1049,7 @@ private void ConfigureSqlMapModule() foreach (XmlNode xmlNode in _configScope.SqlMapModuleDocument.SelectNodes(ApplyModuleNamespacePrefix(XML_MODULE_MAP), _configScope.XmlNamespaceManager)) { _configScope.NodeContext = xmlNode; - ConfigureSqlMap(); + ConfigureSqlMap(xmlNode, _configScope); _configScope.NodeContext = sqlModuleNode; } } @@ -1010,45 +1057,44 @@ private void ConfigureSqlMapModule() /// /// Load sqlMap statement. /// - private void ConfigureSqlMap() + private void ConfigureSqlMap(XmlNode sqlMapNode, ConfigurationScope configScope, bool isLazy = false) { - var sqlMapNode = _configScope.NodeContext; + configScope.NodeContext = sqlMapNode; + configScope.ErrorContext.Activity = "loading SqlMap"; + configScope.ErrorContext.Resource = sqlMapNode.OuterXml; - _configScope.ErrorContext.Activity = "loading SqlMap"; - _configScope.ErrorContext.Resource = sqlMapNode.OuterXml; - - if (_configScope.UseConfigFileWatcher) + if (configScope.UseConfigFileWatcher) if (sqlMapNode.Attributes["resource"] != null || sqlMapNode.Attributes["url"] != null) - ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlMapNode, _configScope.Properties))); + ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlMapNode, configScope.Properties))); // Load the file - _configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, _configScope.Properties); + configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, configScope.Properties); - if (_configScope.ValidateSqlMap) ValidateSchema(_configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); + if (configScope.ValidateSqlMap) ValidateSchema(configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); - _configScope.SqlMapNamespace = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), _configScope.XmlNamespaceManager).Attributes["namespace"].Value; + configScope.SqlMapNamespace = configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), configScope.XmlNamespaceManager).Attributes["namespace"].Value; #region Load TypeAlias - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), _configScope.XmlNamespaceManager)) TypeAliasDeSerializer.Deserialize(xmlNode, _configScope); - _configScope.ErrorContext.MoreInfo = string.Empty; - _configScope.ErrorContext.ObjectId = string.Empty; + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), configScope.XmlNamespaceManager)) TypeAliasDeSerializer.Deserialize(xmlNode, configScope); + configScope.ErrorContext.MoreInfo = string.Empty; + configScope.ErrorContext.ObjectId = string.Empty; #endregion #region Load resultMap - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_RESULTMAP), _configScope.XmlNamespaceManager)) + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_RESULTMAP), configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.MoreInfo = "loading ResultMap tag"; - _configScope.NodeContext = xmlNode; // A ResultMap node - - BuildResultMap(); + configScope.ErrorContext.MoreInfo = "loading ResultMap tag"; + var resultMap = BuildResultMap(xmlNode, configScope); + if(isLazy) + PostProcessResultMap(resultMap, configScope); } #endregion #region Load parameterMaps - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PARAMETERMAP), _configScope.XmlNamespaceManager)) + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PARAMETERMAP), configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.MoreInfo = "loading ParameterMap tag"; - _configScope.NodeContext = xmlNode; // A ParameterMap node + configScope.ErrorContext.MoreInfo = "loading ParameterMap tag"; + configScope.NodeContext = xmlNode; // A ParameterMap node BuildParameterMap(); } @@ -1056,126 +1102,126 @@ private void ConfigureSqlMap() #region Load statements #region Sql tag - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(SQL_STATEMENT), _configScope.XmlNamespaceManager)) + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(SQL_STATEMENT), configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.MoreInfo = "loading sql tag"; - _configScope.NodeContext = xmlNode; // A sql tag + configScope.ErrorContext.MoreInfo = "loading sql tag"; + configScope.NodeContext = xmlNode; // A sql tag - SqlDeSerializer.Deserialize(xmlNode, _configScope); + SqlDeSerializer.Deserialize(xmlNode, configScope); } #endregion #region Statement tag Statement statement; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_STATEMENT), _configScope.XmlNamespaceManager)) + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_STATEMENT), configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.MoreInfo = "loading statement tag"; - _configScope.NodeContext = xmlNode; // A statement tag + configScope.ErrorContext.MoreInfo = "loading statement tag"; + configScope.NodeContext = xmlNode; // A statement tag - statement = StatementDeSerializer.Deserialize(xmlNode, _configScope); - statement.CacheModelName = _configScope.ApplyNamespace(statement.CacheModelName); - statement.ParameterMapName = _configScope.ApplyNamespace(statement.ParameterMapName); + statement = StatementDeSerializer.Deserialize(xmlNode, configScope); + statement.CacheModelName = configScope.ApplyNamespace(statement.CacheModelName); + statement.ParameterMapName = configScope.ApplyNamespace(statement.ParameterMapName); //statement.ResultMapName = ApplyNamespace( statement.ResultMapName ); - if (_configScope.UseStatementNamespaces) statement.Id = _configScope.ApplyNamespace(statement.Id); - _configScope.ErrorContext.ObjectId = statement.Id; - statement.Initialize(_configScope); + if (configScope.UseStatementNamespaces) statement.Id = configScope.ApplyNamespace(statement.Id); + configScope.ErrorContext.ObjectId = statement.Id; + statement.Initialize(configScope); // Build ISql (analyse sql statement) ProcessSqlStatement(statement); // Build MappedStatement - var mappedStatement = new MappedStatement(_configScope.SqlMapper, statement); + var mappedStatement = new MappedStatement(configScope.SqlMapper, statement); IMappedStatement mapStatement = mappedStatement; - if (statement.CacheModelName != null && statement.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + if (statement.CacheModelName != null && statement.CacheModelName.Length > 0 && configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); - _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); } #endregion #region Select tag Select select; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_SELECT), _configScope.XmlNamespaceManager)) + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_SELECT), configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.MoreInfo = "loading select tag"; - _configScope.NodeContext = xmlNode; // A select node + configScope.ErrorContext.MoreInfo = "loading select tag"; + configScope.NodeContext = xmlNode; // A select node - select = SelectDeSerializer.Deserialize(xmlNode, _configScope); - select.CacheModelName = _configScope.ApplyNamespace(select.CacheModelName); - select.ParameterMapName = _configScope.ApplyNamespace(select.ParameterMapName); + select = SelectDeSerializer.Deserialize(xmlNode, configScope); + select.CacheModelName = configScope.ApplyNamespace(select.CacheModelName); + select.ParameterMapName = configScope.ApplyNamespace(select.ParameterMapName); //select.ResultMapName = ApplyNamespace( select.ResultMapName ); - if (_configScope.UseStatementNamespaces) select.Id = _configScope.ApplyNamespace(select.Id); - _configScope.ErrorContext.ObjectId = select.Id; + if (configScope.UseStatementNamespaces) select.Id = configScope.ApplyNamespace(select.Id); + configScope.ErrorContext.ObjectId = select.Id; - select.Initialize(_configScope); + select.Initialize(configScope); if (select.Generate != null) - GenerateCommandText(_configScope, select); + GenerateCommandText(configScope, select); else // Build ISql (analyse sql statement) ProcessSqlStatement(select); // Build MappedStatement - MappedStatement mappedStatement = new SelectMappedStatement(_configScope.SqlMapper, select); + MappedStatement mappedStatement = new SelectMappedStatement(configScope.SqlMapper, select); IMappedStatement mapStatement = mappedStatement; - if (select.CacheModelName != null && select.CacheModelName.Length > 0 && _configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); + if (select.CacheModelName != null && select.CacheModelName.Length > 0 && configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); - _configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); + configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); } #endregion #region Insert tag Insert insert; - foreach (XmlNode xmlNode in _configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_INSERT), _configScope.XmlNamespaceManager)) + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_INSERT), configScope.XmlNamespaceManager)) { - _configScope.ErrorContext.MoreInfo = "loading insert tag"; - _configScope.NodeContext = xmlNode; // A insert tag + configScope.ErrorContext.MoreInfo = "loading insert tag"; + configScope.NodeContext = xmlNode; // A insert tag MappedStatement mappedStatement; - insert = InsertDeSerializer.Deserialize(xmlNode, _configScope); - insert.CacheModelName = _configScope.ApplyNamespace(insert.CacheModelName); - insert.ParameterMapName = _configScope.ApplyNamespace(insert.ParameterMapName); + insert = InsertDeSerializer.Deserialize(xmlNode, configScope); + insert.CacheModelName = configScope.ApplyNamespace(insert.CacheModelName); + insert.ParameterMapName = configScope.ApplyNamespace(insert.ParameterMapName); //insert.ResultMapName = ApplyNamespace( insert.ResultMapName ); - if (_configScope.UseStatementNamespaces) insert.Id = _configScope.ApplyNamespace(insert.Id); - _configScope.ErrorContext.ObjectId = insert.Id; - insert.Initialize(_configScope); + if (configScope.UseStatementNamespaces) insert.Id = configScope.ApplyNamespace(insert.Id); + configScope.ErrorContext.ObjectId = insert.Id; + insert.Initialize(configScope); // Build ISql (analyse sql command text) if (insert.Generate != null) - GenerateCommandText(_configScope, insert); + GenerateCommandText(configScope, insert); else ProcessSqlStatement(insert); // Build MappedStatement - mappedStatement = new InsertMappedStatement(_configScope.SqlMapper, insert); + mappedStatement = new InsertMappedStatement(configScope.SqlMapper, insert); - _configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); + configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); #region statement SelectKey // Set sql statement SelectKey if (insert.SelectKey != null) { - _configScope.ErrorContext.MoreInfo = "loading selectKey tag"; - _configScope.NodeContext = xmlNode.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SELECTKEY), _configScope.XmlNamespaceManager); + configScope.ErrorContext.MoreInfo = "loading selectKey tag"; + configScope.NodeContext = xmlNode.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SELECTKEY), configScope.XmlNamespaceManager); insert.SelectKey.Id = insert.Id; - insert.SelectKey.Initialize(_configScope); + insert.SelectKey.Initialize(configScope); insert.SelectKey.Id += DOT + "SelectKey"; - // Initialize can also use _configScope.ErrorContext.ObjectId to get the id + // Initialize can also use configScope.ErrorContext.ObjectId to get the id // of the parent + select * from CannedQuery + + + Id = #value# + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ORBatis.Test.Common/Config/Definitions/Global.xml b/ORBatis.Test.Common/Config/Definitions/Global.xml new file mode 100644 index 0000000..ce6c7dd --- /dev/null +++ b/ORBatis.Test.Common/Config/Definitions/Global.xml @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/ORBatis.Test.Common/Models/CannedQuery.cs b/ORBatis.Test.Common/Models/CannedQuery.cs new file mode 100644 index 0000000..5cf52d7 --- /dev/null +++ b/ORBatis.Test.Common/Models/CannedQuery.cs @@ -0,0 +1,60 @@ +using System; + +namespace ORBatis.Test.Common.Models; + +public class CannedQuery +{ + public int Id { get; set; } + + public int UserId { get; set; } + + public string Name { get; set; } + + public string Description { get; set; } + + public string Sql { get; set; } + + public int? LimitGrid { get; set; } + + public int? LimitExport { get; set; } + + public int? Timeout { get; set; } + + public CannedQueryParameter[] Parameters { get; set; } + + public EntityType[] EntityTypes { get; set; } + + public string RelatedItems { get; set; } + + public string ExportFilename { get; set; } + + public DateTime CreatedUtc { get; set; } + public int CreatedUserId { get; set; } + public DateTime? UpdatedUtc { get; set; } + public int UpdatedUserId { get; set; } + public DateTime? DeletedUtc { get; set; } + public int DeletedUserId { get; set; } +} + +public class CannedQueryParameter +{ + public string Name { get; set; } + + public string DisplayName { get; set; } + + public ParameterType Type { get; set; } + + public bool IsOptional { get; set; } + + public string HelpInfo { get; set; } +} + +public enum ParameterType +{ + DateTime, + String, + Integer, + Decimal, + Boolean, + Guid +} \ No newline at end of file diff --git a/ORBatis.Test.Common/Models/EntityType.cs b/ORBatis.Test.Common/Models/EntityType.cs new file mode 100644 index 0000000..9ec6bec --- /dev/null +++ b/ORBatis.Test.Common/Models/EntityType.cs @@ -0,0 +1,6 @@ +namespace ORBatis.Test.Common.Models; + +public enum EntityType +{ + Unknown = 0 +} \ No newline at end of file diff --git a/ORBatis.Test.Common/Models/GirdCannedQueryForOverview.cs b/ORBatis.Test.Common/Models/GirdCannedQueryForOverview.cs new file mode 100644 index 0000000..787757d --- /dev/null +++ b/ORBatis.Test.Common/Models/GirdCannedQueryForOverview.cs @@ -0,0 +1,8 @@ +namespace ORBatis.Test.Common.Models; + +public class GridCannedQueryForOverview : CannedQuery +{ + public GridCannedQueryForOverview() : base() { } + + public bool IsHidden { get; set; } +} diff --git a/ORBatis.Test.Common/ORBatis.Test.Common.csproj b/ORBatis.Test.Common/ORBatis.Test.Common.csproj index 096cb58..5ce3849 100644 --- a/ORBatis.Test.Common/ORBatis.Test.Common.csproj +++ b/ORBatis.Test.Common/ORBatis.Test.Common.csproj @@ -6,8 +6,11 @@ + + + diff --git a/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs index 25c1104..f512ab4 100644 --- a/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs @@ -1,8 +1,10 @@ using System.Collections; using System.Collections.Specialized; +using System.Configuration; using IBatisNet.DataMapper.Configuration; using ORBatis.Test.Common; using ORBatis.Test.Common.Models; +using Xunit; namespace ORBatis.Test.Core.Tests; @@ -11,7 +13,7 @@ public class Tests [Fact] public void Basic_AbleToSelectHolidays() { - var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Test.Core.Config.SqlMap.config, ORBatis.Test.Core"); + var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Test.Framework.Config.SqlMap.config, ORBatis.Test.Framework"); var builder = new DomSqlMapBuilder() { Properties = new NameValueCollection() @@ -28,9 +30,26 @@ public void Basic_AbleToSelectHolidays() { "active", true }, { "userId", 347317427 } }; - var holidays = mapper.QueryForList( "Holiday.SelectAll", parameters, context ); - + var holidays = mapper.QueryForList("Holiday.SelectAll", parameters, context); Assert.NotNull(holidays); + + // This one should use the previously LazyLoaded version! + var holidays2 = mapper.QueryForList("Holiday.SelectAll", parameters, context); + Assert.NotNull(holidays2); + + var cannedParams = new Hashtable() + { + { "orderBy", "Id" }, + { "orderDirection", "Desc" }, + { "startAtRowNumber", 0 }, + { "pageSize", 10 } + }; + var cannedQueries = mapper.QueryForList( + "CannedQuery.GridForOverview", + cannedParams, + context + ); + Assert.NotNull(cannedQueries); } } \ No newline at end of file diff --git a/ORBatis.Test.Core/TypeHandlers/NullableEnum.cs b/ORBatis.Test.Core/TypeHandlers/NullableEnum.cs new file mode 100644 index 0000000..bd96dcb --- /dev/null +++ b/ORBatis.Test.Core/TypeHandlers/NullableEnum.cs @@ -0,0 +1,36 @@ +using System; +using IBatisNet.DataMapper.TypeHandlers; + +namespace ORBatis.Test.Core.TypeHandlers; + +public class NullableEnum : ITypeHandlerCallback + where T : struct +{ + readonly static Type _underlyingType = Enum.GetUnderlyingType(typeof(T)); + + public object NullValue + { + get { return null; } + } + + public object GetResult(IResultGetter getter) + { + if (getter.Value != null && getter.Value != DBNull.Value) + return (T)(object)Convert.ChangeType(getter.Value, _underlyingType); + else + return NullValue; + } + + public void SetParameter(IParameterSetter setter, object parameter) + { + if (parameter != null && parameter is T) + setter.Value = Convert.ChangeType(parameter, _underlyingType); + else + setter.Value = null; + } + + public object ValueOf(string s) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/ORBatis.Test.Framework/Config/SqlMap.config b/ORBatis.Test.Framework/Config/SqlMap.config index 2f32229..c18b962 100644 --- a/ORBatis.Test.Framework/Config/SqlMap.config +++ b/ORBatis.Test.Framework/Config/SqlMap.config @@ -12,6 +12,9 @@ + + + @@ -19,5 +22,7 @@ + + diff --git a/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj b/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj index 75d40bb..e7d98d1 100644 --- a/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj +++ b/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj @@ -94,6 +94,7 @@ + diff --git a/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs index 79da3c1..aa90a27 100644 --- a/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs @@ -6,7 +6,7 @@ using ORBatis.Test.Common.Models; using Xunit; -namespace ORBatis.Test.Framewor.Tests; +namespace ORBatis.Test.Framework.Tests; public class Tests { @@ -30,8 +30,25 @@ public void Basic_AbleToSelectHolidays() { "active", true }, { "userId", 347317427 } }; - var holidays = mapper.QueryForList( "Holiday.SelectAll", parameters, context ); - + var holidays = mapper.QueryForList("Holiday.SelectAll", parameters, context); Assert.NotNull(holidays); + + // This one should use the previously LazyLoaded version! + var holidays2 = mapper.QueryForList("Holiday.SelectAll", parameters, context); + Assert.NotNull(holidays2); + + var cannedParams = new Hashtable() + { + { "orderBy", "Id" }, + { "orderDirection", "Desc" }, + { "startAtRowNumber", 0 }, + { "pageSize", 10 } + }; + var cannedQueries = mapper.QueryForList( + "CannedQuery.GridForOverview", + cannedParams, + context + ); + Assert.NotNull(cannedQueries); } } \ No newline at end of file diff --git a/ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs b/ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs new file mode 100644 index 0000000..e253da1 --- /dev/null +++ b/ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs @@ -0,0 +1,36 @@ +using System; +using IBatisNet.DataMapper.TypeHandlers; + +namespace ORBatis.Test.Framework.TypeHandlers; + +public class NullableEnum : ITypeHandlerCallback + where T : struct +{ + readonly static Type _underlyingType = Enum.GetUnderlyingType(typeof(T)); + + public object NullValue + { + get { return null; } + } + + public object GetResult(IResultGetter getter) + { + if (getter.Value != null && getter.Value != DBNull.Value) + return (T)(object)Convert.ChangeType(getter.Value, _underlyingType); + else + return NullValue; + } + + public void SetParameter(IParameterSetter setter, object parameter) + { + if (parameter != null && parameter is T) + setter.Value = Convert.ChangeType(parameter, _underlyingType); + else + setter.Value = null; + } + + public object ValueOf(string s) + { + throw new NotImplementedException(); + } +} \ No newline at end of file diff --git a/ORBatis.sln b/ORBatis.sln index 4bf8b8f..8a9bb6b 100644 --- a/ORBatis.sln +++ b/ORBatis.sln @@ -12,6 +12,11 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Common", "ORBa EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Core", "ORBatis.Test.Core\ORBatis.Test.Core.csproj", "{3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{4AEEEB58-43D1-44EA-BC65-5BFD16039FC1}" + ProjectSection(SolutionItems) = preProject + README.md = README.md + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/README.md b/README.md new file mode 100644 index 0000000..7e017c4 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +# ORBatis + +A stripped down version of iBatis. + +It only builds for net48 and net9.0, almost all the rest of the functionality has been deleted, +and the configuration system has been heavily hacked! + +In particular: +- We attempt to load embedded SqlMaps lazily + - This is accomplished by major hacks to the `SqlMapper.cs` and `DomSqlMapBuilder.cs` classes. + - `SqlMapper` + - Now has a `RegisterEntityToMap` method + - This stores a configuration method in a per-file dictionary lookup + - The first consumer of this file will implicitly call the configuration method. + - Duplicate callers will await a shared task. + - `DomSqlMapBuilder` + - If we detect that a file can be loaded lazily, we will attempt to do so. + - Calls the `RegisterEntityToMap` method to configure the lazy-load method + - Also tweaked the `ConfigureSqlMap` method to be easier to call for lazy callers. + - At the end of the config method, we start a background thread which will load each of the Lazy-loadable .xml files in turn. + +## Important! + +Make sure that if you change the NetFramework behavior, that you also change the NetCore behavior! +- They're basically duplicates of one another, but the shared logic is difficult to move + into the common project due to dependency on runtime specific Reflect/ILEmit logic. + +## Big Quirks! + +- Global.xml is always loaded eagerly because we have several queries which depend on it. + - It would be better if we detected dependencies and lazy loaded them too, but I'm not sure if this is possible. + +TODO! +- Check for other lock-required areas. I think I saw some Deserialize methods which might cause race conditions. +- Migrate the Framework code into Core. They've gotten out of sync! +- See if we can reduce the code duplication. +- Double check that netCore serializer hack I made. It's not supported for net8, but should be better tested! \ No newline at end of file From a40355f7365e8baac53f4642ea43ab29e1efced3 Mon Sep 17 00:00:00 2001 From: NLilley Date: Thu, 24 Jul 2025 17:01:07 +0300 Subject: [PATCH 09/16] Remove duplication. Replicate the ORApplication code sharing technique. --- ORBatis.Core/Commands/DataReaderDecorator.cs | 489 ----- .../Commands/DataReaderTransformer.cs | 50 - ORBatis.Core/Commands/DbCommandDecorator.cs | 231 --- .../Commands/DefaultPreparedCommand.cs | 201 -- ORBatis.Core/Commands/IPreparedCommand.cs | 50 - ORBatis.Core/Commands/InMemoryDataReader.cs | 579 ------ .../Commands/PreparedCommandFactory.cs | 51 - ORBatis.Core/Configuration/Alias/TypeAlias.cs | 114 - .../Configuration/Alias/TypeHandler.cs | 105 - ORBatis.Core/Configuration/Cache/CacheKey.cs | 149 -- .../Configuration/Cache/CacheModel.cs | 368 ---- .../Cache/Fifo/FifoCacheController.cs | 110 - .../Configuration/Cache/FlushInterval.cs | 114 - .../Configuration/Cache/ICacheController.cs | 65 - .../Cache/Lru/LruCacheController.cs | 115 -- .../Cache/Memory/MemoryCacheControler.cs | 142 -- .../Cache/Memory/MemoryCacheLevel.cs | 105 - .../InlineParameterMapParser.cs | 321 --- .../ParameterMapping/ParameterMap.cs | 324 --- .../ParameterMapping/ParameterProperty.cs | 375 ---- .../ParameterPropertyCollection.cs | 207 -- .../ResultMapping/ArgumentProperty.cs | 202 -- .../ResultMapping/AutoResultMap.cs | 192 -- .../ResultMapping/Discriminator.cs | 213 -- .../Configuration/ResultMapping/IResultMap.cs | 116 -- .../ResultMapping/NullResultMap.cs | 144 -- .../Configuration/ResultMapping/ResultMap.cs | 460 ----- .../ResultMapping/ResultMapCollection.cs | 215 -- .../ResultMapping/ResultProperty.cs | 540 ----- .../ResultMapping/ResultPropertyCollection.cs | 242 --- .../Configuration/ResultMapping/SubMap.cs | 99 - .../ArgumentPropertyDeSerializer.cs | 63 - .../Serializers/CacheModelDeSerializer.cs | 74 - .../Serializers/DeSerializerFactory.cs | 71 - .../Serializers/DeleteDeSerializer.cs | 76 - .../Serializers/DiscriminatorDeSerializer.cs | 60 - .../Serializers/DynamicDeSerializer.cs | 68 - .../Serializers/IDeSerializer.cs | 43 - .../Serializers/InsertDeSerializer.cs | 97 - .../Serializers/IsEmptyDeSerializer.cs | 68 - .../Serializers/IsEqualDeSerializer.cs | 70 - .../Serializers/IsGreaterEqualDeSerializer.cs | 69 - .../Serializers/IsGreaterThanDeSerializer.cs | 69 - .../Serializers/IsLessEqualDeSerializer.cs | 69 - .../Serializers/IsLessThanDeSerializer.cs | 69 - .../Serializers/IsNotEmptyDeSerializer.cs | 67 - .../Serializers/IsNotEqualDeSerializer.cs | 70 - .../Serializers/IsNotNullDeSerializer.cs | 67 - .../IsNotParameterPresentDeSerializer.cs | 66 - .../IsNotPropertyAvailableDeSerializer.cs | 67 - .../Serializers/IsNullDeSerializer.cs | 67 - .../IsParameterPresentDeSerializer.cs | 66 - .../IsPropertyAvailableDeSerializer.cs | 68 - .../Serializers/IterateSerializer.cs | 71 - .../Serializers/ParameterMapDeSerializer.cs | 65 - .../ParameterPropertyDeSerializer.cs | 66 - .../Serializers/ProcedureDeSerializer.cs | 61 - .../Serializers/ResultMapDeSerializer.cs | 57 - .../Serializers/ResultPropertyDeSerializer.cs | 64 - .../Serializers/SelectDeSerializer.cs | 76 - .../Serializers/SqlDeSerializer.cs | 57 - .../Serializers/StatementDeSerializer.cs | 63 - .../Serializers/SubMapDeSerializer.cs | 55 - .../Serializers/TypeAliasDeSerializer.cs | 62 - .../Serializers/TypeHandlerDeSerializer.cs | 78 - .../Serializers/UpdateDeSerializer.cs | 75 - .../Configuration/Sql/Dynamic/DynamicSql.cs | 268 --- .../Sql/Dynamic/Elements/BaseTag.cs | 63 - .../Sql/Dynamic/Elements/Conditional.cs | 65 - .../Sql/Dynamic/Elements/Dynamic.cs | 49 - .../Sql/Dynamic/Elements/IDynamicParent.cs | 37 - .../Sql/Dynamic/Elements/IsEmpty.cs | 47 - .../Sql/Dynamic/Elements/IsEqual.cs | 47 - .../Sql/Dynamic/Elements/IsGreaterEqual.cs | 47 - .../Sql/Dynamic/Elements/IsGreaterThan.cs | 47 - .../Sql/Dynamic/Elements/IsLessEqual.cs | 47 - .../Sql/Dynamic/Elements/IsLessThan.cs | 47 - .../Sql/Dynamic/Elements/IsNotEmpty.cs | 49 - .../Sql/Dynamic/Elements/IsNotEqual.cs | 49 - .../Sql/Dynamic/Elements/IsNotNull.cs | 47 - .../Dynamic/Elements/IsNotParameterPresent.cs | 47 - .../Elements/IsNotPropertyAvailable.cs | 47 - .../Sql/Dynamic/Elements/IsNull.cs | 45 - .../Dynamic/Elements/IsParameterPresent.cs | 47 - .../Dynamic/Elements/IsPropertyAvailable.cs | 47 - .../Sql/Dynamic/Elements/Iterate.cs | 88 - .../Sql/Dynamic/Elements/SqlTag.cs | 104 - .../Sql/Dynamic/Handlers/BaseTagHandler.cs | 127 -- .../Dynamic/Handlers/ConditionalTagHandler.cs | 220 -- .../Sql/Dynamic/Handlers/DynamicTagHandler.cs | 59 - .../Sql/Dynamic/Handlers/ISqlTagHandler.cs | 67 - .../Sql/Dynamic/Handlers/IsEmptyTagHandler.cs | 73 - .../Sql/Dynamic/Handlers/IsEqualTagHandler.cs | 58 - .../Handlers/IsGreaterEqualTagHandler.cs | 59 - .../Handlers/IsGreaterThanTagHandler.cs | 54 - .../Dynamic/Handlers/IsLessEqualTagHandler.cs | 54 - .../Dynamic/Handlers/IsLessThanTagHandler.cs | 54 - .../Dynamic/Handlers/IsNotEmptyTagHandler.cs | 53 - .../Dynamic/Handlers/IsNotEqualTagHandler.cs | 53 - .../Dynamic/Handlers/IsNotNullTagHandler.cs | 53 - .../IsNotParameterPresentTagHandler.cs | 53 - .../IsNotPropertyAvailableTagHandler.cs | 53 - .../Sql/Dynamic/Handlers/IsNullTagHandler.cs | 62 - .../Handlers/IsParameterPresentTagHandler.cs | 53 - .../Handlers/IsPropertyAvailableTagHandler.cs | 59 - .../Sql/Dynamic/Handlers/IterateContext.cs | 146 -- .../Sql/Dynamic/Handlers/IterateTagHandler.cs | 163 -- .../Sql/Dynamic/Handlers/SqlTagContext.cs | 126 -- .../Configuration/Sql/Dynamic/ISqlChild.cs | 31 - .../Configuration/Sql/Dynamic/SqlText.cs | 62 - ORBatis.Core/Configuration/Sql/ISql.cs | 50 - .../Sql/SimpleDynamic/SimpleDynamicSql.cs | 184 -- .../Configuration/Sql/Static/ProcedureSql.cs | 103 - .../Configuration/Sql/Static/StaticSql.cs | 92 - .../Configuration/Statements/Delete.cs | 59 - .../Configuration/Statements/Generate.cs | 99 - .../Configuration/Statements/IStatement.cs | 118 -- .../Configuration/Statements/Insert.cs | 83 - .../Statements/PreparedStatement.cs | 55 - .../Statements/PreparedStatementFactory.cs | 447 ---- .../Configuration/Statements/Procedure.cs | 78 - .../Configuration/Statements/Select.cs | 56 - .../Configuration/Statements/SelectKey.cs | 127 -- .../Configuration/Statements/SqlGenerator.cs | 242 --- .../Configuration/Statements/Statement.cs | 323 --- .../Configuration/Statements/Update.cs | 56 - ORBatis.Core/DataExchange/BaseDataExchange.cs | 75 - .../DataExchange/ComplexDataExchange.cs | 88 - .../DataExchange/DataExchangeFactory.cs | 101 - .../DataExchange/DictionaryDataExchange.cs | 81 - .../DataExchange/DotNetObjectDataExchange.cs | 110 - ORBatis.Core/DataExchange/IDataExchange.cs | 59 - ORBatis.Core/DataExchange/ListDataExchange.cs | 82 - .../DataExchange/PrimitiveDataExchange.cs | 85 - ORBatis.Core/Delegates.cs | 62 - ORBatis.Core/Enumeration.cs | 58 - .../Exceptions/DataMapperException.cs | 108 - ORBatis.Core/ExecuteEventArgs.cs | 37 - ORBatis.Core/ISqlMapSession.cs | 50 - .../Logging/ConfigurationSectionHandler.cs | 196 -- ORBatis.Core/Logging/LogManager.cs | 202 -- .../ArgumentStrategyFactory.cs | 78 - .../ArgumentStrategy/DefaultStrategy.cs | 74 - .../ArgumentStrategy/IArgumentStrategy.cs | 46 - .../ArgumentStrategy/ResultMapStrategy.cs | 83 - .../ArgumentStrategy/SelectArrayStrategy.cs | 64 - .../SelectGenericListStrategy.cs | 88 - .../ArgumentStrategy/SelectListStrategy.cs | 69 - .../ArgumentStrategy/SelectObjectStrategy.cs | 60 - .../ArgumentStrategy/SelectStrategy.cs | 127 -- ORBatis.Core/MappedStatements/BaseStrategy.cs | 109 - .../MappedStatements/CachingStatement.cs | 486 ----- .../MappedStatements/DeleteMappedStatement.cs | 140 -- .../MappedStatements/IMappedStatement.cs | 289 --- .../MappedStatements/InsertMappedStatement.cs | 156 -- .../MappedStatements/MappedStatement.cs | 1100 ---------- .../MappedStatements/PaginatedList.cs | 423 ---- ORBatis.Core/MappedStatements/PostBindind.cs | 106 - .../PostSelectStrategy/ArrayStrategy.cs | 53 - .../PostSelectStrategy/GenericListStrategy.cs | 76 - .../PostSelectStrategy/IPostSelectStrategy.cs | 44 - .../PostSelectStrategy/ListStrategy.cs | 47 - .../PostSelectStrategy/ObjectStrategy.cs | 47 - .../PostSelectStrategyFactory.cs | 60 - .../StrongTypedListStrategy.cs | 51 - .../PropertStrategy/DefaultStrategy.cs | 89 - .../PropertStrategy/GroupByStrategy.cs | 146 -- .../PropertStrategy/IPropertyStrategy.cs | 60 - .../PropertyStrategyFactory.cs | 92 - .../PropertStrategy/ResultMapStrategy.cs | 103 - .../PropertStrategy/SelectArrayStrategy.cs | 80 - .../SelectGenericListStrategy.cs | 88 - .../PropertStrategy/SelectListStrategy.cs | 91 - .../PropertStrategy/SelectObjectStrategy.cs | 89 - .../PropertStrategy/SelectStrategy.cs | 140 -- .../MappedStatements/ReaderAutoMapper.cs | 129 -- .../ResultStrategy/AutoMapStrategy.cs | 112 - .../ResultStrategy/BaseResultStrategy.cs | 26 - .../ResultStrategy/DictionaryStrategy.cs | 72 - .../ResultStrategy/GroupByStrategy.cs | 97 - .../ResultStrategy/IResultStrategy.cs | 43 - .../ResultStrategy/ListStrategy.cs | 69 - .../ResultStrategy/MapStrategy.cs | 65 - .../ResultStrategy/ObjectStrategy.cs | 78 - .../ResultStrategy/ResultClassStrategy.cs | 73 - .../ResultStrategy/ResultMapStrategy.cs | 78 - .../ResultStrategy/ResultStrategyFactory.cs | 68 - .../ResultStrategy/SimpleTypeStrategy.cs | 79 - .../MappedStatements/SelectMappedStatement.cs | 69 - .../MappedStatements/UpdateMappedStatement.cs | 157 -- ORBatis.Core/Mapper.cs | 82 - ORBatis.Core/Proxy/ILazyFactory.cs | 46 - ORBatis.Core/Proxy/LazyFactoryBuilder.cs | 82 - ORBatis.Core/Proxy/LazyList.cs | 325 --- ORBatis.Core/Proxy/LazyListFactory.cs | 52 - ORBatis.Core/Proxy/LazyListGeneric.cs | 513 ----- ORBatis.Core/Proxy/LazyListGenericFactory.cs | 60 - ORBatis.Core/Proxy/LazyLoadInterceptor.cs | 136 -- ORBatis.Core/Proxy/LazyLoadProxyFactory.cs | 76 - ORBatis.Core/Scope/ConfigurationScope.cs | 254 --- ORBatis.Core/Scope/ErrorContext.cs | 117 -- ORBatis.Core/Scope/IScope.cs | 43 - ORBatis.Core/Scope/RequestScope.cs | 214 -- ORBatis.Core/SqlMapSession.cs | 473 ----- ORBatis.Core/SqlMapper.cs | 1186 ----------- .../TypeHandlers/AnsiStringTypeHandler.cs | 109 - ORBatis.Core/TypeHandlers/BaseTypeHandler.cs | 112 - .../TypeHandlers/BooleanTypeHandler.cs | 100 - .../TypeHandlers/ByteArrayTypeHandler.cs | 123 -- ORBatis.Core/TypeHandlers/ByteTypeHandler.cs | 106 - ORBatis.Core/TypeHandlers/CharTypeHandler.cs | 100 - .../TypeHandlers/CustomTypeHandler.cs | 135 -- .../TypeHandlers/DBNullTypeHandler.cs | 105 - .../TypeHandlers/DateTimeTypeHandler.cs | 100 - .../TypeHandlers/DecimalTypeHandler.cs | 105 - .../TypeHandlers/DoubleTypeHandler.cs | 100 - ORBatis.Core/TypeHandlers/EnumTypeHandler.cs | 116 -- ORBatis.Core/TypeHandlers/GuidTypeHandler.cs | 99 - ORBatis.Core/TypeHandlers/IParameterSetter.cs | 52 - ORBatis.Core/TypeHandlers/IResultGetter.cs | 54 - ORBatis.Core/TypeHandlers/ITypeHandler.cs | 95 - .../TypeHandlers/ITypeHandlerCallback.cs | 78 - ORBatis.Core/TypeHandlers/Int16TypeHandler.cs | 101 - ORBatis.Core/TypeHandlers/Int32TypeHandler.cs | 103 - ORBatis.Core/TypeHandlers/Int64TypeHandler.cs | 101 - .../Nullables/NullableBooleanTypeHandler.cs | 120 -- .../Nullables/NullableByteTypeHandler.cs | 119 -- .../Nullables/NullableCharTypeHandler.cs | 119 -- .../Nullables/NullableDateTimeTypeHandler.cs | 117 -- .../Nullables/NullableDecimalTypeHandler.cs | 125 -- .../Nullables/NullableDoubleTypeHandler.cs | 119 -- .../Nullables/NullableGuidTypeHandler.cs | 118 -- .../Nullables/NullableInt16TypeHandler.cs | 127 -- .../Nullables/NullableInt32TypeHandler.cs | 125 -- .../Nullables/NullableInt64TypeHandler.cs | 126 -- .../Nullables/NullableSByteTypeHandler.cs | 120 -- .../Nullables/NullableSingleTypeHandler.cs | 118 -- .../Nullables/NullableTimeSpanTypeHandler.cs | 119 -- .../Nullables/NullableUInt16TypeHandler.cs | 126 -- .../Nullables/NullableUInt32TypeHandler.cs | 126 -- .../Nullables/NullableUInt64TypeHandler.cs | 126 -- .../TypeHandlers/ObjectTypeHandler.cs | 99 - .../TypeHandlers/ParameterSetterImpl.cs | 62 - ORBatis.Core/TypeHandlers/ResultGetterImpl.cs | 102 - ORBatis.Core/TypeHandlers/SByteTypeHandler.cs | 102 - .../TypeHandlers/SingleTypeHandler.cs | 102 - .../TypeHandlers/StringTypeHandler.cs | 101 - .../TypeHandlers/TimeSpanTypeHandler.cs | 110 - .../TypeHandlers/TypeHandlerFactory.cs | 358 ---- .../TypeHandlers/UInt16TypeHandler.cs | 103 - .../TypeHandlers/UInt32TypeHandler.cs | 101 - .../TypeHandlers/UInt64TypeHandler.cs | 102 - .../TypeHandlers/UnknownTypeHandler.cs | 149 -- .../Utilities/ConfigWatcherHandler.cs | 208 -- .../Utilities/Objects/DelegateFactory.cs | 120 -- .../Objects/DelegateObjectFactory.cs | 98 - .../Utilities/Objects/EmitObjectFactory.cs | 93 - .../Utilities/Objects/FactoryBuilder.cs | 151 -- .../Utilities/Objects/FactoryLogAdapter.cs | 121 -- .../Members/DelegateGetFieldAccessor.cs | 116 -- .../Members/DelegatePropertyGetAccessor.cs | 124 -- .../Members/DelegatePropertySetAccessor.cs | 149 -- .../Members/DelegateSetFieldAccessor.cs | 123 -- .../Objects/Members/EmitFieldGetAccessor.cs | 183 -- .../Objects/Members/EmitFieldSetAccessor.cs | 202 -- .../Members/EmitPropertyGetAccessor.cs | 191 -- .../Members/EmitPropertySetAccessor.cs | 223 -- .../Objects/Members/GetAccessorFactory.cs | 248 --- .../Objects/Members/SetAccessorFactory.cs | 247 --- .../Utilities/Objects/ObjectFactory.cs | 73 - ORBatis.Core/Utilities/Resources.cs | 557 ----- .../Commands/IDbDataParameterCollection.cs | 0 .../Configuration/DomSqlMapBuilder.cs | 1836 ----------------- .../ResultMapping/DynamicResultMap.cs | 203 -- ORBatis.Framework/ISqlMapper.cs | 525 ----- .../ResultStrategy/ClassDiagram.cd | 103 - .../ResultStrategy/DynamicMapStrategy.cs | 121 -- ORBatis.Framework/SqlMap.xsd | 853 -------- ORBatis.Framework/SqlMapConfig.xsd | 154 -- .../Commands/DataReaderDecorator.cs | 0 .../Commands/DataReaderTransformer.cs | 0 .../Commands/DbCommandDecorator.cs | 0 .../Commands/DefaultPreparedCommand.cs | 0 .../Commands/IDbDataParameterCollection.cs | 0 .../Commands/IPreparedCommand.cs | 0 .../Commands/InMemoryDataReader.cs | 0 .../Commands/PreparedCommandFactory.cs | 0 .../Configuration/Alias/TypeAlias.cs | 0 .../Configuration/Alias/TypeHandler.cs | 0 .../Configuration/Cache/CacheKey.cs | 0 .../Configuration/Cache/CacheModel.cs | 9 + .../Cache/Fifo/FifoCacheController.cs | 0 .../Configuration/Cache/FlushInterval.cs | 0 .../Configuration/Cache/ICacheController.cs | 0 .../Cache/Lru/LruCacheController.cs | 0 .../Cache/Memory/MemoryCacheControler.cs | 0 .../Cache/Memory/MemoryCacheLevel.cs | 0 .../Configuration/DomSqlMapBuilder.cs | 0 .../InlineParameterMapParser.cs | 0 .../ParameterMapping/ParameterMap.cs | 0 .../ParameterMapping/ParameterProperty.cs | 0 .../ParameterPropertyCollection.cs | 0 .../ResultMapping/ArgumentProperty.cs | 0 .../ResultMapping/AutoResultMap.cs | 0 .../ResultMapping/Discriminator.cs | 0 .../ResultMapping/DynamicResultMap.cs | 0 .../Configuration/ResultMapping/IResultMap.cs | 0 .../ResultMapping/NullResultMap.cs | 0 .../Configuration/ResultMapping/ResultMap.cs | 0 .../ResultMapping/ResultMapCollection.cs | 0 .../ResultMapping/ResultProperty.cs | 0 .../ResultMapping/ResultPropertyCollection.cs | 0 .../Configuration/ResultMapping/SubMap.cs | 0 .../ArgumentPropertyDeSerializer.cs | 0 .../Serializers/CacheModelDeSerializer.cs | 0 .../Serializers/DeSerializerFactory.cs | 0 .../Serializers/DeleteDeSerializer.cs | 0 .../Serializers/DiscriminatorDeSerializer.cs | 0 .../Serializers/DynamicDeSerializer.cs | 0 .../Serializers/IDeSerializer.cs | 0 .../Serializers/InsertDeSerializer.cs | 0 .../Serializers/IsEmptyDeSerializer.cs | 0 .../Serializers/IsEqualDeSerializer.cs | 0 .../Serializers/IsGreaterEqualDeSerializer.cs | 0 .../Serializers/IsGreaterThanDeSerializer.cs | 0 .../Serializers/IsLessEqualDeSerializer.cs | 0 .../Serializers/IsLessThanDeSerializer.cs | 0 .../Serializers/IsNotEmptyDeSerializer.cs | 0 .../Serializers/IsNotEqualDeSerializer.cs | 0 .../Serializers/IsNotNullDeSerializer.cs | 0 .../IsNotParameterPresentDeSerializer.cs | 0 .../IsNotPropertyAvailableDeSerializer.cs | 0 .../Serializers/IsNullDeSerializer.cs | 0 .../IsParameterPresentDeSerializer.cs | 0 .../IsPropertyAvailableDeSerializer.cs | 0 .../Serializers/IterateSerializer.cs | 0 .../Serializers/ParameterMapDeSerializer.cs | 0 .../ParameterPropertyDeSerializer.cs | 0 .../Serializers/ProcedureDeSerializer.cs | 0 .../Serializers/ResultMapDeSerializer.cs | 0 .../Serializers/ResultPropertyDeSerializer.cs | 0 .../Serializers/SelectDeSerializer.cs | 0 .../Serializers/SqlDeSerializer.cs | 0 .../Serializers/StatementDeSerializer.cs | 0 .../Serializers/SubMapDeSerializer.cs | 0 .../Serializers/TypeAliasDeSerializer.cs | 0 .../Serializers/TypeHandlerDeSerializer.cs | 0 .../Serializers/UpdateDeSerializer.cs | 0 .../Configuration/Sql/Dynamic/DynamicSql.cs | 0 .../Sql/Dynamic/Elements/BaseTag.cs | 0 .../Sql/Dynamic/Elements/Conditional.cs | 0 .../Sql/Dynamic/Elements/Dynamic.cs | 0 .../Sql/Dynamic/Elements/IDynamicParent.cs | 0 .../Sql/Dynamic/Elements/IsEmpty.cs | 0 .../Sql/Dynamic/Elements/IsEqual.cs | 0 .../Sql/Dynamic/Elements/IsGreaterEqual.cs | 0 .../Sql/Dynamic/Elements/IsGreaterThan.cs | 0 .../Sql/Dynamic/Elements/IsLessEqual.cs | 0 .../Sql/Dynamic/Elements/IsLessThan.cs | 0 .../Sql/Dynamic/Elements/IsNotEmpty.cs | 0 .../Sql/Dynamic/Elements/IsNotEqual.cs | 0 .../Sql/Dynamic/Elements/IsNotNull.cs | 0 .../Dynamic/Elements/IsNotParameterPresent.cs | 0 .../Elements/IsNotPropertyAvailable.cs | 0 .../Sql/Dynamic/Elements/IsNull.cs | 0 .../Dynamic/Elements/IsParameterPresent.cs | 0 .../Dynamic/Elements/IsPropertyAvailable.cs | 0 .../Sql/Dynamic/Elements/Iterate.cs | 0 .../Sql/Dynamic/Elements/SqlTag.cs | 0 .../Sql/Dynamic/Handlers/BaseTagHandler.cs | 0 .../Dynamic/Handlers/ConditionalTagHandler.cs | 0 .../Sql/Dynamic/Handlers/DynamicTagHandler.cs | 0 .../Sql/Dynamic/Handlers/ISqlTagHandler.cs | 0 .../Sql/Dynamic/Handlers/IsEmptyTagHandler.cs | 0 .../Sql/Dynamic/Handlers/IsEqualTagHandler.cs | 0 .../Handlers/IsGreaterEqualTagHandler.cs | 0 .../Handlers/IsGreaterThanTagHandler.cs | 0 .../Dynamic/Handlers/IsLessEqualTagHandler.cs | 0 .../Dynamic/Handlers/IsLessThanTagHandler.cs | 0 .../Dynamic/Handlers/IsNotEmptyTagHandler.cs | 0 .../Dynamic/Handlers/IsNotEqualTagHandler.cs | 0 .../Dynamic/Handlers/IsNotNullTagHandler.cs | 0 .../IsNotParameterPresentTagHandler.cs | 0 .../IsNotPropertyAvailableTagHandler.cs | 0 .../Sql/Dynamic/Handlers/IsNullTagHandler.cs | 0 .../Handlers/IsParameterPresentTagHandler.cs | 0 .../Handlers/IsPropertyAvailableTagHandler.cs | 0 .../Sql/Dynamic/Handlers/IterateContext.cs | 0 .../Sql/Dynamic/Handlers/IterateTagHandler.cs | 0 .../Sql/Dynamic/Handlers/SqlTagContext.cs | 0 .../Configuration/Sql/Dynamic/ISqlChild.cs | 0 .../Configuration/Sql/Dynamic/SqlText.cs | 0 .../Configuration/Sql/ISql.cs | 0 .../Sql/SimpleDynamic/SimpleDynamicSql.cs | 0 .../Configuration/Sql/Static/ProcedureSql.cs | 0 .../Configuration/Sql/Static/StaticSql.cs | 0 .../Configuration/Statements/Delete.cs | 0 .../Configuration/Statements/Generate.cs | 0 .../Configuration/Statements/IStatement.cs | 0 .../Configuration/Statements/Insert.cs | 0 .../Statements/PreparedStatement.cs | 0 .../Statements/PreparedStatementFactory.cs | 0 .../Configuration/Statements/Procedure.cs | 0 .../Configuration/Statements/Select.cs | 0 .../Configuration/Statements/SelectKey.cs | 0 .../Configuration/Statements/SqlGenerator.cs | 0 .../Configuration/Statements/Statement.cs | 0 .../Configuration/Statements/Update.cs | 0 .../DataExchange/BaseDataExchange.cs | 0 .../DataExchange/ComplexDataExchange.cs | 0 .../DataExchange/DataExchangeFactory.cs | 0 .../DataExchange/DictionaryDataExchange.cs | 0 .../DataExchange/DotNetObjectDataExchange.cs | 0 .../DataExchange/IDataExchange.cs | 0 .../DataExchange/ListDataExchange.cs | 0 .../DataExchange/PrimitiveDataExchange.cs | 0 .../Delegates.cs | 0 .../Enumeration.cs | 0 .../Exceptions/DataMapperException.cs | 0 .../ExecuteEventArgs.cs | 0 .../ISqlMapSession.cs | 0 .../ISqlMapper.cs | 0 .../Logging/ConfigurationSectionHandler.cs | 0 .../Logging/LogManager.cs | 0 .../ArgumentStrategyFactory.cs | 0 .../ArgumentStrategy/DefaultStrategy.cs | 0 .../ArgumentStrategy/IArgumentStrategy.cs | 0 .../ArgumentStrategy/ResultMapStrategy.cs | 0 .../ArgumentStrategy/SelectArrayStrategy.cs | 0 .../SelectGenericListStrategy.cs | 0 .../ArgumentStrategy/SelectListStrategy.cs | 0 .../ArgumentStrategy/SelectObjectStrategy.cs | 0 .../ArgumentStrategy/SelectStrategy.cs | 0 .../MappedStatements/BaseStrategy.cs | 0 .../MappedStatements/CachingStatement.cs | 0 .../MappedStatements/DeleteMappedStatement.cs | 0 .../MappedStatements/IMappedStatement.cs | 0 .../MappedStatements/InsertMappedStatement.cs | 0 .../MappedStatements/MappedStatement.cs | 0 .../MappedStatements/PaginatedList.cs | 0 .../MappedStatements/PostBindind.cs | 0 .../PostSelectStrategy/ArrayStrategy.cs | 0 .../PostSelectStrategy/GenericListStrategy.cs | 0 .../PostSelectStrategy/IPostSelectStrategy.cs | 0 .../PostSelectStrategy/ListStrategy.cs | 0 .../PostSelectStrategy/ObjectStrategy.cs | 0 .../PostSelectStrategyFactory.cs | 0 .../StrongTypedListStrategy.cs | 0 .../PropertStrategy/DefaultStrategy.cs | 0 .../PropertStrategy/GroupByStrategy.cs | 0 .../PropertStrategy/IPropertyStrategy.cs | 0 .../PropertyStrategyFactory.cs | 0 .../PropertStrategy/ResultMapStrategy.cs | 0 .../PropertStrategy/SelectArrayStrategy.cs | 0 .../SelectGenericListStrategy.cs | 0 .../PropertStrategy/SelectListStrategy.cs | 0 .../PropertStrategy/SelectObjectStrategy.cs | 0 .../PropertStrategy/SelectStrategy.cs | 0 .../MappedStatements/ReaderAutoMapper.cs | 0 .../ResultStrategy/AutoMapStrategy.cs | 0 .../ResultStrategy/BaseResultStrategy.cs | 0 .../ResultStrategy/ClassDiagram.cd | 0 .../ResultStrategy/DictionaryStrategy.cs | 0 .../ResultStrategy/DynamicMapStrategy.cs | 0 .../ResultStrategy/GroupByStrategy.cs | 0 .../ResultStrategy/IResultStrategy.cs | 0 .../ResultStrategy/ListStrategy.cs | 0 .../ResultStrategy/MapStrategy.cs | 0 .../ResultStrategy/ObjectStrategy.cs | 0 .../ResultStrategy/ResultClassStrategy.cs | 0 .../ResultStrategy/ResultMapStrategy.cs | 0 .../ResultStrategy/ResultStrategyFactory.cs | 0 .../ResultStrategy/SimpleTypeStrategy.cs | 0 .../MappedStatements/SelectMappedStatement.cs | 0 .../MappedStatements/UpdateMappedStatement.cs | 0 .../Mapper.cs | 0 .../ORBatis.Core.csproj | 1 + .../ORBatis.Framework.csproj | 6 +- .../Properties/AssemblyInfo.cs | 0 .../Proxy/ILazyFactory.cs | 0 .../Proxy/LazyFactoryBuilder.cs | 0 .../Proxy/LazyList.cs | 0 .../Proxy/LazyListFactory.cs | 0 .../Proxy/LazyListGeneric.cs | 0 .../Proxy/LazyListGenericFactory.cs | 0 .../Proxy/LazyLoadInterceptor.cs | 0 .../Proxy/LazyLoadProxyFactory.cs | 0 .../Scope/ConfigurationScope.cs | 0 .../Scope/ErrorContext.cs | 0 .../Scope/IScope.cs | 0 .../Scope/RequestScope.cs | 0 {ORBatis.Core => ORBatis.Mapper}/SqlMap.xsd | 0 .../SqlMapConfig.xsd | 0 .../SqlMapModule.xsd | 0 .../SqlMapSession.cs | 0 .../SqlMapper.cs | 0 .../TypeHandlers/AnsiStringTypeHandler.cs | 0 .../TypeHandlers/BaseTypeHandler.cs | 0 .../TypeHandlers/BooleanTypeHandler.cs | 0 .../TypeHandlers/ByteArrayTypeHandler.cs | 0 .../TypeHandlers/ByteTypeHandler.cs | 0 .../TypeHandlers/CharTypeHandler.cs | 0 .../TypeHandlers/CustomTypeHandler.cs | 0 .../TypeHandlers/DBNullTypeHandler.cs | 0 .../TypeHandlers/DateTimeTypeHandler.cs | 0 .../TypeHandlers/DecimalTypeHandler.cs | 0 .../TypeHandlers/DoubleTypeHandler.cs | 0 .../TypeHandlers/EnumTypeHandler.cs | 0 .../TypeHandlers/GuidTypeHandler.cs | 0 .../TypeHandlers/IParameterSetter.cs | 0 .../TypeHandlers/IResultGetter.cs | 0 .../TypeHandlers/ITypeHandler.cs | 0 .../TypeHandlers/ITypeHandlerCallback.cs | 0 .../TypeHandlers/Int16TypeHandler.cs | 0 .../TypeHandlers/Int32TypeHandler.cs | 0 .../TypeHandlers/Int64TypeHandler.cs | 0 .../Nullables/NullableBooleanTypeHandler.cs | 0 .../Nullables/NullableByteTypeHandler.cs | 0 .../Nullables/NullableCharTypeHandler.cs | 0 .../Nullables/NullableDateTimeTypeHandler.cs | 0 .../Nullables/NullableDecimalTypeHandler.cs | 0 .../Nullables/NullableDoubleTypeHandler.cs | 0 .../Nullables/NullableGuidTypeHandler.cs | 0 .../Nullables/NullableInt16TypeHandler.cs | 0 .../Nullables/NullableInt32TypeHandler.cs | 0 .../Nullables/NullableInt64TypeHandler.cs | 0 .../Nullables/NullableSByteTypeHandler.cs | 0 .../Nullables/NullableSingleTypeHandler.cs | 0 .../Nullables/NullableTimeSpanTypeHandler.cs | 0 .../Nullables/NullableUInt16TypeHandler.cs | 0 .../Nullables/NullableUInt32TypeHandler.cs | 0 .../Nullables/NullableUInt64TypeHandler.cs | 0 .../TypeHandlers/ObjectTypeHandler.cs | 0 .../TypeHandlers/ParameterSetterImpl.cs | 0 .../TypeHandlers/ResultGetterImpl.cs | 0 .../TypeHandlers/SByteTypeHandler.cs | 0 .../TypeHandlers/SingleTypeHandler.cs | 0 .../TypeHandlers/StringTypeHandler.cs | 0 .../TypeHandlers/TimeSpanTypeHandler.cs | 0 .../TypeHandlers/TypeHandlerFactory.cs | 0 .../TypeHandlers/UInt16TypeHandler.cs | 0 .../TypeHandlers/UInt32TypeHandler.cs | 0 .../TypeHandlers/UInt64TypeHandler.cs | 0 .../TypeHandlers/UnknownTypeHandler.cs | 0 .../Utilities/ConfigWatcherHandler.cs | 0 .../Utilities/Objects/DelegateFactory.cs | 0 .../Objects/DelegateObjectFactory.cs | 0 .../Utilities/Objects/EmitObjectFactory.cs | 0 .../Utilities/Objects/FactoryBuilder.cs | 0 .../Utilities/Objects/FactoryLogAdapter.cs | 0 .../Members/DelegateGetFieldAccessor.cs | 0 .../Members/DelegatePropertyGetAccessor.cs | 0 .../Members/DelegatePropertySetAccessor.cs | 0 .../Members/DelegateSetFieldAccessor.cs | 0 .../Objects/Members/EmitFieldGetAccessor.cs | 0 .../Objects/Members/EmitFieldSetAccessor.cs | 0 .../Members/EmitPropertyGetAccessor.cs | 0 .../Members/EmitPropertySetAccessor.cs | 0 .../Objects/Members/GetAccessorFactory.cs | 0 .../Objects/Members/SetAccessorFactory.cs | 0 .../Utilities/Objects/ObjectFactory.cs | 0 .../Utilities/Resources.cs | 0 .../packages.config | 0 ORBatis.Test.Core/Config/SqlMap.config | 23 - .../ORBatis.Framework.Test.csproj | 121 -- .../Tests/BasicFunctionalityFacts.cs | 55 - ORBatis.Test.Framework/App.config | 17 - .../TypeHandlers/GuidByteArray.cs | 40 - .../TypeHandlers/NullableEnum.cs | 36 - ORBatis.Test.Framework/packages.config | 20 - .../App.config | 0 .../Config/SqlMap.config | 6 +- .../ORBatis.Test.Core.csproj | 5 +- .../ORBatis.Test.Framework.csproj | 10 +- .../Properties/AssemblyInfo.cs | 0 .../Tests/BasicFunctionalityFacts.cs | 13 +- .../TypeHandlers/GuidByteArray.cs | 3 +- .../TypeHandlers/NullableEnum.cs | 2 +- .../packages.config | 0 ORBatis.sln | 8 +- 580 files changed, 41 insertions(+), 38253 deletions(-) delete mode 100644 ORBatis.Core/Commands/DataReaderDecorator.cs delete mode 100644 ORBatis.Core/Commands/DataReaderTransformer.cs delete mode 100644 ORBatis.Core/Commands/DbCommandDecorator.cs delete mode 100644 ORBatis.Core/Commands/DefaultPreparedCommand.cs delete mode 100644 ORBatis.Core/Commands/IPreparedCommand.cs delete mode 100644 ORBatis.Core/Commands/InMemoryDataReader.cs delete mode 100644 ORBatis.Core/Commands/PreparedCommandFactory.cs delete mode 100644 ORBatis.Core/Configuration/Alias/TypeAlias.cs delete mode 100644 ORBatis.Core/Configuration/Alias/TypeHandler.cs delete mode 100644 ORBatis.Core/Configuration/Cache/CacheKey.cs delete mode 100644 ORBatis.Core/Configuration/Cache/CacheModel.cs delete mode 100644 ORBatis.Core/Configuration/Cache/Fifo/FifoCacheController.cs delete mode 100644 ORBatis.Core/Configuration/Cache/FlushInterval.cs delete mode 100644 ORBatis.Core/Configuration/Cache/ICacheController.cs delete mode 100644 ORBatis.Core/Configuration/Cache/Lru/LruCacheController.cs delete mode 100644 ORBatis.Core/Configuration/Cache/Memory/MemoryCacheControler.cs delete mode 100644 ORBatis.Core/Configuration/Cache/Memory/MemoryCacheLevel.cs delete mode 100644 ORBatis.Core/Configuration/ParameterMapping/InlineParameterMapParser.cs delete mode 100644 ORBatis.Core/Configuration/ParameterMapping/ParameterMap.cs delete mode 100644 ORBatis.Core/Configuration/ParameterMapping/ParameterProperty.cs delete mode 100644 ORBatis.Core/Configuration/ParameterMapping/ParameterPropertyCollection.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/ArgumentProperty.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/AutoResultMap.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/Discriminator.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/IResultMap.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/NullResultMap.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/ResultMap.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/ResultMapCollection.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/ResultProperty.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/ResultPropertyCollection.cs delete mode 100644 ORBatis.Core/Configuration/ResultMapping/SubMap.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/ArgumentPropertyDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/CacheModelDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/DeSerializerFactory.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/DeleteDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/DiscriminatorDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/DynamicDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/InsertDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsEmptyDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsEqualDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsGreaterEqualDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsGreaterThanDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsLessEqualDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsLessThanDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsNotEmptyDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsNotEqualDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsNotNullDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsNullDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsParameterPresentDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/IterateSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/ParameterMapDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/ParameterPropertyDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/ProcedureDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/ResultMapDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/ResultPropertyDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/SelectDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/SqlDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/StatementDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/SubMapDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/TypeAliasDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/TypeHandlerDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Serializers/UpdateDeSerializer.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/DynamicSql.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/BaseTag.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/Conditional.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/Dynamic.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEmpty.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEqual.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessThan.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotNull.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNull.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/Iterate.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Elements/SqlTag.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateContext.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/ISqlChild.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Dynamic/SqlText.cs delete mode 100644 ORBatis.Core/Configuration/Sql/ISql.cs delete mode 100644 ORBatis.Core/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Static/ProcedureSql.cs delete mode 100644 ORBatis.Core/Configuration/Sql/Static/StaticSql.cs delete mode 100644 ORBatis.Core/Configuration/Statements/Delete.cs delete mode 100644 ORBatis.Core/Configuration/Statements/Generate.cs delete mode 100644 ORBatis.Core/Configuration/Statements/IStatement.cs delete mode 100644 ORBatis.Core/Configuration/Statements/Insert.cs delete mode 100644 ORBatis.Core/Configuration/Statements/PreparedStatement.cs delete mode 100644 ORBatis.Core/Configuration/Statements/PreparedStatementFactory.cs delete mode 100644 ORBatis.Core/Configuration/Statements/Procedure.cs delete mode 100644 ORBatis.Core/Configuration/Statements/Select.cs delete mode 100644 ORBatis.Core/Configuration/Statements/SelectKey.cs delete mode 100644 ORBatis.Core/Configuration/Statements/SqlGenerator.cs delete mode 100644 ORBatis.Core/Configuration/Statements/Statement.cs delete mode 100644 ORBatis.Core/Configuration/Statements/Update.cs delete mode 100644 ORBatis.Core/DataExchange/BaseDataExchange.cs delete mode 100644 ORBatis.Core/DataExchange/ComplexDataExchange.cs delete mode 100644 ORBatis.Core/DataExchange/DataExchangeFactory.cs delete mode 100644 ORBatis.Core/DataExchange/DictionaryDataExchange.cs delete mode 100644 ORBatis.Core/DataExchange/DotNetObjectDataExchange.cs delete mode 100644 ORBatis.Core/DataExchange/IDataExchange.cs delete mode 100644 ORBatis.Core/DataExchange/ListDataExchange.cs delete mode 100644 ORBatis.Core/DataExchange/PrimitiveDataExchange.cs delete mode 100644 ORBatis.Core/Delegates.cs delete mode 100644 ORBatis.Core/Enumeration.cs delete mode 100644 ORBatis.Core/Exceptions/DataMapperException.cs delete mode 100644 ORBatis.Core/ExecuteEventArgs.cs delete mode 100644 ORBatis.Core/ISqlMapSession.cs delete mode 100644 ORBatis.Core/Logging/ConfigurationSectionHandler.cs delete mode 100644 ORBatis.Core/Logging/LogManager.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/DefaultStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/SelectListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ArgumentStrategy/SelectStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/BaseStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/CachingStatement.cs delete mode 100644 ORBatis.Core/MappedStatements/DeleteMappedStatement.cs delete mode 100644 ORBatis.Core/MappedStatements/IMappedStatement.cs delete mode 100644 ORBatis.Core/MappedStatements/InsertMappedStatement.cs delete mode 100644 ORBatis.Core/MappedStatements/MappedStatement.cs delete mode 100644 ORBatis.Core/MappedStatements/PaginatedList.cs delete mode 100644 ORBatis.Core/MappedStatements/PostBindind.cs delete mode 100644 ORBatis.Core/MappedStatements/PostSelectStrategy/ArrayStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PostSelectStrategy/GenericListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PostSelectStrategy/ListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PostSelectStrategy/ObjectStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs delete mode 100644 ORBatis.Core/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/DefaultStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/GroupByStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/IPropertyStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/ResultMapStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/SelectArrayStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/SelectListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/SelectObjectStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/PropertStrategy/SelectStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ReaderAutoMapper.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/AutoMapStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/BaseResultStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/DictionaryStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/GroupByStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/IResultStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/ListStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/MapStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/ObjectStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/ResultClassStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/ResultMapStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/ResultStrategyFactory.cs delete mode 100644 ORBatis.Core/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs delete mode 100644 ORBatis.Core/MappedStatements/SelectMappedStatement.cs delete mode 100644 ORBatis.Core/MappedStatements/UpdateMappedStatement.cs delete mode 100644 ORBatis.Core/Mapper.cs delete mode 100644 ORBatis.Core/Proxy/ILazyFactory.cs delete mode 100644 ORBatis.Core/Proxy/LazyFactoryBuilder.cs delete mode 100644 ORBatis.Core/Proxy/LazyList.cs delete mode 100644 ORBatis.Core/Proxy/LazyListFactory.cs delete mode 100644 ORBatis.Core/Proxy/LazyListGeneric.cs delete mode 100644 ORBatis.Core/Proxy/LazyListGenericFactory.cs delete mode 100644 ORBatis.Core/Proxy/LazyLoadInterceptor.cs delete mode 100644 ORBatis.Core/Proxy/LazyLoadProxyFactory.cs delete mode 100644 ORBatis.Core/Scope/ConfigurationScope.cs delete mode 100644 ORBatis.Core/Scope/ErrorContext.cs delete mode 100644 ORBatis.Core/Scope/IScope.cs delete mode 100644 ORBatis.Core/Scope/RequestScope.cs delete mode 100644 ORBatis.Core/SqlMapSession.cs delete mode 100644 ORBatis.Core/SqlMapper.cs delete mode 100644 ORBatis.Core/TypeHandlers/AnsiStringTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/BaseTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/BooleanTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/ByteArrayTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/ByteTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/CharTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/CustomTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/DBNullTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/DateTimeTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/DecimalTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/DoubleTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/EnumTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/GuidTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/IParameterSetter.cs delete mode 100644 ORBatis.Core/TypeHandlers/IResultGetter.cs delete mode 100644 ORBatis.Core/TypeHandlers/ITypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/ITypeHandlerCallback.cs delete mode 100644 ORBatis.Core/TypeHandlers/Int16TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Int32TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Int64TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableByteTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableCharTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableGuidTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableInt16TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableInt32TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableInt64TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableSByteTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableSingleTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/ObjectTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/ParameterSetterImpl.cs delete mode 100644 ORBatis.Core/TypeHandlers/ResultGetterImpl.cs delete mode 100644 ORBatis.Core/TypeHandlers/SByteTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/SingleTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/StringTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/TimeSpanTypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/TypeHandlerFactory.cs delete mode 100644 ORBatis.Core/TypeHandlers/UInt16TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/UInt32TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/UInt64TypeHandler.cs delete mode 100644 ORBatis.Core/TypeHandlers/UnknownTypeHandler.cs delete mode 100644 ORBatis.Core/Utilities/ConfigWatcherHandler.cs delete mode 100644 ORBatis.Core/Utilities/Objects/DelegateFactory.cs delete mode 100644 ORBatis.Core/Utilities/Objects/DelegateObjectFactory.cs delete mode 100644 ORBatis.Core/Utilities/Objects/EmitObjectFactory.cs delete mode 100644 ORBatis.Core/Utilities/Objects/FactoryBuilder.cs delete mode 100644 ORBatis.Core/Utilities/Objects/FactoryLogAdapter.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/DelegateGetFieldAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/DelegatePropertySetAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/DelegateSetFieldAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/EmitFieldGetAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/EmitFieldSetAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/EmitPropertyGetAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/EmitPropertySetAccessor.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/GetAccessorFactory.cs delete mode 100644 ORBatis.Core/Utilities/Objects/Members/SetAccessorFactory.cs delete mode 100644 ORBatis.Core/Utilities/Objects/ObjectFactory.cs delete mode 100644 ORBatis.Core/Utilities/Resources.cs delete mode 100644 ORBatis.Framework/Commands/IDbDataParameterCollection.cs delete mode 100644 ORBatis.Framework/Configuration/DomSqlMapBuilder.cs delete mode 100644 ORBatis.Framework/Configuration/ResultMapping/DynamicResultMap.cs delete mode 100644 ORBatis.Framework/ISqlMapper.cs delete mode 100644 ORBatis.Framework/MappedStatements/ResultStrategy/ClassDiagram.cd delete mode 100644 ORBatis.Framework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs delete mode 100644 ORBatis.Framework/SqlMap.xsd delete mode 100644 ORBatis.Framework/SqlMapConfig.xsd rename {ORBatis.Framework => ORBatis.Mapper}/Commands/DataReaderDecorator.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Commands/DataReaderTransformer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Commands/DbCommandDecorator.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Commands/DefaultPreparedCommand.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/Commands/IDbDataParameterCollection.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Commands/IPreparedCommand.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Commands/InMemoryDataReader.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Commands/PreparedCommandFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Alias/TypeAlias.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Alias/TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/CacheKey.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/CacheModel.cs (98%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/Fifo/FifoCacheController.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/FlushInterval.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/ICacheController.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/Lru/LruCacheController.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/Memory/MemoryCacheControler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Cache/Memory/MemoryCacheLevel.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/Configuration/DomSqlMapBuilder.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ParameterMapping/InlineParameterMapParser.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ParameterMapping/ParameterMap.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ParameterMapping/ParameterProperty.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ParameterMapping/ParameterPropertyCollection.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/ArgumentProperty.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/AutoResultMap.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/Discriminator.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/Configuration/ResultMapping/DynamicResultMap.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/IResultMap.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/NullResultMap.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/ResultMap.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/ResultMapCollection.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/ResultProperty.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/ResultPropertyCollection.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/ResultMapping/SubMap.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/ArgumentPropertyDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/CacheModelDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/DeSerializerFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/DeleteDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/DiscriminatorDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/DynamicDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/InsertDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsEmptyDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsEqualDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsGreaterEqualDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsGreaterThanDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsLessEqualDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsLessThanDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsNotEmptyDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsNotEqualDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsNotNullDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsNullDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsParameterPresentDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/IterateSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/ParameterMapDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/ParameterPropertyDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/ProcedureDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/ResultMapDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/ResultPropertyDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/SelectDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/SqlDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/StatementDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/SubMapDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/TypeAliasDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/TypeHandlerDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Serializers/UpdateDeSerializer.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/DynamicSql.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/BaseTag.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/Conditional.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/Dynamic.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsEmpty.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsEqual.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsLessThan.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsNotNull.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsNull.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/Iterate.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Elements/SqlTag.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IterateContext.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/ISqlChild.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Dynamic/SqlText.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/ISql.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Static/ProcedureSql.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Sql/Static/StaticSql.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/Delete.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/Generate.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/IStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/Insert.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/PreparedStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/PreparedStatementFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/Procedure.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/Select.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/SelectKey.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/SqlGenerator.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/Statement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Configuration/Statements/Update.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/BaseDataExchange.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/ComplexDataExchange.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/DataExchangeFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/DictionaryDataExchange.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/DotNetObjectDataExchange.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/IDataExchange.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/ListDataExchange.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/DataExchange/PrimitiveDataExchange.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Delegates.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Enumeration.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Exceptions/DataMapperException.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/ExecuteEventArgs.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/ISqlMapSession.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/ISqlMapper.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Logging/ConfigurationSectionHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Logging/LogManager.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/DefaultStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/SelectListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ArgumentStrategy/SelectStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/BaseStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/CachingStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/DeleteMappedStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/IMappedStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/InsertMappedStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/MappedStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PaginatedList.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostBindind.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostSelectStrategy/ArrayStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostSelectStrategy/GenericListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostSelectStrategy/ListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostSelectStrategy/ObjectStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/DefaultStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/GroupByStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/IPropertyStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/ResultMapStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/SelectArrayStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/SelectListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/SelectObjectStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/PropertStrategy/SelectStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ReaderAutoMapper.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/AutoMapStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/BaseResultStrategy.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/MappedStatements/ResultStrategy/ClassDiagram.cd (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/DictionaryStrategy.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/MappedStatements/ResultStrategy/DynamicMapStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/GroupByStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/IResultStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/ListStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/MapStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/ObjectStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/ResultClassStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/ResultMapStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/ResultStrategyFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/SelectMappedStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/MappedStatements/UpdateMappedStatement.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Mapper.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/ORBatis.Core.csproj (94%) rename {ORBatis.Framework => ORBatis.Mapper}/ORBatis.Framework.csproj (99%) rename {ORBatis.Framework => ORBatis.Mapper}/Properties/AssemblyInfo.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/ILazyFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/LazyFactoryBuilder.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/LazyList.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/LazyListFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/LazyListGeneric.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/LazyListGenericFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/LazyLoadInterceptor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Proxy/LazyLoadProxyFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Scope/ConfigurationScope.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Scope/ErrorContext.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Scope/IScope.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Scope/RequestScope.cs (100%) rename {ORBatis.Core => ORBatis.Mapper}/SqlMap.xsd (100%) rename {ORBatis.Core => ORBatis.Mapper}/SqlMapConfig.xsd (100%) rename {ORBatis.Framework => ORBatis.Mapper}/SqlMapModule.xsd (100%) rename {ORBatis.Framework => ORBatis.Mapper}/SqlMapSession.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/SqlMapper.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/AnsiStringTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/BaseTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/BooleanTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/ByteArrayTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/ByteTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/CharTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/CustomTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/DBNullTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/DateTimeTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/DecimalTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/DoubleTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/EnumTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/GuidTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/IParameterSetter.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/IResultGetter.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/ITypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/ITypeHandlerCallback.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Int16TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Int32TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Int64TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableByteTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableCharTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableGuidTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableInt16TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableInt32TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableInt64TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableSByteTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableSingleTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/ObjectTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/ParameterSetterImpl.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/ResultGetterImpl.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/SByteTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/SingleTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/StringTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/TimeSpanTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/TypeHandlerFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/UInt16TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/UInt32TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/UInt64TypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/TypeHandlers/UnknownTypeHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/ConfigWatcherHandler.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/DelegateFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/DelegateObjectFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/EmitObjectFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/FactoryBuilder.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/FactoryLogAdapter.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/DelegateGetFieldAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/DelegatePropertySetAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/DelegateSetFieldAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/EmitFieldGetAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/EmitFieldSetAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/EmitPropertyGetAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/EmitPropertySetAccessor.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/GetAccessorFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/Members/SetAccessorFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Objects/ObjectFactory.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/Utilities/Resources.cs (100%) rename {ORBatis.Framework => ORBatis.Mapper}/packages.config (100%) delete mode 100644 ORBatis.Test.Core/Config/SqlMap.config delete mode 100644 ORBatis.Test.Core/ORBatis.Framework.Test.csproj delete mode 100644 ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs delete mode 100644 ORBatis.Test.Framework/App.config delete mode 100644 ORBatis.Test.Framework/TypeHandlers/GuidByteArray.cs delete mode 100644 ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs delete mode 100644 ORBatis.Test.Framework/packages.config rename {ORBatis.Test.Core => ORBatis.Test}/App.config (100%) rename {ORBatis.Test.Framework => ORBatis.Test}/Config/SqlMap.config (78%) rename {ORBatis.Test.Core => ORBatis.Test}/ORBatis.Test.Core.csproj (81%) rename {ORBatis.Test.Framework => ORBatis.Test}/ORBatis.Test.Framework.csproj (96%) rename {ORBatis.Test.Framework => ORBatis.Test}/Properties/AssemblyInfo.cs (100%) rename {ORBatis.Test.Framework => ORBatis.Test}/Tests/BasicFunctionalityFacts.cs (83%) rename {ORBatis.Test.Core => ORBatis.Test}/TypeHandlers/GuidByteArray.cs (95%) rename {ORBatis.Test.Core => ORBatis.Test}/TypeHandlers/NullableEnum.cs (95%) rename {ORBatis.Test.Core => ORBatis.Test}/packages.config (100%) diff --git a/ORBatis.Core/Commands/DataReaderDecorator.cs b/ORBatis.Core/Commands/DataReaderDecorator.cs deleted file mode 100644 index 3023fcd..0000000 --- a/ORBatis.Core/Commands/DataReaderDecorator.cs +++ /dev/null @@ -1,489 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2005 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.DataMapper.Scope; -using System.Configuration; -using System.Data; -using System.Globalization; - -namespace IBatisNet.DataMapper.Commands; - -/// -/// Decorate an -/// to auto move to next ResultMap on NextResult call. -/// -public class DataReaderDecorator : IDataReader -{ - private readonly IDataReader _innerDataReader; - private readonly RequestScope _request; - - /// - /// Initializes a new instance of the class. - /// - /// The data reader. - /// The request scope - public DataReaderDecorator(IDataReader dataReader, RequestScope request) - { - _innerDataReader = dataReader; - _request = request; - } - - #region IDisposable Members - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - void IDisposable.Dispose() - { - _innerDataReader.Dispose(); - } - #endregion - - #region IDataReader Members - /// - /// Closes the 0bject. - /// - void IDataReader.Close() - { - _innerDataReader.Close(); - } - - /// - /// Gets a value indicating the depth of nesting for the current row. - /// - /// - /// The level of nesting. - int IDataReader.Depth => _innerDataReader.Depth; - - /// - /// Returns a that describes the column metadata of the - /// . - /// - /// - /// A that describes the column metadata. - /// - /// The is closed. - DataTable IDataReader.GetSchemaTable() - { - return _innerDataReader.GetSchemaTable(); - } - - /// - /// Gets a value indicating whether the data reader is closed. - /// - /// - /// true if the data reader is closed; otherwise, false. - bool IDataReader.IsClosed => _innerDataReader.IsClosed; - - /// - /// Advances the data reader to the next result, when reading the results of batch SQL statements. - /// - /// - /// true if there are more rows; otherwise, false. - /// - bool IDataReader.NextResult() - { - _request.MoveNextResultMap(); - return _innerDataReader.NextResult(); - } - - /// - /// Advances the to the next record. - /// - /// - /// true if there are more rows; otherwise, false. - /// - bool IDataReader.Read() - { - return _innerDataReader.Read(); - } - - int IDataReader.RecordsAffected => _innerDataReader.RecordsAffected; - #endregion - - #region IDataRecord Members - /// - /// Gets the number of columns in the current row. - /// - /// - /// - /// When not positioned in a valid recordset, 0; otherwise the number of columns in the current record. The - /// default is -1. - /// - int IDataRecord.FieldCount => _innerDataReader.FieldCount; - - /// - /// Gets the value of the specified column as a Boolean. - /// - /// The zero-based column ordinal. - /// The value of the column. - /// - /// The index passed was outside the range of 0 through - /// . - /// - bool IDataRecord.GetBoolean(int i) - { - return _innerDataReader.GetBoolean(i); - } - - /// - /// Gets the 8-bit unsigned integer value of the specified column. - /// - /// The zero-based column ordinal. - /// - /// The 8-bit unsigned integer value of the specified column. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - byte IDataRecord.GetByte(int i) - { - return _innerDataReader.GetByte(i); - } - - /// - /// Reads a stream of bytes from the specified column offset into the buffer as an array, starting at the given buffer - /// offset. - /// - /// The zero-based column ordinal. - /// The index within the field from which to start the read operation. - /// The buffer into which to read the stream of bytes. - /// The index for buffer to start the read operation. - /// The number of bytes to read. - /// The actual number of bytes read. - /// - /// The index passed was outside the range of 0 through - /// . - /// - long IDataRecord.GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length) - { - return _innerDataReader.GetBytes(i, fieldOffset, buffer, bufferoffset, length); - } - - /// - /// Gets the character value of the specified column. - /// - /// The zero-based column ordinal. - /// - /// The character value of the specified column. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - char IDataRecord.GetChar(int i) - { - return _innerDataReader.GetChar(i); - } - - /// - /// Reads a stream of characters from the specified column offset into the buffer as an array, starting at the given - /// buffer offset. - /// - /// The zero-based column ordinal. - /// The index within the row from which to start the read operation. - /// The buffer into which to read the stream of bytes. - /// The index for buffer to start the read operation. - /// The number of bytes to read. - /// The actual number of characters read. - /// - /// The index passed was outside the range of 0 through - /// . - /// - long IDataRecord.GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length) - { - return _innerDataReader.GetChars(i, fieldoffset, buffer, bufferoffset, length); - } - - /// - /// Gets an to be used when the field points to more remote structured data. - /// - /// The index of the field to find. - /// - /// An to be used when the field points to more remote structured data. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - IDataReader IDataRecord.GetData(int i) - { - return _innerDataReader.GetData(i); - } - - /// - /// Gets the data type information for the specified field. - /// - /// The index of the field to find. - /// - /// The data type information for the specified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - string IDataRecord.GetDataTypeName(int i) - { - return _innerDataReader.GetDataTypeName(i); - } - - /// - /// Gets the date and time data value of the specified field. - /// - /// The index of the field to find. - /// - /// The date and time data value of the spcified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - DateTime IDataRecord.GetDateTime(int i) - { - var dateTimeFormat = ConfigurationManager.AppSettings["dateTimeFormat"]; - - if (!string.IsNullOrWhiteSpace(dateTimeFormat) && _innerDataReader.GetFieldType(i) == typeof(string)) return DateTime.ParseExact(_innerDataReader.GetString(i), dateTimeFormat, CultureInfo.InvariantCulture); - - return _innerDataReader.GetDateTime(i); - } - - /// - /// Gets the fixed-position numeric value of the specified field. - /// - /// The index of the field to find. - /// - /// The fixed-position numeric value of the specified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - decimal IDataRecord.GetDecimal(int i) - { - return _innerDataReader.GetDecimal(i); - } - - /// - /// Gets the double-precision floating point number of the specified field. - /// - /// The index of the field to find. - /// - /// The double-precision floating point number of the specified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - double IDataRecord.GetDouble(int i) - { - return _innerDataReader.GetDouble(i); - } - - /// - /// Gets the information corresponding to the type of - /// that would be returned from . - /// - /// The index of the field to find. - /// - /// The information corresponding to the type of that - /// would be returned from . - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - Type IDataRecord.GetFieldType(int i) - { - return _innerDataReader.GetFieldType(i); - } - - /// - /// Gets the single-precision floating point number of the specified field. - /// - /// The index of the field to find. - /// - /// The single-precision floating point number of the specified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - float IDataRecord.GetFloat(int i) - { - return _innerDataReader.GetFloat(i); - } - - /// - /// Returns the GUID value of the specified field. - /// - /// The index of the field to find. - /// The GUID value of the specified field. - /// - /// The index passed was outside the range of 0 through - /// . - /// - Guid IDataRecord.GetGuid(int i) - { - return _innerDataReader.GetGuid(i); - } - - /// - /// Gets the 16-bit signed integer value of the specified field. - /// - /// The index of the field to find. - /// - /// The 16-bit signed integer value of the specified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - short IDataRecord.GetInt16(int i) - { - return _innerDataReader.GetInt16(i); - } - - /// - /// Gets the 32-bit signed integer value of the specified field. - /// - /// The index of the field to find. - /// - /// The 32-bit signed integer value of the specified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - int IDataRecord.GetInt32(int i) - { - return _innerDataReader.GetInt32(i); - } - - /// - /// Gets the 64-bit signed integer value of the specified field. - /// - /// The index of the field to find. - /// - /// The 64-bit signed integer value of the specified field. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - long IDataRecord.GetInt64(int i) - { - return _innerDataReader.GetInt64(i); - } - - /// - /// Gets the name for the field to find. - /// - /// The index of the field to find. - /// - /// The name of the field or the empty string (""), if there is no value to return. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - string IDataRecord.GetName(int i) - { - return _innerDataReader.GetName(i); - } - - /// - /// Return the index of the named field. - /// - /// The name of the field to find. - /// The index of the named field. - int IDataRecord.GetOrdinal(string name) - { - return _innerDataReader.GetOrdinal(name); - } - - /// - /// Gets the string value of the specified field. - /// - /// The index of the field to find. - /// The string value of the specified field. - /// - /// The index passed was outside the range of 0 through - /// . - /// - string IDataRecord.GetString(int i) - { - return _innerDataReader.GetString(i); - } - - /// - /// Return the value of the specified field. - /// - /// The index of the field to find. - /// - /// The which will contain the field value upon return. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - object IDataRecord.GetValue(int i) - { - return _innerDataReader.GetValue(i); - } - - int IDataRecord.GetValues(object[] values) - { - return _innerDataReader.GetValues(values); - } - - /// - /// Return whether the specified field is set to null. - /// - /// The index of the field to find. - /// - /// true if the specified field is set to null. Otherwise, false. - /// - /// - /// The index passed was outside the range of 0 through - /// . - /// - bool IDataRecord.IsDBNull(int i) - { - return _innerDataReader.IsDBNull(i); - } - - /// - /// Gets the with the specified name. - /// - /// - object IDataRecord.this[string name] => _innerDataReader[name]; - - /// - /// Gets the with the specified i. - /// - /// - object IDataRecord.this[int i] => _innerDataReader[i]; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Commands/DataReaderTransformer.cs b/ORBatis.Core/Commands/DataReaderTransformer.cs deleted file mode 100644 index 3bb7756..0000000 --- a/ORBatis.Core/Commands/DataReaderTransformer.cs +++ /dev/null @@ -1,50 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common; -using System.Data; - -namespace IBatisNet.DataMapper.Commands; - -/// -/// For which don't support M.A.R.S, wraps the current -/// in an . -/// -public sealed class DataReaderTransformer -{ - /// - /// Creates a DataReaderAdapter from a - /// - /// The which holds the records from the Database. - /// The databse provider - public static IDataReader Transform(IDataReader reader, IDbProvider dbProvider) - { - if (!dbProvider.AllowMARS && !(reader is InMemoryDataReader)) - // The underlying reader will be closed. - return new InMemoryDataReader(reader); - - return reader; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Commands/DbCommandDecorator.cs b/ORBatis.Core/Commands/DbCommandDecorator.cs deleted file mode 100644 index 19a74a6..0000000 --- a/ORBatis.Core/Commands/DbCommandDecorator.cs +++ /dev/null @@ -1,231 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 383115 $ - * $Date: 2006-11-15 13:22:00 -0700 (Wed, 15 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2005 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.DataMapper.Scope; -using System.Data; - -namespace IBatisNet.DataMapper.Commands; - -/// -/// Decorate an -/// to auto move to next ResultMap on ExecuteReader call. -/// -public class DbCommandDecorator : IDbCommand -{ - private readonly IDbCommand _innerDbCommand; - private readonly RequestScope _request; - - /// - /// Initializes a new instance of the class. - /// - /// The db command. - /// The request scope - public DbCommandDecorator(IDbCommand dbCommand, RequestScope request) - { - _request = request; - _innerDbCommand = dbCommand; - } - - #region IDisposable Members - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - void IDisposable.Dispose() - { - _innerDbCommand.Dispose(); - } - #endregion - - - #region IDbCommand Members - /// - /// Attempts to cancels the execution of an . - /// - void IDbCommand.Cancel() - { - _innerDbCommand.Cancel(); - } - - /// - /// Gets or sets the text command to run against the data source. - /// - /// - /// The text command to execute. The default value is an empty string (""). - string IDbCommand.CommandText - { - get => _innerDbCommand.CommandText; - set => _innerDbCommand.CommandText = value; - } - - /// - /// Gets or sets the wait time before terminating the attempt to execute a command and generating an error. - /// - /// - /// The time (in seconds) to wait for the command to execute. The default value is 30 seconds. - /// The property value assigned is less than 0. - int IDbCommand.CommandTimeout - { - get => _innerDbCommand.CommandTimeout; - set => _innerDbCommand.CommandTimeout = value; - } - - /// - /// Indicates or specifies how the property is interpreted. - /// - /// - /// One of the values. The default is Text. - CommandType IDbCommand.CommandType - { - get => _innerDbCommand.CommandType; - set => _innerDbCommand.CommandType = value; - } - - /// - /// Gets or sets the used by this instance of the - /// . - /// - /// - /// The connection to the data source. - IDbConnection IDbCommand.Connection - { - get => _innerDbCommand.Connection; - set => _innerDbCommand.Connection = value; - } - - /// - /// Creates a new instance of an object. - /// - /// An IDbDataParameter object. - IDbDataParameter IDbCommand.CreateParameter() - { - return _innerDbCommand.CreateParameter(); - } - - /// - /// Executes an SQL statement against the Connection object of a .NET Framework data provider, and returns the number - /// of rows affected. - /// - /// The number of rows affected. - /// The connection does not exist.-or- The connection is not open. - int IDbCommand.ExecuteNonQuery() - { - _request.Session.OpenConnection(); - return _innerDbCommand.ExecuteNonQuery(); - } - - /// - /// Executes the against the - /// , and builds an - /// using one of the values. - /// - /// One of the values. - /// - /// An object. - /// - IDataReader IDbCommand.ExecuteReader(CommandBehavior behavior) - { - _request.Session.OpenConnection(); - return _innerDbCommand.ExecuteReader(behavior); - } - - /// - /// Executes the against the - /// and builds an . - /// - /// - /// An object. - /// - IDataReader IDbCommand.ExecuteReader() - { - _request.Session.OpenConnection(); - _request.MoveNextResultMap(); - return new DataReaderDecorator(_innerDbCommand.ExecuteReader(), _request); - } - - /// - /// Executes the query, and returns the first column of the first row in the resultset returned by the query. Extra - /// columns or rows are ignored. - /// - /// - /// The first column of the first row in the resultset. - /// - object IDbCommand.ExecuteScalar() - { - _request.Session.OpenConnection(); - return _innerDbCommand.ExecuteScalar(); - } - - /// - /// Gets the . - /// - /// - /// The parameters of the SQL statement or stored procedure. - IDataParameterCollection IDbCommand.Parameters => _innerDbCommand.Parameters; - - /// - /// Creates a prepared (or compiled) version of the command on the data source. - /// - /// - /// The - /// is not set.-or- The is not - /// . - /// - void IDbCommand.Prepare() - { - _innerDbCommand.Prepare(); - } - - /// - /// Gets or sets the transaction within which the Command object of a .NET Framework data provider executes. - /// - /// - /// the Command object of a .NET Framework data provider executes. The default value is null. - IDbTransaction IDbCommand.Transaction - { - get => _innerDbCommand.Transaction; - set => _innerDbCommand.Transaction = value; - } - - /// - /// Gets or sets how command results are applied to the when used by the - /// method of a - /// . - /// - /// - /// - /// One of the values. The default is Both unless the command is - /// automatically generated. Then the default is None. - /// - /// - /// The value entered was not one of the - /// values. - /// - UpdateRowSource IDbCommand.UpdatedRowSource - { - get => _innerDbCommand.UpdatedRowSource; - set => _innerDbCommand.UpdatedRowSource = value; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Commands/DefaultPreparedCommand.cs b/ORBatis.Core/Commands/DefaultPreparedCommand.cs deleted file mode 100644 index 360b9e3..0000000 --- a/ORBatis.Core/Commands/DefaultPreparedCommand.cs +++ /dev/null @@ -1,201 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 591573 $ - * $Date: 2007-11-03 04:17:59 -0600 (Sat, 03 Nov 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2005 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Logging; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; -using System.Data; -using System.Reflection; -using System.Text; -#endregion - -namespace IBatisNet.DataMapper.Commands; - -/// -/// Summary description for DefaultPreparedCommand. -/// -internal class DefaultPreparedCommand : IPreparedCommand -{ - private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - #region IPreparedCommand Members - /// - /// Create an IDbCommand for the SqlMapSession and the current SQL Statement - /// and fill IDbCommand IDataParameter's with the parameterObject. - /// - /// - /// The SqlMapSession - /// The IStatement - /// - /// The parameter object that will fill the sql parameter - /// - /// An IDbCommand with all the IDataParameter filled. - public void Create(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject) - { - // the IDbConnection & the IDbTransaction are assign in the CreateCommand - request.IDbCommand = new DbCommandDecorator(session.CreateCommand(statement.CommandType), request); - - request.IDbCommand.CommandText = request.PreparedStatement.PreparedSql; - - if (_logger.IsDebugEnabled) _logger.Debug("Statement Id: [" + statement.Id + "] PreparedStatement : [" + request.IDbCommand.CommandText + "]"); - - ApplyParameterMap(session, request.IDbCommand, request, statement, parameterObject); - } - - - /// - /// Applies the parameter map. - /// - /// The session. - /// The command. - /// The request. - /// The statement. - /// The parameter object. - protected virtual void ApplyParameterMap - (ISqlMapSession session, IDbCommand command, - RequestScope request, IStatement statement, object parameterObject) - { - var properties = request.PreparedStatement.DbParametersName; - var parameters = request.PreparedStatement.DbParameters; - var paramLogList = new StringBuilder(); // Log info - var typeLogList = new StringBuilder(); // Log info - - var count = properties.Count; - - for (var i = 0; i < count; ++i) - { - var sqlParameter = parameters[i]; - var parameterCopy = command.CreateParameter(); - var property = request.ParameterMap.GetProperty(i); - - #region Logging - if (_logger.IsDebugEnabled) - { - paramLogList.Append(sqlParameter.ParameterName); - paramLogList.Append("=["); - typeLogList.Append(sqlParameter.ParameterName); - typeLogList.Append("=["); - } - #endregion - - if (command.CommandType == CommandType.StoredProcedure) - { - #region store procedure command - // A store procedure must always use a ParameterMap - // to indicate the mapping order of the properties to the columns - if (request.ParameterMap == null) // Inline Parameters - throw new DataMapperException("A procedure statement tag must alway have a parameterMap attribute, which is not the case for the procedure '" + statement.Id + "'."); - - // Parameters via ParameterMap - if (property.DirectionAttribute.Length == 0) property.Direction = sqlParameter.Direction; - - sqlParameter.Direction = property.Direction; - #endregion - } - - #region Logging - if (_logger.IsDebugEnabled) - { - paramLogList.Append(property.PropertyName); - paramLogList.Append(","); - } - #endregion - - request.ParameterMap.SetParameter(property, parameterCopy, parameterObject); - - parameterCopy.Direction = sqlParameter.Direction; - - // With a ParameterMap, we could specify the ParameterDbTypeProperty - if (request.ParameterMap != null) - if (property.DbType != null && property.DbType.Length > 0) - { - var dbTypePropertyName = session.DataSource.DbProvider.ParameterDbTypeProperty; - var propertyValue = ObjectProbe.GetMemberValue(sqlParameter, dbTypePropertyName, request.DataExchangeFactory.AccessorFactory); - ObjectProbe.SetMemberValue(parameterCopy, dbTypePropertyName, propertyValue, - request.DataExchangeFactory.ObjectFactory, request.DataExchangeFactory.AccessorFactory); - } - //parameterCopy.DbType = sqlParameter.DbType; - - //parameterCopy.DbType = sqlParameter.DbType; - #region Logging - if (_logger.IsDebugEnabled) - { - if (parameterCopy.Value == DBNull.Value || parameterCopy.Value == null) - { - paramLogList.Append("null"); - paramLogList.Append("], "); - - if (parameterCopy.Value == null) - typeLogList.Append("null, null"); - else - typeLogList.Append("System.DBNull, null"); - typeLogList.Append("], "); - } - else - { - paramLogList.Append(parameterCopy.Value); - paramLogList.Append("], "); - - // sqlParameter.DbType could be null (as with Npgsql) - // if PreparedStatementFactory did not find a dbType for the parameter in: - // line 225: "if (property.DbType.Length >0)" - // Use parameterCopy.DbType - - //typeLogList.Append( sqlParameter.DbType.ToString() ); - typeLogList.Append(parameterCopy.DbType.ToString()); - typeLogList.Append(", "); - typeLogList.Append(parameterCopy.Value.GetType()); - typeLogList.Append("], "); - } - } - #endregion - - // JIRA-49 Fixes (size, precision, and scale) - if (session.DataSource.DbProvider.SetDbParameterSize) - if (sqlParameter.Size > 0) - parameterCopy.Size = sqlParameter.Size; - - if (session.DataSource.DbProvider.SetDbParameterPrecision) parameterCopy.Precision = sqlParameter.Precision; - - if (session.DataSource.DbProvider.SetDbParameterScale) parameterCopy.Scale = sqlParameter.Scale; - - parameterCopy.ParameterName = sqlParameter.ParameterName; - - command.Parameters.Add(parameterCopy); - } - - #region Logging - if (_logger.IsDebugEnabled && properties.Count > 0) - { - _logger.Debug("Statement Id: [" + statement.Id + "] Parameters: [" + paramLogList.ToString(0, paramLogList.Length - 2) + "]"); - _logger.Debug("Statement Id: [" + statement.Id + "] Types: [" + typeLogList.ToString(0, typeLogList.Length - 2) + "]"); - } - #endregion - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Commands/IPreparedCommand.cs b/ORBatis.Core/Commands/IPreparedCommand.cs deleted file mode 100644 index 547e23f..0000000 --- a/ORBatis.Core/Commands/IPreparedCommand.cs +++ /dev/null @@ -1,50 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 476843 $ - * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2005 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Commands; - -/// -/// Summary description for IPreparedCommand. -/// -public interface IPreparedCommand -{ - /// - /// Create an IDbCommand for the SqlMapSession and the current SQL Statement - /// and fill IDbCommand IDataParameter's with the parameterObject. - /// - /// - /// The SqlMapSession - /// The IStatement - /// - /// The parameter object that will fill the sql parameter - /// - /// An IDbCommand with all the IDataParameter filled. - void Create(RequestScope request, ISqlMapSession session, IStatement statement, object parameterObject); -} \ No newline at end of file diff --git a/ORBatis.Core/Commands/InMemoryDataReader.cs b/ORBatis.Core/Commands/InMemoryDataReader.cs deleted file mode 100644 index 3f03443..0000000 --- a/ORBatis.Core/Commands/InMemoryDataReader.cs +++ /dev/null @@ -1,579 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-04-26 14:12:57 -0600 (Wed, 26 Apr 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common; -using IBatisNet.DataMapper.Exceptions; -using System.Collections; -using System.Collections.Specialized; -using System.Data; - -namespace IBatisNet.DataMapper.Commands; - -/// -/// An implementation of that will copy the contents -/// of the an open to an in-memory if the -/// session doesn't allow multiple open with -/// the same . -/// -public class InMemoryDataReader : IDataReader -{ - private int _currentRowIndex; - - private InMemoryResultSet[] _results; - - - /// - /// Creates an InMemoryDataReader from a - /// - /// The which holds the records from the Database. - public InMemoryDataReader(IDataReader reader) - { - var resultList = new ArrayList(); - - try - { - Depth = 0; - _currentRowIndex = 0; - - resultList.Add(new InMemoryResultSet(reader, true)); - - while (reader.NextResult()) resultList.Add(new InMemoryResultSet(reader, false)); - - _results = (InMemoryResultSet[])resultList.ToArray(typeof(InMemoryResultSet)); - } - catch (Exception e) - { - throw new DataMapperException("There was a problem converting an IDataReader to an InMemoryDataReader", e); - } - finally - { - reader.Close(); - reader.Dispose(); - } - } - - - /// - /// Gets the current result set. - /// - /// The current result set. - private InMemoryResultSet CurrentResultSet => _results[Depth]; - - #region IDisposable Members - /// - /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - /// - public void Dispose() - { - IsClosed = true; - _results = null; - } - #endregion - - /// - /// Represent an in-memory result set - /// - private class InMemoryResultSet - { - private readonly string[] _dataTypeName; - - private readonly string[] _fieldsName; - private readonly StringDictionary _fieldsNameLookup = new(); - - private readonly Type[] _fieldsType; - - // [row][column] - private readonly object[][] _records; - - /// - /// Creates an in-memory ResultSet from a - /// - /// - /// true if the is already positioned on the record - /// to start reading from. - /// - /// The which holds the records from the Database. - public InMemoryResultSet(IDataReader reader, bool isMidstream) - { - // [record index][ columns values=object[ ] ] - var recordsList = new ArrayList(); - - FieldCount = reader.FieldCount; - _fieldsName = new string[FieldCount]; - _fieldsType = new Type[FieldCount]; - _dataTypeName = new string[FieldCount]; - - - var firstRow = true; - - // if we are in the middle of processing the reader then don't bother - // to move to the next record - just use the current one. - // Copy the records in memory - while (isMidstream || reader.Read()) - { - if (firstRow) - for (var fieldIndex = 0; fieldIndex < reader.FieldCount; fieldIndex++) - { - var fieldName = reader.GetName(fieldIndex); - - _fieldsName[fieldIndex] = fieldName; - if (!_fieldsNameLookup.ContainsKey(fieldName)) _fieldsNameLookup.Add(fieldName, fieldIndex.ToString()); - - _fieldsType[fieldIndex] = reader.GetFieldType(fieldIndex); - _dataTypeName[fieldIndex] = reader.GetDataTypeName(fieldIndex); - } - - firstRow = false; - - var columnsValues = new object[FieldCount]; - reader.GetValues(columnsValues); - recordsList.Add(columnsValues); - - isMidstream = false; - } - - _records = (object[][])recordsList.ToArray(typeof(object[])); - } - - /// - /// Gets the number of columns in the current row. - /// - /// The number of columns in the current row. - public int FieldCount { get; } - - /// - /// The number of record contained in the ResultSet. - /// - public int RecordCount => _records.Length; - - /// - /// Get a column value in a row - /// - /// The row index - /// The column index - /// The column value - public object GetValue(int rowIndex, int colIndex) - { - return _records[rowIndex][colIndex]; - } - - - /// - /// Gets the type of the field. - /// - /// Index of the col. - /// The type of the field. - public Type GetFieldType(int colIndex) - { - return _fieldsType[colIndex]; - } - - /// - /// Gets the name of the field. - /// - /// Index of the col. - /// The name of the field. - public string GetName(int colIndex) - { - return _fieldsName[colIndex]; - } - - /// - /// Gets the ordinal. - /// - /// Name of the column. - /// The ordinal of the column - public int GetOrdinal(string colName) - { - if (_fieldsNameLookup.ContainsKey(colName)) return Convert.ToInt32(_fieldsNameLookup[colName]); - - throw new IndexOutOfRangeException(string.Format("No column with the specified name was found: {0}.", colName)); - } - - /// - /// Gets the name of the database type. - /// - /// Index of the col. - /// The name of the database type - public string GetDataTypeName(int colIndex) - { - return _dataTypeName[colIndex]; - } - - - /// - /// Gets the values. - /// - /// Index of the row. - /// The values. - /// - public int GetValues(int rowIndex, object[] values) - { - Array.Copy(_records[rowIndex], 0, values, 0, FieldCount); - return FieldCount; - } - } - - - #region IDataReader Members - /// - /// Gets the number of rows changed, inserted, or deleted by execution of the SQL statement. - /// - public int RecordsAffected => throw new NotImplementedException("InMemoryDataReader only used for select IList statements !"); - - /// - /// Gets a value indicating whether the data reader is closed. - /// - public bool IsClosed { get; private set; } - - /// - /// Advances the data reader to the next result, when reading the results of batch SQL statements. - /// - /// - public bool NextResult() - { - Depth++; - if (Depth >= _results.Length) - { - Depth--; - return false; - } - - return true; - } - - /// - /// Closes the IDataReader 0bject. - /// - public void Close() - { - IsClosed = true; - } - - /// - /// Advances the IDataReader to the next record. - /// - /// true if there are more rows; otherwise, false. - public bool Read() - { - _currentRowIndex++; - if (_currentRowIndex >= _results[Depth].RecordCount) - { - _currentRowIndex--; - return false; - } - - return true; - } - - /// - /// Gets a value indicating the depth of nesting for the current row. - /// - public int Depth { get; private set; } - - /// - /// Returns a DataTable that describes the column metadata of the IDataReader. - /// - /// - public DataTable GetSchemaTable() - { - throw new NotImplementedException("GetSchemaTable() is not implemented, cause not use."); - } - #endregion - - #region IDataRecord Members - /// - /// Gets the 32-bit signed integer value of the specified field. - /// - /// The zero-based column ordinal. - /// The value of the column. - public int GetInt32(int fieldIndex) - { - return (int)GetValue(fieldIndex); - } - - /// - /// Gets the column with the specified name. - /// - public object this[string name] => this[GetOrdinal(name)]; - - /// - /// Gets the column located at the specified index. - /// - public object this[int fieldIndex] => GetValue(fieldIndex); - - /// - /// Return the value of the specified field. - /// - /// The index of the field to find. - /// The object which will contain the field value upon return. - public object GetValue(int fieldIndex) - { - return CurrentResultSet.GetValue(_currentRowIndex, fieldIndex); - } - - /// - /// Return whether the specified field is set to null. - /// - /// The zero-based column ordinal. - /// The value of the column. - public bool IsDBNull(int fieldIndex) - { - return GetValue(fieldIndex) == DBNull.Value; - } - - /// - /// Reads a stream of bytes from the specified column offset into the buffer as an array, - /// starting at the given buffer offset. - /// - /// The zero-based column ordinal. - /// The index within the field from which to begin the read operation. - /// The buffer into which to read the stream of bytes. - /// The index for buffer to begin the read operation. - /// The number of bytes to read. - /// The actual number of bytes read. - public long GetBytes(int fieldIndex, long dataIndex, byte[] buffer, int bufferIndex, int length) - { - var value = GetValue(fieldIndex); - if (!(value is byte[])) throw new InvalidCastException("Type is " + value.GetType()); - - if (buffer == null) - // Return length of data - return ((byte[])value).Length; - - // Copy data into buffer - var availableLength = (int)(((byte[])value).Length - dataIndex); - if (availableLength < length) length = availableLength; - - Array.Copy((byte[])value, (int)dataIndex, buffer, bufferIndex, length); - return length; - } - - - /// - /// Gets the 8-bit unsigned integer value of the specified column. - /// - /// The zero-based column ordinal. - /// The value of the column. - public byte GetByte(int fieldIndex) - { - return (byte)GetValue(fieldIndex); - } - - /// - /// Gets the Type information corresponding to the type of Object that would be returned from GetValue. - /// - /// The zero-based column ordinal. - /// The value of the column. - public Type GetFieldType(int fieldIndex) - { - return CurrentResultSet.GetFieldType(fieldIndex); - } - - /// - /// Gets the fixed-position numeric value of the specified field. - /// - /// The zero-based column ordinal. - /// The value of the column. - public decimal GetDecimal(int fieldIndex) - { - return (decimal)GetValue(fieldIndex); - } - - /// - /// Gets all the attribute fields in the collection for the current record. - /// - /// - /// - public int GetValues(object[] values) - { - return CurrentResultSet.GetValues(_currentRowIndex, values); - } - - /// - /// Gets the name for the field to find. - /// - /// The zero-based column ordinal. - /// The value of the column. - public string GetName(int fieldIndex) - { - return CurrentResultSet.GetName(fieldIndex); - } - - /// - /// Indicates the number of fields within the current record. This property is read-only. - /// - public int FieldCount => CurrentResultSet.FieldCount; - - /// - /// - /// The zero-based column ordinal. - /// The value of the column. - public long GetInt64(int fieldIndex) - { - return (long)GetValue(fieldIndex); - } - - /// - /// - /// The zero-based column ordinal. - /// The value of the column. - public double GetDouble(int fieldIndex) - { - return (double)GetValue(fieldIndex); - } - - /// - /// Gets the value of the specified column as a Boolean. - /// - /// The zero-based column ordinal. - /// The value of the column. - public bool GetBoolean(int fieldIndex) - { - return (bool)GetValue(fieldIndex); - } - - /// - /// Returns the GUID value of the specified field. - /// - /// The zero-based column ordinal. - /// The value of the column. - public Guid GetGuid(int fieldIndex) - { - return (Guid)GetValue(fieldIndex); - } - - /// - /// Returns the value of the specified column as a DateTime object. - /// - /// The zero-based column ordinal. - /// The value of the column. - public DateTime GetDateTime(int fieldIndex) - { - return (DateTime)GetValue(fieldIndex); - } - - /// - /// Returns the column ordinal, given the name of the column. - /// - /// The name of the column. - /// The value of the column. - public int GetOrdinal(string colName) - { - return CurrentResultSet.GetOrdinal(colName); - } - - /// - /// Gets the database type information for the specified field. - /// - /// The index of the field to find. - /// The database type information for the specified field. - public string GetDataTypeName(int fieldIndex) - { - return CurrentResultSet.GetDataTypeName(fieldIndex); - } - - /// - /// Returns the value of the specified column as a single-precision floating point number. - /// - /// The zero-based column ordinal. - /// The value of the column. - public float GetFloat(int fieldIndex) - { - return (float)GetValue(fieldIndex); - } - - /// - /// Gets an IDataReader to be used when the field points to more remote structured data. - /// - /// The zero-based column ordinal. - /// The value of the column. - public IDataReader GetData(int fieldIndex) - { - throw new NotImplementedException("GetData(int) is not implemented, cause not use."); - } - - /// - /// Reads a stream of characters from the specified column offset into the buffer as an array, - /// starting at the given buffer offset. - /// - /// The zero-based column ordinal. - /// The index within the row from which to begin the read operation. - /// The buffer into which to read the stream of bytes. - /// The index for buffer to begin the read operation. - /// The number of bytes to read. - /// The actual number of characters read. - public long GetChars(int fieldIndex, long dataIndex, char[] buffer, int bufferIndex, int length) - { - var value = GetValue(fieldIndex); - char[] valueBuffer = null; - - if (value is char[]) - valueBuffer = (char[])value; - else if (value is string) - valueBuffer = ((string)value).ToCharArray(); - else - throw new InvalidCastException("Type is " + value.GetType()); - - if (buffer == null) - // Return length of data - return valueBuffer.Length; - - // Copy data into buffer - Array.Copy(valueBuffer, (int)dataIndex, buffer, bufferIndex, length); - return valueBuffer.Length - dataIndex; - } - - /// - /// Gets the string value of the specified field. - /// - /// The zero-based column ordinal. - /// The value of the column. - public string GetString(int fieldIndex) - { - return (string)GetValue(fieldIndex); - } - - /// - /// Gets the character value of the specified column. - /// - /// The zero-based column ordinal. - /// The value of the column. - public char GetChar(int fieldIndex) - { - return (char)GetValue(fieldIndex); - } - - /// - /// Gets the 16-bit signed integer value of the specified field. - /// - /// The zero-based column ordinal. - /// The value of the column. - public short GetInt16(int fieldIndex) - { - return (short)GetValue(fieldIndex); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Commands/PreparedCommandFactory.cs b/ORBatis.Core/Commands/PreparedCommandFactory.cs deleted file mode 100644 index b079a1b..0000000 --- a/ORBatis.Core/Commands/PreparedCommandFactory.cs +++ /dev/null @@ -1,51 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 512878 $ - * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2005 - Gilles Bayon - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.DataMapper.Commands; - -/// -/// Summary description for PreparedCommandFactory. -/// -internal sealed class PreparedCommandFactory -{ - /// - /// Get an IPreparedCommand. - /// - /// - public static IPreparedCommand GetPreparedCommand(bool isEmbedStatementParams) - { - IPreparedCommand preparedCommand = null; - - // if (isEmbedStatementParams) - // { - // preparedCommand = new EmbedParamsPreparedCommand(); - // } - // else - // { - preparedCommand = new DefaultPreparedCommand(); - // } - - return preparedCommand; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Alias/TypeAlias.cs b/ORBatis.Core/Configuration/Alias/TypeAlias.cs deleted file mode 100644 index dbe9e37..0000000 --- a/ORBatis.Core/Configuration/Alias/TypeAlias.cs +++ /dev/null @@ -1,114 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408099 $ - * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Utilities; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Alias; - -/// -/// TypeAlias. -/// -[Serializable] -[XmlRoot("typeAlias", Namespace = "http://ibatis.apache.org/dataMapper")] -public class TypeAlias -{ - #region Methods - /// - /// Initialize the object, - /// try to idenfify the .Net type class from the corresponding name. - /// - public void Initialize() - { - _class = TypeUtils.ResolveType(_className); - } - #endregion - - #region Fields - [NonSerialized] private string _name = string.Empty; - - [NonSerialized] private string _className = string.Empty; - - [NonSerialized] private Type _class; - #endregion - - #region Properties - /// - /// Name used to identify the typeAlias amongst the others. - /// - /// Account - [XmlAttribute("alias")] - public string Name - { - get => _name; - set - { - if (value == null || value.Length < 1) throw new ArgumentNullException("The name attribute is mandatory in the typeAlias "); - _name = value; - } - } - - - /// - /// The type class for the typeAlias - /// - [XmlIgnore] - public Type Class => _class; - - - /// - /// The class name to identify the typeAlias. - /// - /// Com.Site.Domain.Product - [XmlAttribute("type")] - public string ClassName - { - get => _className; - set - { - if (value == null || value.Length < 1) throw new ArgumentNullException("The class attribute is mandatory in the typeAlias " + _name); - _className = value; - } - } - #endregion - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public TypeAlias() { } - - /// - /// Constructor - /// - /// a type. - public TypeAlias(Type type) - { - _class = type; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Alias/TypeHandler.cs b/ORBatis.Core/Configuration/Alias/TypeHandler.cs deleted file mode 100644 index 59f5591..0000000 --- a/ORBatis.Core/Configuration/Alias/TypeHandler.cs +++ /dev/null @@ -1,105 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408099 $ - * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Utilities; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Alias; - -/// -/// Summary description for TypeHandler. -/// -[Serializable] -[XmlRoot("typeHandler", Namespace = "http://ibatis.apache.org/dataMapper")] -public class TypeHandler -{ - #region Constructors - /// - /// Do not use direclty, only for serialization. - /// - public TypeHandler() { } - #endregion - - #region Methods - /// - /// Initialize the object, - /// try to idenfify the .Net type class from the corresponding name. - /// - public void Initialize() - { - _class = TypeUtils.ResolveType(_className); - } - #endregion - #region Fields - [NonSerialized] private string _className = string.Empty; - - [NonSerialized] private Type _class; - - [NonSerialized] private string _dbType = string.Empty; - - [NonSerialized] private string _callBackName = string.Empty; - #endregion - - #region Properties - /// - /// CLR type - /// - [XmlAttribute("type")] - public string ClassName - { - get => _className; - set => _className = value; - } - - /// - /// The type class for the TypeName - /// - [XmlIgnore] - public Type Class => _class; - - /// - /// dbType name - /// - [XmlAttribute("dbType")] - public string DbType - { - get => _dbType; - set => _dbType = value; - } - - - /// - /// callback alias name - /// - [XmlAttribute("callback")] - public string CallBackName - { - get => _callBackName; - set => _callBackName = value; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/CacheKey.cs b/ORBatis.Core/Configuration/Cache/CacheKey.cs deleted file mode 100644 index 7999fd9..0000000 --- a/ORBatis.Core/Configuration/Cache/CacheKey.cs +++ /dev/null @@ -1,149 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 451064 $ - * $Date: 2006-09-28 17:53:56 -0600 (Thu, 28 Sep 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2005 - iBATIS Team - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities; -using System.Collections; -using System.Text; - -namespace IBatisNet.DataMapper.Configuration.Cache; - -/// -/// Hash value generator for cache keys -/// -public class CacheKey -{ - private const int DEFAULT_MULTIPLYER = 37; - private const int DEFAULT_HASHCODE = 17; - - private readonly int _multiplier = DEFAULT_MULTIPLYER; - private readonly IList _paramList = new ArrayList(); - private long _checksum = long.MinValue; - private int _count; - private int _hashCode = DEFAULT_HASHCODE; - - /// - /// Default constructor - /// - public CacheKey() - { - _hashCode = DEFAULT_HASHCODE; - _multiplier = DEFAULT_MULTIPLYER; - _count = 0; - } - - /// - /// Constructor that supplies an initial hashcode - /// - /// the hashcode to use - public CacheKey(int initialNonZeroOddNumber) - { - _hashCode = initialNonZeroOddNumber; - _multiplier = DEFAULT_MULTIPLYER; - _count = 0; - } - - /// - /// Constructor that supplies an initial hashcode and multiplier - /// - /// the hashcode to use - /// the multiplier to use - public CacheKey(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber) - { - _hashCode = initialNonZeroOddNumber; - _multiplier = multiplierNonZeroOddNumber; - _count = 0; - } - - /// - /// Updates this object with new information based on an object - /// - /// the object - /// the cachekey - public CacheKey Update(object obj) - { - var baseHashCode = HashCodeProvider.GetIdentityHashCode(obj); - - _count++; - _checksum += baseHashCode; - baseHashCode *= _count; - - _hashCode = _multiplier * _hashCode + baseHashCode; - - _paramList.Add(obj); - - return this; - } - - /// - /// - /// - /// - public override bool Equals(object obj) - { - if (this == obj) return true; - if (!(obj is CacheKey)) return false; - - var cacheKey = (CacheKey)obj; - - if (_hashCode != cacheKey._hashCode) return false; - if (_checksum != cacheKey._checksum) return false; - if (_count != cacheKey._count) return false; - - var count = _paramList.Count; - for (var i = 0; i < count; i++) - { - var thisParam = _paramList[i]; - var thatParam = cacheKey._paramList[i]; - if (thisParam == null) - { - if (thatParam != null) return false; - } - else - { - if (!thisParam.Equals(thatParam)) return false; - } - } - - return true; - } - - /// - /// Get the HashCode for this CacheKey - /// - /// - public override int GetHashCode() - { - return _hashCode; - } - - /// - /// ToString implementation. - /// - /// A string that give the CacheKey HashCode. - public override string ToString() - { - return new StringBuilder().Append(_hashCode).Append('|').Append(_checksum).ToString(); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/CacheModel.cs b/ORBatis.Core/Configuration/Cache/CacheModel.cs deleted file mode 100644 index 8e86875..0000000 --- a/ORBatis.Core/Configuration/Cache/CacheModel.cs +++ /dev/null @@ -1,368 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 575913 $ - * $LastChangedDate: 2007-09-15 06:43:08 -0600 (Sat, 15 Sep 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Logging; -using IBatisNet.Common.Utilities; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.MappedStatements; -using System.Collections; -using System.Collections.Specialized; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Cache; - -/// -/// Summary description for CacheModel. -/// -[Serializable] -[XmlRoot("cacheModel", Namespace = "http://ibatis.apache.org/mapping")] -public class CacheModel -{ - #region Constructor (s) / Destructor - /// - /// Constructor - /// - public CacheModel() - { - _lastFlush = DateTime.Now.Ticks; - } - #endregion - - /// - /// - /// - /// - [MethodImpl(MethodImplOptions.Synchronized)] - public object GetLock(CacheKey key) - { - var controllerId = HashCodeProvider.GetIdentityHashCode(_controller); - var keyHash = key.GetHashCode(); - var lockKey = 29 * controllerId + keyHash; - var lok = _lockMap[lockKey]; - if (lok == null) - { - lok = lockKey; //might as well use the same object - _lockMap[lockKey] = lok; - } - - return lok; - } - - #region Fields - private static IDictionary _lockMap = new HybridDictionary(); - - [NonSerialized] private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - /// - /// This is used to represent null objects that are returned from the cache so - /// that they can be cached, too. - /// - [NonSerialized] public static readonly object NULL_OBJECT = new(); - - /// - /// Constant to turn off periodic cache flushes - /// - [NonSerialized] public const long NO_FLUSH_INTERVAL = -99999; - - [NonSerialized] private object _statLock = new(); - - [NonSerialized] private int _requests; - - [NonSerialized] private int _hits; - - [NonSerialized] private string _id = string.Empty; - - [NonSerialized] private ICacheController _controller; - - [NonSerialized] private FlushInterval _flushInterval; - - [NonSerialized] private long _lastFlush; - - [NonSerialized] private HybridDictionary _properties = new(); - - [NonSerialized] private string _implementation = string.Empty; - - [NonSerialized] private bool _isReadOnly = true; - - [NonSerialized] private bool _isSerializable; - #endregion - - #region Properties - /// - /// Identifier used to identify the CacheModel amongst the others. - /// - [XmlAttribute("id")] - public string Id - { - get => _id; - set - { - if (value == null || value.Length < 1) - throw new ArgumentNullException("The id attribute is mandatory in a cacheModel tag."); - - _id = value; - } - } - - /// - /// Cache controller implementation name. - /// - [XmlAttribute("implementation")] - public string Implementation - { - get => _implementation; - set - { - if (value == null || value.Length < 1) - throw new ArgumentNullException("The implementation attribute is mandatory in a cacheModel tag."); - - _implementation = value; - } - } - - /// - /// Set the cache controller - /// - public ICacheController CacheController - { - set => _controller = value; - } - - /// - /// Set or get the flushInterval (in Ticks) - /// - [XmlElement("flushInterval", typeof(FlushInterval))] - public FlushInterval FlushInterval - { - get => _flushInterval; - set => _flushInterval = value; - } - - /// - /// Specifie how the cache content should be returned. - /// If true a deep copy is returned. - /// - /// - /// Combinaison - /// IsReadOnly=true/IsSerializable=false : Returned instance of cached object - /// IsReadOnly=false/IsSerializable=true : Returned coopy of cached object - /// - public bool IsSerializable - { - get => _isSerializable; - set => _isSerializable = value; - } - - /// - /// Determines if the cache will be used as a read-only cache. - /// Tells the cache model that is allowed to pass back a reference to the object - /// existing in the cache. - /// - /// - /// The IsReadOnly properties works in conjonction with the IsSerializable propertie. - /// - public bool IsReadOnly - { - get => _isReadOnly; - set => _isReadOnly = value; - } - #endregion - - #region Methods - /// - /// - public void Initialize() - { - // Initialize FlushInterval - _flushInterval.Initialize(); - - try - { - if (_implementation == null) throw new DataMapperException("Error instantiating cache controller for cache named '" + _id + "'. Cause: The class for name '" + _implementation + "' could not be found."); - - // Build the CacheController - var type = TypeUtils.ResolveType(_implementation); - var arguments = new object[0]; - - _controller = (ICacheController)Activator.CreateInstance(type, arguments); - } - catch (Exception e) - { - throw new ConfigurationException("Error instantiating cache controller for cache named '" + _id + ". Cause: " + e.Message, e); - } - - //------------ configure Controller--------------------- - try - { - _controller.Configure(_properties); - } - catch (Exception e) - { - throw new ConfigurationException("Error configuring controller named '" + _id + "'. Cause: " + e.Message, e); - } - } - - - /// - /// Event listener - /// - /// A MappedStatement on which we listen ExecuteEventArgs event. - public void RegisterTriggerStatement(IMappedStatement mappedStatement) - { - mappedStatement.Execute += FlushHandler; - } - - - /// - /// FlushHandler which clear the cache - /// - /// - /// - private void FlushHandler(object sender, ExecuteEventArgs e) - { - if (_logger.IsDebugEnabled) _logger.Debug("Flush cacheModel named " + _id + " for statement '" + e.StatementName + "'"); - - Flush(); - } - - - /// - /// Clears all elements from the cache. - /// - public void Flush() - { - _lastFlush = DateTime.Now.Ticks; - _controller.Flush(); - } - - - /// - /// Adds an item with the specified key and value into cached data. - /// Gets a cached object with the specified key. - /// - /// The cached object or null - /// - /// A side effect of this method is that is may clear the cache - /// if it has not been cleared in the flushInterval. - /// - public object this[CacheKey key] - { - get - { - lock (this) - { - if (_lastFlush != NO_FLUSH_INTERVAL - && DateTime.Now.Ticks - _lastFlush > _flushInterval.Interval) - Flush(); - } - - object value = null; - lock (GetLock(key)) - { - value = _controller[key]; - } - - // No longer supported in Net8.0++. Strictly forbidden by microsoft. - // if (_isSerializable && !_isReadOnly && - // value != NULL_OBJECT && value != null) - // try - // { - // var stream = new MemoryStream((byte[])value); - // stream.Position = 0; - // var formatter = new BinaryFormatter(); - // value = formatter.Deserialize(stream); - // } - // catch (Exception ex) - // { - // throw new IBatisNetException("Error caching serializable object. Be sure you're not attempting to use " + - // "a serialized cache for an object that may be taking advantage of lazy loading. Cause: " + ex.Message, ex); - // } - - lock (_statLock) - { - _requests++; - if (value != null) _hits++; - } - - if (_logger.IsDebugEnabled) - { - if (value != null) - _logger.Debug(string.Format("Retrieved cached object '{0}' using key '{1}' ", value, key)); - else - _logger.Debug(string.Format("Cache miss using key '{0}' ", key)); - } - - return value; - } - set - { - // No longer supported in Net8.0++. Strictly forbidden by microsoft. - // if (null == value) value = NULL_OBJECT; - // if (_isSerializable && !_isReadOnly && value != NULL_OBJECT) - // try - // { - // var stream = new MemoryStream(); - // var formatter = new BinaryFormatter(); - // formatter.Serialize(stream, value); - // value = stream.ToArray(); - // } - // catch (Exception ex) - // { - // throw new IBatisNetException("Error caching serializable object. Cause: " + ex.Message, ex); - // } - _controller[key] = value; - if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Cache object '{0}' using key '{1}' ", value, key)); - } - } - - /// - /// - public double HitRatio - { - get - { - if (_requests != 0) return _hits / (double)_requests; - - return 0; - } - } - - - /// - /// Add a property - /// - /// The name of the property - /// The value of the property - public void AddProperty(string name, string value) - { - _properties.Add(name, value); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/Fifo/FifoCacheController.cs b/ORBatis.Core/Configuration/Cache/Fifo/FifoCacheController.cs deleted file mode 100644 index a503c7a..0000000 --- a/ORBatis.Core/Configuration/Cache/Fifo/FifoCacheController.cs +++ /dev/null @@ -1,110 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Collections; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Cache.Fifo; - -/// -/// Summary description for FifoCacheController. -/// -public class FifoCacheController : ICacheController -{ - #region Constructor (s) / Destructor - /// - /// - public FifoCacheController() - { - _cacheSize = 100; - _cache = Hashtable.Synchronized(new Hashtable()); - _keyList = ArrayList.Synchronized(new ArrayList()); - } - #endregion - #region Fields - private int _cacheSize; - private readonly Hashtable _cache; - private readonly IList _keyList; - #endregion - - #region ICacheController Members - /// - /// Remove an object from a cache model - /// - /// the key to the object - /// the removed object(?) - public object Remove(object key) - { - var o = this[key]; - - _keyList.Remove(key); - _cache.Remove(key); - return o; - } - - /// - /// Clears all elements from the cache. - /// - public void Flush() - { - _cache.Clear(); - _keyList.Clear(); - } - - - /// - /// Adds an item with the specified key and value into cached data. - /// Gets a cached object with the specified key. - /// - /// The cached object or null - public object this[object key] - { - get => _cache[key]; - set - { - _cache[key] = value; - _keyList.Add(key); - if (_keyList.Count > _cacheSize) - { - var oldestKey = _keyList[0]; - _keyList.Remove(0); - _cache.Remove(oldestKey); - } - } - } - - - /// - /// Configures the cache - /// - public void Configure(IDictionary properties) - { - var size = (string)properties["CacheSize"]; - ; - if (size != null) _cacheSize = Convert.ToInt32(size); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/FlushInterval.cs b/ORBatis.Core/Configuration/Cache/FlushInterval.cs deleted file mode 100644 index 81be3eb..0000000 --- a/ORBatis.Core/Configuration/Cache/FlushInterval.cs +++ /dev/null @@ -1,114 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 707150 $ - * $Date: 2008-10-22 11:54:18 -0600 (Wed, 22 Oct 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Cache; - -/// -/// Summary description for FlushInterval. -/// -[Serializable] -[XmlRoot("flushInterval")] -public class FlushInterval -{ - #region Methods - /// - /// Calcul the flush interval value in ticks - /// - public void Initialize() - { - long interval = 0; - if (_milliseconds != 0) interval += _milliseconds * TimeSpan.TicksPerMillisecond; - if (_seconds != 0) interval += _seconds * TimeSpan.TicksPerSecond; - if (_minutes != 0) interval += _minutes * TimeSpan.TicksPerMinute; - if (_hours != 0) interval += _hours * TimeSpan.TicksPerHour; - - if (interval == 0) interval = CacheModel.NO_FLUSH_INTERVAL; - Interval = interval; - } - #endregion - - #region Fields - private int _hours; - private int _minutes; - private int _seconds; - private int _milliseconds; - #endregion - - #region Properties - /// - /// Flush interval in hours - /// - [XmlAttribute("hours")] - public int Hours - { - get => _hours; - set => _hours = value; - } - - - /// - /// Flush interval in minutes - /// - [XmlAttribute("minutes")] - public int Minutes - { - get => _minutes; - set => _minutes = value; - } - - - /// - /// Flush interval in seconds - /// - [XmlAttribute("seconds")] - public int Seconds - { - get => _seconds; - set => _seconds = value; - } - - - /// - /// Flush interval in milliseconds - /// - [XmlAttribute("milliseconds")] - public int Milliseconds - { - get => _milliseconds; - set => _milliseconds = value; - } - - - /// - /// Get the flush interval value - /// - [XmlIgnoreAttribute] - public long Interval { get; private set; } = CacheModel.NO_FLUSH_INTERVAL; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/ICacheController.cs b/ORBatis.Core/Configuration/Cache/ICacheController.cs deleted file mode 100644 index 2c5f59e..0000000 --- a/ORBatis.Core/Configuration/Cache/ICacheController.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Collections; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Cache; - -/// -/// Summary description for ICacheController. -/// -public interface ICacheController -{ - #region Properties - /// - /// Adds an item with the specified key and value into cached data. - /// Gets a cached object with the specified key. - /// - /// The cached object or null - object this[object key] { get; set; } - #endregion - - #region Methods - /// - /// Remove an object from a cache model - /// - /// the key to the object - /// the removed object(?) - object Remove(object key); - - /// - /// Clears all elements from the cache. - /// - void Flush(); - - /// - /// Configures the CacheController - /// - /// - void Configure(IDictionary properties); - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/Lru/LruCacheController.cs b/ORBatis.Core/Configuration/Cache/Lru/LruCacheController.cs deleted file mode 100644 index d8a8faf..0000000 --- a/ORBatis.Core/Configuration/Cache/Lru/LruCacheController.cs +++ /dev/null @@ -1,115 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Collections; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Cache.Lru; - -/// -/// Summary description for LruCacheController. -/// -public class LruCacheController : ICacheController -{ - #region Constructor (s) / Destructor - /// - /// - public LruCacheController() - { - _cacheSize = 100; - _cache = Hashtable.Synchronized(new Hashtable()); - _keyList = ArrayList.Synchronized(new ArrayList()); - } - #endregion - #region Fields - private int _cacheSize; - private readonly Hashtable _cache; - private readonly IList _keyList; - #endregion - - #region ICacheController Members - /// - /// Remove an object from a cache model - /// - /// the key to the object - /// the removed object(?) - public object Remove(object key) - { - var o = this[key]; - - _keyList.Remove(key); - _cache.Remove(key); - return o; - } - - /// - /// Clears all elements from the cache. - /// - public void Flush() - { - _cache.Clear(); - _keyList.Clear(); - } - - - /// - /// Adds an item with the specified key and value into cached data. - /// Gets a cached object with the specified key. - /// - /// The cached object or null - public object this[object key] - { - get - { - _keyList.Remove(key); - _keyList.Add(key); - return _cache[key]; - } - set - { - _cache[key] = value; - _keyList.Add(key); - if (_keyList.Count > _cacheSize) - { - var oldestKey = _keyList[0]; - _keyList.Remove(0); - _cache.Remove(oldestKey); - } - } - } - - - /// - /// Configures the cache - /// - public void Configure(IDictionary properties) - { - var size = (string)properties["CacheSize"]; - ; - if (size != null) _cacheSize = Convert.ToInt32(size); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/Memory/MemoryCacheControler.cs b/ORBatis.Core/Configuration/Cache/Memory/MemoryCacheControler.cs deleted file mode 100644 index 69db7c1..0000000 --- a/ORBatis.Core/Configuration/Cache/Memory/MemoryCacheControler.cs +++ /dev/null @@ -1,142 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Collections; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Cache.Memory; - -/// -/// Summary description for MemoryCacheControler. -/// -public class MemoryCacheControler : ICacheController -{ - #region Constructor (s) / Destructor - /// - /// Constructor - /// - public MemoryCacheControler() - { - _cache = Hashtable.Synchronized(new Hashtable()); - } - #endregion - - /// - /// Class to implement a strong (permanent) reference. - /// - private class StrongReference - { - public StrongReference(object obj) - { - Target = obj; - } - - /// - /// Gets the object (the target) referenced by this instance. - /// - public object Target { get; } - } - - #region Fields - private MemoryCacheLevel _cacheLevel = MemoryCacheLevel.Weak; - private readonly Hashtable _cache; - #endregion - - #region ICacheController Members - /// - /// Remove an object from a cache model - /// - /// the key to the object - /// the removed object(?) - public object Remove(object key) - { - object value = null; - var reference = this[key]; - _cache.Remove(key); - if (reference != null) - { - if (reference is StrongReference) - value = ((StrongReference)reference).Target; - else if (reference is WeakReference) value = ((WeakReference)reference).Target; - } - - return value; - } - - /// - /// Adds an item with the specified key and value into cached data. - /// Gets a cached object with the specified key. - /// - /// The cached object or null - public object this[object key] - { - get - { - object value = null; - var reference = _cache[key]; - if (reference != null) - { - if (reference is StrongReference) - value = ((StrongReference)reference).Target; - else if (reference is WeakReference) value = ((WeakReference)reference).Target; - } - - return value; - } - set - { - object reference = null; - if (_cacheLevel.Equals(MemoryCacheLevel.Weak)) - reference = new WeakReference(value); - else if (_cacheLevel.Equals(MemoryCacheLevel.Strong)) reference = new StrongReference(value); - _cache[key] = reference; - } - } - - - /// - /// Clears all elements from the cache. - /// - public void Flush() - { - lock (this) - { - _cache.Clear(); - } - } - - - /// - /// Configures the cache - /// - public void Configure(IDictionary properties) - { - var referenceType = (string)properties["Type"]; - ; - if (referenceType != null) _cacheLevel = MemoryCacheLevel.GetByRefenceType(referenceType.ToUpper()); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Cache/Memory/MemoryCacheLevel.cs b/ORBatis.Core/Configuration/Cache/Memory/MemoryCacheLevel.cs deleted file mode 100644 index 7b154a0..0000000 --- a/ORBatis.Core/Configuration/Cache/Memory/MemoryCacheLevel.cs +++ /dev/null @@ -1,105 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.DataMapper.Exceptions; -using System.Collections; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Cache.Memory; - -/// -/// Summary description for MemoryCacheLevel. -/// -public class MemoryCacheLevel -{ - #region Constructor (s) / Destructor - /// - /// - static MemoryCacheLevel() - { - Weak = new MemoryCacheLevel("WEAK"); - Strong = new MemoryCacheLevel("STRONG"); - - _cacheLevelMap[Weak.ReferenceType] = Weak; - _cacheLevelMap[Strong.ReferenceType] = Strong; - } - #endregion - #region Fields - private static readonly Hashtable _cacheLevelMap = new(); - - /// - /// Constant for weak caching - /// This cache model is probably the best choice in most cases. It will increase - /// performance for popular results, but it will absolutely release the memory to - /// be used in allocating other objects, assuming that the results are not currently - /// in use. - /// References an object while still allowing it to be garbage collected. - /// - public static MemoryCacheLevel Weak; - - /// - /// Constant for strong caching. - /// This cache model will guarantee that the results stay in memory until the cache - /// is explicitly flushed. This is ideal for results that are: - /// - /// very small - /// absolutely static - /// used very often - /// - /// The advantage is that performance will be very good for this particular query. - /// The disadvantage is that if the memory used by these results is needed, then it - /// will not be released to make room for other objects (possibly more important - /// objects). - /// - public static MemoryCacheLevel Strong; - #endregion - - #region Methods - /// - /// Creates a new instance of CacheLevel - /// - /// The type of the CacheLevel. - private MemoryCacheLevel(string type) - { - ReferenceType = type; - } - - /// - /// - public string ReferenceType { get; } - - /// - /// - /// - /// - public static MemoryCacheLevel GetByRefenceType(string referenceType) - { - var cacheLevel = (MemoryCacheLevel)_cacheLevelMap[referenceType]; - if (cacheLevel == null) throw new DataMapperException("Error getting CacheLevel (reference type) for name: '" + referenceType + "'."); - return cacheLevel; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ParameterMapping/InlineParameterMapParser.cs b/ORBatis.Core/Configuration/ParameterMapping/InlineParameterMapParser.cs deleted file mode 100644 index 828b860..0000000 --- a/ORBatis.Core/Configuration/ParameterMapping/InlineParameterMapParser.cs +++ /dev/null @@ -1,321 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408099 $ - * $Date: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; -using System.Collections; -using System.Text; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping; - -/// -/// Summary description for InlineParameterMapParser. -/// -internal class InlineParameterMapParser -{ - #region Constructors - /// - /// Constructor - /// - public InlineParameterMapParser() { } - #endregion - - /// - /// Parse Inline ParameterMap - /// - /// - /// - /// A new sql command text. - /// - public SqlText ParseInlineParameterMap(IScope scope, IStatement statement, string sqlStatement) - { - var newSql = sqlStatement; - var mappingList = new ArrayList(); - Type parameterClassType = null; - - if (statement != null) parameterClassType = statement.ParameterClass; - - var parser = new StringTokenizer(sqlStatement, PARAMETER_TOKEN, true); - var newSqlBuffer = new StringBuilder(); - - string token = null; - string lastToken = null; - - var enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - - if (PARAMETER_TOKEN.Equals(lastToken)) - { - if (PARAMETER_TOKEN.Equals(token)) - { - newSqlBuffer.Append(PARAMETER_TOKEN); - token = null; - } - else - { - ParameterProperty mapping = null; - if (token.IndexOf(PARAM_DELIM) > -1) - mapping = OldParseMapping(token, parameterClassType, scope); - else - mapping = NewParseMapping(token, parameterClassType, scope); - - mappingList.Add(mapping); - newSqlBuffer.Append("? "); - - enumerator.MoveNext(); - token = (string)enumerator.Current; - if (!PARAMETER_TOKEN.Equals(token)) throw new DataMapperException("Unterminated inline parameter in mapped statement (" + statement.Id + ")."); - token = null; - } - } - else - { - if (!PARAMETER_TOKEN.Equals(token)) newSqlBuffer.Append(token); - } - - lastToken = token; - } - - newSql = newSqlBuffer.ToString(); - - var mappingArray = (ParameterProperty[])mappingList.ToArray(typeof(ParameterProperty)); - - var sqlText = new SqlText(); - sqlText.Text = newSql; - sqlText.Parameters = mappingArray; - - return sqlText; - } - - - /// - /// Parse inline parameter with syntax as - /// #propertyName,type=string,dbype=Varchar,direction=Input,nullValue=N/A,handler=string# - /// - /// - /// - /// - /// - private ParameterProperty NewParseMapping(string token, Type parameterClassType, IScope scope) - { - var mapping = new ParameterProperty(); - - var paramParser = new StringTokenizer(token, "=,", false); - var enumeratorParam = paramParser.GetEnumerator(); - - enumeratorParam.MoveNext(); - - mapping.PropertyName = ((string)enumeratorParam.Current).Trim(); - - while (enumeratorParam.MoveNext()) - { - var field = (string)enumeratorParam.Current; - if (enumeratorParam.MoveNext()) - { - var value = (string)enumeratorParam.Current; - if ("type".Equals(field)) - mapping.CLRType = value; - else if ("dbType".Equals(field)) - mapping.DbType = value; - else if ("direction".Equals(field)) - mapping.DirectionAttribute = value; - else if ("nullValue".Equals(field)) - mapping.NullValue = value; - else if ("handler".Equals(field)) - mapping.CallBackName = value; - else - throw new DataMapperException("Unrecognized parameter mapping field: '" + field + "' in " + token); - } - else - { - throw new DataMapperException("Incorrect inline parameter map format (missmatched name=value pairs): " + token); - } - } - - if (mapping.CallBackName.Length > 0) - { - mapping.Initialize(scope, parameterClassType); - } - else - { - ITypeHandler handler = null; - if (parameterClassType == null) - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - else - handler = ResolveTypeHandler(scope.DataExchangeFactory.TypeHandlerFactory, - parameterClassType, mapping.PropertyName, - mapping.CLRType, mapping.DbType); - mapping.TypeHandler = handler; - mapping.Initialize(scope, parameterClassType); - } - - return mapping; - } - - - /// - /// Parse inline parameter with syntax as - /// #propertyName:dbType:nullValue# - /// - /// - /// - /// - /// - private ParameterProperty OldParseMapping(string token, Type parameterClassType, IScope scope) - { - var mapping = new ParameterProperty(); - - if (token.IndexOf(PARAM_DELIM) > -1) - { - var paramParser = new StringTokenizer(token, PARAM_DELIM, true); - var enumeratorParam = paramParser.GetEnumerator(); - - var n1 = paramParser.TokenNumber; - if (n1 == 3) - { - enumeratorParam.MoveNext(); - var propertyName = ((string)enumeratorParam.Current).Trim(); - mapping.PropertyName = propertyName; - - enumeratorParam.MoveNext(); - enumeratorParam.MoveNext(); //ignore ":" - var dBType = ((string)enumeratorParam.Current).Trim(); - mapping.DbType = dBType; - - ITypeHandler handler = null; - if (parameterClassType == null) - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - else - handler = ResolveTypeHandler(scope.DataExchangeFactory.TypeHandlerFactory, parameterClassType, propertyName, null, dBType); - mapping.TypeHandler = handler; - mapping.Initialize(scope, parameterClassType); - } - else if (n1 >= 5) - { - enumeratorParam.MoveNext(); - var propertyName = ((string)enumeratorParam.Current).Trim(); - enumeratorParam.MoveNext(); - enumeratorParam.MoveNext(); //ignore ":" - var dBType = ((string)enumeratorParam.Current).Trim(); - enumeratorParam.MoveNext(); - enumeratorParam.MoveNext(); //ignore ":" - var nullValue = ((string)enumeratorParam.Current).Trim(); - while (enumeratorParam.MoveNext()) nullValue = nullValue + ((string)enumeratorParam.Current).Trim(); - - mapping.PropertyName = propertyName; - mapping.DbType = dBType; - mapping.NullValue = nullValue; - ITypeHandler handler = null; - if (parameterClassType == null) - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - else - handler = ResolveTypeHandler(scope.DataExchangeFactory.TypeHandlerFactory, parameterClassType, propertyName, null, dBType); - mapping.TypeHandler = handler; - mapping.Initialize(scope, parameterClassType); - } - else - { - throw new ConfigurationException("Incorrect inline parameter map format: " + token); - } - } - else - { - mapping.PropertyName = token; - ITypeHandler handler = null; - if (parameterClassType == null) - handler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - else - handler = ResolveTypeHandler(scope.DataExchangeFactory.TypeHandlerFactory, parameterClassType, token, null, null); - mapping.TypeHandler = handler; - mapping.Initialize(scope, parameterClassType); - } - - return mapping; - } - - - /// - /// Resolve TypeHandler - /// - /// - /// - /// - /// - /// - /// - private ITypeHandler ResolveTypeHandler(TypeHandlerFactory typeHandlerFactory, - Type parameterClassType, string propertyName, - string propertyType, string dbType) - { - ITypeHandler handler = null; - - if (parameterClassType == null) - { - handler = typeHandlerFactory.GetUnkownTypeHandler(); - } - else if (typeof(IDictionary).IsAssignableFrom(parameterClassType)) - { - if (propertyType == null || propertyType.Length == 0) - handler = typeHandlerFactory.GetUnkownTypeHandler(); - else - try - { - var typeClass = TypeUtils.ResolveType(propertyType); - handler = typeHandlerFactory.GetTypeHandler(typeClass, dbType); - } - catch (Exception e) - { - throw new ConfigurationException("Error. Could not set TypeHandler. Cause: " + e.Message, e); - } - } - else if (typeHandlerFactory.GetTypeHandler(parameterClassType, dbType) != null) - { - handler = typeHandlerFactory.GetTypeHandler(parameterClassType, dbType); - } - else - { - var typeClass = ObjectProbe.GetMemberTypeForGetter(parameterClassType, propertyName); - handler = typeHandlerFactory.GetTypeHandler(typeClass, dbType); - } - - return handler; - } - - #region Fields - private const string PARAMETER_TOKEN = "#"; - private const string PARAM_DELIM = ":"; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ParameterMapping/ParameterMap.cs b/ORBatis.Core/Configuration/ParameterMapping/ParameterMap.cs deleted file mode 100644 index 7180e1a..0000000 --- a/ORBatis.Core/Configuration/ParameterMapping/ParameterMap.cs +++ /dev/null @@ -1,324 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 575902 $ - * $Date: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Logging; -using IBatisNet.DataMapper.Configuration.Serializers; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.Scope; -using System.Collections; -using System.Data; -using System.Reflection; -using System.Xml; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping; - -/// -/// Summary description for ParameterMap. -/// -[Serializable] -[XmlRoot("parameterMap", Namespace = "http://ibatis.apache.org/mapping")] -public class ParameterMap -{ - /// - /// Token for xml path to parameter elements. - /// - private const string XML_PARAMATER = "parameter"; - - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - /// - public ParameterMap(DataExchangeFactory dataExchangeFactory) - { - _dataExchangeFactory = dataExchangeFactory; - } - #endregion - - #region private - private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - - [NonSerialized] private string _id = string.Empty; - - [NonSerialized] - // Properties list - private ParameterPropertyCollection _properties = new(); - - // Same list as _properties but without doubled (Test UpdateAccountViaParameterMap2) - [NonSerialized] private ParameterPropertyCollection _propertiesList = new(); - - //(property Name, property) - [NonSerialized] private Hashtable _propertiesMap = new(); // Corrected ?? Support Request 1043181, move to HashTable - - [NonSerialized] private string _extendMap = string.Empty; - - [NonSerialized] private bool _usePositionalParameters; - - [NonSerialized] private string _className = string.Empty; - - [NonSerialized] private Type _parameterClass; - - [NonSerialized] private DataExchangeFactory _dataExchangeFactory; - - [NonSerialized] private IDataExchange _dataExchange; - #endregion - - #region Properties - /// - /// The parameter class name. - /// - [XmlAttribute("class")] - public string ClassName - { - get => _className; - set - { - if (_logger.IsInfoEnabled) - if (value == null || value.Length < 1) - _logger.Info("The class attribute is recommended for better performance in a ParameterMap tag '" + _id + "'."); - - - _className = value; - } - } - - /// - /// The parameter type class. - /// - [XmlIgnore] - public Type Class - { - set => _parameterClass = value; - get => _parameterClass; - } - - /// - /// Identifier used to identify the ParameterMap amongst the others. - /// - [XmlAttribute("id")] - public string Id - { - get => _id; - set - { - if (value == null || value.Length < 1) - throw new ArgumentNullException("The id attribute is mandatory in a ParameterMap tag."); - - _id = value; - } - } - - - /// - /// The collection of ParameterProperty - /// - [XmlIgnore] - public ParameterPropertyCollection Properties => _properties; - - /// - /// - [XmlIgnore] - public ParameterPropertyCollection PropertiesList => _propertiesList; - - /// - /// Extend Parametermap attribute - /// - /// The id of a ParameterMap - [XmlAttribute("extends")] - public string ExtendMap - { - get => _extendMap; - set => _extendMap = value; - } - - /// - /// Sets the IDataExchange - /// - [XmlIgnore] - public IDataExchange DataExchange - { - set => _dataExchange = value; - } - #endregion - - #region Methods - /// - /// Get the ParameterProperty at index. - /// - /// Index - /// A ParameterProperty - public ParameterProperty GetProperty(int index) - { - if (_usePositionalParameters) //obdc/oledb - return _properties[index]; - - return _propertiesList[index]; - } - - /// - /// Get a ParameterProperty by his name. - /// - /// The name of the ParameterProperty - /// A ParameterProperty - public ParameterProperty GetProperty(string name) - { - return (ParameterProperty)_propertiesMap[name]; - } - - - /// - /// Add a ParameterProperty to the ParameterProperty list. - /// - /// - public void AddParameterProperty(ParameterProperty property) - { - // These mappings will replace any mappings that this map - // had for any of the keys currently in the specified map. - _propertiesMap[property.PropertyName] = property; - _properties.Add(property); - - if (_propertiesList.Contains(property) == false) _propertiesList.Add(property); - } - - /// - /// Insert a ParameterProperty ine the ParameterProperty list at the specified index.. - /// - /// - /// The zero-based index at which ParameterProperty should be inserted. - /// - /// The ParameterProperty to insert. - public void InsertParameterProperty(int index, ParameterProperty property) - { - // These mappings will replace any mappings that this map - // had for any of the keys currently in the specified map. - _propertiesMap[property.PropertyName] = property; - _properties.Insert(index, property); - - if (_propertiesList.Contains(property) == false) _propertiesList.Insert(index, property); - } - - /// - /// Retrieve the index for array property - /// - /// - /// - public int GetParameterIndex(string propertyName) - { - var idx = -1; - //idx = (Integer) parameterMappingIndex.get(propertyName); - idx = Convert.ToInt32(propertyName.Replace("[", "").Replace("]", "")); - return idx; - } - - - /// - /// Get all Parameter Property Name - /// - /// A string array - public string[] GetPropertyNameArray() - { - var propertyNameArray = new string[_propertiesMap.Count]; - - for (var index = 0; index < _propertiesList.Count; index++) propertyNameArray[index] = _propertiesList[index].PropertyName; - return propertyNameArray; - } - - - /// - /// Set parameter value, replace the null value if any. - /// - /// - /// - /// - public void SetParameter(ParameterProperty mapping, IDataParameter dataParameter, object parameterValue) - { - var value = _dataExchange.GetData(mapping, parameterValue); - - var typeHandler = mapping.TypeHandler; - - // Apply Null Value - if (mapping.HasNullValue) - if (typeHandler.Equals(value, mapping.NullValue)) - value = null; - - typeHandler.SetParameter(dataParameter, value, mapping.DbType); - } - - /// - /// Set output parameter value. - /// - /// - /// - /// - public void SetOutputParameter(ref object target, ParameterProperty mapping, object dataBaseValue) - { - _dataExchange.SetData(ref target, mapping, dataBaseValue); - } - - #region Configuration - /// - /// Initialize the parameter properties child. - /// - /// - /// - public void Initialize(bool usePositionalParameters, IScope scope) - { - _usePositionalParameters = usePositionalParameters; - if (_className.Length > 0) - { - _parameterClass = _dataExchangeFactory.TypeHandlerFactory.GetType(_className); - _dataExchange = _dataExchangeFactory.GetDataExchangeForClass(_parameterClass); - } - else - { - // Get the ComplexDataExchange - _dataExchange = _dataExchangeFactory.GetDataExchangeForClass(null); - } - } - - - /// - /// Get the parameter properties child for the xmlNode parameter. - /// - /// - public void BuildProperties(ConfigurationScope configScope) - { - ParameterProperty property = null; - - foreach (XmlNode parameterNode in configScope.NodeContext.SelectNodes(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_PARAMATER), configScope.XmlNamespaceManager)) - { - property = ParameterPropertyDeSerializer.Deserialize(parameterNode, configScope); - - property.Initialize(configScope, _parameterClass); - - AddParameterProperty(property); - } - } - #endregion - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ParameterMapping/ParameterProperty.cs b/ORBatis.Core/Configuration/ParameterMapping/ParameterProperty.cs deleted file mode 100644 index 0d5d62a..0000000 --- a/ORBatis.Core/Configuration/ParameterMapping/ParameterProperty.cs +++ /dev/null @@ -1,375 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 575902 $ - * $LastChangedDate: 2007-09-15 04:40:19 -0600 (Sat, 15 Sep 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; -using System.Collections; -using System.Data; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping; - -/// -/// Summary description for ParameterProperty. -/// -[Serializable] -[XmlRoot("parameter", Namespace = "http://ibatis.apache.org/mapping")] -public class ParameterProperty -{ - #region ICloneable Members - /// - /// Clones this instance. - /// - /// An - public ParameterProperty Clone() - { - var property = new ParameterProperty(); - - property.CallBackName = CallBackName; - property.CLRType = CLRType; - property.ColumnName = ColumnName; - property.DbType = DbType; - property.DirectionAttribute = DirectionAttribute; - property.NullValue = NullValue; - property.PropertyName = PropertyName; - property.Precision = Precision; - property.Scale = Scale; - property.Size = Size; - - return property; - } - #endregion - - #region Fields - [NonSerialized] private string _nullValue; //string.Empty;//null; - - [NonSerialized] private string _propertyName = string.Empty; - - [NonSerialized] private ParameterDirection _direction = ParameterDirection.Input; - - [NonSerialized] private string _directionAttribute = string.Empty; - - [NonSerialized] private string _dbType; - - [NonSerialized] private int _size = -1; - - [NonSerialized] private byte _scale; - - [NonSerialized] private byte _precision; - - [NonSerialized] private string _columnName = string.Empty; // used only for store procedure - - [NonSerialized] private ITypeHandler _typeHandler; - - [NonSerialized] private string _clrType = string.Empty; - - [NonSerialized] private string _callBackName = string.Empty; - - [NonSerialized] private IGetAccessor _getAccessor; - - [NonSerialized] private bool _isComplexMemberName; - #endregion - - #region Properties - /// - /// Indicate if we have a complex member name as [avouriteLineItem.Id] - /// - public bool IsComplexMemberName => _isComplexMemberName; - - /// - /// Specify the custom type handlers to used. - /// - /// Will be an alias to a class wchic implement ITypeHandlerCallback - [XmlAttribute("typeHandler")] - public string CallBackName - { - get => _callBackName; - set => _callBackName = value; - } - - /// - /// Specify the CLR type of the parameter. - /// - /// - /// The type attribute is used to explicitly specify the property type to be read. - /// Normally this can be derived from a property through reflection, but certain mappings such as - /// HashTable cannot provide the type to the framework. - /// - [XmlAttribute("type")] - public string CLRType - { - get => _clrType; - set => _clrType = value; - } - - /// - /// The typeHandler used to work with the parameter. - /// - [XmlIgnore] - public ITypeHandler TypeHandler - { - get => _typeHandler; - set => _typeHandler = value; - } - - /// - /// Column Name for output parameter - /// in store proccedure. - /// - [XmlAttribute("column")] - public string ColumnName - { - get => _columnName; - set => _columnName = value; - } - - /// - /// Column size. - /// - [XmlAttribute("size")] - public int Size - { - get => _size; - set => _size = value; - } - - /// - /// Column Scale. - /// - [XmlAttribute("scale")] - public byte Scale - { - get => _scale; - set => _scale = value; - } - - /// - /// Column Precision. - /// - [XmlAttribute("precision")] - public byte Precision - { - get => _precision; - set => _precision = value; - } - - /// - /// Give an entry in the 'DbType' enumeration - /// - /// - /// For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... - ///
    - /// For Oracle, give an OracleType Enumeration : Byte, Int16, Number... - ///
    - [XmlAttribute("dbType")] - public string DbType - { - get => _dbType; - set => _dbType = value; - } - - /// - /// The direction attribute of the XML parameter. - /// - /// Input, Output, InputOutput - [XmlAttribute("direction")] - public string DirectionAttribute - { - get => _directionAttribute; - set => _directionAttribute = value; - } - - /// - /// Indicate the direction of the parameter. - /// - /// Input, Output, InputOutput - [XmlIgnore] - public ParameterDirection Direction - { - get => _direction; - set - { - _direction = value; - _directionAttribute = _direction.ToString(); - } - } - - /// - /// Property name used to identify the property amongst the others. - /// - /// EmailAddress - [XmlAttribute("property")] - public string PropertyName - { - get => _propertyName; - set - { - if (value == null || value.Length < 1) - throw new ArgumentNullException("The property attribute is mandatory in a paremeter property."); - - _propertyName = value; - if (_propertyName.IndexOf('.') < 0) - _isComplexMemberName = false; - else // complex member name FavouriteLineItem.Id - _isComplexMemberName = true; - } - } - - /// - /// Tell if a nullValue is defined._nullValue!=null - /// - [XmlIgnore] - public bool HasNullValue => _nullValue != null; - - /// - /// Null value replacement. - /// - /// "no_email@provided.com" - [XmlAttribute("nullValue")] - public string NullValue - { - get => _nullValue; - set => _nullValue = value; - } - - /// - /// Defines a field/property get accessor - /// - [XmlIgnore] - public IGetAccessor GetAccessor => _getAccessor; - #endregion - - #region Methods - /// - /// Initializes the parameter property - /// - /// The scope. - /// The parameter class. - public void Initialize(IScope scope, Type parameterClass) - { - if (_directionAttribute.Length > 0) _direction = (ParameterDirection)Enum.Parse(typeof(ParameterDirection), _directionAttribute, true); - - if (!typeof(IDictionary).IsAssignableFrom(parameterClass) // Hashtable parameter map - && parameterClass != null // value property - && !scope.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(parameterClass)) // value property - { - if (!_isComplexMemberName) - { - var getAccessorFactory = scope.DataExchangeFactory.AccessorFactory.GetAccessorFactory; - _getAccessor = getAccessorFactory.CreateGetAccessor(parameterClass, _propertyName); - } - else // complex member name FavouriteLineItem.Id - { - var memberName = _propertyName.Substring(_propertyName.LastIndexOf('.') + 1); - var parentName = _propertyName.Substring(0, _propertyName.LastIndexOf('.')); - var parentType = ObjectProbe.GetMemberTypeForGetter(parameterClass, parentName); - - var getAccessorFactory = scope.DataExchangeFactory.AccessorFactory.GetAccessorFactory; - _getAccessor = getAccessorFactory.CreateGetAccessor(parentType, memberName); - } - } - - scope.ErrorContext.MoreInfo = "Check the parameter mapping typeHandler attribute '" + CallBackName + "' (must be a ITypeHandlerCallback implementation)."; - if (CallBackName.Length > 0) - { - try - { - var type = scope.DataExchangeFactory.TypeHandlerFactory.GetType(CallBackName); - var typeHandlerCallback = (ITypeHandlerCallback)Activator.CreateInstance(type); - _typeHandler = new CustomTypeHandler(typeHandlerCallback); - } - catch (Exception e) - { - throw new ConfigurationException("Error occurred during custom type handler configuration. Cause: " + e.Message, e); - } - } - else - { - if (CLRType.Length == 0) // Unknown - { - if (_getAccessor != null && - scope.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(_getAccessor.MemberType)) - // Primitive - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(_getAccessor.MemberType, _dbType); - else - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else // If we specify a CLR type, use it - { - var type = TypeUtils.ResolveType(CLRType); - - if (scope.DataExchangeFactory.TypeHandlerFactory.IsSimpleType(type)) - { - // Primitive - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, _dbType); - } - else - { - // .NET object - type = ObjectProbe.GetMemberTypeForGetter(type, PropertyName); - _typeHandler = scope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, _dbType); - } - } - } - } - - - /// - /// Determines whether the specified is equal to the current - /// . - /// - /// The to compare with the current . - /// - /// true if the specified is equal to the current ; - /// otherwise, false. - /// - public override bool Equals(object obj) - { - //Check for null and compare run-time types. - if (obj == null || GetType() != obj.GetType()) return false; - var p = (ParameterProperty)obj; - return PropertyName == p.PropertyName; - } - - - /// - /// Serves as a hash function for a particular type. is suitable for use - /// in hashing algorithms and data structures like a hash table. - /// - /// - /// A hash code for the current . - /// - public override int GetHashCode() - { - return _propertyName.GetHashCode(); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ParameterMapping/ParameterPropertyCollection.cs b/ORBatis.Core/Configuration/ParameterMapping/ParameterPropertyCollection.cs deleted file mode 100644 index 17654ee..0000000 --- a/ORBatis.Core/Configuration/ParameterMapping/ParameterPropertyCollection.cs +++ /dev/null @@ -1,207 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.DataMapper.Configuration.ParameterMapping; - -/// -/// A ParameterProperty Collection. -/// -public class ParameterPropertyCollection -{ - private const int DEFAULT_CAPACITY = 4; - private const int CAPACITY_MULTIPLIER = 2; - private ParameterProperty[] _innerList; - - - /// - /// Constructs a ParameterProperty collection. The list is initially empty and has a capacity - /// of zero. Upon adding the first element to the list the capacity is - /// increased to 8, and then increased in multiples of two as required. - /// - public ParameterPropertyCollection() - { - _innerList = new ParameterProperty[DEFAULT_CAPACITY]; - Count = 0; - } - - /// - /// Constructs a ParameterPropertyCollection with a given initial capacity. - /// The list is initially empty, but will have room for the given number of elements - /// before any reallocations are required. - /// - /// The initial capacity of the list - public ParameterPropertyCollection(int capacity) - { - if (capacity < 0) throw new ArgumentOutOfRangeException("Capacity", "The size of the list must be >0."); - _innerList = new ParameterProperty[capacity]; - } - - - /// - /// Read-only property describing how many elements are in the Collection. - /// - public int Count { get; private set; } - - /// - /// Length of the collection - /// - public int Length => _innerList.Length; - - - /// - /// Sets or Gets the ParameterProperty at the given index. - /// - public ParameterProperty this[int index] - { - get - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - return _innerList[index]; - } - set - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - _innerList[index] = value; - } - } - - - /// - /// Add an ParameterProperty - /// - /// - /// Index - public int Add(ParameterProperty value) - { - Resize(Count + 1); - var index = Count++; - _innerList[index] = value; - - return index; - } - - - /// - /// Add a list of ParameterProperty to the collection - /// - /// - public void AddRange(ParameterProperty[] value) - { - for (var i = 0; i < value.Length; i++) Add(value[i]); - } - - - /// - /// Add a list of ParameterProperty to the collection - /// - /// - public void AddRange(ParameterPropertyCollection value) - { - for (var i = 0; i < value.Count; i++) Add(value[i]); - } - - - /// - /// Indicate if a ParameterProperty is in the collection - /// - /// A ParameterProperty - /// True fi is in - public bool Contains(ParameterProperty value) - { - for (var i = 0; i < Count; i++) - if (_innerList[i].PropertyName == value.PropertyName) - return true; - - return false; - } - - - /// - /// Insert a ParameterProperty in the collection. - /// - /// Index where to insert. - /// A ParameterProperty - public void Insert(int index, ParameterProperty value) - { - if (index < 0 || index > Count) throw new ArgumentOutOfRangeException("index"); - - Resize(Count + 1); - Array.Copy(_innerList, index, _innerList, index + 1, Count - index); - _innerList[index] = value; - Count++; - } - - - /// - /// Remove a ParameterProperty of the collection. - /// - public void Remove(ParameterProperty value) - { - for (var i = 0; i < Count; i++) - if (_innerList[i].PropertyName == value.PropertyName) - { - RemoveAt(i); - return; - } - } - - /// - /// Removes a ParameterProperty at the given index. The size of the list is - /// decreased by one. - /// - /// - public void RemoveAt(int index) - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - - var remaining = Count - index - 1; - - if (remaining > 0) Array.Copy(_innerList, index + 1, _innerList, index, remaining); - - Count--; - _innerList[Count] = null; - } - - /// - /// Ensures that the capacity of this collection is at least the given minimum - /// value. If the currect capacity of the list is less than min, the - /// capacity is increased to twice the current capacity. - /// - /// - private void Resize(int minSize) - { - var oldSize = _innerList.Length; - - if (minSize > oldSize) - { - var oldEntries = _innerList; - var newSize = oldEntries.Length * CAPACITY_MULTIPLIER; - - if (newSize < minSize) newSize = minSize; - _innerList = new ParameterProperty[newSize]; - Array.Copy(oldEntries, 0, _innerList, 0, Count); - } - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/ArgumentProperty.cs b/ORBatis.Core/Configuration/ResultMapping/ArgumentProperty.cs deleted file mode 100644 index 93448e4..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/ArgumentProperty.cs +++ /dev/null @@ -1,202 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-05-20 15:56:36 -0600 (Sat, 20 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Utilities; -using IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; -using System.Collections; -using System.Configuration; -using System.Reflection; -using System.Xml.Serialization; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// Summary description for ArgumentProperty. -/// -[Serializable] -[XmlRoot("argument", Namespace = "http://ibatis.apache.org/mapping")] -public class ArgumentProperty : ResultProperty -{ - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public ArgumentProperty() { } - #endregion - - #region Fields - [NonSerialized] private string _argumentName = string.Empty; - - [NonSerialized] private Type _argumentType; - - [NonSerialized] private IArgumentStrategy _argumentStrategy; - #endregion - - #region Properties - /// - /// Sets or gets the used to fill the object property. - /// - [XmlIgnore] - public override IArgumentStrategy ArgumentStrategy - { - set => _argumentStrategy = value; - get => _argumentStrategy; - } - - /// - /// Specify the constructor argument name. - /// - [XmlAttribute("argumentName")] - public string ArgumentName - { - get => _argumentName; - set - { - if (value == null || value.Length < 1) throw new ArgumentNullException("The name attribute is mandatory in a argument tag."); - _argumentName = value; - } - } - - /// - /// Tell us if we must lazy load this property.. - /// - [XmlAttribute("lazyLoad")] - public override bool IsLazyLoad - { - get => false; - set => throw new InvalidOperationException("Argument property cannot be lazy load."); - } - - /// - /// Get the argument type - /// - [XmlIgnore] - public override Type MemberType => _argumentType; - #endregion - - #region Methods - /// - /// Initialize the argument property. - /// - /// - /// - public void Initialize(ConfigurationScope configScope, ConstructorInfo constructorInfo) - { - // Search argument by his name to set his type - var parameters = constructorInfo.GetParameters(); - - var found = false; - for (var i = 0; i < parameters.Length; i++) - { - found = parameters[i].Name == _argumentName; - if (found) - { - _argumentType = parameters[i].ParameterType; - break; - } - } - - if (CallBackName != null && CallBackName.Length > 0) - { - configScope.ErrorContext.MoreInfo = "Argument property (" + _argumentName + "), check the typeHandler attribute '" + CallBackName + "' (must be a ITypeHandlerCallback implementation)."; - try - { - var type = configScope.SqlMapper.TypeHandlerFactory.GetType(CallBackName); - var typeHandlerCallback = (ITypeHandlerCallback)Activator.CreateInstance(type); - TypeHandler = new CustomTypeHandler(typeHandlerCallback); - } - catch (Exception e) - { - throw new ConfigurationErrorsException("Error occurred during custom type handler configuration. Cause: " + e.Message, e); - } - } - else - { - configScope.ErrorContext.MoreInfo = "Argument property (" + _argumentName + ") set the typeHandler attribute."; - TypeHandler = ResolveTypeHandler(configScope, _argumentType, CLRType, DbType); - } - } - - /// - /// - /// - /// The argument type - /// - /// - /// - public ITypeHandler ResolveTypeHandler(ConfigurationScope configScope, Type argumenType, string clrType, string dbType) - { - ITypeHandler handler = null; - if (argumenType == null) - { - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - } - else if (typeof(IDictionary).IsAssignableFrom(argumenType)) - { - // IDictionary - if (clrType == null || clrType.Length == 0) - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - else - try - { - var type = TypeUtils.ResolveType(clrType); - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); - } - catch (Exception e) - { - throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); - } - } - else if (configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(argumenType, dbType) != null) - { - // Primitive - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(argumenType, dbType); - } - else - { - // .NET object - if (clrType == null || clrType.Length == 0) - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetUnkownTypeHandler(); - else - try - { - var type = TypeUtils.ResolveType(clrType); - handler = configScope.DataExchangeFactory.TypeHandlerFactory.GetTypeHandler(type, dbType); - } - catch (Exception e) - { - throw new ConfigurationErrorsException("Error. Could not set TypeHandler. Cause: " + e.Message, e); - } - } - - return handler; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/AutoResultMap.cs b/ORBatis.Core/Configuration/ResultMapping/AutoResultMap.cs deleted file mode 100644 index bc7b5cf..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/AutoResultMap.cs +++ /dev/null @@ -1,192 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 450157 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.DataExchange; -using System.Collections.Specialized; -using System.Data; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// Implementation of interface for auto mapping -/// -public class AutoResultMap : IResultMap -{ - [NonSerialized] private readonly IFactory _resultClassFactory; - - [NonSerialized] private IDataExchange _dataExchange; - - /// - /// Initializes a new instance of the class. - /// - /// The result class. - /// The result class factory. - /// The data exchange. - public AutoResultMap(Type resultClass, IFactory resultClassFactory, IDataExchange dataExchange) - { - Class = resultClass; - _resultClassFactory = resultClassFactory; - _dataExchange = dataExchange; - } - - /// - /// Clones this instance. - /// - /// - public AutoResultMap Clone() - { - return new AutoResultMap(Class, _resultClassFactory, _dataExchange); - } - - /// - /// Create an instance of result class. - /// - /// An object. - public object CreateInstanceOfResultClass() - { - if (Class.IsPrimitive || Class == typeof(string)) - { - var typeCode = Type.GetTypeCode(Class); - return TypeUtils.InstantiatePrimitiveType(typeCode); - } - - if (Class.IsValueType) - { - if (Class == typeof(DateTime)) return new DateTime(); - - if (Class == typeof(decimal)) return new decimal(); - - if (Class == typeof(Guid)) return Guid.Empty; - - if (Class == typeof(TimeSpan)) - return new TimeSpan(0); - if (Class.IsGenericType && typeof(Nullable<>).IsAssignableFrom(Class.GetGenericTypeDefinition())) return TypeUtils.InstantiateNullableType(Class); - - throw new NotImplementedException("Unable to instanciate value type"); - } - - return _resultClassFactory.CreateInstance(null); - } - - #region IResultMap Members - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - public StringCollection GroupByPropertyNames => throw new NotImplementedException("The property 'GroupByPropertyNames' is not implemented."); - - /// - /// The collection of ResultProperty. - /// - [XmlIgnore] - [field: NonSerialized] - public ResultPropertyCollection Properties { get; } = new(); - - /// - /// The GroupBy Properties. - /// - /// - public ResultPropertyCollection GroupByProperties => throw new NotImplementedException("The property 'GroupByProperties' is not implemented."); - - /// - /// The collection of constructor parameters. - /// - [XmlIgnore] - public ResultPropertyCollection Parameters => throw new NotImplementedException("The property 'Parameters' is not implemented."); - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - [field: NonSerialized] - public bool IsInitalized { get; set; } - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// - /// GetProduct - public string Id => Class.Name; - - - /// - /// The output type class of the resultMap. - /// - /// - [field: NonSerialized] - public Type Class { get; } - - - /// - /// Sets the IDataExchange - /// - /// - public IDataExchange DataExchange - { - set => _dataExchange = value; - } - - - /// - /// Create an instance Of result. - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// An object. - public object CreateInstanceOfResult(object[] parameters) - { - return CreateInstanceOfResultClass(); - } - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) - { - _dataExchange.SetData(ref target, property, dataBaseValue); - } - - /// - /// - /// - /// - public IResultMap ResolveSubMap(IDataReader dataReader) - { - return this; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/Discriminator.cs b/ORBatis.Core/Configuration/ResultMapping/Discriminator.cs deleted file mode 100644 index 90d14d4..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/Discriminator.cs +++ /dev/null @@ -1,213 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * Author : Gilles Bayon - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Apache Fondation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.DataMapper.Scope; -using System.Collections; -using System.Collections.Specialized; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// Summary description for Discriminator. -/// -[Serializable] -[XmlRoot("discriminator", Namespace = "http://ibatis.apache.org/mapping")] -public class Discriminator -{ - #region Constructor - /// - /// Constructor - /// - public Discriminator() - { - _resultMaps = new HybridDictionary(); - _subMaps = new ArrayList(); - } - #endregion - - #region Fields - [NonSerialized] private ResultProperty _mapping; - - /// - /// (discriminatorValue (string), ResultMap) - /// - [NonSerialized] private HybridDictionary _resultMaps; - - /// - /// The subMaps name who used this discriminator - /// - [NonSerialized] private ArrayList _subMaps; - - [NonSerialized] private string _nullValue = string.Empty; - - [NonSerialized] private string _columnName = string.Empty; - - [NonSerialized] private int _columnIndex = ResultProperty.UNKNOWN_COLUMN_INDEX; - - [NonSerialized] private string _dbType = string.Empty; - - [NonSerialized] private string _clrType = string.Empty; - - [NonSerialized] private string _callBackName = string.Empty; - #endregion - - #region Properties - /// - /// Specify the custom type handlers to used. - /// - /// Will be an alias to a class wchic implement ITypeHandlerCallback - [XmlAttribute("typeHandler")] - public string CallBackName - { - get => _callBackName; - set => _callBackName = value; - } - - /// - /// Give an entry in the 'DbType' enumeration - /// - /// - /// For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... - ///
    - /// For Oracle, give an OracleType Enumeration : Byte, Int16, Number... - ///
    - [XmlAttribute("dbType")] - public string DbType - { - get => _dbType; - set => _dbType = value; - } - - /// - /// Specify the CLR type of the result. - /// - /// - /// The type attribute is used to explicitly specify the property type of the property to be set. - /// Normally this can be derived from a property through reflection, but certain mappings such as - /// HashTable cannot provide the type to the framework. - /// - [XmlAttribute("type")] - public string CLRType - { - get => _clrType; - set => _clrType = value; - } - - /// - /// Column Index - /// - [XmlAttribute("columnIndex")] - public int ColumnIndex - { - get => _columnIndex; - set => _columnIndex = value; - } - - /// - /// Column Name - /// - [XmlAttribute("column")] - public string ColumnName - { - get => _columnName; - set => _columnName = value; - } - - /// - /// Null value replacement. - /// - /// "no_email@provided.com" - [XmlAttribute("nullValue")] - public string NullValue - { - get => _nullValue; - set => _nullValue = value; - } - - /// - /// Th underlying ResultProperty - /// - [XmlIgnore] - public ResultProperty ResultProperty => _mapping; - #endregion - - #region Methods - /// - /// Initilaize the underlying mapping - /// - /// - /// - public void SetMapping(ConfigurationScope configScope, Type resultClass) - { - configScope.ErrorContext.MoreInfo = "Initialize discriminator mapping"; - _mapping = new ResultProperty(); - _mapping.ColumnName = _columnName; - _mapping.ColumnIndex = _columnIndex; - _mapping.CLRType = _clrType; - _mapping.CallBackName = _callBackName; - _mapping.DbType = _dbType; - _mapping.NullValue = _nullValue; - - _mapping.Initialize(configScope, resultClass); - } - - /// - /// Initialize the Discriminator - /// - /// - public void Initialize(ConfigurationScope configScope) - { - // Set the ResultMaps - var count = _subMaps.Count; - for (var index = 0; index < count; index++) - { - var subMap = _subMaps[index] as SubMap; - _resultMaps.Add(subMap.DiscriminatorValue, configScope.SqlMapper.GetResultMap(subMap.ResultMapName)); - } - } - - /// - /// Add a subMap that the discrimator must treat - /// - /// A subMap - public void Add(SubMap subMap) - { - _subMaps.Add(subMap); - } - - /// - /// Find the SubMap to use. - /// - /// the discriminator value - /// The find ResultMap - public IResultMap GetSubMap(string discriminatorValue) - { - return _resultMaps[discriminatorValue] as ResultMap; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/IResultMap.cs b/ORBatis.Core/Configuration/ResultMapping/IResultMap.cs deleted file mode 100644 index d8a5df3..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/IResultMap.cs +++ /dev/null @@ -1,116 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 450157 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.DataMapper.DataExchange; -using System.Collections.Specialized; -using System.Data; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// This is a grouping of ResultMapping objects used to map results back to objects -/// -public interface IResultMap -{ - /// - /// The collection of constructor parameters. - /// - [XmlIgnore] - ResultPropertyCollection Parameters { get; } - - /// - /// The collection of ResultProperty. - /// - [XmlIgnore] - ResultPropertyCollection Properties { get; } - - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - ResultPropertyCollection GroupByProperties { get; } - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// GetProduct - [XmlAttribute("id")] - string Id { get; } - - /// - /// The GroupBy Properties name. - /// - [XmlIgnore] - StringCollection GroupByPropertyNames { get; } - - /// - /// The output type class of the resultMap. - /// - [XmlIgnore] - Type Class { get; } - - /// - /// Sets the IDataExchange - /// - [XmlIgnore] - IDataExchange DataExchange { set; } - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - [XmlIgnore] - bool IsInitalized { get; set; } - - - /// - /// Create an instance Of result. - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// An object. - object CreateInstanceOfResult(object[] parameters); - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue); - - /// - /// - /// - /// - IResultMap ResolveSubMap(IDataReader dataReader); -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/NullResultMap.cs b/ORBatis.Core/Configuration/ResultMapping/NullResultMap.cs deleted file mode 100644 index 8ddd393..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/NullResultMap.cs +++ /dev/null @@ -1,144 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.DataMapper.DataExchange; -using System.Collections.Specialized; -using System.Data; - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// -public class NullResultMap : IResultMap -{ - /// - /// Create an instance Of result. - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// An object. - public object CreateInstanceOfResult(object[] parameters) - { - return null; - } - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) - { - throw new Exception("The method or operation is not implemented."); - } - - /// - /// - /// - /// - public IResultMap ResolveSubMap(IDataReader dataReader) - { - throw new Exception("The method or operation is not implemented."); - } - - #region Properties - /// - /// The GroupBy Properties. - /// - [field: NonSerialized] - public StringCollection GroupByPropertyNames { get; } = new(); - - /// - /// The GroupBy Properties. - /// - [field: NonSerialized] - public ResultPropertyCollection GroupByProperties { get; } = new(); - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - public bool IsInitalized - { - get => throw new Exception("The method or operation is not implemented."); - set => throw new Exception("The method or operation is not implemented."); - } - - /// - /// The discriminator used to choose the good SubMap - /// - public Discriminator Discriminator - { - get => throw new Exception("The method or operation is not implemented."); - set => throw new Exception("The method or operation is not implemented."); - } - - /// - /// The collection of ResultProperty. - /// - [field: NonSerialized] - public ResultPropertyCollection Properties { get; } = new(); - - /// - /// The collection of constructor parameters. - /// - [field: NonSerialized] - public ResultPropertyCollection Parameters { get; } = new(); - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// GetProduct - public string Id => "NullResultMap.Id"; - - /// - /// Extend ResultMap attribute - /// - public string ExtendMap - { - get => throw new Exception("The method or operation is not implemented."); - set => throw new Exception("The method or operation is not implemented."); - } - - /// - /// The output type class of the resultMap. - /// - public Type Class => throw new Exception("The method or operation is not implemented."); - - - /// - /// Sets the IDataExchange - /// - public IDataExchange DataExchange - { - set => throw new Exception("The method or operation is not implemented."); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/ResultMap.cs b/ORBatis.Core/Configuration/ResultMapping/ResultMap.cs deleted file mode 100644 index badf895..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/ResultMap.cs +++ /dev/null @@ -1,460 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 638539 $ - * $LastChangedDate: 2008-03-18 13:53:02 -0600 (Tue, 18 Mar 2008) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.Serializers; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; -using System.Collections.Specialized; -using System.Data; -using System.Reflection; -using System.Xml; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// Main implementation of ResultMap interface -/// -[Serializable] -[XmlRoot("resultMap", Namespace = "http://ibatis.apache.org/mapping")] -public class ResultMap : IResultMap -{ - /// - /// Token for xml path to result elements. - /// - private const string XML_RESULT = "result"; - - /// - /// Token for xml path to result elements. - /// - private const string XML_CONSTRUCTOR_ARGUMENT = "constructor/argument"; - - /// - /// Token for xml path to discriminator elements. - /// - private const string XML_DISCRIMNATOR = "discriminator"; - - /// - /// Token for xml path to subMap elements. - /// - private const string XML_SUBMAP = "subMap"; - - /// - /// Token for xml path to argument constructor elements. - /// - public static BindingFlags ANY_VISIBILITY_INSTANCE = BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic; - - private static IResultMap _nullResultMap; - - #region Constructor (s) / Destructor - /// - /// Initializes a new instance of the class. - /// - /// The config scope. - /// The output class name of the resultMap. - /// The extend result map bame. - /// Identifier used to identify the resultMap amongst the others. - /// The groupBy properties - public ResultMap(ConfigurationScope configScope, string id, string className, string extendMap, string groupBy) - { - _nullResultMap = new NullResultMap(); - - _dataExchangeFactory = configScope.DataExchangeFactory; - _sqlMapNameSpace = configScope.SqlMapNamespace; - if (id == null || id.Length < 1) throw new ArgumentNullException("The id attribute is mandatory in a ResultMap tag."); - _id = configScope.ApplyNamespace(id); - if (className == null || className.Length < 1) throw new ArgumentNullException("The class attribute is mandatory in the ResultMap tag id:" + _id); - _className = className; - _extendMap = extendMap; - if (groupBy != null && groupBy.Length > 0) - { - var groupByProperties = groupBy.Split(','); - for (var i = 0; i < groupByProperties.Length; i++) - { - var memberName = groupByProperties[i].Trim(); - _groupByPropertyNames.Add(memberName); - } - } - } - #endregion - - #region Fields - [NonSerialized] private bool _isInitalized = true; - - [NonSerialized] private string _id = string.Empty; - - [NonSerialized] private string _className = string.Empty; - - [NonSerialized] private string _extendMap = string.Empty; - - [NonSerialized] private Type _class; - - [NonSerialized] private StringCollection _groupByPropertyNames = new(); - - [NonSerialized] private ResultPropertyCollection _properties = new(); - - [NonSerialized] private ResultPropertyCollection _groupByProperties = new(); - - [NonSerialized] private ResultPropertyCollection _parameters = new(); - - [NonSerialized] private Discriminator _discriminator; - - [NonSerialized] private string _sqlMapNameSpace = string.Empty; - - [NonSerialized] private IFactory _objectFactory; - - [NonSerialized] private DataExchangeFactory _dataExchangeFactory; - - [NonSerialized] private IDataExchange _dataExchange; - #endregion - - #region Properties - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - public StringCollection GroupByPropertyNames => _groupByPropertyNames; - - /// - /// Gets or sets a value indicating whether this instance is initalized. - /// - /// - /// true if this instance is initalized; otherwise, false. - /// - public bool IsInitalized - { - get => true; - set => _isInitalized = value; - } - - /// - /// The discriminator used to choose the good SubMap - /// - [XmlIgnore] - public Discriminator Discriminator - { - get => _discriminator; - set => _discriminator = value; - } - - /// - /// The collection of ResultProperty. - /// - [XmlIgnore] - public ResultPropertyCollection Properties => _properties; - - /// - /// The GroupBy Properties. - /// - [XmlIgnore] - public ResultPropertyCollection GroupByProperties => _groupByProperties; - - /// - /// The collection of constructor parameters. - /// - [XmlIgnore] - public ResultPropertyCollection Parameters => _parameters; - - /// - /// Identifier used to identify the resultMap amongst the others. - /// - /// GetProduct - [XmlAttribute("id")] - public string Id => _id; - - /// - /// Extend ResultMap attribute - /// - [XmlAttribute("extends")] - public string ExtendMap - { - get => _extendMap; - set => _extendMap = value; - } - - /// - /// The output type class of the resultMap. - /// - [XmlIgnore] - public Type Class => _class; - - - /// - /// Sets the IDataExchange - /// - [XmlIgnore] - public IDataExchange DataExchange - { - set => _dataExchange = value; - } - #endregion - - #region Methods - #region Configuration - /// - /// Initialize the resultMap from an xmlNode.. - /// - /// - public void Initialize(ConfigurationScope configScope) - { - try - { - _class = configScope.SqlMapper.TypeHandlerFactory.GetType(_className); - _dataExchange = _dataExchangeFactory.GetDataExchangeForClass(_class); - - // Load the child node - GetChildNode(configScope); - - // Verify that that each groupBy element correspond to a class member - // of one of result property - for (var i = 0; i < _groupByProperties.Count; i++) - { - var memberName = GroupByPropertyNames[i]; - if (!_properties.Contains(memberName)) - throw new ConfigurationException( - string.Format( - "Could not configure ResultMap named \"{0}\". Check the groupBy attribute. Cause: there's no result property named \"{1}\".", - _id, memberName)); - } - } - catch (Exception e) - { - throw new ConfigurationException( - string.Format("Could not configure ResultMap named \"{0}\", Cause: {1}", _id, e.Message) - , e); - } - } - - /// - /// Initializes the groupBy properties. - /// - public void InitializeGroupByProperties() - { - for (var i = 0; i < GroupByPropertyNames.Count; i++) - { - var resultProperty = Properties.FindByPropertyName(GroupByPropertyNames[i]); - GroupByProperties.Add(resultProperty); - } - } - - - /// - /// Get the result properties and the subMap properties. - /// - /// - private void GetChildNode(ConfigurationScope configScope) - { - ResultProperty mapping = null; - SubMap subMap = null; - - #region Load the parameters constructor - var nodeList = configScope.NodeContext.SelectNodes(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_CONSTRUCTOR_ARGUMENT), configScope.XmlNamespaceManager); - if (nodeList.Count > 0) - { - var parametersType = new Type[nodeList.Count]; - var parametersName = new string[nodeList.Count]; - for (var i = 0; i < nodeList.Count; i++) - { - var argumentMapping = ArgumentPropertyDeSerializer.Deserialize(nodeList[i], configScope); - _parameters.Add(argumentMapping); - parametersName[i] = argumentMapping.ArgumentName; - } - - var constructorInfo = GetConstructor(_class, parametersName); - for (var i = 0; i < _parameters.Count; i++) - { - var argumentMapping = (ArgumentProperty)_parameters[i]; - - configScope.ErrorContext.MoreInfo = "initialize argument property : " + argumentMapping.ArgumentName; - argumentMapping.Initialize(configScope, constructorInfo); - parametersType[i] = argumentMapping.MemberType; - } - - // Init the object factory - _objectFactory = configScope.SqlMapper.ObjectFactory.CreateFactory(_class, parametersType); - } - else - { - if (Type.GetTypeCode(_class) == TypeCode.Object) _objectFactory = configScope.SqlMapper.ObjectFactory.CreateFactory(_class, Type.EmptyTypes); - } - #endregion - - #region Load the Result Properties - foreach (XmlNode resultNode in configScope.NodeContext.SelectNodes(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_RESULT), configScope.XmlNamespaceManager)) - { - mapping = ResultPropertyDeSerializer.Deserialize(resultNode, configScope); - - configScope.ErrorContext.MoreInfo = "initialize result property: " + mapping.PropertyName; - - mapping.Initialize(configScope, _class); - - _properties.Add(mapping); - } - #endregion - - #region Load the Discriminator Property - var discriminatorNode = configScope.NodeContext.SelectSingleNode(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_DISCRIMNATOR), configScope.XmlNamespaceManager); - if (discriminatorNode != null) - { - configScope.ErrorContext.MoreInfo = "initialize discriminator"; - - Discriminator = DiscriminatorDeSerializer.Deserialize(discriminatorNode, configScope); - Discriminator.SetMapping(configScope, _class); - } - #endregion - - #region Load the SubMap Properties - if (configScope.NodeContext.SelectNodes(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_SUBMAP), configScope.XmlNamespaceManager).Count > 0 && Discriminator == null) throw new ConfigurationException("The discriminator is null, but somehow a subMap was reached. This is a bug."); - foreach (XmlNode resultNode in configScope.NodeContext.SelectNodes(DomSqlMapBuilder.ApplyMappingNamespacePrefix(XML_SUBMAP), configScope.XmlNamespaceManager)) - { - configScope.ErrorContext.MoreInfo = "initialize subMap"; - subMap = SubMapDeSerializer.Deserialize(resultNode, configScope); - - Discriminator.Add(subMap); - } - #endregion - } - - /// - /// Sets the object factory. - /// - public void SetObjectFactory(ConfigurationScope configScope) - { - var parametersType = new Type[_parameters.Count]; - for (var i = 0; i < _parameters.Count; i++) - { - var argumentMapping = (ArgumentProperty)_parameters[i]; - parametersType[i] = argumentMapping.MemberType; - } - - // Init the object factory - _objectFactory = configScope.SqlMapper.ObjectFactory.CreateFactory(_class, parametersType); - } - - /// - /// Finds the constructor that takes the parameters. - /// - /// The to find the constructor in. - /// The parameters name to use to find the appropriate constructor. - /// - /// An that can be used to create the type with - /// the specified parameters. - /// - /// - /// Thrown when no constructor with the correct signature can be found. - /// - private ConstructorInfo GetConstructor(Type type, string[] parametersName) - { - var candidates = type.GetConstructors(ANY_VISIBILITY_INSTANCE); - foreach (var constructor in candidates) - { - var parameters = constructor.GetParameters(); - - if (parameters.Length == parametersName.Length) - { - var found = true; - - for (var j = 0; j < parameters.Length; j++) - { - var ok = parameters[j].Name == parametersName[j]; - if (!ok) - { - found = false; - break; - } - } - - if (found) return constructor; - } - } - - throw new DataMapperException("Cannot find an appropriate constructor which map parameters in class: " + type.Name); - } - #endregion - - /// - /// Create an instance Of result. - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// An object. - public object CreateInstanceOfResult(object[] parameters) - { - var typeCode = Type.GetTypeCode(_class); - - if (typeCode == TypeCode.Object) return _objectFactory.CreateInstance(parameters); - - return TypeUtils.InstantiatePrimitiveType(typeCode); - } - - /// - /// Set the value of an object property. - /// - /// The object to set the property. - /// The result property to use. - /// The database value to set. - public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) - { - _dataExchange.SetData(ref target, property, dataBaseValue); - } - - /// - /// - /// - /// - public IResultMap ResolveSubMap(IDataReader dataReader) - { - IResultMap subMap = this; - if (_discriminator != null) - { - var mapping = _discriminator.ResultProperty; - var dataBaseValue = mapping.GetDataBaseValue(dataReader); - - if (dataBaseValue != null) - { - subMap = _discriminator.GetSubMap(dataBaseValue.ToString()); - - if (subMap == null) - subMap = this; - else if (subMap != this) subMap = subMap.ResolveSubMap(dataReader); - } - else - { - subMap = _nullResultMap; - } - } - - return subMap; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/ResultMapCollection.cs b/ORBatis.Core/Configuration/ResultMapping/ResultMapCollection.cs deleted file mode 100644 index b957bad..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/ResultMapCollection.cs +++ /dev/null @@ -1,215 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 450157 $ - * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// Collection of -/// -public class ResultMapCollection -{ - private const int DEFAULT_CAPACITY = 2; - private const int CAPACITY_MULTIPLIER = 2; - private IResultMap[] _innerList; - - - /// - /// Constructs a ResultMapCollection. The list is initially empty and has a capacity - /// of zero. Upon adding the first element to the list the capacity is - /// increased to 8, and then increased in multiples of two as required. - /// - public ResultMapCollection() - { - Clear(); - } - - /// - /// Constructs a ResultMapCollection with a given initial capacity. - /// The list is initially empty, but will have room for the given number of elements - /// before any reallocations are required. - /// - /// The initial capacity of the list - public ResultMapCollection(int capacity) - { - if (capacity < 0) throw new ArgumentOutOfRangeException("Capacity", "The size of the list must be >0."); - _innerList = new IResultMap[capacity]; - } - - - /// - /// Read-only property describing how many elements are in the Collection. - /// - public int Count { get; private set; } - - /// - /// Length of the collection - /// - public int Length => _innerList.Length; - - - /// - /// Sets or Gets the ResultMap at the given index. - /// - public IResultMap this[int index] - { - get - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - return _innerList[index]; - } - set - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - _innerList[index] = value; - } - } - - /// - /// Removes all items from the collection. - /// - public void Clear() - { - _innerList = new IResultMap[DEFAULT_CAPACITY]; - Count = 0; - } - - - /// - /// Add an ResultMap - /// - /// - /// Index - public int Add(IResultMap value) - { - Resize(Count + 1); - var index = Count++; - _innerList[index] = value; - - return index; - } - - - /// - /// Add a list of ResultMap to the collection - /// - /// - public void AddRange(IResultMap[] value) - { - for (var i = 0; i < value.Length; i++) Add(value[i]); - } - - - /// - /// Add a list of ResultMap to the collection - /// - /// - public void AddRange(ResultMapCollection value) - { - for (var i = 0; i < value.Count; i++) Add(value[i]); - } - - - /// - /// Indicate if a ResultMap is in the collection - /// - /// A ResultMap - /// True fi is in - public bool Contains(IResultMap value) - { - for (var i = 0; i < Count; i++) - if (_innerList[i].Id == value.Id) - return true; - - return false; - } - - - /// - /// Insert a ResultMap in the collection. - /// - /// Index where to insert. - /// A ResultMap - public void Insert(int index, IResultMap value) - { - if (index < 0 || index > Count) throw new ArgumentOutOfRangeException("index"); - - Resize(Count + 1); - Array.Copy(_innerList, index, _innerList, index + 1, Count - index); - _innerList[index] = value; - Count++; - } - - - /// - /// Remove a ResultMap of the collection. - /// - public void Remove(IResultMap value) - { - for (var i = 0; i < Count; i++) - if (_innerList[i].Id == value.Id) - { - RemoveAt(i); - return; - } - } - - /// - /// Removes a ResultMap at the given index. The size of the list is - /// decreased by one. - /// - /// - public void RemoveAt(int index) - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - - var remaining = Count - index - 1; - - if (remaining > 0) Array.Copy(_innerList, index + 1, _innerList, index, remaining); - - Count--; - _innerList[Count] = null; - } - - /// - /// Ensures that the capacity of this collection is at least the given minimum - /// value. If the currect capacity of the list is less than min, the - /// capacity is increased to twice the current capacity. - /// - /// - private void Resize(int minSize) - { - var oldSize = _innerList.Length; - - if (minSize > oldSize) - { - var oldEntries = _innerList; - var newSize = oldEntries.Length * CAPACITY_MULTIPLIER; - - if (newSize < minSize) newSize = minSize; - _innerList = new IResultMap[newSize]; - Array.Copy(oldEntries, 0, _innerList, 0, Count); - } - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/ResultProperty.cs b/ORBatis.Core/Configuration/ResultMapping/ResultProperty.cs deleted file mode 100644 index 02cc08d..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/ResultProperty.cs +++ /dev/null @@ -1,540 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 609139 $ - * $LastChangedDate: 2008-01-05 06:47:58 -0700 (Sat, 05 Jan 2008) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.MappedStatements.ArgumentStrategy; -using IBatisNet.DataMapper.MappedStatements.PropertyStrategy; -using IBatisNet.DataMapper.Proxy; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; -using System.Collections; -using System.Data; -using System.Globalization; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// Summary description for ResultProperty. -/// -[Serializable] -[XmlRoot("result", Namespace = "http://ibatis.apache.org/mapping")] -public class ResultProperty -{ - #region Const - /// - /// - public const int UNKNOWN_COLUMN_INDEX = -999999; - #endregion - - #region ICloneable Members - /// - /// Clones this instance. - /// - /// An - public ResultProperty Clone() - { - var resultProperty = new ResultProperty(); - - resultProperty.CLRType = CLRType; - resultProperty.CallBackName = CallBackName; - resultProperty.ColumnIndex = ColumnIndex; - resultProperty.ColumnName = ColumnName; - resultProperty.DbType = DbType; - resultProperty.IsLazyLoad = IsLazyLoad; - resultProperty.NestedResultMapName = NestedResultMapName; - resultProperty.NullValue = NullValue; - resultProperty.PropertyName = PropertyName; - resultProperty.Select = Select; - - return resultProperty; - } - #endregion - - /// - /// that constructs instance - /// - private class ArrayListFactory : IFactory - { - #region IFactory Members - /// - /// Create a new instance with the specified parameters - /// - /// - /// An array of values that matches the number, order and type - /// of the parameters for this constructor. - /// - /// A new instance - /// - /// If you call a constructor with no parameters, pass null. - /// Anyway, what you pass will be ignore. - /// - public object CreateInstance(object[] parameters) - { - return new ArrayList(); - } - #endregion - } - - #region Fields - [NonSerialized] private ISetAccessor _setAccessor; - - [NonSerialized] private string _nullValue; - - [NonSerialized] private string _propertyName = string.Empty; - - [NonSerialized] private string _columnName = string.Empty; - - [NonSerialized] private int _columnIndex = UNKNOWN_COLUMN_INDEX; - - [NonSerialized] private string _select = string.Empty; - - [NonSerialized] private string _nestedResultMapName = string.Empty; - - [NonSerialized] private IResultMap _nestedResultMap; - - [NonSerialized] private string _dbType; - - [NonSerialized] private string _clrType = string.Empty; - - [NonSerialized] private bool _isLazyLoad; - - [NonSerialized] private ITypeHandler _typeHandler; - - [NonSerialized] private string _callBackName = string.Empty; - - [NonSerialized] private bool _isComplexMemberName; - - [NonSerialized] private IPropertyStrategy _propertyStrategy; - - [NonSerialized] private ILazyFactory _lazyFactory; - - [NonSerialized] private bool _isIList; - - [NonSerialized] private bool _isGenericIList; - - [NonSerialized] private IFactory _listFactory; - - [NonSerialized] private static readonly IFactory _arrayListFactory = new ArrayListFactory(); - #endregion - - #region Properties - /// - /// Tell us if the member type implement generic Ilist interface. - /// - [XmlIgnore] - public bool IsGenericIList => _isGenericIList; - - /// - /// Tell us if the member type implement Ilist interface. - /// - [XmlIgnore] - public bool IsIList => _isIList; - - /// - /// List factory for property - /// - /// Used by N+1 Select solution - [XmlIgnore] - public IFactory ListFactory => _listFactory; - - /// - /// The lazy loader factory - /// - [XmlIgnore] - public ILazyFactory LazyFactory => _lazyFactory; - - /// - /// Sets or gets the used to fill the object property. - /// - [XmlIgnore] - public virtual IArgumentStrategy ArgumentStrategy - { - set => throw new NotImplementedException("Valid on ArgumentProperty"); - get => throw new NotImplementedException("Valid on ArgumentProperty"); - } - - /// - /// Sets or gets the used to fill the object property. - /// - [XmlIgnore] - public IPropertyStrategy PropertyStrategy - { - set => _propertyStrategy = value; - get => _propertyStrategy; - } - - /// - /// Specify the custom type handlers to used. - /// - /// Will be an alias to a class wchic implement ITypeHandlerCallback - [XmlAttribute("typeHandler")] - public string CallBackName - { - get => _callBackName; - set => _callBackName = value; - } - - /// - /// Tell us if we must lazy load this property.. - /// - [XmlAttribute("lazyLoad")] - public virtual bool IsLazyLoad - { - get => _isLazyLoad; - set => _isLazyLoad = value; - } - - /// - /// The typeHandler used to work with the result property. - /// - [XmlIgnore] - public ITypeHandler TypeHandler - { - get - { - if (_typeHandler == null) - throw new DataMapperException( - string.Format("Error on Result property {0}, type handler for {1} is not registered.", PropertyName, MemberType.Name)); - return _typeHandler; - } - set => _typeHandler = value; - } - - /// - /// Give an entry in the 'DbType' enumeration - /// - /// - /// For Sql Server, give an entry of SqlDbType : Bit, Decimal, Money... - ///
    - /// For Oracle, give an OracleType Enumeration : Byte, Int16, Number... - ///
    - [XmlAttribute("dbType")] - public string DbType - { - get => _dbType; - set => _dbType = value; - } - - - /// - /// Specify the CLR type of the result. - /// - /// - /// The type attribute is used to explicitly specify the property type of the property to be set. - /// Normally this can be derived from a property through reflection, but certain mappings such as - /// HashTable cannot provide the type to the framework. - /// - [XmlAttribute("type")] - public string CLRType - { - get => _clrType; - set => _clrType = value; - } - - - /// - /// The name of the statement to retrieve the property - /// - [XmlAttribute("select")] - public string Select - { - get => _select; - set => _select = value; - } - - /// - /// The name of a nested ResultMap to set the property - /// - [XmlAttribute("resultMapping")] - public string NestedResultMapName - { - get => _nestedResultMapName; - set => _nestedResultMapName = value; - } - - /// - /// The property name used to identify the property amongst the others. - /// - [XmlAttribute("property")] - public string PropertyName - { - get => _propertyName; - set - { - _propertyName = value; - if (_propertyName.IndexOf('.') < 0) - _isComplexMemberName = false; - else // complex member name FavouriteLineItem.Id - _isComplexMemberName = true; - } - } - - /// - /// Defines a field/property - /// - [XmlIgnore] - public ISetAccessor SetAccessor => _setAccessor; - - /// - /// Get the field/property type - /// - [XmlIgnore] - public virtual Type MemberType - { - get - { - if (_setAccessor != null) return _setAccessor.MemberType; - - if (_nestedResultMap != null) return _nestedResultMap.Class; - - throw new IBatisNetException( - string.Format(CultureInfo.InvariantCulture, - "Could not resolve member type for result property '{0}'. Neither nested result map nor typed setter was provided.", - _propertyName)); - } - } - - /// - /// Tell if a nullValue is defined. - /// - [XmlIgnore] - public bool HasNullValue => _nullValue != null; - - /// - /// Null value replacement. - /// - /// "no_email@provided.com" - [XmlAttribute("nullValue")] - public string NullValue - { - get => _nullValue; - set => _nullValue = value; - } - - /// - /// A nested ResultMap use to set a property - /// - [XmlIgnore] - public IResultMap NestedResultMap - { - get => _nestedResultMap; - set => _nestedResultMap = value; - } - - /// - /// Indicate if we have a complex member name as [FavouriteLineItem.Id] - /// - public bool IsComplexMemberName => _isComplexMemberName; - - /// - /// Column Index - /// - [XmlAttribute("columnIndex")] - public int ColumnIndex - { - get => _columnIndex; - set => _columnIndex = value; - } - - /// - /// Column Name - /// - [XmlAttribute("column")] - public string ColumnName - { - get => _columnName; - set => _columnName = value; - } - #endregion - - #region Methods - /// - /// Initialize the PropertyInfo of the result property. - /// - /// - /// - public void Initialize(ConfigurationScope configScope, Type resultClass) - { - if (_propertyName.Length > 0 && - _propertyName != "value" && - !typeof(IDictionary).IsAssignableFrom(resultClass)) - { - if (!_isComplexMemberName) - { - _setAccessor = configScope.DataExchangeFactory.AccessorFactory.SetAccessorFactory.CreateSetAccessor(resultClass, _propertyName); - } - else // complex member name FavouriteLineItem.Id - { - var propertyInfo = ObjectProbe.GetMemberInfoForSetter(resultClass, _propertyName); - var memberName = _propertyName.Substring(_propertyName.LastIndexOf('.') + 1); - _setAccessor = configScope.DataExchangeFactory.AccessorFactory.SetAccessorFactory.CreateSetAccessor(propertyInfo.ReflectedType, memberName); - } - - _isGenericIList = TypeUtils.IsImplementGenericIListInterface(MemberType); - _isIList = typeof(IList).IsAssignableFrom(MemberType); - - // set the list factory - if (_isGenericIList) - { - if (MemberType.IsArray) - { - _listFactory = _arrayListFactory; - } - else - { - var typeArgs = MemberType.GetGenericArguments(); - - if (typeArgs.Length == 0) // Custom collection which derive from List - { - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory(MemberType, Type.EmptyTypes); - } - else - { - var genericIList = typeof(IList<>); - var interfaceListType = genericIList.MakeGenericType(typeArgs); - - var genericList = typeof(List<>); - var listType = genericList.MakeGenericType(typeArgs); - - if (interfaceListType == MemberType || listType == MemberType) - { - var constructedType = genericList.MakeGenericType(typeArgs); - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory( - constructedType, - Type.EmptyTypes); - } - else // Custom collection which derive from List - { - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory(MemberType, Type.EmptyTypes); - } - } - } - } - else if (_isIList) - { - if (MemberType.IsArray) - { - _listFactory = _arrayListFactory; - } - else - { - if (MemberType == typeof(IList)) - _listFactory = _arrayListFactory; - else // custom collection - _listFactory = configScope.DataExchangeFactory.ObjectFactory.CreateFactory(MemberType, Type.EmptyTypes); - } - } - } - - if (CallBackName != null && CallBackName.Length > 0) - { - configScope.ErrorContext.MoreInfo = "Result property '" + _propertyName + "' check the typeHandler attribute '" + CallBackName + "' (must be a ITypeHandlerCallback implementation)."; - try - { - var type = configScope.SqlMapper.TypeHandlerFactory.GetType(CallBackName); - var typeHandlerCallback = (ITypeHandlerCallback)Activator.CreateInstance(type); - _typeHandler = new CustomTypeHandler(typeHandlerCallback); - } - catch (Exception e) - { - throw new ConfigurationException("Error occurred during custom type handler configuration. Cause: " + e.Message, e); - } - } - else - { - configScope.ErrorContext.MoreInfo = "Result property '" + _propertyName + "' set the typeHandler attribute."; - _typeHandler = configScope.ResolveTypeHandler(resultClass, _propertyName, _clrType, _dbType, true); - } - - if (IsLazyLoad) - { - throw new InvalidOperationException("lazy not supported until we fix session"); - _lazyFactory = new LazyFactoryBuilder().GetLazyFactory(_setAccessor.MemberType); - } - } - - /// - /// Initialize a the result property - /// for AutoMapper - /// - /// An . - /// - internal void Initialize(TypeHandlerFactory typeHandlerFactory, ISetAccessor setAccessor) - { - _setAccessor = setAccessor; - _typeHandler = typeHandlerFactory.GetTypeHandler(setAccessor.MemberType); - } - - /// - /// - /// - /// - public object GetDataBaseValue(IDataReader dataReader) - { - object value = null; - - if (_columnIndex == UNKNOWN_COLUMN_INDEX) - value = TypeHandler.GetValueByName(this, dataReader); - else - value = TypeHandler.GetValueByIndex(this, dataReader); - - var wasNull = value == DBNull.Value; - if (wasNull) - { - if (HasNullValue) - { - if (_setAccessor != null) - value = TypeHandler.ValueOf(_setAccessor.MemberType, _nullValue); - else - value = TypeHandler.ValueOf(null, _nullValue); - } - else - { - value = TypeHandler.NullValue; - } - } - - return value; - } - - /// - /// - /// - /// - public object TranslateValue(object value) - { - if (value == null) return TypeHandler.NullValue; - - return value; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/ResultPropertyCollection.cs b/ORBatis.Core/Configuration/ResultMapping/ResultPropertyCollection.cs deleted file mode 100644 index e1e224d..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/ResultPropertyCollection.cs +++ /dev/null @@ -1,242 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2007-02-21 13:23:49 -0700 (Wed, 21 Feb 2007) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// A ResultProperty Collection. -/// -public class ResultPropertyCollection -{ - private const int DEFAULT_CAPACITY = 4; - private const int CAPACITY_MULTIPLIER = 2; - private ResultProperty[] _innerList; - - - /// - /// Constructs a ResultPropertyCollection. The list is initially empty and has a capacity - /// of zero. Upon adding the first element to the list the capacity is - /// increased to 8, and then increased in multiples of two as required. - /// - public ResultPropertyCollection() - { - Clear(); - } - - /// - /// Constructs a ResultPropertyCollection with a given initial capacity. - /// The list is initially empty, but will have room for the given number of elements - /// before any reallocations are required. - /// - /// The initial capacity of the list - public ResultPropertyCollection(int capacity) - { - if (capacity < 0) throw new ArgumentOutOfRangeException("Capacity", "The size of the list must be >0."); - _innerList = new ResultProperty[capacity]; - } - - - /// - /// Read-only property describing how many elements are in the Collection. - /// - public int Count { get; private set; } - - /// - /// Length of the collection - /// - public int Length => _innerList.Length; - - - /// - /// Sets or Gets the ResultProperty at the given index. - /// - public ResultProperty this[int index] - { - get - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - return _innerList[index]; - } - set - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - _innerList[index] = value; - } - } - - /// - /// Removes all items from the collection. - /// - public void Clear() - { - _innerList = new ResultProperty[DEFAULT_CAPACITY]; - Count = 0; - } - - /// - /// Finds a property by his name. - /// - /// Name of the property. - /// - public ResultProperty FindByPropertyName(string propertyName) - { - ResultProperty resultProperty = null; - for (var i = 0; i < Count; i++) - if (_innerList[i].PropertyName == propertyName) - { - resultProperty = _innerList[i]; - break; - } - - return resultProperty; - } - - - /// - /// Add an ResultProperty - /// - /// - /// Index - public int Add(ResultProperty value) - { - Resize(Count + 1); - var index = Count++; - _innerList[index] = value; - - return index; - } - - - /// - /// Add a list of ResultProperty to the collection - /// - /// - public void AddRange(ResultProperty[] value) - { - for (var i = 0; i < value.Length; i++) Add(value[i]); - } - - - /// - /// Add a list of ResultProperty to the collection - /// - /// - public void AddRange(ResultPropertyCollection value) - { - for (var i = 0; i < value.Count; i++) Add(value[i]); - } - - - /// - /// Indicate if a ResultProperty is in the collection - /// - /// A ResultProperty - /// True fi is in - public bool Contains(ResultProperty value) - { - return Contains(value.PropertyName); - } - - /// - /// Indicate if a ResultProperty is in the collection - /// - /// A property name - /// True fi is in - public bool Contains(string propertyName) - { - for (var i = 0; i < Count; i++) - if (_innerList[i].PropertyName == propertyName) - return true; - - return false; - } - - /// - /// Insert a ResultProperty in the collection. - /// - /// Index where to insert. - /// A ResultProperty - public void Insert(int index, ResultProperty value) - { - if (index < 0 || index > Count) throw new ArgumentOutOfRangeException("index"); - - Resize(Count + 1); - Array.Copy(_innerList, index, _innerList, index + 1, Count - index); - _innerList[index] = value; - Count++; - } - - - /// - /// Remove a ResultProperty of the collection. - /// - public void Remove(ResultProperty value) - { - for (var i = 0; i < Count; i++) - if (_innerList[i].PropertyName == value.PropertyName) - { - RemoveAt(i); - return; - } - } - - /// - /// Removes a ResultProperty at the given index. The size of the list is - /// decreased by one. - /// - /// - public void RemoveAt(int index) - { - if (index < 0 || index >= Count) throw new ArgumentOutOfRangeException("index"); - - var remaining = Count - index - 1; - - if (remaining > 0) Array.Copy(_innerList, index + 1, _innerList, index, remaining); - - Count--; - _innerList[Count] = null; - } - - /// - /// Ensures that the capacity of this collection is at least the given minimum - /// value. If the currect capacity of the list is less than min, the - /// capacity is increased to twice the current capacity. - /// - /// - private void Resize(int minSize) - { - var oldSize = _innerList.Length; - - if (minSize > oldSize) - { - var oldEntries = _innerList; - var newSize = oldEntries.Length * CAPACITY_MULTIPLIER; - - if (newSize < minSize) newSize = minSize; - _innerList = new ResultProperty[newSize]; - Array.Copy(oldEntries, 0, _innerList, 0, Count); - } - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/ResultMapping/SubMap.cs b/ORBatis.Core/Configuration/ResultMapping/SubMap.cs deleted file mode 100644 index e8183e3..0000000 --- a/ORBatis.Core/Configuration/ResultMapping/SubMap.cs +++ /dev/null @@ -1,99 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 576082 $ - * $Date: 2007-09-16 06:04:01 -0600 (Sun, 16 Sep 2007) $ - * Author : Gilles Bayon - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Apache Fondation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.ResultMapping; - -/// -/// Summary description for SubMap. -/// -[Serializable] -[XmlRoot("subMap", Namespace = "http://ibatis.apache.org/mapping")] -public class SubMap -{ - #region Constructor - /// - /// Initializes a new instance of the class. - /// - /// The discriminator value. - /// Name of the result map. - public SubMap(string discriminatorValue, string resultMapName) - { - _discriminatorValue = discriminatorValue; - _resultMapName = resultMapName; - } - #endregion - // - // - // - // - // -- attribute column (not used if discriminator use a custom formula) - // -- attribute formula (not required will used the DefaultFormula) calculate the discriminator value (DefaultFormula is default), else used an aliasType wich implement IDiscriminatorFormula), - // - // - // - // - // ... - // - - #region Fields - [NonSerialized] private string _discriminatorValue = string.Empty; - - [NonSerialized] private string _resultMapName = string.Empty; - - [NonSerialized] private IResultMap _resultMap; - #endregion - - #region Properties - /// - /// Discriminator value - /// - [XmlAttribute("value")] - public string DiscriminatorValue => _discriminatorValue; - - /// - /// The name of the ResultMap used if the column value is = to the Discriminator Value - /// - [XmlAttribute("resultMapping")] - public string ResultMapName => _resultMapName; - - /// - /// The resultMap used if the column value is = to the Discriminator Value - /// - [XmlIgnore] - public IResultMap ResultMap - { - get => _resultMap; - set => _resultMap = value; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/ArgumentPropertyDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/ArgumentPropertyDeSerializer.cs deleted file mode 100644 index d67664c..0000000 --- a/ORBatis.Core/Configuration/Serializers/ArgumentPropertyDeSerializer.cs +++ /dev/null @@ -1,63 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for ArgumentPropertyDeSerializer. -/// -public sealed class ArgumentPropertyDeSerializer -{ - /// - /// Deserialize a ResultProperty object - /// - /// - /// - /// - public static ArgumentProperty Deserialize(XmlNode node, ConfigurationScope configScope) - { - var argumentProperty = new ArgumentProperty(); - - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - argumentProperty.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - argumentProperty.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - argumentProperty.ColumnIndex = NodeUtils.GetIntAttribute(prop, "columnIndex", ResultProperty.UNKNOWN_COLUMN_INDEX); - argumentProperty.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - argumentProperty.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - argumentProperty.NestedResultMapName = NodeUtils.GetStringAttribute(prop, "resultMapping"); - argumentProperty.NullValue = prop["nullValue"]; - argumentProperty.ArgumentName = NodeUtils.GetStringAttribute(prop, "argumentName"); - argumentProperty.Select = NodeUtils.GetStringAttribute(prop, "select"); - - return argumentProperty; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/CacheModelDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/CacheModelDeSerializer.cs deleted file mode 100644 index 8e118c6..0000000 --- a/ORBatis.Core/Configuration/Serializers/CacheModelDeSerializer.cs +++ /dev/null @@ -1,74 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 707150 $ - * $Date: 2008-10-22 11:54:18 -0600 (Wed, 22 Oct 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Cache; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for CacheModelDeSerializer. -/// -public sealed class CacheModelDeSerializer -{ - /// - /// Deserialize a CacheModel object - /// - /// - /// - /// - public static CacheModel Deserialize(XmlNode node, ConfigurationScope configScope) - { - var model = new CacheModel(); - - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - model.Id = NodeUtils.GetStringAttribute(prop, "id"); - model.Implementation = NodeUtils.GetStringAttribute(prop, "implementation"); - model.Implementation = configScope.SqlMapper.TypeHandlerFactory.GetTypeAlias(model.Implementation).Class.AssemblyQualifiedName; - model.IsReadOnly = NodeUtils.GetBooleanAttribute(prop, "readOnly", true); - model.IsSerializable = NodeUtils.GetBooleanAttribute(prop, "serialize", false); - - var count = node.ChildNodes.Count; - for (var i = 0; i < count; i++) - if (node.ChildNodes[i].LocalName == "flushInterval") - { - var flush = new FlushInterval(); - var props = NodeUtils.ParseAttributes(node.ChildNodes[i], configScope.Properties); - flush.Hours = NodeUtils.GetIntAttribute(props, "hours", 0); - flush.Milliseconds = NodeUtils.GetIntAttribute(props, "milliseconds", 0); - flush.Minutes = NodeUtils.GetIntAttribute(props, "minutes", 0); - flush.Seconds = NodeUtils.GetIntAttribute(props, "seconds", 0); - - model.FlushInterval = flush; - } - - return model; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/DeSerializerFactory.cs b/ORBatis.Core/Configuration/Serializers/DeSerializerFactory.cs deleted file mode 100644 index 147af24..0000000 --- a/ORBatis.Core/Configuration/Serializers/DeSerializerFactory.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.DataMapper.Scope; -using System.Collections; -using System.Collections.Specialized; - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for DeSerializerFactory. -/// -public class DeSerializerFactory -{ - private readonly IDictionary _serializerMap = new HybridDictionary(); - - /// - /// Constructor - /// - /// - public DeSerializerFactory(ConfigurationScope configScope) - { - _serializerMap.Add("dynamic", new DynamicDeSerializer(configScope)); - _serializerMap.Add("isEqual", new IsEqualDeSerializer(configScope)); - _serializerMap.Add("isNotEqual", new IsNotEqualDeSerializer(configScope)); - _serializerMap.Add("isGreaterEqual", new IsGreaterEqualDeSerializer(configScope)); - _serializerMap.Add("isGreaterThan", new IsGreaterThanDeSerializer(configScope)); - _serializerMap.Add("isLessEqual", new IsLessEqualDeSerializer(configScope)); - _serializerMap.Add("isLessThan", new IsLessThanDeSerializer(configScope)); - _serializerMap.Add("isNotEmpty", new IsNotEmptyDeSerializer(configScope)); - _serializerMap.Add("isEmpty", new IsEmptyDeSerializer(configScope)); - _serializerMap.Add("isNotNull", new IsNotNullDeSerializer(configScope)); - _serializerMap.Add("isNotParameterPresent", new IsNotParameterPresentDeSerializer(configScope)); - _serializerMap.Add("isNotPropertyAvailable", new IsNotPropertyAvailableDeSerializer(configScope)); - _serializerMap.Add("isNull", new IsNullDeSerializer(configScope)); - _serializerMap.Add("isParameterPresent", new IsParameterPresentDeSerializer(configScope)); - _serializerMap.Add("isPropertyAvailable", new IsPropertyAvailableDeSerializer(configScope)); - _serializerMap.Add("iterate", new IterateSerializer(configScope)); - } - - /// - /// - /// - /// - public IDeSerializer GetDeSerializer(string name) - { - return (IDeSerializer)_serializerMap[name]; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/DeleteDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/DeleteDeSerializer.cs deleted file mode 100644 index 53938ce..0000000 --- a/ORBatis.Core/Configuration/Serializers/DeleteDeSerializer.cs +++ /dev/null @@ -1,76 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for DeleteDeSerializer. -/// -public sealed class DeleteDeSerializer -{ - /// - /// Deserialize a TypeHandler object - /// - /// - /// - /// - public static Delete Deserialize(XmlNode node, ConfigurationScope configScope) - { - var delete = new Delete(); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - delete.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - delete.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - delete.Id = NodeUtils.GetStringAttribute(prop, "id"); - delete.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - delete.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - delete.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - delete.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - delete.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - delete.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - var count = node.ChildNodes.Count; - for (var i = 0; i < count; i++) - if (node.ChildNodes[i].LocalName == "generate") - { - var generate = new Generate(); - var props = NodeUtils.ParseAttributes(node.ChildNodes[i], configScope.Properties); - - generate.By = NodeUtils.GetStringAttribute(props, "by"); - generate.Table = NodeUtils.GetStringAttribute(props, "table"); - - delete.Generate = generate; - } - - return delete; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/DiscriminatorDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/DiscriminatorDeSerializer.cs deleted file mode 100644 index 3b21c52..0000000 --- a/ORBatis.Core/Configuration/Serializers/DiscriminatorDeSerializer.cs +++ /dev/null @@ -1,60 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for DiscriminatorDeSerializer. -/// -public sealed class DiscriminatorDeSerializer -{ - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static Discriminator Deserialize(XmlNode node, ConfigurationScope configScope) - { - var discriminator = new Discriminator(); - - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - discriminator.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - discriminator.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - discriminator.ColumnIndex = NodeUtils.GetIntAttribute(prop, "columnIndex", ResultProperty.UNKNOWN_COLUMN_INDEX); - discriminator.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - discriminator.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - discriminator.NullValue = prop["nullValue"]; - - return discriminator; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/DynamicDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/DynamicDeSerializer.cs deleted file mode 100644 index 3da4f9b..0000000 --- a/ORBatis.Core/Configuration/Serializers/DynamicDeSerializer.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for DynamicDeSerializer. -/// -public sealed class DynamicDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// Constructor - /// - /// - public DynamicDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var dynamic = new Dynamic(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - dynamic.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - - return dynamic; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IDeSerializer.cs deleted file mode 100644 index c42acc1..0000000 --- a/ORBatis.Core/Configuration/Serializers/IDeSerializer.cs +++ /dev/null @@ -1,43 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IDeSerializer. -/// -public interface IDeSerializer -{ - /// - /// - /// - /// - SqlTag Deserialize(XmlNode node); -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/InsertDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/InsertDeSerializer.cs deleted file mode 100644 index fb41c34..0000000 --- a/ORBatis.Core/Configuration/Serializers/InsertDeSerializer.cs +++ /dev/null @@ -1,97 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for InsertDeSerializer. -/// -public sealed class InsertDeSerializer -{ - /// - /// Deserialize a TypeHandler object - /// - /// - /// - /// - public static Insert Deserialize(XmlNode node, ConfigurationScope configScope) - { - var insert = new Insert(); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - insert.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - insert.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - insert.Id = NodeUtils.GetStringAttribute(prop, "id"); - insert.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - insert.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - insert.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - insert.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - insert.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - var count = node.ChildNodes.Count; - for (var i = 0; i < count; i++) - if (node.ChildNodes[i].LocalName == "generate") - { - var generate = new Generate(); - var props = NodeUtils.ParseAttributes(node.ChildNodes[i], configScope.Properties); - - generate.By = NodeUtils.GetStringAttribute(props, "by"); - generate.Table = NodeUtils.GetStringAttribute(props, "table"); - - insert.Generate = generate; - } - else if (node.ChildNodes[i].LocalName == "selectKey") - { - var selectKey = new SelectKey(); - var props = NodeUtils.ParseAttributes(node.ChildNodes[i], configScope.Properties); - - selectKey.PropertyName = NodeUtils.GetStringAttribute(props, "property"); - selectKey.SelectKeyType = ReadSelectKeyType(props["type"]); - selectKey.ResultClassName = NodeUtils.GetStringAttribute(props, "resultClass"); - - insert.SelectKey = selectKey; - } - - return insert; - } - - private static SelectKeyType ReadSelectKeyType(string s) - { - switch (s) - { - case @"pre": return SelectKeyType.pre; - case @"post": return SelectKeyType.post; - default: throw new ConfigurationException("Unknown selectKey type : '" + s + "'"); - } - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsEmptyDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsEmptyDeSerializer.cs deleted file mode 100644 index 8e6ed10..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsEmptyDeSerializer.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsEmptyDeSerializer. -/// -public sealed class IsEmptyDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsEmptyDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a IsNotNull object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isEmpty = new IsEmpty(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isEmpty.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isEmpty.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isEmpty; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsEqualDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsEqualDeSerializer.cs deleted file mode 100644 index 1626f85..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsEqualDeSerializer.cs +++ /dev/null @@ -1,70 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 05:27:09 -0700 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsEqualDeSerializer. -/// -public sealed class IsEqualDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isEqual = new IsEqual(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isEqual.Literal = NodeUtils.GetStringAttribute(prop, "literal"); - isEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isEqual; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsGreaterEqualDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsGreaterEqualDeSerializer.cs deleted file mode 100644 index 0cb92d6..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsGreaterEqualDeSerializer.cs +++ /dev/null @@ -1,69 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsGreaterEqualDeSerializer. -/// -public sealed class IsGreaterEqualDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsGreaterEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isGreaterEqual = new IsGreaterEqual(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isGreaterEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isGreaterEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isGreaterEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isGreaterEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isGreaterEqual; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsGreaterThanDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsGreaterThanDeSerializer.cs deleted file mode 100644 index 7e21a06..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsGreaterThanDeSerializer.cs +++ /dev/null @@ -1,69 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsGreaterThanDeSerializer. -/// -public sealed class IsGreaterThanDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsGreaterThanDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isGreaterThan = new IsGreaterThan(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isGreaterThan.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isGreaterThan.Property = NodeUtils.GetStringAttribute(prop, "property"); - isGreaterThan.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isGreaterThan.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isGreaterThan; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsLessEqualDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsLessEqualDeSerializer.cs deleted file mode 100644 index 0561856..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsLessEqualDeSerializer.cs +++ /dev/null @@ -1,69 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsLessEqualDeSerializer. -/// -public sealed class IsLessEqualDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsLessEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isLessEqual = new IsLessEqual(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isLessEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isLessEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isLessEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isLessEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isLessEqual; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsLessThanDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsLessThanDeSerializer.cs deleted file mode 100644 index 468f64c..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsLessThanDeSerializer.cs +++ /dev/null @@ -1,69 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsLessThanDeSerializer. -/// -public sealed class IsLessThanDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsLessThanDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isLessThan = new IsLessThan(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isLessThan.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isLessThan.Property = NodeUtils.GetStringAttribute(prop, "property"); - isLessThan.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isLessThan.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isLessThan; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsNotEmptyDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsNotEmptyDeSerializer.cs deleted file mode 100644 index f163fa6..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsNotEmptyDeSerializer.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsNotEmptyDeSerializer. -/// -public sealed class IsNotEmptyDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsNotEmptyDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a IsNotEmpty object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isNotEmpty = new IsNotEmpty(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotEmpty.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotEmpty.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNotEmpty; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsNotEqualDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsNotEqualDeSerializer.cs deleted file mode 100644 index 88ed7a8..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsNotEqualDeSerializer.cs +++ /dev/null @@ -1,70 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 05:27:09 -0700 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsNotEqualDeSerializer. -/// -public sealed class IsNotEqualDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsNotEqualDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isNotEqual = new IsNotEqual(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotEqual.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotEqual.Literal = NodeUtils.GetStringAttribute(prop, "literal"); - isNotEqual.Property = NodeUtils.GetStringAttribute(prop, "property"); - isNotEqual.CompareProperty = NodeUtils.GetStringAttribute(prop, "compareProperty"); - isNotEqual.CompareValue = NodeUtils.GetStringAttribute(prop, "compareValue"); - - return isNotEqual; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsNotNullDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsNotNullDeSerializer.cs deleted file mode 100644 index 39d00b8..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsNotNullDeSerializer.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsNotNullDeSerializer. -/// -public sealed class IsNotNullDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsNotNullDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a IsNotNull object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isNotNull = new IsNotNull(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotNull.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotNull.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNotNull; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs deleted file mode 100644 index 6933a22..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs +++ /dev/null @@ -1,66 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsNotParameterPresentDeSerializer. -/// -public sealed class IsNotParameterPresentDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsNotParameterPresentDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isNotParameterPresent = new IsNotParameterPresent(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotParameterPresent.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - - return isNotParameterPresent; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs deleted file mode 100644 index 2ea91e3..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsNotPropertyAvailableDeSerializer. -/// -public sealed class IsNotPropertyAvailableDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsNotPropertyAvailableDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a IsNotEmpty object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isNotPropertyAvailable = new IsNotPropertyAvailable(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNotPropertyAvailable.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNotPropertyAvailable.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNotPropertyAvailable; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsNullDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsNullDeSerializer.cs deleted file mode 100644 index de8bbb5..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsNullDeSerializer.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsNullDeSerializer. -/// -public sealed class IsNullDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsNullDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isNull = new IsNull(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isNull.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isNull.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isNull; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsParameterPresentDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsParameterPresentDeSerializer.cs deleted file mode 100644 index c06aff0..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsParameterPresentDeSerializer.cs +++ /dev/null @@ -1,66 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsParameterPresentDeSerializer. -/// -public sealed class IsParameterPresentDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsParameterPresentDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Dynamic object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isParameterPresent = new IsParameterPresent(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isParameterPresent.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - - return isParameterPresent; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs deleted file mode 100644 index b255926..0000000 --- a/ORBatis.Core/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs +++ /dev/null @@ -1,68 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IsPropertyAvailableDeSerializer. -/// -public sealed class IsPropertyAvailableDeSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IsPropertyAvailableDeSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a IsNotEmpty object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var isPropertyAvailable = new IsPropertyAvailable(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - isPropertyAvailable.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - isPropertyAvailable.Property = NodeUtils.GetStringAttribute(prop, "property"); - - return isPropertyAvailable; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/IterateSerializer.cs b/ORBatis.Core/Configuration/Serializers/IterateSerializer.cs deleted file mode 100644 index 97bf415..0000000 --- a/ORBatis.Core/Configuration/Serializers/IterateSerializer.cs +++ /dev/null @@ -1,71 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for IterateSerializer. -/// -public sealed class IterateSerializer : IDeSerializer -{ - private readonly ConfigurationScope _configScope; - - /// - /// - /// - public IterateSerializer(ConfigurationScope configScope) - { - _configScope = configScope; - } - - #region IDeSerializer Members - /// - /// Deserialize a Iterate object - /// - /// - /// - public SqlTag Deserialize(XmlNode node) - { - var iterate = new Iterate(_configScope.DataExchangeFactory.AccessorFactory); - - var prop = NodeUtils.ParseAttributes(node, _configScope.Properties); - iterate.Prepend = NodeUtils.GetStringAttribute(prop, "prepend"); - iterate.Property = NodeUtils.GetStringAttribute(prop, "property"); - iterate.Close = NodeUtils.GetStringAttribute(prop, "close"); - iterate.Conjunction = NodeUtils.GetStringAttribute(prop, "conjunction"); - iterate.Open = NodeUtils.GetStringAttribute(prop, "open"); - - return iterate; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/ParameterMapDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/ParameterMapDeSerializer.cs deleted file mode 100644 index 759f6e3..0000000 --- a/ORBatis.Core/Configuration/Serializers/ParameterMapDeSerializer.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 410610 $ - * $Date: 2006-05-31 11:40:07 -0600 (Wed, 31 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for ParameterMapDeSerializer. -/// -public sealed class ParameterMapDeSerializer -{ - /// - /// Deserialize a ParameterMap object - /// - /// - /// - /// - public static ParameterMap Deserialize(XmlNode node, ConfigurationScope configScope) - { - var parameterMap = new ParameterMap(configScope.DataExchangeFactory); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - configScope.ErrorContext.MoreInfo = "ParameterMap DeSerializer"; - - parameterMap.ExtendMap = NodeUtils.GetStringAttribute(prop, "extends"); - parameterMap.Id = NodeUtils.GetStringAttribute(prop, "id"); - parameterMap.ClassName = NodeUtils.GetStringAttribute(prop, "class"); - - configScope.ErrorContext.MoreInfo = "Initialize ParameterMap"; - configScope.NodeContext = node; - parameterMap.Initialize(configScope.DataSource.DbProvider.UsePositionalParameters, configScope); - parameterMap.BuildProperties(configScope); - configScope.ErrorContext.MoreInfo = string.Empty; - - return parameterMap; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/ParameterPropertyDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/ParameterPropertyDeSerializer.cs deleted file mode 100644 index ee01fcd..0000000 --- a/ORBatis.Core/Configuration/Serializers/ParameterPropertyDeSerializer.cs +++ /dev/null @@ -1,66 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 512878 $ - * $Date: 2007-02-28 10:57:11 -0700 (Wed, 28 Feb 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for ParameterPropertyDeSerializer. -/// -public sealed class ParameterPropertyDeSerializer -{ - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static ParameterProperty Deserialize(XmlNode node, ConfigurationScope configScope) - { - var property = new ParameterProperty(); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - configScope.ErrorContext.MoreInfo = "ParameterPropertyDeSerializer"; - - property.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - property.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - property.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - property.DbType = NodeUtils.GetStringAttribute(prop, "dbType", null); - property.DirectionAttribute = NodeUtils.GetStringAttribute(prop, "direction"); - property.NullValue = prop["nullValue"]; - property.PropertyName = NodeUtils.GetStringAttribute(prop, "property"); - property.Precision = NodeUtils.GetByteAttribute(prop, "precision", 0); - property.Scale = NodeUtils.GetByteAttribute(prop, "scale", 0); - property.Size = NodeUtils.GetIntAttribute(prop, "size", -1); - - return property; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/ProcedureDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/ProcedureDeSerializer.cs deleted file mode 100644 index 6b3530d..0000000 --- a/ORBatis.Core/Configuration/Serializers/ProcedureDeSerializer.cs +++ /dev/null @@ -1,61 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 475842 $ - * $Date: 2006-11-16 11:07:55 -0700 (Thu, 16 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for ProcedureDeSerializer. -/// -public sealed class ProcedureDeSerializer -{ - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Procedure Deserialize(XmlNode node, ConfigurationScope configScope) - { - var procedure = new Procedure(); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - procedure.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - procedure.Id = NodeUtils.GetStringAttribute(prop, "id"); - procedure.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - procedure.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - procedure.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - procedure.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - procedure.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - - return procedure; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/ResultMapDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/ResultMapDeSerializer.cs deleted file mode 100644 index 867c70b..0000000 --- a/ORBatis.Core/Configuration/Serializers/ResultMapDeSerializer.cs +++ /dev/null @@ -1,57 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 470514 $ - * $Date: 2006-11-02 13:46:13 -0700 (Thu, 02 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for ResultMapDeSerializer. -/// -public sealed class ResultMapDeSerializer -{ - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static ResultMap Deserialize(XmlNode node, ConfigurationScope configScope) - { - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - var resultMap = new ResultMap(configScope, prop["id"], prop["class"], prop["extends"], prop["groupBy"]); - - configScope.ErrorContext.MoreInfo = "initialize ResultMap"; - - resultMap.Initialize(configScope); - - return resultMap; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/ResultPropertyDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/ResultPropertyDeSerializer.cs deleted file mode 100644 index d83905e..0000000 --- a/ORBatis.Core/Configuration/Serializers/ResultPropertyDeSerializer.cs +++ /dev/null @@ -1,64 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for ResultPropertyDeSerializer. -/// -public sealed class ResultPropertyDeSerializer -{ - /// - /// Deserialize a ResultProperty object - /// - /// - /// - /// - public static ResultProperty Deserialize(XmlNode node, ConfigurationScope configScope) - { - var resultProperty = new ResultProperty(); - - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - resultProperty.CLRType = NodeUtils.GetStringAttribute(prop, "type"); - resultProperty.CallBackName = NodeUtils.GetStringAttribute(prop, "typeHandler"); - resultProperty.ColumnIndex = NodeUtils.GetIntAttribute(prop, "columnIndex", ResultProperty.UNKNOWN_COLUMN_INDEX); - resultProperty.ColumnName = NodeUtils.GetStringAttribute(prop, "column"); - resultProperty.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - resultProperty.IsLazyLoad = NodeUtils.GetBooleanAttribute(prop, "lazyLoad", false); - resultProperty.NestedResultMapName = NodeUtils.GetStringAttribute(prop, "resultMapping"); - resultProperty.NullValue = prop["nullValue"]; - resultProperty.PropertyName = NodeUtils.GetStringAttribute(prop, "property"); - resultProperty.Select = NodeUtils.GetStringAttribute(prop, "select"); - - return resultProperty; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/SelectDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/SelectDeSerializer.cs deleted file mode 100644 index 8efc1fa..0000000 --- a/ORBatis.Core/Configuration/Serializers/SelectDeSerializer.cs +++ /dev/null @@ -1,76 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for SelectDeSerializer. -/// -public sealed class SelectDeSerializer -{ - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Select Deserialize(XmlNode node, ConfigurationScope configScope) - { - var select = new Select(); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - select.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - select.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - select.Id = NodeUtils.GetStringAttribute(prop, "id"); - select.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - select.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - select.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - select.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - select.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - select.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - var count = node.ChildNodes.Count; - for (var i = 0; i < count; i++) - if (node.ChildNodes[i].LocalName == "generate") - { - var generate = new Generate(); - var props = NodeUtils.ParseAttributes(node.ChildNodes[i], configScope.Properties); - - generate.By = NodeUtils.GetStringAttribute(props, "by"); - generate.Table = NodeUtils.GetStringAttribute(props, "table"); - - select.Generate = generate; - } - - return select; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/SqlDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/SqlDeSerializer.cs deleted file mode 100644 index 21fb4d5..0000000 --- a/ORBatis.Core/Configuration/Serializers/SqlDeSerializer.cs +++ /dev/null @@ -1,57 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-11-13 12:30:00 -0700 (Mon, 13 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for ArgumentPropertyDeSerializer. -/// -public sealed class SqlDeSerializer -{ - /// - /// Deserialize a sql tag - /// - /// - /// - /// - public static void Deserialize(XmlNode node, ConfigurationScope configScope) - { - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - var id = NodeUtils.GetStringAttribute(prop, "id"); - - if (configScope.UseStatementNamespaces) id = configScope.ApplyNamespace(id); - if (configScope.SqlIncludes.Contains(id)) throw new ConfigurationException("Duplicate -include '" + id + "' found."); - - configScope.SqlIncludes.Add(id, node); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/StatementDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/StatementDeSerializer.cs deleted file mode 100644 index 2040712..0000000 --- a/ORBatis.Core/Configuration/Serializers/StatementDeSerializer.cs +++ /dev/null @@ -1,63 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for StatementDeSerializer. -/// -public sealed class StatementDeSerializer -{ - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Statement Deserialize(XmlNode node, ConfigurationScope configScope) - { - var statement = new Statement(); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - statement.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - statement.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - statement.Id = NodeUtils.GetStringAttribute(prop, "id"); - statement.ListClassName = NodeUtils.GetStringAttribute(prop, "listClass"); - statement.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - statement.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - statement.ResultClassName = NodeUtils.GetStringAttribute(prop, "resultClass"); - statement.ResultMapName = NodeUtils.GetStringAttribute(prop, "resultMap"); - statement.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - return statement; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/SubMapDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/SubMapDeSerializer.cs deleted file mode 100644 index 35218ec..0000000 --- a/ORBatis.Core/Configuration/Serializers/SubMapDeSerializer.cs +++ /dev/null @@ -1,55 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 576082 $ - * $Date: 2007-09-16 06:04:01 -0600 (Sun, 16 Sep 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for SubMapDeSerializer. -/// -public sealed class SubMapDeSerializer -{ - /// - /// Deserialize a ResultMap object - /// - /// - /// - /// - public static SubMap Deserialize(XmlNode node, ConfigurationScope configScope) - { - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - var discriminatorValue = NodeUtils.GetStringAttribute(prop, "value"); - var resultMapName = configScope.ApplyNamespace(NodeUtils.GetStringAttribute(prop, "resultMapping")); - - return new SubMap(discriminatorValue, resultMapName); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/TypeAliasDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/TypeAliasDeSerializer.cs deleted file mode 100644 index e729dd9..0000000 --- a/ORBatis.Core/Configuration/Serializers/TypeAliasDeSerializer.cs +++ /dev/null @@ -1,62 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Alias; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for TypeAliasDeSerializer. -/// -public sealed class TypeAliasDeSerializer -{ - /// - /// Deserialize a TypeAlias object - /// - /// - /// - /// - public static void Deserialize(XmlNode node, ConfigurationScope configScope) - { - var typeAlias = new TypeAlias(); - configScope.ErrorContext.MoreInfo = "loading type alias"; - - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - typeAlias.Name = NodeUtils.GetStringAttribute(prop, "alias"); - typeAlias.ClassName = NodeUtils.GetStringAttribute(prop, "type"); - - configScope.ErrorContext.ObjectId = typeAlias.ClassName; - configScope.ErrorContext.MoreInfo = "initialize type alias"; - - typeAlias.Initialize(); - - configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(typeAlias.Name, typeAlias); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/TypeHandlerDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/TypeHandlerDeSerializer.cs deleted file mode 100644 index ca1433f..0000000 --- a/ORBatis.Core/Configuration/Serializers/TypeHandlerDeSerializer.cs +++ /dev/null @@ -1,78 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Exceptions; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Alias; -using IBatisNet.DataMapper.Scope; -using IBatisNet.DataMapper.TypeHandlers; -using System.Xml; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for TypeHandlerDeSerializer. -/// -public sealed class TypeHandlerDeSerializer -{ - /// - /// Deserialize a TypeHandler object - /// - /// - /// - /// - public static void Deserialize(XmlNode node, ConfigurationScope configScope) - { - var handler = new TypeHandler(); - - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - handler.CallBackName = NodeUtils.GetStringAttribute(prop, "callback"); - handler.ClassName = NodeUtils.GetStringAttribute(prop, "type"); - handler.DbType = NodeUtils.GetStringAttribute(prop, "dbType"); - - handler.Initialize(); - - configScope.ErrorContext.MoreInfo = "Check the callback attribute '" + handler.CallBackName + "' (must be a classname)."; - ITypeHandler typeHandler = null; - var type = configScope.SqlMapper.TypeHandlerFactory.GetType(handler.CallBackName); - var impl = Activator.CreateInstance(type); - if (impl is ITypeHandlerCallback) - typeHandler = new CustomTypeHandler((ITypeHandlerCallback)impl); - else if (impl is ITypeHandler) - typeHandler = (ITypeHandler)impl; - else - throw new ConfigurationException("The callBack type is not a valid implementation of ITypeHandler or ITypeHandlerCallback"); - - // - configScope.ErrorContext.MoreInfo = "Check the type attribute '" + handler.ClassName + "' (must be a class name) or the dbType '" + handler.DbType + "' (must be a DbType type name)."; - if (handler.DbType != null && handler.DbType.Length > 0) - configScope.DataExchangeFactory.TypeHandlerFactory.Register(TypeUtils.ResolveType(handler.ClassName), handler.DbType, typeHandler); - else - configScope.DataExchangeFactory.TypeHandlerFactory.Register(TypeUtils.ResolveType(handler.ClassName), typeHandler); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Serializers/UpdateDeSerializer.cs b/ORBatis.Core/Configuration/Serializers/UpdateDeSerializer.cs deleted file mode 100644 index 943498e..0000000 --- a/ORBatis.Core/Configuration/Serializers/UpdateDeSerializer.cs +++ /dev/null @@ -1,75 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 469233 $ - * $Date: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Xml; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.Scope; -using System.Xml; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Serializers; - -/// -/// Summary description for UpdateDeSerializer. -/// -public sealed class UpdateDeSerializer -{ - /// - /// Deserialize a Procedure object - /// - /// - /// - /// - public static Update Deserialize(XmlNode node, ConfigurationScope configScope) - { - var update = new Update(); - var prop = NodeUtils.ParseAttributes(node, configScope.Properties); - - update.CacheModelName = NodeUtils.GetStringAttribute(prop, "cacheModel"); - update.ExtendStatement = NodeUtils.GetStringAttribute(prop, "extends"); - update.Id = NodeUtils.GetStringAttribute(prop, "id"); - update.ParameterClassName = NodeUtils.GetStringAttribute(prop, "parameterClass"); - update.ParameterMapName = NodeUtils.GetStringAttribute(prop, "parameterMap"); - update.AllowRemapping = NodeUtils.GetBooleanAttribute(prop, "remapResults", false); - - var count = node.ChildNodes.Count; - for (var i = 0; i < count; i++) - if (node.ChildNodes[i].LocalName == "generate") - { - var generate = new Generate(); - var props = NodeUtils.ParseAttributes(node.ChildNodes[i], configScope.Properties); - - generate.By = NodeUtils.GetStringAttribute(props, "by"); - generate.RowVersion = NodeUtils.GetStringAttribute(props, "rowversion"); - generate.Table = NodeUtils.GetStringAttribute(props, "table"); - - update.Generate = generate; - } - - return update; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/DynamicSql.cs b/ORBatis.Core/Configuration/Sql/Dynamic/DynamicSql.cs deleted file mode 100644 index 94a79a9..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/DynamicSql.cs +++ /dev/null @@ -1,268 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 476843 $ - * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using IBatisNet.DataMapper.Configuration.Sql.SimpleDynamic; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; -using System.Collections; -using System.Data; -using System.Text; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic; - -/// -/// DynamicSql represent the root element of a dynamic sql statement -/// -/// -/// ... -/// -internal sealed class DynamicSql : ISql, IDynamicParent -{ - #region Constructor (s) / Destructor - /// - /// Initializes a new instance of the class. - /// - /// The config scope. - /// The statement. - internal DynamicSql(ConfigurationScope configScope, IStatement statement) - { - _statement = statement; - - _usePositionalParameters = configScope.DataSource.DbProvider.UsePositionalParameters; - _dataExchangeFactory = configScope.DataExchangeFactory; - } - #endregion - - #region Fields - private readonly IList _children = new ArrayList(); - private readonly IStatement _statement; - private readonly bool _usePositionalParameters; - private InlineParameterMapParser _paramParser; - private readonly DataExchangeFactory _dataExchangeFactory; - #endregion - - #region Methods - #region ISql IDynamicParent - /// - /// - /// - public void AddChild(ISqlChild child) - { - _children.Add(child); - } - #endregion - - #region ISql Members - /// - /// Builds a new and the text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - var request = new RequestScope(_dataExchangeFactory, session, _statement); - - _paramParser = new InlineParameterMapParser(); - - var sqlStatement = Process(request, parameterObject); - request.PreparedStatement = BuildPreparedStatement(session, request, sqlStatement); - request.MappedStatement = mappedStatement; - - return request; - } - #endregion - - /// - /// - /// - /// - /// - private string Process(RequestScope request, object parameterObject) - { - var ctx = new SqlTagContext(); - var localChildren = _children; - - ProcessBodyChildren(request, ctx, parameterObject, localChildren); - - // Builds a 'dynamic' ParameterMap - var map = new ParameterMap(request.DataExchangeFactory); - map.Id = _statement.Id + "-InlineParameterMap"; - map.Initialize(_usePositionalParameters, request); - map.Class = _statement.ParameterClass; - - // Adds 'dynamic' ParameterProperty - var parameters = ctx.GetParameterMappings(); - var count = parameters.Count; - for (var i = 0; i < count; i++) map.AddParameterProperty((ParameterProperty)parameters[i]); - request.ParameterMap = map; - - var dynSql = ctx.BodyText; - - // Processes $substitutions$ after DynamicSql - if (SimpleDynamicSql.IsSimpleDynamicSql(dynSql)) dynSql = new SimpleDynamicSql(request, dynSql, _statement).GetSql(parameterObject); - return dynSql; - } - - - /// - /// - /// - /// - /// - /// - private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, - object parameterObject, IList localChildren) - { - var buffer = ctx.GetWriter(); - ProcessBodyChildren(request, ctx, parameterObject, localChildren.GetEnumerator(), buffer); - } - - - /// - /// - /// - /// - /// - /// - /// - private void ProcessBodyChildren(RequestScope request, SqlTagContext ctx, - object parameterObject, IEnumerator localChildren, StringBuilder buffer) - { - while (localChildren.MoveNext()) - { - var child = (ISqlChild)localChildren.Current; - - if (child is SqlText) - { - var sqlText = (SqlText)child; - var sqlStatement = sqlText.Text; - if (sqlText.IsWhiteSpace) - { - buffer.Append(sqlStatement); - } - else - { - // if (SimpleDynamicSql.IsSimpleDynamicSql(sqlStatement)) - // { - // sqlStatement = new SimpleDynamicSql(sqlStatement, _statement).GetSql(parameterObject); - // SqlText newSqlText = _paramParser.ParseInlineParameterMap( null, sqlStatement ); - // sqlStatement = newSqlText.Text; - // ParameterProperty[] mappings = newSqlText.Parameters; - // if (mappings != null) - // { - // for (int i = 0; i < mappings.Length; i++) - // { - // ctx.AddParameterMapping(mappings[i]); - // } - // } - // } - // BODY OUT - buffer.Append(" "); - buffer.Append(sqlStatement); - - var parameters = sqlText.Parameters; - if (parameters != null) - { - var length = parameters.Length; - for (var i = 0; i < length; i++) ctx.AddParameterMapping(parameters[i]); - } - } - } - else if (child is SqlTag) - { - var tag = (SqlTag)child; - var handler = tag.Handler; - var response = BaseTagHandler.INCLUDE_BODY; - - do - { - var body = new StringBuilder(); - - response = handler.DoStartFragment(ctx, tag, parameterObject); - if (response != BaseTagHandler.SKIP_BODY) - { - if (ctx.IsOverridePrepend - && ctx.FirstNonDynamicTagWithPrepend == null - && tag.IsPrependAvailable - && !(tag.Handler is DynamicTagHandler)) - ctx.FirstNonDynamicTagWithPrepend = tag; - - ProcessBodyChildren(request, ctx, parameterObject, tag.GetChildrenEnumerator(), body); - - response = handler.DoEndFragment(ctx, tag, parameterObject, body); - handler.DoPrepend(ctx, tag, parameterObject, body); - if (response != BaseTagHandler.SKIP_BODY) - if (body.Length > 0) - { - // BODY OUT - if (handler.IsPostParseRequired) - { - var sqlText = _paramParser.ParseInlineParameterMap(request, null, body.ToString()); - buffer.Append(sqlText.Text); - var mappings = sqlText.Parameters; - if (mappings != null) - { - var length = mappings.Length; - for (var i = 0; i < length; i++) ctx.AddParameterMapping(mappings[i]); - } - } - else - { - buffer.Append(" "); - buffer.Append(body); - } - - if (tag.IsPrependAvailable && tag == ctx.FirstNonDynamicTagWithPrepend) ctx.IsOverridePrepend = false; - } - } - } while (response == BaseTagHandler.REPEAT_BODY); - } - } - } - - - /// - /// - /// - /// - /// - /// - private PreparedStatement BuildPreparedStatement(ISqlMapSession session, RequestScope request, string sqlStatement) - { - var factory = new PreparedStatementFactory(session, request, _statement, sqlStatement); - return factory.Prepare(); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/BaseTag.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/BaseTag.cs deleted file mode 100644 index 22a47cf..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/BaseTag.cs +++ /dev/null @@ -1,63 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 14:11:57 -0700 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Summary description for BaseTag. -/// -[Serializable] -public abstract class BaseTag : SqlTag -{ - /// - /// Property attribute - /// - [XmlAttribute("property")] - public string Property - { - get => _property; - set => _property = value; - } - - /// - /// Property attribute - /// - [XmlAttribute("literal")] - public string Literal - { - get => _literal; - set => _literal = value; - } - - #region Fields - [NonSerialized] private string _property = string.Empty; - - [NonSerialized] private string _literal = string.Empty; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Conditional.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Conditional.cs deleted file mode 100644 index e5f5497..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Conditional.cs +++ /dev/null @@ -1,65 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Xml.Serialization; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Summary description for Conditional. -/// -[Serializable] -public abstract class Conditional : BaseTag -{ - /// - /// CompareProperty attribute - /// - [XmlAttribute("compareProperty")] - public string CompareProperty - { - get => _compareProperty; - set => _compareProperty = value; - } - - - /// - /// CompareValue attribute - /// - [XmlAttribute("compareValue")] - public string CompareValue - { - get => _compareValue; - set => _compareValue = value; - } - - #region Fields - [NonSerialized] private string _compareValue = string.Empty; - - [NonSerialized] private string _compareProperty = string.Empty; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Dynamic.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Dynamic.cs deleted file mode 100644 index 876f414..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Dynamic.cs +++ /dev/null @@ -1,49 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Summary description for DynamicTag. -/// -[Serializable] -[XmlRoot("dynamic", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class Dynamic : SqlTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public Dynamic(AccessorFactory accessorFactory) - { - Handler = new DynamicTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs deleted file mode 100644 index 8104e4c..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs +++ /dev/null @@ -1,37 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Summary description for DynamicParent. -/// -public interface IDynamicParent -{ - /// - /// - /// - void AddChild(ISqlChild child); -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEmpty.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEmpty.cs deleted file mode 100644 index bbcab5e..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEmpty.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isEmpty sql tag element. -/// -[Serializable] -[XmlRoot("isEmpty", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsEmpty : BaseTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEmpty(AccessorFactory accessorFactory) - { - Handler = new IsEmptyTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEqual.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEqual.cs deleted file mode 100644 index 2076a04..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsEqual.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isEqual sql tag element. -/// -[Serializable] -[XmlRoot("isEqual", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsEqual : Conditional -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEqual(AccessorFactory accessorFactory) - { - Handler = new IsEqualTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs deleted file mode 100644 index 2f68bd6..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isGreaterEqual sql tag element. -/// -[Serializable] -[XmlRoot("isGreaterEqual", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsGreaterEqual : Conditional -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterEqual(AccessorFactory accessorFactory) - { - Handler = new IsGreaterEqualTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs deleted file mode 100644 index f0ed968..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isGreaterThan sql tag element. -/// -[Serializable] -[XmlRoot("isGreaterThan", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsGreaterThan : Conditional -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterThan(AccessorFactory accessorFactory) - { - Handler = new IsGreaterThanTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs deleted file mode 100644 index cbc1d5a..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isLessEqual sql tag element. -/// -[Serializable] -[XmlRoot("isLessEqual", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsLessEqual : Conditional -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessEqual(AccessorFactory accessorFactory) - { - Handler = new IsLessEqualTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessThan.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessThan.cs deleted file mode 100644 index 55115be..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsLessThan.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isLessThan sql tag element. -/// -[Serializable] -[XmlRoot("isLessThan", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsLessThan : Conditional -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessThan(AccessorFactory accessorFactory) - { - Handler = new IsLessThanTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs deleted file mode 100644 index 84942ce..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs +++ /dev/null @@ -1,49 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isNotEmpty sql tag element. -/// -[Serializable] -[XmlRoot("isNotEmpty", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsNotEmpty : BaseTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEmpty(AccessorFactory accessorFactory) - { - Handler = new IsNotEmptyTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs deleted file mode 100644 index f70a3b4..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs +++ /dev/null @@ -1,49 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isNotEqual sql tag element. -/// -[Serializable] -[XmlRoot("isNotEqual", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsNotEqual : Conditional -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEqual(AccessorFactory accessorFactory) - { - Handler = new IsNotEqualTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotNull.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotNull.cs deleted file mode 100644 index d455906..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotNull.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isNotNull sql tag element. -/// -[Serializable] -[XmlRoot("isNotNull", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsNotNull : BaseTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotNull(AccessorFactory accessorFactory) - { - Handler = new IsNotNullTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs deleted file mode 100644 index a1ea930..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isNotParameterPresent sql tag element. -/// -[Serializable] -[XmlRoot("isNotParameterPresent", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsNotParameterPresent : SqlTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotParameterPresent(AccessorFactory accessorFactory) - { - Handler = new IsNotParameterPresentTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs deleted file mode 100644 index ec334e3..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isEmpty sql tag element. -/// -[Serializable] -[XmlRoot("isNotPropertyAvailable", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsNotPropertyAvailable : BaseTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotPropertyAvailable(AccessorFactory accessorFactory) - { - Handler = new IsNotPropertyAvailableTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNull.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNull.cs deleted file mode 100644 index 8c5d551..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsNull.cs +++ /dev/null @@ -1,45 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isNull sql tag element. -/// -[Serializable] -[XmlRoot("isNull", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsNull : BaseTag -{ - /// - /// - public IsNull(AccessorFactory accessorFactory) - { - Handler = new IsNullTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs deleted file mode 100644 index 6eefefb..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isParameterPresent sql tag element. -/// -[Serializable] -[XmlRoot("isParameterPresent", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsParameterPresent : SqlTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsParameterPresent(AccessorFactory accessorFactory) - { - Handler = new IsParameterPresentTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs deleted file mode 100644 index 5d6332d..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs +++ /dev/null @@ -1,47 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an isPropertyAvailable sql tag element. -/// -[Serializable] -[XmlRoot("isPropertyAvailable", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class IsPropertyAvailable : BaseTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsPropertyAvailable(AccessorFactory accessorFactory) - { - Handler = new IsPropertyAvailableTagHandler(accessorFactory); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Iterate.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Iterate.cs deleted file mode 100644 index 4c5ba96..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/Iterate.cs +++ /dev/null @@ -1,88 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// Represent an iterate sql tag element. -/// -[Serializable] -[XmlRoot("iterate", Namespace = "http://ibatis.apache.org/mapping")] -public sealed class Iterate : BaseTag -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public Iterate(AccessorFactory accessorFactory) - { - Handler = new IterateTagHandler(accessorFactory); - } - - - /// - /// Conjonction attribute - /// - [XmlAttribute("conjunction")] - public string Conjunction - { - get => _conjunction; - set => _conjunction = value; - } - - - /// - /// Close attribute - /// - [XmlAttribute("close")] - public string Close - { - get => _close; - set => _close = value; - } - - - /// - /// Open attribute - /// - [XmlAttribute("open")] - public string Open - { - get => _open; - set => _open = value; - } - - #region Fields - [NonSerialized] private string _open = string.Empty; - - [NonSerialized] private string _close = string.Empty; - - [NonSerialized] private string _conjunction = string.Empty; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/SqlTag.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Elements/SqlTag.cs deleted file mode 100644 index 0121928..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Elements/SqlTag.cs +++ /dev/null @@ -1,104 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; -using System.Collections; -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -/// -/// SqlTag is a children element of dynamic Sql element. -/// SqlTag represent any binary unary/conditional element (like isEmpty, isNull, iEquall...) -/// or other element as isParameterPresent, isNotParameterPresent, iterate. -/// -[Serializable] -public abstract class SqlTag : ISqlChild, IDynamicParent -{ - /// - /// Parent tag element - /// - [XmlIgnoreAttribute] - public SqlTag Parent - { - get => _parent; - set => _parent = value; - } - - - /// - /// Prepend attribute - /// - [XmlAttribute("prepend")] - public string Prepend - { - get => _prepend; - set => _prepend = value; - } - - - /// - /// Handler for this sql tag - /// - [XmlIgnoreAttribute] - public ISqlTagHandler Handler - { - get => _handler; - set => _handler = value; - } - - /// - /// - public bool IsPrependAvailable => _prepend != null && _prepend.Length > 0; - - #region IDynamicParent Members - /// - /// - /// - public void AddChild(ISqlChild child) - { - if (child is SqlTag) ((SqlTag)child).Parent = this; - _children.Add(child); - } - #endregion - - /// - /// - /// - public IEnumerator GetChildrenEnumerator() - { - return _children.GetEnumerator(); - } - - #region Fields - [NonSerialized] private string _prepend = string.Empty; - - [NonSerialized] private ISqlTagHandler _handler; - - [NonSerialized] private SqlTag _parent; - - [NonSerialized] private IList _children = new ArrayList(); - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs deleted file mode 100644 index 5349fcf..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs +++ /dev/null @@ -1,127 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using System.Text; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Description r�sum�e de BaseTagHandler. -/// -public abstract class BaseTagHandler : ISqlTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public BaseTagHandler(AccessorFactory accessorFactory) - { - AccessorFactory = accessorFactory; - } - - /// - /// The factory which build - /// - public AccessorFactory AccessorFactory { get; } - - #region Const - /// - /// BODY TAG - /// - public const int SKIP_BODY = 0; - - /// - /// - public const int INCLUDE_BODY = 1; - - /// - /// - public const int REPEAT_BODY = 2; - #endregion - - #region Methods - /// - /// - /// - /// - /// - /// - public virtual int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return INCLUDE_BODY; - } - - /// - /// - /// - /// - /// - /// - /// - public virtual int DoEndFragment(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) - { - return INCLUDE_BODY; - } - - /// - /// - /// - /// - /// - /// - public virtual void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) - { - if (tag.IsPrependAvailable) - { - if (bodyContent.ToString().Trim().Length > 0) - { - if (ctx.IsOverridePrepend && tag == ctx.FirstNonDynamicTagWithPrepend) - ctx.IsOverridePrepend = false; - else - bodyContent.Insert(0, tag.Prepend); - } - else - { - if (ctx.FirstNonDynamicTagWithPrepend != null) - { - ctx.FirstNonDynamicTagWithPrepend = null; - ctx.IsOverridePrepend = true; - } - } - } - } - - - #region ISqlTagHandler Menbers - /// - /// - public virtual bool IsPostParseRequired => false; - #endregion - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs deleted file mode 100644 index a722dd7..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs +++ /dev/null @@ -1,220 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 06:21:44 -0700 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using IBatisNet.DataMapper.Exceptions; -using System.Text; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Description r�sum�e de ConditionalTagHandler. -/// -public abstract class ConditionalTagHandler : BaseTagHandler -{ - #region Const - /// - /// - public const long NOT_COMPARABLE = long.MinValue; - #endregion - - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public ConditionalTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - #region Methods - /// - /// - /// - /// - /// - /// - public abstract bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject); - - /// - /// - /// - /// - /// - /// - public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - if (IsCondition(ctx, tag, parameterObject)) return INCLUDE_BODY; - - return SKIP_BODY; - } - - /// - /// - /// - /// - /// - /// - /// - public override int DoEndFragment(SqlTagContext ctx, SqlTag tag, object parameterObject, - StringBuilder bodyContent) - { - return INCLUDE_BODY; - } - - /// - /// - /// - /// - /// - /// - protected long Compare(SqlTagContext ctx, SqlTag sqlTag, object parameterObject) - { - var tag = (Conditional)sqlTag; - var propertyName = tag.Property; - var literal = tag.Literal; - var comparePropertyName = tag.CompareProperty; - var compareValue = tag.CompareValue; - - object value1 = null; - Type type = null; - if (propertyName != null && propertyName.Length > 0) - { - var iterate = ctx.PeekIterateContext(); - - if (iterate != null) - propertyName = propertyName.Replace("[]", "[" + (iterate.Index + 1) + "]"); - - value1 = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory); - type = value1.GetType(); - } - else if (!string.IsNullOrEmpty(literal)) - { - value1 = literal; - type = value1.GetType(); - } - else - { - value1 = parameterObject; - if (value1 != null) - type = parameterObject.GetType(); - else - type = typeof(object); - } - - if (comparePropertyName != null && comparePropertyName.Length > 0) - { - var value2 = ObjectProbe.GetMemberValue(parameterObject, comparePropertyName, AccessorFactory); - return CompareValues(type, value1, value2); - } - - if (!string.IsNullOrEmpty(compareValue)) return CompareValues(type, value1, compareValue); - - throw new DataMapperException("Error comparing in conditional fragment. Uknown 'compare to' values."); - } - - /// - /// - /// - /// - /// - /// - protected long CompareValues(Type type, object value1, object value2) - { - var result = NOT_COMPARABLE; - - if (value1 == null || value2 == null) - { - result = value1 == value2 ? 0 : NOT_COMPARABLE; - } - else - { - if (value2.GetType() != type) value2 = ConvertValue(type, value2.ToString()); - if (value2 is string && type != typeof(string)) value1 = value1.ToString(); - if (!(value1 is IComparable && value2 is IComparable)) - { - value1 = value1.ToString(); - value2 = value2.ToString(); - } - - result = ((IComparable)value1).CompareTo(value2); - } - - return result; - } - - /// - /// - /// - /// - /// - protected object ConvertValue(Type type, string value) - { - if (type == typeof(string)) return value; - - if (type == typeof(bool)) return Convert.ToBoolean(value); - - if (type == typeof(byte)) return Convert.ToByte(value); - - if (type == typeof(char)) return Convert.ToChar(value.Substring(0, 1)); //new Character(value.charAt(0)); - - if (type == typeof(DateTime)) - try - { - return Convert.ToDateTime(value); - } - catch (Exception e) - { - throw new DataMapperException("Error parsing date. Cause: " + e.Message, e); - } - - if (type == typeof(decimal)) return Convert.ToDecimal(value); - - if (type == typeof(double)) return Convert.ToDouble(value); - - if (type == typeof(short)) return Convert.ToInt16(value); - - if (type == typeof(int)) return Convert.ToInt32(value); - - if (type == typeof(long)) return Convert.ToInt64(value); - - if (type == typeof(float)) return Convert.ToSingle(value); - - if (type.IsEnum) - try - { - return Enum.Parse(type, value); - } - catch - { - return value; - } - - return value; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs deleted file mode 100644 index a2fb0d1..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for DynamicTagHandler. -/// -public sealed class DynamicTagHandler : BaseTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public DynamicTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - #region Methods - /// - /// - /// - /// - /// - /// - public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - ctx.FirstNonDynamicTagWithPrepend = null; - if (tag.IsPrependAvailable) ctx.IsOverridePrepend = true; - return INCLUDE_BODY; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs deleted file mode 100644 index 2b35a00..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs +++ /dev/null @@ -1,67 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using System.Text; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for ISqlTagHandler. -/// -public interface ISqlTagHandler -{ - /// - /// - bool IsPostParseRequired { get; } - - /// - /// - /// - /// - /// - /// - int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject); - - /// - /// - /// - /// - /// - /// - /// - int DoEndFragment(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent); - - /// - /// - /// - /// - /// - /// - void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent); -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs deleted file mode 100644 index c0df6b3..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs +++ /dev/null @@ -1,73 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using System.Collections; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// IsEmptyTagHandler represent a isEmpty tag element in a dynamic mapped statement. -/// -public class IsEmptyTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEmptyTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - #region Methods - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - if (parameterObject == null) return true; - - var propertyName = ((BaseTag)tag).Property; - object value = null; - if (propertyName != null && propertyName.Length > 0) - value = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory); - else - value = parameterObject; - if (value is ICollection) return value == null || ((ICollection)value).Count < 1; - - if (value != null && typeof(Array).IsAssignableFrom(value.GetType())) //value.GetType().IsArray - return ((Array)value).GetLength(0) == 0; - - return value == null || Convert.ToString(value).Equals(""); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs deleted file mode 100644 index 6014ecb..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs +++ /dev/null @@ -1,58 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsEqualTagHandler. -/// -public class IsEqualTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - #region Methods - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return Compare(ctx, tag, parameterObject) == 0; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs deleted file mode 100644 index 73a1e6f..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsGreaterEqualTagHandler. -/// -public sealed class IsGreaterEqualTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - #region Methods - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - var x = Compare(ctx, tag, parameterObject); - return x >= 0 && x != NOT_COMPARABLE; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs deleted file mode 100644 index 25c6e65..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsGreaterThanTagHandler. -/// -public sealed class IsGreaterThanTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsGreaterThanTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - var x = Compare(ctx, tag, parameterObject); - return x > 0 && x != NOT_COMPARABLE; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs deleted file mode 100644 index a09c134..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsLessEqualTagHandler. -/// -public sealed class IsLessEqualTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - var x = Compare(ctx, tag, parameterObject); - return x <= 0 && x != NOT_COMPARABLE; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs deleted file mode 100644 index 203ca9e..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs +++ /dev/null @@ -1,54 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsLessThanTagHandler. -/// -public sealed class IsLessThanTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsLessThanTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - var x = Compare(ctx, tag, parameterObject); - return x < 0 && x != NOT_COMPARABLE; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs deleted file mode 100644 index e2afe10..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsNotEmptyTagHandler. -/// -public sealed class IsNotEmptyTagHandler : IsEmptyTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEmptyTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs deleted file mode 100644 index 202d67e..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsNotEqualTagHandler. -/// -public sealed class IsNotEqualTagHandler : IsEqualTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotEqualTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs deleted file mode 100644 index abaef1c..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsNotNullTagHandler. -/// -public sealed class IsNotNullTagHandler : IsNullTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotNullTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs deleted file mode 100644 index 42097b9..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsNotParameterPresentTagHandler. -/// -public sealed class IsNotParameterPresentTagHandler : IsParameterPresentTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotParameterPresentTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs deleted file mode 100644 index 1ba9b8f..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsNotPropertyAvailableTagHandler. -/// -public class IsNotPropertyAvailableTagHandler : IsPropertyAvailableTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNotPropertyAvailableTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return !base.IsCondition(ctx, tag, parameterObject); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs deleted file mode 100644 index c7dd938..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs +++ /dev/null @@ -1,62 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsNullTagHandler. -/// -public class IsNullTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsNullTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - if (parameterObject == null) return true; - - var propertyName = ((BaseTag)tag).Property; - object value; - if (propertyName != null && propertyName.Length > 0) - value = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory); - else - value = parameterObject; - return value == null; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs deleted file mode 100644 index 176880d..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs +++ /dev/null @@ -1,53 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsParameterPresentTagHandler. -/// -public class IsParameterPresentTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsParameterPresentTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - return parameterObject != null; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs deleted file mode 100644 index 3026c70..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 405046 $ - * $LastChangedDate: 2006-05-08 07:21:44 -0600 (Mon, 08 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IsPropertyAvailableTagHandler. -/// -public class IsPropertyAvailableTagHandler : ConditionalTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IsPropertyAvailableTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - - /// - /// - /// - /// - /// - /// - public override bool IsCondition(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - if (parameterObject == null) return false; - - return ObjectProbe.HasReadableProperty(parameterObject, ((BaseTag)tag).Property); - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateContext.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateContext.cs deleted file mode 100644 index 484932a..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateContext.cs +++ /dev/null @@ -1,146 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.DataMapper.Exceptions; -using System.Collections; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IterateContext. -/// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dncscol/html/csharp01212002.asp -/// http://www.microsoft.com/mspress/books/sampchap/6173.asp -/// http://www.dur.ac.uk/barry.cornelius/java/a.taste.of.csharp/onefile/ -/// -public sealed class IterateContext : IEnumerator -{ - /// - /// Constructor - /// - /// - public IterateContext(object collection) - { - if (collection is ICollection) - { - _collection = (ICollection)collection; - } - else if (collection.GetType().IsArray) - { - var array = (object[])collection; - var list = new ArrayList(); - var lenght = array.Length; - for (var i = 0; i < lenght; i++) list.Add(array[i]); - _collection = list; - } - else - { - throw new DataMapperException("ParameterObject or property was not a Collection, Array or Iterator."); - } - - var enumerable = (IEnumerable)collection; - var enumerator = enumerable.GetEnumerator(); - - while (enumerator.MoveNext()) _items.Add(enumerator.Current); - var disposable = enumerator as IDisposable; - if (disposable != null) disposable.Dispose(); - Index = -1; - } - - /// - /// Gets the index of the current element in the collection. - /// - public int Index { get; private set; } = -1; - - /// - /// Return true if the current element is the first. - /// - public bool IsFirst => Index == 0; - - /// - /// Return true if the current element is the last. - /// - public bool IsLast => Index == _items.Count - 1; - - /// - /// Returns true if the iteration has more elements. (In other words, returns true - /// if next would return an element rather than throwing an exception.) - /// - public bool HasNext - { - get - { - if (Index >= -1 && Index < _items.Count - 1) return true; - - return false; - } - } - - /// - /// Sets the enumerator to its initial position, - /// which is before the first element in the collection. - /// - public void Reset() - { - Index = -1; - } - - /// - /// Advances the enumerator to the next element of the collection. - /// - /// - /// True if the enumerator was successfully advanced to the next element; - /// False if the enumerator has passed the end of the collection. - /// - public bool MoveNext() - { - Index++; - if (Index == _items.Count) - return false; - - return true; - } - - /// - /// Gets the current element in the collection. - /// - public object Current => _items[Index]; - - /// - /// Removes from the underlying collection the last element returned by the iterator. - /// - public void Remove() - { - if (_collection is IList) - ((IList)_collection).Remove(Current); - else if (_collection is IDictionary) ((IDictionary)_collection).Remove(Current); - } - - #region Fields - private readonly ICollection _collection; - private readonly ArrayList _items = new(); - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs deleted file mode 100644 index 6e137a9..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs +++ /dev/null @@ -1,163 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region using -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using System.Text; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for IterateTagHandler. -/// -public sealed class IterateTagHandler : BaseTagHandler -{ - /// - /// Initializes a new instance of the class. - /// - /// The accessor factory. - public IterateTagHandler(AccessorFactory accessorFactory) - : base(accessorFactory) { } - - /// - /// - public override bool IsPostParseRequired => true; - - /// - /// - /// - /// - /// - /// - public override int DoStartFragment(SqlTagContext ctx, SqlTag tag, object parameterObject) - { - var iterate = (IterateContext)ctx.GetAttribute(tag); - if (iterate == null) - { - var propertyName = ((BaseTag)tag).Property; - object collection; - if (propertyName != null && propertyName.Length > 0) - collection = ObjectProbe.GetMemberValue(parameterObject, propertyName, AccessorFactory); - else - collection = parameterObject; - iterate = new IterateContext(collection); - ctx.AddAttribute(tag, iterate); - - ctx.PushIterateContext(iterate); - } - - if (iterate != null && iterate.HasNext) return INCLUDE_BODY; - - return SKIP_BODY; - } - - - /// - /// - /// - /// - /// - /// - public override void DoPrepend(SqlTagContext ctx, SqlTag tag, object parameterObject, StringBuilder bodyContent) - { - var iterate = (IterateContext)ctx.GetAttribute(tag); - if (iterate.IsFirst) base.DoPrepend(ctx, tag, parameterObject, bodyContent); - } - - /// - /// - /// - /// - /// - /// - /// - public override int DoEndFragment(SqlTagContext ctx, SqlTag tag, - object parameterObject, StringBuilder bodyContent) - { - var iterate = (IterateContext)ctx.GetAttribute(tag); - - if (iterate.MoveNext()) - { - var propertyName = ((BaseTag)tag).Property; - if (propertyName == null) propertyName = ""; - - var find = propertyName + "[]"; - var replace = propertyName + "[" + iterate.Index + "]"; //Parameter-index-Dynamic - Replace(bodyContent, find, replace); - - if (iterate.IsFirst) - { - var open = ((Iterate)tag).Open; - if (open != null) - { - bodyContent.Insert(0, open); - bodyContent.Insert(0, ' '); - } - } - - if (!iterate.IsLast) - { - var conjunction = ((Iterate)tag).Conjunction; - if (conjunction != null) - { - bodyContent.Append(conjunction); - bodyContent.Append(' '); - } - } - - if (iterate.IsLast) - { - var close = ((Iterate)tag).Close; - if (close != null) bodyContent.Append(close); - } - - return REPEAT_BODY; - } - - ctx.PopIterateContext(); - - return INCLUDE_BODY; - } - - /// - /// - /// - /// - /// - private static void Replace(StringBuilder buffer, string find, string replace) - { - var start = buffer.ToString().IndexOf(find); - var length = find.Length; - while (start > -1) - { - buffer = buffer.Replace(find, replace, start, length); - start = buffer.ToString().IndexOf(find); - } - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs b/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs deleted file mode 100644 index eb51597..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs +++ /dev/null @@ -1,126 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 408164 $ - * $LastChangedDate: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Configuration.Sql.Dynamic.Elements; -using System.Collections; -using System.Text; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic.Handlers; - -/// -/// Summary description for SqlTagContext. -/// -public sealed class SqlTagContext -{ - /// - /// - public SqlTagContext() - { - IsOverridePrepend = false; - } - - /// - /// - public string BodyText => buffer.ToString().Trim(); - - /// - /// - public bool IsOverridePrepend { set; get; } - - /// - /// - public SqlTag FirstNonDynamicTagWithPrepend { get; set; } - - /// - /// - /// - public StringBuilder GetWriter() - { - return buffer; - } - - - /// - /// - /// - /// - public void AddAttribute(object key, object value) - { - _attributes.Add(key, value); - } - - /// - /// - /// - /// - public object GetAttribute(object key) - { - return _attributes[key]; - } - - /// - /// - /// - public void AddParameterMapping(ParameterProperty mapping) - { - _parameterMappings.Add(mapping); - } - - /// - /// - /// - public IList GetParameterMappings() - { - return _parameterMappings; - } - - public void PushIterateContext(IterateContext iterate) - { - _iterates.Push(iterate); - } - - public IterateContext PeekIterateContext() - { - if (_iterates.Count > 0) - return _iterates.Peek(); - return null; - } - - public IterateContext PopIterateContext() - { - return _iterates.Pop(); - } - - #region Fields - private readonly Hashtable _attributes = new(); - private readonly ArrayList _parameterMappings = new(); - private readonly StringBuilder buffer = new(); - private readonly Stack _iterates = new(); - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/ISqlChild.cs b/ORBatis.Core/Configuration/Sql/Dynamic/ISqlChild.cs deleted file mode 100644 index 9988140..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/ISqlChild.cs +++ /dev/null @@ -1,31 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic; - -/// -/// Summary description for ISqlChild. -/// -public interface ISqlChild { } \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Dynamic/SqlText.cs b/ORBatis.Core/Configuration/Sql/Dynamic/SqlText.cs deleted file mode 100644 index 1bc6227..0000000 --- a/ORBatis.Core/Configuration/Sql/Dynamic/SqlText.cs +++ /dev/null @@ -1,62 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 408164 $ - * $Date: 2006-05-21 06:27:09 -0600 (Sun, 21 May 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.DataMapper.Configuration.ParameterMapping; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Dynamic; - -/// -/// Summary description for SqlText. -/// -public sealed class SqlText : ISqlChild -{ - #region Fields - private string _text = string.Empty; - #endregion - - #region Properties - /// - /// - public string Text - { - get => _text; - set - { - _text = value; - IsWhiteSpace = _text.Trim().Length == 0; - } - } - - /// - /// - public bool IsWhiteSpace { get; private set; } - - /// - /// - public ParameterProperty[] Parameters { get; set; } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/ISql.cs b/ORBatis.Core/Configuration/Sql/ISql.cs deleted file mode 100644 index 2a214c1..0000000 --- a/ORBatis.Core/Configuration/Sql/ISql.cs +++ /dev/null @@ -1,50 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 476843 $ - * $Date: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; -using System.Data; - -namespace IBatisNet.DataMapper.Configuration.Sql; - -/// -/// Summary description for ISql. -/// -public interface ISql -{ - #region Methods - /// - /// Builds a new and the text to execute. - /// - /// - /// The parameter object (used by DynamicSql/SimpleDynamicSql). - /// Use to complete the sql statement. - /// - /// The current session - /// The . - /// A new . - RequestScope GetRequestScope(IMappedStatement mappedStatement, object parameterObject, ISqlMapSession session); - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs b/ORBatis.Core/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs deleted file mode 100644 index 8c934aa..0000000 --- a/ORBatis.Core/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs +++ /dev/null @@ -1,184 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 476843 $ - * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; -using System.Text; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Sql.SimpleDynamic; - -/// -/// Summary description for SimpleDynamicSql. -/// -internal sealed class SimpleDynamicSql : ISql -{ - #region Constructor (s) / Destructor - /// - /// Initializes a new instance of the class. - /// - /// The scope. - /// The SQL statement. - /// The statement. - internal SimpleDynamicSql(IScope scope, - string sqlStatement, - IStatement statement) - { - _simpleSqlStatement = sqlStatement; - _statement = statement; - - _dataExchangeFactory = scope.DataExchangeFactory; - } - #endregion - - #region private - private const string ELEMENT_TOKEN = "$"; - - private readonly string _simpleSqlStatement = string.Empty; - private readonly IStatement _statement; - private readonly DataExchangeFactory _dataExchangeFactory; - #endregion - - #region Methods - /// - /// - /// - /// - public string GetSql(object parameterObject) - { - return ProcessDynamicElements(parameterObject); - } - - /// - /// - /// - /// - public static bool IsSimpleDynamicSql(string sqlStatement) - { - return sqlStatement != null && sqlStatement.IndexOf(ELEMENT_TOKEN) > -1; - } - - /// - /// - /// - /// - private string ProcessDynamicElements(object parameterObject) - { - // define which character is seperating fields - - var parser = new StringTokenizer(_simpleSqlStatement, ELEMENT_TOKEN, true); - - var newSql = new StringBuilder(); - - string token = null; - string lastToken = null; - - var enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - - if (ELEMENT_TOKEN.Equals(lastToken)) - { - if (ELEMENT_TOKEN.Equals(token)) - { - newSql.Append(ELEMENT_TOKEN); - token = null; - } - else - { - object value = null; - if (parameterObject != null) - { - if (_dataExchangeFactory.TypeHandlerFactory.IsSimpleType(parameterObject.GetType())) - value = parameterObject; - else - value = ObjectProbe.GetMemberValue(parameterObject, token, _dataExchangeFactory.AccessorFactory); - } - - if (value != null) newSql.Append(value); - - enumerator.MoveNext(); - token = (string)enumerator.Current; - - if (!ELEMENT_TOKEN.Equals(token)) throw new DataMapperException("Unterminated dynamic element in sql (" + _simpleSqlStatement + ")."); - token = null; - } - } - else - { - if (!ELEMENT_TOKEN.Equals(token)) newSql.Append(token); - } - - lastToken = token; - } - - return newSql.ToString(); - } - - - #region ISql Members - /// - /// Builds a new and the sql command text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - var sqlStatement = ProcessDynamicElements(parameterObject); - - var request = new RequestScope(_dataExchangeFactory, session, _statement); - - request.PreparedStatement = BuildPreparedStatement(session, request, sqlStatement); - request.MappedStatement = mappedStatement; - - return request; - } - - /// - /// Build the PreparedStatement - /// - /// - /// - /// - private PreparedStatement BuildPreparedStatement(ISqlMapSession session, RequestScope request, string sqlStatement) - { - var factory = new PreparedStatementFactory(session, request, _statement, sqlStatement); - return factory.Prepare(); - } - #endregion - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Static/ProcedureSql.cs b/ORBatis.Core/Configuration/Sql/Static/ProcedureSql.cs deleted file mode 100644 index 00fc512..0000000 --- a/ORBatis.Core/Configuration/Sql/Static/ProcedureSql.cs +++ /dev/null @@ -1,103 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 476843 $ - * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Static; - -/// -/// Summary description for ProcedureSql. -/// -public sealed class ProcedureSql : ISql -{ - #region Constructor (s) / Destructor - /// - /// Constructor - /// - /// The statement. - /// - /// - public ProcedureSql(IScope scope, string sqlStatement, IStatement statement) - { - _sqlStatement = sqlStatement; - _statement = statement; - - _dataExchangeFactory = scope.DataExchangeFactory; - } - #endregion - #region Fields - private readonly IStatement _statement; - private PreparedStatement _preparedStatement; - private readonly string _sqlStatement = string.Empty; - private readonly object _synRoot = new(); - private readonly DataExchangeFactory _dataExchangeFactory; - #endregion - - #region ISql Members - /// - /// Builds a new and the sql command text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - var request = new RequestScope(_dataExchangeFactory, session, _statement); - - request.PreparedStatement = BuildPreparedStatement(session, request, _sqlStatement); - request.MappedStatement = mappedStatement; - - return request; - } - - /// - /// Build the PreparedStatement - /// - /// - /// - /// - public PreparedStatement BuildPreparedStatement(ISqlMapSession session, RequestScope request, string commandText) - { - if (_preparedStatement == null) - lock (_synRoot) - { - if (_preparedStatement == null) - { - var factory = new PreparedStatementFactory(session, request, _statement, commandText); - _preparedStatement = factory.Prepare(); - } - } - - return _preparedStatement; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Sql/Static/StaticSql.cs b/ORBatis.Core/Configuration/Sql/Static/StaticSql.cs deleted file mode 100644 index 83dc459..0000000 --- a/ORBatis.Core/Configuration/Sql/Static/StaticSql.cs +++ /dev/null @@ -1,92 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 476843 $ - * $LastChangedDate: 2006-11-19 09:07:45 -0700 (Sun, 19 Nov 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.DataMapper.Configuration.Statements; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.Scope; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Sql.Static; - -/// -/// Summary description for StaticSql. -/// -public sealed class StaticSql : ISql -{ - #region Constructor (s) / Destructor - /// - /// Constructor - /// - /// The statement. - /// - public StaticSql(IScope scope, IStatement statement) - { - _statement = statement; - - _dataExchangeFactory = scope.DataExchangeFactory; - } - #endregion - - #region Fields - private readonly IStatement _statement; - private PreparedStatement _preparedStatement; - private readonly DataExchangeFactory _dataExchangeFactory; - #endregion - - #region ISql Members - /// - /// Builds a new and the sql command text to execute. - /// - /// The parameter object (used in DynamicSql) - /// The current session - /// The . - /// A new . - public RequestScope GetRequestScope(IMappedStatement mappedStatement, - object parameterObject, ISqlMapSession session) - { - var request = new RequestScope(_dataExchangeFactory, session, _statement); - - request.PreparedStatement = _preparedStatement; - request.MappedStatement = mappedStatement; - - return request; - } - - /// - /// Build the PreparedStatement - /// - /// - /// - public void BuildPreparedStatement(ISqlMapSession session, string sqlStatement) - { - var request = new RequestScope(_dataExchangeFactory, session, _statement); - - var factory = new PreparedStatementFactory(session, request, _statement, sqlStatement); - _preparedStatement = factory.Prepare(); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/Delete.cs b/ORBatis.Core/Configuration/Statements/Delete.cs deleted file mode 100644 index 351c532..0000000 --- a/ORBatis.Core/Configuration/Statements/Delete.cs +++ /dev/null @@ -1,59 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Xml.Serialization; -#endregion - - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Summary description for delete. -/// -[Serializable] -[XmlRoot("delete", Namespace = "http://ibatis.apache.org/mapping")] -public class Delete : Statement -{ - #region Fields - [NonSerialized] private Generate _generate; - #endregion - - /// - /// Do not use direclty, only for serialization. - /// - public Delete() { } - - /// - /// The Generate tag used by a generated delete statement. - /// (CRUD operation) - /// - [XmlElement("generate", typeof(Generate))] - public Generate Generate - { - get => _generate; - set => _generate = value; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/Generate.cs b/ORBatis.Core/Configuration/Statements/Generate.cs deleted file mode 100644 index 7594692..0000000 --- a/ORBatis.Core/Configuration/Statements/Generate.cs +++ /dev/null @@ -1,99 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Represent a generate tag element. -/// The generation would happen at the point where the -/// SqlMapClient instance is built. -/// -[Serializable] -[XmlRoot("generate", Namespace = "http://ibatis.apache.org/mapping")] -public class Generate : Statement -{ - /// - /// Do not use direclty, only for serialization. - /// - public Generate() { } - - /// - /// The table name used to build the SQL query. - /// - /// - /// Will be used to get the metadata to build the SQL if needed. - /// - [XmlAttribute("table")] - public string Table - { - get => _table; - set => _table = value; - } - - /// - /// The by attribute is used to generate the where clause. - /// - /// The by="" attribute can support multiple colums. - /// - /// < delete ...> - /// <generate table="EMPLOYEE" by="EMPLOYEE_ID, LAST_MOD_DATE" /> - /// </delete> - /// - [XmlAttribute("by")] - public string By - { - get => _by; - set => _by = value; - } - - /// - /// The row version column used to generate the where clause. - /// - /// - /// Only used for updates. Value in updated entity is assumed to have the value after update, so where will be - /// current value - 1. - /// - /// - /// < delete ...> - /// <generate table="EMPLOYEE" by="EMPLOYEE_ID, LAST_MOD_DATE" /> - /// </delete> - /// - [XmlAttribute("rowversion")] - public string RowVersion - { - get => _rowVersion; - set => _rowVersion = value; - } - - #region Fields - [NonSerialized] private string _table = string.Empty; - - [NonSerialized] private string _by = string.Empty; - - [NonSerialized] private string _rowVersion = string.Empty; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/IStatement.cs b/ORBatis.Core/Configuration/Statements/IStatement.cs deleted file mode 100644 index e4ab2d3..0000000 --- a/ORBatis.Core/Configuration/Statements/IStatement.cs +++ /dev/null @@ -1,118 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 469233 $ - * $LastChangedDate: 2006-10-30 12:09:11 -0700 (Mon, 30 Oct 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.DataMapper.Configuration.Cache; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.Configuration.Sql; -using System.Collections; -using System.Data; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Summary description for ISql. -/// -public interface IStatement -{ - #region Properties - /// - /// Allow remapping of dynamic SQL - /// - bool AllowRemapping { get; set; } - - /// - /// Identifier used to identify the statement amongst the others. - /// - string Id { get; set; } - - /// - /// The type of the statement (text or procedure). - /// - CommandType CommandType { get; } - - /// - /// Extend statement attribute - /// - string ExtendStatement { get; set; } - - /// - /// The sql statement to execute. - /// - ISql Sql { get; set; } - - /// - /// The ResultMaps used by the statement. - /// - ResultMapCollection ResultsMap { get; } - - - /// - /// The parameterMap used by the statement. - /// - ParameterMap ParameterMap { get; set; } - - /// - /// The CacheModel used by this statement. - /// - CacheModel CacheModel { get; set; } - - /// - /// The CacheModel name to use. - /// - string CacheModelName { get; set; } - - /// - /// The list class type to use for strongly typed collection. - /// - Type ListClass { get; } - - /// - /// The result class type to used. - /// - Type ResultClass { get; } - - /// - /// The parameter class type to used. - /// - Type ParameterClass { get; } - #endregion - - #region Methods - /// - /// Create an instance of 'IList' class. - /// - /// An object which implement IList. - IList CreateInstanceOfListClass(); - - /// - /// Create an instance of a generic 'IList' class. - /// - /// An object which implement IList. - IList CreateInstanceOfGenericListClass(); - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/Insert.cs b/ORBatis.Core/Configuration/Statements/Insert.cs deleted file mode 100644 index 560e536..0000000 --- a/ORBatis.Core/Configuration/Statements/Insert.cs +++ /dev/null @@ -1,83 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Represent an insert statement. -/// -[Serializable] -[XmlRoot("insert", Namespace = "http://ibatis.apache.org/mapping")] -public class Insert : Statement -{ - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public Insert() { } - #endregion - #region Fields - [NonSerialized] private SelectKey _selectKey; - - [NonSerialized] private Generate _generate; - #endregion - - #region Properties - /// - /// Extend statement attribute - /// - [XmlIgnoreAttribute] - public override string ExtendStatement - { - get => string.Empty; - set { } - } - - /// - /// The selectKey statement used by an insert statement. - /// - [XmlElement("selectKey", typeof(SelectKey))] - public SelectKey SelectKey - { - get => _selectKey; - set => _selectKey = value; - } - - /// - /// The Generate tag used by a generated insert statement. - /// (CRUD operation) - /// - [XmlElement("generate", typeof(Generate))] - public Generate Generate - { - get => _generate; - set => _generate = value; - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/PreparedStatement.cs b/ORBatis.Core/Configuration/Statements/PreparedStatement.cs deleted file mode 100644 index 0422340..0000000 --- a/ORBatis.Core/Configuration/Statements/PreparedStatement.cs +++ /dev/null @@ -1,55 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 477815 $ - * $Date: 2006-11-21 11:46:52 -0700 (Tue, 21 Nov 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using System.Collections.Specialized; -using System.Data; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Construct the list of IDataParameters for the statement -/// and prepare the sql -/// -public class PreparedStatement -{ - #region Properties - /// - /// The list of IDataParameter name used by the PreparedSql. - /// - public StringCollection DbParametersName { get; } = new(); - - /// - /// The list of IDataParameter to use for the PreparedSql. - /// - public IDbDataParameter[] DbParameters { get; set; } - - /// - /// The prepared statement. - /// - public string PreparedSql { get; set; } = string.Empty; - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/PreparedStatementFactory.cs b/ORBatis.Core/Configuration/Statements/PreparedStatementFactory.cs deleted file mode 100644 index 9af5587..0000000 --- a/ORBatis.Core/Configuration/Statements/PreparedStatementFactory.cs +++ /dev/null @@ -1,447 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 591621 $ - * $Date: 2007-11-03 07:44:57 -0600 (Sat, 03 Nov 2007) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.Common.Logging; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.Scope; -using System.Collections.Specialized; -using System.Data; -using System.Reflection; -using System.Text; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Summary description for PreparedStatementFactory. -/// -public class PreparedStatementFactory -{ - /// - /// Constructor - /// - /// - /// - /// - /// - public PreparedStatementFactory(ISqlMapSession session, RequestScope request, IStatement statement, string commandText) - { - _session = session; - _request = request; - _statement = statement; - _commandText = commandText; - } - - - /// - /// Create a list of IDataParameter for the statement and build the sql string. - /// - public PreparedStatement Prepare() - { - _preparedStatement = new PreparedStatement(); - _parameterPrefix = _session.DataSource.DbProvider.ParameterPrefix; - - _preparedStatement.PreparedSql = _commandText; - - if (_statement.CommandType == CommandType.Text) - { - if (_request.ParameterMap != null) - { - CreateParametersForTextCommand(); - EvaluateParameterMap(); - } - } - else if (_statement.CommandType == CommandType.StoredProcedure) // StoredProcedure - { - if (_request.ParameterMap == null) // No parameterMap --> error - throw new DataMapperException("A procedure statement tag must have a parameterMap attribute, which is not the case for the procedure '" + _statement.Id + "."); - - // use the parameterMap - if (_session.DataSource.DbProvider.UseDeriveParameters) - DiscoverParameter(_session); - else - CreateParametersForProcedureCommand(); - - #region Fix for Odbc - // Although executing a parameterized stored procedure using the ODBC .NET Provider - // is slightly different from executing the same procedure using the SQL or - // the OLE DB Provider, there is one important difference - // -- the stored procedure must be called using the ODBC CALL syntax rather than - // the name of the stored procedure. - // For additional information on this CALL syntax, - // see the page entitled "Procedure Calls" in the ODBC Programmer's Reference - // in the MSDN Library. - //http://support.microsoft.com/default.aspx?scid=kb;EN-US;Q309486 - - if (_session.DataSource.DbProvider.IsObdc) - { - var commandTextBuilder = new StringBuilder("{ call "); - commandTextBuilder.Append(_commandText); - - if (_preparedStatement.DbParameters.Length > 0) - { - commandTextBuilder.Append(" ("); - var supIndex = _preparedStatement.DbParameters.Length - 1; - for (var i = 0; i < supIndex; i++) commandTextBuilder.Append("?,"); - commandTextBuilder.Append("?) }"); - } - - _preparedStatement.PreparedSql = commandTextBuilder.ToString(); - } - #endregion - } - - if (_logger.IsDebugEnabled) _logger.Debug("Statement Id: [" + _statement.Id + "] Prepared SQL: [" + _preparedStatement.PreparedSql + "]"); - - return _preparedStatement; - } - - #region Fields - private PreparedStatement _preparedStatement; - - private string _parameterPrefix = string.Empty; - private readonly IStatement _statement; - private readonly ISqlMapSession _session; - private readonly string _commandText = string.Empty; - - private readonly RequestScope _request; - - // (property, DbParameter) - private readonly HybridDictionary _propertyDbParameterMap = new(); - - private static readonly ILog _logger = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); - #endregion - - - #region Private methods - /// - /// For store procedure, auto discover IDataParameters for stored procedures at run-time. - /// - /// The current session. - private void DiscoverParameter(ISqlMapSession session) - { - // pull the parameters for this stored procedure from the parameter cache - // (or discover them & populate the cache) - var commandParameters = session.SqlMapper.DBHelperParameterCache.GetSpParameterSet(session, _commandText); - - _preparedStatement.DbParameters = new IDbDataParameter[commandParameters.Length]; - - var start = session.DataSource.DbProvider.ParameterPrefix.Length; - for (var i = 0; i < commandParameters.Length; i++) - { - var dataParameter = (IDbDataParameter)commandParameters[i]; - - if (session.DataSource.DbProvider.UseParameterPrefixInParameter == false) - if (dataParameter.ParameterName.StartsWith(session.DataSource.DbProvider.ParameterPrefix)) - dataParameter.ParameterName = dataParameter.ParameterName.Substring(start); - - _preparedStatement.DbParametersName.Add(dataParameter.ParameterName); - _preparedStatement.DbParameters[i] = dataParameter; - } - - // Re-sort DbParameters to match order used in the parameterMap - var sortedDbParameters = new IDbDataParameter[commandParameters.Length]; - for (var i = 0; i < _statement.ParameterMap.Properties.Count; i++) sortedDbParameters[i] = Search(session, _preparedStatement.DbParameters, _statement.ParameterMap.Properties[i], i); - _preparedStatement.DbParameters = sortedDbParameters; - } - - private IDbDataParameter Search(ISqlMapSession session, IDbDataParameter[] parameters, ParameterProperty property, int index) - { - if (property.ColumnName.Length > 0) - { - for (var i = 0; i < parameters.Length; i++) - { - var parameterName = parameters[i].ParameterName; - if (session.DataSource.DbProvider.UseParameterPrefixInParameter) - if (parameterName.StartsWith(session.DataSource.DbProvider.ParameterPrefix)) - { - var prefixLength = session.DataSource.DbProvider.ParameterPrefix.Length; - parameterName = parameterName.Substring(prefixLength); - } - - if (property.ColumnName.Equals(parameterName)) return parameters[i]; - } - - throw new IndexOutOfRangeException("The parameter '" + property.ColumnName + "' does not exist in the stored procedure '" + _statement.Id + "'. Check your parameterMap."); - } - - return parameters[index]; - } - - - /// - /// Create IDataParameters for command text statement. - /// - private void CreateParametersForTextCommand() - { - var sqlParamName = string.Empty; - var dbTypePropertyName = _session.DataSource.DbProvider.ParameterDbTypeProperty; - var enumDbType = _session.DataSource.DbProvider.ParameterDbType; - ParameterPropertyCollection list = null; - - if (_session.DataSource.DbProvider.UsePositionalParameters) //obdc/oledb - list = _request.ParameterMap.Properties; - else - list = _request.ParameterMap.PropertiesList; - - _preparedStatement.DbParameters = new IDbDataParameter[list.Count]; - - for (var i = 0; i < list.Count; i++) - { - var property = list[i]; - - if (_session.DataSource.DbProvider.UseParameterPrefixInParameter) - // From Ryan Yao: JIRA-27, used "param" + i++ for sqlParamName - sqlParamName = _parameterPrefix + "param" + i; - else - sqlParamName = "param" + i; - - var dataParameter = _session.CreateDataParameter(); - - - // Manage dbType attribute if any - if (property.DbType != null && property.DbType.Length > 0) - try - { - // Exemple : Enum.parse(System.Data.SqlDbType, 'VarChar') - var dbType = Enum.Parse(enumDbType, property.DbType, true); - - // Exemple : ObjectHelper.SetProperty(sqlparameter, 'SqlDbType', SqlDbType.Int); - ObjectProbe.SetMemberValue(dataParameter, dbTypePropertyName, dbType, - _request.DataExchangeFactory.ObjectFactory, - _request.DataExchangeFactory.AccessorFactory); - } - catch (ArgumentException exception) - { - //TODO: - var message = exception.Message; - } - - // Set IDbDataParameter - // JIRA-49 Fixes (size, precision, and scale) - if (_session.DataSource.DbProvider.SetDbParameterSize) - if (property.Size != -1) - dataParameter.Size = property.Size; - - if (_session.DataSource.DbProvider.SetDbParameterPrecision) dataParameter.Precision = property.Precision; - - if (_session.DataSource.DbProvider.SetDbParameterScale) dataParameter.Scale = property.Scale; - - // Set as direction parameter - dataParameter.Direction = property.Direction; - - dataParameter.ParameterName = sqlParamName; - - _preparedStatement.DbParametersName.Add(property.PropertyName); - _preparedStatement.DbParameters[i] = dataParameter; - - if (_session.DataSource.DbProvider.UsePositionalParameters == false) _propertyDbParameterMap.Add(property, dataParameter); - } - } - - - /// - /// Create IDataParameters for procedure statement. - /// - private void CreateParametersForProcedureCommand() - { - var sqlParamName = string.Empty; - var dbTypePropertyName = _session.DataSource.DbProvider.ParameterDbTypeProperty; - var enumDbType = _session.DataSource.DbProvider.ParameterDbType; - ParameterPropertyCollection list = null; - - if (_session.DataSource.DbProvider.UsePositionalParameters) //obdc/oledb - list = _request.ParameterMap.Properties; - else - list = _request.ParameterMap.PropertiesList; - - _preparedStatement.DbParameters = new IDbDataParameter[list.Count]; - - // ParemeterMap are required for procedure and we tested existance in Prepare() method - // so we don't have to test existence here. - // A ParameterMap used in CreateParametersForProcedureText must - // have property and column attributes set. - // The column attribute is the name of a procedure parameter. - for (var i = 0; i < list.Count; i++) - { - var property = list[i]; - - if (_session.DataSource.DbProvider.UseParameterPrefixInParameter) - sqlParamName = _parameterPrefix + property.ColumnName; - else //obdc/oledb - sqlParamName = property.ColumnName; - - var dataParameter = _session.CreateCommand(_statement.CommandType).CreateParameter(); - - // Manage dbType attribute if any - if (property.DbType != null && property.DbType.Length > 0) - { - // Exemple : Enum.parse(System.Data.SqlDbType, 'VarChar') - var dbType = Enum.Parse(enumDbType, property.DbType, true); - - // Exemple : ObjectHelper.SetProperty(sqlparameter, 'SqlDbType', SqlDbType.Int); - ObjectProbe.SetMemberValue(dataParameter, dbTypePropertyName, dbType, - _request.DataExchangeFactory.ObjectFactory, - _request.DataExchangeFactory.AccessorFactory); - } - - // Set IDbDataParameter - // JIRA-49 Fixes (size, precision, and scale) - if (_session.DataSource.DbProvider.SetDbParameterSize) - if (property.Size != -1) - dataParameter.Size = property.Size; - - if (_session.DataSource.DbProvider.SetDbParameterPrecision) dataParameter.Precision = property.Precision; - - if (_session.DataSource.DbProvider.SetDbParameterScale) dataParameter.Scale = property.Scale; - - // Set as direction parameter - dataParameter.Direction = property.Direction; - - dataParameter.ParameterName = sqlParamName; - - _preparedStatement.DbParametersName.Add(property.PropertyName); - _preparedStatement.DbParameters[i] = dataParameter; - - if (_session.DataSource.DbProvider.UsePositionalParameters == false) _propertyDbParameterMap.Add(property, dataParameter); - } - } - - - /// - /// Parse sql command text. - /// - private void EvaluateParameterMap() - { - var delimiter = "?"; - string token = null; - var index = 0; - var sqlParamName = string.Empty; - var parser = new StringTokenizer(_commandText, delimiter, true); - var newCommandTextBuffer = new StringBuilder(); - - var enumerator = parser.GetEnumerator(); - - while (enumerator.MoveNext()) - { - token = (string)enumerator.Current; - - if (delimiter.Equals(token)) // ? - { - var property = _request.ParameterMap.Properties[index]; - IDataParameter dataParameter = null; - - if (_session.DataSource.DbProvider.UsePositionalParameters) - { - // TODO Refactor? - if (_parameterPrefix.Equals(":")) - // ODP.NET uses positional parameters by default - // but uses ":0" or ":1" instead of "?" - sqlParamName = ":" + index; - else - // OLEDB/OBDC doesn't support named parameters !!! - sqlParamName = "?"; - } - else - { - dataParameter = (IDataParameter)_propertyDbParameterMap[property]; - - // 5 May 2004 - // Need to check UseParameterPrefixInParameter here - // since CreateParametersForStatementText now does - // a check for UseParameterPrefixInParameter before - // creating the parameter name! - if (_session.DataSource.DbProvider.UseParameterPrefixInParameter) - { - // Fix ByteFX.Data.MySqlClient.MySqlParameter - // who strip prefix in Parameter Name ?! - if (_session.DataSource.DbProvider.Name.IndexOf("ByteFx") >= 0) - sqlParamName = _parameterPrefix + dataParameter.ParameterName; - else - sqlParamName = dataParameter.ParameterName; - } - else - { - sqlParamName = _parameterPrefix + dataParameter.ParameterName; - } - } - - newCommandTextBuffer.Append(" "); - newCommandTextBuffer.Append(sqlParamName); - - sqlParamName = string.Empty; - index++; - } - else - { - var startPos = token.IndexOf('#'); - var endPos = token.LastIndexOf('#'); - - if (startPos != endPos) - { - var name = token.Substring(startPos + 1, endPos - startPos - 1); - - if (_session.DataSource.DbProvider.UsePositionalParameters) - throw new InvalidOperationException("Can't use parameter name reference with positional parameters."); - - var property = _request.ParameterMap.GetProperty(name); - IDataParameter dataParameter = dataParameter = (IDataParameter)_propertyDbParameterMap[property]; - - // 5 May 2004 - // Need to check UseParameterPrefixInParameter here - // since CreateParametersForStatementText now does - // a check for UseParameterPrefixInParameter before - // creating the parameter name! - if (_session.DataSource.DbProvider.UseParameterPrefixInParameter) - { - // Fix ByteFX.Data.MySqlClient.MySqlParameter - // who strip prefix in Parameter Name ?! - if (_session.DataSource.DbProvider.Name.IndexOf("ByteFx") >= 0) - sqlParamName = _parameterPrefix + dataParameter.ParameterName; - else - sqlParamName = dataParameter.ParameterName; - } - else - { - sqlParamName = _parameterPrefix + dataParameter.ParameterName; - } - - token = token.Replace("#" + name + "#", sqlParamName); - - sqlParamName = string.Empty; - } - - newCommandTextBuffer.Append(token); - } - } - - _preparedStatement.PreparedSql = newCommandTextBuffer.ToString(); - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/Procedure.cs b/ORBatis.Core/Configuration/Statements/Procedure.cs deleted file mode 100644 index f222743..0000000 --- a/ORBatis.Core/Configuration/Statements/Procedure.cs +++ /dev/null @@ -1,78 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 443064 $ - * $Date: 2006-09-13 12:38:29 -0600 (Wed, 13 Sep 2006) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Using -using IBatisNet.DataMapper.Scope; -using System.Data; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Represent a store Procedure. -/// -[Serializable] -[XmlRoot("procedure", Namespace = "http://ibatis.apache.org/mapping")] -public class Procedure : Statement -{ - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public Procedure() { } - #endregion - - #region Methods - /// - /// - /// The scope of the configuration - internal override void Initialize(ConfigurationScope configurationScope) - { - base.Initialize(configurationScope); - if (ParameterMap == null) - //throw new ConfigurationException("The parameterMap attribute is required in the procedure tag named '"+ this.Id +"'."); - ParameterMap = configurationScope.SqlMapper.GetParameterMap(ConfigurationScope.EMPTY_PARAMETER_MAP); - } - #endregion - - #region Properties - /// - /// The type of the statement StoredProcedure. - /// - [XmlIgnoreAttribute] - public override CommandType CommandType => CommandType.StoredProcedure; - - /// - /// Extend statement attribute - /// - [XmlIgnoreAttribute] - public override string ExtendStatement - { - get => string.Empty; - set { } - } - #endregion -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/Select.cs b/ORBatis.Core/Configuration/Statements/Select.cs deleted file mode 100644 index fa7a433..0000000 --- a/ORBatis.Core/Configuration/Statements/Select.cs +++ /dev/null @@ -1,56 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -using System.Xml.Serialization; - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Summary description for Select. -/// -[Serializable] -[XmlRoot("select", Namespace = "http://ibatis.apache.org/mapping")] -public class Select : Statement -{ - #region Fields - [NonSerialized] private Generate _generate; - #endregion - - /// - /// Do not use direclty, only for serialization. - /// - public Select() { } - - /// - /// The Generate tag used by a generated select statement. - /// (CRUD operation) - /// - [XmlElement("generate", typeof(Generate))] - public Generate Generate - { - get => _generate; - set => _generate = value; - } -} \ No newline at end of file diff --git a/ORBatis.Core/Configuration/Statements/SelectKey.cs b/ORBatis.Core/Configuration/Statements/SelectKey.cs deleted file mode 100644 index a63ea7b..0000000 --- a/ORBatis.Core/Configuration/Statements/SelectKey.cs +++ /dev/null @@ -1,127 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Header: $ - * $Revision: 638571 $ - * $Date: 2008-03-18 15:11:57 -0600 (Tue, 18 Mar 2008) $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2004 - Gilles Bayon - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region Imports -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.DataMapper.Scope; -using System.Xml.Serialization; -#endregion - -namespace IBatisNet.DataMapper.Configuration.Statements; - -/// -/// Represent a SelectKey tag element. -/// -[Serializable] -[XmlRoot("selectKey", Namespace = "http://ibatis.apache.org/mapping")] -public class SelectKey : Statement -{ - #region Constructor (s) / Destructor - /// - /// Do not use direclty, only for serialization. - /// - public SelectKey() { } - #endregion - - #region Methods - /// - /// - /// The scope of the configuration - internal override void Initialize(ConfigurationScope configurationScope) - { - // the propertyName attribute on the selectKey node is optional - if (PropertyName.Length > 0) - { - // Id is equal to the parent node - // insert.SelectKey.Initialize( configScope ); - // insert.SelectKey.Id = insert.Id + DOT + "SelectKey"; - - ProcessSqlStatement(insert.SelectKey); - - // Build MappedStatement - mappedStatement = new MappedStatement(configScope.SqlMapper, insert.SelectKey); - - configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion - } - #endregion - - #region Update tag - Update update; - foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_UPDATE), configScope.XmlNamespaceManager)) - { - configScope.ErrorContext.MoreInfo = "loading update tag"; - configScope.NodeContext = xmlNode; // A update tag - - MappedStatement mappedStatement; - - update = UpdateDeSerializer.Deserialize(xmlNode, configScope); - update.CacheModelName = configScope.ApplyNamespace(update.CacheModelName); - update.ParameterMapName = configScope.ApplyNamespace(update.ParameterMapName); - //update.ResultMapName = ApplyNamespace( update.ResultMapName ); - - if (configScope.UseStatementNamespaces) update.Id = configScope.ApplyNamespace(update.Id); - configScope.ErrorContext.ObjectId = update.Id; - update.Initialize(configScope); - - // Build ISql (analyse sql statement) - if (update.Generate != null) - GenerateCommandText(configScope, update); - else - // Build ISql (analyse sql statement) - ProcessSqlStatement(update); - - // Build MappedStatement - mappedStatement = new UpdateMappedStatement(configScope.SqlMapper, update); - - configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion - - #region Delete tag - Delete delete; - foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_DELETE), configScope.XmlNamespaceManager)) - { - configScope.ErrorContext.MoreInfo = "loading delete tag"; - configScope.NodeContext = xmlNode; // A delete tag - MappedStatement mappedStatement; - - delete = DeleteDeSerializer.Deserialize(xmlNode, configScope); - delete.CacheModelName = configScope.ApplyNamespace(delete.CacheModelName); - delete.ParameterMapName = configScope.ApplyNamespace(delete.ParameterMapName); - //delete.ResultMapName = ApplyNamespace( delete.ResultMapName ); - - if (configScope.UseStatementNamespaces) delete.Id = configScope.ApplyNamespace(delete.Id); - configScope.ErrorContext.ObjectId = delete.Id; - delete.Initialize(configScope); - - // Build ISql (analyse sql statement) - if (delete.Generate != null) - GenerateCommandText(configScope, delete); - else - // Build ISql (analyse sql statement) - ProcessSqlStatement(delete); - - // Build MappedStatement - mappedStatement = new DeleteMappedStatement(configScope.SqlMapper, delete); - - configScope.SqlMapper.AddMappedStatement(mappedStatement.Id, mappedStatement); - } - #endregion - - #region Procedure tag - Procedure procedure; - foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_PROCEDURE), configScope.XmlNamespaceManager)) - { - configScope.ErrorContext.MoreInfo = "loading procedure tag"; - configScope.NodeContext = xmlNode; // A procedure tag - - procedure = ProcedureDeSerializer.Deserialize(xmlNode, configScope); - procedure.CacheModelName = configScope.ApplyNamespace(procedure.CacheModelName); - procedure.ParameterMapName = configScope.ApplyNamespace(procedure.ParameterMapName); - //procedure.ResultMapName = ApplyNamespace( procedure.ResultMapName ); - - if (configScope.UseStatementNamespaces) procedure.Id = configScope.ApplyNamespace(procedure.Id); - configScope.ErrorContext.ObjectId = procedure.Id; - procedure.Initialize(configScope); - - // Build ISql (analyse sql command text) - ProcessSqlStatement(procedure); - - // Build MappedStatement - var mappedStatement = new MappedStatement(configScope.SqlMapper, procedure); - IMappedStatement mapStatement = mappedStatement; - if (procedure.CacheModelName != null && procedure.CacheModelName.Length > 0 && configScope.IsCacheModelsEnabled) mapStatement = new CachingStatement(mappedStatement); - - configScope.SqlMapper.AddMappedStatement(mapStatement.Id, mapStatement); - } - #endregion - #endregion - - #region Load CacheModels - if (configScope.IsCacheModelsEnabled) - { - CacheModel cacheModel; - foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_CACHE_MODEL), configScope.XmlNamespaceManager)) - { - cacheModel = CacheModelDeSerializer.Deserialize(xmlNode, configScope); - cacheModel.Id = configScope.ApplyNamespace(cacheModel.Id); - - // Attach ExecuteEventHandler - foreach (XmlNode flushOn in xmlNode.SelectNodes(ApplyMappingNamespacePrefix(XML_FLUSH_ON_EXECUTE), configScope.XmlNamespaceManager)) - { - var statementName = flushOn.Attributes["statement"].Value; - if (configScope.UseStatementNamespaces) statementName = configScope.ApplyNamespace(statementName); - - // delay registering statements to cache model until all sqlMap files have been processed - var statementNames = (IList)configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id]; - if (statementNames == null) statementNames = new ArrayList(); - statementNames.Add(statementName); - configScope.CacheModelFlushOnExecuteStatements[cacheModel.Id] = statementNames; - } - - // Get Properties - foreach (XmlNode propertie in xmlNode.SelectNodes(ApplyMappingNamespacePrefix(XML_PROPERTY), configScope.XmlNamespaceManager)) - { - var name = propertie.Attributes["name"].Value; - var value = propertie.Attributes["value"].Value; - - cacheModel.AddProperty(name, value); - } - - cacheModel.Initialize(); - - configScope.SqlMapper.AddCache(cacheModel); - } - } - #endregion - - configScope.ErrorContext.Reset(); - } - - - /// - /// Process the Sql Statement - /// - /// - private void ProcessSqlStatement(IStatement statement) - { - var isDynamic = false; - var commandTextNode = _configScope.NodeContext; - var dynamic = new DynamicSql(_configScope, statement); - var sqlBuffer = new StringBuilder(); - - if (statement.Id == "DynamicJIRA") Console.Write("tt"); - - _configScope.ErrorContext.MoreInfo = "process the Sql statement"; - - // Resolve "extend" attribute on Statement - if (statement.ExtendStatement.Length > 0) - { - // Find 'super' statement - var supperStatementNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_STATEMENT) + "/child::*[@id='" + statement.ExtendStatement + "']", _configScope.XmlNamespaceManager); - if (supperStatementNode != null) - commandTextNode.InnerXml = supperStatementNode.InnerXml + commandTextNode.InnerXml; - else - throw new ConfigurationException("Unable to find extend statement named '" + statement.ExtendStatement + "' on statement '" + statement.Id + "'.'"); - } - - _configScope.ErrorContext.MoreInfo = "parse dynamic tags on sql statement"; - - isDynamic = ParseDynamicTags(commandTextNode, dynamic, sqlBuffer, isDynamic, false, statement); - - if (isDynamic) - { - statement.Sql = dynamic; - } - else - { - var sqlText = sqlBuffer.ToString(); - ApplyInlineParemeterMap(statement, sqlText); - } - } - - - /// - /// Parse dynamic tags - /// - /// - /// - /// - /// - /// - /// - /// - private bool ParseDynamicTags(XmlNode commandTextNode, IDynamicParent dynamic, - StringBuilder sqlBuffer, bool isDynamic, bool postParseRequired, IStatement statement) - { - var children = commandTextNode.ChildNodes; - var count = children.Count; - for (var i = 0; i < count; i++) - { - var child = children[i]; - if (child.NodeType == XmlNodeType.CDATA || child.NodeType == XmlNodeType.Text) - { - var data = child.InnerText.Replace('\n', ' ').Replace('\r', ' ').Replace('\t', ' '); //?? - - data = NodeUtils.ParsePropertyTokens(data, _configScope.Properties); - - SqlText sqlText; - if (postParseRequired) - { - sqlText = new SqlText(); - sqlText.Text = data; - } - else - { - sqlText = _paramParser.ParseInlineParameterMap(_configScope, null, data); - } - - dynamic.AddChild(sqlText); - sqlBuffer.Append(data); - } - else if (child.Name == "include") - { - var prop = NodeUtils.ParseAttributes(child, _configScope.Properties); - var refid = NodeUtils.GetStringAttribute(prop, "refid"); - var includeNode = (XmlNode)_configScope.SqlIncludes[refid]; - - if (includeNode == null) - { - var nsrefid = _configScope.ApplyNamespace(refid); - includeNode = (XmlNode)_configScope.SqlIncludes[nsrefid]; - if (includeNode == null) throw new ConfigurationException("Could not find SQL tag to include with refid '" + refid + "'"); - } - - isDynamic = ParseDynamicTags(includeNode, dynamic, sqlBuffer, isDynamic, false, statement); - } - else - { - var nodeName = child.Name; - var serializer = _deSerializerFactory.GetDeSerializer(nodeName); - - if (serializer != null) - { - isDynamic = true; - SqlTag tag; - - tag = serializer.Deserialize(child); - - dynamic.AddChild(tag); - - if (child.HasChildNodes) isDynamic = ParseDynamicTags(child, tag, sqlBuffer, isDynamic, tag.Handler.IsPostParseRequired, statement); - } - } - } - - return isDynamic; - } - - - #region Inline Parameter parsing - /// - /// Apply inline paremeterMap - /// - /// - /// - private void ApplyInlineParemeterMap(IStatement statement, string sqlStatement) - { - var newSql = sqlStatement; - - _configScope.ErrorContext.MoreInfo = "apply inline parameterMap"; - - // Check the inline parameter - if (statement.ParameterMap == null) - { - // Build a Parametermap with the inline parameters. - // if they exist. Then delete inline infos from sqltext. - - var sqlText = _paramParser.ParseInlineParameterMap(_configScope, statement, newSql); - - if (sqlText.Parameters.Length > 0) - { - var map = new ParameterMap(_configScope.DataExchangeFactory); - map.Id = statement.Id + "-InLineParameterMap"; - if (statement.ParameterClass != null) map.Class = statement.ParameterClass; - map.Initialize(_configScope.DataSource.DbProvider.UsePositionalParameters, _configScope); - if (statement.ParameterClass == null && - sqlText.Parameters.Length == 1 && sqlText.Parameters[0].PropertyName == "value") //#value# parameter with no parameterClass attribut - map.DataExchange = _configScope.DataExchangeFactory.GetDataExchangeForClass(typeof(int)); //Get the primitiveDataExchange - statement.ParameterMap = map; - - var lenght = sqlText.Parameters.Length; - for (var index = 0; index < lenght; index++) map.AddParameterProperty(sqlText.Parameters[index]); - } - - newSql = sqlText.Text; - } - - ISql sql = null; - - newSql = newSql.Trim(); - - if (SimpleDynamicSql.IsSimpleDynamicSql(newSql)) - { - sql = new SimpleDynamicSql(_configScope, newSql, statement); - } - else - { - if (statement is Procedure) - { - sql = new ProcedureSql(_configScope, newSql, statement); - // Could not call BuildPreparedStatement for procedure because when NUnit Test - // the database is not here (but in theory procedure must be prepared like statement) - // It's even better as we can then switch DataSource. - } - else if (statement is Statement) - { - sql = new StaticSql(_configScope, statement); - ISqlMapSession session = new SqlMapSession(_configScope.SqlMapper); - - ((StaticSql)sql).BuildPreparedStatement(session, newSql); - } - } - - statement.Sql = sql; - } - #endregion - - - /// - /// Initialize the list of variables defined in the - /// properties file. - /// - private void ParseGlobalProperties() - { - var nodeProperties = _configScope.NodeContext.SelectSingleNode(ApplyDataMapperNamespacePrefix(XML_PROPERTIES), _configScope.XmlNamespaceManager); - _configScope.ErrorContext.Activity = "loading global properties"; - - if (nodeProperties != null) - { - if (nodeProperties.HasChildNodes) - { - foreach (XmlNode propertyNode in nodeProperties.SelectNodes(ApplyDataMapperNamespacePrefix(XML_PROPERTY), _configScope.XmlNamespaceManager)) - { - var keyAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB]; - var valueAttrib = propertyNode.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB]; - - if (keyAttrib != null && valueAttrib != null) - { - _configScope.Properties.Add(keyAttrib.Value, valueAttrib.Value); - - if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", keyAttrib.Value, valueAttrib.Value)); - } - else - { - // Load the file defined by the attribute - var propertiesConfig = Resources.GetAsXmlDocument(propertyNode, _configScope.Properties); - - foreach (XmlNode node in propertiesConfig.SelectNodes(XML_GLOBAL_PROPERTIES, _configScope.XmlNamespaceManager)) - { - _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; - - if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value, node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value)); - } - } - } - } - else - { - // JIRA-38 Fix - // element's InnerXml is currently an empty string anyway - // since are in properties file - - _configScope.ErrorContext.Resource = nodeProperties.OuterXml; - - // Load the file defined by the attribute - var propertiesConfig = Resources.GetAsXmlDocument(nodeProperties, _configScope.Properties); - - foreach (XmlNode node in propertiesConfig.SelectNodes(XML_SETTINGS_ADD)) - { - _configScope.Properties[node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value] = node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value; - - if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Add property \"{0}\" value \"{1}\"", node.Attributes[PROPERTY_ELEMENT_KEY_ATTRIB].Value, node.Attributes[PROPERTY_ELEMENT_VALUE_ATTRIB].Value)); - } - } - } - - _configScope.ErrorContext.Reset(); - } - - - /// - /// Generate the command text for CRUD operation - /// - /// - /// - private void GenerateCommandText(ConfigurationScope configScope, IStatement statement) - { - string generatedSQL; - - //------ Build SQL CommandText - generatedSQL = SqlGenerator.BuildQuery(statement); - - ISql sql = new StaticSql(configScope, statement); - ISqlMapSession session = new SqlMapSession(configScope.SqlMapper); - - ((StaticSql)sql).BuildPreparedStatement(session, generatedSQL); - statement.Sql = sql; - } - - - /// - /// Build a ParameterMap - /// - private void BuildParameterMap() - { - ParameterMap parameterMap; - var parameterMapNode = _configScope.NodeContext; - - _configScope.ErrorContext.MoreInfo = "build ParameterMap"; - - // Get the parameterMap id - var id = _configScope.ApplyNamespace(parameterMapNode.Attributes.GetNamedItem("id").Value); - _configScope.ErrorContext.ObjectId = id; - - // Did we already process it ? - if (_configScope.SqlMapper.ParameterMaps.Contains(id) == false) - { - parameterMap = ParameterMapDeSerializer.Deserialize(parameterMapNode, _configScope); - - parameterMap.Id = _configScope.ApplyNamespace(parameterMap.Id); - var attributeExtendMap = parameterMap.ExtendMap; - parameterMap.ExtendMap = _configScope.ApplyNamespace(parameterMap.ExtendMap); - - if (parameterMap.ExtendMap.Length > 0) - { - ParameterMap superMap; - // Did we already build Extend ParameterMap ? - if (_configScope.SqlMapper.ParameterMaps.Contains(parameterMap.ExtendMap) == false) - { - var superNode = _configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_PARAMETER) + attributeExtendMap + "']", _configScope.XmlNamespaceManager); - - if (superNode != null) - { - _configScope.ErrorContext.MoreInfo = "Build parent ParameterMap"; - _configScope.NodeContext = superNode; - BuildParameterMap(); - superMap = _configScope.SqlMapper.GetParameterMap(parameterMap.ExtendMap); - } - else - { - throw new ConfigurationException("In mapping file '" + _configScope.SqlMapNamespace + "' the parameterMap '" + parameterMap.Id + "' can not resolve extends attribute '" + parameterMap.ExtendMap + "'"); - } - } - else - { - superMap = _configScope.SqlMapper.GetParameterMap(parameterMap.ExtendMap); - } - - // Add extends property - var index = 0; - - foreach (var propertyName in superMap.GetPropertyNameArray()) - { - var property = superMap.GetProperty(propertyName).Clone(); - property.Initialize(_configScope, parameterMap.Class); - parameterMap.InsertParameterProperty(index, property); - index++; - } - } - - _configScope.SqlMapper.AddParameterMap(parameterMap); - } - } - - - /// - /// Build a ResultMap - /// - private ResultMap BuildResultMap(XmlNode resultMapNode, ConfigurationScope configScope) - { - configScope.NodeContext = resultMapNode; - ResultMap resultMap = null; - configScope.ErrorContext.MoreInfo = "build ResultMap"; - - var id = configScope.ApplyNamespace(resultMapNode.Attributes.GetNamedItem("id").Value); - configScope.ErrorContext.ObjectId = id; - - // Did we already process it? - if (configScope.SqlMapper.ResultMaps.Contains(id) == false) - { - resultMap = ResultMapDeSerializer.Deserialize(resultMapNode, configScope); - - var attributeExtendMap = resultMap.ExtendMap; - resultMap.ExtendMap = configScope.ApplyNamespace(resultMap.ExtendMap); - - if (resultMap.ExtendMap != null && resultMap.ExtendMap.Length > 0) - { - IResultMap superMap = null; - // Did we already build Extend ResultMap? - if (configScope.SqlMapper.ResultMaps.Contains(resultMap.ExtendMap) == false) - { - var superNode = configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_SEARCH_RESULTMAP) + attributeExtendMap + "']", configScope.XmlNamespaceManager); - - if (superNode != null) - { - configScope.ErrorContext.MoreInfo = "Build parent ResultMap"; - BuildResultMap(superNode, configScope); - superMap = configScope.SqlMapper.GetResultMap(resultMap.ExtendMap); - } - else - { - throw new ConfigurationException("In mapping file '" + configScope.SqlMapNamespace + "' the resultMap '" + resultMap.Id + "' can not resolve extends attribute '" + resultMap.ExtendMap + "'"); - } - } - else - { - superMap = configScope.SqlMapper.GetResultMap(resultMap.ExtendMap); - } - - // Add parent property - for (var index = 0; index < superMap.Properties.Count; index++) - { - var property = superMap.Properties[index].Clone(); - property.Initialize(configScope, resultMap.Class); - resultMap.Properties.Add(property); - } - - // Add groupBy properties - if (resultMap.GroupByPropertyNames.Count == 0) - for (var i = 0; i < superMap.GroupByPropertyNames.Count; i++) - resultMap.GroupByPropertyNames.Add(superMap.GroupByPropertyNames[i]); - - // Add constructor arguments - if (resultMap.Parameters.Count == 0) - { - for (var i = 0; i < superMap.Parameters.Count; i++) resultMap.Parameters.Add(superMap.Parameters[i]); - if (resultMap.Parameters.Count > 0) resultMap.SetObjectFactory(configScope); - } - - - // Verify that that each groupBy element correspond to a class member - // of one of result property - for (var i = 0; i < resultMap.GroupByPropertyNames.Count; i++) - { - var memberName = resultMap.GroupByPropertyNames[i]; - if (!resultMap.Properties.Contains(memberName)) - throw new ConfigurationException( - string.Format( - "Could not configure ResultMap named \"{0}\". Check the groupBy attribute. Cause: there's no result property named \"{1}\".", - resultMap.Id, memberName)); - } - } - - resultMap.InitializeGroupByProperties(); - configScope.SqlMapper.AddResultMap(resultMap); - } - - return resultMap; - } - - - /// - /// Gets a resource stream. - /// - /// The schema resource key. - /// A resource stream. - public Stream GetStream(string schemaResourceKey) - { - return Assembly.GetExecutingAssembly().GetManifestResourceStream("IBatisNet.DataMapper." + schemaResourceKey); - } - - - /// - /// Apply the dataMapper namespace prefix - /// - /// - /// - public string ApplyDataMapperNamespacePrefix(string elementName) - { - return DATAMAPPER_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + DATAMAPPER_NAMESPACE_PREFIX + ":"); - } - - /// - /// Apply the provider namespace prefix - /// - /// - /// - public string ApplyProviderNamespacePrefix(string elementName) - { - return PROVIDERS_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + PROVIDERS_NAMESPACE_PREFIX + ":"); - } - - /// - /// Apply the module namespace prefix - /// - /// - /// - public static string ApplyModuleNamespacePrefix(string elementName) - { - return MODULE_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + MODULE_NAMESPACE_PREFIX + ":"); - } - - /// - /// Apply the module namespace prefix - /// - /// - /// - public static string ApplyMappingNamespacePrefix(string elementName) - { - return MAPPING_NAMESPACE_PREFIX + ":" + elementName.Replace("/", "/" + MAPPING_NAMESPACE_PREFIX + ":"); - } - #endregion - } -} \ No newline at end of file diff --git a/ORBatis.Framework/Configuration/ResultMapping/DynamicResultMap.cs b/ORBatis.Framework/Configuration/ResultMapping/DynamicResultMap.cs deleted file mode 100644 index 49f8010..0000000 --- a/ORBatis.Framework/Configuration/ResultMapping/DynamicResultMap.cs +++ /dev/null @@ -1,203 +0,0 @@ -//#region Apache Notice -///***************************************************************************** -// * $Revision: 450157 $ -// * $LastChangedDate: 2013-05-31 $ -// * $LastChangedBy: mmccurrey $ -// * -// * MyBATIS.NET Data Mapper -// * -// * -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// * -// ********************************************************************************/ -//#endregion - -//#region Using - -//using System; -//using System.Collections.Specialized; -//using System.Data; -//using System.Dynamic; -//using System.Xml.Serialization; -//using IBatisNet.Common.Utilities.Objects; -//using IBatisNet.DataMapper.DataExchange; -//using IBatisNet.Common.Utilities; - -//#endregion - -//namespace IBatisNet.DataMapper.Configuration.ResultMapping -//{ -// /// -// /// Implementation of interface for auto mapping -// /// -// public class DynamicResultMap : IResultMap -// { -// [NonSerialized] -// private bool _isInitalized = false; - -// [NonSerialized] -// private IFactory _resultClassFactory = null; -// [NonSerialized] -// private readonly ResultPropertyCollection _properties = new ResultPropertyCollection(); - -// [NonSerialized] -// private IDataExchange _dataExchange = null; - -// /// -// /// Initializes a new instance of the class. -// /// -// /// The result class. -// /// The result class factory. -// /// The data exchange. -// public DynamicResultMap(IFactory resultClassFactory, IDataExchange dataExchange) -// { -// _resultClassFactory = resultClassFactory; -// _dataExchange = dataExchange; -// } - -// #region IResultMap Members - -// /// -// /// The GroupBy Properties. -// /// -// [XmlIgnore] -// public StringCollection GroupByPropertyNames -// { -// get { throw new NotImplementedException("The property 'GroupByPropertyNames' is not implemented."); } -// } - -// /// -// /// The collection of ResultProperty. -// /// -// [XmlIgnore] -// public ResultPropertyCollection Properties -// { -// get { return _properties; } -// } - -// /// -// /// The GroupBy Properties. -// /// -// /// -// public ResultPropertyCollection GroupByProperties -// { -// get { throw new NotImplementedException("The property 'GroupByProperties' is not implemented."); } -// } - -// /// -// /// The collection of constructor parameters. -// /// -// [XmlIgnore] -// public ResultPropertyCollection Parameters -// { -// get { throw new NotImplementedException("The property 'Parameters' is not implemented."); } -// } - -// /// -// /// Gets or sets a value indicating whether this instance is initalized. -// /// -// /// -// /// true if this instance is initalized; otherwise, false. -// /// -// public bool IsInitalized -// { -// get { return _isInitalized; } -// set { _isInitalized = value; } -// } - -// /// -// /// Identifier used to identify the resultMap amongst the others. -// /// -// /// -// /// GetProduct -// public string Id -// { -// get { return "DynamicObject"; } -// } - - -// /// -// /// The output type class of the resultMap. -// /// -// /// -// public Type Class -// { -// get { return typeof(dynamic); } -// } - - -// /// -// /// Sets the IDataExchange -// /// -// /// -// public IDataExchange DataExchange -// { -// set { _dataExchange = value; } -// } - - -// /// -// /// Create an instance Of result. -// /// -// /// An array of values that matches the number, order and type -// /// of the parameters for this constructor. -// /// An object. -// public object CreateInstanceOfResult(object[] parameters) -// { -// return CreateInstanceOfResultClass(); -// } - -// /// -// /// Set the value of an object property. -// /// -// /// The object to set the property. -// /// The result property to use. -// /// The database value to set. -// public void SetValueOfProperty(ref object target, ResultProperty property, object dataBaseValue) -// { -// _dataExchange.SetData(ref target, property, dataBaseValue); -// } - -// /// -// /// -// /// -// /// -// public IResultMap ResolveSubMap(IDataReader dataReader) -// { -// return this; -// } - -// #endregion - -// /// -// /// Clones this instance. -// /// -// /// -// public DynamicResultMap Clone() -// { -// return new DynamicResultMap(_resultClassFactory, _dataExchange); -// } - -// /// -// /// Create an instance of result class. -// /// -// /// An object. -// public object CreateInstanceOfResultClass() -// { -// return new ExpandoObject(); -// } - -// } -//} - diff --git a/ORBatis.Framework/ISqlMapper.cs b/ORBatis.Framework/ISqlMapper.cs deleted file mode 100644 index 09dc319..0000000 --- a/ORBatis.Framework/ISqlMapper.cs +++ /dev/null @@ -1,525 +0,0 @@ -#region Apache Notice -/***************************************************************************** - * $Revision: 374175 $ - * $LastChangedDate: 2006-02-19 12:37:22 +0100 (Sun, 19 Feb 2006) $ - * $LastChangedBy: gbayon $ - * - * iBATIS.NET Data Mapper - * Copyright (C) 2006/2005 - The Apache Software Foundation - * - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - ********************************************************************************/ -#endregion - -#region using -using IBatisNet.Common; -using IBatisNet.Common.Utilities; -using IBatisNet.Common.Utilities.Objects; -using IBatisNet.Common.Utilities.Objects.Members; -using IBatisNet.DataMapper.Configuration.Cache; -using IBatisNet.DataMapper.Configuration.ParameterMapping; -using IBatisNet.DataMapper.Configuration.ResultMapping; -using IBatisNet.DataMapper.DataExchange; -using IBatisNet.DataMapper.Exceptions; -using IBatisNet.DataMapper.MappedStatements; -using IBatisNet.DataMapper.TypeHandlers; -using System; -using System.Collections; -using System.Collections.Generic; -using System.Collections.Specialized; -using System.Data; - -//using IBatisNet.DataMapper.SessionStore; -#endregion - -namespace IBatisNet.DataMapper -{ - /// - /// Contract for an - /// - public interface ISqlMapper - { - /// - /// Name used to identify the the - /// - string Id { get; } - - /// - /// Gets the DB helper parameter cache. - /// - /// The DB helper parameter cache. - DBHelperParameterCache DBHelperParameterCache { get; } - - /// - /// A flag that determines whether cache models were enabled - /// when this SqlMap was built. - /// - bool IsCacheModelsEnabled { get; set; } - - /// - /// Factory for DataExchange objects - /// - DataExchangeFactory DataExchangeFactory { get; } - - /// - /// The TypeHandlerFactory - /// - TypeHandlerFactory TypeHandlerFactory { get; } - - /// - /// The meta factory for object factory - /// - IObjectFactory ObjectFactory { get; } - - /// - /// The factory which build - /// - AccessorFactory AccessorFactory { get; } - - /// - /// The ParameterMap collection - /// - HybridDictionary ParameterMaps { get; } - - /// - /// The ResultMap collection - /// - HybridDictionary ResultMaps { get; } - - /// - /// The MappedStatements collection - /// - HybridDictionary MappedStatements { get; } - - /// - /// Gets or sets the data source. - /// - /// The data source. - IDataSource DataSource { get; set; } - - /// - /// Creates a new SqlMapSession that will be used to query the data source. - /// - /// A new session - ISqlMapSession CreateSqlMapSession(); - - /// - /// Get a ParameterMap by name - /// - /// The name of the ParameterMap - /// The ParameterMap - ParameterMap GetParameterMap(string name); - - /// - /// Adds a (named) ParameterMap. - /// - /// the ParameterMap to add - void AddParameterMap(ParameterMap parameterMap); - - /// - /// Gets a ResultMap by name - /// - /// The name of the result map - /// The ResultMap - IResultMap GetResultMap(string name); - - /// - /// Adds a (named) ResultMap - /// - /// The ResultMap to add - void AddResultMap(IResultMap resultMap); - - /// - /// Gets a cache by name - /// - /// The name of the cache to get - /// The cache object - CacheModel GetCache(string name); - - /// - /// Adds a (named) cache. - /// - /// The cache to add - void AddCache(CacheModel cache); - - void RegisterEntityToMap(string entityName, Action configure); - - - /// - /// Adds a (named) MappedStatement. - /// - /// The key name - /// The statement to add - void AddMappedStatement(string key, IMappedStatement mappedStatement); - - /// - /// Executes a Sql DELETE statement. - /// Delete returns the number of rows effected. - /// - /// The name of the statement to execute. - /// The parameter object. - /// The number of rows effected. - int Delete(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Flushes all cached objects that belong to this SqlMap - /// - void FlushCaches(); - - /// - /// Gets the data cache stats. - /// - /// - string GetDataCacheStats(); - - /// - /// Gets a MappedStatement by name - /// - /// The id of the statement - /// The MappedStatement - IMappedStatement GetMappedStatement(string id); - - /// - /// Trigger the LazyLoad procedure for a given entity. - /// - /// - /// - bool LazyLoadMappedStatement(string id); - - /// - /// Executes a Sql INSERT statement. - /// Insert is a bit different from other update methods, as it - /// provides facilities for returning the primary key of the - /// newly inserted row (rather than the effected rows). This - /// functionality is of course optional. - ///

    - /// The parameter object is generally used to supply the input - /// data for the INSERT values. - ///

    - /// The name of the statement to execute. - /// The parameter object. - /// - /// The primary key of the newly inserted row. - /// This might be automatically generated by the RDBMS, - /// or selected from a sequence table or other source. - /// - object Insert(string statementName, object parameterObject, ISqlMapSession session); - - ///// - ///// Opens the connection. - ///// - ///// - //ISqlMapSession OpenConnection(); - - ///// - ///// Opens the connection. - ///// - ///// The connection string. - ///// - //ISqlMapSession OpenConnection(string connectionString); - - /// - /// Alias to QueryForMap, .NET spirit. - /// Feature idea by Ted Husted. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); - - /// - /// Alias to QueryForMap, .NET spirit. - /// Feature idea by Ted Husted. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An Ilist object used to hold the objects. - /// A List of result objects. - void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The number of rows to skip over. - /// The maximum number of rows to return. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); - - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the entire result object. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the value of the property specified - /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForMap(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); - - /// - /// Runs a query with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForMapWithRowDelegate(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns a single object of the type of the - /// resultObject parameter. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An object of the type to be returned. - /// The single result object populated with the result set data. - object QueryForObject(string statementName, object parameterObject, object resultObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns that returns data - /// to populate a single object instance. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The single result object populated with the result set data. - object QueryForObject(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns a subset of the results in a dynamic PaginatedList that can be used to - /// automatically scroll through results from a database table. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL - /// The maximum number of objects to store in each page - /// A PaginatedList of beans containing the rows - [Obsolete("This method will be remove in future version.", false)] - PaginatedList QueryForPaginatedList(string statementName, object parameterObject, int pageSize, ISqlMapSession session); - - /// - /// Runs a query for list with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// - /// A List of result objects. - IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); - - ///// - ///// Rolls the back transaction. - ///// - //void RollBackTransaction(); - - ///// - ///// Rolls the back transaction. - ///// - ///// if set to true [close connection]. - //void RollBackTransaction(bool closeConnection); - - /// - /// Executes a Sql UPDATE statement. - /// Update can also be used for any other update statement type, - /// such as inserts and deletes. Update returns the number of - /// rows effected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the UPDATE values as well as the WHERE clause parameter(s). - ///

    - /// The name of the statement to execute. - /// The parameter object. - /// The number of rows effected. - int Update(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the value of the property specified - /// in the valueProperty parameter. If valueProperty is null, the entire result object will be entered. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A IDictionary of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, ISqlMapSession session); - - - /// - /// Executes the SQL and retuns all rows selected in a map that is keyed on the property named - /// in the keyProperty parameter. The value at each key will be the entire result object. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// A IDictionary of object containing the rows keyed by keyProperty. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, ISqlMapSession session); - - /// - /// Runs a query with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The property of the result object to be used as the key. - /// The property of the result object to be used as the value (or null) - /// A delegate called once per row in the QueryForDictionary method> - /// A IDictionary (Hashtable) of object containing the rows keyed by keyProperty. - /// If a transaction is not in progress, or the database throws an exception. - IDictionary QueryForDictionary(string statementName, object parameterObject, string keyProperty, string valueProperty, DictionaryRowDelegate rowDelegate, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns a single object of the type of the - /// resultObject parameter. - /// - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An object of the type to be returned. - /// The single result object populated with the result set data. - T QueryForObject(string statementName, object parameterObject, T instanceObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns that returns data - /// to populate a single object instance. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The single result object populated with the result set data. - T QueryForObject(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, ISqlMapSession session); - - /// - /// Executes a Sql SELECT statement that returns data to populate - /// a number of result objects. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// An Ilist object used to hold the objects. - void QueryForList(string statementName, object parameterObject, IList resultObject, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// The number of rows to skip over. - /// The maximum number of rows to return. - /// A List of result objects. - IList QueryForList(string statementName, object parameterObject, int skipResults, int maxResults, ISqlMapSession session); - - /// - /// Runs a query for list with a custom object that gets a chance to deal - /// with each row as it is processed. - ///

    - /// The parameter object is generally used to supply the input - /// data for the WHERE clause parameter(s) of the SELECT statement. - ///

    - /// The name of the sql statement to execute. - /// The object used to set the parameters in the SQL. - /// - /// A List of result objects. - IList QueryWithRowDelegate(string statementName, object parameterObject, RowDelegate rowDelegate, ISqlMapSession session); - - /// - /// Executes the SQL and retuns all rows selected. - ///

    - ///

    - /// Name of the statement. - /// The parameter object. - /// - DataTable QueryForDataTable(string statementName, object parameterObject, ISqlMapSession session); - } -} \ No newline at end of file diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/ClassDiagram.cd b/ORBatis.Framework/MappedStatements/ResultStrategy/ClassDiagram.cd deleted file mode 100644 index 482be22..0000000 --- a/ORBatis.Framework/MappedStatements/ResultStrategy/ClassDiagram.cd +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - - - - - - - - - - - MappedStatements\ResultStrategy\AutoMapStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAIAAAAAACAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\DictionaryStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\ListStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\ObjectStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\ResultClassStrategy.cs - AAAAAAAAAEAAAAAIAgAAAAAAAAAAAAAAAAAABABAAAA= - - - - - - - MappedStatements\ResultStrategy\ResultMapStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\ResultStrategyFactory.cs - AAAAAAAAAAAAAABAAAAAAAAAIAABAAAAAAAEAAAAAAA= - - - - - - - - - - MappedStatements\ResultStrategy\SimpleTypeStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\MapStrategy.cs - AAAAEAAIAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\GroupByStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - - - - - MappedStatements\ResultStrategy\IResultStrategy.cs - AAAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAA= - - - \ No newline at end of file diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs b/ORBatis.Framework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs deleted file mode 100644 index 742f565..0000000 --- a/ORBatis.Framework/MappedStatements/ResultStrategy/DynamicMapStrategy.cs +++ /dev/null @@ -1,121 +0,0 @@ -//#region Apache Notice -///***************************************************************************** -// * $Revision: 374175 $ -// * $LastChangedDate: 2013-05-31 19:40:27 +0200 (mar., 25 avr. 2006) $ -// * $LastChangedBy: mmccurrey $ -// * -// * MyBATIS.NET Data Mapper -// * -// * -// * -// * Licensed under the Apache License, Version 2.0 (the "License"); -// * you may not use this file except in compliance with the License. -// * You may obtain a copy of the License at -// * -// * http://www.apache.org/licenses/LICENSE-2.0 -// * -// * Unless required by applicable law or agreed to in writing, software -// * distributed under the License is distributed on an "AS IS" BASIS, -// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// * See the License for the specific language governing permissions and -// * limitations under the License. -// * -// ********************************************************************************/ -//#endregion - -//using System.Data; -//using IBatisNet.DataMapper.Configuration.ResultMapping; -//using IBatisNet.DataMapper.Scope; - -//namespace IBatisNet.DataMapper.MappedStatements.ResultStrategy -//{ -// public class DynamicMapStrategy -// { -// /// -// /// Auto-map the reader to the result object. -// /// -// /// The request. -// /// The reader. -// /// The result object. -// /// The AutoResultMap use to map the resultset. -// private DynamicResultMap InitializeAutoResultMap(RequestScope request, ref IDataReader reader, ref object resultObject) -// { -// //In the case of Dynamic, we set the AutoResultMap as an expando object -// DynamicResultMap resultMap = request.CurrentResultMap as DynamicResultMap; - -// if (request.Statement.AllowRemapping) -// { -// resultMap = resultMap.Clone(); - -// ResultPropertyCollection properties = ReaderAutoMapper.Build( -// request.DataExchangeFactory, -// reader, -// ref resultObject); - -// resultMap.Properties.AddRange(properties); -// } -// else -// { -// if (!resultMap.IsInitalized) -// { -// lock (resultMap) -// { -// if (!resultMap.IsInitalized) -// { -// ResultPropertyCollection properties = ReaderAutoMapper.Build( -// request.DataExchangeFactory, -// reader, -// ref resultObject); - -// resultMap.Properties.AddRange(properties); -// resultMap.IsInitalized = true; -// } -// } -// } - -// } - -// return resultMap; -// } - - -// #region IResultStrategy Members - -// /// -// /// Processes the specified -// /// a an auto result map is used. -// /// -// /// The request. -// /// The reader. -// /// The result object. -// public object Process(RequestScope request, ref IDataReader reader, object resultObject) -// { -// object outObject = resultObject; - -// if (outObject == null) -// { -// outObject = (request.CurrentResultMap as AutoResultMap).CreateInstanceOfResultClass(); -// } - -// AutoResultMap resultMap = InitializeAutoResultMap(request, ref reader, ref outObject); - -// // En configuration initialiser des AutoResultMap (IResultMap) avec uniquement leur class name et class et les mettres -// // ds Statement.ResultsMap puis ds AutoMapStrategy faire comme AutoResultMap ds Java -// // tester si la request.CurrentResultMap [AutoResultMap (IResultMap)] est initialisée -// // [if (allowRemapping || getResultMappings() == null) {initialize(rs);] java -// // si ( request.Statement.AllowRemapping || (request.CurrentResultMap as AutoResultMap).IsInitalized) .... - -// for (int index = 0; index < resultMap.Properties.Count; index++) -// { -// ResultProperty property = resultMap.Properties[index]; -// resultMap.SetValueOfProperty(ref outObject, property, -// property.GetDataBaseValue(reader)); -// } - -// return outObject; -// } - -// #endregion -// } -//} - diff --git a/ORBatis.Framework/SqlMap.xsd b/ORBatis.Framework/SqlMap.xsd deleted file mode 100644 index 1a9f7a3..0000000 --- a/ORBatis.Framework/SqlMap.xsd +++ /dev/null @@ -1,853 +0,0 @@ - - - - - - Mapping XML Schema Definition - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ORBatis.Framework/SqlMapConfig.xsd b/ORBatis.Framework/SqlMapConfig.xsd deleted file mode 100644 index 1f6abdf..0000000 --- a/ORBatis.Framework/SqlMapConfig.xsd +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - DataMapper XML Schema Definition - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - The document root. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ORBatis.Framework/Commands/DataReaderDecorator.cs b/ORBatis.Mapper/Commands/DataReaderDecorator.cs similarity index 100% rename from ORBatis.Framework/Commands/DataReaderDecorator.cs rename to ORBatis.Mapper/Commands/DataReaderDecorator.cs diff --git a/ORBatis.Framework/Commands/DataReaderTransformer.cs b/ORBatis.Mapper/Commands/DataReaderTransformer.cs similarity index 100% rename from ORBatis.Framework/Commands/DataReaderTransformer.cs rename to ORBatis.Mapper/Commands/DataReaderTransformer.cs diff --git a/ORBatis.Framework/Commands/DbCommandDecorator.cs b/ORBatis.Mapper/Commands/DbCommandDecorator.cs similarity index 100% rename from ORBatis.Framework/Commands/DbCommandDecorator.cs rename to ORBatis.Mapper/Commands/DbCommandDecorator.cs diff --git a/ORBatis.Framework/Commands/DefaultPreparedCommand.cs b/ORBatis.Mapper/Commands/DefaultPreparedCommand.cs similarity index 100% rename from ORBatis.Framework/Commands/DefaultPreparedCommand.cs rename to ORBatis.Mapper/Commands/DefaultPreparedCommand.cs diff --git a/ORBatis.Core/Commands/IDbDataParameterCollection.cs b/ORBatis.Mapper/Commands/IDbDataParameterCollection.cs similarity index 100% rename from ORBatis.Core/Commands/IDbDataParameterCollection.cs rename to ORBatis.Mapper/Commands/IDbDataParameterCollection.cs diff --git a/ORBatis.Framework/Commands/IPreparedCommand.cs b/ORBatis.Mapper/Commands/IPreparedCommand.cs similarity index 100% rename from ORBatis.Framework/Commands/IPreparedCommand.cs rename to ORBatis.Mapper/Commands/IPreparedCommand.cs diff --git a/ORBatis.Framework/Commands/InMemoryDataReader.cs b/ORBatis.Mapper/Commands/InMemoryDataReader.cs similarity index 100% rename from ORBatis.Framework/Commands/InMemoryDataReader.cs rename to ORBatis.Mapper/Commands/InMemoryDataReader.cs diff --git a/ORBatis.Framework/Commands/PreparedCommandFactory.cs b/ORBatis.Mapper/Commands/PreparedCommandFactory.cs similarity index 100% rename from ORBatis.Framework/Commands/PreparedCommandFactory.cs rename to ORBatis.Mapper/Commands/PreparedCommandFactory.cs diff --git a/ORBatis.Framework/Configuration/Alias/TypeAlias.cs b/ORBatis.Mapper/Configuration/Alias/TypeAlias.cs similarity index 100% rename from ORBatis.Framework/Configuration/Alias/TypeAlias.cs rename to ORBatis.Mapper/Configuration/Alias/TypeAlias.cs diff --git a/ORBatis.Framework/Configuration/Alias/TypeHandler.cs b/ORBatis.Mapper/Configuration/Alias/TypeHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Alias/TypeHandler.cs rename to ORBatis.Mapper/Configuration/Alias/TypeHandler.cs diff --git a/ORBatis.Framework/Configuration/Cache/CacheKey.cs b/ORBatis.Mapper/Configuration/Cache/CacheKey.cs similarity index 100% rename from ORBatis.Framework/Configuration/Cache/CacheKey.cs rename to ORBatis.Mapper/Configuration/Cache/CacheKey.cs diff --git a/ORBatis.Framework/Configuration/Cache/CacheModel.cs b/ORBatis.Mapper/Configuration/Cache/CacheModel.cs similarity index 98% rename from ORBatis.Framework/Configuration/Cache/CacheModel.cs rename to ORBatis.Mapper/Configuration/Cache/CacheModel.cs index 62f6cc1..02ee9cb 100644 --- a/ORBatis.Framework/Configuration/Cache/CacheModel.cs +++ b/ORBatis.Mapper/Configuration/Cache/CacheModel.cs @@ -294,6 +294,8 @@ public object this[CacheKey key] if (_isSerializable && !_isReadOnly && value != NULL_OBJECT && value != null) + { + #if NETFRAMEWORK try { var stream = new MemoryStream((byte[])value); @@ -306,6 +308,9 @@ public object this[CacheKey key] throw new IBatisNetException("Error caching serializable object. Be sure you're not attempting to use " + "a serialized cache for an object that may be taking advantage of lazy loading. Cause: " + ex.Message, ex); } + #endif + } + lock (_statLock) { @@ -327,6 +332,8 @@ public object this[CacheKey key] { if (null == value) value = NULL_OBJECT; if (_isSerializable && !_isReadOnly && value != NULL_OBJECT) + { + #if NETFRAMEWORK try { var stream = new MemoryStream(); @@ -338,6 +345,8 @@ public object this[CacheKey key] { throw new IBatisNetException("Error caching serializable object. Cause: " + ex.Message, ex); } + #endif + } _controller[key] = value; if (_logger.IsDebugEnabled) _logger.Debug(string.Format("Cache object '{0}' using key '{1}' ", value, key)); diff --git a/ORBatis.Framework/Configuration/Cache/Fifo/FifoCacheController.cs b/ORBatis.Mapper/Configuration/Cache/Fifo/FifoCacheController.cs similarity index 100% rename from ORBatis.Framework/Configuration/Cache/Fifo/FifoCacheController.cs rename to ORBatis.Mapper/Configuration/Cache/Fifo/FifoCacheController.cs diff --git a/ORBatis.Framework/Configuration/Cache/FlushInterval.cs b/ORBatis.Mapper/Configuration/Cache/FlushInterval.cs similarity index 100% rename from ORBatis.Framework/Configuration/Cache/FlushInterval.cs rename to ORBatis.Mapper/Configuration/Cache/FlushInterval.cs diff --git a/ORBatis.Framework/Configuration/Cache/ICacheController.cs b/ORBatis.Mapper/Configuration/Cache/ICacheController.cs similarity index 100% rename from ORBatis.Framework/Configuration/Cache/ICacheController.cs rename to ORBatis.Mapper/Configuration/Cache/ICacheController.cs diff --git a/ORBatis.Framework/Configuration/Cache/Lru/LruCacheController.cs b/ORBatis.Mapper/Configuration/Cache/Lru/LruCacheController.cs similarity index 100% rename from ORBatis.Framework/Configuration/Cache/Lru/LruCacheController.cs rename to ORBatis.Mapper/Configuration/Cache/Lru/LruCacheController.cs diff --git a/ORBatis.Framework/Configuration/Cache/Memory/MemoryCacheControler.cs b/ORBatis.Mapper/Configuration/Cache/Memory/MemoryCacheControler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Cache/Memory/MemoryCacheControler.cs rename to ORBatis.Mapper/Configuration/Cache/Memory/MemoryCacheControler.cs diff --git a/ORBatis.Framework/Configuration/Cache/Memory/MemoryCacheLevel.cs b/ORBatis.Mapper/Configuration/Cache/Memory/MemoryCacheLevel.cs similarity index 100% rename from ORBatis.Framework/Configuration/Cache/Memory/MemoryCacheLevel.cs rename to ORBatis.Mapper/Configuration/Cache/Memory/MemoryCacheLevel.cs diff --git a/ORBatis.Core/Configuration/DomSqlMapBuilder.cs b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs similarity index 100% rename from ORBatis.Core/Configuration/DomSqlMapBuilder.cs rename to ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs diff --git a/ORBatis.Framework/Configuration/ParameterMapping/InlineParameterMapParser.cs b/ORBatis.Mapper/Configuration/ParameterMapping/InlineParameterMapParser.cs similarity index 100% rename from ORBatis.Framework/Configuration/ParameterMapping/InlineParameterMapParser.cs rename to ORBatis.Mapper/Configuration/ParameterMapping/InlineParameterMapParser.cs diff --git a/ORBatis.Framework/Configuration/ParameterMapping/ParameterMap.cs b/ORBatis.Mapper/Configuration/ParameterMapping/ParameterMap.cs similarity index 100% rename from ORBatis.Framework/Configuration/ParameterMapping/ParameterMap.cs rename to ORBatis.Mapper/Configuration/ParameterMapping/ParameterMap.cs diff --git a/ORBatis.Framework/Configuration/ParameterMapping/ParameterProperty.cs b/ORBatis.Mapper/Configuration/ParameterMapping/ParameterProperty.cs similarity index 100% rename from ORBatis.Framework/Configuration/ParameterMapping/ParameterProperty.cs rename to ORBatis.Mapper/Configuration/ParameterMapping/ParameterProperty.cs diff --git a/ORBatis.Framework/Configuration/ParameterMapping/ParameterPropertyCollection.cs b/ORBatis.Mapper/Configuration/ParameterMapping/ParameterPropertyCollection.cs similarity index 100% rename from ORBatis.Framework/Configuration/ParameterMapping/ParameterPropertyCollection.cs rename to ORBatis.Mapper/Configuration/ParameterMapping/ParameterPropertyCollection.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/ArgumentProperty.cs b/ORBatis.Mapper/Configuration/ResultMapping/ArgumentProperty.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/ArgumentProperty.cs rename to ORBatis.Mapper/Configuration/ResultMapping/ArgumentProperty.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/AutoResultMap.cs b/ORBatis.Mapper/Configuration/ResultMapping/AutoResultMap.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/AutoResultMap.cs rename to ORBatis.Mapper/Configuration/ResultMapping/AutoResultMap.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/Discriminator.cs b/ORBatis.Mapper/Configuration/ResultMapping/Discriminator.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/Discriminator.cs rename to ORBatis.Mapper/Configuration/ResultMapping/Discriminator.cs diff --git a/ORBatis.Core/Configuration/ResultMapping/DynamicResultMap.cs b/ORBatis.Mapper/Configuration/ResultMapping/DynamicResultMap.cs similarity index 100% rename from ORBatis.Core/Configuration/ResultMapping/DynamicResultMap.cs rename to ORBatis.Mapper/Configuration/ResultMapping/DynamicResultMap.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/IResultMap.cs b/ORBatis.Mapper/Configuration/ResultMapping/IResultMap.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/IResultMap.cs rename to ORBatis.Mapper/Configuration/ResultMapping/IResultMap.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/NullResultMap.cs b/ORBatis.Mapper/Configuration/ResultMapping/NullResultMap.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/NullResultMap.cs rename to ORBatis.Mapper/Configuration/ResultMapping/NullResultMap.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/ResultMap.cs b/ORBatis.Mapper/Configuration/ResultMapping/ResultMap.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/ResultMap.cs rename to ORBatis.Mapper/Configuration/ResultMapping/ResultMap.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/ResultMapCollection.cs b/ORBatis.Mapper/Configuration/ResultMapping/ResultMapCollection.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/ResultMapCollection.cs rename to ORBatis.Mapper/Configuration/ResultMapping/ResultMapCollection.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/ResultProperty.cs b/ORBatis.Mapper/Configuration/ResultMapping/ResultProperty.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/ResultProperty.cs rename to ORBatis.Mapper/Configuration/ResultMapping/ResultProperty.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/ResultPropertyCollection.cs b/ORBatis.Mapper/Configuration/ResultMapping/ResultPropertyCollection.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/ResultPropertyCollection.cs rename to ORBatis.Mapper/Configuration/ResultMapping/ResultPropertyCollection.cs diff --git a/ORBatis.Framework/Configuration/ResultMapping/SubMap.cs b/ORBatis.Mapper/Configuration/ResultMapping/SubMap.cs similarity index 100% rename from ORBatis.Framework/Configuration/ResultMapping/SubMap.cs rename to ORBatis.Mapper/Configuration/ResultMapping/SubMap.cs diff --git a/ORBatis.Framework/Configuration/Serializers/ArgumentPropertyDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/ArgumentPropertyDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/ArgumentPropertyDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/ArgumentPropertyDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/CacheModelDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/CacheModelDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/CacheModelDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/CacheModelDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/DeSerializerFactory.cs b/ORBatis.Mapper/Configuration/Serializers/DeSerializerFactory.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/DeSerializerFactory.cs rename to ORBatis.Mapper/Configuration/Serializers/DeSerializerFactory.cs diff --git a/ORBatis.Framework/Configuration/Serializers/DeleteDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/DeleteDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/DeleteDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/DeleteDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/DiscriminatorDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/DiscriminatorDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/DiscriminatorDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/DiscriminatorDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/DynamicDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/DynamicDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/DynamicDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/DynamicDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/InsertDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/InsertDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/InsertDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/InsertDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsEmptyDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsEmptyDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsEmptyDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsEmptyDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsEqualDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsEqualDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsEqualDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsEqualDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsGreaterEqualDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsGreaterEqualDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsGreaterEqualDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsGreaterEqualDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsGreaterThanDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsGreaterThanDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsGreaterThanDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsGreaterThanDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsLessEqualDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsLessEqualDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsLessEqualDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsLessEqualDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsLessThanDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsLessThanDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsLessThanDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsLessThanDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsNotEmptyDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsNotEmptyDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsNotEmptyDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsNotEmptyDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsNotEqualDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsNotEqualDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsNotEqualDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsNotEqualDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsNotNullDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsNotNullDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsNotNullDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsNotNullDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsNotParameterPresentDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsNotPropertyAvailableDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsNullDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsNullDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsNullDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsNullDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsParameterPresentDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsParameterPresentDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsParameterPresentDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsParameterPresentDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IsPropertyAvailableDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/IterateSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/IterateSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/IterateSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/IterateSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/ParameterMapDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/ParameterMapDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/ParameterMapDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/ParameterMapDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/ParameterPropertyDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/ParameterPropertyDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/ParameterPropertyDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/ParameterPropertyDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/ProcedureDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/ProcedureDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/ProcedureDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/ProcedureDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/ResultMapDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/ResultMapDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/ResultMapDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/ResultMapDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/ResultPropertyDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/ResultPropertyDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/ResultPropertyDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/ResultPropertyDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/SelectDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/SelectDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/SelectDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/SelectDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/SqlDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/SqlDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/SqlDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/SqlDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/StatementDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/StatementDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/StatementDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/StatementDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/SubMapDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/SubMapDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/SubMapDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/SubMapDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/TypeAliasDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/TypeAliasDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/TypeAliasDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/TypeAliasDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/TypeHandlerDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/TypeHandlerDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/TypeHandlerDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/TypeHandlerDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Serializers/UpdateDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/UpdateDeSerializer.cs similarity index 100% rename from ORBatis.Framework/Configuration/Serializers/UpdateDeSerializer.cs rename to ORBatis.Mapper/Configuration/Serializers/UpdateDeSerializer.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/DynamicSql.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/DynamicSql.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/DynamicSql.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/DynamicSql.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/BaseTag.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/BaseTag.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/BaseTag.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/BaseTag.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/Conditional.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/Conditional.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/Conditional.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/Conditional.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/Dynamic.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/Dynamic.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/Dynamic.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/Dynamic.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IDynamicParent.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsEmpty.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsEmpty.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsEmpty.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsEmpty.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsEqual.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsEqual.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsEqual.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsEqual.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsGreaterEqual.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsGreaterThan.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsLessEqual.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsLessThan.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsLessThan.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsLessThan.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsLessThan.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotEmpty.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotEqual.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotNull.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotNull.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotNull.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotNull.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotParameterPresent.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNotPropertyAvailable.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNull.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNull.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsNull.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsNull.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsParameterPresent.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/IsPropertyAvailable.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/Iterate.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/Iterate.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/Iterate.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/Iterate.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Elements/SqlTag.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/SqlTag.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Elements/SqlTag.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Elements/SqlTag.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/BaseTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/ConditionalTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/DynamicTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/ISqlTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsEmptyTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsEqualTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsGreaterEqualTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsGreaterThanTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsLessEqualTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsLessThanTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotEmptyTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotEqualTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotNullTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotParameterPresentTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNotPropertyAvailableTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsNullTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsParameterPresentTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IsPropertyAvailableTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IterateContext.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IterateContext.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IterateContext.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IterateContext.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/IterateTagHandler.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/Handlers/SqlTagContext.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/ISqlChild.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/ISqlChild.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/ISqlChild.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/ISqlChild.cs diff --git a/ORBatis.Framework/Configuration/Sql/Dynamic/SqlText.cs b/ORBatis.Mapper/Configuration/Sql/Dynamic/SqlText.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Dynamic/SqlText.cs rename to ORBatis.Mapper/Configuration/Sql/Dynamic/SqlText.cs diff --git a/ORBatis.Framework/Configuration/Sql/ISql.cs b/ORBatis.Mapper/Configuration/Sql/ISql.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/ISql.cs rename to ORBatis.Mapper/Configuration/Sql/ISql.cs diff --git a/ORBatis.Framework/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs b/ORBatis.Mapper/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs rename to ORBatis.Mapper/Configuration/Sql/SimpleDynamic/SimpleDynamicSql.cs diff --git a/ORBatis.Framework/Configuration/Sql/Static/ProcedureSql.cs b/ORBatis.Mapper/Configuration/Sql/Static/ProcedureSql.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Static/ProcedureSql.cs rename to ORBatis.Mapper/Configuration/Sql/Static/ProcedureSql.cs diff --git a/ORBatis.Framework/Configuration/Sql/Static/StaticSql.cs b/ORBatis.Mapper/Configuration/Sql/Static/StaticSql.cs similarity index 100% rename from ORBatis.Framework/Configuration/Sql/Static/StaticSql.cs rename to ORBatis.Mapper/Configuration/Sql/Static/StaticSql.cs diff --git a/ORBatis.Framework/Configuration/Statements/Delete.cs b/ORBatis.Mapper/Configuration/Statements/Delete.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/Delete.cs rename to ORBatis.Mapper/Configuration/Statements/Delete.cs diff --git a/ORBatis.Framework/Configuration/Statements/Generate.cs b/ORBatis.Mapper/Configuration/Statements/Generate.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/Generate.cs rename to ORBatis.Mapper/Configuration/Statements/Generate.cs diff --git a/ORBatis.Framework/Configuration/Statements/IStatement.cs b/ORBatis.Mapper/Configuration/Statements/IStatement.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/IStatement.cs rename to ORBatis.Mapper/Configuration/Statements/IStatement.cs diff --git a/ORBatis.Framework/Configuration/Statements/Insert.cs b/ORBatis.Mapper/Configuration/Statements/Insert.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/Insert.cs rename to ORBatis.Mapper/Configuration/Statements/Insert.cs diff --git a/ORBatis.Framework/Configuration/Statements/PreparedStatement.cs b/ORBatis.Mapper/Configuration/Statements/PreparedStatement.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/PreparedStatement.cs rename to ORBatis.Mapper/Configuration/Statements/PreparedStatement.cs diff --git a/ORBatis.Framework/Configuration/Statements/PreparedStatementFactory.cs b/ORBatis.Mapper/Configuration/Statements/PreparedStatementFactory.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/PreparedStatementFactory.cs rename to ORBatis.Mapper/Configuration/Statements/PreparedStatementFactory.cs diff --git a/ORBatis.Framework/Configuration/Statements/Procedure.cs b/ORBatis.Mapper/Configuration/Statements/Procedure.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/Procedure.cs rename to ORBatis.Mapper/Configuration/Statements/Procedure.cs diff --git a/ORBatis.Framework/Configuration/Statements/Select.cs b/ORBatis.Mapper/Configuration/Statements/Select.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/Select.cs rename to ORBatis.Mapper/Configuration/Statements/Select.cs diff --git a/ORBatis.Framework/Configuration/Statements/SelectKey.cs b/ORBatis.Mapper/Configuration/Statements/SelectKey.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/SelectKey.cs rename to ORBatis.Mapper/Configuration/Statements/SelectKey.cs diff --git a/ORBatis.Framework/Configuration/Statements/SqlGenerator.cs b/ORBatis.Mapper/Configuration/Statements/SqlGenerator.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/SqlGenerator.cs rename to ORBatis.Mapper/Configuration/Statements/SqlGenerator.cs diff --git a/ORBatis.Framework/Configuration/Statements/Statement.cs b/ORBatis.Mapper/Configuration/Statements/Statement.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/Statement.cs rename to ORBatis.Mapper/Configuration/Statements/Statement.cs diff --git a/ORBatis.Framework/Configuration/Statements/Update.cs b/ORBatis.Mapper/Configuration/Statements/Update.cs similarity index 100% rename from ORBatis.Framework/Configuration/Statements/Update.cs rename to ORBatis.Mapper/Configuration/Statements/Update.cs diff --git a/ORBatis.Framework/DataExchange/BaseDataExchange.cs b/ORBatis.Mapper/DataExchange/BaseDataExchange.cs similarity index 100% rename from ORBatis.Framework/DataExchange/BaseDataExchange.cs rename to ORBatis.Mapper/DataExchange/BaseDataExchange.cs diff --git a/ORBatis.Framework/DataExchange/ComplexDataExchange.cs b/ORBatis.Mapper/DataExchange/ComplexDataExchange.cs similarity index 100% rename from ORBatis.Framework/DataExchange/ComplexDataExchange.cs rename to ORBatis.Mapper/DataExchange/ComplexDataExchange.cs diff --git a/ORBatis.Framework/DataExchange/DataExchangeFactory.cs b/ORBatis.Mapper/DataExchange/DataExchangeFactory.cs similarity index 100% rename from ORBatis.Framework/DataExchange/DataExchangeFactory.cs rename to ORBatis.Mapper/DataExchange/DataExchangeFactory.cs diff --git a/ORBatis.Framework/DataExchange/DictionaryDataExchange.cs b/ORBatis.Mapper/DataExchange/DictionaryDataExchange.cs similarity index 100% rename from ORBatis.Framework/DataExchange/DictionaryDataExchange.cs rename to ORBatis.Mapper/DataExchange/DictionaryDataExchange.cs diff --git a/ORBatis.Framework/DataExchange/DotNetObjectDataExchange.cs b/ORBatis.Mapper/DataExchange/DotNetObjectDataExchange.cs similarity index 100% rename from ORBatis.Framework/DataExchange/DotNetObjectDataExchange.cs rename to ORBatis.Mapper/DataExchange/DotNetObjectDataExchange.cs diff --git a/ORBatis.Framework/DataExchange/IDataExchange.cs b/ORBatis.Mapper/DataExchange/IDataExchange.cs similarity index 100% rename from ORBatis.Framework/DataExchange/IDataExchange.cs rename to ORBatis.Mapper/DataExchange/IDataExchange.cs diff --git a/ORBatis.Framework/DataExchange/ListDataExchange.cs b/ORBatis.Mapper/DataExchange/ListDataExchange.cs similarity index 100% rename from ORBatis.Framework/DataExchange/ListDataExchange.cs rename to ORBatis.Mapper/DataExchange/ListDataExchange.cs diff --git a/ORBatis.Framework/DataExchange/PrimitiveDataExchange.cs b/ORBatis.Mapper/DataExchange/PrimitiveDataExchange.cs similarity index 100% rename from ORBatis.Framework/DataExchange/PrimitiveDataExchange.cs rename to ORBatis.Mapper/DataExchange/PrimitiveDataExchange.cs diff --git a/ORBatis.Framework/Delegates.cs b/ORBatis.Mapper/Delegates.cs similarity index 100% rename from ORBatis.Framework/Delegates.cs rename to ORBatis.Mapper/Delegates.cs diff --git a/ORBatis.Framework/Enumeration.cs b/ORBatis.Mapper/Enumeration.cs similarity index 100% rename from ORBatis.Framework/Enumeration.cs rename to ORBatis.Mapper/Enumeration.cs diff --git a/ORBatis.Framework/Exceptions/DataMapperException.cs b/ORBatis.Mapper/Exceptions/DataMapperException.cs similarity index 100% rename from ORBatis.Framework/Exceptions/DataMapperException.cs rename to ORBatis.Mapper/Exceptions/DataMapperException.cs diff --git a/ORBatis.Framework/ExecuteEventArgs.cs b/ORBatis.Mapper/ExecuteEventArgs.cs similarity index 100% rename from ORBatis.Framework/ExecuteEventArgs.cs rename to ORBatis.Mapper/ExecuteEventArgs.cs diff --git a/ORBatis.Framework/ISqlMapSession.cs b/ORBatis.Mapper/ISqlMapSession.cs similarity index 100% rename from ORBatis.Framework/ISqlMapSession.cs rename to ORBatis.Mapper/ISqlMapSession.cs diff --git a/ORBatis.Core/ISqlMapper.cs b/ORBatis.Mapper/ISqlMapper.cs similarity index 100% rename from ORBatis.Core/ISqlMapper.cs rename to ORBatis.Mapper/ISqlMapper.cs diff --git a/ORBatis.Framework/Logging/ConfigurationSectionHandler.cs b/ORBatis.Mapper/Logging/ConfigurationSectionHandler.cs similarity index 100% rename from ORBatis.Framework/Logging/ConfigurationSectionHandler.cs rename to ORBatis.Mapper/Logging/ConfigurationSectionHandler.cs diff --git a/ORBatis.Framework/Logging/LogManager.cs b/ORBatis.Mapper/Logging/LogManager.cs similarity index 100% rename from ORBatis.Framework/Logging/LogManager.cs rename to ORBatis.Mapper/Logging/LogManager.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/ArgumentStrategyFactory.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/DefaultStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/DefaultStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/DefaultStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/DefaultStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/IArgumentStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/ResultMapStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectArrayStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectGenericListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectListStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectListStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectObjectStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectStrategy.cs b/ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ArgumentStrategy/SelectStrategy.cs rename to ORBatis.Mapper/MappedStatements/ArgumentStrategy/SelectStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/BaseStrategy.cs b/ORBatis.Mapper/MappedStatements/BaseStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/BaseStrategy.cs rename to ORBatis.Mapper/MappedStatements/BaseStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/CachingStatement.cs b/ORBatis.Mapper/MappedStatements/CachingStatement.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/CachingStatement.cs rename to ORBatis.Mapper/MappedStatements/CachingStatement.cs diff --git a/ORBatis.Framework/MappedStatements/DeleteMappedStatement.cs b/ORBatis.Mapper/MappedStatements/DeleteMappedStatement.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/DeleteMappedStatement.cs rename to ORBatis.Mapper/MappedStatements/DeleteMappedStatement.cs diff --git a/ORBatis.Framework/MappedStatements/IMappedStatement.cs b/ORBatis.Mapper/MappedStatements/IMappedStatement.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/IMappedStatement.cs rename to ORBatis.Mapper/MappedStatements/IMappedStatement.cs diff --git a/ORBatis.Framework/MappedStatements/InsertMappedStatement.cs b/ORBatis.Mapper/MappedStatements/InsertMappedStatement.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/InsertMappedStatement.cs rename to ORBatis.Mapper/MappedStatements/InsertMappedStatement.cs diff --git a/ORBatis.Framework/MappedStatements/MappedStatement.cs b/ORBatis.Mapper/MappedStatements/MappedStatement.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/MappedStatement.cs rename to ORBatis.Mapper/MappedStatements/MappedStatement.cs diff --git a/ORBatis.Framework/MappedStatements/PaginatedList.cs b/ORBatis.Mapper/MappedStatements/PaginatedList.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PaginatedList.cs rename to ORBatis.Mapper/MappedStatements/PaginatedList.cs diff --git a/ORBatis.Framework/MappedStatements/PostBindind.cs b/ORBatis.Mapper/MappedStatements/PostBindind.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostBindind.cs rename to ORBatis.Mapper/MappedStatements/PostBindind.cs diff --git a/ORBatis.Framework/MappedStatements/PostSelectStrategy/ArrayStrategy.cs b/ORBatis.Mapper/MappedStatements/PostSelectStrategy/ArrayStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostSelectStrategy/ArrayStrategy.cs rename to ORBatis.Mapper/MappedStatements/PostSelectStrategy/ArrayStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PostSelectStrategy/GenericListStrategy.cs b/ORBatis.Mapper/MappedStatements/PostSelectStrategy/GenericListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostSelectStrategy/GenericListStrategy.cs rename to ORBatis.Mapper/MappedStatements/PostSelectStrategy/GenericListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs b/ORBatis.Mapper/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs rename to ORBatis.Mapper/MappedStatements/PostSelectStrategy/IPostSelectStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PostSelectStrategy/ListStrategy.cs b/ORBatis.Mapper/MappedStatements/PostSelectStrategy/ListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostSelectStrategy/ListStrategy.cs rename to ORBatis.Mapper/MappedStatements/PostSelectStrategy/ListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PostSelectStrategy/ObjectStrategy.cs b/ORBatis.Mapper/MappedStatements/PostSelectStrategy/ObjectStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostSelectStrategy/ObjectStrategy.cs rename to ORBatis.Mapper/MappedStatements/PostSelectStrategy/ObjectStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs b/ORBatis.Mapper/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs rename to ORBatis.Mapper/MappedStatements/PostSelectStrategy/PostSelectStrategyFactory.cs diff --git a/ORBatis.Framework/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs b/ORBatis.Mapper/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs rename to ORBatis.Mapper/MappedStatements/PostSelectStrategy/StrongTypedListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/DefaultStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/DefaultStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/DefaultStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/DefaultStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/GroupByStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/GroupByStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/GroupByStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/GroupByStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/IPropertyStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/IPropertyStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/IPropertyStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/IPropertyStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/PropertyStrategyFactory.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/ResultMapStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/ResultMapStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/ResultMapStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/SelectArrayStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/SelectArrayStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/SelectArrayStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/SelectArrayStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/SelectGenericListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/SelectListStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/SelectListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/SelectListStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/SelectListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/SelectObjectStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/SelectObjectStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/SelectObjectStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/SelectObjectStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/PropertStrategy/SelectStrategy.cs b/ORBatis.Mapper/MappedStatements/PropertStrategy/SelectStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/PropertStrategy/SelectStrategy.cs rename to ORBatis.Mapper/MappedStatements/PropertStrategy/SelectStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ReaderAutoMapper.cs b/ORBatis.Mapper/MappedStatements/ReaderAutoMapper.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ReaderAutoMapper.cs rename to ORBatis.Mapper/MappedStatements/ReaderAutoMapper.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/AutoMapStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/AutoMapStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/AutoMapStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/AutoMapStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/BaseResultStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/BaseResultStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/BaseResultStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/BaseResultStrategy.cs diff --git a/ORBatis.Core/MappedStatements/ResultStrategy/ClassDiagram.cd b/ORBatis.Mapper/MappedStatements/ResultStrategy/ClassDiagram.cd similarity index 100% rename from ORBatis.Core/MappedStatements/ResultStrategy/ClassDiagram.cd rename to ORBatis.Mapper/MappedStatements/ResultStrategy/ClassDiagram.cd diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/DictionaryStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/DictionaryStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/DictionaryStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/DictionaryStrategy.cs diff --git a/ORBatis.Core/MappedStatements/ResultStrategy/DynamicMapStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/DynamicMapStrategy.cs similarity index 100% rename from ORBatis.Core/MappedStatements/ResultStrategy/DynamicMapStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/DynamicMapStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/GroupByStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/GroupByStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/GroupByStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/GroupByStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/IResultStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/IResultStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/IResultStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/IResultStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/ListStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/ListStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/ListStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/ListStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/MapStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/MapStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/MapStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/MapStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/ObjectStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/ObjectStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/ObjectStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/ObjectStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/ResultClassStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/ResultClassStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/ResultClassStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/ResultMapStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/ResultMapStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/ResultMapStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/ResultMapStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/ResultStrategyFactory.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/ResultStrategyFactory.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/ResultStrategyFactory.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/ResultStrategyFactory.cs diff --git a/ORBatis.Framework/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs b/ORBatis.Mapper/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs rename to ORBatis.Mapper/MappedStatements/ResultStrategy/SimpleTypeStrategy.cs diff --git a/ORBatis.Framework/MappedStatements/SelectMappedStatement.cs b/ORBatis.Mapper/MappedStatements/SelectMappedStatement.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/SelectMappedStatement.cs rename to ORBatis.Mapper/MappedStatements/SelectMappedStatement.cs diff --git a/ORBatis.Framework/MappedStatements/UpdateMappedStatement.cs b/ORBatis.Mapper/MappedStatements/UpdateMappedStatement.cs similarity index 100% rename from ORBatis.Framework/MappedStatements/UpdateMappedStatement.cs rename to ORBatis.Mapper/MappedStatements/UpdateMappedStatement.cs diff --git a/ORBatis.Framework/Mapper.cs b/ORBatis.Mapper/Mapper.cs similarity index 100% rename from ORBatis.Framework/Mapper.cs rename to ORBatis.Mapper/Mapper.cs diff --git a/ORBatis.Core/ORBatis.Core.csproj b/ORBatis.Mapper/ORBatis.Core.csproj similarity index 94% rename from ORBatis.Core/ORBatis.Core.csproj rename to ORBatis.Mapper/ORBatis.Core.csproj index 980f9c9..1caa6d7 100644 --- a/ORBatis.Core/ORBatis.Core.csproj +++ b/ORBatis.Mapper/ORBatis.Core.csproj @@ -6,6 +6,7 @@ enable IBatisNet.DataMapper IBatisNet.DataMapper + false diff --git a/ORBatis.Framework/ORBatis.Framework.csproj b/ORBatis.Mapper/ORBatis.Framework.csproj similarity index 99% rename from ORBatis.Framework/ORBatis.Framework.csproj rename to ORBatis.Mapper/ORBatis.Framework.csproj index b01bf52..9786ff0 100644 --- a/ORBatis.Framework/ORBatis.Framework.csproj +++ b/ORBatis.Mapper/ORBatis.Framework.csproj @@ -8,12 +8,10 @@ {3C780CE6-4AAC-4439-8334-8DFE3B091CA3} Library Properties - ORBatisFramework - ORBatisFramework + IBatisNet.DataMapper + IBatisNet.DataMapper v4.8 512 - IBatisNet.DataMapper - IBatisNet.DataMapper AnyCPU diff --git a/ORBatis.Framework/Properties/AssemblyInfo.cs b/ORBatis.Mapper/Properties/AssemblyInfo.cs similarity index 100% rename from ORBatis.Framework/Properties/AssemblyInfo.cs rename to ORBatis.Mapper/Properties/AssemblyInfo.cs diff --git a/ORBatis.Framework/Proxy/ILazyFactory.cs b/ORBatis.Mapper/Proxy/ILazyFactory.cs similarity index 100% rename from ORBatis.Framework/Proxy/ILazyFactory.cs rename to ORBatis.Mapper/Proxy/ILazyFactory.cs diff --git a/ORBatis.Framework/Proxy/LazyFactoryBuilder.cs b/ORBatis.Mapper/Proxy/LazyFactoryBuilder.cs similarity index 100% rename from ORBatis.Framework/Proxy/LazyFactoryBuilder.cs rename to ORBatis.Mapper/Proxy/LazyFactoryBuilder.cs diff --git a/ORBatis.Framework/Proxy/LazyList.cs b/ORBatis.Mapper/Proxy/LazyList.cs similarity index 100% rename from ORBatis.Framework/Proxy/LazyList.cs rename to ORBatis.Mapper/Proxy/LazyList.cs diff --git a/ORBatis.Framework/Proxy/LazyListFactory.cs b/ORBatis.Mapper/Proxy/LazyListFactory.cs similarity index 100% rename from ORBatis.Framework/Proxy/LazyListFactory.cs rename to ORBatis.Mapper/Proxy/LazyListFactory.cs diff --git a/ORBatis.Framework/Proxy/LazyListGeneric.cs b/ORBatis.Mapper/Proxy/LazyListGeneric.cs similarity index 100% rename from ORBatis.Framework/Proxy/LazyListGeneric.cs rename to ORBatis.Mapper/Proxy/LazyListGeneric.cs diff --git a/ORBatis.Framework/Proxy/LazyListGenericFactory.cs b/ORBatis.Mapper/Proxy/LazyListGenericFactory.cs similarity index 100% rename from ORBatis.Framework/Proxy/LazyListGenericFactory.cs rename to ORBatis.Mapper/Proxy/LazyListGenericFactory.cs diff --git a/ORBatis.Framework/Proxy/LazyLoadInterceptor.cs b/ORBatis.Mapper/Proxy/LazyLoadInterceptor.cs similarity index 100% rename from ORBatis.Framework/Proxy/LazyLoadInterceptor.cs rename to ORBatis.Mapper/Proxy/LazyLoadInterceptor.cs diff --git a/ORBatis.Framework/Proxy/LazyLoadProxyFactory.cs b/ORBatis.Mapper/Proxy/LazyLoadProxyFactory.cs similarity index 100% rename from ORBatis.Framework/Proxy/LazyLoadProxyFactory.cs rename to ORBatis.Mapper/Proxy/LazyLoadProxyFactory.cs diff --git a/ORBatis.Framework/Scope/ConfigurationScope.cs b/ORBatis.Mapper/Scope/ConfigurationScope.cs similarity index 100% rename from ORBatis.Framework/Scope/ConfigurationScope.cs rename to ORBatis.Mapper/Scope/ConfigurationScope.cs diff --git a/ORBatis.Framework/Scope/ErrorContext.cs b/ORBatis.Mapper/Scope/ErrorContext.cs similarity index 100% rename from ORBatis.Framework/Scope/ErrorContext.cs rename to ORBatis.Mapper/Scope/ErrorContext.cs diff --git a/ORBatis.Framework/Scope/IScope.cs b/ORBatis.Mapper/Scope/IScope.cs similarity index 100% rename from ORBatis.Framework/Scope/IScope.cs rename to ORBatis.Mapper/Scope/IScope.cs diff --git a/ORBatis.Framework/Scope/RequestScope.cs b/ORBatis.Mapper/Scope/RequestScope.cs similarity index 100% rename from ORBatis.Framework/Scope/RequestScope.cs rename to ORBatis.Mapper/Scope/RequestScope.cs diff --git a/ORBatis.Core/SqlMap.xsd b/ORBatis.Mapper/SqlMap.xsd similarity index 100% rename from ORBatis.Core/SqlMap.xsd rename to ORBatis.Mapper/SqlMap.xsd diff --git a/ORBatis.Core/SqlMapConfig.xsd b/ORBatis.Mapper/SqlMapConfig.xsd similarity index 100% rename from ORBatis.Core/SqlMapConfig.xsd rename to ORBatis.Mapper/SqlMapConfig.xsd diff --git a/ORBatis.Framework/SqlMapModule.xsd b/ORBatis.Mapper/SqlMapModule.xsd similarity index 100% rename from ORBatis.Framework/SqlMapModule.xsd rename to ORBatis.Mapper/SqlMapModule.xsd diff --git a/ORBatis.Framework/SqlMapSession.cs b/ORBatis.Mapper/SqlMapSession.cs similarity index 100% rename from ORBatis.Framework/SqlMapSession.cs rename to ORBatis.Mapper/SqlMapSession.cs diff --git a/ORBatis.Framework/SqlMapper.cs b/ORBatis.Mapper/SqlMapper.cs similarity index 100% rename from ORBatis.Framework/SqlMapper.cs rename to ORBatis.Mapper/SqlMapper.cs diff --git a/ORBatis.Framework/TypeHandlers/AnsiStringTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/AnsiStringTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/AnsiStringTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/AnsiStringTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/BaseTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/BaseTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/BaseTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/BaseTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/BooleanTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/BooleanTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/BooleanTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/BooleanTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/ByteArrayTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/ByteArrayTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/ByteArrayTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/ByteArrayTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/ByteTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/ByteTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/ByteTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/ByteTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/CharTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/CharTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/CharTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/CharTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/CustomTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/CustomTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/CustomTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/CustomTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/DBNullTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/DBNullTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/DBNullTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/DBNullTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/DateTimeTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/DateTimeTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/DateTimeTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/DateTimeTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/DecimalTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/DecimalTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/DecimalTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/DecimalTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/DoubleTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/DoubleTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/DoubleTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/DoubleTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/EnumTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/EnumTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/EnumTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/EnumTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/GuidTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/GuidTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/GuidTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/GuidTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/IParameterSetter.cs b/ORBatis.Mapper/TypeHandlers/IParameterSetter.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/IParameterSetter.cs rename to ORBatis.Mapper/TypeHandlers/IParameterSetter.cs diff --git a/ORBatis.Framework/TypeHandlers/IResultGetter.cs b/ORBatis.Mapper/TypeHandlers/IResultGetter.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/IResultGetter.cs rename to ORBatis.Mapper/TypeHandlers/IResultGetter.cs diff --git a/ORBatis.Framework/TypeHandlers/ITypeHandler.cs b/ORBatis.Mapper/TypeHandlers/ITypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/ITypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/ITypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/ITypeHandlerCallback.cs b/ORBatis.Mapper/TypeHandlers/ITypeHandlerCallback.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/ITypeHandlerCallback.cs rename to ORBatis.Mapper/TypeHandlers/ITypeHandlerCallback.cs diff --git a/ORBatis.Framework/TypeHandlers/Int16TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Int16TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Int16TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Int16TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Int32TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Int32TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Int32TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Int32TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Int64TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Int64TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Int64TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Int64TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableBooleanTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableByteTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableByteTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableByteTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableByteTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableCharTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableCharTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableCharTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableCharTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableDateTimeTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableDecimalTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableDoubleTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableGuidTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableGuidTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableGuidTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableGuidTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableInt16TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableInt16TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableInt16TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableInt16TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableInt32TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableInt32TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableInt32TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableInt32TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableInt64TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableInt64TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableInt64TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableInt64TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableSByteTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableSByteTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableSByteTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableSByteTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableSingleTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableSingleTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableSingleTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableSingleTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableTimeSpanTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableUInt16TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableUInt32TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/Nullables/NullableUInt64TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/ObjectTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/ObjectTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/ObjectTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/ObjectTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/ParameterSetterImpl.cs b/ORBatis.Mapper/TypeHandlers/ParameterSetterImpl.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/ParameterSetterImpl.cs rename to ORBatis.Mapper/TypeHandlers/ParameterSetterImpl.cs diff --git a/ORBatis.Framework/TypeHandlers/ResultGetterImpl.cs b/ORBatis.Mapper/TypeHandlers/ResultGetterImpl.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/ResultGetterImpl.cs rename to ORBatis.Mapper/TypeHandlers/ResultGetterImpl.cs diff --git a/ORBatis.Framework/TypeHandlers/SByteTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/SByteTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/SByteTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/SByteTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/SingleTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/SingleTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/SingleTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/SingleTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/StringTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/StringTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/StringTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/StringTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/TimeSpanTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/TimeSpanTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/TimeSpanTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/TimeSpanTypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/TypeHandlerFactory.cs b/ORBatis.Mapper/TypeHandlers/TypeHandlerFactory.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/TypeHandlerFactory.cs rename to ORBatis.Mapper/TypeHandlers/TypeHandlerFactory.cs diff --git a/ORBatis.Framework/TypeHandlers/UInt16TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/UInt16TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/UInt16TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/UInt16TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/UInt32TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/UInt32TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/UInt32TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/UInt32TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/UInt64TypeHandler.cs b/ORBatis.Mapper/TypeHandlers/UInt64TypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/UInt64TypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/UInt64TypeHandler.cs diff --git a/ORBatis.Framework/TypeHandlers/UnknownTypeHandler.cs b/ORBatis.Mapper/TypeHandlers/UnknownTypeHandler.cs similarity index 100% rename from ORBatis.Framework/TypeHandlers/UnknownTypeHandler.cs rename to ORBatis.Mapper/TypeHandlers/UnknownTypeHandler.cs diff --git a/ORBatis.Framework/Utilities/ConfigWatcherHandler.cs b/ORBatis.Mapper/Utilities/ConfigWatcherHandler.cs similarity index 100% rename from ORBatis.Framework/Utilities/ConfigWatcherHandler.cs rename to ORBatis.Mapper/Utilities/ConfigWatcherHandler.cs diff --git a/ORBatis.Framework/Utilities/Objects/DelegateFactory.cs b/ORBatis.Mapper/Utilities/Objects/DelegateFactory.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/DelegateFactory.cs rename to ORBatis.Mapper/Utilities/Objects/DelegateFactory.cs diff --git a/ORBatis.Framework/Utilities/Objects/DelegateObjectFactory.cs b/ORBatis.Mapper/Utilities/Objects/DelegateObjectFactory.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/DelegateObjectFactory.cs rename to ORBatis.Mapper/Utilities/Objects/DelegateObjectFactory.cs diff --git a/ORBatis.Framework/Utilities/Objects/EmitObjectFactory.cs b/ORBatis.Mapper/Utilities/Objects/EmitObjectFactory.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/EmitObjectFactory.cs rename to ORBatis.Mapper/Utilities/Objects/EmitObjectFactory.cs diff --git a/ORBatis.Framework/Utilities/Objects/FactoryBuilder.cs b/ORBatis.Mapper/Utilities/Objects/FactoryBuilder.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/FactoryBuilder.cs rename to ORBatis.Mapper/Utilities/Objects/FactoryBuilder.cs diff --git a/ORBatis.Framework/Utilities/Objects/FactoryLogAdapter.cs b/ORBatis.Mapper/Utilities/Objects/FactoryLogAdapter.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/FactoryLogAdapter.cs rename to ORBatis.Mapper/Utilities/Objects/FactoryLogAdapter.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/DelegateGetFieldAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/DelegateGetFieldAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/DelegateGetFieldAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/DelegateGetFieldAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/DelegatePropertyGetAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/DelegatePropertySetAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/DelegatePropertySetAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/DelegatePropertySetAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/DelegatePropertySetAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/DelegateSetFieldAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/DelegateSetFieldAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/DelegateSetFieldAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/DelegateSetFieldAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/EmitFieldGetAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/EmitFieldGetAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/EmitFieldGetAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/EmitFieldGetAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/EmitFieldSetAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/EmitFieldSetAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/EmitFieldSetAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/EmitFieldSetAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/EmitPropertyGetAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/EmitPropertyGetAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/EmitPropertyGetAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/EmitPropertyGetAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/EmitPropertySetAccessor.cs b/ORBatis.Mapper/Utilities/Objects/Members/EmitPropertySetAccessor.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/EmitPropertySetAccessor.cs rename to ORBatis.Mapper/Utilities/Objects/Members/EmitPropertySetAccessor.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/GetAccessorFactory.cs b/ORBatis.Mapper/Utilities/Objects/Members/GetAccessorFactory.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/GetAccessorFactory.cs rename to ORBatis.Mapper/Utilities/Objects/Members/GetAccessorFactory.cs diff --git a/ORBatis.Framework/Utilities/Objects/Members/SetAccessorFactory.cs b/ORBatis.Mapper/Utilities/Objects/Members/SetAccessorFactory.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/Members/SetAccessorFactory.cs rename to ORBatis.Mapper/Utilities/Objects/Members/SetAccessorFactory.cs diff --git a/ORBatis.Framework/Utilities/Objects/ObjectFactory.cs b/ORBatis.Mapper/Utilities/Objects/ObjectFactory.cs similarity index 100% rename from ORBatis.Framework/Utilities/Objects/ObjectFactory.cs rename to ORBatis.Mapper/Utilities/Objects/ObjectFactory.cs diff --git a/ORBatis.Framework/Utilities/Resources.cs b/ORBatis.Mapper/Utilities/Resources.cs similarity index 100% rename from ORBatis.Framework/Utilities/Resources.cs rename to ORBatis.Mapper/Utilities/Resources.cs diff --git a/ORBatis.Framework/packages.config b/ORBatis.Mapper/packages.config similarity index 100% rename from ORBatis.Framework/packages.config rename to ORBatis.Mapper/packages.config diff --git a/ORBatis.Test.Core/Config/SqlMap.config b/ORBatis.Test.Core/Config/SqlMap.config deleted file mode 100644 index 6f46fda..0000000 --- a/ORBatis.Test.Core/Config/SqlMap.config +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ORBatis.Test.Core/ORBatis.Framework.Test.csproj b/ORBatis.Test.Core/ORBatis.Framework.Test.csproj deleted file mode 100644 index 46752f9..0000000 --- a/ORBatis.Test.Core/ORBatis.Framework.Test.csproj +++ /dev/null @@ -1,121 +0,0 @@ - - - - - Debug - AnyCPU - {36A67F1E-0B71-4D66-9293-69EC2DAA0C25} - {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} - Library - Properties - ORBatis.Framework.Test - ORBatis.Framework.Test - v4.8 - 512 - 13 - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\Microsoft.Bcl.AsyncInterfaces.8.0.0\lib\net462\Microsoft.Bcl.AsyncInterfaces.dll - - - ..\packages\Microsoft.Extensions.DependencyInjection.Abstractions.8.0.2\lib\net462\Microsoft.Extensions.DependencyInjection.Abstractions.dll - - - ..\packages\Microsoft.Extensions.Logging.Abstractions.8.0.2\lib\net462\Microsoft.Extensions.Logging.Abstractions.dll - - - - ..\packages\MySqlConnector.2.4.0\lib\net48\MySqlConnector.dll - - - - ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll - - - - - - - ..\packages\System.Diagnostics.DiagnosticSource.8.0.1\lib\net462\System.Diagnostics.DiagnosticSource.dll - - - ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll - - - - ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll - - - ..\packages\System.Runtime.4.3.1\lib\net462\System.Runtime.dll - - - ..\packages\System.Runtime.CompilerServices.Unsafe.6.1.2\lib\net462\System.Runtime.CompilerServices.Unsafe.dll - - - ..\packages\System.Threading.Tasks.Extensions.4.5.4\lib\net461\System.Threading.Tasks.Extensions.dll - - - - - ..\packages\xunit.abstractions.2.0.0\lib\net35\xunit.abstractions.dll - - - ..\packages\xunit.assert.2.1.0\lib\dotnet\xunit.assert.dll - - - ..\packages\xunit.extensibility.core.2.1.0\lib\dotnet\xunit.core.dll - - - ..\packages\xunit.extensibility.execution.2.1.0\lib\net45\xunit.execution.desktop.dll - - - - - - - - - - - - - - - {1ec66731-5437-4f55-9617-22e822772864} - ORBatis.Common - - - {3c780ce6-4aac-4439-8334-8dfe3b091ca3} - ORBatis.Framework - - - {cd6be8b9-aef0-4d00-8b58-125a15f328c8} - ORBatis.Test.Common - - - - - - - diff --git a/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs deleted file mode 100644 index f512ab4..0000000 --- a/ORBatis.Test.Core/Tests/BasicFunctionalityFacts.cs +++ /dev/null @@ -1,55 +0,0 @@ -using System.Collections; -using System.Collections.Specialized; -using System.Configuration; -using IBatisNet.DataMapper.Configuration; -using ORBatis.Test.Common; -using ORBatis.Test.Common.Models; -using Xunit; - -namespace ORBatis.Test.Core.Tests; - -public class Tests -{ - [Fact] - public void Basic_AbleToSelectHolidays() - { - var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Test.Framework.Config.SqlMap.config, ORBatis.Test.Framework"); - var builder = new DomSqlMapBuilder() - { - Properties = new NameValueCollection() - { - { "ConnectionString", Constants.ConnectionString } - } - }; - - var mapper = builder.Configure(sqlMapConfig); - var context = mapper.CreateSqlMapSession(); - - Hashtable parameters = new Hashtable - { - { "active", true }, - { "userId", 347317427 } - }; - var holidays = mapper.QueryForList("Holiday.SelectAll", parameters, context); - Assert.NotNull(holidays); - - // This one should use the previously LazyLoaded version! - var holidays2 = mapper.QueryForList("Holiday.SelectAll", parameters, context); - Assert.NotNull(holidays2); - - var cannedParams = new Hashtable() - { - { "orderBy", "Id" }, - { "orderDirection", "Desc" }, - { "startAtRowNumber", 0 }, - { "pageSize", 10 } - }; - var cannedQueries = mapper.QueryForList( - "CannedQuery.GridForOverview", - cannedParams, - context - ); - Assert.NotNull(cannedQueries); - } -} - \ No newline at end of file diff --git a/ORBatis.Test.Framework/App.config b/ORBatis.Test.Framework/App.config deleted file mode 100644 index a80d5a8..0000000 --- a/ORBatis.Test.Framework/App.config +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - diff --git a/ORBatis.Test.Framework/TypeHandlers/GuidByteArray.cs b/ORBatis.Test.Framework/TypeHandlers/GuidByteArray.cs deleted file mode 100644 index c637c08..0000000 --- a/ORBatis.Test.Framework/TypeHandlers/GuidByteArray.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System; -using IBatisNet.DataMapper.TypeHandlers; - - -namespace ORBatis.Test.Framework.TypeHandlers; - -public class GuidByteArray : ITypeHandlerCallback -{ - public object NullValue - { - get { return null as Guid?; } - } - - public object GetResult(IResultGetter getter) - { - try - { - if (getter.Value is byte[]) - return new Guid((byte[])getter.Value); - else - return getter.Value; - } - catch (Exception ex) - { - // https://github.com/ownerrez/orez/issues/8876 - throw new InvalidOperationException("iBatis GUID load error.", ex); - } - } - - public void SetParameter(IParameterSetter setter, object parameter) - { - if (parameter != null && (parameter is Guid || parameter is Guid?)) - setter.Value = ((Guid)parameter).ToByteArray(); - } - - public object ValueOf(string s) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs b/ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs deleted file mode 100644 index e253da1..0000000 --- a/ORBatis.Test.Framework/TypeHandlers/NullableEnum.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using IBatisNet.DataMapper.TypeHandlers; - -namespace ORBatis.Test.Framework.TypeHandlers; - -public class NullableEnum : ITypeHandlerCallback - where T : struct -{ - readonly static Type _underlyingType = Enum.GetUnderlyingType(typeof(T)); - - public object NullValue - { - get { return null; } - } - - public object GetResult(IResultGetter getter) - { - if (getter.Value != null && getter.Value != DBNull.Value) - return (T)(object)Convert.ChangeType(getter.Value, _underlyingType); - else - return NullValue; - } - - public void SetParameter(IParameterSetter setter, object parameter) - { - if (parameter != null && parameter is T) - setter.Value = Convert.ChangeType(parameter, _underlyingType); - else - setter.Value = null; - } - - public object ValueOf(string s) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/ORBatis.Test.Framework/packages.config b/ORBatis.Test.Framework/packages.config deleted file mode 100644 index a547884..0000000 --- a/ORBatis.Test.Framework/packages.config +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/ORBatis.Test.Core/App.config b/ORBatis.Test/App.config similarity index 100% rename from ORBatis.Test.Core/App.config rename to ORBatis.Test/App.config diff --git a/ORBatis.Test.Framework/Config/SqlMap.config b/ORBatis.Test/Config/SqlMap.config similarity index 78% rename from ORBatis.Test.Framework/Config/SqlMap.config rename to ORBatis.Test/Config/SqlMap.config index c18b962..5a1ee62 100644 --- a/ORBatis.Test.Framework/Config/SqlMap.config +++ b/ORBatis.Test/Config/SqlMap.config @@ -13,12 +13,12 @@ - + - - + + diff --git a/ORBatis.Test.Core/ORBatis.Test.Core.csproj b/ORBatis.Test/ORBatis.Test.Core.csproj similarity index 81% rename from ORBatis.Test.Core/ORBatis.Test.Core.csproj rename to ORBatis.Test/ORBatis.Test.Core.csproj index 557de02..1303266 100644 --- a/ORBatis.Test.Core/ORBatis.Test.Core.csproj +++ b/ORBatis.Test/ORBatis.Test.Core.csproj @@ -5,6 +5,9 @@ enable enable false + false + ORBatis.Test + ORBatis.Test @@ -21,7 +24,7 @@ - + diff --git a/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj b/ORBatis.Test/ORBatis.Test.Framework.csproj similarity index 96% rename from ORBatis.Test.Framework/ORBatis.Test.Framework.csproj rename to ORBatis.Test/ORBatis.Test.Framework.csproj index e7d98d1..ddc5ed4 100644 --- a/ORBatis.Test.Framework/ORBatis.Test.Framework.csproj +++ b/ORBatis.Test/ORBatis.Test.Framework.csproj @@ -9,8 +9,8 @@ {FAE04EC0-301F-11D3-BF4B-00C04F79EFBC} Library Properties - ORBatis.Test.Framework - ORBatis.Test.Framework + ORBatis.Test + ORBatis.Test v4.8 512 13 @@ -21,7 +21,7 @@ full false bin\Debug\ - DEBUG;TRACE + DEBUG;TRACE;NETFRAMEWORK prompt 4 @@ -30,7 +30,7 @@ pdbonly true bin\Release\ - TRACE + TRACE;NETFRAMEWORK prompt 4 @@ -106,7 +106,7 @@ {1ec66731-5437-4f55-9617-22e822772864} ORBatis.Common - + {3c780ce6-4aac-4439-8334-8dfe3b091ca3} ORBatis.Framework diff --git a/ORBatis.Test.Framework/Properties/AssemblyInfo.cs b/ORBatis.Test/Properties/AssemblyInfo.cs similarity index 100% rename from ORBatis.Test.Framework/Properties/AssemblyInfo.cs rename to ORBatis.Test/Properties/AssemblyInfo.cs diff --git a/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs similarity index 83% rename from ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs rename to ORBatis.Test/Tests/BasicFunctionalityFacts.cs index aa90a27..073fade 100644 --- a/ORBatis.Test.Framework/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs @@ -1,19 +1,28 @@ +using System; using System.Collections; using System.Collections.Specialized; using System.Configuration; +using System.Xml; using IBatisNet.DataMapper.Configuration; using ORBatis.Test.Common; using ORBatis.Test.Common.Models; using Xunit; -namespace ORBatis.Test.Framework.Tests; +namespace ORBatis.Test.Tests; public class Tests { + private static XmlDocument GetSqlMapConfig() + { + var path = $"ORBatis.Test.Config.SqlMap.config, ORBatis.Test"; + var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument(path); + return sqlMapConfig; + } + [Fact] public void Basic_AbleToSelectHolidays() { - var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument("ORBatis.Test.Framework.Config.SqlMap.config, ORBatis.Test.Framework"); + var sqlMapConfig = GetSqlMapConfig(); var builder = new DomSqlMapBuilder() { Properties = new NameValueCollection() diff --git a/ORBatis.Test.Core/TypeHandlers/GuidByteArray.cs b/ORBatis.Test/TypeHandlers/GuidByteArray.cs similarity index 95% rename from ORBatis.Test.Core/TypeHandlers/GuidByteArray.cs rename to ORBatis.Test/TypeHandlers/GuidByteArray.cs index f6680ad..620e016 100644 --- a/ORBatis.Test.Core/TypeHandlers/GuidByteArray.cs +++ b/ORBatis.Test/TypeHandlers/GuidByteArray.cs @@ -1,8 +1,7 @@ using System; using IBatisNet.DataMapper.TypeHandlers; - -namespace ORBatis.Test.Core.TypeHandlers; +namespace ORBatis.Test.TypeHandlers; public class GuidByteArray : ITypeHandlerCallback { diff --git a/ORBatis.Test.Core/TypeHandlers/NullableEnum.cs b/ORBatis.Test/TypeHandlers/NullableEnum.cs similarity index 95% rename from ORBatis.Test.Core/TypeHandlers/NullableEnum.cs rename to ORBatis.Test/TypeHandlers/NullableEnum.cs index bd96dcb..7f8992d 100644 --- a/ORBatis.Test.Core/TypeHandlers/NullableEnum.cs +++ b/ORBatis.Test/TypeHandlers/NullableEnum.cs @@ -1,7 +1,7 @@ using System; using IBatisNet.DataMapper.TypeHandlers; -namespace ORBatis.Test.Core.TypeHandlers; +namespace ORBatis.Test.TypeHandlers; public class NullableEnum : ITypeHandlerCallback where T : struct diff --git a/ORBatis.Test.Core/packages.config b/ORBatis.Test/packages.config similarity index 100% rename from ORBatis.Test.Core/packages.config rename to ORBatis.Test/packages.config diff --git a/ORBatis.sln b/ORBatis.sln index 8a9bb6b..34585fd 100644 --- a/ORBatis.sln +++ b/ORBatis.sln @@ -1,16 +1,16 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Core", "ORBatis.Core\ORBatis.Core.csproj", "{2882B001-EDFD-4946-9460-858542F5BEAF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Core", "ORBatis.Mapper\ORBatis.Core.csproj", "{2882B001-EDFD-4946-9460-858542F5BEAF}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Common", "ORBatis.Common\ORBatis.Common.csproj", "{1EC66731-5437-4F55-9617-22E822772864}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Framework", "ORBatis.Framework\ORBatis.Framework.csproj", "{3C780CE6-4AAC-4439-8334-8DFE3B091CA3}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Framework", "ORBatis.Mapper\ORBatis.Framework.csproj", "{3C780CE6-4AAC-4439-8334-8DFE3B091CA3}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Framework", "ORBatis.Test.Framework\ORBatis.Test.Framework.csproj", "{36A67F1E-0B71-4D66-9293-69EC2DAA0C25}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Framework", "ORBatis.Test\ORBatis.Test.Framework.csproj", "{36A67F1E-0B71-4D66-9293-69EC2DAA0C25}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Common", "ORBatis.Test.Common\ORBatis.Test.Common.csproj", "{CD6BE8B9-AEF0-4D00-8B58-125A15F328C8}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Core", "ORBatis.Test.Core\ORBatis.Test.Core.csproj", "{3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ORBatis.Test.Core", "ORBatis.Test\ORBatis.Test.Core.csproj", "{3FC6A1A7-8DCB-43E5-8F4D-7F9A9C1875C8}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "SolutionItems", "SolutionItems", "{4AEEEB58-43D1-44EA-BC65-5BFD16039FC1}" ProjectSection(SolutionItems) = preProject From c77f50be12a8aa19349c22a5192b951b95d46e97 Mon Sep 17 00:00:00 2001 From: NLilley Date: Thu, 24 Jul 2025 17:51:12 +0300 Subject: [PATCH 10/16] Tweak SqlMapper logic to make sure only a single lazy configuration call can happen at once. --- ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs | 16 ++++++---------- .../Serializers/TypeAliasDeSerializer.cs | 9 ++++++++- ORBatis.Mapper/SqlMapper.cs | 8 +++++++- README.md | 13 ++++++++++++- 4 files changed, 33 insertions(+), 13 deletions(-) diff --git a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs index 3ab06ee..eaa93fa 100644 --- a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs +++ b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs @@ -844,10 +844,7 @@ private void Initialize() if (!part.ToLower().StartsWith("xml,")) continue; - // TODO: Can we recursively load types? Probably not? - var entityName = parts[i - 1]; - // TODO: Extract out configuration logic to make sure it doesn't depend on _configScope! var configScope = _configScope; var currentNode = xmlNode; configScope.SqlMapper.RegisterEntityToMap(entityName, () => @@ -1063,19 +1060,18 @@ private void ConfigureSqlMap(XmlNode sqlMapNode, ConfigurationScope configScope, configScope.ErrorContext.Activity = "loading SqlMap"; configScope.ErrorContext.Resource = sqlMapNode.OuterXml; - if (configScope.UseConfigFileWatcher) - if (sqlMapNode.Attributes["resource"] != null || sqlMapNode.Attributes["url"] != null) - ConfigWatcherHandler.AddFileToWatch(Resources.GetFileInfo(Resources.GetValueOfNodeResourceUrl(sqlMapNode, configScope.Properties))); - // Load the file configScope.SqlMapDocument = Resources.GetAsXmlDocument(sqlMapNode, configScope.Properties); - if (configScope.ValidateSqlMap) ValidateSchema(configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); + if (configScope.ValidateSqlMap) + ValidateSchema(configScope.SqlMapDocument.ChildNodes[1], "SqlMap.xsd"); configScope.SqlMapNamespace = configScope.SqlMapDocument.SelectSingleNode(ApplyMappingNamespacePrefix(XML_MAPPING_ROOT), configScope.XmlNamespaceManager).Attributes["namespace"].Value; #region Load TypeAlias - foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), configScope.XmlNamespaceManager)) TypeAliasDeSerializer.Deserialize(xmlNode, configScope); + foreach (XmlNode xmlNode in configScope.SqlMapDocument.SelectNodes(ApplyMappingNamespacePrefix(XML_TYPEALIAS), configScope.XmlNamespaceManager)) + TypeAliasDeSerializer.Deserialize(xmlNode, configScope); + configScope.ErrorContext.MoreInfo = string.Empty; configScope.ErrorContext.ObjectId = string.Empty; #endregion @@ -1127,7 +1123,7 @@ private void ConfigureSqlMap(XmlNode sqlMapNode, ConfigurationScope configScope, configScope.ErrorContext.ObjectId = statement.Id; statement.Initialize(configScope); - // Build ISql (analyse sql statement) + // Build ISql (analyse sql statement) ProcessSqlStatement(statement); // Build MappedStatement diff --git a/ORBatis.Mapper/Configuration/Serializers/TypeAliasDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/TypeAliasDeSerializer.cs index 816d3f7..b44b089 100644 --- a/ORBatis.Mapper/Configuration/Serializers/TypeAliasDeSerializer.cs +++ b/ORBatis.Mapper/Configuration/Serializers/TypeAliasDeSerializer.cs @@ -57,7 +57,14 @@ public static void Deserialize(XmlNode node, ConfigurationScope configScope) typeAlias.Initialize(); - configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(typeAlias.Name, typeAlias); + if (configScope.SqlMapper.TypeHandlerFactory.GetTypeAlias(typeAlias.Name) == null) + { + lock (configScope.SqlMapper.TypeHandlerFactory) + { + if (configScope.SqlMapper.TypeHandlerFactory.GetTypeAlias(typeAlias.Name) == null) + configScope.SqlMapper.TypeHandlerFactory.AddTypeAlias(typeAlias.Name, typeAlias); + } + } } } } \ No newline at end of file diff --git a/ORBatis.Mapper/SqlMapper.cs b/ORBatis.Mapper/SqlMapper.cs index ac0253a..6c3774c 100644 --- a/ORBatis.Mapper/SqlMapper.cs +++ b/ORBatis.Mapper/SqlMapper.cs @@ -1019,7 +1019,13 @@ public bool LazyLoadMappedStatement(string id) // Call the configuration method try { - configurationAction(); + // Note: It is essential that only one of these maps is ever configured at simultaneously! + // The embedded configConfig contains lots of static values which will be corrupted if + // we allow multiple to be configured simultaneously. + lock (SqlMapFileProcessed) + { + configurationAction(); + } taskCompletionSource.SetResult(true); return true; } diff --git a/README.md b/README.md index 7e017c4..39e0034 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,11 @@ In particular: - If we detect that a file can be loaded lazily, we will attempt to do so. - Calls the `RegisterEntityToMap` method to configure the lazy-load method - Also tweaked the `ConfigureSqlMap` method to be easier to call for lazy callers. - - At the end of the config method, we start a background thread which will load each of the Lazy-loadable .xml files in turn. + - ~At the end of the config method, we start a background thread which will load each of the Lazy-loadable .xml files in turn.~ + - Rework design to not depend on configScope so much + - Delete some of the FileScope/Cache logic + - `TypeAliasDeSerializer` + - Add locking to prevent an Alias collision ## Important! @@ -25,6 +29,13 @@ Make sure that if you change the NetFramework behavior, that you also change the - They're basically duplicates of one another, but the shared logic is difficult to move into the common project due to dependency on runtime specific Reflect/ILEmit logic. +Many parameters are passed statically on the configScope to child entities. +- This means that we ABSOLUTELY CANNOT ALLOW two maps to be built at the same time. + - If we permit this, then in testing everything will look fine... + - but when we deploy to production we'll get all sorts of strange, unexpected errors. + - Maps in Holiday.xml getting assigned to the Booking.xml namespace and similar. +- To avoid this, we would need to totally re-write the configuration process. Not an easy feat. + ## Big Quirks! - Global.xml is always loaded eagerly because we have several queries which depend on it. From 28a16485f19ed4e0bad8acc2f01da8eec19a20fe Mon Sep 17 00:00:00 2001 From: NLilley Date: Thu, 24 Jul 2025 20:25:00 +0300 Subject: [PATCH 11/16] Rework node loading to support namespaces different from the file name. --- .../Configuration/DomSqlMapBuilder.cs | 29 +++-- ORBatis.Mapper/ISqlMapper.cs | 1 - ORBatis.Mapper/SqlMapper.cs | 20 ++- .../Config/Definitions/GridReview.xml | 24 ++++ .../Config/Definitions/Review.xml | 121 ++++++++++++++++++ .../Models/GridReviewForOverview.cs | 7 + ORBatis.Test.Common/Models/Review.cs | 18 +++ .../ORBatis.Test.Common.csproj | 4 + ORBatis.Test/Config/SqlMap.config | 4 + ORBatis.Test/Tests/BasicFunctionalityFacts.cs | 13 ++ 10 files changed, 227 insertions(+), 14 deletions(-) create mode 100644 ORBatis.Test.Common/Config/Definitions/GridReview.xml create mode 100644 ORBatis.Test.Common/Config/Definitions/Review.xml create mode 100644 ORBatis.Test.Common/Models/GridReviewForOverview.cs create mode 100644 ORBatis.Test.Common/Models/Review.cs diff --git a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs index eaa93fa..aaaa99d 100644 --- a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs +++ b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs @@ -824,7 +824,7 @@ private void Initialize() #endregion #region Load sqlMap mapping files - var toProcessLazily = new List(); + // var toProcessLazily = new List(); foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager)) { var shouldLazyLoad = false; @@ -833,9 +833,9 @@ private void Initialize() if (isEmbedded) { var embeddedPath = xmlNode.Attributes["embedded"].Value; - // This is a special result used in many other sqlMaps. - if (!embeddedPath.ToLower().Contains(".global.xml,")) + var isSpecialFile = embeddedPath.ToLower().Contains(".global.xml,"); + if (!isSpecialFile) { var parts = embeddedPath.Split('.'); for (var i = 1; i < parts.Length; i++) @@ -845,14 +845,25 @@ private void Initialize() continue; var entityName = parts[i - 1]; + + var fileData = Resources.GetAsXmlDocument(xmlNode, _configScope.Properties); + var sqlMap = fileData.LastChild; + + var fileNamespace = sqlMap.Attributes["namespace"].Value; + if (entityName != fileNamespace) + { + _logger.Info($"File with name {entityName} is being mapped to namespace {fileNamespace}."); + entityName = fileNamespace; + } + var configScope = _configScope; var currentNode = xmlNode; configScope.SqlMapper.RegisterEntityToMap(entityName, () => { - ConfigureSqlMap(currentNode, configScope, true); + ConfigureSqlMap(currentNode, configScope, isLazy: true); }); shouldLazyLoad = true; - toProcessLazily.Add(entityName); + // toProcessLazily.Add(entityName); } } } @@ -942,14 +953,17 @@ private void PostProcessResultMap(ResultMap resultMap, ConfigurationScope config for (var index = 0; index < resultMap.Properties.Count; index++) { var result = resultMap.Properties[index]; - if (result.NestedResultMapName.Length > 0) result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + if (result.NestedResultMapName.Length > 0) + result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + result.PropertyStrategy = PropertyStrategyFactory.Get(result); } for (var index = 0; index < resultMap.Parameters.Count; index++) { var result = resultMap.Parameters[index]; - if (result.NestedResultMapName.Length > 0) result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); + if (result.NestedResultMapName.Length > 0) + result.NestedResultMap = configScope.SqlMapper.GetResultMap(result.NestedResultMapName); result.ArgumentStrategy = ArgumentStrategyFactory.Get((ArgumentProperty)result); } @@ -1755,7 +1769,6 @@ private ResultMap BuildResultMap(XmlNode resultMapNode, ConfigurationScope confi if (resultMap.Parameters.Count > 0) resultMap.SetObjectFactory(configScope); } - // Verify that that each groupBy element correspond to a class member // of one of result property for (var i = 0; i < resultMap.GroupByPropertyNames.Count; i++) diff --git a/ORBatis.Mapper/ISqlMapper.cs b/ORBatis.Mapper/ISqlMapper.cs index 09dc319..7b2f5ef 100644 --- a/ORBatis.Mapper/ISqlMapper.cs +++ b/ORBatis.Mapper/ISqlMapper.cs @@ -156,7 +156,6 @@ public interface ISqlMapper void RegisterEntityToMap(string entityName, Action configure); - /// /// Adds a (named) MappedStatement. /// diff --git a/ORBatis.Mapper/SqlMapper.cs b/ORBatis.Mapper/SqlMapper.cs index 6c3774c..73fe2b7 100644 --- a/ORBatis.Mapper/SqlMapper.cs +++ b/ORBatis.Mapper/SqlMapper.cs @@ -956,8 +956,17 @@ public int Delete(string statementName, object parameterObject, ISqlMapSession s #region Get/Add ParemeterMap, ResultMap, MappedStatement, TypeAlias, DataSource, CacheModel - private Dictionary EntityToMap = new Dictionary(); - public void RegisterEntityToMap(string entityName, Action configure) => EntityToMap[entityName] = configure; + private Dictionary> EntityToMap = new Dictionary>(); + + public void RegisterEntityToMap(string entityName, Action configure) + { + if (!EntityToMap.TryGetValue(entityName, out var actions)) + { + actions = new List(); + EntityToMap[entityName] = actions; + } + actions.Add(configure); + } private readonly Dictionary> SqlMapFileProcessed = new Dictionary>(); /// @@ -976,7 +985,7 @@ public IMappedStatement GetMappedStatement(string id) throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); } - return (IMappedStatement)MappedStatements[id]; + return (IMappedStatement)MappedStatements[id] ?? throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); } public bool LazyLoadMappedStatement(string id) @@ -987,7 +996,7 @@ public bool LazyLoadMappedStatement(string id) // Root will be the name of the .sql file. i.e. Holiday -> Holiday.xml var root = parts[0]; - if (!EntityToMap.TryGetValue(root, out var configurationAction)) + if (!EntityToMap.TryGetValue(root, out var configurationActions)) return false; // THis mapping should have been set by the Initialization process! // Loading this SQLMap has already started. Let's await the result @@ -1024,7 +1033,8 @@ public bool LazyLoadMappedStatement(string id) // we allow multiple to be configured simultaneously. lock (SqlMapFileProcessed) { - configurationAction(); + foreach (var action in configurationActions) + action(); } taskCompletionSource.SetResult(true); return true; diff --git a/ORBatis.Test.Common/Config/Definitions/GridReview.xml b/ORBatis.Test.Common/Config/Definitions/GridReview.xml new file mode 100644 index 0000000..77597c2 --- /dev/null +++ b/ORBatis.Test.Common/Config/Definitions/GridReview.xml @@ -0,0 +1,24 @@ + + + + + + + + diff --git a/ORBatis.Test.Common/Config/Definitions/Review.xml b/ORBatis.Test.Common/Config/Definitions/Review.xml new file mode 100644 index 0000000..7bdab62 --- /dev/null +++ b/ORBatis.Test.Common/Config/Definitions/Review.xml @@ -0,0 +1,121 @@ + + + + + + + select LAST_INSERT_ID() as value + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ORBatis.Test.Common/Models/GridReviewForOverview.cs b/ORBatis.Test.Common/Models/GridReviewForOverview.cs new file mode 100644 index 0000000..156eb8b --- /dev/null +++ b/ORBatis.Test.Common/Models/GridReviewForOverview.cs @@ -0,0 +1,7 @@ +using System; +namespace ORBatis.Test.Common.Models; + +public class GridReviewForOverview : Review +{ + public decimal AverageStarsOutOf5 { get; set; } +} \ No newline at end of file diff --git a/ORBatis.Test.Common/Models/Review.cs b/ORBatis.Test.Common/Models/Review.cs new file mode 100644 index 0000000..9344b53 --- /dev/null +++ b/ORBatis.Test.Common/Models/Review.cs @@ -0,0 +1,18 @@ +using System; + +namespace ORBatis.Test.Common.Models; + +public class Review +{ + public decimal? StarsOutOf5 { get; set; } + public bool IsAutoReviewManuallyCanceled { get; set; } + public int Id { get; set; } + public int UserId { get; set; } + public bool Active { get; set; } + public DateTime CreatedUtc { get; set; } + public int CreatedUserId { get; set; } + public DateTime? UpdatedUtc { get; set; } + public int UpdatedUserId { get; set; } + public DateTime? DeletedUtc { get; set; } + public int DeletedUserId { get; set; } +} \ No newline at end of file diff --git a/ORBatis.Test.Common/ORBatis.Test.Common.csproj b/ORBatis.Test.Common/ORBatis.Test.Common.csproj index 5ce3849..a0bd17d 100644 --- a/ORBatis.Test.Common/ORBatis.Test.Common.csproj +++ b/ORBatis.Test.Common/ORBatis.Test.Common.csproj @@ -11,6 +11,10 @@ + + + + diff --git a/ORBatis.Test/Config/SqlMap.config b/ORBatis.Test/Config/SqlMap.config index 5a1ee62..0c89b07 100644 --- a/ORBatis.Test/Config/SqlMap.config +++ b/ORBatis.Test/Config/SqlMap.config @@ -15,6 +15,8 @@ + + @@ -24,5 +26,7 @@ + + diff --git a/ORBatis.Test/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs index 073fade..39056dc 100644 --- a/ORBatis.Test/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs @@ -59,5 +59,18 @@ public void Basic_AbleToSelectHolidays() context ); Assert.NotNull(cannedQueries); + + var reviews = mapper.QueryForList("Review.SelectAll", parameters, context); + Assert.NotNull(reviews); + + var reviewParams = new Hashtable() + { + { "orderBy", "Id" }, + { "orderDirection", "Desc" }, + { "startAtRowNumber", 0 }, + { "pageSize", 10 } + }; + var gridReview = mapper.QueryForList("Review.GridForOverview", reviewParams, context); + Assert.NotNull(gridReview); } } \ No newline at end of file From 3f2444bffa81f3c0dbab9bd36534286d6e7810b1 Mon Sep 17 00:00:00 2001 From: NLilley Date: Fri, 25 Jul 2025 12:54:59 +0300 Subject: [PATCH 12/16] Some final polishing --- .../Configuration/DomSqlMapBuilder.cs | 36 +++++++++++++++---- .../Serializers/TypeHandlerDeSerializer.cs | 1 + ORBatis.Test/Tests/BasicFunctionalityFacts.cs | 7 +++- README.md | 13 +++---- 4 files changed, 42 insertions(+), 15 deletions(-) diff --git a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs index aaaa99d..e7bf009 100644 --- a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs +++ b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs @@ -845,12 +845,8 @@ private void Initialize() continue; var entityName = parts[i - 1]; - - var fileData = Resources.GetAsXmlDocument(xmlNode, _configScope.Properties); - var sqlMap = fileData.LastChild; - - var fileNamespace = sqlMap.Attributes["namespace"].Value; - if (entityName != fileNamespace) + var fileNamespace = GetNamespaceFromFile(embeddedPath); + if (fileNamespace != null && entityName != fileNamespace) { _logger.Info($"File with name {entityName} is being mapped to namespace {fileNamespace}."); entityName = fileNamespace; @@ -871,6 +867,34 @@ private void Initialize() if(!shouldLazyLoad) ConfigureSqlMap(xmlNode, _configScope); } + + string GetNamespaceFromFile(string fileName) + { + var fileInfo = new Resources.FileAssemblyInfo(fileName); + var assembly = Assembly.Load(fileInfo.AssemblyName); + using (var stream = assembly.GetManifestResourceStream(fileInfo.FileName)) + using (var streamReader = new StreamReader(stream)) + { + for (var i = 0; i < 5; i++) + { + var data = streamReader.ReadLine(); + const string mapString = " -1) + { + var searchStringIdx = data.IndexOf(searchString); + var openQuoteIdx = searchStringIdx + searchString.Length; + var closingQuoteIndex = data.IndexOf("\"", openQuoteIdx); + var ns = data.Substring(openQuoteIdx, closingQuoteIndex - openQuoteIdx); + return ns; + } + } + } + + return null; + } + #endregion #region Load sqlMap Modules diff --git a/ORBatis.Mapper/Configuration/Serializers/TypeHandlerDeSerializer.cs b/ORBatis.Mapper/Configuration/Serializers/TypeHandlerDeSerializer.cs index f822f04..226b819 100644 --- a/ORBatis.Mapper/Configuration/Serializers/TypeHandlerDeSerializer.cs +++ b/ORBatis.Mapper/Configuration/Serializers/TypeHandlerDeSerializer.cs @@ -36,6 +36,7 @@ namespace IBatisNet.DataMapper.Configuration.Serializers { + // NL: This TypeHandler *shouldn't* need concurrent checks as it's called in Initialize and nowhere else. /// /// Summary description for TypeHandlerDeSerializer. /// diff --git a/ORBatis.Test/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs index 39056dc..24d06ad 100644 --- a/ORBatis.Test/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs @@ -2,7 +2,12 @@ using System.Collections; using System.Collections.Specialized; using System.Configuration; +using System.Globalization; +using System.IO; +using System.Reflection; +using System.Resources; using System.Xml; +using IBatisNet.Common.Utilities; using IBatisNet.DataMapper.Configuration; using ORBatis.Test.Common; using ORBatis.Test.Common.Models; @@ -18,7 +23,7 @@ private static XmlDocument GetSqlMapConfig() var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument(path); return sqlMapConfig; } - + [Fact] public void Basic_AbleToSelectHolidays() { diff --git a/README.md b/README.md index 39e0034..fd4cb5c 100644 --- a/README.md +++ b/README.md @@ -21,7 +21,7 @@ In particular: - Rework design to not depend on configScope so much - Delete some of the FileScope/Cache logic - `TypeAliasDeSerializer` - - Add locking to prevent an Alias collision + - Add locking to prevent concurrent Alias collision ## Important! @@ -30,7 +30,7 @@ Make sure that if you change the NetFramework behavior, that you also change the into the common project due to dependency on runtime specific Reflect/ILEmit logic. Many parameters are passed statically on the configScope to child entities. -- This means that we ABSOLUTELY CANNOT ALLOW two maps to be built at the same time. +- This means that we ABSOLUTELY CANNOT ALLOW two entity.xml maps to be built at the same time. - If we permit this, then in testing everything will look fine... - but when we deploy to production we'll get all sorts of strange, unexpected errors. - Maps in Holiday.xml getting assigned to the Booking.xml namespace and similar. @@ -40,9 +40,6 @@ Many parameters are passed statically on the configScope to child entities. - Global.xml is always loaded eagerly because we have several queries which depend on it. - It would be better if we detected dependencies and lazy loaded them too, but I'm not sure if this is possible. - -TODO! -- Check for other lock-required areas. I think I saw some Deserialize methods which might cause race conditions. -- Migrate the Framework code into Core. They've gotten out of sync! -- See if we can reduce the code duplication. -- Double check that netCore serializer hack I made. It's not supported for net8, but should be better tested! \ No newline at end of file +- Because of the "Namespace" feature, I need to load the entire XML into memory for every SQL map to double check that it doesn't belong to a different .xml namespace. + - i.e. GridReviewForOverview in GridReview.xml actually belongs to the "Review.xml" namespace. + - This causes the up-front compilation time to increase 3.5x From 05c8b7505a75ecdba7ec79a5b2bd6c22ea3c828d Mon Sep 17 00:00:00 2001 From: NLilley Date: Fri, 25 Jul 2025 14:00:22 +0300 Subject: [PATCH 13/16] Include missing license and notice --- licence.txt | 201 ++++++++++++++++++++++++++++++++++++++++++++++++++++ notice.txt | 13 ++++ 2 files changed, 214 insertions(+) create mode 100644 licence.txt create mode 100644 notice.txt diff --git a/licence.txt b/licence.txt new file mode 100644 index 0000000..85fe608 --- /dev/null +++ b/licence.txt @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2004 Gilles Bayon + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/notice.txt b/notice.txt new file mode 100644 index 0000000..6cc7442 --- /dev/null +++ b/notice.txt @@ -0,0 +1,13 @@ +ADDITIONAL TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION +FOR COMPLETE TERMS, SEE ALSO LICENSE.TXT, WHICH IS INCORPORATED BY REFERENCE + +This product includes software derived from "iBATIS Database Layer" and +"iBATIS SQL Maps" developed by Clinton Begin (http://www.ibatis.com/). + +Permission to use the name "iBATIS.NET" in connection with this +product has been granted by Clinton Begin. + +The names "iBATIS.NET" or "Clinton Begin" must not be used to endorse +or promote products derived from this software without prior written +permission of Clinton Begin. For written permission, please contact +clinton.begin@ibatis.com. \ No newline at end of file From 5744096f7d4bbcee05aac60e0d636dac7c66fa74 Mon Sep 17 00:00:00 2001 From: NLilley Date: Mon, 28 Jul 2025 20:12:56 +0300 Subject: [PATCH 14/16] Remove the special namespace handling. #12424 --- .../Configuration/DomSqlMapBuilder.cs | 47 ------------------- 1 file changed, 47 deletions(-) diff --git a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs index e7bf009..58f2d3a 100644 --- a/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs +++ b/ORBatis.Mapper/Configuration/DomSqlMapBuilder.cs @@ -824,7 +824,6 @@ private void Initialize() #endregion #region Load sqlMap mapping files - // var toProcessLazily = new List(); foreach (XmlNode xmlNode in _configScope.SqlMapConfigDocument.SelectNodes(ApplyDataMapperNamespacePrefix(XML_SQLMAP), _configScope.XmlNamespaceManager)) { var shouldLazyLoad = false; @@ -845,13 +844,6 @@ private void Initialize() continue; var entityName = parts[i - 1]; - var fileNamespace = GetNamespaceFromFile(embeddedPath); - if (fileNamespace != null && entityName != fileNamespace) - { - _logger.Info($"File with name {entityName} is being mapped to namespace {fileNamespace}."); - entityName = fileNamespace; - } - var configScope = _configScope; var currentNode = xmlNode; configScope.SqlMapper.RegisterEntityToMap(entityName, () => @@ -859,7 +851,6 @@ private void Initialize() ConfigureSqlMap(currentNode, configScope, isLazy: true); }); shouldLazyLoad = true; - // toProcessLazily.Add(entityName); } } } @@ -867,34 +858,6 @@ private void Initialize() if(!shouldLazyLoad) ConfigureSqlMap(xmlNode, _configScope); } - - string GetNamespaceFromFile(string fileName) - { - var fileInfo = new Resources.FileAssemblyInfo(fileName); - var assembly = Assembly.Load(fileInfo.AssemblyName); - using (var stream = assembly.GetManifestResourceStream(fileInfo.FileName)) - using (var streamReader = new StreamReader(stream)) - { - for (var i = 0; i < 5; i++) - { - var data = streamReader.ReadLine(); - const string mapString = " -1) - { - var searchStringIdx = data.IndexOf(searchString); - var openQuoteIdx = searchStringIdx + searchString.Length; - var closingQuoteIndex = data.IndexOf("\"", openQuoteIdx); - var ns = data.Substring(openQuoteIdx, closingQuoteIndex - openQuoteIdx); - return ns; - } - } - } - - return null; - } - #endregion #region Load sqlMap Modules @@ -960,16 +923,6 @@ string GetNamespaceFromFile(string fileName) _configScope.ErrorContext.Reset(); #endregion - - // Kick-Start the Lazy-Load process - // Note: Given we re-use the SQLMapConfig for many mappers, I'm not sure that this is a win. - // Task.Run(() => - // { - // foreach (var entity in toProcessLazily) - // { - // _configScope.SqlMapper.LazyLoadMappedStatement($"{entity}.LazyInitialization"); - // } - // }); } private void PostProcessResultMap(ResultMap resultMap, ConfigurationScope configScope) From 1d588878110fe776b016b69e6077bdfc297c2dc9 Mon Sep 17 00:00:00 2001 From: NLilley Date: Tue, 29 Jul 2025 12:20:03 +0300 Subject: [PATCH 15/16] Rework SqlMapper concurrency changes. --- ORBatis.Mapper/SqlMapper.cs | 63 ++++++++++++++++++++++++++++--------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/ORBatis.Mapper/SqlMapper.cs b/ORBatis.Mapper/SqlMapper.cs index 73fe2b7..7384081 100644 --- a/ORBatis.Mapper/SqlMapper.cs +++ b/ORBatis.Mapper/SqlMapper.cs @@ -41,6 +41,7 @@ using System.Collections.Specialized; using System.Data; using System.Text; +using System.Threading; using System.Threading.Tasks; //using IBatisNet.DataMapper.SessionStore; @@ -969,6 +970,7 @@ public void RegisterEntityToMap(string entityName, Action configure) } private readonly Dictionary> SqlMapFileProcessed = new Dictionary>(); + ReaderWriterLockSlim _writeLocker = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); /// /// Gets a MappedStatement by name /// @@ -978,14 +980,29 @@ public IMappedStatement GetMappedStatement(string id) { // In the original iBatis, a missing ID would cause the application to throw immediately. // Now we lazy load the configuration maps, and so we need to double check that the map has actually been loaded. - if (MappedStatements.Contains(id) == false) + IMappedStatement statement = AttemptLazyLoadMappedStatement(id); + if (statement != null) + return statement; + + var didLazyLoad = LazyLoadMappedStatement(id); + if(!didLazyLoad) + throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); + + return AttemptLazyLoadMappedStatement(id) ?? throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); + } + + private IMappedStatement AttemptLazyLoadMappedStatement(string id) + { + IMappedStatement statement = null; + _writeLocker.EnterReadLock(); + try { - var didLazyLoad = LazyLoadMappedStatement(id); - if(!didLazyLoad) - throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); + if (MappedStatements.Contains(id)) + statement = (IMappedStatement)MappedStatements[id]; } + finally { _writeLocker.ExitReadLock(); } - return (IMappedStatement)MappedStatements[id] ?? throw new DataMapperException("This SQL map does not contain a MappedStatement named " + id); + return statement; } public bool LazyLoadMappedStatement(string id) @@ -997,14 +1014,17 @@ public bool LazyLoadMappedStatement(string id) // Root will be the name of the .sql file. i.e. Holiday -> Holiday.xml var root = parts[0]; if (!EntityToMap.TryGetValue(root, out var configurationActions)) - return false; // THis mapping should have been set by the Initialization process! + return false; // This mapping should have been set by the Initialization process! // Loading this SQLMap has already started. Let's await the result - if (SqlMapFileProcessed.TryGetValue(root, out var task)) + Task task = null; + lock (SqlMapFileProcessed) { - var loaded = task.Result; - return loaded; + SqlMapFileProcessed.TryGetValue(root, out task); } + + if (task != null) + return task.Result; // Looks like this thread might need to perform the lazy load. // Lock the dictionary to prevent duplicate loads @@ -1031,11 +1051,15 @@ public bool LazyLoadMappedStatement(string id) // Note: It is essential that only one of these maps is ever configured at simultaneously! // The embedded configConfig contains lots of static values which will be corrupted if // we allow multiple to be configured simultaneously. - lock (SqlMapFileProcessed) + + _writeLocker.EnterWriteLock(); + try { foreach (var action in configurationActions) action(); } + finally { _writeLocker.ExitWriteLock(); } + taskCompletionSource.SetResult(true); return true; } @@ -1070,8 +1094,13 @@ public void AddMappedStatement(string key, IMappedStatement mappedStatement) /// The ParameterMap public ParameterMap GetParameterMap(string name) { - if (!ParameterMaps.Contains(name)) throw new DataMapperException("This SQL map does not contain an ParameterMap named " + name + ". "); - return (ParameterMap)ParameterMaps[name]; + _writeLocker.EnterReadLock(); + try + { + if (!ParameterMaps.Contains(name)) + throw new DataMapperException("This SQL map does not contain an ParameterMap named " + name + ". "); + return (ParameterMap)ParameterMaps[name]; + } finally{ _writeLocker.ExitReadLock(); } } /// @@ -1091,9 +1120,13 @@ public void AddParameterMap(ParameterMap parameterMap) /// The ResultMap public IResultMap GetResultMap(string name) { - if (ResultMaps.Contains(name) == false) - throw new DataMapperException("This SQL map does not contain an ResultMap named " + name); - return (ResultMap)ResultMaps[name]; + _writeLocker.EnterReadLock(); + try + { + if (ResultMaps.Contains(name) == false) + throw new DataMapperException("This SQL map does not contain an ResultMap named " + name); + return (ResultMap)ResultMaps[name]; + } finally{ _writeLocker.ExitReadLock(); } } /// From fdfaa821b11dd4b6db2332647334a7a326a8afb7 Mon Sep 17 00:00:00 2001 From: NLilley Date: Tue, 17 Mar 2026 12:16:54 +0200 Subject: [PATCH 16/16] Fix Framework x Core builds. --- ORBatis.Mapper/ORBatis.Core.csproj | 5 +- ORBatis.Mapper/ORBatis.Framework.csproj | 3 + .../Config/Definitions/GridReview.xml | 4 +- .../Config/Definitions/Review.xml | 17 ++++++ ORBatis.Test/ORBatis.Test.Core.csproj | 5 +- ORBatis.Test/ORBatis.Test.Framework.csproj | 3 + ORBatis.Test/Tests/BasicFunctionalityFacts.cs | 60 +++++++++++++------ README.md | 5 +- 8 files changed, 74 insertions(+), 28 deletions(-) diff --git a/ORBatis.Mapper/ORBatis.Core.csproj b/ORBatis.Mapper/ORBatis.Core.csproj index 1caa6d7..7ac4533 100644 --- a/ORBatis.Mapper/ORBatis.Core.csproj +++ b/ORBatis.Mapper/ORBatis.Core.csproj @@ -1,12 +1,13 @@ - + + obj\Core\ + $(DefaultItemExcludes);Properties\AssemblyInfo.cs;obj\Framework\** net9.0 enable enable IBatisNet.DataMapper IBatisNet.DataMapper - false diff --git a/ORBatis.Mapper/ORBatis.Framework.csproj b/ORBatis.Mapper/ORBatis.Framework.csproj index 9786ff0..37c2709 100644 --- a/ORBatis.Mapper/ORBatis.Framework.csproj +++ b/ORBatis.Mapper/ORBatis.Framework.csproj @@ -1,5 +1,8 @@ + + obj\Framework\ + diff --git a/ORBatis.Test.Common/Config/Definitions/GridReview.xml b/ORBatis.Test.Common/Config/Definitions/GridReview.xml index 77597c2..2fb46e3 100644 --- a/ORBatis.Test.Common/Config/Definitions/GridReview.xml +++ b/ORBatis.Test.Common/Config/Definitions/GridReview.xml @@ -1,8 +1,8 @@ - + - select SQL_CALC_FOUND_ROWS r.Id, diff --git a/ORBatis.Test.Common/Config/Definitions/Review.xml b/ORBatis.Test.Common/Config/Definitions/Review.xml index 7bdab62..5b9a3a8 100644 --- a/ORBatis.Test.Common/Config/Definitions/Review.xml +++ b/ORBatis.Test.Common/Config/Definitions/Review.xml @@ -86,6 +86,23 @@ and lp.Id = #linkedAccountPropertyId# and r.IsReviewerHost = false + diff --git a/ORBatis.Test/ORBatis.Test.Core.csproj b/ORBatis.Test/ORBatis.Test.Core.csproj index 1303266..99ee941 100644 --- a/ORBatis.Test/ORBatis.Test.Core.csproj +++ b/ORBatis.Test/ORBatis.Test.Core.csproj @@ -1,11 +1,12 @@ - + + obj\Core\ + $(DefaultItemExcludes);Properties\AssemblyInfo.cs;obj\Framework\** net9.0 enable enable false - false ORBatis.Test ORBatis.Test diff --git a/ORBatis.Test/ORBatis.Test.Framework.csproj b/ORBatis.Test/ORBatis.Test.Framework.csproj index ddc5ed4..901c7bf 100644 --- a/ORBatis.Test/ORBatis.Test.Framework.csproj +++ b/ORBatis.Test/ORBatis.Test.Framework.csproj @@ -1,5 +1,8 @@ + + obj\Framework\ + diff --git a/ORBatis.Test/Tests/BasicFunctionalityFacts.cs b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs index 24d06ad..c981e7f 100644 --- a/ORBatis.Test/Tests/BasicFunctionalityFacts.cs +++ b/ORBatis.Test/Tests/BasicFunctionalityFacts.cs @@ -1,14 +1,9 @@ -using System; using System.Collections; using System.Collections.Specialized; -using System.Configuration; -using System.Globalization; -using System.IO; -using System.Reflection; -using System.Resources; -using System.Xml; using IBatisNet.Common.Utilities; +using IBatisNet.DataMapper; using IBatisNet.DataMapper.Configuration; +using IBatisNet.DataMapper.Exceptions; using ORBatis.Test.Common; using ORBatis.Test.Common.Models; using Xunit; @@ -17,17 +12,10 @@ namespace ORBatis.Test.Tests; public class Tests { - private static XmlDocument GetSqlMapConfig() + private static ISqlMapper BuildMapper() { - var path = $"ORBatis.Test.Config.SqlMap.config, ORBatis.Test"; - var sqlMapConfig = IBatisNet.Common.Utilities.Resources.GetEmbeddedResourceAsXmlDocument(path); - return sqlMapConfig; - } - - [Fact] - public void Basic_AbleToSelectHolidays() - { - var sqlMapConfig = GetSqlMapConfig(); + var path = "ORBatis.Test.Config.SqlMap.config, ORBatis.Test"; + var sqlMapConfig = Resources.GetEmbeddedResourceAsXmlDocument(path); var builder = new DomSqlMapBuilder() { Properties = new NameValueCollection() @@ -35,8 +23,13 @@ public void Basic_AbleToSelectHolidays() { "ConnectionString", Constants.ConnectionString } } }; + return builder.Configure(sqlMapConfig); + } - var mapper = builder.Configure(sqlMapConfig); + [Fact] + public void Basic_AbleToSelectHolidays() + { + var mapper = BuildMapper(); var context = mapper.CreateSqlMapSession(); Hashtable parameters = new Hashtable @@ -64,9 +57,16 @@ public void Basic_AbleToSelectHolidays() context ); Assert.NotNull(cannedQueries); - + var reviews = mapper.QueryForList("Review.SelectAll", parameters, context); Assert.NotNull(reviews); + } + + [Fact] + public void GridForOverview_New_WorksWhenDefinedInSameNamespaceFile() + { + var mapper = BuildMapper(); + var context = mapper.CreateSqlMapSession(); var reviewParams = new Hashtable() { @@ -78,4 +78,26 @@ public void Basic_AbleToSelectHolidays() var gridReview = mapper.QueryForList("Review.GridForOverview", reviewParams, context); Assert.NotNull(gridReview); } + + [Fact] + public void GridForOverview_Old_FailsWhenAccessedViaFileName() + { + var mapper = BuildMapper(); + var context = mapper.CreateSqlMapSession(); + + var reviewParams = new Hashtable() + { + { "orderBy", "Id" }, + { "orderDirection", "Desc" }, + { "startAtRowNumber", 0 }, + { "pageSize", 10 } + }; + + // GridReview.xml declares namespace="Review", but its lazy-load is registered + // under the filename "GridReview". Accessing via "GridReview.GridForOverview" + // fails because cross-file namespace resolution was removed. + Assert.Throws( + () => mapper.QueryForList("Review.GridForOverviewOld", reviewParams, context) + ); + } } \ No newline at end of file diff --git a/README.md b/README.md index fd4cb5c..dbd21a4 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,5 @@ Many parameters are passed statically on the configScope to child entities. - Global.xml is always loaded eagerly because we have several queries which depend on it. - It would be better if we detected dependencies and lazy loaded them too, but I'm not sure if this is possible. -- Because of the "Namespace" feature, I need to load the entire XML into memory for every SQL map to double check that it doesn't belong to a different .xml namespace. - - i.e. GridReviewForOverview in GridReview.xml actually belongs to the "Review.xml" namespace. - - This causes the up-front compilation time to increase 3.5x +- Cross-file namespace references (e.g. GridReview.xml using namespace="Review") are no longer supported. + - Statements must live in the XML file matching their namespace.